@tatamicks/core 1.0.1 → 1.0.2
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/dist/{PalettePanel-Dipvtj7D.cjs → PalettePanel-BMZ6dfI3.cjs} +2 -2
- package/dist/{PalettePanel-Dipvtj7D.cjs.map → PalettePanel-BMZ6dfI3.cjs.map} +1 -1
- package/dist/{PalettePanel-CtXsH6Cb.js → PalettePanel-Cigl9i1N.js} +360 -355
- package/dist/{PalettePanel-CtXsH6Cb.js.map → PalettePanel-Cigl9i1N.js.map} +1 -1
- package/dist/canvas.cjs +1 -1
- package/dist/canvas.mjs +13 -13
- package/dist/index.cjs +3 -5
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +430 -571
- package/dist/index.mjs.map +1 -1
- package/dist/{paperSettingsWidget-sLJsIUxS.cjs → paperSettingsWidget-7766a5Fe.cjs} +1 -1
- package/dist/{paperSettingsWidget-sLJsIUxS.cjs.map → paperSettingsWidget-7766a5Fe.cjs.map} +1 -1
- package/dist/{paperSettingsWidget-DgDoBA0P.js → paperSettingsWidget-DvtghSA5.js} +1 -1
- package/dist/{paperSettingsWidget-DgDoBA0P.js.map → paperSettingsWidget-DvtghSA5.js.map} +1 -1
- package/dist/shell.cjs +1 -1
- package/dist/shell.mjs +2 -2
- package/dist/sidebarPortal-BN6FVwaF.js +870 -0
- package/dist/sidebarPortal-BN6FVwaF.js.map +1 -0
- package/dist/sidebarPortal-Cr-dLvA_.cjs +3 -0
- package/dist/sidebarPortal-Cr-dLvA_.cjs.map +1 -0
- package/dist/src/index.d.ts +2 -0
- package/package.json +1 -1
- package/dist/sidebarPortal-C06y4JSP.js +0 -723
- package/dist/sidebarPortal-C06y4JSP.js.map +0 -1
- package/dist/sidebarPortal-C3HszQyp.cjs +0 -1
- package/dist/sidebarPortal-C3HszQyp.cjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PalettePanel-Dipvtj7D.cjs","sources":["../src/shell/bars/ActionBar/ActionBarDivider.tsx","../src/components/icons.tsx","../src/shell/actionFeedback/index.ts","../src/shell/ui/Checkbox/Checkbox.tsx","../src/shell/ui/CollapsibleSection/CollapsibleSection.tsx","../src/utils/color/func.ts","../src/utils/color/types.ts","../src/shell/ui/ColorPicker/ColorPalette.tsx","../src/shell/ui/NumberInput/NumberInput.tsx","../src/shell/ui/ColorPicker/RGBAInputs.tsx","../src/shell/ui/ColorPicker/ColorPickerPopover.tsx","../src/shell/ui/ColorPicker/ColorPicker.tsx","../src/shell/ui/DimensionInput/DimensionInput.tsx","../src/shell/ui/Dropdown/Dropdown.tsx","../src/shell/ui/IconActionButton/IconActionButton.tsx","../src/shell/ui/TabPanel/TabPanel.tsx","../src/shell/ui/Tabs/Tabs.tsx","../src/shell/ui/TextInput/TextInput.tsx","../src/shell/bars/ActionBar/CanvasActionSection.tsx","../src/shell/bars/ActionBar/GridSettingsSection.tsx","../src/shell/bars/ActionBar/PaperSettingsSection.tsx","../src/canvas/layers/BlockLayer/utils/setNestedValue.ts","../src/shell/panels/utils/getCommonValue.ts","../src/shell/panels/BlockPropertyPanel/BasePanels/BackgroundBorderPanel/BackgroundBorderPanel.tsx","../src/shell/panels/BlockPropertyPanel/BasePanels/LayoutPanel/LayoutPanel.tsx","../src/shell/panels/BlockPropertyPanel/PluginPanels/AlignmentToggle.tsx","../src/shell/panels/BlockPropertyPanel/PluginPanels/CheckboxStyleEditor.tsx","../src/shell/panels/BlockPropertyPanel/PluginPanels/FontDecorationToggle.tsx","../src/shell/panels/BlockPropertyPanel/PluginPanels/FontStyleEditor.tsx","../src/shell/panels/BlockPropertyPanel/PluginPanels/OptionsEditor.tsx","../src/shell/panels/BlockPropertyPanel/PluginPanels/PaddingLinkCheckbox.tsx","../src/shell/panels/BlockPropertyPanel/PluginPanels/PaddingEditor.tsx","../src/shell/panels/BlockPropertyPanel/PluginPanels/TextBehaviorEditor.tsx","../src/shell/panels/BlockPropertyPanel/PluginPanels/TextValidationEditor.tsx","../src/shell/panels/BlockPropertyPanel/PluginPanels/PropertyField.tsx","../src/shell/panels/BlockPropertyPanel/PluginPanels/PluginPanels.tsx","../src/shell/bars/SelectionActionBar/SelectionActionBarButton.tsx","../src/shell/bars/SelectionActionBar/SelectionActionBar.tsx","../src/shell/bars/SelectionActionBar/SelectionActionBarPanel.tsx","../src/shell/bars/SelectionActionBar/getDefaultSelectionActionBarItems.tsx","../src/shell/bars/SelectionActionBar/SelectionActionBarOverlay.tsx","../src/shell/bars/SelectionActionBar/useSelectionBounds.ts","../src/shell/panels/BlockPropertyPanel/BasePanels/MetaPanel/MetaPanel.tsx","../src/shell/panels/BlockPropertyPanel/BlockPropertyPanel.tsx","../src/shell/panels/BlockPropertyPanel/DefaultBlockPropertyPanel.tsx","../src/shell/panels/CanvasPanel/BlockDefaultsPanel/BlockDefaultsPanel.tsx","../src/shell/panels/CanvasPanel/BlockOrderPanel/BlockOrderPanel.tsx","../src/shell/panels/CanvasPanel/CanvasActionPanel/CanvasActionPanel.tsx","../src/shell/panels/CanvasPanel/CanvasPanel.tsx","../src/shell/panels/CanvasPanel/GridSizePanel/GridSizePanel.tsx","../src/shell/panels/CanvasPanel/MarginPanel/MarginPanel.tsx","../src/shell/panels/CanvasPanel/PaperSizePanel/PaperSizePanel.tsx","../src/shell/panels/CanvasPanel/DefaultCanvasPanel.tsx","../src/shell/panels/OtherPanel/ImportExportPanel/ImportExportPanel.tsx","../src/shell/panels/OtherPanel/OtherPanel.tsx","../src/shell/panels/PalettePanel/PalettePanel.tsx"],"sourcesContent":["import styles from \"./ActionBar.module.css\";\n\n/**\n * `ActionBar` 内のセクション間区切り線コンポーネントへの props。\n */\nexport type ActionBarDividerProps = Record<string, never>;\n\n/**\n * `ActionBar` 内のセクション間区切り線コンポーネント。\n *\n * @remarks\n * **Shell** — `ActionBar` により自動挿入される。通常は直接使用しない。\n */\nexport const ActionBarDivider = (_props: ActionBarDividerProps) => {\n\treturn <div className={styles.divider} aria-hidden=\"true\" />;\n};\n\nActionBarDivider.displayName = \"ActionBarDivider\";\n","import type { FC } from \"react\";\n\ninterface IconProps {\n\tsize?: number;\n\t\"aria-hidden\"?: boolean | \"true\" | \"false\";\n}\n\n/** 元に戻す(Undo) */\nexport const UndoIcon: FC<IconProps> = ({ size = 16, ...rest }) => (\n\t<svg\n\t\tviewBox=\"0 0 16 16\"\n\t\twidth={size}\n\t\theight={size}\n\t\tfill=\"none\"\n\t\tstroke=\"currentColor\"\n\t\tstrokeWidth={1.5}\n\t\tstrokeLinecap=\"round\"\n\t\tstrokeLinejoin=\"round\"\n\t\taria-hidden=\"true\"\n\t\t{...rest}\n\t>\n\t\t<path d=\"M3 7.5a5 5 0 1 1 1.5 3.5\" />\n\t\t<path d=\"M3 3.5v4h4\" />\n\t</svg>\n);\nUndoIcon.displayName = \"UndoIcon\";\n\n/** やり直し(Redo) */\nexport const RedoIcon: FC<IconProps> = ({ size = 16, ...rest }) => (\n\t<svg\n\t\tviewBox=\"0 0 16 16\"\n\t\twidth={size}\n\t\theight={size}\n\t\tfill=\"none\"\n\t\tstroke=\"currentColor\"\n\t\tstrokeWidth={1.5}\n\t\tstrokeLinecap=\"round\"\n\t\tstrokeLinejoin=\"round\"\n\t\taria-hidden=\"true\"\n\t\t{...rest}\n\t>\n\t\t<path d=\"M13 7.5a5 5 0 1 0-1.5 3.5\" />\n\t\t<path d=\"M13 3.5v4h-4\" />\n\t</svg>\n);\nRedoIcon.displayName = \"RedoIcon\";\n\n/** 削除(Delete / Trash) */\nexport const TrashIcon: FC<IconProps> = ({ size = 16, ...rest }) => (\n\t<svg\n\t\tviewBox=\"0 0 16 16\"\n\t\twidth={size}\n\t\theight={size}\n\t\tfill=\"none\"\n\t\tstroke=\"currentColor\"\n\t\tstrokeWidth={1.5}\n\t\tstrokeLinecap=\"round\"\n\t\tstrokeLinejoin=\"round\"\n\t\taria-hidden=\"true\"\n\t\t{...rest}\n\t>\n\t\t<polyline points=\"3,5 13,5\" />\n\t\t<path d=\"M6 5V3h4v2\" />\n\t\t<path d=\"M4 5l1 9h6l1-9\" />\n\t\t<line x1=\"6.5\" y1=\"7.5\" x2=\"6.5\" y2=\"11.5\" />\n\t\t<line x1=\"9.5\" y1=\"7.5\" x2=\"9.5\" y2=\"11.5\" />\n\t</svg>\n);\nTrashIcon.displayName = \"TrashIcon\";\n\n/** コピー(Copy) */\nexport const CopyIcon: FC<IconProps> = ({ size = 16, ...rest }) => (\n\t<svg\n\t\tviewBox=\"0 0 16 16\"\n\t\twidth={size}\n\t\theight={size}\n\t\tfill=\"none\"\n\t\tstroke=\"currentColor\"\n\t\tstrokeWidth={1.5}\n\t\tstrokeLinecap=\"round\"\n\t\tstrokeLinejoin=\"round\"\n\t\taria-hidden=\"true\"\n\t\t{...rest}\n\t>\n\t\t<rect x=\"5\" y=\"5\" width=\"8\" height=\"9\" rx=\"1\" />\n\t\t<path d=\"M3 11V3h8\" />\n\t</svg>\n);\nCopyIcon.displayName = \"CopyIcon\";\n\n/** 貼り付け(Paste) */\nexport const PasteIcon: FC<IconProps> = ({ size = 16, ...rest }) => (\n\t<svg\n\t\tviewBox=\"0 0 16 16\"\n\t\twidth={size}\n\t\theight={size}\n\t\tfill=\"none\"\n\t\tstroke=\"currentColor\"\n\t\tstrokeWidth={1.5}\n\t\tstrokeLinecap=\"round\"\n\t\tstrokeLinejoin=\"round\"\n\t\taria-hidden=\"true\"\n\t\t{...rest}\n\t>\n\t\t<rect x=\"2\" y=\"6\" width=\"12\" height=\"9\" rx=\"1\" />\n\t\t<path d=\"M5 6V4a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v2\" />\n\t\t<line x1=\"8\" y1=\"9\" x2=\"8\" y2=\"12\" />\n\t\t<line x1=\"6.5\" y1=\"10.5\" x2=\"9.5\" y2=\"10.5\" />\n\t</svg>\n);\nPasteIcon.displayName = \"PasteIcon\";\n\n/** 複製(Duplicate) */\nexport const DuplicateIcon: FC<IconProps> = ({ size = 16, ...rest }) => (\n\t<svg\n\t\tviewBox=\"0 0 16 16\"\n\t\twidth={size}\n\t\theight={size}\n\t\tfill=\"none\"\n\t\tstroke=\"currentColor\"\n\t\tstrokeWidth={1.5}\n\t\tstrokeLinecap=\"round\"\n\t\tstrokeLinejoin=\"round\"\n\t\taria-hidden=\"true\"\n\t\t{...rest}\n\t>\n\t\t<rect x=\"1\" y=\"4\" width=\"9\" height=\"9\" rx=\"1\" />\n\t\t<path d=\"M5 4V2h9v9h-2\" />\n\t</svg>\n);\nDuplicateIcon.displayName = \"DuplicateIcon\";\n\n/** 印刷(Print) */\nexport const PrintIcon: FC<IconProps> = ({ size = 16, ...rest }) => (\n\t<svg\n\t\tviewBox=\"0 0 16 16\"\n\t\twidth={size}\n\t\theight={size}\n\t\tfill=\"none\"\n\t\tstroke=\"currentColor\"\n\t\tstrokeWidth={1.5}\n\t\tstrokeLinecap=\"round\"\n\t\tstrokeLinejoin=\"round\"\n\t\taria-hidden=\"true\"\n\t\t{...rest}\n\t>\n\t\t<rect x=\"2\" y=\"5\" width=\"12\" height=\"8\" rx=\"1\" />\n\t\t<path d=\"M5 5V2h6v3\" />\n\t\t<path d=\"M5 12h6\" />\n\t\t<path d=\"M5 10h3\" />\n\t\t<rect\n\t\t\tx=\"4\"\n\t\t\ty=\"8\"\n\t\t\twidth=\"2\"\n\t\t\theight=\"1.5\"\n\t\t\tfill=\"currentColor\"\n\t\t\tstroke=\"none\"\n\t\t/>\n\t</svg>\n);\nPrintIcon.displayName = \"PrintIcon\";\n\n/** 選択解除(Close) */\nexport const CloseIcon: FC<IconProps> = ({ size = 16, ...rest }) => (\n\t<svg\n\t\tviewBox=\"0 0 16 16\"\n\t\twidth={size}\n\t\theight={size}\n\t\tfill=\"none\"\n\t\tstroke=\"currentColor\"\n\t\tstrokeWidth={1.5}\n\t\tstrokeLinecap=\"round\"\n\t\taria-hidden=\"true\"\n\t\t{...rest}\n\t>\n\t\t<line x1=\"3\" y1=\"3\" x2=\"13\" y2=\"13\" />\n\t\t<line x1=\"13\" y1=\"3\" x2=\"3\" y2=\"13\" />\n\t</svg>\n);\nCloseIcon.displayName = \"CloseIcon\";\n\n/** スタイル設定(Style) */\nexport const StyleIcon: FC<IconProps> = ({ size = 16, ...rest }) => (\n\t<svg\n\t\tviewBox=\"0 0 16 16\"\n\t\twidth={size}\n\t\theight={size}\n\t\tfill=\"none\"\n\t\tstroke=\"currentColor\"\n\t\tstrokeWidth={1.5}\n\t\tstrokeLinecap=\"round\"\n\t\tstrokeLinejoin=\"round\"\n\t\taria-hidden=\"true\"\n\t\t{...rest}\n\t>\n\t\t<circle cx=\"5\" cy=\"5\" r=\"2.5\" />\n\t\t<circle cx=\"11\" cy=\"5\" r=\"2.5\" />\n\t\t<circle cx=\"5\" cy=\"11\" r=\"2.5\" />\n\t\t<circle cx=\"11\" cy=\"11\" r=\"2.5\" />\n\t</svg>\n);\nStyleIcon.displayName = \"StyleIcon\";\n\n/** レイアウト設定(Layout) */\nexport const LayoutIcon: FC<IconProps> = ({ size = 16, ...rest }) => (\n\t<svg\n\t\tviewBox=\"0 0 16 16\"\n\t\twidth={size}\n\t\theight={size}\n\t\tfill=\"none\"\n\t\tstroke=\"currentColor\"\n\t\tstrokeWidth={1.5}\n\t\tstrokeLinecap=\"round\"\n\t\tstrokeLinejoin=\"round\"\n\t\taria-hidden=\"true\"\n\t\t{...rest}\n\t>\n\t\t<rect x=\"1.5\" y=\"1.5\" width=\"13\" height=\"13\" rx=\"1\" />\n\t\t<line x1=\"1.5\" y1=\"5.5\" x2=\"14.5\" y2=\"5.5\" />\n\t\t<line x1=\"7\" y1=\"5.5\" x2=\"7\" y2=\"14.5\" />\n\t</svg>\n);\nLayoutIcon.displayName = \"LayoutIcon\";\n\n/** ブロック設定(Block / Plugin) */\nexport const BlockSettingsIcon: FC<IconProps> = ({ size = 16, ...rest }) => (\n\t<svg\n\t\tviewBox=\"0 0 16 16\"\n\t\twidth={size}\n\t\theight={size}\n\t\tfill=\"none\"\n\t\tstroke=\"currentColor\"\n\t\tstrokeWidth={1.5}\n\t\tstrokeLinecap=\"round\"\n\t\tstrokeLinejoin=\"round\"\n\t\taria-hidden=\"true\"\n\t\t{...rest}\n\t>\n\t\t<rect x=\"2\" y=\"2\" width=\"5\" height=\"5\" rx=\"0.5\" />\n\t\t<rect x=\"9\" y=\"2\" width=\"5\" height=\"5\" rx=\"0.5\" />\n\t\t<rect x=\"2\" y=\"9\" width=\"5\" height=\"5\" rx=\"0.5\" />\n\t\t<circle cx=\"11.5\" cy=\"11.5\" r=\"2.5\" />\n\t\t<line x1=\"11.5\" y1=\"10\" x2=\"11.5\" y2=\"13\" />\n\t\t<line x1=\"10\" y1=\"11.5\" x2=\"13\" y2=\"11.5\" />\n\t</svg>\n);\nBlockSettingsIcon.displayName = \"BlockSettingsIcon\";\n\n/** 前のページへ(navigate_before / chevron_left) */\nexport const ChevronLeftIcon: FC<IconProps> = ({ size = 16, ...rest }) => (\n\t<svg\n\t\tviewBox=\"0 0 24 24\"\n\t\twidth={size}\n\t\theight={size}\n\t\tfill=\"currentColor\"\n\t\taria-hidden=\"true\"\n\t\t{...rest}\n\t>\n\t\t<path d=\"M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z\" />\n\t</svg>\n);\nChevronLeftIcon.displayName = \"ChevronLeftIcon\";\n\n/** 次のページへ(navigate_next / chevron_right) */\nexport const ChevronRightIcon: FC<IconProps> = ({ size = 16, ...rest }) => (\n\t<svg\n\t\tviewBox=\"0 0 24 24\"\n\t\twidth={size}\n\t\theight={size}\n\t\tfill=\"currentColor\"\n\t\taria-hidden=\"true\"\n\t\t{...rest}\n\t>\n\t\t<path d=\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\" />\n\t</svg>\n);\nChevronRightIcon.displayName = \"ChevronRightIcon\";\n\n/** ページ追加(add) */\nexport const AddPageIcon: FC<IconProps> = ({ size = 16, ...rest }) => (\n\t<svg\n\t\tviewBox=\"0 0 24 24\"\n\t\twidth={size}\n\t\theight={size}\n\t\tfill=\"currentColor\"\n\t\taria-hidden=\"true\"\n\t\t{...rest}\n\t>\n\t\t<path d=\"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\" />\n\t</svg>\n);\nAddPageIcon.displayName = \"AddPageIcon\";\n\n/** ページ削除(remove) */\nexport const DeletePageIcon: FC<IconProps> = ({ size = 16, ...rest }) => (\n\t<svg\n\t\tviewBox=\"0 0 24 24\"\n\t\twidth={size}\n\t\theight={size}\n\t\tfill=\"currentColor\"\n\t\taria-hidden=\"true\"\n\t\t{...rest}\n\t>\n\t\t<path d=\"M19 13H5v-2h14v2z\" />\n\t</svg>\n);\nDeletePageIcon.displayName = \"DeletePageIcon\";\n","/**\n * アクション実行後にトースト通知で表示するフィードバック情報。\n *\n * @remarks\n * `ActionBar` / `CanvasActionSection` に渡す `onActionFeedback` の引数型。\n */\nexport interface ActionFeedback {\n\t/** アクションの識別子 */\n\tactionId: string;\n\n\t/** トースト通知に表示するメッセージ */\n\tmessage: string;\n\n\t/** ショートカットキーの表示文字列(なしの場合は `null`) */\n\tshortcut: string | null;\n}\n\nconst ACTION_FEEDBACK_MAP: Record<string, ActionFeedback> = {\n\tundo: {\n\t\tactionId: \"undo\",\n\t\tmessage: \"元に戻しました\",\n\t\tshortcut: \"Ctrl+Z / Cmd+Z\",\n\t},\n\tredo: {\n\t\tactionId: \"redo\",\n\t\tmessage: \"やり直しました\",\n\t\tshortcut: \"Ctrl+Y / Cmd+Y, Ctrl+Shift+Z / Cmd+Shift+Z\",\n\t},\n\tdelete: {\n\t\tactionId: \"delete\",\n\t\tmessage: \"選択を削除しました\",\n\t\tshortcut: \"Delete / Backspace\",\n\t},\n\tcopy: {\n\t\tactionId: \"copy\",\n\t\tmessage: \"選択をコピーしました\",\n\t\tshortcut: \"Ctrl+C / Cmd+C\",\n\t},\n\tpaste: {\n\t\tactionId: \"paste\",\n\t\tmessage: \"貼り付けました\",\n\t\tshortcut: \"Ctrl+V / Cmd+V\",\n\t},\n\tduplicate: {\n\t\tactionId: \"duplicate\",\n\t\tmessage: \"選択を複製しました\",\n\t\tshortcut: \"Ctrl+D / Cmd+D\",\n\t},\n\tselect_all: {\n\t\tactionId: \"select_all\",\n\t\tmessage: \"全て選択しました\",\n\t\tshortcut: \"Ctrl+A / Cmd+A\",\n\t},\n\tdeselect_all: {\n\t\tactionId: \"deselect_all\",\n\t\tmessage: \"選択を解除しました\",\n\t\tshortcut: null,\n\t},\n\tprev_page: {\n\t\tactionId: \"prev_page\",\n\t\tmessage: \"前のページへ移動しました\",\n\t\tshortcut: null,\n\t},\n\tnext_page: {\n\t\tactionId: \"next_page\",\n\t\tmessage: \"次のページへ移動しました\",\n\t\tshortcut: null,\n\t},\n\tadd_page: {\n\t\tactionId: \"add_page\",\n\t\tmessage: \"ページを追加しました\",\n\t\tshortcut: null,\n\t},\n\tdelete_page: {\n\t\tactionId: \"delete_page\",\n\t\tmessage: \"ページを削除しました\",\n\t\tshortcut: null,\n\t},\n};\n\n/**\n * アクション ID に対応するフィードバック情報を返す。\n *\n * @param actionId - アクションの識別子\n * @returns 対応する `ActionFeedback` がない場合は `undefined`\n *\n * @remarks\n * `ActionBar` など内部コンポーネントで使用される。\n */\nexport const getActionFeedback = (\n\tactionId: string,\n): ActionFeedback | undefined => {\n\treturn ACTION_FEEDBACK_MAP[actionId];\n};\n","import { useCallback } from \"react\";\n\nimport styles from \"./Checkbox.module.css\";\n\nimport type React from \"react\";\nimport type { PropertyComponentProps } from \"../../../plugin\";\nimport type { Value } from \"../../../types/value\";\n\n/**\n * チェックボックス入力の設定オブジェクト。\n *\n * @remarks\n * **Shell** — `CheckboxProps.config` に渡す設定値の型。\n */\nexport interface CheckboxConfig {\n\t/** チェックボックスのラベルテキスト */\n\tlabel?: string;\n\t[key: string]: Value | undefined;\n}\n\n/**\n * チェックボックス入力コンポーネントへの props。\n */\nexport interface CheckboxProps\n\textends PropertyComponentProps<boolean | undefined> {\n\t/** チェックボックスのラベルテキスト */\n\tlabel?: string;\n\n\t/** `label` 等をまとめた設定オブジェクト。フィールドより優先度が低い */\n\tconfig?: CheckboxConfig;\n}\n\n/**\n * チェックボックス入力コンポーネント。\n *\n * @remarks\n * **Shell** — プラグインプロパティの編集 UI として使用する。\n */\nexport const Checkbox = ({\n\tvalue,\n\tonChange,\n\treadOnly = false,\n\tlabel: propLabel,\n\tconfig,\n}: CheckboxProps): React.ReactElement => {\n\tconst label = propLabel ?? config?.label;\n\n\tconst handleChange = useCallback(\n\t\t(e: React.ChangeEvent<HTMLInputElement>) => {\n\t\t\tonChange(e.target.checked);\n\t\t},\n\t\t[onChange],\n\t);\n\n\treturn (\n\t\t<label className={styles.container}>\n\t\t\t<input\n\t\t\t\ttype=\"checkbox\"\n\t\t\t\tclassName={styles.input}\n\t\t\t\tchecked={!!value}\n\t\t\t\tonChange={handleChange}\n\t\t\t\tdisabled={readOnly}\n\t\t\t/>\n\t\t\t{label && <span className={styles.label}>{label}</span>}\n\t\t</label>\n\t);\n};\n\nCheckbox.displayName = \"Checkbox\";\n","import { type ReactNode, useState } from \"react\";\n\nimport styles from \"./CollapsibleSection.module.css\";\n\n/**\n * 折りたたみ可能なセクションコンポーネントへの props。\n */\nexport interface CollapsibleSectionProps {\n\t/** セクションのタイトル */\n\ttitle: string;\n\n\t/** 子要素(コンテンツ) */\n\tchildren: ReactNode;\n\n\t/** 折りたたみ可能にするかどうか(デフォルト: false = 常時展開) */\n\tcollapsible?: boolean;\n\n\t/** 初期状態で折りたたむかどうか(collapsible が true のときのみ有効、デフォルト: true) */\n\tdefaultCollapsed?: boolean;\n\n\t/**\n\t * 開閉状態の外部制御(指定時は内部状態を使わず isOpen に従う)。\n\t * collapsible=true のときのみ有効。\n\t */\n\tisOpen?: boolean;\n\n\t/** 外部制御時の開閉変更コールバック */\n\tonOpenChange?: (open: boolean) => void;\n\n\t/** タイトル直右に表示する info アイコンのツールチップ説明文 */\n\tdescription?: string;\n\n\t/** ヘッダー右側に配置するアクション要素 */\n\tactions?: ReactNode;\n\n\t/** 開いているときに表示するラベル(例: \"カスタム\") */\n\topenLabel?: string;\n\n\t/** 閉じているときに表示するラベル(例: \"標準\") */\n\tcloseLabel?: string;\n\n\t/** コンテンツ領域のパディングを除去する */\n\tnoPadding?: boolean;\n}\n\n/**\n * 折りたたみ可能なセクションコンポーネント。\n *\n * @remarks\n * **Shell** — プロパティパネル等のセクション区切り UI として使用する。\n */\nexport const CollapsibleSection = ({\n\ttitle,\n\tchildren,\n\tcollapsible = false,\n\tdefaultCollapsed = true,\n\tisOpen: isOpenProp,\n\tonOpenChange,\n\tdescription,\n\tactions,\n\topenLabel,\n\tcloseLabel,\n\tnoPadding = false,\n}: CollapsibleSectionProps) => {\n\tconst [isCollapsedInternal, setIsCollapsedInternal] = useState(\n\t\tcollapsible ? defaultCollapsed : false,\n\t);\n\n\tconst isControlled = isOpenProp !== undefined;\n\tconst isCollapsed = isControlled ? !isOpenProp : isCollapsedInternal;\n\n\tconst handleToggle = () => {\n\t\tconst nextOpen = isCollapsed;\n\t\tif (isControlled) {\n\t\t\tonOpenChange?.(nextOpen);\n\t\t} else {\n\t\t\tsetIsCollapsedInternal(!nextOpen);\n\t\t\tonOpenChange?.(nextOpen);\n\t\t}\n\t};\n\n\tconst showContent = !collapsible || !isCollapsed;\n\tconst contentClass = noPadding ? styles.contentNoPadding : styles.content;\n\n\tconst statusLabel = collapsible\n\t\t? isCollapsed\n\t\t\t? closeLabel\n\t\t\t: openLabel\n\t\t: undefined;\n\n\treturn (\n\t\t<div className={styles.section}>\n\t\t\t{collapsible ? (\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclassName={styles.header}\n\t\t\t\t\tonClick={handleToggle}\n\t\t\t\t\taria-expanded={!isCollapsed}\n\t\t\t\t>\n\t\t\t\t\t<span className={styles.titleGroup}>\n\t\t\t\t\t\t<span className={styles.title}>{title}</span>\n\t\t\t\t\t\t{description && (\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tclassName={styles.infoIcon}\n\t\t\t\t\t\t\t\ttitle={description}\n\t\t\t\t\t\t\t\trole=\"img\"\n\t\t\t\t\t\t\t\taria-label={description}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\ti\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</span>\n\t\t\t\t\t{actions && (\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\trole=\"none\"\n\t\t\t\t\t\t\tclassName={styles.actions}\n\t\t\t\t\t\t\tonClick={(e) => e.stopPropagation()}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{actions}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t)}\n\t\t\t\t\t{statusLabel && (\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tclassName={`${styles.statusBadge} ${isCollapsed ? styles.statusBadgeOff : styles.statusBadgeOn}`}\n\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{statusLabel}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t)}\n\t\t\t\t\t<span\n\t\t\t\t\t\tclassName={`${styles.chevron} ${isCollapsed ? \"\" : styles.chevronOpen}`}\n\t\t\t\t\t\taria-hidden\n\t\t\t\t\t>\n\t\t\t\t\t\t▾\n\t\t\t\t\t</span>\n\t\t\t\t</button>\n\t\t\t) : (\n\t\t\t\t<div className={styles.header}>\n\t\t\t\t\t<span className={styles.titleGroup}>\n\t\t\t\t\t\t<span className={styles.title}>{title}</span>\n\t\t\t\t\t\t{description && (\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tclassName={styles.infoIcon}\n\t\t\t\t\t\t\t\ttitle={description}\n\t\t\t\t\t\t\t\trole=\"img\"\n\t\t\t\t\t\t\t\taria-label={description}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\ti\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</span>\n\t\t\t\t\t{actions && <span className={styles.actions}>{actions}</span>}\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{showContent && <div className={contentClass}>{children}</div>}\n\t\t</div>\n\t);\n};\n\nCollapsibleSection.displayName = \"CollapsibleSection\";\n","import type { RGBA } from \"./types\";\n\n/**\n * カラー文字列を RGBA オブジェクトに変換する。\n *\n * `#RRGGBB`・`#RRGGBBAA`(Hex)および `rgb()` / `rgba()` 形式に対応している。\n *\n * `value` が空・`undefined`、または認識できないフォーマットの場合は `null` を返す。\n */\nexport function parseColor(value: string | undefined): RGBA | null {\n\tif (!value) {\n\t\treturn null;\n\t}\n\n\t// Hex形式 (#RRGGBB または #RRGGBBAA)\n\tconst hexMatch = value.match(/^#([0-9a-f]{6}|[0-9a-f]{8})$/i);\n\tif (hexMatch && typeof hexMatch[1] === \"string\") {\n\t\tconst hex = hexMatch[1];\n\t\tconst r = Number.parseInt(hex.slice(0, 2), 16);\n\t\tconst g = Number.parseInt(hex.slice(2, 4), 16);\n\t\tconst b = Number.parseInt(hex.slice(4, 6), 16);\n\t\tconst a = hex.length === 8 ? Number.parseInt(hex.slice(6, 8), 16) / 255 : 1;\n\t\treturn { r, g, b, a };\n\t}\n\n\t// rgba形式\n\tconst rgbaMatch = value.match(\n\t\t/^rgba?\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(?:,\\s*([\\d.]+)\\s*)?\\)$/,\n\t);\n\tif (rgbaMatch) {\n\t\tconst r = Number.parseInt(rgbaMatch[1] ?? \"\", 10);\n\t\tconst g = Number.parseInt(rgbaMatch[2] ?? \"\", 10);\n\t\tconst b = Number.parseInt(rgbaMatch[3] ?? \"\", 10);\n\t\tconst a = rgbaMatch[4] ? Number.parseFloat(rgbaMatch[4]) : 1;\n\t\treturn { r, g, b, a };\n\t}\n\n\treturn null;\n}\n\n/**\n * RGBA オブジェクトを Hex 文字列に変換する。\n *\n * アルファ値が 1 未満の場合は `#RRGGBBAA` 形式、1 の場合は `#RRGGBB` 形式で返す。\n *\n * `a === 0`(完全透明)の場合は `undefined` を返す。\n */\nexport function toHex(rgba: RGBA): string | undefined {\n\tconst { r, g, b, a } = rgba;\n\n\tif (a === 0) {\n\t\treturn undefined;\n\t}\n\n\tconst rHex = r.toString(16).padStart(2, \"0\");\n\tconst gHex = g.toString(16).padStart(2, \"0\");\n\tconst bHex = b.toString(16).padStart(2, \"0\");\n\n\tif (a < 1) {\n\t\tconst aHex = Math.round(a * 255)\n\t\t\t.toString(16)\n\t\t\t.padStart(2, \"0\");\n\t\treturn `#${rHex}${gHex}${bHex}${aHex}`;\n\t}\n\n\treturn `#${rHex}${gHex}${bHex}`;\n}\n\n/**\n * Hex カラー文字列の妥当性をチェックする。\n *\n * `#RRGGBB` または `#RRGGBBAA` 形式の文字列を有効とみなす。\n */\nexport function isValidHex(hex: string): boolean {\n\treturn /^#([0-9a-f]{6}|[0-9a-f]{8})$/i.test(hex);\n}\n","/**\n * RGBA カラー型定義。\n */\nexport interface RGBA {\n\t/** 赤チャンネル(0–255) */\n\tr: number;\n\n\t/** 緑チャンネル(0–255) */\n\tg: number;\n\n\t/** 青チャンネル(0–255) */\n\tb: number;\n\n\t/** 不透明度(0–1) */\n\ta: number;\n}\n\n/**\n * カラーパレット定義(30色)。\n */\nexport const COLOR_PALETTE: { label: string; value: string | undefined }[] = [\n\t{ label: \"無色\", value: undefined },\n\t{ label: \"白\", value: \"#ffffff\" },\n\t{ label: \"グレー1\", value: \"#efefef\" },\n\t{ label: \"グレー2\", value: \"#d9d9d9\" },\n\t{ label: \"グレー3\", value: \"#cccccc\" },\n\t{ label: \"グレー4\", value: \"#b7b7b7\" },\n\t{ label: \"グレー5\", value: \"#999999\" },\n\t{ label: \"グレー6\", value: \"#666666\" },\n\t{ label: \"グレー7\", value: \"#434343\" },\n\t{ label: \"黒\", value: \"#000000\" },\n\t{ label: \"薄茶\", value: \"#E6B8AF\" },\n\t{ label: \"薄赤\", value: \"#F4CCCC\" },\n\t{ label: \"薄橙\", value: \"#FCE5CD\" },\n\t{ label: \"薄黄\", value: \"#FFF2CC\" },\n\t{ label: \"薄緑\", value: \"#D9EAD3\" },\n\t{ label: \"薄青緑\", value: \"#D0E0E3\" },\n\t{ label: \"薄青\", value: \"#C9DAF8\" },\n\t{ label: \"薄青紫\", value: \"#CFE2F3\" },\n\t{ label: \"薄紫\", value: \"#D9D2E9\" },\n\t{ label: \"薄赤紫\", value: \"#EAD1DC\" },\n\t{ label: \"茶\", value: \"#DD7E6B\" },\n\t{ label: \"赤\", value: \"#EA9999\" },\n\t{ label: \"橙\", value: \"#F9CB9C\" },\n\t{ label: \"黄\", value: \"#FFE599\" },\n\t{ label: \"緑\", value: \"#B6D7A8\" },\n\t{ label: \"青緑\", value: \"#A2C4C9\" },\n\t{ label: \"青\", value: \"#A4C2F4\" },\n\t{ label: \"青紫\", value: \"#9FC5E8\" },\n\t{ label: \"紫\", value: \"#B4A7D6\" },\n\t{ label: \"赤紫\", value: \"#D5A6BD\" },\n] as const;\n","import { COLOR_PALETTE } from \"../../../utils/color\";\nimport styles from \"./ColorPicker.module.css\";\n\nimport type React from \"react\";\n\n/**\n * カラーパレットコンポーネントへの props。\n */\nexport interface ColorPaletteProps {\n\t/** 色を選択時のコールバック */\n\tonColorSelect: (color: string | undefined) => void;\n\n\t/** 現在選択中の色(ハイライト用) */\n\tselectedColor?: string;\n\n\t/** `true` のとき読み取り専用 */\n\treadOnly?: boolean;\n}\n\n/**\n * カラーパレットコンポーネント。\n *\n * @remarks\n * `ColorPickerPopover` 内部のパレット UI。\n */\nexport const ColorPalette = ({\n\tonColorSelect,\n\tselectedColor,\n\treadOnly = false,\n}: ColorPaletteProps): React.ReactElement => {\n\treturn (\n\t\t<div className={styles.palette}>\n\t\t\t{COLOR_PALETTE.map((color, index) => {\n\t\t\t\tconst isUndefined = color.value === undefined;\n\t\t\t\tconst isSelected = color.value === selectedColor;\n\t\t\t\tconst buttonStyle: React.CSSProperties = isUndefined\n\t\t\t\t\t? {}\n\t\t\t\t\t: { backgroundColor: color.value };\n\n\t\t\t\treturn (\n\t\t\t\t\t<button\n\t\t\t\t\t\tkey={color.value ?? `undefined-${index}`}\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclassName={`${styles.paletteButton} ${isUndefined ? styles.transparentPaletteButton : \"\"} ${isSelected ? styles.selected : \"\"}`}\n\t\t\t\t\t\tonClick={() => onColorSelect(color.value)}\n\t\t\t\t\t\tdisabled={readOnly}\n\t\t\t\t\t\ttitle={color.label}\n\t\t\t\t\t\taria-label={color.label}\n\t\t\t\t\t\tstyle={buttonStyle}\n\t\t\t\t\t/>\n\t\t\t\t);\n\t\t\t})}\n\t\t</div>\n\t);\n};\n\nColorPalette.displayName = \"ColorPalette\";\n","import { useCallback } from \"react\";\n\nimport styles from \"./NumberInput.module.css\";\n\nimport type React from \"react\";\nimport type { PropertyComponentProps } from \"../../../plugin\";\nimport type { Value } from \"../../../types/value\";\n\n/**\n * 数値入力の設定オブジェクト。\n *\n * @remarks\n * **Shell** — `NumberInputProps.config` に渡す設定値の型。\n */\nexport interface NumberInputConfig {\n\t/** 最小値 */\n\tmin?: number;\n\n\t/** 最大値 */\n\tmax?: number;\n\n\t/** ステップ幅 */\n\tstep?: number;\n\n\t/** `true` のとき入力値を整数に丸める */\n\tinteger?: boolean;\n\n\t/** プレースホルダーテキスト */\n\tplaceholder?: string;\n\n\t/** 幅(px) */\n\twidth?: number;\n\n\t/** 高さ(px) */\n\theight?: number;\n\t[key: string]: Value | undefined;\n}\n\n/**\n * 数値入力コンポーネントへの props。\n */\nexport interface NumberInputProps\n\textends PropertyComponentProps<number | undefined> {\n\t/** 最小値 */\n\tmin?: number;\n\n\t/** 最大値 */\n\tmax?: number;\n\n\t/** ステップ幅 */\n\tstep?: number;\n\n\t/** `true` のとき入力値を整数に丸める */\n\tinteger?: boolean;\n\n\t/** プレースホルダーテキスト */\n\tplaceholder?: string;\n\n\t/** 幅(px) */\n\twidth?: number;\n\n\t/** 高さ(px) */\n\theight?: number;\n\n\t/** `aria-label` 属性に設定するテキスト */\n\tariaLabel?: string;\n\n\t/** `min`/`max`/`step` 等をまとめた設定オブジェクト。フィールドより優先度が低い */\n\tconfig?: NumberInputConfig;\n\n\t/** フォーカスが外れたときのコールバック */\n\tonBlur?: () => void;\n}\n\n/**\n * 数値入力コンポーネント。\n *\n * @remarks\n * **Shell** — プラグインプロパティの編集 UI として使用する。\n */\nexport const NumberInput = ({\n\tvalue,\n\tonChange,\n\treadOnly = false,\n\tmin: propMin,\n\tmax: propMax,\n\tstep: propStep,\n\tinteger: propInteger,\n\tplaceholder: propPlaceholder,\n\twidth: propWidth,\n\theight: propHeight,\n\tariaLabel,\n\tconfig,\n\tonBlur,\n}: NumberInputProps): React.ReactElement => {\n\tconst min = propMin ?? config?.min ?? 1;\n\tconst max = propMax ?? config?.max;\n\tconst step = propStep ?? config?.step ?? 1;\n\tconst integer = propInteger ?? config?.integer ?? false;\n\tconst placeholder = propPlaceholder ?? config?.placeholder;\n\tconst width = propWidth ?? config?.width;\n\tconst height = propHeight ?? config?.height;\n\n\tconst handleChange = useCallback(\n\t\t(e: React.ChangeEvent<HTMLInputElement>) => {\n\t\t\tconst text = e.target.value;\n\t\t\tif (text === \"\") {\n\t\t\t\tonChange(undefined);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlet num = Number.parseFloat(text);\n\t\t\tif (Number.isNaN(num)) return;\n\n\t\t\tif (integer) num = Math.round(num);\n\t\t\tif (min !== undefined && num < min) num = min;\n\t\t\tif (max !== undefined && num > max) num = max;\n\n\t\t\tonChange(num);\n\t\t},\n\t\t[onChange, min, max, integer],\n\t);\n\n\tconst style: React.CSSProperties = {};\n\tif (width !== undefined) style.width = `${width}px`;\n\n\tif (height !== undefined) {\n\t\tstyle.height = `${height}px`;\n\t\tstyle.paddingTop = 0;\n\t\tstyle.paddingBottom = 0;\n\t}\n\n\treturn (\n\t\t<input\n\t\t\ttype=\"number\"\n\t\t\tclassName={styles.input}\n\t\t\tstyle={style}\n\t\t\tvalue={value ?? \"\"}\n\t\t\tonChange={handleChange}\n\t\t\tonBlur={onBlur}\n\t\t\tdisabled={readOnly}\n\t\t\tmin={min}\n\t\t\tmax={max}\n\t\t\tstep={step}\n\t\t\tplaceholder={placeholder}\n\t\t\taria-label={ariaLabel}\n\t\t/>\n\t);\n};\n\nNumberInput.displayName = \"NumberInput\";\n","import { NumberInput } from \"../NumberInput/NumberInput\";\nimport styles from \"./ColorPicker.module.css\";\n\nimport type React from \"react\";\nimport type { RGBA } from \"../../../utils/color\";\n\n/**\n * RGBA 値入力コンポーネントへの props。\n */\nexport interface RGBAInputsProps {\n\t/** 現在の RGBA 値 */\n\trgba: RGBA;\n\n\t/** 各チャンネル変更時のコールバック(R/G/B: 0–2550、A: 0–1) */\n\tonChange: (channel: keyof RGBA, value: number | undefined) => void;\n\n\t/** `true` のとき読み取り専用 */\n\treadOnly?: boolean;\n}\n\n/**\n * RGBA 値入力コンポーネント。\n *\n * @remarks\n * `ColorPickerPopover` 内部の RGBA 入力 UI。\n */\nexport const RGBAInputs = ({\n\trgba,\n\tonChange,\n\treadOnly = false,\n}: RGBAInputsProps): React.ReactElement => {\n\treturn (\n\t\t<div className={styles.rgbaInputs}>\n\t\t\t<div className={styles.rgbaInputGroup}>\n\t\t\t\t<span className={styles.rgbaLabel}>R</span>\n\t\t\t\t<NumberInput\n\t\t\t\t\tvalue={rgba.r}\n\t\t\t\t\tonChange={(v) => onChange(\"r\", v)}\n\t\t\t\t\tmin={0}\n\t\t\t\t\tmax={255}\n\t\t\t\t\tstep={1}\n\t\t\t\t\tinteger={true}\n\t\t\t\t\twidth={48}\n\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t<div className={styles.rgbaInputGroup}>\n\t\t\t\t<span className={styles.rgbaLabel}>G</span>\n\t\t\t\t<NumberInput\n\t\t\t\t\tvalue={rgba.g}\n\t\t\t\t\tonChange={(v) => onChange(\"g\", v)}\n\t\t\t\t\tmin={0}\n\t\t\t\t\tmax={255}\n\t\t\t\t\tstep={1}\n\t\t\t\t\tinteger={true}\n\t\t\t\t\twidth={48}\n\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t<div className={styles.rgbaInputGroup}>\n\t\t\t\t<span className={styles.rgbaLabel}>B</span>\n\t\t\t\t<NumberInput\n\t\t\t\t\tvalue={rgba.b}\n\t\t\t\t\tonChange={(v) => onChange(\"b\", v)}\n\t\t\t\t\tmin={0}\n\t\t\t\t\tmax={255}\n\t\t\t\t\tstep={1}\n\t\t\t\t\tinteger={true}\n\t\t\t\t\twidth={48}\n\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t<div className={styles.rgbaInputGroup}>\n\t\t\t\t<span className={styles.rgbaLabel}>A</span>\n\t\t\t\t<NumberInput\n\t\t\t\t\tvalue={Math.round(rgba.a * 100)}\n\t\t\t\t\tonChange={(v) => onChange(\"a\", v !== undefined ? v / 100 : undefined)}\n\t\t\t\t\tmin={0}\n\t\t\t\t\tmax={100}\n\t\t\t\t\tstep={1}\n\t\t\t\t\tinteger={true}\n\t\t\t\t\twidth={48}\n\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nRGBAInputs.displayName = \"RGBAInputs\";\n","import { useEffect, useRef } from \"react\";\n\nimport { Z_INDEX } from \"../../../utils/zIndex/constants\";\nimport { ColorPalette } from \"./ColorPalette\";\nimport styles from \"./ColorPicker.module.css\";\nimport { RGBAInputs } from \"./RGBAInputs\";\n\nimport type React from \"react\";\nimport type { RGBA } from \"../../../utils/color\";\n\n/**\n * カラーピッカーポップオーバーコンポーネントへの props。\n */\nexport interface ColorPickerPopoverProps {\n\t/** ポップアップの開閉状態 */\n\tisOpen: boolean;\n\n\t/** 閉じるリクエスト時のコールバック */\n\tonClose: () => void;\n\n\t/** 現在の RGBA 値 */\n\trgba: RGBA;\n\n\t/** RGBA 各チャンネル変更時のコールバック */\n\tonRgbaChange: (channel: keyof RGBA, value: number | undefined) => void;\n\n\t/** パレットから色を選択時のコールバック */\n\tonColorSelect: (color: string | undefined) => void;\n\n\t/** 現在選択中の色(パレットハイライト用) */\n\tselectedColor?: string;\n\n\t/** `true` のとき読み取り専用 */\n\treadOnly?: boolean;\n}\n\n/**\n * カラーピッカーポップオーバーコンポーネント。\n *\n * @remarks\n * `ColorPicker` 内部のポップアップ UI。\n */\nexport const ColorPickerPopover = ({\n\tisOpen,\n\tonClose,\n\trgba,\n\tonRgbaChange,\n\tonColorSelect,\n\tselectedColor,\n\treadOnly = false,\n}: ColorPickerPopoverProps): React.ReactElement | null => {\n\tconst popoverRef = useRef<HTMLDivElement>(null);\n\n\t// 外側クリックでクローズ\n\tuseEffect(() => {\n\t\tif (!isOpen) return;\n\n\t\tconst handleClickOutside = (e: MouseEvent) => {\n\t\t\tif (\n\t\t\t\tpopoverRef.current &&\n\t\t\t\t!popoverRef.current.contains(e.target as Node)\n\t\t\t) {\n\t\t\t\tonClose();\n\t\t\t}\n\t\t};\n\n\t\tdocument.addEventListener(\"mousedown\", handleClickOutside);\n\t\treturn () => {\n\t\t\tdocument.removeEventListener(\"mousedown\", handleClickOutside);\n\t\t};\n\t}, [isOpen, onClose]);\n\n\tif (!isOpen) return null;\n\n\treturn (\n\t\t<div\n\t\t\tclassName={styles.popover}\n\t\t\tref={popoverRef}\n\t\t\tstyle={{ zIndex: Z_INDEX.DROPDOWN }}\n\t\t>\n\t\t\t{/* カラーパレット */}\n\t\t\t<ColorPalette\n\t\t\t\tonColorSelect={onColorSelect}\n\t\t\t\tselectedColor={selectedColor}\n\t\t\t\treadOnly={readOnly}\n\t\t\t/>\n\n\t\t\t{/* RGBA入力 */}\n\t\t\t<RGBAInputs rgba={rgba} onChange={onRgbaChange} readOnly={readOnly} />\n\t\t</div>\n\t);\n};\n\nColorPickerPopover.displayName = \"ColorPickerPopover\";\n","import { useCallback, useEffect, useRef, useState } from \"react\";\n\nimport { parseColor, toHex } from \"../../../utils/color\";\nimport styles from \"./ColorPicker.module.css\";\nimport { ColorPickerPopover } from \"./ColorPickerPopover\";\n\nimport type React from \"react\";\nimport type { PropertyComponentProps } from \"../../../plugin\";\nimport type { Value } from \"../../../types/value\";\nimport type { RGBA } from \"../../../utils/color\";\n\n/**\n * カラーピッカーの設定オブジェクト。\n *\n * @remarks\n * **Shell** — `ColorPickerProps.config` に渡す設定値の型。\n */\nexport interface ColorPickerConfig {\n\t/** `true` のとき未設定(`undefined`)を許容する */\n\tallowUndefined?: boolean;\n\n\t/** 幅(px) */\n\twidth?: number;\n\n\t/** 高さ(px) */\n\theight?: number;\n\t[key: string]: Value | undefined;\n}\n\n/**\n * カラーピッカーコンポーネントへの props。\n */\nexport interface ColorPickerProps\n\textends PropertyComponentProps<string | undefined> {\n\t/** カラーテキスト入力を表示するか */\n\tshowTextInput?: boolean;\n\n\t/** undefined(未設定)を許容するか */\n\tallowUndefined?: boolean;\n\n\t/** プレースホルダーテキスト */\n\tplaceholder?: string;\n\n\t/** 幅(px) */\n\twidth?: number;\n\n\t/** 高さ(px) */\n\theight?: number;\n\n\t/** 設定オブジェクト */\n\tconfig?: ColorPickerConfig;\n}\n\n/**\n * カラーピッカーコンポーネント。\n *\n * @remarks\n * **Shell** — プラグインプロパティの編集 UI として使用する。\n */\nexport const ColorPicker = ({\n\tvalue,\n\tonChange,\n\treadOnly = false,\n\tshowTextInput = true,\n\tallowUndefined: propAllowUndefined,\n\tplaceholder: propPlaceholder,\n\twidth: propWidth,\n\theight: propHeight,\n\tconfig,\n}: ColorPickerProps): React.ReactElement => {\n\tconst allowUndefined = propAllowUndefined ?? config?.allowUndefined ?? true;\n\tconst placeholder =\n\t\tpropPlaceholder ?? (allowUndefined ? \"未設定\" : \"#000000\");\n\tconst width = propWidth ?? config?.width;\n\tconst height = propHeight ?? config?.height;\n\n\tconst [isOpen, setIsOpen] = useState(false);\n\tconst containerRef = useRef<HTMLDivElement>(null);\n\n\tconst [rgbaValues, setRgbaValues] = useState<RGBA>(() => {\n\t\tconst parsed = parseColor(value);\n\t\treturn parsed ?? { r: 0, g: 0, b: 0, a: 1 };\n\t});\n\n\tuseEffect(() => {\n\t\tconst parsed = parseColor(value);\n\t\tif (parsed) {\n\t\t\tsetRgbaValues(parsed);\n\t\t}\n\t}, [value]);\n\n\tconst handleColorButtonClick = useCallback(() => {\n\t\tif (!readOnly) {\n\t\t\tsetIsOpen((prev) => !prev);\n\t\t}\n\t}, [readOnly]);\n\n\tconst [textInputValue, setTextInputValue] = useState(\n\t\tvalue ? value.replace(/^#/, \"\") : \"\",\n\t);\n\n\tuseEffect(() => {\n\t\tsetTextInputValue(value ? value.replace(/^#/, \"\") : \"\");\n\t}, [value]);\n\n\tconst handleTextChange = useCallback(\n\t\t(e: React.ChangeEvent<HTMLInputElement>) => {\n\t\t\tconst text = e.target.value;\n\t\t\tif (/^[0-9A-Fa-f]*$/.test(text)) {\n\t\t\t\tsetTextInputValue(text);\n\t\t\t}\n\t\t},\n\t\t[],\n\t);\n\n\tconst confirmTextInput = useCallback(\n\t\t(text: string) => {\n\t\t\tif (text === \"\" && allowUndefined) {\n\t\t\t\tonChange(undefined);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (/^[0-9A-Fa-f]{6}([0-9A-Fa-f]{2})?$/.test(text)) {\n\t\t\t\tconst hex = `#${text}`;\n\t\t\t\tconst parsed = parseColor(hex);\n\t\t\t\tif (parsed) setRgbaValues(parsed);\n\t\t\t\tonChange(hex);\n\t\t\t} else {\n\t\t\t\tsetTextInputValue(value ? value.replace(/^#/, \"\") : \"\");\n\t\t\t}\n\t\t},\n\t\t[onChange, allowUndefined, value],\n\t);\n\n\tconst handleTextBlur = useCallback(\n\t\t(e: React.FocusEvent<HTMLInputElement>) => {\n\t\t\tconfirmTextInput(e.target.value);\n\t\t},\n\t\t[confirmTextInput],\n\t);\n\n\tconst handleTextKeyDown = useCallback(\n\t\t(e: React.KeyboardEvent<HTMLInputElement>) => {\n\t\t\tif (e.key === \"Enter\") {\n\t\t\t\te.preventDefault();\n\t\t\t\tconfirmTextInput(e.currentTarget.value);\n\t\t\t\te.currentTarget.blur();\n\t\t\t}\n\t\t},\n\t\t[confirmTextInput],\n\t);\n\n\tconst handlePaletteClick = useCallback(\n\t\t(colorValue: string | undefined) => {\n\t\t\tif (colorValue) {\n\t\t\t\tconst parsed = parseColor(colorValue);\n\t\t\t\tif (parsed) {\n\t\t\t\t\tsetRgbaValues(parsed);\n\t\t\t\t\tsetTextInputValue(colorValue.replace(/^#/, \"\"));\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tsetTextInputValue(\"\");\n\t\t\t}\n\t\t\t// ポップオーバーは閉じない(RGBAバーで値が更新されたことをユーザーが確認できるように)\n\t\t\tonChange(colorValue);\n\t\t},\n\t\t[onChange],\n\t);\n\n\tconst handleRgbaChange = useCallback(\n\t\t(channel: keyof RGBA, newValue: number | undefined) => {\n\t\t\tif (newValue === undefined) return;\n\t\t\tconst newRgba = { ...rgbaValues, [channel]: newValue };\n\t\t\tsetRgbaValues(newRgba);\n\t\t\tonChange(toHex(newRgba));\n\t\t},\n\t\t[rgbaValues, onChange],\n\t);\n\n\tconst displayText = value ?? \"未設定\";\n\n\tconst colorStyle: React.CSSProperties = {};\n\tif (value) {\n\t\tcolorStyle.background = value;\n\t}\n\n\tconst containerStyle: React.CSSProperties = {};\n\tif (width !== undefined) {\n\t\tcontainerStyle.width = `${width}px`;\n\t} else {\n\t\tcontainerStyle.width = \"100%\";\n\t}\n\tif (height !== undefined) containerStyle.height = `${height}px`;\n\n\treturn (\n\t\t<div className={styles.container} style={containerStyle} ref={containerRef}>\n\t\t\t{/* カラーボタン */}\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tclassName={styles.colorButton}\n\t\t\t\tonClick={handleColorButtonClick}\n\t\t\t\tdisabled={readOnly}\n\t\t\t\ttitle={displayText}\n\t\t\t\taria-label=\"カラーピッカーを開く\"\n\t\t\t\tstyle={colorStyle}\n\t\t\t/>\n\t\t\t{/* テキスト入力 */}\n\t\t\t{showTextInput && (\n\t\t\t\t<div className={styles.textInputWrapper}>\n\t\t\t\t\t<span className={styles.textInputPrefix}>#</span>\n\t\t\t\t\t<input\n\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\tclassName={styles.textInput}\n\t\t\t\t\t\tvalue={textInputValue}\n\t\t\t\t\t\tonChange={handleTextChange}\n\t\t\t\t\t\tonKeyDown={handleTextKeyDown}\n\t\t\t\t\t\tonBlur={handleTextBlur}\n\t\t\t\t\t\tdisabled={readOnly}\n\t\t\t\t\t\tplaceholder={placeholder}\n\t\t\t\t\t\tmaxLength={8}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t{/* ポップオーバー */}\n\t\t\t<ColorPickerPopover\n\t\t\t\tisOpen={isOpen}\n\t\t\t\tonClose={() => setIsOpen(false)}\n\t\t\t\trgba={rgbaValues}\n\t\t\t\tonRgbaChange={handleRgbaChange}\n\t\t\t\tonColorSelect={handlePaletteClick}\n\t\t\t\tselectedColor={value}\n\t\t\t\treadOnly={readOnly}\n\t\t\t/>\n\t\t</div>\n\t);\n};\n\nColorPicker.displayName = \"ColorPicker\";\n","import { useCallback } from \"react\";\n\nimport styles from \"./DimensionInput.module.css\";\n\nimport type React from \"react\";\nimport type { PropertyComponentProps } from \"../../../plugin\";\nimport type { Dimension, Unit } from \"../../../types/unit\";\nimport type { Value } from \"../../../types/value\";\n\n/**\n * `Dimension`(値+単位)入力の設定オブジェクト。\n *\n * @remarks\n * **Shell** — `DimensionInputProps.config` に渡す設定値の型。\n */\nexport interface DimensionInputConfig<U extends Unit> {\n\t/** 選択可能な単位の一覧 */\n\tallowedUnits?: readonly U[];\n\n\t/** 最小値 */\n\tmin?: number;\n\n\t/** 最大値 */\n\tmax?: number;\n\n\t/** ステップ幅 */\n\tstep?: number;\n\n\t/** プレースホルダーテキスト */\n\tplaceholder?: string;\n\n\t/** 幅(px) */\n\twidth?: number;\n\n\t/** 高さ(px) */\n\theight?: number;\n\t[key: string]: Value | undefined;\n}\n\n/**\n * `Dimension`(値+単位)入力コンポーネントへの props。\n */\nexport interface DimensionInputProps<U extends Unit>\n\textends PropertyComponentProps<Dimension<U> | undefined> {\n\t/** 選択可能な単位の一覧 */\n\tallowedUnits?: readonly U[];\n\n\t/** 最小値 */\n\tmin?: number;\n\n\t/** 最大値 */\n\tmax?: number;\n\n\t/** ステップ幅 */\n\tstep?: number;\n\n\t/** プレースホルダーテキスト */\n\tplaceholder?: string;\n\n\t/** 幅(px) */\n\twidth?: number;\n\n\t/** 高さ(px) */\n\theight?: number;\n\n\t/** `aria-label` 属性に設定するテキスト */\n\tariaLabel?: string;\n\n\t/** 各フィールドをまとめた設定オブジェクト。フィールドより優先度が低い */\n\tconfig?: DimensionInputConfig<U>;\n}\n\n/**\n * `Dimension`(値+単位)入力コンポーネント。\n *\n * @remarks\n * **Shell** — プラグインプロパティの編集 UI として使用する。\n */\nexport const DimensionInput = <U extends Unit>(\n\tprops: DimensionInputProps<U>,\n): React.ReactElement => {\n\tconst { value, onChange, readOnly = false, config } = props;\n\n\tconst allowedUnits = props.allowedUnits ?? config?.allowedUnits;\n\tconst min = props.min ?? config?.min;\n\tconst max = props.max ?? config?.max;\n\tconst step = props.step ?? config?.step ?? 1;\n\tconst placeholder = props.placeholder ?? config?.placeholder;\n\tconst width = props.width ?? config?.width;\n\tconst height = props.height ?? config?.height;\n\tconst ariaLabel = props.ariaLabel;\n\n\tconst currentUnit = value?.unit ?? allowedUnits?.[0];\n\n\tconst handleValueChange = useCallback(\n\t\t(e: React.ChangeEvent<HTMLInputElement>) => {\n\t\t\tconst inputValue = e.target.value;\n\t\t\tconst unit = value?.unit ?? currentUnit;\n\t\t\tif (unit === undefined) return;\n\n\t\t\tlet newValue = Number.parseFloat(inputValue);\n\t\t\tif (Number.isNaN(newValue)) return;\n\n\t\t\tconst effectiveMin = min ?? 1;\n\t\t\tif (newValue < effectiveMin) {\n\t\t\t\tnewValue = effectiveMin;\n\t\t\t}\n\t\t\tif (max !== undefined && newValue > max) {\n\t\t\t\tnewValue = max;\n\t\t\t}\n\n\t\t\tonChange({ value: newValue, unit });\n\t\t},\n\t\t[value, onChange, currentUnit, min, max],\n\t);\n\n\tconst handleBlur = useCallback(\n\t\t(e: React.FocusEvent<HTMLInputElement>) => {\n\t\t\tconst inputValue = e.target.value;\n\t\t\tif (inputValue === \"\") return;\n\t\t\tconst unit = value?.unit ?? currentUnit;\n\t\t\tif (unit === undefined) return;\n\n\t\t\tlet newValue = Number.parseFloat(inputValue);\n\t\t\tif (Number.isNaN(newValue)) return;\n\n\t\t\tconst effectiveMin = min ?? 1;\n\t\t\tif (newValue < effectiveMin) {\n\t\t\t\tnewValue = effectiveMin;\n\t\t\t\tonChange({ value: newValue, unit });\n\t\t\t}\n\t\t\tif (max !== undefined && newValue > max) {\n\t\t\t\tnewValue = max;\n\t\t\t\tonChange({ value: newValue, unit });\n\t\t\t}\n\t\t},\n\t\t[value, onChange, currentUnit, min, max],\n\t);\n\n\tconst handleUnitChange = useCallback(\n\t\t(e: React.ChangeEvent<HTMLSelectElement>) => {\n\t\t\tconst newUnit = e.target.value as U;\n\t\t\tonChange({ value: value?.value ?? 1, unit: newUnit });\n\t\t},\n\t\t[value, onChange],\n\t);\n\n\tconst displayValue = value?.value ?? \"\";\n\tconst displayUnit = value?.unit ?? currentUnit ?? \"\";\n\n\tconst containerStyle: React.CSSProperties = {};\n\tif (width !== undefined) {\n\t\tcontainerStyle.width = `${width}px`;\n\t} else {\n\t\tcontainerStyle.width = \"100%\";\n\t}\n\tif (height !== undefined) containerStyle.height = `${height}px`;\n\n\treturn (\n\t\t<div className={styles.container} style={containerStyle}>\n\t\t\t<input\n\t\t\t\ttype=\"number\"\n\t\t\t\tclassName={styles.valueInput}\n\t\t\t\tvalue={displayValue}\n\t\t\t\tonChange={handleValueChange}\n\t\t\t\tonBlur={handleBlur}\n\t\t\t\tplaceholder={placeholder}\n\t\t\t\tmin={min ?? 1}\n\t\t\t\tmax={max}\n\t\t\t\tstep={step}\n\t\t\t\treadOnly={readOnly}\n\t\t\t\tdisabled={readOnly}\n\t\t\t\taria-label={ariaLabel}\n\t\t\t/>\n\t\t\t<select\n\t\t\t\tclassName={styles.unitSelect}\n\t\t\t\tvalue={displayUnit}\n\t\t\t\tonChange={handleUnitChange}\n\t\t\t\tdisabled={readOnly || !allowedUnits || allowedUnits.length <= 1}\n\t\t\t\taria-label=\"単位\"\n\t\t\t>\n\t\t\t\t{allowedUnits ? (\n\t\t\t\t\tallowedUnits.map((u) => (\n\t\t\t\t\t\t<option key={u} value={u}>\n\t\t\t\t\t\t\t{u}\n\t\t\t\t\t\t</option>\n\t\t\t\t\t))\n\t\t\t\t) : (\n\t\t\t\t\t<option value={displayUnit as string}>{displayUnit}</option>\n\t\t\t\t)}\n\t\t\t</select>\n\t\t</div>\n\t);\n};\n","import { useCallback } from \"react\";\n\nimport styles from \"./Dropdown.module.css\";\n\nimport type React from \"react\";\nimport type { PropertyComponentProps } from \"../../../plugin\";\nimport type { Value } from \"../../../types/value\";\n\n/**\n * ドロップダウンの選択肢オブジェクト。\n *\n * @remarks\n * **Shell** — `DropdownConfig.options` や `DropdownProps.options` に渡す選択肖の型。\n */\nexport interface DropdownOption {\n\t/** 選択時に `onChange` に渡される値 */\n\tvalue: Value;\n\n\t/** 画面表示ラベル */\n\tlabel: string;\n\t[key: string]: Value;\n}\n\n/**\n * ドロップダウン選択の設定オブジェクト。\n *\n * @remarks\n * **Shell** — `DropdownProps.config` に渡す設定値の型。\n */\nexport interface DropdownConfig {\n\t/** 選択肢の一覧 */\n\toptions?: readonly DropdownOption[];\n\n\t/** 未選択時のプレースホルダーテキスト */\n\tplaceholder?: string;\n\n\t/** 幅(px) */\n\twidth?: number;\n\n\t/** 高さ(px) */\n\theight?: number;\n\n\t/** `false` のとき「未選択」状態を選択不可にする(デフォルト: `true`) */\n\tallowEmpty?: boolean;\n\t[key: string]: Value | undefined;\n}\n\n/**\n * ドロップダウン選択コンポーネントへの props。\n */\nexport interface DropdownProps<T extends string = string>\n\textends PropertyComponentProps<T | undefined> {\n\t/** 選択肢の一覧 */\n\toptions?: readonly DropdownOption[];\n\n\t/** 未選択時のプレースホルダーテキスト */\n\tplaceholder?: string;\n\n\t/** 幅(px) */\n\twidth?: number;\n\n\t/** 高さ(px) */\n\theight?: number;\n\n\t/** `aria-label` 属性に設定するテキスト */\n\tariaLabel?: string;\n\n\t/** `false` のとき「未選択」状態を選択不可にする(デフォルト: `true`) */\n\tallowEmpty?: boolean;\n\n\t/** 各フィールドをまとめた設定オブジェクト。フィールドより優先度が低い */\n\tconfig?: DropdownConfig;\n}\n\n/**\n * ドロップダウン選択コンポーネント。\n *\n * @remarks\n * **Shell** — プラグインプロパティの編集 UI として使用する。\n */\nexport const Dropdown = <T extends string = string>(\n\tprops: DropdownProps<T>,\n): React.ReactElement => {\n\tconst { value, onChange, readOnly = false, config } = props;\n\n\tconst options = props.options ?? config?.options ?? [];\n\tconst placeholder =\n\t\tprops.placeholder ?? config?.placeholder ?? \"選択してください\";\n\tconst width = props.width ?? config?.width;\n\tconst height = props.height ?? config?.height;\n\tconst allowEmpty = props.allowEmpty ?? config?.allowEmpty ?? true;\n\n\tconst handleChange = useCallback(\n\t\t(e: React.ChangeEvent<HTMLSelectElement>) => {\n\t\t\tconst selectedValue = e.target.value;\n\t\t\tif (selectedValue === \"\") {\n\t\t\t\tonChange(undefined);\n\t\t\t} else {\n\t\t\t\tconst option = options.find(\n\t\t\t\t\t(opt) => String(opt.value) === selectedValue,\n\t\t\t\t);\n\t\t\t\tif (option) {\n\t\t\t\t\tonChange(option.value as T);\n\t\t\t\t} else {\n\t\t\t\t\tonChange(selectedValue as T);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t[onChange, options],\n\t);\n\n\tconst displayValue = value ?? \"\";\n\tconst hasValue = value !== undefined && value !== \"\";\n\n\tconst containerStyle: React.CSSProperties = {};\n\tif (width !== undefined) {\n\t\tcontainerStyle.width = `${width}px`;\n\t} else {\n\t\tcontainerStyle.width = \"100%\";\n\t}\n\n\tconst elementStyle: React.CSSProperties = {\n\t\twidth: \"100%\",\n\t\theight: height ? `${height}px` : undefined,\n\t};\n\n\treturn (\n\t\t<div className={styles.container} style={containerStyle}>\n\t\t\t{!hasValue && (\n\t\t\t\t<div className={styles.placeholderOverlay} style={elementStyle}>\n\t\t\t\t\t{placeholder}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t<select\n\t\t\t\tclassName={styles.select}\n\t\t\t\tstyle={elementStyle}\n\t\t\t\tvalue={displayValue}\n\t\t\t\tonChange={handleChange}\n\t\t\t\tdisabled={readOnly}\n\t\t\t\taria-label={props.ariaLabel}\n\t\t\t>\n\t\t\t\t{allowEmpty && <option value=\"\" style={{ display: \"none\" }} />}\n\t\t\t\t{options.map((option) => (\n\t\t\t\t\t<option key={String(option.value)} value={String(option.value)}>\n\t\t\t\t\t\t{option.label}\n\t\t\t\t\t</option>\n\t\t\t\t))}\n\t\t\t</select>\n\t\t</div>\n\t);\n};\n\nDropdown.displayName = \"Dropdown\";\n","import styles from \"./IconActionButton.module.css\";\n\nimport type React from \"react\";\n\n/**\n * アイコンボタンコンポーネントへの props。\n\n */\nexport interface IconActionButtonProps {\n\t/** ボタン内に表示するアイコン */\n\ticon: React.ReactNode;\n\n\t/** アクセシビリティ用ラベル(`aria-label` および `title` のデフォルト値) */\n\tlabel: string;\n\n\t/** クリック時のコールバック */\n\tonClick?: () => void;\n\n\t/** マウスホバー時のコールバック */\n\tonMouseEnter?: () => void;\n\n\t/** `true` のとき非活性化 */\n\tdisabled?: boolean;\n\n\t/** ツールチップテキスト。省略時は `label` を使用する */\n\ttitle?: string;\n\n\t/** `true` のとき `mousedown` でフォーカスを奪わない。パネルを閉じたくない操作に使用する */\n\tpreventFocusOnMouseDown?: boolean;\n}\n\n/**\n * アイコンボタンコンポーネント。\n *\n * @remarks\n * **Shell** — ツールバーヤアクションバーのアイコンボタン UI として使用する。\n */\nexport const IconActionButton = ({\n\ticon,\n\tlabel,\n\tonClick,\n\tonMouseEnter,\n\tdisabled,\n\ttitle,\n\tpreventFocusOnMouseDown = false,\n}: IconActionButtonProps) => {\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tclassName={styles.button}\n\t\t\tonMouseDown={\n\t\t\t\tpreventFocusOnMouseDown ? (e) => e.preventDefault() : undefined\n\t\t\t}\n\t\t\tonMouseEnter={onMouseEnter}\n\t\t\tonClick={onClick}\n\t\t\tdisabled={disabled}\n\t\t\ttitle={title ?? label}\n\t\t\taria-label={label}\n\t\t>\n\t\t\t{icon}\n\t\t</button>\n\t);\n};\n\nIconActionButton.displayName = \"IconActionButton\";\n","import styles from \"./TabPanel.module.css\";\n\nimport type { ReactNode } from \"react\";\n\n/**\n * タブパネル共通コンポーネントへの props。\n */\nexport interface TabPanelProps {\n\t/** パネルの内容 */\n\tchildren: ReactNode;\n\n\t/** 空状態のメッセージ(childrenがない場合に表示) */\n\temptyMessage?: string;\n\n\t/** カスタムクラス名 */\n\tclassName?: string;\n}\n\n/**\n * タブパネル共通コンポーネント。\n *\n * @remarks\n * **Shell** — サイドバーのタブコンテンツ領域として使用する。\n */\nexport const TabPanel = ({\n\tchildren,\n\temptyMessage,\n\tclassName,\n}: TabPanelProps) => {\n\treturn (\n\t\t<div className={`${styles.container} ${className || \"\"}`}>\n\t\t\t{children ? (\n\t\t\t\t<div className={styles.scrollArea}>{children}</div>\n\t\t\t) : (\n\t\t\t\temptyMessage && <div className={styles.emptyState}>{emptyMessage}</div>\n\t\t\t)}\n\t\t</div>\n\t);\n};\n","import { createContext, useContext, useState } from \"react\";\n\nimport styles from \"./Tabs.module.css\";\n\nimport type React from \"react\";\n\n// Context ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー\ninterface TabsContextType {\n\tvalue: string;\n\tonChange: (value: string) => void;\n\tvariant: \"default\" | \"segmented\";\n}\n\nconst TabsContext = createContext<TabsContextType | undefined>(undefined);\n\n// Components ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー\n\n/**\n * タブコンテナコンポーネントへの props。\n */\nexport interface TabsProps {\n\t/** 初期選択タブの値 */\n\tdefaultValue: string;\n\n\t/** 外部制御時の選択タブ値 */\n\tvalue?: string;\n\n\t/** 選択タブ変更時のコールバック */\n\tonValueChange?: (value: string) => void;\n\n\t/** 子要素 */\n\tchildren: React.ReactNode;\n\n\t/** 表示バリアント。`segmented` は分割ボタン型 */\n\tvariant?: \"default\" | \"segmented\";\n\n\t/** カスタムクラス名 */\n\tclassName?: string;\n}\n\n/**\n * タブコンテナコンポーネント。\n *\n * @remarks\n * **Shell** — サイドバー・パネルのタブ UI として使用する。\n */\nexport const Tabs: React.FC<TabsProps> = ({\n\tdefaultValue,\n\tvalue: propValue,\n\tonValueChange,\n\tchildren,\n\tvariant = \"default\",\n\tclassName = \"\",\n}) => {\n\tconst [localValue, setLocalValue] = useState(defaultValue);\n\tconst value = propValue ?? localValue;\n\n\tconst handleChange = (newValue: string) => {\n\t\tsetLocalValue(newValue);\n\t\tonValueChange?.(newValue);\n\t};\n\n\treturn (\n\t\t<TabsContext.Provider value={{ value, onChange: handleChange, variant }}>\n\t\t\t<div className={`${styles.root} ${className}`} data-variant={variant}>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t</TabsContext.Provider>\n\t);\n};\n\n/**\n * タブリストコンポーネントへの props。\n */\nexport interface TabsListProps {\n\t/** 子要素 */\n\tchildren: React.ReactNode;\n\n\t/** カスタムクラス名 */\n\tclassName?: string;\n\n\t/** 幅(px) */\n\twidth?: number;\n\n\t/** 高さ(px) */\n\theight?: number;\n\n\t/** インラインスタイル */\n\tstyle?: React.CSSProperties;\n}\n\n/**\n * タブリストコンポーネント。\n *\n * @remarks\n * **Shell** — `Tabs` の子要素として使用する。\n */\nexport const TabsList: React.FC<TabsListProps> = ({\n\tchildren,\n\tclassName = \"\",\n\twidth,\n\theight,\n\tstyle: propStyle,\n}) => {\n\tconst context = useContext(TabsContext);\n\tif (!context) {\n\t\tthrow new Error(\"TabsList must be used within a Tabs component\");\n\t}\n\tconst { variant } = context;\n\n\tconst computedStyle: React.CSSProperties = { ...propStyle };\n\tif (width !== undefined) computedStyle.width = `${width}px`;\n\tif (height !== undefined) computedStyle.height = `${height}px`;\n\n\treturn (\n\t\t<div\n\t\t\tclassName={`${styles.list} ${className}`}\n\t\t\tdata-variant={variant}\n\t\t\tstyle={computedStyle}\n\t\t>\n\t\t\t{children}\n\t\t</div>\n\t);\n};\n\n/**\n * タブトリガーボタンコンポーネントへの props。\n */\nexport interface TabsTriggerProps {\n\t/** このトリガーが対応するタブ値(`TabsContent.value` と対応) */\n\tvalue: string;\n\n\t/** ボタン内に表示する内容 */\n\tchildren: React.ReactNode;\n\n\t/** カスタムクラス名 */\n\tclassName?: string;\n\n\t/** `true` のとき非活性化 */\n\tdisabled?: boolean;\n\n\t/** 幅(px) */\n\twidth?: number;\n\n\t/** 高さ(px) */\n\theight?: number;\n\n\t/** インラインスタイル */\n\tstyle?: React.CSSProperties;\n}\n\n/**\n * タブトリガーボタンコンポーネント。\n *\n * @remarks\n * **Shell** — `TabsList` の子要素として使用する。\n */\nexport const TabsTrigger: React.FC<TabsTriggerProps> = ({\n\tvalue,\n\tchildren,\n\tclassName = \"\",\n\tdisabled = false,\n\twidth,\n\theight,\n\tstyle: propStyle,\n}) => {\n\tconst context = useContext(TabsContext);\n\tif (!context) {\n\t\tthrow new Error(\"TabsTrigger must be used within a Tabs component\");\n\t}\n\tconst { value: selectedValue, onChange, variant } = context;\n\tconst isSelected = selectedValue === value;\n\n\tconst computedStyle: React.CSSProperties = { ...propStyle };\n\tif (width !== undefined) computedStyle.width = `${width}px`;\n\tif (height !== undefined) computedStyle.height = `${height}px`;\n\n\treturn (\n\t\t<button\n\t\t\tclassName={`${styles.trigger} ${className}`}\n\t\t\tdata-state={isSelected ? \"active\" : \"inactive\"}\n\t\t\tdata-variant={variant}\n\t\t\tonClick={() => onChange(value)}\n\t\t\tdisabled={disabled}\n\t\t\ttype=\"button\"\n\t\t\tstyle={computedStyle}\n\t\t>\n\t\t\t{children}\n\t\t</button>\n\t);\n};\n\n/**\n * タブコンテンツコンポーネントへの props。\n */\nexport interface TabsContentProps {\n\t/** 対応するタブ値(`TabsTrigger.value` と対応) */\n\tvalue: string;\n\n\t/** 表示する内容 */\n\tchildren: React.ReactNode;\n\n\t/** カスタムクラス名 */\n\tclassName?: string;\n}\n\n/**\n * タブコンテンツコンポーネント。\n *\n * @remarks\n * **Shell** — `Tabs` の子要素として使用する。\n */\nexport const TabsContent: React.FC<TabsContentProps> = ({\n\tvalue,\n\tchildren,\n\tclassName = \"\",\n}) => {\n\tconst context = useContext(TabsContext);\n\tif (!context) {\n\t\tthrow new Error(\"TabsContent must be used within a Tabs component\");\n\t}\n\tconst { value: selectedValue } = context;\n\n\tif (selectedValue !== value) return null;\n\n\treturn <div className={`${styles.content} ${className}`}>{children}</div>;\n};\n","import { useCallback } from \"react\";\n\nimport styles from \"./TextInput.module.css\";\n\nimport type React from \"react\";\nimport type { PropertyComponentProps } from \"../../../plugin\";\nimport type { Value } from \"../../../types/value\";\n\n/**\n * テキスト入力の設定オブジェクト。\n *\n * @remarks\n * **Shell** — `TextInputProps.config` に渡す設定値の型。\n */\nexport interface TextInputConfig {\n\t/** プレースホルダーテキスト */\n\tplaceholder?: string;\n\n\t/** 最大文字数 */\n\tmaxLength?: number;\n\n\t/** `true` のとき `<textarea>` で表示する */\n\tmultiline?: boolean;\n\n\t/** `multiline` のとき表示する行数 */\n\trows?: number;\n\n\t/** 幅(px) */\n\twidth?: number;\n\n\t/** 高さ(px) */\n\theight?: number;\n\t[key: string]: Value | undefined;\n}\n\n/**\n * テキスト入力コンポーネントへの props。\n */\nexport interface TextInputProps\n\textends PropertyComponentProps<string | undefined> {\n\t/** プレースホルダーテキスト */\n\tplaceholder?: string;\n\n\t/** 最大文字数 */\n\tmaxLength?: number;\n\n\t/** `true` のとき `<textarea>` で表示する */\n\tmultiline?: boolean;\n\n\t/** `multiline` のとき表示する行数 */\n\trows?: number;\n\n\t/** 幅(px) */\n\twidth?: number;\n\n\t/** 高さ(px) */\n\theight?: number;\n\n\t/** `aria-label` 属性に設定するテキスト */\n\tariaLabel?: string;\n\n\t/** 各フィールドをまとめた設定オブジェクト。フィールドより優先度が低い */\n\tconfig?: TextInputConfig;\n\n\t/** フォーカスが外れたときのコールバック */\n\tonBlur?: () => void;\n}\n\n/**\n * テキスト入力コンポーネント。\n *\n * @remarks\n * **Shell** — プラグインプロパティの編集 UI として使用する。\n */\nexport const TextInput = ({\n\tvalue,\n\tonChange,\n\treadOnly = false,\n\tplaceholder: propPlaceholder,\n\tmaxLength: propMaxLength,\n\tmultiline: propMultiline,\n\trows: propRows,\n\twidth,\n\theight,\n\tariaLabel,\n\tconfig,\n\tonBlur,\n}: TextInputProps): React.ReactElement => {\n\tconst placeholder = propPlaceholder ?? config?.placeholder;\n\tconst maxLength = propMaxLength ?? config?.maxLength;\n\tconst multiline = propMultiline ?? config?.multiline ?? false;\n\tconst rows = propRows ?? config?.rows ?? 3;\n\n\tconst handleChange = useCallback(\n\t\t(e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n\t\t\tonChange(e.target.value);\n\t\t},\n\t\t[onChange],\n\t);\n\n\tconst style: React.CSSProperties = {};\n\tif (width !== undefined) {\n\t\tstyle.width = `${width}px`;\n\t} else {\n\t\tstyle.width = \"100%\";\n\t}\n\tif (height !== undefined) {\n\t\tstyle.height = `${height}px`;\n\t}\n\n\tconst commonProps = {\n\t\tclassName: styles.input,\n\t\tstyle,\n\t\tvalue: value ?? \"\",\n\t\tonChange: handleChange,\n\t\tdisabled: readOnly,\n\t\tplaceholder,\n\t\tmaxLength,\n\t\t\"aria-label\": ariaLabel,\n\t};\n\n\tif (multiline) {\n\t\treturn <textarea {...commonProps} rows={rows} />;\n\t}\n\n\treturn <input {...commonProps} type=\"text\" onBlur={onBlur} />;\n};\n\nTextInput.displayName = \"TextInput\";\n","import { useCallback } from \"react\";\n\nimport {\n\tPasteIcon,\n\tPrintIcon,\n\tRedoIcon,\n\tUndoIcon,\n} from \"../../../components/icons\";\nimport { getActionFeedback } from \"../../actionFeedback\";\nimport { IconActionButton } from \"../../ui\";\n\nimport type { ActionContext } from \"../../../types/context\";\nimport type { ActionFeedback } from \"../../actionFeedback\";\n\n/**\n * `CanvasActionSection` コンポーネントへの props。\n */\nexport interface CanvasActionSectionProps {\n\t/** アクション実行コンテキスト */\n\tactionContext: ActionContext;\n\n\t/** アクション実行時のフィードバック(トースト表示など) */\n\tonActionFeedback?: (feedback: ActionFeedback) => void;\n\n\t/** 印刷ボタン押下時のコールバック。省略時は `window.print()` を呼び出す */\n\tonPrint?: () => void;\n}\n\n/**\n * `ActionBar` に表示する Undo/Redo/Paste ボタン群コンポーネント。\n *\n * @remarks\n * **Shell** — 選択依存のアクション(Delete/Copy/Duplicate)は `SelectionActionBar` 側で担う。\n */\nexport const CanvasActionSection = ({\n\tactionContext,\n\tonActionFeedback,\n\tonPrint,\n}: CanvasActionSectionProps) => {\n\tconst resolvedCanUndo = actionContext.isEnabled(\"undo\");\n\tconst resolvedCanRedo = actionContext.isEnabled(\"redo\");\n\tconst resolvedHasCopied = actionContext.isEnabled(\"paste\");\n\n\tconst runAction = useCallback(\n\t\t(actionId: string) => {\n\t\t\tactionContext.execute(actionId);\n\t\t\tconst feedback = getActionFeedback(actionId);\n\t\t\tif (feedback) {\n\t\t\t\tonActionFeedback?.(feedback);\n\t\t\t}\n\t\t},\n\t\t[actionContext, onActionFeedback],\n\t);\n\n\treturn (\n\t\t<>\n\t\t\t<IconActionButton\n\t\t\t\ticon={<UndoIcon aria-hidden=\"true\" />}\n\t\t\t\tlabel=\"元に戻す\"\n\t\t\t\ttitle=\"元に戻す (Ctrl+Z / Cmd+Z)\"\n\t\t\t\tonClick={() => runAction(\"undo\")}\n\t\t\t\tdisabled={!resolvedCanUndo}\n\t\t\t\tpreventFocusOnMouseDown\n\t\t\t/>\n\t\t\t<IconActionButton\n\t\t\t\ticon={<RedoIcon aria-hidden=\"true\" />}\n\t\t\t\tlabel=\"やり直し\"\n\t\t\t\ttitle=\"やり直し (Ctrl+Y / Cmd+Y)\"\n\t\t\t\tonClick={() => runAction(\"redo\")}\n\t\t\t\tdisabled={!resolvedCanRedo}\n\t\t\t\tpreventFocusOnMouseDown\n\t\t\t/>\n\t\t\t<IconActionButton\n\t\t\t\ticon={<PasteIcon aria-hidden=\"true\" />}\n\t\t\t\tlabel=\"貼り付け\"\n\t\t\t\ttitle=\"貼り付け (Ctrl+V / Cmd+V)\"\n\t\t\t\tonClick={() => runAction(\"paste\")}\n\t\t\t\tdisabled={!resolvedHasCopied}\n\t\t\t\tpreventFocusOnMouseDown\n\t\t\t/>\n\t\t\t<IconActionButton\n\t\t\t\ticon={<PrintIcon aria-hidden=\"true\" />}\n\t\t\t\tlabel=\"印刷\"\n\t\t\t\ttitle=\"印刷 (Ctrl+P)\"\n\t\t\t\tonClick={() => (onPrint ? onPrint() : window.print())}\n\t\t\t\tpreventFocusOnMouseDown\n\t\t\t/>\n\t\t</>\n\t);\n};\n\nCanvasActionSection.displayName = \"CanvasActionSection\";\n","import { useCallback } from \"react\";\n\nimport {\n\tcolsToSparse,\n\texpandSparseCols,\n\texpandSparseRows,\n\trowsToSparse,\n} from \"../../../utils/grid\";\nimport styles from \"./ActionBar.module.css\";\n\nimport type React from \"react\";\nimport type { Grid } from \"../../../types/grid\";\n\n/**\n * `GridSettingsSection` コンポーネントへの props。\n */\nexport interface GridSettingsSectionProps {\n\t/** グリッド設定 */\n\tgrid: Grid;\n\n\t/** グリッド変更時のコールバック */\n\tonGridChange: (grid: Grid) => void;\n}\n\n// 新規列・行を追加する際のデフォルトディメンション値\nconst DEFAULT_DIMENSION = { value: 1, unit: \"fr\" as const };\n\n/**\n * `ActionBar` 上にグリッドの列数・行数を表示するコンパクトなコントロール。\n *\n * @remarks\n * **Shell** — `ActionBar` のグリッド列数・行数設定セクション。\n */\nexport const GridSettingsSection = ({\n\tgrid,\n\tonGridChange,\n}: GridSettingsSectionProps) => {\n\tconst handleColsChange = useCallback(\n\t\t(e: React.ChangeEvent<HTMLInputElement>) => {\n\t\t\tconst newColCount = parseInt(e.target.value, 10);\n\t\t\tif (!newColCount || newColCount < 1 || newColCount > 100) return;\n\n\t\t\tconst currentCols = expandSparseCols(grid);\n\t\t\tconst currentColCount = grid.colCount;\n\t\t\tconst newCols = [...currentCols];\n\n\t\t\tif (newColCount > currentColCount) {\n\t\t\t\tfor (let i = currentColCount; i < newColCount; i++) {\n\t\t\t\t\tnewCols.push({ ...DEFAULT_DIMENSION });\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tnewCols.splice(newColCount);\n\t\t\t}\n\n\t\t\tonGridChange({ ...grid, ...colsToSparse(newCols) });\n\t\t},\n\t\t[grid, onGridChange],\n\t);\n\n\tconst handleRowsChange = useCallback(\n\t\t(e: React.ChangeEvent<HTMLInputElement>) => {\n\t\t\tconst newRowCount = parseInt(e.target.value, 10);\n\t\t\tif (!newRowCount || newRowCount < 1 || newRowCount > 100) return;\n\n\t\t\tconst currentRows = expandSparseRows(grid);\n\t\t\tconst currentRowCount = grid.rowCount;\n\t\t\tconst newRows = [...currentRows];\n\n\t\t\tif (newRowCount > currentRowCount) {\n\t\t\t\tfor (let i = currentRowCount; i < newRowCount; i++) {\n\t\t\t\t\tnewRows.push({ ...DEFAULT_DIMENSION });\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tnewRows.splice(newRowCount);\n\t\t\t}\n\n\t\t\tonGridChange({ ...grid, ...rowsToSparse(newRows) });\n\t\t},\n\t\t[grid, onGridChange],\n\t);\n\n\treturn (\n\t\t<>\n\t\t\t<span className={styles.sectionLabel}>列</span>\n\t\t\t<input\n\t\t\t\ttype=\"number\"\n\t\t\t\tclassName={styles.numberInput}\n\t\t\t\tvalue={grid.colCount}\n\t\t\t\tmin={1}\n\t\t\t\tmax={100}\n\t\t\t\tonChange={handleColsChange}\n\t\t\t\taria-label=\"列数\"\n\t\t\t\ttitle=\"列数\"\n\t\t\t/>\n\t\t\t<span className={styles.sectionLabel}>行</span>\n\t\t\t<input\n\t\t\t\ttype=\"number\"\n\t\t\t\tclassName={styles.numberInput}\n\t\t\t\tvalue={grid.rowCount}\n\t\t\t\tmin={1}\n\t\t\t\tmax={100}\n\t\t\t\tonChange={handleRowsChange}\n\t\t\t\taria-label=\"行数\"\n\t\t\t\ttitle=\"行数\"\n\t\t\t/>\n\t\t</>\n\t);\n};\n\nGridSettingsSection.displayName = \"GridSettingsSection\";\n","import { useCallback } from \"react\";\n\nimport { DEFAULT_PAPER_SIZES, PaperSizePreset } from \"../../../types/paper\";\nimport { toMm } from \"../../../utils\";\nimport styles from \"./ActionBar.module.css\";\n\nimport type React from \"react\";\nimport type { Paper, PaperSize } from \"../../../types/paper\";\nimport type { PaperUnit } from \"../../../types/unit\";\n\n// mm を指定した用紙単位に変換するヘルパー\nfunction mmToUnit(mm: number, unit: PaperUnit): number {\n\tswitch (unit) {\n\t\tcase \"cm\":\n\t\t\treturn mm / 10;\n\t\tcase \"inch\":\n\t\t\treturn mm / 25.4;\n\t\tdefault:\n\t\t\treturn mm; // \"mm\"\n\t}\n}\n\n/**\n * `PaperSettingsSection` コンポーネントへの props。\n */\nexport interface PaperSettingsSectionProps {\n\t/** 用紙設定 */\n\tpaper: Paper;\n\n\t/** 用紙変更時のコールバック */\n\tonPaperChange: (paper: Paper) => void;\n}\n\n// 用紙サイズプリセットの選拡記述定義\nconst PRESET_OPTIONS: { value: PaperSizePreset; label: string }[] = [\n\t{ value: PaperSizePreset.A4, label: \"A4\" },\n\t{ value: PaperSizePreset.A3, label: \"A3\" },\n\t{ value: PaperSizePreset.B5, label: \"B5\" },\n\t{ value: PaperSizePreset.LETTER, label: \"Letter\" },\n\t{ value: PaperSizePreset.LEGAL, label: \"Legal\" },\n\t{ value: PaperSizePreset.CUSTOM, label: \"カスタム\" },\n];\n\n/**\n * `ActionBar` 上に用紙サイズプリセット選択を表示するコンパクトなコントロール。\n *\n * @remarks\n * **Shell** — カスタム選択時は幅・高さ・単位の入力も表示される。\n */\nexport const PaperSettingsSection = ({\n\tpaper,\n\tonPaperChange,\n}: PaperSettingsSectionProps) => {\n\tconst isCustom = paper.size.preset === PaperSizePreset.CUSTOM;\n\tconst isFit = paper.autoHeight === true;\n\tconst isWidthFit = paper.autoWidth === true;\n\n\tconst handlePresetChange = useCallback(\n\t\t(e: React.ChangeEvent<HTMLSelectElement>) => {\n\t\t\tconst preset = e.target.value as PaperSizePreset;\n\t\t\tif (!preset) return;\n\t\t\tonPaperChange({\n\t\t\t\t...paper,\n\t\t\t\tsize: { ...DEFAULT_PAPER_SIZES[preset] },\n\t\t\t});\n\t\t},\n\t\t[paper, onPaperChange],\n\t);\n\n\tconst handleWidthValueChange = useCallback(\n\t\t({ target }: { target: { value: string } }) => {\n\t\t\tconst val = Number(target.value);\n\t\t\tif (!val || val <= 0) return;\n\t\t\tconst minMm =\n\t\t\t\ttoMm.fromDim(paper.margin.left) + toMm.fromDim(paper.margin.right);\n\t\t\tconst minVal = mmToUnit(minMm, paper.size.width.unit);\n\t\t\tif (val < minVal) return;\n\t\t\tconst newSize: PaperSize = {\n\t\t\t\t...paper.size,\n\t\t\t\twidth: { ...paper.size.width, value: val },\n\t\t\t};\n\t\t\tonPaperChange({ ...paper, size: newSize });\n\t\t},\n\t\t[paper, onPaperChange],\n\t);\n\n\tconst handleHeightValueChange = useCallback(\n\t\t({ target }: { target: { value: string } }) => {\n\t\t\tconst val = Number(target.value);\n\t\t\tif (!val || val <= 0) return;\n\t\t\tconst minMm =\n\t\t\t\ttoMm.fromDim(paper.margin.top) + toMm.fromDim(paper.margin.bottom);\n\t\t\tconst minVal = mmToUnit(minMm, paper.size.height.unit);\n\t\t\tif (val < minVal) return;\n\t\t\tconst newSize: PaperSize = {\n\t\t\t\t...paper.size,\n\t\t\t\theight: { ...paper.size.height, value: val },\n\t\t\t};\n\t\t\tonPaperChange({ ...paper, size: newSize });\n\t\t},\n\t\t[paper, onPaperChange],\n\t);\n\n\tconst handleUnitChange = useCallback(\n\t\t({ target }: { target: { value: string } }) => {\n\t\t\tconst unit = target.value as PaperUnit;\n\t\t\tconst newSize: PaperSize = {\n\t\t\t\t...paper.size,\n\t\t\t\twidth: { ...paper.size.width, unit },\n\t\t\t\theight: { ...paper.size.height, unit },\n\t\t\t};\n\t\t\tonPaperChange({ ...paper, size: newSize });\n\t\t},\n\t\t[paper, onPaperChange],\n\t);\n\n\tconst handleHeightModeToggle = useCallback(() => {\n\t\tonPaperChange({ ...paper, autoHeight: isFit ? undefined : true });\n\t}, [paper, isFit, onPaperChange]);\n\n\tconst handleWidthModeToggle = useCallback(() => {\n\t\tonPaperChange({ ...paper, autoWidth: isWidthFit ? undefined : true });\n\t}, [paper, isWidthFit, onPaperChange]);\n\n\treturn (\n\t\t<>\n\t\t\t<span className={styles.sectionLabel}>用紙</span>\n\t\t\t<select\n\t\t\t\tclassName={styles.select}\n\t\t\t\tvalue={paper.size.preset}\n\t\t\t\tonChange={handlePresetChange}\n\t\t\t\taria-label=\"用紙サイズ\"\n\t\t\t\ttitle=\"用紙サイズ\"\n\t\t\t>\n\t\t\t\t{PRESET_OPTIONS.map((opt) => (\n\t\t\t\t\t<option key={opt.value} value={opt.value}>\n\t\t\t\t\t\t{opt.label}\n\t\t\t\t\t</option>\n\t\t\t\t))}\n\t\t\t</select>\n\t\t\t<div className={styles.heightModeSwitch}>\n\t\t\t\t<span\n\t\t\t\t\tclassName={`${styles.switchLabel} ${isFit ? \"\" : styles.switchLabelActive}`}\n\t\t\t\t>\n\t\t\t\t\t固定\n\t\t\t\t</span>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\trole=\"switch\"\n\t\t\t\t\taria-checked={isFit}\n\t\t\t\t\taria-label=\"高さモード\"\n\t\t\t\t\tclassName={styles.toggle}\n\t\t\t\t\tonClick={handleHeightModeToggle}\n\t\t\t\t>\n\t\t\t\t\t<span className={styles.thumb} />\n\t\t\t\t</button>\n\t\t\t\t<span\n\t\t\t\t\tclassName={`${styles.switchLabel} ${isFit ? styles.switchLabelActive : \"\"}`}\n\t\t\t\t>\n\t\t\t\t\t自動\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t\t<div className={styles.heightModeSwitch}>\n\t\t\t\t<span\n\t\t\t\t\tclassName={`${styles.switchLabel} ${isWidthFit ? \"\" : styles.switchLabelActive}`}\n\t\t\t\t>\n\t\t\t\t\t幅固定\n\t\t\t\t</span>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\trole=\"switch\"\n\t\t\t\t\taria-checked={isWidthFit}\n\t\t\t\t\taria-label=\"幅モード\"\n\t\t\t\t\tclassName={styles.toggle}\n\t\t\t\t\tonClick={handleWidthModeToggle}\n\t\t\t\t>\n\t\t\t\t\t<span className={styles.thumb} />\n\t\t\t\t</button>\n\t\t\t\t<span\n\t\t\t\t\tclassName={`${styles.switchLabel} ${isWidthFit ? styles.switchLabelActive : \"\"}`}\n\t\t\t\t>\n\t\t\t\t\t幅自動\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t\t{isCustom && (\n\t\t\t\t<>\n\t\t\t\t\t<input\n\t\t\t\t\t\ttype=\"number\"\n\t\t\t\t\t\tclassName={styles.numberInput}\n\t\t\t\t\t\tvalue={paper.size.width.value}\n\t\t\t\t\t\tmin={mmToUnit(\n\t\t\t\t\t\t\ttoMm.fromDim(paper.margin.left) +\n\t\t\t\t\t\t\t\ttoMm.fromDim(paper.margin.right),\n\t\t\t\t\t\t\tpaper.size.width.unit,\n\t\t\t\t\t\t)}\n\t\t\t\t\t\tmax={9999}\n\t\t\t\t\t\tstep={0.5}\n\t\t\t\t\t\tonChange={handleWidthValueChange}\n\t\t\t\t\t\taria-label=\"用紙幅\"\n\t\t\t\t\t\ttitle=\"幅\"\n\t\t\t\t\t/>\n\t\t\t\t\t<span className={styles.sectionLabel}>×</span>\n\t\t\t\t\t<input\n\t\t\t\t\t\ttype=\"number\"\n\t\t\t\t\t\tclassName={styles.numberInput}\n\t\t\t\t\t\tvalue={paper.size.height.value}\n\t\t\t\t\t\tmin={mmToUnit(\n\t\t\t\t\t\t\ttoMm.fromDim(paper.margin.top) +\n\t\t\t\t\t\t\t\ttoMm.fromDim(paper.margin.bottom),\n\t\t\t\t\t\t\tpaper.size.height.unit,\n\t\t\t\t\t\t)}\n\t\t\t\t\t\tmax={9999}\n\t\t\t\t\t\tstep={0.5}\n\t\t\t\t\t\tonChange={handleHeightValueChange}\n\t\t\t\t\t\taria-label=\"用紙高さ\"\n\t\t\t\t\t\ttitle=\"高さ\"\n\t\t\t\t\t/>\n\t\t\t\t\t<select\n\t\t\t\t\t\tclassName={styles.select}\n\t\t\t\t\t\tvalue={paper.size.width.unit}\n\t\t\t\t\t\tonChange={handleUnitChange}\n\t\t\t\t\t\taria-label=\"用紙単位\"\n\t\t\t\t\t\ttitle=\"単位\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<option value=\"mm\">mm</option>\n\t\t\t\t\t\t<option value=\"cm\">cm</option>\n\t\t\t\t\t\t<option value=\"inch\">inch</option>\n\t\t\t\t\t</select>\n\t\t\t\t</>\n\t\t\t)}\n\t\t</>\n\t);\n};\n\nPaperSettingsSection.displayName = \"PaperSettingsSection\";\n","/**\n * ネストされたオブジェクトパスへの値のセット/削除(不変)。\n *\n * 値が `null` または `undefined` の場合はそのキーを削除する。\n *\n * 削除の結果、親オブジェクトが空になった場合も親キーを再帰的に削除する。\n */\nexport function setNestedValue<T>(obj: T, path: string, value: unknown): T {\n\tconst keys = path.split(\".\");\n\tconst update = (\n\t\tcurrent: Record<string, unknown>,\n\t\tdepth: number,\n\t): Record<string, unknown> => {\n\t\tconst key = keys[depth] as string;\n\t\tif (depth === keys.length - 1) {\n\t\t\tif (value === undefined || value === null) {\n\t\t\t\tconst { [key]: _, ...rest } = current;\n\t\t\t\treturn rest;\n\t\t\t}\n\t\t\treturn { ...current, [key]: value };\n\t\t}\n\t\tconst nextValue =\n\t\t\t(current?.[key] as Record<string, unknown> | undefined) ?? {};\n\t\tconst updated = update(nextValue, depth + 1);\n\t\tif (Object.keys(updated).length === 0) {\n\t\t\tconst { [key]: _, ...rest } = current;\n\t\t\treturn rest;\n\t\t}\n\t\treturn { ...current, [key]: updated };\n\t};\n\treturn update(obj as Record<string, unknown>, 0) as T;\n}\n","import type { Block, Value } from \"../../../types\";\n\n/**\n * 選択中の複数ブロックから共通の値を取得する。\n *\n * ブロック間で値が異なる場合は `undefined` を返す。\n *\n * @param blocks - 選択中のブロック配列\n * @param path - ドット区切りのプロパティパス(例: `\"values.text\"`)\n * @returns 全ブロックが同一値を持つ場合はその値、異なる場合は `undefined`\n *\n * @remarks\n * `BlockPropertyPanel` 内のプラグインパネルで共通値を表示する際に使用する。\n */\nexport function getCommonValue<T = Value>(\n\tblocks: Block[],\n\tpath: string,\n): T | undefined {\n\tif (blocks.length === 0) return undefined;\n\n\tconst getValueByPath = (obj: unknown, keys: string[]): unknown => {\n\t\tlet current: unknown = obj;\n\t\tfor (const key of keys) {\n\t\t\tif (current == null) return undefined;\n\t\t\tif (typeof current !== \"object\" || Array.isArray(current))\n\t\t\t\treturn undefined;\n\t\t\tcurrent = (current as Record<string, unknown>)[key];\n\t\t}\n\t\treturn current;\n\t};\n\n\tconst keys = path.split(\".\");\n\tconst firstValue = getValueByPath(blocks[0], keys);\n\tconst allSame = blocks.every(\n\t\t(block) => getValueByPath(block, keys) === firstValue,\n\t);\n\n\treturn allSame ? (firstValue as T) : undefined;\n}\n","import { useMemo } from \"react\";\n\nimport { setNestedValue } from \"../../../../../canvas/layers/BlockLayer/utils/setNestedValue\";\nimport { LineType } from \"../../../../../types/line\";\nimport { BORDER_UNITS } from \"../../../../../types/unit\";\nimport { ColorPicker, DimensionInput, Dropdown } from \"../../../../ui\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"../../../../ui/Tabs\";\nimport { getCommonValue } from \"../../../utils/getCommonValue\";\n\nimport type React from \"react\";\nimport type { BorderEdge } from \"../../../../../canvas/layers/BlockLayer/hooks/useBlockStyle\";\nimport type { Block, BorderUnit, Dimension } from \"../../../../../types\";\nimport type { BorderStyle, LineStyle } from \"../../../../../types/line\";\n\n/**\n * `BackgroundBorderPanel` コンポーネントへの props。\n */\nexport interface BackgroundBorderPanelProps {\n\t/** 選択中のブロックの配列 */\n\tselectedBlocks: Block[];\n\n\t/** ブロック更新時のコールバック */\n\tonUpdateBlocks: (updates: Record<string, Partial<Block>>) => void;\n}\n\n// SVGプレビュー用: BorderStyle → CSS border properties\nfunction getPreviewSvgLines(\n\tborderStyle: BorderStyle | undefined,\n\tw: number,\n\th: number,\n): React.ReactElement[] {\n\tif (!borderStyle) return [];\n\tconst lines: React.ReactElement[] = [];\n\n\tconst edgeLines: {\n\t\tkey: string;\n\t\tstyle: LineStyle | undefined;\n\t\tx1: number;\n\t\ty1: number;\n\t\tx2: number;\n\t\ty2: number;\n\t}[] = [\n\t\t{ key: \"top\", style: borderStyle.top, x1: 0, y1: 0, x2: w, y2: 0 },\n\t\t{ key: \"right\", style: borderStyle.right, x1: w, y1: 0, x2: w, y2: h },\n\t\t{\n\t\t\tkey: \"bottom\",\n\t\t\tstyle: borderStyle.bottom,\n\t\t\tx1: 0,\n\t\t\ty1: h,\n\t\t\tx2: w,\n\t\t\ty2: h,\n\t\t},\n\t\t{ key: \"left\", style: borderStyle.left, x1: 0, y1: 0, x2: 0, y2: h },\n\t];\n\n\tfor (const { key, style, x1, y1, x2, y2 } of edgeLines) {\n\t\tif (!style?.type) continue;\n\t\tconst strokeW =\n\t\t\tstyle.width?.unit === \"px\"\n\t\t\t\t? style.width.value\n\t\t\t\t: (style.width?.value ?? 1);\n\t\tconst dasharray =\n\t\t\tstyle.type === LineType.DASHED\n\t\t\t\t? \"8 4\"\n\t\t\t\t: style.type === LineType.DOTTED\n\t\t\t\t\t? \"2 4\"\n\t\t\t\t\t: undefined;\n\t\tlines.push(\n\t\t\t<line\n\t\t\t\tkey={key}\n\t\t\t\tx1={x1}\n\t\t\t\ty1={y1}\n\t\t\t\tx2={x2}\n\t\t\t\ty2={y2}\n\t\t\t\tstroke={style.color ?? \"#000\"}\n\t\t\t\tstrokeWidth={strokeW}\n\t\t\t\tstrokeDasharray={dasharray}\n\t\t\t/>,\n\t\t);\n\t}\n\n\treturn lines;\n}\n\n// \"all\" エッジの値を top/right/bottom/left に展開して BorderStyle を構築\nfunction resolveBorderStyle(style: Block[\"style\"]): BorderStyle | undefined {\n\tconst border = style?.border;\n\tif (!border) return undefined;\n\n\tconst resolveEdge = (\n\t\tedgeKey: \"top\" | \"right\" | \"bottom\" | \"left\",\n\t): LineStyle | undefined => {\n\t\tconst edgeVal = border[edgeKey] ?? border.all;\n\t\tif (!edgeVal?.type) return undefined;\n\t\treturn edgeVal;\n\t};\n\n\tconst result: BorderStyle = {\n\t\ttop: resolveEdge(\"top\"),\n\t\tright: resolveEdge(\"right\"),\n\t\tbottom: resolveEdge(\"bottom\"),\n\t\tleft: resolveEdge(\"left\"),\n\t};\n\n\tif (!result.top && !result.right && !result.bottom && !result.left) {\n\t\treturn undefined;\n\t}\n\treturn result;\n}\n\n/**\n * ブロックの背景色と枠線を設定するパネル。\n *\n * @remarks\n * **Shell** — タブ切り替えで背景色と枠線を個別に設定できる。\n */\nexport const BackgroundBorderPanel: React.FC<BackgroundBorderPanelProps> = ({\n\tselectedBlocks,\n\tonUpdateBlocks,\n}) => {\n\tconst handleBgColor = (color: string | undefined) => {\n\t\tconst updates: Record<string, Partial<Block>> = {};\n\t\tfor (const b of selectedBlocks) {\n\t\t\tupdates[b.id] = { style: { ...b.style, backgroundColor: color } };\n\t\t}\n\t\tonUpdateBlocks(updates);\n\t};\n\n\tconst handleBorderChange = (\n\t\tedge: BorderEdge,\n\t\tprop: \"type\" | \"width\" | \"color\",\n\t\tval: Dimension<BorderUnit> | string | null | undefined,\n\t) => {\n\t\tconst updates: Record<string, Partial<Block>> = {};\n\t\t// \"all\" の場合は4辺すべてに適用(JSON形式を top/right/bottom/left に統一)\n\t\tconst edges: ReadonlyArray<\"top\" | \"right\" | \"bottom\" | \"left\"> =\n\t\t\tedge === \"all\" ? [\"top\", \"right\", \"bottom\", \"left\"] : [edge];\n\n\t\tfor (const b of selectedBlocks) {\n\t\t\tlet newStyle: Record<string, unknown> = (b.style || {}) as Record<\n\t\t\t\tstring,\n\t\t\t\tunknown\n\t\t\t>;\n\n\t\t\tfor (const e of edges) {\n\t\t\t\tnewStyle = setNestedValue(newStyle, `border.${e}.${prop}`, val);\n\n\t\t\t\tif (prop === \"type\" && (val === undefined || val === null)) {\n\t\t\t\t\tnewStyle = setNestedValue(newStyle, `border.${e}.width`, null);\n\t\t\t\t\tnewStyle = setNestedValue(newStyle, `border.${e}.color`, null);\n\t\t\t\t}\n\n\t\t\t\tif (prop === \"type\" && val !== undefined && val !== null) {\n\t\t\t\t\tconst currentBorder = (\n\t\t\t\t\t\tb.style as { border?: Record<string, unknown> }\n\t\t\t\t\t)?.border as\n\t\t\t\t\t\t| Record<string, { width?: unknown; color?: unknown }>\n\t\t\t\t\t\t| undefined;\n\t\t\t\t\tconst edgeStyle = currentBorder?.[e];\n\t\t\t\t\tif (!edgeStyle?.width) {\n\t\t\t\t\t\tnewStyle = setNestedValue(newStyle, `border.${e}.width`, {\n\t\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t\t\tunit: \"px\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tif (!edgeStyle?.color) {\n\t\t\t\t\t\tnewStyle = setNestedValue(newStyle, `border.${e}.color`, \"#000000\");\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (prop === \"color\" && val !== undefined && val !== null) {\n\t\t\t\t\tconst currentBorder = (\n\t\t\t\t\t\tb.style as { border?: Record<string, unknown> }\n\t\t\t\t\t)?.border as\n\t\t\t\t\t\t| Record<string, { type?: unknown; width?: unknown }>\n\t\t\t\t\t\t| undefined;\n\t\t\t\t\tconst edgeStyle = currentBorder?.[e];\n\t\t\t\t\tif (!edgeStyle?.type) {\n\t\t\t\t\t\tnewStyle = setNestedValue(\n\t\t\t\t\t\t\tnewStyle,\n\t\t\t\t\t\t\t`border.${e}.type`,\n\t\t\t\t\t\t\tLineType.SOLID,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tif (!edgeStyle?.width) {\n\t\t\t\t\t\tnewStyle = setNestedValue(newStyle, `border.${e}.width`, {\n\t\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t\t\tunit: \"px\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (prop === \"width\" && val !== undefined && val !== null) {\n\t\t\t\t\tconst currentBorder = (\n\t\t\t\t\t\tb.style as { border?: Record<string, unknown> }\n\t\t\t\t\t)?.border as\n\t\t\t\t\t\t| Record<string, { type?: unknown; color?: unknown }>\n\t\t\t\t\t\t| undefined;\n\t\t\t\t\tconst edgeStyle = currentBorder?.[e];\n\t\t\t\t\tif (!edgeStyle?.type) {\n\t\t\t\t\t\tnewStyle = setNestedValue(\n\t\t\t\t\t\t\tnewStyle,\n\t\t\t\t\t\t\t`border.${e}.type`,\n\t\t\t\t\t\t\tLineType.SOLID,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tif (!edgeStyle?.color) {\n\t\t\t\t\t\tnewStyle = setNestedValue(newStyle, `border.${e}.color`, \"#000000\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tupdates[b.id] = { style: newStyle };\n\t\t}\n\n\t\tonUpdateBlocks(updates);\n\t};\n\n\tconst previewBgColor = getCommonValue(\n\t\tselectedBlocks,\n\t\t\"style.backgroundColor\",\n\t) as string | undefined;\n\n\tconst previewBorderStyle = useMemo(() => {\n\t\tif (selectedBlocks.length !== 1) return undefined;\n\t\tconst firstBlock = selectedBlocks[0];\n\t\treturn resolveBorderStyle(firstBlock?.style);\n\t}, [selectedBlocks]);\n\n\tconst previewSvgLines = useMemo(\n\t\t() => getPreviewSvgLines(previewBorderStyle, 80, 80),\n\t\t[previewBorderStyle],\n\t);\n\n\tif (selectedBlocks.length === 0) return null;\n\n\t// \"all\" タブは top を代表値として読み取り(書き込みは4辺に展開済み)\n\tconst readEdge = (edge: BorderEdge) => (edge === \"all\" ? \"top\" : edge);\n\n\tconst renderInputs = (edge: BorderEdge) => (\n\t\t<div style={{ display: \"flex\", flexDirection: \"column\", gap: \"4px\" }}>\n\t\t\t<Dropdown\n\t\t\t\tvalue={getCommonValue(\n\t\t\t\t\tselectedBlocks,\n\t\t\t\t\t`style.border.${readEdge(edge)}.type`,\n\t\t\t\t)}\n\t\t\t\tonChange={(val) => handleBorderChange(edge, \"type\", val ?? null)}\n\t\t\t\tplaceholder=\"スタイル\"\n\t\t\t\theight={24}\n\t\t\t\toptions={[\n\t\t\t\t\t{ label: \"\", value: null },\n\t\t\t\t\t{ label: \"実線\", value: LineType.SOLID },\n\t\t\t\t\t{ label: \"破線\", value: LineType.DASHED },\n\t\t\t\t\t{ label: \"点線\", value: LineType.DOTTED },\n\t\t\t\t]}\n\t\t\t/>\n\t\t\t<DimensionInput\n\t\t\t\tvalue={\n\t\t\t\t\tgetCommonValue(\n\t\t\t\t\t\tselectedBlocks,\n\t\t\t\t\t\t`style.border.${readEdge(edge)}.width`,\n\t\t\t\t\t) as\n\t\t\t\t\t\t| { value: number; unit: (typeof BORDER_UNITS)[number] }\n\t\t\t\t\t\t| undefined\n\t\t\t\t}\n\t\t\t\tonChange={(val) => handleBorderChange(edge, \"width\", val)}\n\t\t\t\tplaceholder=\"太さ\"\n\t\t\t\theight={24}\n\t\t\t\tallowedUnits={BORDER_UNITS}\n\t\t\t\tmin={1}\n\t\t\t/>\n\t\t\t<ColorPicker\n\t\t\t\tvalue={\n\t\t\t\t\t(getCommonValue(\n\t\t\t\t\t\tselectedBlocks,\n\t\t\t\t\t\t`style.border.${readEdge(edge)}.color`,\n\t\t\t\t\t) as string | undefined) ?? undefined\n\t\t\t\t}\n\t\t\t\tonChange={(v: string | undefined) =>\n\t\t\t\t\thandleBorderChange(edge, \"color\", v ?? null)\n\t\t\t\t}\n\t\t\t\tshowTextInput={true}\n\t\t\t\tallowUndefined\n\t\t\t\theight={24}\n\t\t\t/>\n\t\t</div>\n\t);\n\n\tconst triggerStyle: React.CSSProperties = {\n\t\tflex: 1,\n\t\tpadding: \"0 2px\",\n\t\tfontSize: \"12px\",\n\t\tminWidth: 0,\n\t\twhiteSpace: \"nowrap\",\n\t\toverflow: \"hidden\",\n\t\ttextOverflow: \"ellipsis\",\n\t};\n\n\treturn (\n\t\t<div\n\t\t\tstyle={{\n\t\t\t\tdisplay: \"grid\",\n\t\t\t\tgridTemplateColumns: \"88px 1fr\",\n\t\t\t\tgridTemplateRows: \"auto auto\",\n\t\t\t\tgap: \"4px\",\n\t\t\t\tpadding: \"4px\",\n\t\t\t}}\n\t\t>\n\t\t\t{/* プレビュー */}\n\t\t\t<div\n\t\t\t\tstyle={{\n\t\t\t\t\tgridRow: \"1 / 3\",\n\t\t\t\t\tdisplay: \"flex\",\n\t\t\t\t\talignItems: \"center\",\n\t\t\t\t\tjustifyContent: \"center\",\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<div\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\twidth: \"80px\",\n\t\t\t\t\t\theight: \"80px\",\n\t\t\t\t\t\tborderRadius: \"0.25rem\",\n\t\t\t\t\t\tdisplay: \"flex\",\n\t\t\t\t\t\talignItems: \"center\",\n\t\t\t\t\t\tjustifyContent: \"center\",\n\t\t\t\t\t\tposition: \"relative\",\n\t\t\t\t\t\tbackgroundColor: previewBgColor ?? \"transparent\",\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<svg\n\t\t\t\t\t\twidth=\"80\"\n\t\t\t\t\t\theight=\"80\"\n\t\t\t\t\t\tviewBox=\"0 0 80 80\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\t\topacity: 0.3,\n\t\t\t\t\t\t\tpointerEvents: \"none\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<title>枠線ガイド</title>\n\t\t\t\t\t\t<line\n\t\t\t\t\t\t\tx1=\"40\"\n\t\t\t\t\t\t\ty1=\"0\"\n\t\t\t\t\t\t\tx2=\"40\"\n\t\t\t\t\t\t\ty2=\"80\"\n\t\t\t\t\t\t\tstroke=\"#9ca3af\"\n\t\t\t\t\t\t\tstrokeWidth=\"1\"\n\t\t\t\t\t\t\tstrokeDasharray=\"4 2\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<line\n\t\t\t\t\t\t\tx1=\"0\"\n\t\t\t\t\t\t\ty1=\"40\"\n\t\t\t\t\t\t\tx2=\"80\"\n\t\t\t\t\t\t\ty2=\"40\"\n\t\t\t\t\t\t\tstroke=\"#9ca3af\"\n\t\t\t\t\t\t\tstrokeWidth=\"1\"\n\t\t\t\t\t\t\tstrokeDasharray=\"4 2\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</svg>\n\n\t\t\t\t\t{previewSvgLines.length > 0 ? (\n\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\twidth=\"80\"\n\t\t\t\t\t\t\theight=\"80\"\n\t\t\t\t\t\t\tviewBox=\"0 0 80 80\"\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\t\t\tpointerEvents: \"none\",\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<title>枠線プレビュー</title>\n\t\t\t\t\t\t\t{previewSvgLines}\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\twidth=\"80\"\n\t\t\t\t\t\t\theight=\"80\"\n\t\t\t\t\t\t\tviewBox=\"0 0 80 80\"\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\t\t\topacity: 0.3,\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<title>枠線未設定</title>\n\t\t\t\t\t\t\t<rect\n\t\t\t\t\t\t\t\tx=\"0\"\n\t\t\t\t\t\t\t\ty=\"0\"\n\t\t\t\t\t\t\t\twidth=\"80\"\n\t\t\t\t\t\t\t\theight=\"80\"\n\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\tstroke=\"#9ca3af\"\n\t\t\t\t\t\t\t\tstrokeWidth=\"1\"\n\t\t\t\t\t\t\t\tstrokeDasharray=\"4 2\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t{/* 背景色 */}\n\t\t\t<ColorPicker\n\t\t\t\tvalue={previewBgColor}\n\t\t\t\tonChange={(color: string | undefined) => handleBgColor(color)}\n\t\t\t\tshowTextInput={true}\n\t\t\t\tallowUndefined\n\t\t\t/>\n\n\t\t\t{/* 枠線設定 */}\n\t\t\t<div style={{ minWidth: 0 }}>\n\t\t\t\t<Tabs defaultValue=\"all\" variant=\"segmented\">\n\t\t\t\t\t<div style={{ width: \"100%\" }}>\n\t\t\t\t\t\t<TabsList style={{ width: \"100%\", display: \"flex\" }}>\n\t\t\t\t\t\t\t<TabsTrigger value=\"all\" height={24} style={triggerStyle}>\n\t\t\t\t\t\t\t\t共通\n\t\t\t\t\t\t\t</TabsTrigger>\n\t\t\t\t\t\t\t<TabsTrigger value=\"top\" height={24} style={triggerStyle}>\n\t\t\t\t\t\t\t\t上\n\t\t\t\t\t\t\t</TabsTrigger>\n\t\t\t\t\t\t\t<TabsTrigger value=\"bottom\" height={24} style={triggerStyle}>\n\t\t\t\t\t\t\t\t下\n\t\t\t\t\t\t\t</TabsTrigger>\n\t\t\t\t\t\t\t<TabsTrigger value=\"left\" height={24} style={triggerStyle}>\n\t\t\t\t\t\t\t\t左\n\t\t\t\t\t\t\t</TabsTrigger>\n\t\t\t\t\t\t\t<TabsTrigger value=\"right\" height={24} style={triggerStyle}>\n\t\t\t\t\t\t\t\t右\n\t\t\t\t\t\t\t</TabsTrigger>\n\t\t\t\t\t\t</TabsList>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div style={{ marginTop: \"4px\" }}>\n\t\t\t\t\t\t<TabsContent value=\"all\">{renderInputs(\"all\")}</TabsContent>\n\t\t\t\t\t\t<TabsContent value=\"top\">{renderInputs(\"top\")}</TabsContent>\n\t\t\t\t\t\t<TabsContent value=\"bottom\">{renderInputs(\"bottom\")}</TabsContent>\n\t\t\t\t\t\t<TabsContent value=\"left\">{renderInputs(\"left\")}</TabsContent>\n\t\t\t\t\t\t<TabsContent value=\"right\">{renderInputs(\"right\")}</TabsContent>\n\t\t\t\t\t</div>\n\t\t\t\t</Tabs>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nBackgroundBorderPanel.displayName = \"BackgroundBorderPanel\";\n","import { layoutPanelKey } from \"../../../../../contexts/history/mergeKeys\";\nimport { NumberInput } from \"../../../../ui\";\nimport { getCommonValue } from \"../../../utils/getCommonValue\";\nimport styles from \"./LayoutPanel.module.css\";\n\nimport type React from \"react\";\nimport type { Block } from \"../../../../../types/block\";\n\n/**\n * `LayoutPanel` コンポーネントへの props。\n */\nexport interface LayoutPanelProps {\n\t/** 選択中のブロックの配列 */\n\tselectedBlocks: Block[];\n\n\t/** ブロック更新時のコールバック */\n\tonUpdateBlocks: (\n\t\tupdates: Record<string, Partial<Block>>,\n\t\toptions?: { mergeKey?: string },\n\t) => void;\n\n\t/** グリッドサイズ(最大入力値の制限に使用) */\n\tgridSize?: { cols: number; rows: number };\n}\n\n/**\n * ブロックの位置と大きさを設定するパネル。\n *\n * @remarks\n * **Shell** — 複数選択時はバウンディングボックスの最小座標を基準に相対変更する。\n */\nexport const LayoutPanel: React.FC<LayoutPanelProps> = ({\n\tselectedBlocks,\n\tonUpdateBlocks,\n\tgridSize,\n}) => {\n\tif (selectedBlocks.length === 0) return null;\n\n\tconst isMultipleSelection = selectedBlocks.length > 1;\n\n\tconst minX = isMultipleSelection\n\t\t? Math.min(...selectedBlocks.map((b) => b.layout.x))\n\t\t: undefined;\n\tconst minY = isMultipleSelection\n\t\t? Math.min(...selectedBlocks.map((b) => b.layout.y))\n\t\t: undefined;\n\n\tconst handleChange = (\n\t\tkey: \"x\" | \"y\" | \"w\" | \"h\",\n\t\tval: number | undefined,\n\t) => {\n\t\tif (val === undefined) return;\n\n\t\tconst updates: Record<string, Partial<Block>> = {};\n\n\t\tif (isMultipleSelection && (key === \"x\" || key === \"y\")) {\n\t\t\tconst currentMin = key === \"x\" ? minX : minY;\n\t\t\tif (currentMin === undefined) return;\n\n\t\t\tconst maxX = Math.max(\n\t\t\t\t...selectedBlocks.map((b) => b.layout.x + b.layout.w),\n\t\t\t);\n\t\t\tconst maxY = Math.max(\n\t\t\t\t...selectedBlocks.map((b) => b.layout.y + b.layout.h),\n\t\t\t);\n\t\t\tconst boundingW = maxX - (minX ?? 0);\n\t\t\tconst boundingH = maxY - (minY ?? 0);\n\n\t\t\tlet clampedVal = val;\n\t\t\tif (key === \"x\" && gridSize) {\n\t\t\t\tclampedVal = Math.max(0, Math.min(val, gridSize.cols - boundingW));\n\t\t\t} else if (key === \"y\" && gridSize) {\n\t\t\t\tclampedVal = Math.max(0, Math.min(val, gridSize.rows - boundingH));\n\t\t\t} else {\n\t\t\t\tclampedVal = Math.max(0, val);\n\t\t\t}\n\n\t\t\tconst offset = clampedVal - currentMin;\n\t\t\tselectedBlocks.forEach((b) => {\n\t\t\t\tconst newValue = b.layout[key] + offset;\n\t\t\t\tupdates[b.id] = { layout: { ...b.layout, [key]: newValue } };\n\t\t\t});\n\t\t} else {\n\t\t\tselectedBlocks.forEach((b) => {\n\t\t\t\tlet clampedVal = val;\n\t\t\t\tif (key === \"x\" && gridSize) {\n\t\t\t\t\tclampedVal = Math.max(0, Math.min(val, gridSize.cols - b.layout.w));\n\t\t\t\t} else if (key === \"y\" && gridSize) {\n\t\t\t\t\tclampedVal = Math.max(0, Math.min(val, gridSize.rows - b.layout.h));\n\t\t\t\t} else if (key === \"w\" && gridSize) {\n\t\t\t\t\tconst maxW = gridSize.cols - b.layout.x;\n\t\t\t\t\tclampedVal = Math.max(1, Math.min(val, maxW));\n\t\t\t\t} else if (key === \"h\" && gridSize) {\n\t\t\t\t\tconst maxH = gridSize.rows - b.layout.y;\n\t\t\t\t\tclampedVal = Math.max(1, Math.min(val, maxH));\n\t\t\t\t} else if (key === \"w\" || key === \"h\") {\n\t\t\t\t\tclampedVal = Math.max(1, val);\n\t\t\t\t} else {\n\t\t\t\t\tclampedVal = Math.max(0, val);\n\t\t\t\t}\n\t\t\t\tupdates[b.id] = { layout: { ...b.layout, [key]: clampedVal } };\n\t\t\t});\n\t\t}\n\t\tonUpdateBlocks(updates, {\n\t\t\tmergeKey: layoutPanelKey(\n\t\t\t\tkey as \"x\" | \"y\" | \"w\" | \"h\",\n\t\t\t\tselectedBlocks.map((b) => b.id),\n\t\t\t),\n\t\t});\n\t};\n\n\treturn (\n\t\t<div className={styles.container}>\n\t\t\t<div className={styles.grid}>\n\t\t\t\t{/* X */}\n\t\t\t\t<div className={styles.field}>\n\t\t\t\t\t<span className={styles.label}>X</span>\n\t\t\t\t\t<div className={styles.inputWrapper}>\n\t\t\t\t\t\t<NumberInput\n\t\t\t\t\t\t\tvalue={\n\t\t\t\t\t\t\t\tisMultipleSelection\n\t\t\t\t\t\t\t\t\t? minX\n\t\t\t\t\t\t\t\t\t: getCommonValue(selectedBlocks, \"layout.x\")\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tonChange={(v) => handleChange(\"x\", v)}\n\t\t\t\t\t\t\tmin={0}\n\t\t\t\t\t\t\tmax={gridSize ? gridSize.cols - 1 : undefined}\n\t\t\t\t\t\t\tinteger\n\t\t\t\t\t\t\theight={22}\n\t\t\t\t\t\t\tplaceholder=\"-\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t{/* Y */}\n\t\t\t\t<div className={styles.field}>\n\t\t\t\t\t<span className={styles.label}>Y</span>\n\t\t\t\t\t<div className={styles.inputWrapper}>\n\t\t\t\t\t\t<NumberInput\n\t\t\t\t\t\t\tvalue={\n\t\t\t\t\t\t\t\tisMultipleSelection\n\t\t\t\t\t\t\t\t\t? minY\n\t\t\t\t\t\t\t\t\t: getCommonValue(selectedBlocks, \"layout.y\")\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tonChange={(v) => handleChange(\"y\", v)}\n\t\t\t\t\t\t\tmin={0}\n\t\t\t\t\t\t\tmax={gridSize ? gridSize.rows - 1 : undefined}\n\t\t\t\t\t\t\tinteger\n\t\t\t\t\t\t\theight={22}\n\t\t\t\t\t\t\tplaceholder=\"-\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t{/* W */}\n\t\t\t\t<div className={styles.field}>\n\t\t\t\t\t<span className={styles.label}>W</span>\n\t\t\t\t\t<div className={styles.inputWrapper}>\n\t\t\t\t\t\t<NumberInput\n\t\t\t\t\t\t\tvalue={getCommonValue(selectedBlocks, \"layout.w\")}\n\t\t\t\t\t\t\tonChange={(v) => handleChange(\"w\", v)}\n\t\t\t\t\t\t\tmin={1}\n\t\t\t\t\t\t\tmax={gridSize ? gridSize.cols : undefined}\n\t\t\t\t\t\t\tinteger\n\t\t\t\t\t\t\theight={22}\n\t\t\t\t\t\t\tplaceholder=\"-\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t{/* H */}\n\t\t\t\t<div className={styles.field}>\n\t\t\t\t\t<span className={styles.label}>H</span>\n\t\t\t\t\t<div className={styles.inputWrapper}>\n\t\t\t\t\t\t<NumberInput\n\t\t\t\t\t\t\tvalue={getCommonValue(selectedBlocks, \"layout.h\")}\n\t\t\t\t\t\t\tonChange={(v) => handleChange(\"h\", v)}\n\t\t\t\t\t\t\tmin={1}\n\t\t\t\t\t\t\tmax={gridSize ? gridSize.rows : undefined}\n\t\t\t\t\t\t\tinteger\n\t\t\t\t\t\t\theight={22}\n\t\t\t\t\t\t\tplaceholder=\"-\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nLayoutPanel.displayName = \"LayoutPanel\";\n","import { memo } from \"react\";\n\nimport styles from \"./AlignmentToggle.module.css\";\n\nimport type React from \"react\";\nimport type { Value } from \"../../../../types\";\n\n/**\n * `AlignmentToggle` コンポーネントの選択肢。\n *\n * @remarks\n * 配置トグルの各ボタンの定義。\n */\nexport interface AlignmentToggleOption {\n\t/** ビット属性値 */\n\tvalue: Value;\n\n\t/** スクリーンリーダー向けラベル */\n\tlabel: string;\n\n\t/** ボタンに表示するアイコン */\n\ticon: React.ReactNode;\n}\n\ninterface AlignmentToggleProps {\n\toptions: AlignmentToggleOption[];\n\tcurrent: Value;\n\tonChange: (value: Value) => void;\n}\n\n/**\n * アライメントをトグル選択する UI コンポーネント。\n *\n * @remarks\n * `PluginPanels` 内で使用される。\n */\nexport const AlignmentToggle = memo(\n\t({ options, current, onChange }: AlignmentToggleProps) => {\n\t\treturn (\n\t\t\t<fieldset className={styles.group}>\n\t\t\t\t{options.map((option) => {\n\t\t\t\t\tconst isActive = current === option.value;\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tkey={String(option.value)}\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclassName={[styles.btn, isActive ? styles.active : \"\"]\n\t\t\t\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t\t\t\t.join(\" \")}\n\t\t\t\t\t\t\ttitle={option.label}\n\t\t\t\t\t\t\taria-label={option.label}\n\t\t\t\t\t\t\taria-pressed={isActive}\n\t\t\t\t\t\t\tonClick={() => onChange(option.value)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{option.icon}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</fieldset>\n\t\t);\n\t},\n);\n\nAlignmentToggle.displayName = \"AlignmentToggle\";\n","import { useCallback, useMemo } from \"react\";\n\nimport {\n\ttype CheckboxStyleConfig,\n\tcheckboxStyleProp,\n} from \"../../../../canvas/blocks/checkbox/props\";\nimport { ClassicCheckboxVisual } from \"../../../../canvas/blocks/checkbox/visual\";\nimport { ColorPicker, DimensionInput } from \"../../../ui\";\n\nimport type React from \"react\";\n\n/**\n * `CheckboxStyleEditor` コンポーネントへの props。\n */\nexport interface CheckboxStyleEditorProps {\n\t/** 現在のチェックボックススタイル設定 */\n\tvalue?: CheckboxStyleConfig;\n\n\t/** 変更時のコールバック */\n\tonChange: (v: CheckboxStyleConfig) => void;\n\n\t/** 読み取り専用モード */\n\treadOnly?: boolean;\n}\n\nconst DEFAULT_STYLE = checkboxStyleProp.defaultProps\n\t.styleConfig as CheckboxStyleConfig;\n\nconst labelStyle: React.CSSProperties = {\n\tfontSize: 11,\n\tcolor: \"#888\",\n\twhiteSpace: \"nowrap\",\n\twidth: 62,\n\tflexShrink: 0,\n};\n\nconst rowStyle: React.CSSProperties = {\n\tdisplay: \"flex\",\n\tgap: 4,\n\talignItems: \"center\",\n};\n\n/**\n * チェックボックスのスタイル(チェック有無・トグル切り替え)を編集する UI。\n *\n * @remarks\n * `PluginPanels` 内で使用される。\n */\nexport const CheckboxStyleEditor: React.FC<CheckboxStyleEditorProps> = ({\n\tvalue,\n\tonChange,\n\treadOnly = false,\n}) => {\n\tconst config = useMemo<CheckboxStyleConfig>(\n\t\t() => ({\n\t\t\tcheckboxSize: value?.checkboxSize ?? DEFAULT_STYLE.checkboxSize,\n\t\t\tborderWidth: value?.borderWidth ?? DEFAULT_STYLE.borderWidth,\n\t\t\tborderColor: value?.borderColor ?? DEFAULT_STYLE.borderColor,\n\t\t\tcheckWidth: value?.checkWidth ?? DEFAULT_STYLE.checkWidth,\n\t\t\tcheckColor: value?.checkColor ?? DEFAULT_STYLE.checkColor,\n\t\t\tbackgroundColor: value?.backgroundColor ?? DEFAULT_STYLE.backgroundColor,\n\t\t\tcheckedBackgroundColor:\n\t\t\t\tvalue?.checkedBackgroundColor ?? DEFAULT_STYLE.checkedBackgroundColor,\n\t\t}),\n\t\t[value],\n\t);\n\n\tconst handleChange = useCallback(\n\t\t(\n\t\t\tprop: keyof CheckboxStyleConfig,\n\t\t\tval: CheckboxStyleConfig[keyof CheckboxStyleConfig],\n\t\t) => {\n\t\t\tonChange({ ...(value ?? {}), [prop]: val });\n\t\t},\n\t\t[value, onChange],\n\t);\n\n\treturn (\n\t\t<div style={{ display: \"flex\", flexDirection: \"column\", gap: 4 }}>\n\t\t\t{/* プレビュー */}\n\t\t\t<div\n\t\t\t\tstyle={{\n\t\t\t\t\tpadding: 8,\n\t\t\t\t\tbackgroundColor: \"#f5f5f5\",\n\t\t\t\t\tborderRadius: 4,\n\t\t\t\t\tdisplay: \"flex\",\n\t\t\t\t\tjustifyContent: \"center\",\n\t\t\t\t\tgap: 24,\n\t\t\t\t\tmarginBottom: 4,\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t{[false, true].map((checked) => (\n\t\t\t\t\t<div key={String(checked)} style={{ textAlign: \"center\" }}>\n\t\t\t\t\t\t<div style={{ fontSize: 11, color: \"#888\", marginBottom: 4 }}>\n\t\t\t\t\t\t\t{checked ? \"チェック\" : \"未チェック\"}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div style={{ width: 24, height: 24 }}>\n\t\t\t\t\t\t\t<ClassicCheckboxVisual checked={checked} styleConfig={config} />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t))}\n\t\t\t</div>\n\n\t\t\t<div style={rowStyle}>\n\t\t\t\t<span style={labelStyle}>サイズ</span>\n\t\t\t\t<div style={{ flex: 1, minWidth: 0 }}>\n\t\t\t\t\t<DimensionInput\n\t\t\t\t\t\tvalue={config.checkboxSize}\n\t\t\t\t\t\tonChange={(v) => handleChange(\"checkboxSize\", v)}\n\t\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t\t\tallowedUnits={[\"px\", \"mm\"]}\n\t\t\t\t\t\tconfig={{ min: 8, max: 64, step: 1, placeholder: \"16px\" }}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div style={rowStyle}>\n\t\t\t\t<span style={labelStyle}>枠線 幅</span>\n\t\t\t\t<div style={{ flex: 1, minWidth: 0 }}>\n\t\t\t\t\t<DimensionInput\n\t\t\t\t\t\tvalue={config.borderWidth}\n\t\t\t\t\t\tonChange={(v) => handleChange(\"borderWidth\", v)}\n\t\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t\t\tallowedUnits={[\"px\", \"%\"]}\n\t\t\t\t\t\tconfig={{ min: 0, step: 0.5, placeholder: \"1px\" }}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div style={rowStyle}>\n\t\t\t\t<span style={labelStyle}>枠線 色</span>\n\t\t\t\t<div style={{ flex: 1, minWidth: 0 }}>\n\t\t\t\t\t<ColorPicker\n\t\t\t\t\t\tvalue={config.borderColor}\n\t\t\t\t\t\tonChange={(v: string | undefined) => handleChange(\"borderColor\", v)}\n\t\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t\t\tshowTextInput={true}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div style={rowStyle}>\n\t\t\t\t<span style={labelStyle}>チェック 幅</span>\n\t\t\t\t<div style={{ flex: 1, minWidth: 0 }}>\n\t\t\t\t\t<DimensionInput\n\t\t\t\t\t\tvalue={config.checkWidth}\n\t\t\t\t\t\tonChange={(v) => handleChange(\"checkWidth\", v)}\n\t\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t\t\tallowedUnits={[\"px\", \"%\"]}\n\t\t\t\t\t\tconfig={{ min: 0, step: 0.5, placeholder: \"3.5px\" }}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div style={rowStyle}>\n\t\t\t\t<span style={labelStyle}>チェック 色</span>\n\t\t\t\t<div style={{ flex: 1, minWidth: 0 }}>\n\t\t\t\t\t<ColorPicker\n\t\t\t\t\t\tvalue={config.checkColor}\n\t\t\t\t\t\tonChange={(v: string | undefined) => handleChange(\"checkColor\", v)}\n\t\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t\t\tshowTextInput={true}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div style={rowStyle}>\n\t\t\t\t<span style={labelStyle}>背景色</span>\n\t\t\t\t<div style={{ flex: 1, minWidth: 0 }}>\n\t\t\t\t\t<ColorPicker\n\t\t\t\t\t\tvalue={config.backgroundColor}\n\t\t\t\t\t\tonChange={(v: string | undefined) =>\n\t\t\t\t\t\t\thandleChange(\"backgroundColor\", v)\n\t\t\t\t\t\t}\n\t\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t\t\tshowTextInput={true}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div style={rowStyle}>\n\t\t\t\t<span style={labelStyle}>チェック時 背景色</span>\n\t\t\t\t<div style={{ flex: 1, minWidth: 0 }}>\n\t\t\t\t\t<ColorPicker\n\t\t\t\t\t\tvalue={config.checkedBackgroundColor}\n\t\t\t\t\t\tonChange={(v: string | undefined) =>\n\t\t\t\t\t\t\thandleChange(\"checkedBackgroundColor\", v)\n\t\t\t\t\t\t}\n\t\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t\t\tshowTextInput={true}\n\t\t\t\t\t\tallowUndefined\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nCheckboxStyleEditor.displayName = \"CheckboxStyleEditor\";\n","import styles from \"./FontDecorationToggle.module.css\";\n\n/**\n * `FontDecorationToggle` コンポーネントの値型。\n *\n * @remarks\n * フォント装飾の各スイッチの状態を表す型。\n */\nexport interface FontDecorationValue {\n\tfontWeight?: boolean;\n\titalic?: boolean;\n\tunderline?: boolean;\n\tlineThrough?: boolean;\n}\n\ninterface ButtonDef {\n\tkey: keyof FontDecorationValue;\n\tlabel: string;\n\ticon: React.ReactNode;\n}\n\nconst BUTTONS: ButtonDef[] = [\n\t{\n\t\tkey: \"fontWeight\",\n\t\tlabel: \"太字\",\n\t\ticon: (\n\t\t\t<span className={styles.iconBold} aria-hidden=\"true\">\n\t\t\t\tB\n\t\t\t</span>\n\t\t),\n\t},\n\t{\n\t\tkey: \"italic\",\n\t\tlabel: \"斜体\",\n\t\ticon: (\n\t\t\t<span className={styles.iconItalic} aria-hidden=\"true\">\n\t\t\t\tI\n\t\t\t</span>\n\t\t),\n\t},\n\t{\n\t\tkey: \"underline\",\n\t\tlabel: \"下線\",\n\t\ticon: (\n\t\t\t<span className={styles.iconUnderline} aria-hidden=\"true\">\n\t\t\t\tU\n\t\t\t</span>\n\t\t),\n\t},\n\t{\n\t\tkey: \"lineThrough\",\n\t\tlabel: \"取り消し線\",\n\t\ticon: (\n\t\t\t<span className={styles.iconLineThrough} aria-hidden=\"true\">\n\t\t\t\tS\n\t\t\t</span>\n\t\t),\n\t},\n];\n\ninterface FontDecorationToggleProps {\n\tvalue?: FontDecorationValue;\n\tonChange: (v: FontDecorationValue) => void;\n\treadOnly?: boolean;\n}\n\n/**\n * フォント装飾(太字・斜体・下線・取り消し線)をトグルする UI。\n *\n * @remarks\n * `PluginPanels` 内で `fontStyle` プロパティの装飾部分に使用される。\n */\nexport const FontDecorationToggle = ({\n\tvalue,\n\tonChange,\n\treadOnly = false,\n}: FontDecorationToggleProps) => {\n\tconst current = (value ?? {}) as FontDecorationValue;\n\n\tconst handleToggle = (key: keyof FontDecorationValue) => {\n\t\tif (readOnly) return;\n\t\tonChange({ ...current, [key]: !current[key] });\n\t};\n\n\treturn (\n\t\t<fieldset className={styles.group}>\n\t\t\t{BUTTONS.map(({ key, label, icon }) => {\n\t\t\t\tconst isActive = !!current[key];\n\t\t\t\treturn (\n\t\t\t\t\t<button\n\t\t\t\t\t\tkey={key}\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclassName={[styles.btn, isActive ? styles.active : \"\"]\n\t\t\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t\t\t.join(\" \")}\n\t\t\t\t\t\ttitle={label}\n\t\t\t\t\t\taria-label={label}\n\t\t\t\t\t\taria-pressed={isActive}\n\t\t\t\t\t\tdisabled={readOnly}\n\t\t\t\t\t\tonClick={() => handleToggle(key)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{icon}\n\t\t\t\t\t</button>\n\t\t\t\t);\n\t\t\t})}\n\t\t</fieldset>\n\t);\n};\n\nFontDecorationToggle.displayName = \"FontDecorationToggle\";\n","import { useCallback } from \"react\";\n\nimport { FONT_UNITS } from \"../../../../types\";\nimport { ColorPicker, DimensionInput, Dropdown } from \"../../../ui\";\nimport { FontDecorationToggle } from \"./FontDecorationToggle\";\nimport styles from \"./FontStyleEditor.module.css\";\n\nimport type { Dimension, FontUnit } from \"../../../../types\";\nimport type { FontDecorationValue } from \"./FontDecorationToggle\";\n\nconst DEFAULT_FONT_FAMILY = [\n\t{ label: \"ゴシック体\", value: \"sans-serif\" },\n\t{ label: \"明朝体\", value: \"serif\" },\n\t{ label: \"等幅\", value: \"monospace\" },\n\t{ label: \"Arial\", value: \"Arial, sans-serif\" },\n\t{ label: \"Times New Roman\", value: \"'Times New Roman', serif\" },\n] as const;\n\n/**\n * `FontStyleEditor` コンポーネントの値型。\n *\n * @remarks\n * フォント内容スタイルの各プロパティをまとめた型。\n */\nexport interface FontStyleEditorValue {\n\tfontFamily?: string;\n\n\t/** フォントサイズ。値と単位を持つ `Dimension<FontUnit>` 形式 */\n\tfontSize?: Dimension<FontUnit>;\n\n\tcolor?: string;\n\tfontWeight?: boolean;\n\titalic?: boolean;\n\tunderline?: boolean;\n\tlineThrough?: boolean;\n}\n\ninterface FontStyleEditorProps {\n\tvalue?: FontStyleEditorValue;\n\tonChange: (v: FontStyleEditorValue) => void;\n\treadOnly?: boolean;\n}\n\n/**\n * フォントサイズ・フォントファミリー・カラーを編集する UI。\n *\n * @remarks\n * `PluginPanels` 内で使用される。\n */\nexport const FontStyleEditor = ({\n\tvalue,\n\tonChange,\n\treadOnly = false,\n}: FontStyleEditorProps) => {\n\tconst current = (value ?? {}) as FontStyleEditorValue;\n\n\tconst handleFontFamily = useCallback(\n\t\t(v: string | undefined) => onChange({ ...current, fontFamily: v }),\n\t\t[current, onChange],\n\t);\n\n\tconst handleFontSize = useCallback(\n\t\t(v: Dimension<FontUnit> | undefined) =>\n\t\t\tonChange({ ...current, fontSize: v }),\n\t\t[current, onChange],\n\t);\n\n\tconst handleColor = useCallback(\n\t\t(v: string | undefined) => onChange({ ...current, color: v }),\n\t\t[current, onChange],\n\t);\n\n\tconst handleDecoration = useCallback(\n\t\t(v: FontDecorationValue) =>\n\t\t\tonChange({\n\t\t\t\t...current,\n\t\t\t\tfontWeight: v.fontWeight,\n\t\t\t\titalic: v.italic,\n\t\t\t\tunderline: v.underline,\n\t\t\t\tlineThrough: v.lineThrough,\n\t\t\t}),\n\t\t[current, onChange],\n\t);\n\n\tconst decorationValue: FontDecorationValue = {\n\t\tfontWeight: current.fontWeight,\n\t\titalic: current.italic,\n\t\tunderline: current.underline,\n\t\tlineThrough: current.lineThrough,\n\t};\n\n\treturn (\n\t\t<div className={styles.root}>\n\t\t\t{/* 行1: フォントドロップダウン + サイズ入力 */}\n\t\t\t<div className={styles.fontFamilyCell}>\n\t\t\t\t<Dropdown\n\t\t\t\t\tvalue={current.fontFamily}\n\t\t\t\t\tonChange={handleFontFamily}\n\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t\toptions={DEFAULT_FONT_FAMILY}\n\t\t\t\t\tplaceholder=\"フォント\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t<div className={styles.fontSizeCell}>\n\t\t\t\t<DimensionInput\n\t\t\t\t\tvalue={current.fontSize}\n\t\t\t\t\tonChange={handleFontSize}\n\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t\tconfig={{ allowedUnits: FONT_UNITS, min: 1, step: 1 }}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t{/* 行2: 文字色 + 文字装飾 */}\n\t\t\t<div className={styles.colorCell}>\n\t\t\t\t<ColorPicker\n\t\t\t\t\tvalue={current.color}\n\t\t\t\t\tonChange={handleColor}\n\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t\tallowUndefined\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t<div className={styles.decorationCell}>\n\t\t\t\t<FontDecorationToggle\n\t\t\t\t\tvalue={decorationValue}\n\t\t\t\t\tonChange={handleDecoration}\n\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nFontStyleEditor.displayName = \"FontStyleEditor\";\n","import { useCallback, useId, useMemo } from \"react\";\n\nimport { Checkbox, ColorPicker } from \"../../../ui\";\n\nimport type React from \"react\";\nimport type {\n\tSelectOption,\n\tSelectOptionsConfig,\n} from \"../../../../canvas/blocks/select/props\";\n\n/**\n * `OptionsEditor` コンポーネントへの props。\n */\nexport interface OptionsEditorProps {\n\t/** 現在の選択肢設定 */\n\tvalue: SelectOptionsConfig;\n\n\t/** 変更時のコールバック */\n\tonChange: (v: SelectOptionsConfig) => void;\n\n\t/** 読み取り専用モード */\n\treadOnly?: boolean;\n}\n\n/**\n * テキスト入力の選択肂を編集する UI。\n *\n * @remarks\n * `PluginPanels` 内で使用される。\n */\nexport const OptionsEditor: React.FC<OptionsEditorProps> = ({\n\tvalue,\n\tonChange,\n\treadOnly = false,\n}) => {\n\tconst options = value.options ?? [];\n\tconst uid = useId();\n\n\tconst duplicateIndices = useMemo(() => {\n\t\tconst seen = new Map<string, number>();\n\t\tconst dupes = new Set<number>();\n\t\tfor (const [i, opt] of options.entries()) {\n\t\t\tif (seen.has(opt.value)) {\n\t\t\t\tdupes.add(seen.get(opt.value) as number);\n\t\t\t\tdupes.add(i);\n\t\t\t} else {\n\t\t\t\tseen.set(opt.value, i);\n\t\t\t}\n\t\t}\n\t\treturn dupes;\n\t}, [options]);\n\n\tconst handleAdd = useCallback(() => {\n\t\tconst newOption: SelectOption = {\n\t\t\tlabel: `選択肢${options.length + 1}`,\n\t\t\tvalue: `option${options.length + 1}`,\n\t\t};\n\t\tonChange({ ...value, options: [...options, newOption] });\n\t}, [options, value, onChange]);\n\n\tconst handleRemove = useCallback(\n\t\t(index: number) => {\n\t\t\tonChange({ ...value, options: options.filter((_, i) => i !== index) });\n\t\t},\n\t\t[options, value, onChange],\n\t);\n\n\tconst handleLabelChange = useCallback(\n\t\t(index: number, newLabel: string) => {\n\t\t\tonChange({\n\t\t\t\t...value,\n\t\t\t\toptions: options.map((opt, i) =>\n\t\t\t\t\ti === index ? { ...opt, label: newLabel } : opt,\n\t\t\t\t),\n\t\t\t});\n\t\t},\n\t\t[options, value, onChange],\n\t);\n\n\tconst handleValueChange = useCallback(\n\t\t(index: number, newValue: string) => {\n\t\t\tonChange({\n\t\t\t\t...value,\n\t\t\t\toptions: options.map((opt, i) =>\n\t\t\t\t\ti === index ? { ...opt, value: newValue } : opt,\n\t\t\t\t),\n\t\t\t});\n\t\t},\n\t\t[options, value, onChange],\n\t);\n\n\tconst handleColorChange = useCallback(\n\t\t(index: number, newColor: string | undefined) => {\n\t\t\tonChange({\n\t\t\t\t...value,\n\t\t\t\toptions: options.map((opt, i) =>\n\t\t\t\t\ti === index ? { ...opt, color: newColor } : opt,\n\t\t\t\t),\n\t\t\t});\n\t\t},\n\t\t[options, value, onChange],\n\t);\n\n\tconst handleAllowEmptyChange = useCallback(\n\t\t(checked: boolean) => {\n\t\t\tonChange({ ...value, allowEmpty: checked });\n\t\t},\n\t\t[value, onChange],\n\t);\n\n\tconst inputStyle: React.CSSProperties = {\n\t\tpadding: \"4px 8px\",\n\t\tborder: \"1px solid #ccc\",\n\t\tborderRadius: 4,\n\t\tfontSize: 12,\n\t\tflex: 1,\n\t\tboxSizing: \"border-box\",\n\t\twidth: \"100%\",\n\t};\n\n\treturn (\n\t\t<div style={{ display: \"flex\", flexDirection: \"column\", gap: 4 }}>\n\t\t\t{/* 空選択を許可 */}\n\t\t\t<Checkbox\n\t\t\t\tvalue={value.allowEmpty ?? true}\n\t\t\t\tonChange={(checked) => handleAllowEmptyChange(checked ?? true)}\n\t\t\t\tlabel=\"空選択を許可\"\n\t\t\t\treadOnly={readOnly}\n\t\t\t/>\n\t\t\t<div\n\t\t\t\tstyle={{\n\t\t\t\t\tdisplay: \"flex\",\n\t\t\t\t\tflexDirection: \"column\",\n\t\t\t\t\tgap: 4,\n\t\t\t\t\tmaxHeight: 300,\n\t\t\t\t\toverflowY: \"auto\",\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t{options.map((option, index) => (\n\t\t\t\t\t<div\n\t\t\t\t\t\tkey={option.value || `option-${index}`}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tdisplay: \"flex\",\n\t\t\t\t\t\t\tflexDirection: \"column\",\n\t\t\t\t\t\t\tgap: 2,\n\t\t\t\t\t\t\tpadding: \"2px 0\",\n\t\t\t\t\t\t\tborderBottom: \"1px solid #f0f0f0\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tdisplay: \"flex\",\n\t\t\t\t\t\t\t\tjustifyContent: \"space-between\",\n\t\t\t\t\t\t\t\talignItems: \"center\",\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<span style={{ fontSize: 12, fontWeight: 600, color: \"#333\" }}>\n\t\t\t\t\t\t\t\tオプション{index + 1}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\tfontSize: 11,\n\t\t\t\t\t\t\t\t\tcolor: \"#e53e3e\",\n\t\t\t\t\t\t\t\t\tbackground: \"none\",\n\t\t\t\t\t\t\t\t\tborder: \"none\",\n\t\t\t\t\t\t\t\t\tcursor: \"pointer\",\n\t\t\t\t\t\t\t\t\tpadding: \"2px 4px\",\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tonClick={() => handleRemove(index)}\n\t\t\t\t\t\t\t\tdisabled={readOnly || options.length === 1}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t削除\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div style={{ display: \"flex\", alignItems: \"center\", gap: 4 }}>\n\t\t\t\t\t\t\t<label\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\tfontSize: 11,\n\t\t\t\t\t\t\t\t\tcolor: \"#666\",\n\t\t\t\t\t\t\t\t\tminWidth: 32,\n\t\t\t\t\t\t\t\t\tflexShrink: 0,\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\thtmlFor={`${uid}-label-${index}`}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tラベル\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\t\tid={`${uid}-label-${index}`}\n\t\t\t\t\t\t\t\tstyle={inputStyle}\n\t\t\t\t\t\t\t\tvalue={option.label}\n\t\t\t\t\t\t\t\tonChange={(e) => handleLabelChange(index, e.target.value)}\n\t\t\t\t\t\t\t\tdisabled={readOnly}\n\t\t\t\t\t\t\t\tplaceholder=\"表示名\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div style={{ display: \"flex\", alignItems: \"center\", gap: 4 }}>\n\t\t\t\t\t\t\t<label\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\tfontSize: 11,\n\t\t\t\t\t\t\t\t\tcolor: \"#666\",\n\t\t\t\t\t\t\t\t\tminWidth: 32,\n\t\t\t\t\t\t\t\t\tflexShrink: 0,\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\thtmlFor={`${uid}-value-${index}`}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t値\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t<div style={{ flex: 1 }}>\n\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\t\t\tid={`${uid}-value-${index}`}\n\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t...inputStyle,\n\t\t\t\t\t\t\t\t\t\tborderColor: duplicateIndices.has(index)\n\t\t\t\t\t\t\t\t\t\t\t? \"#e53e3e\"\n\t\t\t\t\t\t\t\t\t\t\t: \"#ccc\",\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\tvalue={option.value}\n\t\t\t\t\t\t\t\t\tonChange={(e) => handleValueChange(index, e.target.value)}\n\t\t\t\t\t\t\t\t\tdisabled={readOnly}\n\t\t\t\t\t\t\t\t\tplaceholder=\"内部値\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t{duplicateIndices.has(index) && (\n\t\t\t\t\t\t\t\t\t<p\n\t\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t\tfontSize: 11,\n\t\t\t\t\t\t\t\t\t\t\tcolor: \"#e53e3e\",\n\t\t\t\t\t\t\t\t\t\t\tmargin: \"2px 0 0\",\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t値が重複しています\n\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div style={{ display: \"flex\", alignItems: \"center\", gap: 4 }}>\n\t\t\t\t\t\t\t<label\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\tfontSize: 11,\n\t\t\t\t\t\t\t\t\tcolor: \"#666\",\n\t\t\t\t\t\t\t\t\tminWidth: 32,\n\t\t\t\t\t\t\t\t\tflexShrink: 0,\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\thtmlFor={`${uid}-color-${index}`}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t色\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t<ColorPicker\n\t\t\t\t\t\t\t\tvalue={option.color}\n\t\t\t\t\t\t\t\tonChange={(newColor: string | undefined) =>\n\t\t\t\t\t\t\t\t\thandleColorChange(index, newColor)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tallowUndefined\n\t\t\t\t\t\t\t\tplaceholder=\"色を選択\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t))}\n\t\t\t</div>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tstyle={{\n\t\t\t\t\tpadding: \"6px 12px\",\n\t\t\t\t\tborder: \"1px dashed #007bff\",\n\t\t\t\t\tborderRadius: 4,\n\t\t\t\t\tbackground: \"none\",\n\t\t\t\t\tcolor: \"#007bff\",\n\t\t\t\t\tfontSize: 12,\n\t\t\t\t\tcursor: \"pointer\",\n\t\t\t\t}}\n\t\t\t\tonClick={handleAdd}\n\t\t\t\tdisabled={readOnly}\n\t\t\t>\n\t\t\t\t+ 選択肢を追加\n\t\t\t</button>\n\t\t</div>\n\t);\n};\n\nOptionsEditor.displayName = \"OptionsEditor\";\n","import styles from \"./PaddingEditor.module.css\";\n\ninterface PaddingLinkCheckboxProps {\n\t/** 全辺一括モードかどうか */\n\tbulk: boolean;\n\t/** 変更時のコールバック */\n\tonChange: (v: boolean) => void;\n\treadOnly?: boolean;\n}\n\n/**\n * パディングの全辺一括設定リンクのチェックボックス。\n *\n * @remarks\n * `PaddingEditor` 内部で使用される。\n */\nexport const PaddingLinkCheckbox = ({\n\tbulk,\n\tonChange,\n\treadOnly = false,\n}: PaddingLinkCheckboxProps) => {\n\treturn (\n\t\t<label className={styles.linkLabel}>\n\t\t\t<input\n\t\t\t\ttype=\"checkbox\"\n\t\t\t\tchecked={bulk}\n\t\t\t\tdisabled={readOnly}\n\t\t\t\tonChange={(e) => onChange(e.target.checked)}\n\t\t\t/>\n\t\t\t全辺を一括設定\n\t\t</label>\n\t);\n};\n\nPaddingLinkCheckbox.displayName = \"PaddingLinkCheckbox\";\n","import { useCallback } from \"react\";\n\nimport { PADDING_UNITS } from \"../../../../types\";\nimport { DimensionInput } from \"../../../ui\";\nimport styles from \"./PaddingEditor.module.css\";\nimport { PaddingLinkCheckbox } from \"./PaddingLinkCheckbox\";\n\nimport type { Dimension, PaddingUnit } from \"../../../../types\";\n\n/**\n * `PaddingEditor` コンポーネントの値型。\n *\n * @remarks\n * 4辺のパディング値と一括モードフラグをまとめた型。\n */\nexport interface PaddingEditorValue {\n\t/** 上辺のパディング。値と単位を持つ `Dimension<PaddingUnit>` 形式 */\n\ttop?: Dimension<PaddingUnit>;\n\n\t/** 右辺のパディング。値と単位を持つ `Dimension<PaddingUnit>` 形式 */\n\tright?: Dimension<PaddingUnit>;\n\n\t/** 下辺のパディング。値と単位を持つ `Dimension<PaddingUnit>` 形式 */\n\tbottom?: Dimension<PaddingUnit>;\n\n\t/** 左辺のパディング。値と単位を持つ `Dimension<PaddingUnit>` 形式 */\n\tleft?: Dimension<PaddingUnit>;\n\n\t/** 全辺一括モード。`true` のとき `all` が全辺に適用される */\n\tbulk?: boolean;\n\n\t/** 全辺共通パディング(`bulk: true` のとき有効) */\n\tall?: Dimension<PaddingUnit>;\n}\n\nconst ZERO: Dimension<PaddingUnit> = { value: 0, unit: \"px\" };\n\ntype DimOnChange = (v: Dimension<PaddingUnit> | undefined) => void;\n\ninterface PaddingEditorProps {\n\tvalue?: PaddingEditorValue;\n\tonChange: (v: PaddingEditorValue) => void;\n\treadOnly?: boolean;\n}\n\n/**\n * パディング値を上下左右別に編集する UI。\n *\n * @remarks\n * `PluginPanels` 内で使用される。\n */\nexport const PaddingEditor = ({\n\tvalue,\n\tonChange,\n\treadOnly = false,\n}: PaddingEditorProps) => {\n\tconst current = (value ?? {}) as PaddingEditorValue;\n\tconst bulk = current.bulk ?? false;\n\n\tconst handleBulkChange = useCallback(\n\t\t(checked: boolean) => {\n\t\t\tif (checked) {\n\t\t\t\tonChange({ bulk: true, all: current.top ?? ZERO });\n\t\t\t} else {\n\t\t\t\tonChange({\n\t\t\t\t\tbulk: false,\n\t\t\t\t\ttop: current.top ?? current.all ?? ZERO,\n\t\t\t\t\tright: current.right ?? current.all ?? ZERO,\n\t\t\t\t\tbottom: current.bottom ?? current.all ?? ZERO,\n\t\t\t\t\tleft: current.left ?? current.all ?? ZERO,\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\t[current, onChange],\n\t);\n\n\tconst handleAll: DimOnChange = useCallback(\n\t\t(all) => {\n\t\t\tif (!all) return;\n\t\t\tonChange({ all });\n\t\t},\n\t\t[onChange],\n\t);\n\n\tconst handleTop: DimOnChange = useCallback(\n\t\t(top) => {\n\t\t\tif (!top) return;\n\t\t\tonChange({ top });\n\t\t},\n\t\t[onChange],\n\t);\n\n\tconst handleRight: DimOnChange = useCallback(\n\t\t(right) => {\n\t\t\tif (!right) return;\n\t\t\tonChange({ right });\n\t\t},\n\t\t[onChange],\n\t);\n\n\tconst handleBottom: DimOnChange = useCallback(\n\t\t(bottom) => {\n\t\t\tif (!bottom) return;\n\t\t\tonChange({ bottom });\n\t\t},\n\t\t[onChange],\n\t);\n\n\tconst handleLeft: DimOnChange = useCallback(\n\t\t(left) => {\n\t\t\tif (!left) return;\n\t\t\tonChange({ left });\n\t\t},\n\t\t[onChange],\n\t);\n\n\treturn (\n\t\t<div className={styles.root}>\n\t\t\t<PaddingLinkCheckbox\n\t\t\t\tbulk={bulk}\n\t\t\t\tonChange={handleBulkChange}\n\t\t\t\treadOnly={readOnly}\n\t\t\t/>\n\t\t\t{bulk ? (\n\t\t\t\t/* 一括モード:中央1入力 */\n\t\t\t\t<div className={styles.allRow}>\n\t\t\t\t\t<div className={styles.cell}>\n\t\t\t\t\t\t<DimensionInput\n\t\t\t\t\t\t\tvalue={current.all ?? ZERO}\n\t\t\t\t\t\t\tonChange={handleAll}\n\t\t\t\t\t\t\tconfig={{ allowedUnits: PADDING_UNITS, min: 0 }}\n\t\t\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t) : (\n\t\t\t\t/* 個別モード:十字レイアウト */\n\t\t\t\t<div className={styles.grid}>\n\t\t\t\t\t{/* 上 */}\n\t\t\t\t\t<div className={styles.cell}>\n\t\t\t\t\t\t<DimensionInput\n\t\t\t\t\t\t\tvalue={current.top ?? ZERO}\n\t\t\t\t\t\t\tonChange={handleTop}\n\t\t\t\t\t\t\tconfig={{ allowedUnits: PADDING_UNITS, min: 0 }}\n\t\t\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{/* 左・スペーサー・右 */}\n\t\t\t\t\t<div className={styles.sideRow}>\n\t\t\t\t\t\t<div className={styles.cell}>\n\t\t\t\t\t\t\t<DimensionInput\n\t\t\t\t\t\t\t\tvalue={current.left ?? ZERO}\n\t\t\t\t\t\t\t\tonChange={handleLeft}\n\t\t\t\t\t\t\t\tconfig={{ allowedUnits: PADDING_UNITS, min: 0 }}\n\t\t\t\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div className={styles.spacer} />\n\t\t\t\t\t\t<div className={styles.cell}>\n\t\t\t\t\t\t\t<DimensionInput\n\t\t\t\t\t\t\t\tvalue={current.right ?? ZERO}\n\t\t\t\t\t\t\t\tonChange={handleRight}\n\t\t\t\t\t\t\t\tconfig={{ allowedUnits: PADDING_UNITS, min: 0 }}\n\t\t\t\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{/* 下 */}\n\t\t\t\t\t<div className={styles.cell}>\n\t\t\t\t\t\t<DimensionInput\n\t\t\t\t\t\t\tvalue={current.bottom ?? ZERO}\n\t\t\t\t\t\t\tonChange={handleBottom}\n\t\t\t\t\t\t\tconfig={{ allowedUnits: PADDING_UNITS, min: 0 }}\n\t\t\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n};\n\nPaddingEditor.displayName = \"PaddingEditor\";\n","import {\n\ttextBehaviorProp,\n\tWordWrap,\n} from \"../../../../canvas/blocks/text/props\";\nimport { Checkbox, Dropdown, NumberInput } from \"../../../ui\";\n\nimport type React from \"react\";\nimport type { Value } from \"../../../../types\";\n\nconst DEFAULT = textBehaviorProp.defaultProps;\n\nconst WORD_WRAP_OPTIONS = [\n\t{ label: \"標準\", value: WordWrap.normal },\n\t{ label: \"単語で折り返し\", value: WordWrap.breakWord },\n\t{ label: \"文字で折り返し\", value: WordWrap.breakAll },\n] as const;\n\n/**\n * `TextBehaviorEditor` コンポーネントへの props。\n */\nexport interface TextBehaviorEditorProps {\n\t/** 複数行モードかどうか */\n\tmultiline?: boolean;\n\n\t/** 行間 */\n\tlineHeight?: number;\n\n\t/** 折り返し化設定 */\n\twordWrap?: WordWrap;\n\n\t/** 値変更時のコールバック */\n\tonChange: (key: string, value: Value) => void;\n\n\t/** 読み取り専用モード */\n\treadOnly?: boolean;\n}\n\nconst rowStyle: React.CSSProperties = {\n\tdisplay: \"flex\",\n\talignItems: \"center\",\n\tgap: 6,\n\tmarginBottom: 4,\n};\n\nconst labelStyle: React.CSSProperties = {\n\tfontSize: 11,\n\tcolor: \"#666\",\n\tminWidth: 72,\n\tflexShrink: 0,\n};\n\n/**\n * テキストの改行・行間距・折り返しなどの振る舞いを編集する UI。\n *\n * @remarks\n * `PluginPanels` 内で使用される。\n */\nexport const TextBehaviorEditor: React.FC<TextBehaviorEditorProps> = ({\n\tmultiline,\n\tlineHeight,\n\twordWrap,\n\tonChange,\n\treadOnly = false,\n}) => {\n\treturn (\n\t\t<div style={{ display: \"flex\", flexDirection: \"column\", gap: 2 }}>\n\t\t\t{/* 複数行モード */}\n\t\t\t<div style={rowStyle}>\n\t\t\t\t<span style={labelStyle}>複数行</span>\n\t\t\t\t<Checkbox\n\t\t\t\t\tvalue={multiline ?? DEFAULT.multiline}\n\t\t\t\t\tonChange={(v) => onChange(\"multiline\", v ?? false)}\n\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t\tlabel=\"複数行入力を有効にする\"\n\t\t\t\t/>\n\t\t\t</div>\n\n\t\t\t{/* 行間 */}\n\t\t\t<div style={rowStyle}>\n\t\t\t\t<span style={labelStyle}>行間</span>\n\t\t\t\t<div style={{ flex: 1 }}>\n\t\t\t\t\t<NumberInput\n\t\t\t\t\t\tvalue={lineHeight ?? DEFAULT.lineHeight}\n\t\t\t\t\t\tonChange={(v) => onChange(\"lineHeight\", v ?? DEFAULT.lineHeight)}\n\t\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t\t\tmin={0.5}\n\t\t\t\t\t\tmax={5}\n\t\t\t\t\t\tstep={0.1}\n\t\t\t\t\t\theight={24}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t{/* 折り返し */}\n\t\t\t<div style={rowStyle}>\n\t\t\t\t<span style={labelStyle}>折り返し</span>\n\t\t\t\t<div style={{ flex: 1 }}>\n\t\t\t\t\t<Dropdown\n\t\t\t\t\t\tvalue={wordWrap ?? DEFAULT.wordWrap}\n\t\t\t\t\t\tonChange={(v) => onChange(\"wordWrap\", v ?? DEFAULT.wordWrap)}\n\t\t\t\t\t\toptions={WORD_WRAP_OPTIONS}\n\t\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t\t\theight={24}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nTextBehaviorEditor.displayName = \"TextBehaviorEditor\";\n","import { useCallback, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nimport { Dropdown, NumberInput, TextInput } from \"../../../ui\";\n\nimport type React from \"react\";\nimport type { Value } from \"../../../../types\";\n\ntype CombinedOption = {\n\tlabel: string;\n\tinputType: string;\n\tpattern?: string;\n\tisCustom?: true;\n\thideLength?: true;\n};\n\nconst COMBINED_OPTIONS: CombinedOption[] = [\n\t{ label: \"テキスト\", inputType: \"text\" },\n\t{ label: \"数字のみ\", inputType: \"text\", pattern: \"[0-9]+\" },\n\t{ label: \"半角英字のみ\", inputType: \"text\", pattern: \"[a-zA-Z]+\" },\n\t{ label: \"半角英数字のみ\", inputType: \"text\", pattern: \"[a-zA-Z0-9]+\" },\n\t{ label: \"ひらがなのみ\", inputType: \"text\", pattern: \"[ぁ-ん]+\" },\n\t{ label: \"カタカナのみ\", inputType: \"text\", pattern: \"[ァ-ン]+\" },\n\t{\n\t\tlabel: \"郵便番号(123-4567)\",\n\t\tinputType: \"text\",\n\t\tpattern: \"[0-9]{3}-[0-9]{4}\",\n\t\thideLength: true,\n\t},\n\t{\n\t\tlabel: \"電話番号\",\n\t\tinputType: \"tel\",\n\t\tpattern: \"[0-9]{2,4}-[0-9]{2,4}-[0-9]{4}\",\n\t\thideLength: true,\n\t},\n\t{\n\t\tlabel: \"メールアドレス\",\n\t\tinputType: \"email\",\n\t\tpattern:\n\t\t\t\"^[a-zA-Z0-9_+\\\\-.]+@[a-zA-Z0-9\\\\-]+(\\\\.[a-zA-Z0-9\\\\-]+)*\\\\.[a-zA-Z]{2,}$\",\n\t\thideLength: true,\n\t},\n\t{\n\t\tlabel: \"URL\",\n\t\tinputType: \"url\",\n\t\tpattern: \"https?://[^\\\\s]+\",\n\t\thideLength: true,\n\t},\n\t{\n\t\tlabel: \"日付\",\n\t\tinputType: \"date\",\n\t\tpattern: \"[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])\",\n\t\thideLength: true,\n\t},\n\t{ label: \"その他\", inputType: \"text\", isCustom: true },\n];\n\nconst COMBINED_DROPDOWN_OPTIONS = COMBINED_OPTIONS.map((o) => ({\n\tlabel: o.label,\n\tvalue: o.label,\n}));\n\nconst PATTERN_HELP = `[0-9] 数字のみ\n[a-z] 英小文字\n[A-Z] 英大文字\n[ぁ-ん] ひらがな\n+ 1回以上繰り返し\n* 0回以上繰り返し\n{3} 3回繰り返し\n{3,5} 3〜5回繰り返し\n. 任意の1文字`;\n\n/**\n * `TextValidationEditor` コンポーネントへの props。\n */\nexport interface TextValidationEditorProps {\n\t/** 入力タイプ(`\"text\"`, `\"tel\"`, `\"email\"`, `\"date\"`, `\"url\"` 等) */\n\tinputType?: string;\n\n\t/** 最小文字数 */\n\tminLength?: number;\n\n\t/** 最大文字数 */\n\tmaxLength?: number;\n\n\t/** 入力パターン(正規表現の文字クラス等) */\n\tpattern?: string;\n\n\t/** 単一キー値変更コールバック */\n\tonChange: (key: string, value: Value) => void;\n\n\t/** 複数キー一括変更コールバック */\n\tonChangeBatch?: (updates: Record<string, Value>) => void;\n\n\t/** 読み取り専用モード */\n\treadOnly?: boolean;\n}\n\nconst rowStyle: React.CSSProperties = {\n\tdisplay: \"flex\",\n\talignItems: \"center\",\n\tgap: 6,\n\tmarginBottom: 4,\n};\nconst labelStyle: React.CSSProperties = {\n\tfontSize: 11,\n\tcolor: \"#666\",\n\tminWidth: 72,\n\tflexShrink: 0,\n};\n\n/**\n * テキスト入力のバリデーションルール(入力タイプ・文字数・パターン)を編集する UI。\n *\n * @remarks\n * `PluginPanels` 内で使用される。\n */\nexport const TextValidationEditor: React.FC<TextValidationEditorProps> = ({\n\tinputType,\n\tminLength,\n\tmaxLength,\n\tpattern,\n\tonChange,\n\tonChangeBatch,\n\treadOnly = false,\n}) => {\n\tconst [tooltipVisible, setTooltipVisible] = useState(false);\n\tconst [tooltipStyle, setTooltipStyle] = useState<React.CSSProperties>({});\n\tconst infoBtnRef = useRef<HTMLButtonElement>(null);\n\n\tconst showTooltip = useCallback(() => {\n\t\tconst rect = infoBtnRef.current?.getBoundingClientRect();\n\t\tif (!rect) return;\n\t\tsetTooltipStyle({\n\t\t\tposition: \"fixed\",\n\t\t\tbottom: window.innerHeight - rect.top + 4,\n\t\t\tright: window.innerWidth - rect.right,\n\t\t});\n\t\tsetTooltipVisible(true);\n\t}, []);\n\n\tconst hideTooltip = useCallback(() => setTooltipVisible(false), []);\n\n\t// propsから現在の選択肢ラベルを算出\n\t// pattern: null/undefined → resolvedPattern: undefined → \"テキスト\" にマッチ\n\t// pattern: \"\" → resolvedPattern: \"\" → どのプリセットにもマッチせず → \"その他\"\n\tconst resolvedInputType = inputType ?? \"text\";\n\tconst resolvedPattern = pattern ?? undefined;\n\tconst currentLabel = (() => {\n\t\tconst match = COMBINED_OPTIONS.find((o) => {\n\t\t\tif (o.isCustom) return false;\n\t\t\tif (o.inputType !== resolvedInputType) return false;\n\t\t\treturn o.pattern === resolvedPattern;\n\t\t});\n\t\treturn match?.label ?? \"その他\";\n\t})();\n\tconst isCustom = currentLabel === \"その他\";\n\tconst currentOpt = COMBINED_OPTIONS.find((o) => o.label === currentLabel);\n\tconst showLength = !currentOpt?.hideLength;\n\n\tconst handleCombinedChange = useCallback(\n\t\t(label: string | undefined) => {\n\t\t\tconst opt = COMBINED_OPTIONS.find((o) => o.label === label);\n\t\t\tif (!opt) return;\n\t\t\t// isCustom の場合は pattern を \"\" にして currentLabel を \"その他\" に固定する\n\t\t\t// (null → resolvedPattern=undefined → \"テキスト\" とマッチしてしまうため空文字で区別)\n\t\t\tconst nextPattern: Value = opt.isCustom ? \"\" : (opt.pattern ?? null);\n\t\t\tconst updates: Record<string, Value> = {\n\t\t\t\tinputType: opt.inputType,\n\t\t\t\tpattern: nextPattern,\n\t\t\t};\n\t\t\tif (onChangeBatch) {\n\t\t\t\tonChangeBatch(updates);\n\t\t\t} else {\n\t\t\t\tfor (const [k, v] of Object.entries(updates)) {\n\t\t\t\t\tonChange(k, v);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t[onChange, onChangeBatch],\n\t);\n\n\treturn (\n\t\t<div style={{ display: \"flex\", flexDirection: \"column\", gap: 2 }}>\n\t\t\t{/* 入力タイプ */}\n\t\t\t<div style={rowStyle}>\n\t\t\t\t<span style={labelStyle}>入力タイプ</span>\n\t\t\t\t<div style={{ flex: 1 }}>\n\t\t\t\t\t<Dropdown\n\t\t\t\t\t\tvalue={currentLabel}\n\t\t\t\t\t\tonChange={handleCombinedChange}\n\t\t\t\t\t\toptions={COMBINED_DROPDOWN_OPTIONS}\n\t\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t\t\theight={24}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t{/* 文字数(文字数が固定されるオプションでは非表示) */}\n\t\t\t{showLength && (\n\t\t\t\t<div style={rowStyle}>\n\t\t\t\t\t<span style={labelStyle}>文字数</span>\n\t\t\t\t\t<div\n\t\t\t\t\t\tstyle={{ display: \"flex\", alignItems: \"center\", gap: 4, flex: 1 }}\n\t\t\t\t\t>\n\t\t\t\t\t\t<div style={{ flex: 1 }}>\n\t\t\t\t\t\t\t<NumberInput\n\t\t\t\t\t\t\t\tvalue={minLength}\n\t\t\t\t\t\t\t\tonChange={(v) => onChange(\"minLength\", v ?? null)}\n\t\t\t\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t\t\t\t\tmin={0}\n\t\t\t\t\t\t\t\tplaceholder=\"min\"\n\t\t\t\t\t\t\t\theight={24}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<span style={{ fontSize: 11, color: \"#666\" }}>〜</span>\n\t\t\t\t\t\t<div style={{ flex: 1 }}>\n\t\t\t\t\t\t\t<NumberInput\n\t\t\t\t\t\t\t\tvalue={maxLength}\n\t\t\t\t\t\t\t\tonChange={(v) => onChange(\"maxLength\", v ?? null)}\n\t\t\t\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t\t\t\t\tmin={0}\n\t\t\t\t\t\t\t\tplaceholder=\"max\"\n\t\t\t\t\t\t\t\theight={24}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<span style={{ fontSize: 11, color: \"#666\" }}>文字</span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{/* カスタムパターン(「その他」選択時のみ表示) */}\n\t\t\t{isCustom && (\n\t\t\t\t<div style={rowStyle}>\n\t\t\t\t\t<span\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t...labelStyle,\n\t\t\t\t\t\t\tdisplay: \"flex\",\n\t\t\t\t\t\t\talignItems: \"center\",\n\t\t\t\t\t\t\tgap: 2,\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\tパターン\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tref={infoBtnRef}\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tdisplay: \"inline-flex\",\n\t\t\t\t\t\t\t\talignItems: \"center\",\n\t\t\t\t\t\t\t\tjustifyContent: \"center\",\n\t\t\t\t\t\t\t\twidth: 14,\n\t\t\t\t\t\t\t\theight: 14,\n\t\t\t\t\t\t\t\tborder: \"none\",\n\t\t\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\t\t\tborderRadius: 9999,\n\t\t\t\t\t\t\t\tbackgroundColor: \"#d1d5db\",\n\t\t\t\t\t\t\t\tcolor: \"#fff\",\n\t\t\t\t\t\t\t\tfontSize: 9,\n\t\t\t\t\t\t\t\tfontWeight: 700,\n\t\t\t\t\t\t\t\tcursor: \"help\",\n\t\t\t\t\t\t\t\toutline: \"none\",\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\taria-label=\"入力パターンの使い方\"\n\t\t\t\t\t\t\tonMouseEnter={showTooltip}\n\t\t\t\t\t\t\tonMouseLeave={hideTooltip}\n\t\t\t\t\t\t\tonFocus={showTooltip}\n\t\t\t\t\t\t\tonBlur={hideTooltip}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\ti\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</span>\n\t\t\t\t\t<div style={{ flex: 1 }}>\n\t\t\t\t\t\t<TextInput\n\t\t\t\t\t\t\tvalue={pattern ?? \"\"}\n\t\t\t\t\t\t\tonChange={(v) => {\n\t\t\t\t\t\t\t\t// 空文字のまま保持することで currentLabel が \"その他\" を維持する\n\t\t\t\t\t\t\t\tonChange(\"pattern\", v ?? \"\");\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t\t\t\tplaceholder=\"例: [0-9]+\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{tooltipVisible &&\n\t\t\t\tcreatePortal(\n\t\t\t\t\t<pre\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t...tooltipStyle,\n\t\t\t\t\t\t\tzIndex: 9999999,\n\t\t\t\t\t\t\twidth: \"max-content\",\n\t\t\t\t\t\t\tmargin: 0,\n\t\t\t\t\t\t\tpadding: \"6px 10px\",\n\t\t\t\t\t\t\tfontSize: 11,\n\t\t\t\t\t\t\tfontFamily: \"monospace\",\n\t\t\t\t\t\t\tlineHeight: 1.6,\n\t\t\t\t\t\t\tcolor: \"#f3f4f6\",\n\t\t\t\t\t\t\tbackgroundColor: \"rgba(30, 30, 30, 0.95)\",\n\t\t\t\t\t\t\tborderRadius: 6,\n\t\t\t\t\t\t\tboxShadow: \"0 4px 12px rgba(0,0,0,0.4)\",\n\t\t\t\t\t\t\twhiteSpace: \"pre\",\n\t\t\t\t\t\t\tpointerEvents: \"none\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{PATTERN_HELP}\n\t\t\t\t\t</pre>,\n\t\t\t\t\tdocument.body,\n\t\t\t\t)}\n\t\t</div>\n\t);\n};\n\nTextValidationEditor.displayName = \"TextValidationEditor\";\n","import { memo, useCallback } from \"react\";\n\nimport {\n\tHorizontalAlign,\n\tVerticalAlign,\n} from \"../../../../plugin/properties/alignment\";\nimport { Checkbox, CollapsibleSection, TextInput } from \"../../../ui\";\nimport { getCommonValue } from \"../../utils/getCommonValue\";\nimport { AlignmentToggle } from \"./AlignmentToggle\";\nimport { CheckboxStyleEditor } from \"./CheckboxStyleEditor\";\nimport { FontStyleEditor } from \"./FontStyleEditor\";\nimport { OptionsEditor } from \"./OptionsEditor\";\nimport { PaddingEditor } from \"./PaddingEditor\";\nimport { TextBehaviorEditor } from \"./TextBehaviorEditor\";\nimport { TextValidationEditor } from \"./TextValidationEditor\";\n\nimport type { ComponentType } from \"react\";\nimport type { CheckboxStyleConfig } from \"../../../../canvas/blocks/checkbox/props\";\nimport type { SelectOptionsConfig } from \"../../../../canvas/blocks/select/props\";\nimport type { PropDef, PropertyComponentProps } from \"../../../../plugin\";\nimport type {\n\tBlock,\n\tDimension,\n\tFontUnit,\n\tPaddingUnit,\n\tUnit,\n\tValue,\n} from \"../../../../types\";\nimport type { BlockDefaults } from \"../../../../types/schema\";\nimport type { AlignmentToggleOption } from \"./AlignmentToggle\";\nimport type { FontStyleEditorValue } from \"./FontStyleEditor\";\nimport type { PaddingEditorValue } from \"./PaddingEditor\";\n\n/**\n * `PropDefEditor`(ブロックデフォルト用)および `PropertyField` コンポーネントへの props。\n */\nexport interface PropertyFieldProps {\n\t/** プロパティ定義(種類・ドィスプレイ名・デフォルト値など) */\n\tpropDef: PropDef;\n\n\t/** 選択中のブロックの配列 */\n\tselectedBlocks: Block[];\n\n\t/** 容橋値変更時のコールバック */\n\tonChange: (key: string, value: Value) => void;\n\n\t/** 複数値一括変更時のコールバック */\n\tonChangeBatch?: (updates: Record<string, Value>) => void;\n\t/** `true` のときカスタムコンポーネントに `readOnly` を渡す */\n\treadOnly?: boolean;\n\t/** ブロックデフォルト設定 */\n\tblockDefaults?: BlockDefaults;\n\n\t/** デフォルト値にリセット実行時のコールバック */\n\tonResetToDefault?: (keys: string[]) => void;\n}\n\n/**\n * `PropDef` の kind に対応する日本語表示名のマップ。\n *\n * @remarks\n * `PropertyField` のセクションヘッダに使用される。\n */\nexport const KIND_TITLES: Record<string, string> = {\n\talignment: \"配置\",\n\tfontStyle: \"フォントスタイル\",\n\tpadding: \"パディング\",\n\trequired: \"必須入力\",\n\tplaceholder: \"プレースホルダー\",\n\ttextValidation: \"入力検証\",\n\ttextBehavior: \"テキスト動作\",\n\tselectConfig: \"選択肢設定\",\n\tcheckboxStyle: \"チェックボックスデザイン\",\n};\n\nconst HORIZONTAL_OPTIONS: AlignmentToggleOption[] = [\n\t{\n\t\tvalue: HorizontalAlign.left,\n\t\tlabel: \"左揃え\",\n\t\ticon: (\n\t\t\t<svg viewBox=\"0 0 16 16\" fill=\"currentColor\" aria-hidden=\"true\">\n\t\t\t\t<rect x=\"1\" y=\"2\" width=\"1.5\" height=\"12\" rx=\"0.5\" />\n\t\t\t\t<rect x=\"4\" y=\"3\" width=\"6\" height=\"2.5\" rx=\"0.5\" />\n\t\t\t\t<rect x=\"4\" y=\"7\" width=\"10\" height=\"2.5\" rx=\"0.5\" />\n\t\t\t\t<rect x=\"4\" y=\"11\" width=\"7\" height=\"2.5\" rx=\"0.5\" />\n\t\t\t</svg>\n\t\t),\n\t},\n\t{\n\t\tvalue: HorizontalAlign.center,\n\t\tlabel: \"中央揃え\",\n\t\ticon: (\n\t\t\t<svg viewBox=\"0 0 16 16\" fill=\"currentColor\" aria-hidden=\"true\">\n\t\t\t\t<rect x=\"7.25\" y=\"2\" width=\"1.5\" height=\"12\" rx=\"0.5\" />\n\t\t\t\t<rect x=\"3.5\" y=\"3\" width=\"9\" height=\"2.5\" rx=\"0.5\" />\n\t\t\t\t<rect x=\"1\" y=\"7\" width=\"14\" height=\"2.5\" rx=\"0.5\" />\n\t\t\t\t<rect x=\"4.5\" y=\"11\" width=\"7\" height=\"2.5\" rx=\"0.5\" />\n\t\t\t</svg>\n\t\t),\n\t},\n\t{\n\t\tvalue: HorizontalAlign.right,\n\t\tlabel: \"右揃え\",\n\t\ticon: (\n\t\t\t<svg viewBox=\"0 0 16 16\" fill=\"currentColor\" aria-hidden=\"true\">\n\t\t\t\t<rect x=\"13.5\" y=\"2\" width=\"1.5\" height=\"12\" rx=\"0.5\" />\n\t\t\t\t<rect x=\"6\" y=\"3\" width=\"6\" height=\"2.5\" rx=\"0.5\" />\n\t\t\t\t<rect x=\"2\" y=\"7\" width=\"10\" height=\"2.5\" rx=\"0.5\" />\n\t\t\t\t<rect x=\"5\" y=\"11\" width=\"7\" height=\"2.5\" rx=\"0.5\" />\n\t\t\t</svg>\n\t\t),\n\t},\n];\n\nconst VERTICAL_OPTIONS: AlignmentToggleOption[] = [\n\t{\n\t\tvalue: VerticalAlign.top,\n\t\tlabel: \"上揃え\",\n\t\ticon: (\n\t\t\t<svg viewBox=\"0 0 16 16\" fill=\"currentColor\" aria-hidden=\"true\">\n\t\t\t\t<rect x=\"1\" y=\"1\" width=\"14\" height=\"1\" />\n\t\t\t\t<rect x=\"2\" y=\"3\" width=\"4\" height=\"8\" rx=\"0.5\" />\n\t\t\t\t<rect x=\"10\" y=\"3\" width=\"4\" height=\"5\" rx=\"0.5\" />\n\t\t\t</svg>\n\t\t),\n\t},\n\t{\n\t\tvalue: VerticalAlign.center,\n\t\tlabel: \"中央揃え\",\n\t\ticon: (\n\t\t\t<svg viewBox=\"0 0 16 16\" fill=\"currentColor\" aria-hidden=\"true\">\n\t\t\t\t<rect x=\"1\" y=\"7.5\" width=\"14\" height=\"1\" />\n\t\t\t\t<rect x=\"2\" y=\"3\" width=\"4\" height=\"10\" rx=\"0.5\" />\n\t\t\t\t<rect x=\"10\" y=\"4.5\" width=\"4\" height=\"7\" rx=\"0.5\" />\n\t\t\t</svg>\n\t\t),\n\t},\n\t{\n\t\tvalue: VerticalAlign.bottom,\n\t\tlabel: \"下揃え\",\n\t\ticon: (\n\t\t\t<svg viewBox=\"0 0 16 16\" fill=\"currentColor\" aria-hidden=\"true\">\n\t\t\t\t<rect x=\"1\" y=\"14\" width=\"14\" height=\"1\" />\n\t\t\t\t<rect x=\"2\" y=\"5\" width=\"4\" height=\"8\" rx=\"0.5\" />\n\t\t\t\t<rect x=\"10\" y=\"8\" width=\"4\" height=\"5\" rx=\"0.5\" />\n\t\t\t</svg>\n\t\t),\n\t},\n];\n\nfunction isDimension<U extends Unit>(v: unknown): v is Dimension<U> {\n\treturn (\n\t\ttypeof v === \"object\" &&\n\t\tv !== null &&\n\t\ttypeof (v as Record<string, unknown>).value === \"number\" &&\n\t\ttypeof (v as Record<string, unknown>).unit === \"string\"\n\t);\n}\n\nfunction isSelectOptionsConfig(v: unknown): v is SelectOptionsConfig {\n\treturn (\n\t\ttypeof v === \"object\" &&\n\t\tv !== null &&\n\t\tArray.isArray((v as Record<string, unknown>).options)\n\t);\n}\n\n/**\n * `PropDefEditor` コンポーネントへの props。\n */\nexport interface PropDefEditorProps {\n\t/** プロパティの種類(`\"alignment\"`, `\"fontStyle\"`, `\"padding\"` 等) */\n\tkind: string;\n\n\t/** PropDef から解決されたデフォルト値のマップ */\n\tdefaultProps: Record<string, Value>;\n\n\t/** 指定キーの現在値を取得するゲッター */\n\tgetVal: (key: string) => Value;\n\n\t/** 単一キーの値変更コールバック */\n\tonChange: (key: string, value: Value) => void;\n\n\t/** 複数キーの一括変更コールバック */\n\tonChangeBatch?: (updates: Record<string, Value>) => void;\n\n\t/** 読み取り専用にするかどうか(カスタムコンポーネントに渡われる) */\n\treadOnly?: boolean;\n\n\t/** PropDef に指定されたカスタムUIコンポーネント */\n\tcomponent?: ComponentType<PropertyComponentProps<Value>>;\n}\n\n/**\n * `PropDef` の種類に応じた編集 UI を描画する純粋コンポーネント。\n *\n * @remarks\n * `PropertyField` の内部で使用される。\n */\nexport const PropDefEditor = memo(\n\t({\n\t\tkind,\n\t\tdefaultProps,\n\t\tgetVal,\n\t\tonChange,\n\t\tonChangeBatch,\n\t\treadOnly,\n\t\tcomponent,\n\t}: PropDefEditorProps) => {\n\t\tswitch (kind) {\n\t\t\tcase \"alignment\": {\n\t\t\t\tconst hValue = getVal(\"horizontal\") ?? HorizontalAlign.left;\n\t\t\t\tconst vValue = getVal(\"vertical\") ?? VerticalAlign.center;\n\t\t\t\treturn (\n\t\t\t\t\t<div\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tdisplay: \"flex\",\n\t\t\t\t\t\t\tgap: 8,\n\t\t\t\t\t\t\talignItems: \"center\",\n\t\t\t\t\t\t\tflexWrap: \"wrap\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<AlignmentToggle\n\t\t\t\t\t\t\toptions={HORIZONTAL_OPTIONS}\n\t\t\t\t\t\t\tcurrent={hValue}\n\t\t\t\t\t\t\tonChange={(v) => onChange(\"horizontal\", v)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<AlignmentToggle\n\t\t\t\t\t\t\toptions={VERTICAL_OPTIONS}\n\t\t\t\t\t\t\tcurrent={vValue}\n\t\t\t\t\t\t\tonChange={(v) => onChange(\"vertical\", v)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase \"fontStyle\": {\n\t\t\t\tconst fontSizeRaw = getVal(\"fontSize\");\n\t\t\t\tconst fontStyleValue: FontStyleEditorValue = {\n\t\t\t\t\tfontFamily: getVal(\"fontFamily\") as string | undefined,\n\t\t\t\t\tfontSize: isDimension<FontUnit>(fontSizeRaw)\n\t\t\t\t\t\t? fontSizeRaw\n\t\t\t\t\t\t: undefined,\n\t\t\t\t\tcolor: getVal(\"color\") as string | undefined,\n\t\t\t\t\tfontWeight: getVal(\"fontWeight\") as boolean | undefined,\n\t\t\t\t\titalic: getVal(\"italic\") as boolean | undefined,\n\t\t\t\t\tunderline: getVal(\"underline\") as boolean | undefined,\n\t\t\t\t\tlineThrough: getVal(\"lineThrough\") as boolean | undefined,\n\t\t\t\t};\n\t\t\t\treturn (\n\t\t\t\t\t<FontStyleEditor\n\t\t\t\t\t\tvalue={fontStyleValue}\n\t\t\t\t\t\tonChange={(v) => {\n\t\t\t\t\t\t\tif (onChangeBatch) {\n\t\t\t\t\t\t\t\tonChangeBatch(v as Record<string, Value>);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tfor (const [k, val] of Object.entries(v)) {\n\t\t\t\t\t\t\t\t\tonChange(k, val as Value);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase \"padding\": {\n\t\t\t\tconst rawTop = getVal(\"top\");\n\t\t\t\tconst rawRight = getVal(\"right\");\n\t\t\t\tconst rawBottom = getVal(\"bottom\");\n\t\t\t\tconst rawLeft = getVal(\"left\");\n\t\t\t\tconst rawBulk = getVal(\"bulk\");\n\t\t\t\tconst rawAll = getVal(\"all\");\n\t\t\t\tconst paddingValue: PaddingEditorValue = {\n\t\t\t\t\ttop: isDimension<PaddingUnit>(rawTop) ? rawTop : undefined,\n\t\t\t\t\tright: isDimension<PaddingUnit>(rawRight) ? rawRight : undefined,\n\t\t\t\t\tbottom: isDimension<PaddingUnit>(rawBottom) ? rawBottom : undefined,\n\t\t\t\t\tleft: isDimension<PaddingUnit>(rawLeft) ? rawLeft : undefined,\n\t\t\t\t\tbulk: typeof rawBulk === \"boolean\" ? rawBulk : false,\n\t\t\t\t\tall: isDimension<PaddingUnit>(rawAll) ? rawAll : undefined,\n\t\t\t\t};\n\t\t\t\treturn (\n\t\t\t\t\t<PaddingEditor\n\t\t\t\t\t\tvalue={paddingValue}\n\t\t\t\t\t\tonChange={(v) => {\n\t\t\t\t\t\t\tif (onChangeBatch) {\n\t\t\t\t\t\t\t\tonChangeBatch(v as Record<string, Value>);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tfor (const [k, val] of Object.entries(v)) {\n\t\t\t\t\t\t\t\t\tonChange(k, val as Value);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase \"required\": {\n\t\t\t\tconst required = getVal(\"required\") as boolean | undefined;\n\t\t\t\treturn (\n\t\t\t\t\t<Checkbox\n\t\t\t\t\t\tvalue={required ?? false}\n\t\t\t\t\t\tonChange={(v) => onChange(\"required\", v ?? false)}\n\t\t\t\t\t\tlabel=\"必須\"\n\t\t\t\t\t/>\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase \"placeholder\": {\n\t\t\t\tconst placeholder = getVal(\"placeholder\") as string | undefined;\n\t\t\t\treturn (\n\t\t\t\t\t<TextInput\n\t\t\t\t\t\tvalue={placeholder ?? \"\"}\n\t\t\t\t\t\tonChange={(v) => onChange(\"placeholder\", v ?? \"\")}\n\t\t\t\t\t/>\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase \"textValidation\": {\n\t\t\t\treturn (\n\t\t\t\t\t<TextValidationEditor\n\t\t\t\t\t\tinputType={getVal(\"inputType\") as string | undefined}\n\t\t\t\t\t\tminLength={\n\t\t\t\t\t\t\t(getVal(\"minLength\") as number | null | undefined) ?? undefined\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmaxLength={\n\t\t\t\t\t\t\t(getVal(\"maxLength\") as number | null | undefined) ?? undefined\n\t\t\t\t\t\t}\n\t\t\t\t\t\tpattern={\n\t\t\t\t\t\t\t(getVal(\"pattern\") as string | null | undefined) ?? undefined\n\t\t\t\t\t\t}\n\t\t\t\t\t\tonChange={onChange}\n\t\t\t\t\t\tonChangeBatch={onChangeBatch}\n\t\t\t\t\t/>\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase \"textBehavior\": {\n\t\t\t\treturn (\n\t\t\t\t\t<TextBehaviorEditor\n\t\t\t\t\t\tmultiline={getVal(\"multiline\") as boolean | undefined}\n\t\t\t\t\t\tlineHeight={\n\t\t\t\t\t\t\t(getVal(\"lineHeight\") as number | null | undefined) ?? undefined\n\t\t\t\t\t\t}\n\t\t\t\t\t\twordWrap={\n\t\t\t\t\t\t\tgetVal(\"wordWrap\") as\n\t\t\t\t\t\t\t\t| import(\"../../../../canvas/blocks/text/props\").WordWrap\n\t\t\t\t\t\t\t\t| undefined\n\t\t\t\t\t\t}\n\t\t\t\t\t\tonChange={onChange}\n\t\t\t\t\t/>\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase \"checkboxStyle\": {\n\t\t\t\tconst config = getVal(\"styleConfig\") as CheckboxStyleConfig | undefined;\n\t\t\t\treturn (\n\t\t\t\t\t<CheckboxStyleEditor\n\t\t\t\t\t\tvalue={config}\n\t\t\t\t\t\tonChange={(v) => onChange(\"styleConfig\", v as Value)}\n\t\t\t\t\t/>\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase \"selectConfig\": {\n\t\t\t\tconst rawCfg = getVal(\"selectConfig\");\n\t\t\t\tconst cfg = isSelectOptionsConfig(rawCfg) ? rawCfg : { options: [] };\n\t\t\t\treturn (\n\t\t\t\t\t<OptionsEditor\n\t\t\t\t\t\tvalue={cfg}\n\t\t\t\t\t\tonChange={(v) => onChange(\"selectConfig\", v as unknown as Value)}\n\t\t\t\t\t/>\n\t\t\t\t);\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\t// PropDef にカスタムコンポーネントが指定されている場合はそれを使用\n\t\t\t\tif (component) {\n\t\t\t\t\tconst CustomComponent = component;\n\t\t\t\t\tconst primaryKey = Object.keys(defaultProps)[0] ?? kind;\n\t\t\t\t\tconst rawVal = getVal(primaryKey);\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<CustomComponent\n\t\t\t\t\t\t\tvalue={rawVal}\n\t\t\t\t\t\t\tonChange={(v) => onChange(primaryKey, v)}\n\t\t\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t\t\t/>\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\t// 未知の kind: 最初のキーを TextInput で表示\n\t\t\t\tconst primaryKey = Object.keys(defaultProps)[0] ?? kind;\n\t\t\t\tconst rawVal = getVal(primaryKey);\n\t\t\t\tconst strVal =\n\t\t\t\t\trawVal === null || rawVal === undefined\n\t\t\t\t\t\t? \"\"\n\t\t\t\t\t\t: typeof rawVal === \"object\"\n\t\t\t\t\t\t\t? JSON.stringify(rawVal)\n\t\t\t\t\t\t\t: String(rawVal);\n\t\t\t\treturn (\n\t\t\t\t\t<TextInput\n\t\t\t\t\t\tvalue={strVal}\n\t\t\t\t\t\tonChange={(v) => onChange(primaryKey, v ?? \"\")}\n\t\t\t\t\t/>\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t},\n);\n\nPropDefEditor.displayName = \"PropDefEditor\";\n\n/**\n * `PropDef` の種類に応じたプロパティ編集フィールドを描画するコンポーネント。\n *\n * @remarks\n * `PluginPanels` から各ブロックのプロパティを編集するために使用される。\n */\nexport const PropertyField = memo(\n\t({\n\t\tpropDef,\n\t\tselectedBlocks,\n\t\tonChange,\n\t\tonChangeBatch,\n\t\treadOnly,\n\t\tblockDefaults,\n\t\tonResetToDefault,\n\t}: PropertyFieldProps) => {\n\t\tconst { kind, defaultProps } = propDef;\n\t\tconst primaryBlock = selectedBlocks[0];\n\t\tconst blockKind = primaryBlock?.kind ?? \"\";\n\n\t\t// 現在値: block.props[key] > blockDefaults[blockKind][key] > defaultProps[key]\n\t\tconst getVal = (key: string): Value => {\n\t\t\tconst v = getCommonValue(selectedBlocks, `props.${key}`);\n\t\t\treturn v !== undefined\n\t\t\t\t? v\n\t\t\t\t: (blockDefaults?.[blockKind]?.[key] ?? defaultProps[key] ?? null);\n\t\t};\n\n\t\t// 個別設定が有効かどうか: ANY のキーが block.props に存在する\n\t\tconst isOverridden =\n\t\t\tprimaryBlock !== undefined &&\n\t\t\tObject.keys(defaultProps).some((k) => k in (primaryBlock?.props ?? {}));\n\n\t\tconst handleOpenChange = useCallback(\n\t\t\t(open: boolean) => {\n\t\t\t\tif (open) {\n\t\t\t\t\t// 全デフォルト値を1回のバッチ更新で書き込む(複数onChangeコール時の上書き問題を回避)\n\t\t\t\t\tconst defaults: Record<string, Value> = {};\n\t\t\t\t\tfor (const [k, v] of Object.entries(defaultProps)) {\n\t\t\t\t\t\tdefaults[k] = blockDefaults?.[blockKind]?.[k] ?? v;\n\t\t\t\t\t}\n\t\t\t\t\tif (onChangeBatch) {\n\t\t\t\t\t\tonChangeBatch(defaults);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfor (const [k, v] of Object.entries(defaults)) {\n\t\t\t\t\t\t\tonChange(k, v);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tonResetToDefault?.(Object.keys(defaultProps));\n\t\t\t\t}\n\t\t\t},\n\t\t\t[\n\t\t\t\tonChange,\n\t\t\t\tonChangeBatch,\n\t\t\t\tonResetToDefault,\n\t\t\t\tdefaultProps,\n\t\t\t\tblockDefaults,\n\t\t\t\tblockKind,\n\t\t\t],\n\t\t);\n\n\t\treturn (\n\t\t\t<CollapsibleSection\n\t\t\t\ttitle={KIND_TITLES[kind] ?? kind}\n\t\t\t\tcollapsible={true}\n\t\t\t\tisOpen={isOverridden}\n\t\t\t\tonOpenChange={handleOpenChange}\n\t\t\t\topenLabel=\"カスタム\"\n\t\t\t\tcloseLabel=\"標準\"\n\t\t\t>\n\t\t\t\t<PropDefEditor\n\t\t\t\t\tkind={kind}\n\t\t\t\t\tdefaultProps={defaultProps}\n\t\t\t\t\tgetVal={getVal}\n\t\t\t\t\tonChange={onChange}\n\t\t\t\t\tonChangeBatch={onChangeBatch}\n\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t\tcomponent={propDef.component}\n\t\t\t\t/>\n\t\t\t</CollapsibleSection>\n\t\t);\n\t},\n);\n\nPropertyField.displayName = \"PropertyField\";\n","import { CollapsibleSection } from \"../../../ui\";\nimport { PropertyField } from \"./PropertyField\";\n\nimport type React from \"react\";\nimport type { PluginRegistry } from \"../../../../plugin\";\nimport type { Block, Value } from \"../../../../types\";\nimport type { BlockDefaults } from \"../../../../types/schema\";\n\n/**\n * `PluginPanels` コンポーネントへの props。\n */\nexport interface PluginPanelsProps {\n\t/** 選択中のブロックの配列 */\n\tselectedBlocks: Block[];\n\n\t/** プラグインレジストリ */\n\tpluginRegistry: PluginRegistry;\n\n\t/** ブロック更新時のコールバック */\n\tonUpdateBlocks: (updates: Record<string, Partial<Block>>) => void;\n\n\t/** ブロックデフォルト設定 */\n\tblockDefaults?: BlockDefaults;\n\n\t/** `true` のときグループヘッダーを表示(デフォルト: `true`) */\n\tshowGroupHeader?: boolean;\n}\n\n/**\n * 選択ブロックのプラグイン固有属性パネルを表示するコンポーネント。\n *\n * @remarks\n * **Shell** — プラグインの `propDefs` に従ってプロパティフィールドを動的に表示する。\n */\nexport const PluginPanels: React.FC<PluginPanelsProps> = ({\n\tselectedBlocks,\n\tpluginRegistry,\n\tonUpdateBlocks,\n\tblockDefaults,\n\tshowGroupHeader = true,\n}) => {\n\tconst primaryBlock = selectedBlocks[0];\n\tconst plugin = primaryBlock ? pluginRegistry[primaryBlock.kind] : undefined;\n\n\tif (!primaryBlock || !plugin || selectedBlocks.length === 0) return null;\n\n\tconst handleChange = (key: string, value: Value) => {\n\t\tconst blockUpdates: Record<string, Partial<Block>> = {};\n\t\tselectedBlocks.forEach((block) => {\n\t\t\tblockUpdates[block.id] = {\n\t\t\t\tprops: { ...block.props, [key]: value },\n\t\t\t};\n\t\t});\n\t\tonUpdateBlocks(blockUpdates);\n\t};\n\n\tconst handleChangeBatch = (updates: Record<string, Value>) => {\n\t\tconst blockUpdates: Record<string, Partial<Block>> = {};\n\t\tselectedBlocks.forEach((block) => {\n\t\t\tblockUpdates[block.id] = {\n\t\t\t\tprops: { ...block.props, ...updates },\n\t\t\t};\n\t\t});\n\t\tonUpdateBlocks(blockUpdates);\n\t};\n\n\tconst handleResetToDefault = (keys: string[]) => {\n\t\tconst blockUpdates: Record<string, Partial<Block>> = {};\n\t\tselectedBlocks.forEach((block) => {\n\t\t\tconst newProps = { ...block.props };\n\t\t\tfor (const key of keys) {\n\t\t\t\tdelete newProps[key];\n\t\t\t}\n\t\t\tblockUpdates[block.id] = { props: newProps };\n\t\t});\n\t\tonUpdateBlocks(blockUpdates);\n\t};\n\n\tconst fields = plugin.properties.map((propDef) => (\n\t\t<PropertyField\n\t\t\tkey={propDef.kind}\n\t\t\tpropDef={propDef}\n\t\t\tselectedBlocks={selectedBlocks}\n\t\t\tonChange={handleChange}\n\t\t\tonChangeBatch={handleChangeBatch}\n\t\t\tblockDefaults={blockDefaults}\n\t\t\tonResetToDefault={handleResetToDefault}\n\t\t/>\n\t));\n\n\tif (plugin.properties.length === 0) return null;\n\n\tif (showGroupHeader) {\n\t\treturn (\n\t\t\t<CollapsibleSection title={plugin.meta.displayName}>\n\t\t\t\t{fields}\n\t\t\t</CollapsibleSection>\n\t\t);\n\t}\n\n\treturn <div>{fields}</div>;\n};\n\nPluginPanels.displayName = \"PluginPanels\";\n","import { IconActionButton } from \"../../ui/IconActionButton\";\n\nimport type { ReactNode } from \"react\";\n\n/**\n * `SelectionActionBarButton` コンポーネントへの props。\n */\nexport interface SelectionActionBarButtonProps {\n\t/** ボタン内に表示するアイコン(SVG コンポーネントや絵文字など) */\n\ticon: ReactNode;\n\n\t/** aria-label / title に使用するラベル */\n\tlabel: string;\n\n\t/** クリック時のコールバック */\n\tonClick?: () => void;\n\n\t/** マウスオーバー時のコールバック */\n\tonMouseEnter?: () => void;\n\n\t/** ツールチップに表示するテキスト(省略時は `label` を使用) */\n\ttitle?: string;\n\n\t/** `true` のときボタンを無効化 */\n\tdisabled?: boolean;\n}\n\n/**\n * `SelectionActionBar` の個別ボタン。バー以外の UI からも単体で使用可能。\n *\n * @remarks\n * **Shell** — `SelectionActionBar` の各ボタン。\n */\nexport const SelectionActionBarButton = ({\n\ticon,\n\tlabel,\n\tonClick,\n\tonMouseEnter,\n\ttitle,\n\tdisabled,\n}: SelectionActionBarButtonProps): ReactNode => {\n\treturn (\n\t\t<IconActionButton\n\t\t\ticon={icon}\n\t\t\tlabel={label}\n\t\t\ttitle={title}\n\t\t\tonClick={onClick}\n\t\t\tonMouseEnter={onMouseEnter}\n\t\t\tdisabled={disabled}\n\t\t\tpreventFocusOnMouseDown\n\t\t/>\n\t);\n};\n\nSelectionActionBarButton.displayName = \"SelectionActionBarButton\";\n","import {\n\tcreateContext,\n\tuseCallback,\n\tuseContext,\n\tuseEffect,\n\tuseRef,\n\tuseState,\n} from \"react\";\n\nimport styles from \"./SelectionActionBar.module.css\";\n\nimport type React from \"react\";\nimport type { ReactNode } from \"react\";\n\n/**\n * `SelectionActionBar` コンテキストで共有される値。\n */\nexport interface SelectionActionBarContextValue {\n\t/** 現在開いているパネルの ID */\n\topenPanel: string | null;\n\n\t/** ホバーでパネルを開く */\n\topenPanelByHover: (panelId: string) => void;\n\n\t/** クリックでパネルを開く */\n\topenPanelByClick: (panelId: string) => void;\n\n\t/** バー外のイベント用 pointer-down ハンドラ */\n\tonPointerDown?: React.PointerEventHandler<HTMLDivElement>;\n\n\t/** ポータルベースのポップオーバー描画用ターゲット要素 */\n\twrapperEl: HTMLDivElement | null;\n}\n\n/**\n * `SelectionActionBar` コンポーネントツリー内で共有されるコンテキスト。\n */\nexport const SelectionActionBarContext =\n\tcreateContext<SelectionActionBarContextValue | null>(null);\n\n/**\n * `SelectionActionBar` コンテキスト値を取得するフック。\n *\n * @remarks\n * **Shell** — `SelectionActionBar` の子コンポーネント内でのみ使用可能。\n *\n * バー外で呼び出すと `Error` をスローする。\n */\nexport function useSelectionActionBar(): SelectionActionBarContextValue {\n\tconst ctx = useContext(SelectionActionBarContext);\n\tif (ctx === null) {\n\t\tthrow new Error(\n\t\t\t\"useSelectionActionBar must be used inside SelectionActionBar\",\n\t\t);\n\t}\n\treturn ctx;\n}\n\n/**\n * `SelectionActionBar` コンポーネントへの props。\n */\nexport interface SelectionActionBarProps {\n\t/**\n\t * バーに表示するアイテムの配列(SelectionActionBarButton / SelectionActionBarPanel など)。\n\t * デフォルト値は `getDefaultSelectionActionBarItems()` で取得できる。\n\t */\n\titems?: ReactNode[];\n\n\t/** バールート要素への追加 CSS クラス */\n\tclassName?: string;\n\n\t/** バールート要素へのインラインスタイル */\n\tstyle?: React.CSSProperties;\n\n\t/** コンテキストに渡す pointer-down ハンドラ */\n\tonPointerDown?: React.PointerEventHandler<HTMLDivElement>;\n}\n\n/**\n * フローティングボタンバー + ポップオーバーフレームワークのコンテナ。\n *\n * @remarks\n * **Shell** — `items` 配列でボタン・パネルを渡す。デフォルト構成は `getDefaultSelectionActionBarItems()` で取得できる。\n */\nexport const SelectionActionBar = ({\n\titems = [],\n\tclassName,\n\tstyle,\n\tonPointerDown,\n}: SelectionActionBarProps) => {\n\tconst [openPanel, setOpenPanel] = useState<string | null>(null);\n\tconst [wrapperEl, setWrapperEl] = useState<HTMLDivElement | null>(null);\n\tconst closeTimerRef = useRef<number | null>(null);\n\n\tconst clearCloseTimer = useCallback(() => {\n\t\tif (closeTimerRef.current !== null) {\n\t\t\twindow.clearTimeout(closeTimerRef.current);\n\t\t\tcloseTimerRef.current = null;\n\t\t}\n\t}, []);\n\n\tconst handleWrapperMouseEnter = useCallback(() => {\n\t\tclearCloseTimer();\n\t}, [clearCloseTimer]);\n\n\tconst handleWrapperMouseLeave = useCallback(() => {\n\t\tclearCloseTimer();\n\t\tcloseTimerRef.current = window.setTimeout(() => {\n\t\t\tsetOpenPanel(null);\n\t\t}, 120);\n\t}, [clearCloseTimer]);\n\n\t// ポップオーバー外クリック時にパネルを閉じる\n\tuseEffect(() => {\n\t\tif (openPanel === null) return;\n\t\tconst handleMouseDown = (e: MouseEvent) => {\n\t\t\tif (wrapperEl && !wrapperEl.contains(e.target as Node)) {\n\t\t\t\tsetOpenPanel(null);\n\t\t\t}\n\t\t};\n\t\tdocument.addEventListener(\"mousedown\", handleMouseDown);\n\t\treturn () => document.removeEventListener(\"mousedown\", handleMouseDown);\n\t}, [openPanel, wrapperEl]);\n\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\tclearCloseTimer();\n\t\t};\n\t}, [clearCloseTimer]);\n\n\tconst openPanelByHover = useCallback(\n\t\t(panelId: string) => {\n\t\t\tclearCloseTimer();\n\t\t\tsetOpenPanel(panelId);\n\t\t},\n\t\t[clearCloseTimer],\n\t);\n\n\tconst openPanelByClick = useCallback(\n\t\t(panelId: string) => {\n\t\t\tclearCloseTimer();\n\t\t\tsetOpenPanel(panelId);\n\t\t},\n\t\t[clearCloseTimer],\n\t);\n\n\treturn (\n\t\t<SelectionActionBarContext.Provider\n\t\t\tvalue={{\n\t\t\t\topenPanel,\n\t\t\t\topenPanelByHover,\n\t\t\t\topenPanelByClick,\n\t\t\t\tonPointerDown,\n\t\t\t\twrapperEl,\n\t\t\t}}\n\t\t>\n\t\t\t<div\n\t\t\t\tref={setWrapperEl}\n\t\t\t\tclassName={styles.barWrapper}\n\t\t\t\tstyle={style}\n\t\t\t\tonMouseEnter={handleWrapperMouseEnter}\n\t\t\t\tonMouseLeave={handleWrapperMouseLeave}\n\t\t\t\tonPointerDown={onPointerDown}\n\t\t\t\trole=\"toolbar\"\n\t\t\t\taria-label=\"Selection Action Bar\"\n\t\t\t\tdata-testid=\"selection-action-bar\"\n\t\t\t>\n\t\t\t\t<div\n\t\t\t\t\tclassName={`${styles.bar}${className ? ` ${className}` : \"\"}`}\n\t\t\t\t\tonPointerDown={onPointerDown}\n\t\t\t\t>\n\t\t\t\t\t{items}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</SelectionActionBarContext.Provider>\n\t);\n};\n\nSelectionActionBar.displayName = \"SelectionActionBar\";\n","import { createPortal } from \"react-dom\";\n\nimport { useSelectionActionBar } from \"./SelectionActionBar\";\nimport styles from \"./SelectionActionBar.module.css\";\nimport { SelectionActionBarButton } from \"./SelectionActionBarButton\";\n\nimport type { ReactNode } from \"react\";\n\n/**\n * `SelectionActionBarPanel` コンポーネントへの props。\n */\nexport interface SelectionActionBarPanelProps {\n\t/** このパネルを一意に識別する ID */\n\tid: string;\n\n\t/** トリガーボタンのアイコン(SVG コンポーネントや絵文字など) */\n\ticon: ReactNode;\n\n\t/** トリガーボタンのラベル(aria-label) */\n\tlabel: string;\n\n\t/** ポップオーバーのコンテンツ */\n\tchildren: ReactNode;\n}\n\n/**\n * `SelectionActionBar` 内でポップオーバーパネルを1件管理するコンポーネント。\n *\n * @remarks\n * **Shell** — トリガーボタンはバー内に描画し、ポップオーバーはラッパー要素にポータル描画される。\n */\nexport const SelectionActionBarPanel = ({\n\tid,\n\ticon,\n\tlabel,\n\tchildren,\n}: SelectionActionBarPanelProps) => {\n\tconst {\n\t\topenPanel,\n\t\topenPanelByHover,\n\t\topenPanelByClick,\n\t\tonPointerDown,\n\t\twrapperEl,\n\t} = useSelectionActionBar();\n\n\tconst isOpen = openPanel === id;\n\n\treturn (\n\t\t<>\n\t\t\t<SelectionActionBarButton\n\t\t\t\ticon={icon}\n\t\t\t\tlabel={label}\n\t\t\t\tonMouseEnter={() => openPanelByHover(id)}\n\t\t\t\tonClick={() => openPanelByClick(id)}\n\t\t\t/>\n\t\t\t{isOpen &&\n\t\t\t\twrapperEl &&\n\t\t\t\tcreatePortal(\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={styles.popover}\n\t\t\t\t\t\tdata-testid={`popover-${id}`}\n\t\t\t\t\t\tonPointerDown={onPointerDown}\n\t\t\t\t\t>\n\t\t\t\t\t\t{children}\n\t\t\t\t\t</div>,\n\t\t\t\t\twrapperEl,\n\t\t\t\t)}\n\t\t</>\n\t);\n};\n\nSelectionActionBarPanel.displayName = \"SelectionActionBarPanel\";\n","import {\n\tBlockSettingsIcon,\n\tCopyIcon,\n\tDuplicateIcon,\n\tLayoutIcon,\n\tPasteIcon,\n\tStyleIcon,\n\tTrashIcon,\n} from \"../../../components/icons\";\nimport { getActionFeedback } from \"../../actionFeedback\";\nimport { BackgroundBorderPanel } from \"../../panels/BlockPropertyPanel/BasePanels/BackgroundBorderPanel\";\nimport { LayoutPanel } from \"../../panels/BlockPropertyPanel/BasePanels/LayoutPanel\";\nimport { PluginPanels } from \"../../panels/BlockPropertyPanel/PluginPanels\";\nimport styles from \"./SelectionActionBar.module.css\";\nimport { SelectionActionBarButton } from \"./SelectionActionBarButton\";\nimport { SelectionActionBarPanel } from \"./SelectionActionBarPanel\";\n\nimport type { ReactNode } from \"react\";\nimport type { NoteContext } from \"../../../contexts/useNoteContext\";\nimport type { Block } from \"../../../types/block\";\nimport type { ActionFeedback } from \"../../actionFeedback\";\n\n/**\n * `GetDefaultSelectionActionBarItemsOptions` のオプション。\n *\n * @remarks\n * **Shell** — `getDefaultSelectionActionBarItems()` の引数型。\n */\nexport interface GetDefaultSelectionActionBarItemsOptions {\n\t/** NoteContext(`useNoteContext` が返すコンテキスト) */\n\tcontext: NoteContext;\n\n\t/** グリッドサイズ(レイアウトパネルに使用) */\n\tgridSize?: { cols: number; rows: number };\n\n\t/** アクション実行時のフィードバック(トースト表示など) */\n\tonActionFeedback?: (feedback: ActionFeedback) => void;\n}\n\n/**\n * `SelectionActionBar` に渡すデフォルト items 配列を返す。\n *\n * @remarks\n * **Shell** — 各要素には `key` が付いているため `filter` / `map` でプログラマブルに操作できる。\n *\n * @example\n * ```tsx\n * const items = getDefaultSelectionActionBarItems({ context });\n * // 削除ボタンを除外\n * <SelectionActionBar items={items.filter((i) => i.key !== \"delete\")} />\n * ```\n */\nexport function getDefaultSelectionActionBarItems({\n\tcontext,\n\tgridSize,\n\tonActionFeedback,\n}: GetDefaultSelectionActionBarItemsOptions): ReactNode[] {\n\tconst { actionContext, pluginRegistry } = context;\n\tconst editorState = context.editorState;\n\tconst selectedBlockIds = editorState.selectedBlockIds ?? [];\n\tconst hasCopied = actionContext.isEnabled(\"paste\");\n\tconst pageIdx = editorState.pageIdx;\n\tconst selectedBlocks = (context.book.pages[pageIdx]?.blocks ?? []).filter(\n\t\t(b) => selectedBlockIds.includes(b.id),\n\t);\n\n\tconst hasSelection = selectedBlockIds.length > 0;\n\tconst canPanel = selectedBlocks.length > 0;\n\tconst canPlugin = canPanel && Object.keys(pluginRegistry).length > 0;\n\tconst onUpdateBlocks = (\n\t\tupdates: Record<string, Partial<Block>>,\n\t\toptions?: { mergeKey?: string },\n\t) => actionContext.execute(\"updateBlocks\", { updates, options });\n\n\tconst runWithFeedback = (actionId: string, fn: () => void) => {\n\t\tfn();\n\t\tconst feedback = getActionFeedback(actionId);\n\t\tif (feedback) {\n\t\t\tonActionFeedback?.(feedback);\n\t\t}\n\t};\n\n\tconst items: ReactNode[] = [\n\t\t<SelectionActionBarButton\n\t\t\tkey=\"delete\"\n\t\t\ticon={<TrashIcon aria-hidden=\"true\" />}\n\t\t\tlabel=\"選択を削除\"\n\t\t\ttitle=\"削除 (Delete / Backspace)\"\n\t\t\tonClick={() =>\n\t\t\t\trunWithFeedback(\"delete\", () => actionContext.execute(\"delete\"))\n\t\t\t}\n\t\t\tdisabled={!hasSelection}\n\t\t/>,\n\t\t<SelectionActionBarButton\n\t\t\tkey=\"copy\"\n\t\t\ticon={<CopyIcon aria-hidden=\"true\" />}\n\t\t\tlabel=\"選択をコピー\"\n\t\t\ttitle=\"コピー (Ctrl+C / Cmd+C)\"\n\t\t\tonClick={() =>\n\t\t\t\trunWithFeedback(\"copy\", () => actionContext.execute(\"copy\"))\n\t\t\t}\n\t\t\tdisabled={!hasSelection}\n\t\t/>,\n\t\t<SelectionActionBarButton\n\t\t\tkey=\"duplicate\"\n\t\t\ticon={<DuplicateIcon aria-hidden=\"true\" />}\n\t\t\tlabel=\"選択を複製\"\n\t\t\ttitle=\"複製 (Ctrl+D / Cmd+D)\"\n\t\t\tonClick={() =>\n\t\t\t\trunWithFeedback(\"duplicate\", () => actionContext.execute(\"duplicate\"))\n\t\t\t}\n\t\t\tdisabled={!hasSelection}\n\t\t/>,\n\t\t<div key=\"divider-paste\" className={styles.divider} aria-hidden=\"true\" />,\n\t\t<SelectionActionBarButton\n\t\t\tkey=\"paste\"\n\t\t\ticon={<PasteIcon aria-hidden=\"true\" />}\n\t\t\tlabel=\"貼り付け\"\n\t\t\ttitle=\"貼り付け (Ctrl+V / Cmd+V)\"\n\t\t\tonClick={() =>\n\t\t\t\trunWithFeedback(\"paste\", () => actionContext.execute(\"paste\"))\n\t\t\t}\n\t\t\tdisabled={!hasCopied}\n\t\t/>,\n\t];\n\n\tif (canPanel || canPlugin) {\n\t\titems.push(\n\t\t\t<div\n\t\t\t\tkey=\"divider-panels\"\n\t\t\t\tclassName={styles.divider}\n\t\t\t\taria-hidden=\"true\"\n\t\t\t/>,\n\t\t);\n\t}\n\n\tif (canPanel) {\n\t\titems.push(\n\t\t\t<SelectionActionBarPanel\n\t\t\t\tkey=\"style\"\n\t\t\t\tid=\"style\"\n\t\t\t\ticon={<StyleIcon aria-hidden=\"true\" />}\n\t\t\t\tlabel=\"スタイル設定\"\n\t\t\t>\n\t\t\t\t<BackgroundBorderPanel\n\t\t\t\t\tselectedBlocks={selectedBlocks}\n\t\t\t\t\tonUpdateBlocks={onUpdateBlocks}\n\t\t\t\t/>\n\t\t\t</SelectionActionBarPanel>,\n\t\t\t<SelectionActionBarPanel\n\t\t\t\tkey=\"layout\"\n\t\t\t\tid=\"layout\"\n\t\t\t\ticon={<LayoutIcon aria-hidden=\"true\" />}\n\t\t\t\tlabel=\"レイアウト設定\"\n\t\t\t>\n\t\t\t\t<LayoutPanel\n\t\t\t\t\tselectedBlocks={selectedBlocks}\n\t\t\t\t\tonUpdateBlocks={onUpdateBlocks}\n\t\t\t\t\tgridSize={gridSize}\n\t\t\t\t/>\n\t\t\t</SelectionActionBarPanel>,\n\t\t);\n\t}\n\n\tif (canPlugin) {\n\t\titems.push(\n\t\t\t<SelectionActionBarPanel\n\t\t\t\tkey=\"plugin\"\n\t\t\t\tid=\"plugin\"\n\t\t\t\ticon={<BlockSettingsIcon aria-hidden=\"true\" />}\n\t\t\t\tlabel=\"ブロック設定\"\n\t\t\t>\n\t\t\t\t<PluginPanels\n\t\t\t\t\tselectedBlocks={selectedBlocks}\n\t\t\t\t\tpluginRegistry={pluginRegistry}\n\t\t\t\t\tonUpdateBlocks={onUpdateBlocks}\n\t\t\t\t\tshowGroupHeader={false}\n\t\t\t\t/>\n\t\t\t</SelectionActionBarPanel>,\n\t\t);\n\t}\n\n\treturn items;\n}\n","import { Z_INDEX } from \"../../../utils/zIndex\";\n\nimport type { ReactNode } from \"react\";\nimport type { SelectionBoundingBox } from \"./useSelectionBoundingBox\";\n\n// バーとブロック選択領域の間の余白 (px)\nconst BAR_MARGIN = 8;\n// バーの想定高さ (px)。上端配置の位置計算に使用\nconst BAR_HEIGHT = 36;\n\n/**\n * `SelectionActionBarOverlay` コンポーネントへの props。\n */\nexport interface SelectionActionBarOverlayProps {\n\t/**\n\t * 選択ブロック群の bounding box(px座標)。\n\t *\n\t * `useSelectionBoundingBox` で算出して渡す。`null` の場合は非表示。\n\t */\n\tselectionBoundingBox?: SelectionBoundingBox | null;\n\n\t/** ドラッグ中のとき `true` を渡すと非表示になる */\n\tisDragging?: boolean;\n\n\t/** z-index(デフォルト: `Z_INDEX.SELECTION_ACTION_BAR`) */\n\tzIndex?: number;\n\n\t/** オーバーレイ内に描画するコンテンツ */\n\tchildren?: ReactNode;\n}\n\n/**\n * `selectionBoundingBox` の右上コーナーの右上に `children` を浮かせるコンテナ。\n *\n * @remarks\n * **Shell** — `isDragging=true` または `selectionBoundingBox` が `null` の場合は何も描画しない。\n *\n * 配置ルール: 水平はバーの右端を `bbox.right` に揃える。垂直はブロック上に表示し上端がキャンバス外の場合はブロック下に反転。\n */\nexport const SelectionActionBarOverlay = ({\n\tselectionBoundingBox,\n\tisDragging,\n\tzIndex = Z_INDEX.SELECTION_ACTION_BAR,\n\tchildren,\n}: SelectionActionBarOverlayProps) => {\n\tif (selectionBoundingBox == null || isDragging) {\n\t\treturn null;\n\t}\n\n\tconst bbox = selectionBoundingBox;\n\n\t// 上に配置。上端がキャンバス外(< 0)になる場合はブロック下に反転\n\tconst barTopAbove = bbox.top - BAR_MARGIN - BAR_HEIGHT;\n\tconst barTop = barTopAbove >= 0 ? barTopAbove : bbox.bottom + BAR_MARGIN;\n\n\tconst overlayStyle: React.CSSProperties = {\n\t\tposition: \"absolute\",\n\t\tinset: 0,\n\t\tpointerEvents: \"none\",\n\t\tzIndex,\n\t};\n\n\tconst barStyle: React.CSSProperties = {\n\t\tposition: \"absolute\",\n\t\ttop: `${barTop}px`,\n\t\t// バーの右端を bbox.right に揃える。translateX(-100%) でバー幅分だけ左にずらす\n\t\tleft: `${bbox.right}px`,\n\t\ttransform: \"translateX(-100%)\",\n\t\tpointerEvents: \"auto\",\n\t};\n\n\treturn (\n\t\t<div\n\t\t\tstyle={overlayStyle}\n\t\t\tdata-testid=\"selection-action-bar-overlay\"\n\t\t\tdata-selection-action-bar=\"true\"\n\t\t>\n\t\t\t<div\n\t\t\t\tstyle={barStyle}\n\t\t\t\tonPointerDown={(e) => e.stopPropagation()}\n\t\t\t\tdata-testid=\"selection-action-bar-container\"\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import { type RefObject, useEffect, useState } from \"react\";\n\nimport type { SelectionBoundingBox } from \"./useSelectionBoundingBox\";\n\n/**\n * 選択中ブロックの bounding box をコンテナ相対 px 座標で返すフック。\n *\n * @remarks\n * **Shell** — `position: relative` なコンテナ内に `<Note>` と `<DefaultSelectionActionBarOverlay>` を並べる構成で使用する。\n *\n * 「いつ再計測するか」は呼び出し側の責任。ブロックの座標変化時にも再計測したい場合は、\n * `selectedBlockIds` に新しい配列参照を渡すこと。\n *\n * @example\n * ```tsx\n * const containerRef = useRef<HTMLDivElement>(null);\n * const selectionBoundingBox = useSelectionBounds(containerRef, selectedBlockIds);\n * ```\n *\n * @param containerRef - Note を包む `position: relative` なコンテナの ref\n * @param selectedBlockIds - 選択中のブロック ID 一覧(再計測が必要なときは新しい配列参照を渡すこと)\n * @returns 選択範囲の bounding box。選択なし・要素未発見時は null\n */\nexport function useSelectionBounds(\n\tcontainerRef: RefObject<HTMLElement | null>,\n\tselectedBlockIds: string[],\n): SelectionBoundingBox | null {\n\tconst [bounds, setBounds] = useState<SelectionBoundingBox | null>(null);\n\n\tuseEffect(() => {\n\t\tif (selectedBlockIds.length === 0) {\n\t\t\tsetBounds(null);\n\t\t\treturn;\n\t\t}\n\n\t\t// React レンダリング後に DOM 計測するため requestAnimationFrame を使用\n\t\tconst rafId = requestAnimationFrame(() => {\n\t\t\tconst container = containerRef.current;\n\t\t\tif (!container) {\n\t\t\t\tsetBounds(null);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst containerRect = container.getBoundingClientRect();\n\t\t\tlet minLeft = Infinity;\n\t\t\tlet minTop = Infinity;\n\t\t\tlet maxRight = -Infinity;\n\t\t\tlet maxBottom = -Infinity;\n\t\t\tlet found = false;\n\n\t\t\tfor (const id of selectedBlockIds) {\n\t\t\t\tconst el = container.querySelector(`[data-block-id=\"${id}\"]`);\n\t\t\t\tif (!el) continue;\n\t\t\t\tconst rect = el.getBoundingClientRect();\n\t\t\t\tminLeft = Math.min(minLeft, rect.left - containerRect.left);\n\t\t\t\tminTop = Math.min(minTop, rect.top - containerRect.top);\n\t\t\t\tmaxRight = Math.max(maxRight, rect.right - containerRect.left);\n\t\t\t\tmaxBottom = Math.max(maxBottom, rect.bottom - containerRect.top);\n\t\t\t\tfound = true;\n\t\t\t}\n\n\t\t\tif (!found) {\n\t\t\t\tsetBounds(null);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsetBounds({\n\t\t\t\tleft: minLeft,\n\t\t\t\ttop: minTop,\n\t\t\t\tright: maxRight,\n\t\t\t\tbottom: maxBottom,\n\t\t\t\twidth: maxRight - minLeft,\n\t\t\t\theight: maxBottom - minTop,\n\t\t\t});\n\t\t});\n\n\t\treturn () => cancelAnimationFrame(rafId);\n\t}, [containerRef, selectedBlockIds]);\n\n\treturn bounds;\n}\n","import { useEffect, useState } from \"react\";\n\nimport { Checkbox, TextInput } from \"../../../../ui\";\nimport { getCommonValue } from \"../../../utils/getCommonValue\";\nimport styles from \"./MetaPanel.module.css\";\n\nimport type React from \"react\";\nimport type { Block } from \"../../../../../types/block\";\n\n/**\n * `MetaPanel` コンポーネントへの props。\n */\nexport interface MetaPanelProps {\n\t/** 選択中のブロックの配列 */\n\tselectedBlocks: Block[];\n\n\t/** ブロック更新時のコールバック */\n\tonUpdateBlocks: (updates: Record<string, Partial<Block>>) => void;\n\n\t/** 全ブロックの ID セット(重複チェックに使用) */\n\tallBlockIds?: Set<string>;\n}\n\nfunction validateBlockId(\n\tvalue: string,\n\tcurrentId: string,\n\tallBlockIds?: Set<string>,\n): string | null {\n\tconst trimmed = value.trim();\n\tif (!trimmed) return \"IDを入力してください\";\n\tif (/\\s/.test(trimmed)) return \"スペースは使用できません\";\n\tif (trimmed !== currentId && allBlockIds?.has(trimmed))\n\t\treturn \"このIDは既に使用されています\";\n\treturn null;\n}\n\n/**\n * ブロックの ID と非表示設定を編集するパネル。\n *\n * @remarks\n * **Shell** — ID の重複チェックおよびバリデーションを含む。\n */\nexport const MetaPanel: React.FC<MetaPanelProps> = ({\n\tselectedBlocks,\n\tonUpdateBlocks,\n\tallBlockIds,\n}) => {\n\tconst [localId, setLocalId] = useState(\"\");\n\tconst [idError, setIdError] = useState<string | null>(null);\n\n\tconst primaryBlock = selectedBlocks[0];\n\n\tuseEffect(() => {\n\t\tif (selectedBlocks.length === 1 && primaryBlock) {\n\t\t\tsetLocalId(primaryBlock.id);\n\t\t\tsetIdError(null);\n\t\t}\n\t}, [selectedBlocks, primaryBlock]);\n\n\tconst handleIdBlur = () => {\n\t\tif (!primaryBlock) return;\n\t\tconst currentId = primaryBlock.id;\n\t\tconst newId = localId.trim();\n\t\tif (newId === currentId || !newId) {\n\t\t\tsetLocalId(currentId);\n\t\t\tsetIdError(null);\n\t\t\treturn;\n\t\t}\n\t\tconst error = validateBlockId(newId, currentId, allBlockIds);\n\t\tif (error) {\n\t\t\tsetLocalId(currentId);\n\t\t\tsetIdError(null);\n\t\t\treturn;\n\t\t}\n\t\tonUpdateBlocks({ [currentId]: { id: newId } });\n\t};\n\n\tconst handleIdChange = (val: string | undefined) => {\n\t\tconst newVal = val ?? \"\";\n\t\tsetLocalId(newVal);\n\t\tif (primaryBlock) {\n\t\t\tsetIdError(validateBlockId(newVal, primaryBlock.id, allBlockIds));\n\t\t}\n\t};\n\n\tconst handleReadOnlyChange = (val: boolean | undefined) => {\n\t\tconst updates: Record<string, Partial<Block>> = {};\n\t\tselectedBlocks.forEach((b) => {\n\t\t\tupdates[b.id] = {\n\t\t\t\tbehavior: { ...b.behavior, readOnly: !!val || undefined },\n\t\t\t};\n\t\t});\n\t\tonUpdateBlocks(updates);\n\t};\n\n\tconst handleHeightFitChange = (val: boolean | undefined) => {\n\t\tconst updates: Record<string, Partial<Block>> = {};\n\t\tselectedBlocks.forEach((b) => {\n\t\t\tupdates[b.id] = {\n\t\t\t\tbehavior: { ...b.behavior, heightFit: val || undefined },\n\t\t\t};\n\t\t});\n\t\tonUpdateBlocks(updates);\n\t};\n\n\tconst handleWidthFitChange = (val: boolean | undefined) => {\n\t\tconst updates: Record<string, Partial<Block>> = {};\n\t\tselectedBlocks.forEach((b) => {\n\t\t\tupdates[b.id] = {\n\t\t\t\tbehavior: { ...b.behavior, widthFit: val || undefined },\n\t\t\t};\n\t\t});\n\t\tonUpdateBlocks(updates);\n\t};\n\n\treturn (\n\t\t<div className={styles.container}>\n\t\t\t{selectedBlocks.length === 1 && (\n\t\t\t\t<div className={styles.row}>\n\t\t\t\t\t<span className={styles.label}>ID</span>\n\t\t\t\t\t<div className={styles.inputWrapper}>\n\t\t\t\t\t\t<TextInput\n\t\t\t\t\t\t\tvalue={localId}\n\t\t\t\t\t\t\tonChange={handleIdChange}\n\t\t\t\t\t\t\tonBlur={handleIdBlur}\n\t\t\t\t\t\t\tplaceholder=\"IDを入力\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t{idError && <span className={styles.error}>{idError}</span>}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t{selectedBlocks.length > 0 && (\n\t\t\t\t<div className={styles.row}>\n\t\t\t\t\t<div className={styles.inputWrapper}>\n\t\t\t\t\t\t<Checkbox\n\t\t\t\t\t\t\tlabel=\"読み取り専用\"\n\t\t\t\t\t\t\tvalue={!!getCommonValue(selectedBlocks, \"behavior.readOnly\")}\n\t\t\t\t\t\t\tonChange={handleReadOnlyChange}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t{selectedBlocks.length > 0 && (\n\t\t\t\t<div className={styles.row}>\n\t\t\t\t\t<div className={styles.inputWrapper}>\n\t\t\t\t\t\t<Checkbox\n\t\t\t\t\t\t\tlabel=\"高さ自動フィット\"\n\t\t\t\t\t\t\tvalue={!!getCommonValue(selectedBlocks, \"behavior.heightFit\")}\n\t\t\t\t\t\t\tonChange={handleHeightFitChange}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t{selectedBlocks.length > 0 && (\n\t\t\t\t<div className={styles.row}>\n\t\t\t\t\t<div className={styles.inputWrapper}>\n\t\t\t\t\t\t<Checkbox\n\t\t\t\t\t\t\tlabel=\"幅自動フィット\"\n\t\t\t\t\t\t\tvalue={!!getCommonValue(selectedBlocks, \"behavior.widthFit\")}\n\t\t\t\t\t\t\tonChange={handleWidthFitChange}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n};\n\nMetaPanel.displayName = \"MetaPanel\";\n","import styles from \"./BlockPropertyPanel.module.css\";\n\nimport type { ReactNode } from \"react\";\n\n/**\n * `BlockPropertyPanel` コンポーネントへの props。\n */\nexport interface BlockPropertyPanelProps {\n\t/** パネルのコンテンツ */\n\tchildren?: ReactNode;\n\n\t/** カスタムクラス名 */\n\tclassName?: string;\n}\n\n/**\n * ブロックプロパティパネルの純粹なコンテナ。レイアウトシェルのみを提供する。\n *\n * @remarks\n * **Shell** — ビジネスロジックを含む実装は `DefaultBlockPropertyPanel` を使用してください。\n */\nexport const BlockPropertyPanel = ({\n\tchildren,\n\tclassName = \"\",\n}: BlockPropertyPanelProps) => (\n\t<div className={`${styles.container}${className ? ` ${className}` : \"\"}`}>\n\t\t{children}\n\t</div>\n);\n\nBlockPropertyPanel.displayName = \"BlockPropertyPanel\";\n","import { memo, useMemo } from \"react\";\n\nimport { CollapsibleSection } from \"../../ui\";\nimport { BackgroundBorderPanel, LayoutPanel, MetaPanel } from \"./BasePanels\";\nimport { BlockPropertyPanel } from \"./BlockPropertyPanel\";\nimport styles from \"./BlockPropertyPanel.module.css\";\nimport { PluginPanels } from \"./PluginPanels\";\n\nimport type { NoteContext } from \"../../../contexts/useNoteContext\";\nimport type { Block } from \"../../../types/block\";\n\n/**\n * `DefaultBlockPropertyPanel` コンポーネントへの props。\n */\nexport interface DefaultBlockPropertyPanelProps {\n\t/** NoteContext(`useNoteContext` が返すコンテキスト) */\n\tcontext: NoteContext;\n\n\t/** グリッドサイズ(レイアウトパネルに渡す) */\n\tgridSize?: { cols: number; rows: number };\n\n\t/** カスタムクラス名 */\n\tclassName?: string;\n}\n\n/**\n * 選択ブロックのプロパティを編集するコンポーネントのデフォルト実装。\n *\n * @remarks\n * **Shell** — レイアウト・背景・枠線・メタ情報・プラグインプロパティパネルを内包する。\n */\nexport const DefaultBlockPropertyPanel = memo(\n\t({ context, gridSize, className = \"\" }: DefaultBlockPropertyPanelProps) => {\n\t\tconst { pluginRegistry, actionContext } = context;\n\t\tconst pageIdx = context.editorState.pageIdx;\n\t\tconst page = context.book.pages[pageIdx];\n\t\tconst selectedBlockIds = context.editorState.selectedBlockIds ?? [];\n\t\tconst selectedBlocks =\n\t\t\tpage?.blocks.filter((b) => selectedBlockIds.includes(b.id)) ?? [];\n\t\tconst blockDefaults = page?.blockDefaults;\n\t\tconst onUpdateBlocks = (\n\t\t\tupdates: Record<string, Partial<Block>>,\n\t\t\toptions?: { mergeKey?: string },\n\t\t) => actionContext.execute(\"updateBlocks\", { updates, options });\n\t\tconst allBlockIds = new Set(page?.blocks.map((b) => b.id) ?? []);\n\t\tconst primaryBlock = selectedBlocks[0];\n\t\tconst plugin = primaryBlock ? pluginRegistry[primaryBlock.kind] : undefined;\n\n\t\tconst allSameKind = useMemo(() => {\n\t\t\tif (selectedBlocks.length === 0) return false;\n\t\t\tconst firstKind = selectedBlocks[0]?.kind;\n\t\t\treturn selectedBlocks.every((block) => block.kind === firstKind);\n\t\t}, [selectedBlocks]);\n\n\t\tif (selectedBlocks.length === 0) {\n\t\t\treturn (\n\t\t\t\t<BlockPropertyPanel className={className}>\n\t\t\t\t\t<div className={styles.emptyState}>\n\t\t\t\t\t\tブロックを選択すると\n\t\t\t\t\t\t<br />\n\t\t\t\t\t\tプロパティが表示されます\n\t\t\t\t\t</div>\n\t\t\t\t</BlockPropertyPanel>\n\t\t\t);\n\t\t}\n\n\t\treturn (\n\t\t\t<BlockPropertyPanel className={className}>\n\t\t\t\t<div className={styles.scrollArea}>\n\t\t\t\t\t<CollapsibleSection\n\t\t\t\t\t\ttitle=\"配置・サイズ\"\n\t\t\t\t\t\tdescription=\"ブロックの位置(X・Y座標)と大きさ(幅・高さ)をグリッド単位で設定します\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<LayoutPanel\n\t\t\t\t\t\t\tselectedBlocks={selectedBlocks}\n\t\t\t\t\t\t\tonUpdateBlocks={onUpdateBlocks}\n\t\t\t\t\t\t\tgridSize={gridSize}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</CollapsibleSection>\n\n\t\t\t\t\t<CollapsibleSection\n\t\t\t\t\t\ttitle=\"背景・枠線\"\n\t\t\t\t\t\tdescription=\"ブロックの背景色と枠線(線の種類・色・太さ)を設定します\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<BackgroundBorderPanel\n\t\t\t\t\t\t\tselectedBlocks={selectedBlocks}\n\t\t\t\t\t\t\tonUpdateBlocks={onUpdateBlocks}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</CollapsibleSection>\n\n\t\t\t\t\t{plugin && allSameKind && plugin.properties.length > 0 && (\n\t\t\t\t\t\t<PluginPanels\n\t\t\t\t\t\t\tselectedBlocks={selectedBlocks}\n\t\t\t\t\t\t\tpluginRegistry={pluginRegistry}\n\t\t\t\t\t\t\tonUpdateBlocks={onUpdateBlocks}\n\t\t\t\t\t\t\tblockDefaults={blockDefaults}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\n\t\t\t\t\t<CollapsibleSection\n\t\t\t\t\t\ttitle=\"基本設定\"\n\t\t\t\t\t\tdescription=\"ブロックのID(識別子)や読み取り専用にするかどうかなど、動作に関わる設定をします\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<MetaPanel\n\t\t\t\t\t\t\tselectedBlocks={selectedBlocks}\n\t\t\t\t\t\t\tonUpdateBlocks={onUpdateBlocks}\n\t\t\t\t\t\t\tallBlockIds={allBlockIds}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</CollapsibleSection>\n\t\t\t\t</div>\n\t\t\t</BlockPropertyPanel>\n\t\t);\n\t},\n);\n\nDefaultBlockPropertyPanel.displayName = \"DefaultBlockPropertyPanel\";\n","import { memo, useCallback, useState } from \"react\";\n\nimport { CollapsibleSection } from \"../../../ui\";\nimport {\n\tKIND_TITLES,\n\tPropDefEditor,\n} from \"../../BlockPropertyPanel/PluginPanels/PropertyField\";\nimport styles from \"./BlockDefaultsPanel.module.css\";\n\nimport type { PluginRegistry, PropDef } from \"../../../../plugin\";\nimport type { Value } from \"../../../../types\";\nimport type { BlockDefaults } from \"../../../../types/schema\";\n\n/**\n * `BlockDefaultsPanel` コンポーネントへの props。\n */\nexport interface BlockDefaultsPanelProps {\n\t/** 現在のブロックデフォルト設定 */\n\tblockDefaults: BlockDefaults;\n\n\t/** プラグインレジストリ(全プラグイン情報) */\n\tpluginRegistry: PluginRegistry;\n\n\t/** デフォルト値変更時のコールバック */\n\tonChange: (newBlockDefaults: BlockDefaults) => void;\n}\n\n// 1つの PropDef に対応するデフォルト値編集行(内部コンポーネント)\nconst DefaultsPropField = memo(\n\t({\n\t\tpropDef,\n\t\tkindDefaults,\n\t\tonKindDefaultsChange,\n\t}: {\n\t\tpropDef: PropDef;\n\t\tkindDefaults: Record<string, Value>;\n\t\tonKindDefaultsChange: (newKindDefaults: Record<string, Value>) => void;\n\t}) => {\n\t\tconst { kind, defaultProps } = propDef;\n\n\t\t// 一つでもキーが kindDefaults に存在すれば「カスタム」状態\n\t\tconst isOpen = Object.keys(defaultProps).some((k) => k in kindDefaults);\n\n\t\tconst getVal = (key: string): Value =>\n\t\t\tkindDefaults[key] ?? defaultProps[key] ?? null;\n\n\t\tconst handleChange = (key: string, value: Value) =>\n\t\t\tonKindDefaultsChange({ ...kindDefaults, [key]: value });\n\n\t\tconst handleOpenChange = (open: boolean) => {\n\t\t\tif (open) {\n\t\t\t\t// 全キーを一括書き込み(既存カスタム値を優先)\n\t\t\t\tconst merged = { ...kindDefaults };\n\t\t\t\tfor (const [k, v] of Object.entries(defaultProps)) {\n\t\t\t\t\tmerged[k] = kindDefaults[k] ?? v;\n\t\t\t\t}\n\t\t\t\tonKindDefaultsChange(merged);\n\t\t\t} else {\n\t\t\t\t// 全キーを一括削除\n\t\t\t\tconst pruned = { ...kindDefaults };\n\t\t\t\tfor (const k of Object.keys(defaultProps)) {\n\t\t\t\t\tdelete pruned[k];\n\t\t\t\t}\n\t\t\t\tonKindDefaultsChange(pruned);\n\t\t\t}\n\t\t};\n\n\t\treturn (\n\t\t\t<CollapsibleSection\n\t\t\t\ttitle={KIND_TITLES[kind] ?? kind}\n\t\t\t\tcollapsible={true}\n\t\t\t\tisOpen={isOpen}\n\t\t\t\tonOpenChange={handleOpenChange}\n\t\t\t\topenLabel=\"カスタム\"\n\t\t\t\tcloseLabel=\"標準\"\n\t\t\t>\n\t\t\t\t<PropDefEditor\n\t\t\t\t\tkind={kind}\n\t\t\t\t\tdefaultProps={defaultProps}\n\t\t\t\t\tgetVal={getVal}\n\t\t\t\t\tonChange={handleChange}\n\t\t\t\t/>\n\t\t\t</CollapsibleSection>\n\t\t);\n\t},\n);\n\nDefaultsPropField.displayName = \"DefaultsPropField\";\n\n/**\n * ブロック種類ごとのデフォルトプロパティ設定パネル。\n *\n * @remarks\n * **Shell** — `DefaultCanvasPanel` 内で使用される。\n */\nexport const BlockDefaultsPanel = memo(\n\t({ blockDefaults, pluginRegistry, onChange }: BlockDefaultsPanelProps) => {\n\t\tconst pluginKinds = Object.keys(pluginRegistry);\n\n\t\t// 選択中のプラグイン種類\n\t\tconst [selectedKind, setSelectedKind] = useState<string>(\n\t\t\tpluginKinds[0] ?? \"\",\n\t\t);\n\n\t\tconst plugin = selectedKind ? pluginRegistry[selectedKind] : undefined;\n\n\t\tconst handleKindDefaultsChange = useCallback(\n\t\t\t(newKindDefaults: Record<string, Value>) => {\n\t\t\t\tconst newBlockDefaults = { ...blockDefaults };\n\t\t\t\tif (Object.keys(newKindDefaults).length === 0) {\n\t\t\t\t\tdelete newBlockDefaults[selectedKind];\n\t\t\t\t} else {\n\t\t\t\t\tnewBlockDefaults[selectedKind] = newKindDefaults;\n\t\t\t\t}\n\t\t\t\tonChange(newBlockDefaults);\n\t\t\t},\n\t\t\t[blockDefaults, selectedKind, onChange],\n\t\t);\n\n\t\tif (pluginKinds.length === 0) {\n\t\t\treturn (\n\t\t\t\t<div className={styles.emptyState}>プラグインが登録されていません</div>\n\t\t\t);\n\t\t}\n\n\t\treturn (\n\t\t\t<CollapsibleSection\n\t\t\t\ttitle=\"ブロック共通デフォルト\"\n\t\t\t\tcollapsible\n\t\t\t\tnoPadding\n\t\t\t\tdescription=\"各ブロック種類に共通して適用されるデフォルト値です\"\n\t\t\t>\n\t\t\t\t{/* プラグイン種類の選択タブ */}\n\t\t\t\t<div className={styles.kindSelector}>\n\t\t\t\t\t{pluginKinds.map((kind) => {\n\t\t\t\t\t\tconst p = pluginRegistry[kind];\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tkey={kind}\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclassName={`${styles.kindTab} ${selectedKind === kind ? styles.kindTabActive : \"\"}`}\n\t\t\t\t\t\t\t\tonClick={() => setSelectedKind(kind)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{p?.meta.displayName ?? kind}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t);\n\t\t\t\t\t})}\n\t\t\t\t</div>\n\n\t\t\t\t{/* 選択中プラグインの PropDef 一覧 */}\n\t\t\t\t{plugin && (\n\t\t\t\t\t<div className={styles.propertyList}>\n\t\t\t\t\t\t{plugin.properties.length === 0 ? (\n\t\t\t\t\t\t\t<div className={styles.emptyState}>\n\t\t\t\t\t\t\t\tカスタマイズ可能なプロパティがありません\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\tplugin.properties.map((propDef: PropDef) => (\n\t\t\t\t\t\t\t\t<DefaultsPropField\n\t\t\t\t\t\t\t\t\tkey={propDef.kind}\n\t\t\t\t\t\t\t\t\tpropDef={propDef}\n\t\t\t\t\t\t\t\t\tkindDefaults={\n\t\t\t\t\t\t\t\t\t\t(blockDefaults[selectedKind] ?? {}) as Record<string, Value>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tonKindDefaultsChange={handleKindDefaultsChange}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t))\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</CollapsibleSection>\n\t\t);\n\t},\n);\n\nBlockDefaultsPanel.displayName = \"BlockDefaultsPanel\";\n","import { useCallback, useMemo, useRef, useState } from \"react\";\n\nimport { CollapsibleSection } from \"../../../ui\";\nimport styles from \"./BlockOrderPanel.module.css\";\n\nimport type { Block } from \"../../../../types/block\";\n\n/**\n * `BlockOrderPanel` コンポーネントへの props。\n */\nexport interface BlockOrderPanelProps {\n\t/** ブロック一覧 */\n\tblocks: Block[];\n\n\t/** ブロック更新時のコールバック (blocks 配列全体を更新) */\n\tonBlocksChange: (blocks: Block[]) => void;\n\n\t/** 選択中のブロック ID 一覧 */\n\tselectedBlockIds?: string[];\n\n\t/** ホバー時のコールバック(キャンバス上でのホバーハイライト用。ドラッグ選択とは別) */\n\tonBlockHover?: (id: string | null) => void;\n\n\t/** ドラッグ中のブロック ID 通知(キャンバス上にソリッド枠を表示するために使用) */\n\tonBlockDragChange?: (id: string | null) => void;\n}\n\n/**\n * ブロックの配列順序を変更するパネル。UI では上が最前面、下が最背面。\n *\n * @remarks\n * **Shell** — 内部配列では最後が最前面。\n */\nexport const BlockOrderPanel = ({\n\tblocks,\n\tonBlocksChange,\n\tselectedBlockIds,\n\tonBlockHover,\n\tonBlockDragChange,\n}: BlockOrderPanelProps) => {\n\t// ドラッグ中のブロック ID(blocks 変更後も追従するよう ID で保持)\n\tconst [draggedBlockId, setDraggedBlockId] = useState<string | null>(null);\n\t// ドラッグ先の挿入位置(dragged 除外リスト上のインデックス)\n\tconst [previewInsertIndex, setPreviewInsertIndex] = useState<number | null>(\n\t\tnull,\n\t);\n\t// キャンセル時に元の順序に戻すための保存\n\tconst originalBlocksRef = useRef<Block[] | null>(null);\n\t// ドラッグ開始時の displayIndex(UI上の位置)を保存(ghostPos のフォールバック用)\n\tconst dragStartDisplayIndexRef = useRef<number | null>(null);\n\n\t// UIでは逆順で表示(上が最前面)\n\tconst displayBlocks = [...blocks].reverse();\n\n\t// draggedBlockId から現在の displayBlocks 上のインデックスを導出\n\tconst draggedIndex = (() => {\n\t\tif (draggedBlockId === null) return null;\n\t\tconst idx = displayBlocks.findIndex((b) => b.id === draggedBlockId);\n\t\treturn idx === -1 ? null : idx;\n\t})();\n\n\t// ドラッグ中はリアルタイムでプレビュー順序を表示する\n\tconst previewBlocks = useMemo(() => {\n\t\tif (draggedIndex === null || previewInsertIndex === null)\n\t\t\treturn displayBlocks;\n\t\tconst draggedItem = displayBlocks[draggedIndex];\n\t\tif (!draggedItem) return displayBlocks;\n\t\tconst without = displayBlocks.filter((_, i) => i !== draggedIndex);\n\t\tconst result = [...without];\n\t\tconst clampedIndex = Math.max(\n\t\t\t0,\n\t\t\tMath.min(previewInsertIndex, result.length),\n\t\t);\n\t\tresult.splice(clampedIndex, 0, draggedItem);\n\t\treturn result;\n\t}, [displayBlocks, draggedIndex, previewInsertIndex]);\n\n\t// 最前面へ移動(配列の最後に移動)\n\tconst handleBringToFront = useCallback(\n\t\t(blockId: string) => {\n\t\t\tconst index = blocks.findIndex((b) => b.id === blockId);\n\t\t\tif (index === -1 || index === blocks.length - 1) return;\n\n\t\t\tconst newBlocks = [...blocks];\n\t\t\tconst [block] = newBlocks.splice(index, 1);\n\t\t\tif (!block) return;\n\t\t\tnewBlocks.push(block);\n\t\t\tonBlocksChange(newBlocks);\n\t\t},\n\t\t[blocks, onBlocksChange],\n\t);\n\n\t// 最背面へ移動(配列の先頭に移動)\n\tconst handleSendToBack = useCallback(\n\t\t(blockId: string) => {\n\t\t\tconst index = blocks.findIndex((b) => b.id === blockId);\n\t\t\tif (index === -1 || index === 0) return;\n\n\t\t\tconst newBlocks = [...blocks];\n\t\t\tconst [block] = newBlocks.splice(index, 1);\n\t\t\tif (!block) return;\n\t\t\tnewBlocks.unshift(block);\n\t\t\tonBlocksChange(newBlocks);\n\t\t},\n\t\t[blocks, onBlocksChange],\n\t);\n\n\t// 前面へ移動(1つ後ろに移動)\n\tconst handleBringForward = useCallback(\n\t\t(blockId: string) => {\n\t\t\tconst index = blocks.findIndex((b) => b.id === blockId);\n\t\t\tif (index === -1 || index === blocks.length - 1) return;\n\n\t\t\tconst newBlocks = [...blocks];\n\t\t\tconst temp = newBlocks[index];\n\t\t\tconst next = newBlocks[index + 1];\n\t\t\tif (!temp || !next) return;\n\t\t\tnewBlocks[index] = next;\n\t\t\tnewBlocks[index + 1] = temp;\n\t\t\tonBlocksChange(newBlocks);\n\t\t},\n\t\t[blocks, onBlocksChange],\n\t);\n\n\t// 背面へ移動(1つ前に移動)\n\tconst handleSendBackward = useCallback(\n\t\t(blockId: string) => {\n\t\t\tconst index = blocks.findIndex((b) => b.id === blockId);\n\t\t\tif (index === -1 || index === 0) return;\n\n\t\t\tconst newBlocks = [...blocks];\n\t\t\tconst temp = newBlocks[index];\n\t\t\tconst prev = newBlocks[index - 1];\n\t\t\tif (!temp || !prev) return;\n\t\t\tnewBlocks[index] = prev;\n\t\t\tnewBlocks[index - 1] = temp;\n\t\t\tonBlocksChange(newBlocks);\n\t\t},\n\t\t[blocks, onBlocksChange],\n\t);\n\n\t// ドラッグ開始\n\tconst handleDragStart = useCallback(\n\t\t(e: React.DragEvent<HTMLElement>, displayIndex: number) => {\n\t\t\te.dataTransfer.effectAllowed = \"move\";\n\t\t\tconst actualIndex = blocks.length - 1 - displayIndex;\n\t\t\tconst blockId = blocks[actualIndex]?.id ?? \"\";\n\t\t\te.dataTransfer.setData(\"text/plain\", blockId);\n\t\t\toriginalBlocksRef.current = [...blocks];\n\t\t\tdragStartDisplayIndexRef.current = displayIndex;\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\tsetDraggedBlockId(blockId);\n\t\t\t\tsetPreviewInsertIndex(displayIndex);\n\t\t\t\tonBlockDragChange?.(blockId);\n\t\t\t});\n\t\t},\n\t\t[blocks, onBlockDragChange],\n\t);\n\n\t// ドラッグ終了\n\tconst handleDragEnd = useCallback(() => {\n\t\tif (originalBlocksRef.current) {\n\t\t\tonBlocksChange(originalBlocksRef.current);\n\t\t\toriginalBlocksRef.current = null;\n\t\t}\n\t\tsetDraggedBlockId(null);\n\t\tsetPreviewInsertIndex(null);\n\t\tonBlockHover?.(null);\n\t\tonBlockDragChange?.(null);\n\t}, [onBlocksChange, onBlockHover, onBlockDragChange]);\n\n\t// ドラッグオーバー(プレビュー挿入位置を更新)\n\tconst handleDragOver = useCallback(\n\t\t(\n\t\t\te: React.DragEvent<HTMLElement>,\n\t\t\tpreviewIndex: number,\n\t\t\tblockId: string,\n\t\t) => {\n\t\t\te.preventDefault();\n\t\t\te.dataTransfer.dropEffect = \"move\";\n\t\t\tif (draggedBlockId === null || blockId === draggedBlockId) return;\n\n\t\t\tconst ghostPos =\n\t\t\t\tpreviewInsertIndex ?? dragStartDisplayIndexRef.current ?? 0;\n\t\t\tconst withoutIndex =\n\t\t\t\tpreviewIndex < ghostPos ? previewIndex : previewIndex - 1;\n\n\t\t\tconst rect = e.currentTarget.getBoundingClientRect();\n\t\t\tconst mid = rect.top + rect.height / 2;\n\t\t\tconst newInsertIndex = e.clientY < mid ? withoutIndex : withoutIndex + 1;\n\t\t\tif (newInsertIndex === previewInsertIndex) return;\n\t\t\tsetPreviewInsertIndex(newInsertIndex);\n\n\t\t\tconst originalBlocks = originalBlocksRef.current;\n\t\t\tif (originalBlocks) {\n\t\t\t\tconst originalDisplay = [...originalBlocks].reverse();\n\t\t\t\tconst draggedItem = originalDisplay.find(\n\t\t\t\t\t(b) => b.id === draggedBlockId,\n\t\t\t\t);\n\t\t\t\tif (draggedItem) {\n\t\t\t\t\tconst without = originalDisplay.filter(\n\t\t\t\t\t\t(b) => b.id !== draggedBlockId,\n\t\t\t\t\t);\n\t\t\t\t\tconst clamp = Math.max(0, Math.min(newInsertIndex, without.length));\n\t\t\t\t\tconst preview = [...without];\n\t\t\t\t\tpreview.splice(clamp, 0, draggedItem);\n\t\t\t\t\tonBlocksChange([...preview].reverse());\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t[draggedBlockId, previewInsertIndex, onBlocksChange],\n\t);\n\n\t// ドラッグリーブ\n\tconst handleDragLeave = useCallback(\n\t\t(e: React.DragEvent<HTMLElement>) => {\n\t\t\tif (!e.currentTarget.contains(e.relatedTarget as Node)) {\n\t\t\t\tsetPreviewInsertIndex(draggedIndex);\n\t\t\t}\n\t\t},\n\t\t[draggedIndex],\n\t);\n\n\t// ドロップ\n\tconst handleDrop = useCallback(\n\t\t(e: React.DragEvent<HTMLElement>) => {\n\t\t\te.preventDefault();\n\t\t\toriginalBlocksRef.current = null;\n\n\t\t\tif (draggedIndex !== null && previewInsertIndex !== null) {\n\t\t\t\tconst draggedItem = displayBlocks[draggedIndex];\n\t\t\t\tif (draggedItem) {\n\t\t\t\t\tconst without = displayBlocks.filter((_, i) => i !== draggedIndex);\n\t\t\t\t\tconst clamp = Math.max(\n\t\t\t\t\t\t0,\n\t\t\t\t\t\tMath.min(previewInsertIndex, without.length),\n\t\t\t\t\t);\n\t\t\t\t\tconst preview = [...without];\n\t\t\t\t\tpreview.splice(clamp, 0, draggedItem);\n\t\t\t\t\tconst finalBlocks = [...preview].reverse();\n\t\t\t\t\tconst unchanged = finalBlocks.every((b, i) => b.id === blocks[i]?.id);\n\t\t\t\t\tif (!unchanged) {\n\t\t\t\t\t\tonBlocksChange(finalBlocks);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tsetDraggedBlockId(null);\n\t\t\tsetPreviewInsertIndex(null);\n\t\t},\n\t\t[blocks, draggedIndex, previewInsertIndex, displayBlocks, onBlocksChange],\n\t);\n\n\treturn (\n\t\t<CollapsibleSection\n\t\t\ttitle=\"ブロック順序\"\n\t\t\tcollapsible\n\t\t\tdescription=\"ブロックの重なり順序を管理します。上にあるほど最前面、下にあるほど最背面に表示されます。ドラッグして並び替えができます\"\n\t\t>\n\t\t\t<ul\n\t\t\t\tclassName={styles.list}\n\t\t\t\tonMouseLeave={() => {\n\t\t\t\t\tif (draggedBlockId === null) onBlockHover?.(null);\n\t\t\t\t}}\n\t\t\t\tonDragLeave={handleDragLeave}\n\t\t\t\tonDrop={handleDrop}\n\t\t\t\tonDragOver={(e) => e.preventDefault()}\n\t\t\t>\n\t\t\t\t{previewBlocks.map((block, previewIndex) => {\n\t\t\t\t\tconst originalDisplayIndex = displayBlocks.findIndex(\n\t\t\t\t\t\t(b) => b.id === block.id,\n\t\t\t\t\t);\n\t\t\t\t\tconst isGhost = block.id === draggedBlockId;\n\t\t\t\t\tconst actualIndex = blocks.length - 1 - originalDisplayIndex;\n\t\t\t\t\tconst isSelected = selectedBlockIds?.includes(block.id) ?? false;\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<li\n\t\t\t\t\t\t\tkey={block.id}\n\t\t\t\t\t\t\tclassName={`${styles.item} ${isGhost ? styles.ghost : \"\"} ${isSelected ? styles.selected : \"\"}`}\n\t\t\t\t\t\t\tdraggable={!isGhost}\n\t\t\t\t\t\t\tonDragStart={\n\t\t\t\t\t\t\t\tisGhost\n\t\t\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t\t\t: (e) => handleDragStart(e, originalDisplayIndex)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tonDragEnd={handleDragEnd}\n\t\t\t\t\t\t\tonDragOver={\n\t\t\t\t\t\t\t\tisGhost\n\t\t\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t\t\t: (e) => handleDragOver(e, previewIndex, block.id)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tonMouseEnter={\n\t\t\t\t\t\t\t\tisGhost ? undefined : () => onBlockHover?.(block.id)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<span className={styles.dragHandle} aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n\t\t\t\t\t\t\t\t\t<title>ドラッグハンドル</title>\n\t\t\t\t\t\t\t\t\t<circle cx=\"6\" cy=\"4\" r=\"1\" fill=\"currentColor\" />\n\t\t\t\t\t\t\t\t\t<circle cx=\"10\" cy=\"4\" r=\"1\" fill=\"currentColor\" />\n\t\t\t\t\t\t\t\t\t<circle cx=\"6\" cy=\"8\" r=\"1\" fill=\"currentColor\" />\n\t\t\t\t\t\t\t\t\t<circle cx=\"10\" cy=\"8\" r=\"1\" fill=\"currentColor\" />\n\t\t\t\t\t\t\t\t\t<circle cx=\"6\" cy=\"12\" r=\"1\" fill=\"currentColor\" />\n\t\t\t\t\t\t\t\t\t<circle cx=\"10\" cy=\"12\" r=\"1\" fill=\"currentColor\" />\n\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<div className={styles.itemInfo}>\n\t\t\t\t\t\t\t\t<div className={styles.itemId}>{block.id}</div>\n\t\t\t\t\t\t\t\t<div className={styles.itemMeta}>\n\t\t\t\t\t\t\t\t\t<span className={styles.itemKind}>{block.kind}</span>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t<div className={styles.itemActions}>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tclassName={styles.actionButton}\n\t\t\t\t\t\t\t\t\tonClick={() => handleBringToFront(block.id)}\n\t\t\t\t\t\t\t\t\ttitle=\"最前面へ\"\n\t\t\t\t\t\t\t\t\taria-label=\"最前面へ移動\"\n\t\t\t\t\t\t\t\t\tdisabled={isGhost || actualIndex === blocks.length - 1}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n\t\t\t\t\t\t\t\t\t\t<title>最前面へ</title>\n\t\t\t\t\t\t\t\t\t\t<path d=\"M4 12v-8M8 12v-8M12 12v-8\" stroke=\"currentColor\" />\n\t\t\t\t\t\t\t\t\t\t<path d=\"M12 4h-8\" stroke=\"currentColor\" strokeWidth=\"2\" />\n\t\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tclassName={styles.actionButton}\n\t\t\t\t\t\t\t\t\tonClick={() => handleBringForward(block.id)}\n\t\t\t\t\t\t\t\t\ttitle=\"前面へ\"\n\t\t\t\t\t\t\t\t\taria-label=\"前面へ移動\"\n\t\t\t\t\t\t\t\t\tdisabled={isGhost || actualIndex === blocks.length - 1}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n\t\t\t\t\t\t\t\t\t\t<title>前面へ</title>\n\t\t\t\t\t\t\t\t\t\t<path d=\"M8 4v8\" stroke=\"currentColor\" />\n\t\t\t\t\t\t\t\t\t\t<path d=\"M5 7l3-3 3 3\" stroke=\"currentColor\" />\n\t\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tclassName={styles.actionButton}\n\t\t\t\t\t\t\t\t\tonClick={() => handleSendBackward(block.id)}\n\t\t\t\t\t\t\t\t\ttitle=\"背面へ\"\n\t\t\t\t\t\t\t\t\taria-label=\"背面へ移動\"\n\t\t\t\t\t\t\t\t\tdisabled={isGhost || actualIndex === 0}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n\t\t\t\t\t\t\t\t\t\t<title>背面へ</title>\n\t\t\t\t\t\t\t\t\t\t<path d=\"M8 12v-8\" stroke=\"currentColor\" />\n\t\t\t\t\t\t\t\t\t\t<path d=\"M5 9l3 3 3-3\" stroke=\"currentColor\" />\n\t\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tclassName={styles.actionButton}\n\t\t\t\t\t\t\t\t\tonClick={() => handleSendToBack(block.id)}\n\t\t\t\t\t\t\t\t\ttitle=\"最背面へ\"\n\t\t\t\t\t\t\t\t\taria-label=\"最背面へ移動\"\n\t\t\t\t\t\t\t\t\tdisabled={isGhost || actualIndex === 0}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n\t\t\t\t\t\t\t\t\t\t<title>最背面へ</title>\n\t\t\t\t\t\t\t\t\t\t<path d=\"M4 12v-8M8 12v-8M12 12v-8\" stroke=\"currentColor\" />\n\t\t\t\t\t\t\t\t\t\t<path d=\"M12 12h-8\" stroke=\"currentColor\" strokeWidth=\"2\" />\n\t\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</ul>\n\t\t\t{blocks.length === 0 && (\n\t\t\t\t<div className={styles.empty}>ブロックがありません</div>\n\t\t\t)}\n\t\t</CollapsibleSection>\n\t);\n};\n\nBlockOrderPanel.displayName = \"BlockOrderPanel\";\n","import {\n\tCopyIcon,\n\tDuplicateIcon,\n\tPasteIcon,\n\tRedoIcon,\n\tTrashIcon,\n\tUndoIcon,\n} from \"../../../../components/icons\";\nimport { getActionFeedback } from \"../../../actionFeedback\";\nimport { IconActionButton } from \"../../../ui\";\nimport styles from \"./CanvasActionPanel.module.css\";\n\nimport type { NoteContext } from \"../../../../contexts/useNoteContext\";\nimport type { ActionFeedback } from \"../../../actionFeedback\";\n\n/**\n * `CanvasActionPanel` コンポーネントへの props。\n */\nexport interface CanvasActionPanelProps {\n\t/** NoteContext(`useNoteContext` が返すコンテキスト) */\n\tcontext: NoteContext;\n\n\t/** アクション実行時のフィードバック(トースト表示など) */\n\tonActionFeedback?: (feedback: ActionFeedback) => void;\n}\n\n/**\n * `CanvasPanel` 最上部に表示するアクションボタン行。\n *\n * @remarks\n * **Shell** — Undo/Redo/Delete/Copy/Paste/Duplicate ボタンを提供する。\n */\nexport const CanvasActionPanel = ({\n\tcontext,\n\tonActionFeedback,\n}: CanvasActionPanelProps) => {\n\tconst { actionContext } = context;\n\tconst selectedBlockIds = context.editorState.selectedBlockIds;\n\tconst hasSelection = (selectedBlockIds?.length ?? 0) > 0;\n\tconst canUndo = actionContext.isEnabled(\"undo\");\n\tconst canRedo = actionContext.isEnabled(\"redo\");\n\tconst hasCopied = actionContext.isEnabled(\"paste\");\n\n\tconst runAction = (actionId: string) => {\n\t\tactionContext.execute(actionId);\n\t\tconst feedback = getActionFeedback(actionId);\n\t\tif (feedback) {\n\t\t\tonActionFeedback?.(feedback);\n\t\t}\n\t};\n\n\treturn (\n\t\t<div className={styles.container} data-testid=\"canvas-action-panel\">\n\t\t\t<div className={styles.group}>\n\t\t\t\t<IconActionButton\n\t\t\t\t\ticon={<UndoIcon aria-hidden=\"true\" />}\n\t\t\t\t\tlabel=\"元に戻す\"\n\t\t\t\t\ttitle=\"元に戻す (Ctrl+Z / Cmd+Z)\"\n\t\t\t\t\tonClick={() => runAction(\"undo\")}\n\t\t\t\t\tdisabled={!canUndo}\n\t\t\t\t/>\n\t\t\t\t<IconActionButton\n\t\t\t\t\ticon={<RedoIcon aria-hidden=\"true\" />}\n\t\t\t\t\tlabel=\"やり直し\"\n\t\t\t\t\ttitle=\"やり直し (Ctrl+Y / Cmd+Y)\"\n\t\t\t\t\tonClick={() => runAction(\"redo\")}\n\t\t\t\t\tdisabled={!canRedo}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t<div className={styles.divider} aria-hidden=\"true\" />\n\t\t\t<div className={styles.group}>\n\t\t\t\t<IconActionButton\n\t\t\t\t\ticon={<TrashIcon aria-hidden=\"true\" />}\n\t\t\t\t\tlabel=\"選択を削除\"\n\t\t\t\t\ttitle=\"削除 (Delete / Backspace)\"\n\t\t\t\t\tonClick={() => runAction(\"delete\")}\n\t\t\t\t\tdisabled={!hasSelection}\n\t\t\t\t/>\n\t\t\t\t<IconActionButton\n\t\t\t\t\ticon={<CopyIcon aria-hidden=\"true\" />}\n\t\t\t\t\tlabel=\"選択をコピー\"\n\t\t\t\t\ttitle=\"コピー (Ctrl+C / Cmd+C)\"\n\t\t\t\t\tonClick={() => runAction(\"copy\")}\n\t\t\t\t\tdisabled={!hasSelection}\n\t\t\t\t/>\n\t\t\t\t<IconActionButton\n\t\t\t\t\ticon={<PasteIcon aria-hidden=\"true\" />}\n\t\t\t\t\tlabel=\"貼り付け\"\n\t\t\t\t\ttitle=\"貼り付け (Ctrl+V / Cmd+V)\"\n\t\t\t\t\tonClick={() => runAction(\"paste\")}\n\t\t\t\t\tdisabled={!hasCopied}\n\t\t\t\t/>\n\t\t\t\t<IconActionButton\n\t\t\t\t\ticon={<DuplicateIcon aria-hidden=\"true\" />}\n\t\t\t\t\tlabel=\"選択を複製\"\n\t\t\t\t\ttitle=\"複製 (Ctrl+D / Cmd+D)\"\n\t\t\t\t\tonClick={() => runAction(\"duplicate\")}\n\t\t\t\t\tdisabled={!hasSelection}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nCanvasActionPanel.displayName = \"CanvasActionPanel\";\n","import { TabPanel } from \"../../ui\";\n\nimport type { ReactNode } from \"react\";\n\n/**\n * `CanvasPanel` コンポーネントへの props。\n */\nexport interface CanvasPanelProps {\n\t/** パネルのコンテンツ */\n\tchildren?: ReactNode;\n\n\t/** カスタムクラス名 */\n\tclassName?: string;\n}\n\n/**\n * キャンバス設定パネルの純粹なコンテナ。`TabPanel` ラッパーのみを提供する。\n *\n * @remarks\n * **Shell** — ビジネスロジックを含む実装は `DefaultCanvasPanel` を使用してください。\n */\nexport const CanvasPanel = ({ children, className }: CanvasPanelProps) => (\n\t<TabPanel className={className}>{children}</TabPanel>\n);\n\nCanvasPanel.displayName = \"CanvasPanel\";\n","import { useCallback } from \"react\";\n\nimport {\n\tcolsToSparse,\n\texpandSparseCols,\n\texpandSparseRows,\n\trowsToSparse,\n} from \"../../../../utils/grid\";\nimport { CollapsibleSection, NumberInput } from \"../../../ui\";\nimport styles from \"./GridSizePanel.module.css\";\n\nimport type { Grid } from \"../../../../types/grid\";\n\n// デフォルトのグリッド列/行サイズ(1fr)\nconst DEFAULT_DIMENSION = { value: 1, unit: \"fr\" as const };\n\n/**\n * `GridSizePanel` コンポーネントへの props。\n */\nexport interface GridSizePanelProps {\n\t/** グリッド設定 */\n\tgrid: Grid;\n\n\t/** グリッド変更時のコールバック */\n\tonGridChange: (grid: Grid) => void;\n}\n\n/**\n * 行・列数を変更するパネル。\n *\n * @remarks\n * **Shell** — 行・列数変更パネル。\n */\nexport const GridSizePanel = ({ grid, onGridChange }: GridSizePanelProps) => {\n\t// 列数変更ハンドラ\n\tconst handleColsChange = useCallback(\n\t\t(newColCount: number | undefined) => {\n\t\t\tif (!newColCount || newColCount < 1 || newColCount > 100) return;\n\n\t\t\tconst currentCols = expandSparseCols(grid);\n\t\t\tconst currentColCount = grid.colCount;\n\t\t\tconst newCols = [...currentCols];\n\n\t\t\tif (newColCount > currentColCount) {\n\t\t\t\t// 列を追加\n\t\t\t\tfor (let i = currentColCount; i < newColCount; i++) {\n\t\t\t\t\tnewCols.push({ ...DEFAULT_DIMENSION });\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// 列を削除\n\t\t\t\tnewCols.splice(newColCount);\n\t\t\t}\n\n\t\t\tonGridChange({ ...grid, ...colsToSparse(newCols) });\n\t\t},\n\t\t[grid, onGridChange],\n\t);\n\n\t// 行数変更ハンドラ\n\tconst handleRowsChange = useCallback(\n\t\t(newRowCount: number | undefined) => {\n\t\t\tif (!newRowCount || newRowCount < 1 || newRowCount > 100) return;\n\n\t\t\tconst currentRows = expandSparseRows(grid);\n\t\t\tconst currentRowCount = grid.rowCount;\n\t\t\tconst newRows = [...currentRows];\n\n\t\t\tif (newRowCount > currentRowCount) {\n\t\t\t\t// 行を追加\n\t\t\t\tfor (let i = currentRowCount; i < newRowCount; i++) {\n\t\t\t\t\tnewRows.push({ ...DEFAULT_DIMENSION });\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// 行を削除\n\t\t\t\tnewRows.splice(newRowCount);\n\t\t\t}\n\n\t\t\tonGridChange({ ...grid, ...rowsToSparse(newRows) });\n\t\t},\n\t\t[grid, onGridChange],\n\t);\n\n\treturn (\n\t\t<CollapsibleSection\n\t\t\ttitle=\"グリッドサイズ\"\n\t\t\tcollapsible\n\t\t\tdefaultCollapsed={false}\n\t\t\tdescription=\"ブロックを配置するグリッドの列数と行数を設定します\"\n\t\t>\n\t\t\t<div className={styles.gridSizeRow}>\n\t\t\t\t<div className={`${styles.field} ${styles.horizontal}`}>\n\t\t\t\t\t<span className={styles.label}>列数</span>\n\t\t\t\t\t<NumberInput\n\t\t\t\t\t\tvalue={grid.colCount}\n\t\t\t\t\t\tonChange={handleColsChange}\n\t\t\t\t\t\tmin={1}\n\t\t\t\t\t\tmax={100}\n\t\t\t\t\t\tstep={1}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\n\t\t\t\t<div className={`${styles.field} ${styles.horizontal}`}>\n\t\t\t\t\t<span className={styles.label}>行数</span>\n\t\t\t\t\t<NumberInput\n\t\t\t\t\t\tvalue={grid.rowCount}\n\t\t\t\t\t\tonChange={handleRowsChange}\n\t\t\t\t\t\tmin={1}\n\t\t\t\t\t\tmax={100}\n\t\t\t\t\t\tstep={1}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</CollapsibleSection>\n\t);\n};\n\nGridSizePanel.displayName = \"GridSizePanel\";\n","import { useCallback, useState } from \"react\";\n\nimport { CollapsibleSection, DimensionInput } from \"../../../ui\";\nimport styles from \"./MarginPanel.module.css\";\n\nimport type { Paper, PaperMargin } from \"../../../../types/paper\";\nimport type { Dimension, PaperUnit } from \"../../../../types/unit\";\n\n/**\n * `MarginPanel` コンポーネントへの props。\n */\nexport interface MarginPanelProps {\n\t/** 用紙設定 */\n\tpaper: Paper;\n\n\t/** 用紙変更時のコールバック */\n\tonPaperChange: (paper: Paper) => void;\n}\n\n/**\n * マージンを変更するパネル。\n *\n * @remarks\n * **Shell** — 全辺一括設定モードあり。\n */\nexport const MarginPanel = ({ paper, onPaperChange }: MarginPanelProps) => {\n\t// 全辺一括設定モード\n\tconst [linkMargins, setLinkMargins] = useState(false);\n\n\t// 上マージン変更ハンドラ\n\tconst handleTopChange = useCallback(\n\t\t(top: Dimension<PaperUnit> | undefined) => {\n\t\t\tif (!top) return;\n\n\t\t\tconst newMargin: PaperMargin = linkMargins\n\t\t\t\t? {\n\t\t\t\t\t\ttop,\n\t\t\t\t\t\tright: top,\n\t\t\t\t\t\tbottom: top,\n\t\t\t\t\t\tleft: top,\n\t\t\t\t\t}\n\t\t\t\t: {\n\t\t\t\t\t\t...paper.margin,\n\t\t\t\t\t\ttop,\n\t\t\t\t\t};\n\n\t\t\tonPaperChange({\n\t\t\t\t...paper,\n\t\t\t\tmargin: newMargin,\n\t\t\t});\n\t\t},\n\t\t[paper, onPaperChange, linkMargins],\n\t);\n\n\t// 右マージン変更ハンドラ\n\tconst handleRightChange = useCallback(\n\t\t(right: Dimension<PaperUnit> | undefined) => {\n\t\t\tif (!right) return;\n\n\t\t\tonPaperChange({\n\t\t\t\t...paper,\n\t\t\t\tmargin: {\n\t\t\t\t\t...paper.margin,\n\t\t\t\t\tright,\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t\t[paper, onPaperChange],\n\t);\n\n\t// 下マージン変更ハンドラ\n\tconst handleBottomChange = useCallback(\n\t\t(bottom: Dimension<PaperUnit> | undefined) => {\n\t\t\tif (!bottom) return;\n\n\t\t\tonPaperChange({\n\t\t\t\t...paper,\n\t\t\t\tmargin: {\n\t\t\t\t\t...paper.margin,\n\t\t\t\t\tbottom,\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t\t[paper, onPaperChange],\n\t);\n\n\t// 左マージン変更ハンドラ\n\tconst handleLeftChange = useCallback(\n\t\t(left: Dimension<PaperUnit> | undefined) => {\n\t\t\tif (!left) return;\n\n\t\t\tonPaperChange({\n\t\t\t\t...paper,\n\t\t\t\tmargin: {\n\t\t\t\t\t...paper.margin,\n\t\t\t\t\tleft,\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t\t[paper, onPaperChange],\n\t);\n\n\treturn (\n\t\t<CollapsibleSection\n\t\t\ttitle=\"マージン\"\n\t\t\tcollapsible\n\t\t\tdefaultCollapsed={false}\n\t\t\tdescription=\"印刷時にコンテンツが配置されない余白(マージン)を設定します\"\n\t\t>\n\t\t\t{/* topRow: 個別[スイッチ]一括 + 上(一括時は全辺)マージン */}\n\t\t\t<div className={styles.topRow}>\n\t\t\t\t<div className={styles.linkSwitch}>\n\t\t\t\t\t<span\n\t\t\t\t\t\tclassName={`${styles.switchLabel} ${!linkMargins ? styles.switchLabelActive : \"\"}`}\n\t\t\t\t\t>\n\t\t\t\t\t\t個別\n\t\t\t\t\t</span>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\trole=\"switch\"\n\t\t\t\t\t\taria-checked={linkMargins}\n\t\t\t\t\t\tclassName={styles.toggle}\n\t\t\t\t\t\tonClick={() => setLinkMargins((v) => !v)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<span className={styles.thumb} />\n\t\t\t\t\t</button>\n\t\t\t\t\t<span\n\t\t\t\t\t\tclassName={`${styles.switchLabel} ${linkMargins ? styles.switchLabelActive : \"\"}`}\n\t\t\t\t\t>\n\t\t\t\t\t\t一括\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t\t<div className={styles.topCell}>\n\t\t\t\t\t<DimensionInput\n\t\t\t\t\t\tvalue={paper.margin.top}\n\t\t\t\t\t\tonChange={handleTopChange}\n\t\t\t\t\t\tallowedUnits={[\"mm\", \"cm\", \"inch\"]}\n\t\t\t\t\t\tmin={0}\n\t\t\t\t\t\tmax={1000}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t{!linkMargins && (\n\t\t\t\t<>\n\t\t\t\t\t<div className={styles.sideMargins}>\n\t\t\t\t\t\t<div className={styles.sideCell}>\n\t\t\t\t\t\t\t<DimensionInput\n\t\t\t\t\t\t\t\tvalue={paper.margin.left}\n\t\t\t\t\t\t\t\tonChange={handleLeftChange}\n\t\t\t\t\t\t\t\tallowedUnits={[\"mm\", \"cm\", \"inch\"]}\n\t\t\t\t\t\t\t\tmin={0}\n\t\t\t\t\t\t\t\tmax={1000}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div className={styles.sideCell}>\n\t\t\t\t\t\t\t<DimensionInput\n\t\t\t\t\t\t\t\tvalue={paper.margin.right}\n\t\t\t\t\t\t\t\tonChange={handleRightChange}\n\t\t\t\t\t\t\t\tallowedUnits={[\"mm\", \"cm\", \"inch\"]}\n\t\t\t\t\t\t\t\tmin={0}\n\t\t\t\t\t\t\t\tmax={1000}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className={styles.bottomCell}>\n\t\t\t\t\t\t<DimensionInput\n\t\t\t\t\t\t\tvalue={paper.margin.bottom}\n\t\t\t\t\t\t\tonChange={handleBottomChange}\n\t\t\t\t\t\t\tallowedUnits={[\"mm\", \"cm\", \"inch\"]}\n\t\t\t\t\t\t\tmin={0}\n\t\t\t\t\t\t\tmax={1000}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</>\n\t\t\t)}\n\t\t</CollapsibleSection>\n\t);\n};\n\nMarginPanel.displayName = \"MarginPanel\";\n","import { useCallback, useMemo } from \"react\";\n\nimport { DEFAULT_PAPER_SIZES, PaperSizePreset } from \"../../../../types/paper\";\nimport { toMm } from \"../../../../utils\";\nimport {\n\tCheckbox,\n\tCollapsibleSection,\n\tDimensionInput,\n\tDropdown,\n} from \"../../../ui\";\nimport styles from \"./PaperSizePanel.module.css\";\n\nimport type { Paper, PaperSize } from \"../../../../types/paper\";\nimport type { Dimension, PaperUnit } from \"../../../../types/unit\";\n\n// mm を指定した用紙単位に変換するヘルパー\nfunction mmToUnit(mm: number, unit: PaperUnit): number {\n\tswitch (unit) {\n\t\tcase \"cm\":\n\t\t\treturn mm / 10;\n\t\tcase \"inch\":\n\t\t\treturn mm / 25.4;\n\t\tdefault:\n\t\t\treturn mm; // \"mm\"\n\t}\n}\n\n/**\n * `PaperSizePanel` コンポーネントへの props。\n */\nexport interface PaperSizePanelProps {\n\t/** 用紙設定 */\n\tpaper: Paper;\n\n\t/** 用紙変更時のコールバック */\n\tonPaperChange: (paper: Paper) => void;\n}\n\n/**\n * 用紙サイズ・向き・自動サイズモードを変更するパネル。\n *\n * @remarks\n * **Shell** — カスタム選択時は幅・高さ・単位の入力も表示される。\n */\nexport const PaperSizePanel = ({\n\tpaper,\n\tonPaperChange,\n}: PaperSizePanelProps) => {\n\t// プリセット選択肢\n\tconst presetOptions = useMemo(\n\t\t() => [\n\t\t\t{ value: PaperSizePreset.A4, label: \"A4 (210 × 297 mm)\" },\n\t\t\t{ value: PaperSizePreset.A3, label: \"A3 (297 × 420 mm)\" },\n\t\t\t{ value: PaperSizePreset.B5, label: \"B5 (182 × 257 mm)\" },\n\t\t\t{ value: PaperSizePreset.LETTER, label: \"Letter (8.5 × 11 inch)\" },\n\t\t\t{ value: PaperSizePreset.LEGAL, label: \"Legal (8.5 × 14 inch)\" },\n\t\t\t{ value: PaperSizePreset.CUSTOM, label: \"カスタム\" },\n\t\t],\n\t\t[],\n\t);\n\n\t// 向き変更ハンドラ(true = 横向き、false/undefined = 縦向き)\n\tconst handleOrientationChange = useCallback(\n\t\t(landscape: boolean | undefined) => {\n\t\t\tonPaperChange({ ...paper, orientation: landscape || undefined });\n\t\t},\n\t\t[paper, onPaperChange],\n\t);\n\n\t// プリセット変更ハンドラ\n\tconst handlePresetChange = useCallback(\n\t\t(preset: PaperSizePreset | undefined) => {\n\t\t\tif (!preset) return;\n\t\t\tonPaperChange({ ...paper, size: DEFAULT_PAPER_SIZES[preset] });\n\t\t},\n\t\t[paper, onPaperChange],\n\t);\n\n\t// 幅変更ハンドラ\n\tconst handleWidthChange = useCallback(\n\t\t(width: Dimension<PaperUnit> | undefined) => {\n\t\t\tif (!width) return;\n\t\t\tconst newSize: PaperSize = {\n\t\t\t\t...paper.size,\n\t\t\t\tpreset: PaperSizePreset.CUSTOM,\n\t\t\t\twidth,\n\t\t\t};\n\t\t\tonPaperChange({ ...paper, size: newSize });\n\t\t},\n\t\t[paper, onPaperChange],\n\t);\n\n\t// 高さ変更ハンドラ\n\tconst handleHeightChange = useCallback(\n\t\t(height: Dimension<PaperUnit> | undefined) => {\n\t\t\tif (!height) return;\n\t\t\tconst newSize: PaperSize = {\n\t\t\t\t...paper.size,\n\t\t\t\tpreset: PaperSizePreset.CUSTOM,\n\t\t\t\theight,\n\t\t\t};\n\t\t\tonPaperChange({ ...paper, size: newSize });\n\t\t},\n\t\t[paper, onPaperChange],\n\t);\n\n\tconst isCustom = paper.size.preset === PaperSizePreset.CUSTOM;\n\tconst isFit = paper.autoHeight === true;\n\tconst isWidthFit = paper.autoWidth === true;\n\n\tconst handleHeightModeToggle = useCallback(() => {\n\t\tonPaperChange({ ...paper, autoHeight: isFit ? undefined : true });\n\t}, [paper, isFit, onPaperChange]);\n\n\tconst handleWidthModeToggle = useCallback(() => {\n\t\tonPaperChange({ ...paper, autoWidth: isWidthFit ? undefined : true });\n\t}, [paper, isWidthFit, onPaperChange]);\n\n\tconst heightLabel = isFit ? \"最小高さ\" : \"高さ\";\n\tconst widthLabel = isWidthFit ? \"最小幅\" : \"幅\";\n\n\t// カスタムサイズの最小値: マージンの合計をキャンバスの単位に換算\n\tconst minWidth = useMemo(() => {\n\t\tconst minMm =\n\t\t\ttoMm.fromDim(paper.margin.left) + toMm.fromDim(paper.margin.right);\n\t\treturn mmToUnit(minMm, paper.size.width.unit);\n\t}, [paper.margin.left, paper.margin.right, paper.size.width.unit]);\n\n\tconst minHeight = useMemo(() => {\n\t\tconst minMm =\n\t\t\ttoMm.fromDim(paper.margin.top) + toMm.fromDim(paper.margin.bottom);\n\t\treturn mmToUnit(minMm, paper.size.height.unit);\n\t}, [paper.margin.top, paper.margin.bottom, paper.size.height.unit]);\n\n\treturn (\n\t\t<CollapsibleSection\n\t\t\ttitle=\"用紙設定\"\n\t\t\tcollapsible\n\t\t\tdefaultCollapsed={false}\n\t\t\tdescription=\"用紙のサイズと向きを設定します\"\n\t\t>\n\t\t\t<div className={styles.grid}>\n\t\t\t\t{/* 行 0: プリセット select + 横向き checkbox */}\n\t\t\t\t<span className={`${styles.label} ${styles.colSpan2}`}>用紙サイズ</span>\n\t\t\t\t<div className={styles.colSpan3}>\n\t\t\t\t\t<Dropdown\n\t\t\t\t\t\tvalue={paper.size.preset}\n\t\t\t\t\t\toptions={presetOptions}\n\t\t\t\t\t\tonChange={handlePresetChange}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<span className={`${styles.label} ${styles.colSpan2}`}>横向き</span>\n\t\t\t\t<div className={styles.checkboxCell}>\n\t\t\t\t\t<Checkbox\n\t\t\t\t\t\tvalue={paper.orientation === true}\n\t\t\t\t\t\tonChange={handleOrientationChange}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\n\t\t\t\t{/* 行 1: 幅・高さ自動モードトグル(1行に収める) */}\n\t\t\t\t<span className={styles.modeLabel}>幅</span>\n\t\t\t\t<div className={styles.modeToggle}>\n\t\t\t\t\t<span\n\t\t\t\t\t\tclassName={`${styles.switchLabel} ${isWidthFit ? styles.switchLabelActive : \"\"}`}\n\t\t\t\t\t>\n\t\t\t\t\t\t自動\n\t\t\t\t\t</span>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\trole=\"switch\"\n\t\t\t\t\t\taria-checked={isWidthFit}\n\t\t\t\t\t\taria-label=\"幅モード\"\n\t\t\t\t\t\tclassName={styles.toggle}\n\t\t\t\t\t\tonClick={handleWidthModeToggle}\n\t\t\t\t\t>\n\t\t\t\t\t\t<span className={styles.thumb} />\n\t\t\t\t\t</button>\n\t\t\t\t\t<span\n\t\t\t\t\t\tclassName={`${styles.switchLabel} ${!isWidthFit ? styles.switchLabelActive : \"\"}`}\n\t\t\t\t\t>\n\t\t\t\t\t\t固定\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t\t<span className={styles.modeLabel}>高さ</span>\n\t\t\t\t<div className={styles.modeToggle}>\n\t\t\t\t\t<span\n\t\t\t\t\t\tclassName={`${styles.switchLabel} ${isFit ? styles.switchLabelActive : \"\"}`}\n\t\t\t\t\t>\n\t\t\t\t\t\t自動\n\t\t\t\t\t</span>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\trole=\"switch\"\n\t\t\t\t\t\taria-checked={isFit}\n\t\t\t\t\t\taria-label=\"高さモード\"\n\t\t\t\t\t\tclassName={styles.toggle}\n\t\t\t\t\t\tonClick={handleHeightModeToggle}\n\t\t\t\t\t>\n\t\t\t\t\t\t<span className={styles.thumb} />\n\t\t\t\t\t</button>\n\t\t\t\t\t<span\n\t\t\t\t\t\tclassName={`${styles.switchLabel} ${!isFit ? styles.switchLabelActive : \"\"}`}\n\t\t\t\t\t>\n\t\t\t\t\t\t固定\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\n\t\t\t\t{/* 行 2: カスタムサイズ入力(Custom 選択時のみ) */}\n\t\t\t\t{isCustom && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<span className={styles.label}>{widthLabel}</span>\n\t\t\t\t\t\t<div className={styles.colSpan3}>\n\t\t\t\t\t\t\t<DimensionInput\n\t\t\t\t\t\t\t\tvalue={paper.size.width}\n\t\t\t\t\t\t\t\tonChange={handleWidthChange}\n\t\t\t\t\t\t\t\tallowedUnits={[\"mm\", \"cm\", \"inch\"]}\n\t\t\t\t\t\t\t\tmin={minWidth}\n\t\t\t\t\t\t\t\tmax={500}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<span className={styles.label}>{heightLabel}</span>\n\t\t\t\t\t\t<div className={styles.colSpan3}>\n\t\t\t\t\t\t\t<DimensionInput\n\t\t\t\t\t\t\t\tvalue={paper.size.height}\n\t\t\t\t\t\t\t\tonChange={handleHeightChange}\n\t\t\t\t\t\t\t\tallowedUnits={[\"mm\", \"cm\", \"inch\"]}\n\t\t\t\t\t\t\t\tmin={minHeight}\n\t\t\t\t\t\t\t\tmax={500}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</CollapsibleSection>\n\t);\n};\n\nPaperSizePanel.displayName = \"PaperSizePanel\";\n","import { useCallback } from \"react\";\n\nimport { gridSizeKey } from \"../../../contexts/history/mergeKeys\";\nimport {\n\tBlockDefaultsPanel,\n\tBlockOrderPanel,\n\tCanvasActionPanel,\n\tGridSizePanel,\n\tMarginPanel,\n\tPaperSizePanel,\n} from \".\";\nimport { CanvasPanel } from \"./CanvasPanel\";\n\nimport type { NoteContext } from \"../../../contexts/useNoteContext\";\nimport type { Block } from \"../../../types/block\";\nimport type { Grid } from \"../../../types/grid\";\nimport type { Paper } from \"../../../types/paper\";\nimport type { BlockDefaults } from \"../../../types/schema\";\nimport type { ActionFeedback } from \"../../actionFeedback\";\n\n/**\n * `DefaultCanvasPanel` コンポーネントへの props。\n */\nexport interface DefaultCanvasPanelProps {\n\t/** NoteContext(`useNoteContext` が返すコンテキスト) */\n\tcontext: NoteContext;\n\n\t/** ホバー中のブロック ID 通知 */\n\tonBlockHover?: (id: string | null) => void;\n\n\t/** ドラッグ中のブロック ID 通知 */\n\tonBlockDragChange?: (id: string | null) => void;\n\n\t/** アクション実行時のフィードバック(トースト表示など) */\n\tonActionFeedback?: (feedback: ActionFeedback) => void;\n}\n\n/**\n * キャンバス設定統合パネルのデフォルト実装。\n *\n * @remarks\n * **Shell** — 内部に CanvasActionPanel, PaperSizePanel, MarginPanel, GridSizePanel, BlockDefaultsPanel, BlockOrderPanel を含む。\n */\nexport const DefaultCanvasPanel = ({\n\tcontext,\n\tonBlockHover,\n\tonBlockDragChange,\n\tonActionFeedback,\n}: DefaultCanvasPanelProps) => {\n\tconst { book, onBookChange, pluginRegistry } = context;\n\tconst pageIdx = context.editorState.pageIdx;\n\tconst selectedBlockIds = context.editorState.selectedBlockIds;\n\tconst page = book.pages[pageIdx] ?? book.pages[0];\n\n\t// 用紙設定変更\n\tconst handlePaperChange = useCallback(\n\t\t(newPaper: Paper) => {\n\t\t\tonBookChange({ ...book, paper: newPaper });\n\t\t},\n\t\t[book, onBookChange],\n\t);\n\n\t// グリッド設定変更\n\tconst handleGridChange = useCallback(\n\t\t(newGrid: Grid) => {\n\t\t\tconst newPages = book.pages.map((pg, i) =>\n\t\t\t\ti === pageIdx ? { ...pg, grid: newGrid } : pg,\n\t\t\t) as typeof book.pages;\n\t\t\tonBookChange(\n\t\t\t\t{ ...book, pages: newPages },\n\t\t\t\t{ mergeKey: gridSizeKey(pageIdx) },\n\t\t\t);\n\t\t},\n\t\t[book, onBookChange, pageIdx],\n\t);\n\n\t// ブロック順序変更\n\tconst handleBlocksChange = useCallback(\n\t\t(newBlocks: Block[]) => {\n\t\t\tconst newPages = book.pages.map((pg, i) =>\n\t\t\t\ti === pageIdx ? { ...pg, blocks: newBlocks } : pg,\n\t\t\t) as typeof book.pages;\n\t\t\tonBookChange({ ...book, pages: newPages });\n\t\t},\n\t\t[book, onBookChange, pageIdx],\n\t);\n\n\t// ブロックデフォルト設定変更\n\tconst handleBlockDefaultsChange = useCallback(\n\t\t(newBlockDefaults: BlockDefaults) => {\n\t\t\tconst newPages = book.pages.map((pg, i) =>\n\t\t\t\ti === pageIdx ? { ...pg, blockDefaults: newBlockDefaults } : pg,\n\t\t\t) as typeof book.pages;\n\t\t\tonBookChange({ ...book, pages: newPages });\n\t\t},\n\t\t[book, onBookChange, pageIdx],\n\t);\n\n\treturn (\n\t\t<CanvasPanel>\n\t\t\t<CanvasActionPanel\n\t\t\t\tcontext={context}\n\t\t\t\tonActionFeedback={onActionFeedback}\n\t\t\t/>\n\t\t\t<PaperSizePanel paper={book.paper} onPaperChange={handlePaperChange} />\n\t\t\t<MarginPanel paper={book.paper} onPaperChange={handlePaperChange} />\n\t\t\t<GridSizePanel grid={page.grid} onGridChange={handleGridChange} />\n\t\t\t{pluginRegistry && Object.keys(pluginRegistry).length > 0 && (\n\t\t\t\t<BlockDefaultsPanel\n\t\t\t\t\tblockDefaults={page.blockDefaults ?? {}}\n\t\t\t\t\tpluginRegistry={pluginRegistry}\n\t\t\t\t\tonChange={handleBlockDefaultsChange}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t<BlockOrderPanel\n\t\t\t\tblocks={page.blocks}\n\t\t\t\tonBlocksChange={handleBlocksChange}\n\t\t\t\tselectedBlockIds={selectedBlockIds}\n\t\t\t\tonBlockHover={onBlockHover}\n\t\t\t\tonBlockDragChange={onBlockDragChange}\n\t\t\t/>\n\t\t</CanvasPanel>\n\t);\n};\n\nDefaultCanvasPanel.displayName = \"DefaultCanvasPanel\";\n","import { useCallback, useRef, useState } from \"react\";\n\nimport { deserializeBook, serializeBook } from \"../../../../utils/schema\";\nimport { deserializeValues } from \"../../../../utils/values\";\nimport { CollapsibleSection } from \"../../../ui\";\nimport styles from \"./ImportExportPanel.module.css\";\n\nimport type React from \"react\";\nimport type {\n\tOnBookChange,\n\tOnValuesChange,\n\tValueChange,\n} from \"../../../../types/callbacks\";\nimport type { Book } from \"../../../../types/schema\";\nimport type { Value } from \"../../../../types/value\";\n\n/**\n * `ImportExportPanel` コンポーネントへの props。\n */\nexport interface ImportExportPanelProps {\n\t/** ブックデータ */\n\tbook: Book;\n\n\t/** 入力値のマップ */\n\tvalues: Record<string, Value>;\n\n\t/** ブック変更時のコールバック */\n\tonBookChange: OnBookChange;\n\n\t/** 入力値変更時のコールバック */\n\tonValuesChange: OnValuesChange;\n}\n\n// 現在値と次値の差分変更配列を生成するヘルパー\nconst computeValueChanges = (\n\tcurrent: Record<string, Value>,\n\tnext: Record<string, Value>,\n): ValueChange[] => {\n\tconst changes: ValueChange[] = [];\n\tfor (const id of Object.keys(current)) {\n\t\tif (!(id in next)) changes.push({ id, value: undefined });\n\t}\n\tfor (const [id, value] of Object.entries(next)) {\n\t\tchanges.push({ id, value });\n\t}\n\treturn changes;\n};\n\n/**\n * JSON 形式でブックデータのインポート・エクスポートを行うパネル。\n *\n * @remarks\n * **Shell** — `OtherPanel` のデフォルトセクションとして使用される。\n */\nexport const ImportExportPanel: React.FC<ImportExportPanelProps> = ({\n\tbook,\n\tvalues,\n\tonBookChange,\n\tonValuesChange,\n}) => {\n\tconst [error, setError] = useState<string>(\"\");\n\tconst bookFileInputRef = useRef<HTMLInputElement>(null);\n\tconst valuesFileInputRef = useRef<HTMLInputElement>(null);\n\n\tconst handleExportBookFile = useCallback(() => {\n\t\ttry {\n\t\t\tconst json = serializeBook(book);\n\t\t\tconst blob = new Blob([json], { type: \"application/json\" });\n\t\t\tconst url = URL.createObjectURL(blob);\n\t\t\tconst a = document.createElement(\"a\");\n\t\t\ta.href = url;\n\t\t\ta.download = \"book.json\";\n\t\t\ta.click();\n\t\t\tURL.revokeObjectURL(url);\n\t\t\tsetError(\"\");\n\t\t} catch (err) {\n\t\t\tsetError(\n\t\t\t\t`エクスポートエラー: ${err instanceof Error ? err.message : String(err)}`,\n\t\t\t);\n\t\t}\n\t}, [book]);\n\n\tconst handleExportBookClipboard = useCallback(async () => {\n\t\ttry {\n\t\t\tconst json = serializeBook(book);\n\t\t\tawait navigator.clipboard.writeText(json);\n\t\t\tsetError(\"\");\n\t\t\talert(\"ブックをクリップボードにコピーしました\");\n\t\t} catch (err) {\n\t\t\tsetError(\n\t\t\t\t`クリップボードエラー: ${err instanceof Error ? err.message : String(err)}`,\n\t\t\t);\n\t\t}\n\t}, [book]);\n\n\tconst importBookFromJson = useCallback(\n\t\t(json: string) => {\n\t\t\tconst newBook = deserializeBook(json);\n\t\t\tonBookChange(newBook);\n\t\t},\n\t\t[onBookChange],\n\t);\n\n\tconst handleImportBookFile = useCallback(() => {\n\t\tbookFileInputRef.current?.click();\n\t}, []);\n\n\tconst handleBookFileChange = useCallback(\n\t\t(event: React.ChangeEvent<HTMLInputElement>) => {\n\t\t\tconst file = event.target.files?.[0];\n\t\t\tif (!file) return;\n\t\t\tconst reader = new FileReader();\n\t\t\treader.onload = (e) => {\n\t\t\t\ttry {\n\t\t\t\t\timportBookFromJson(e.target?.result as string);\n\t\t\t\t\tsetError(\"\");\n\t\t\t\t\talert(\"インポートしました\");\n\t\t\t\t} catch (err) {\n\t\t\t\t\tsetError(\n\t\t\t\t\t\t`インポートエラー: ${err instanceof Error ? err.message : String(err)}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t};\n\t\t\treader.readAsText(file);\n\t\t\tevent.target.value = \"\";\n\t\t},\n\t\t[importBookFromJson],\n\t);\n\n\tconst handleImportBookClipboard = useCallback(async () => {\n\t\ttry {\n\t\t\tconst json = await navigator.clipboard.readText();\n\t\t\timportBookFromJson(json);\n\t\t\tsetError(\"\");\n\t\t\talert(\"インポートしました\");\n\t\t} catch (err) {\n\t\t\tsetError(\n\t\t\t\t`インポートエラー: ${err instanceof Error ? err.message : String(err)}`,\n\t\t\t);\n\t\t}\n\t}, [importBookFromJson]);\n\n\tconst handleExportValuesFile = useCallback(() => {\n\t\ttry {\n\t\t\tconst json = JSON.stringify(values, null, 2);\n\t\t\tconst blob = new Blob([json], { type: \"application/json\" });\n\t\t\tconst url = URL.createObjectURL(blob);\n\t\t\tconst a = document.createElement(\"a\");\n\t\t\ta.href = url;\n\t\t\ta.download = \"values.json\";\n\t\t\ta.click();\n\t\t\tURL.revokeObjectURL(url);\n\t\t\tsetError(\"\");\n\t\t} catch (err) {\n\t\t\tsetError(\n\t\t\t\t`エクスポートエラー: ${err instanceof Error ? err.message : String(err)}`,\n\t\t\t);\n\t\t}\n\t}, [values]);\n\n\tconst handleExportValuesClipboard = useCallback(async () => {\n\t\ttry {\n\t\t\tconst json = JSON.stringify(values, null, 2);\n\t\t\tawait navigator.clipboard.writeText(json);\n\t\t\tsetError(\"\");\n\t\t\talert(\"値をクリップボードにコピーしました\");\n\t\t} catch (err) {\n\t\t\tsetError(\n\t\t\t\t`クリップボードエラー: ${err instanceof Error ? err.message : String(err)}`,\n\t\t\t);\n\t\t}\n\t}, [values]);\n\n\tconst handleImportValuesFile = useCallback(() => {\n\t\tvaluesFileInputRef.current?.click();\n\t}, []);\n\n\tconst handleValuesFileChange = useCallback(\n\t\t(event: React.ChangeEvent<HTMLInputElement>) => {\n\t\t\tconst file = event.target.files?.[0];\n\t\t\tif (!file) return;\n\t\t\tconst reader = new FileReader();\n\t\t\treader.onload = (e) => {\n\t\t\t\ttry {\n\t\t\t\t\tconst newValues = deserializeValues(e.target?.result as string);\n\t\t\t\t\tconst changes = computeValueChanges(values, newValues);\n\t\t\t\t\tonValuesChange(changes);\n\t\t\t\t\tsetError(\"\");\n\t\t\t\t\talert(\"値をインポートしました\");\n\t\t\t\t} catch (err) {\n\t\t\t\t\tsetError(\n\t\t\t\t\t\t`インポートエラー: ${err instanceof Error ? err.message : String(err)}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t};\n\t\t\treader.readAsText(file);\n\t\t\tevent.target.value = \"\";\n\t\t},\n\t\t[onValuesChange, values],\n\t);\n\n\tconst handleImportValuesClipboard = useCallback(async () => {\n\t\ttry {\n\t\t\tconst json = await navigator.clipboard.readText();\n\t\t\tconst newValues = deserializeValues(json);\n\t\t\tconst changes = computeValueChanges(values, newValues);\n\t\t\tonValuesChange(changes);\n\t\t\tsetError(\"\");\n\t\t\talert(\"値をインポートしました\");\n\t\t} catch (err) {\n\t\t\tsetError(\n\t\t\t\t`クリップボードエラー: ${err instanceof Error ? err.message : String(err)}`,\n\t\t\t);\n\t\t}\n\t}, [onValuesChange, values]);\n\n\t// ─── Schema (Page) import/export ─────────────────────────────────────\n\tconst schemaFileInputRef = useRef<HTMLInputElement>(null);\n\n\tconst handleExportSchemaFile = useCallback(() => {\n\t\ttry {\n\t\t\tconst page = book.pages[0];\n\t\t\tconst schemaJson = JSON.stringify(\n\t\t\t\t{ grid: page.grid, blocks: page.blocks },\n\t\t\t\tnull,\n\t\t\t\t2,\n\t\t\t);\n\t\t\tconst blob = new Blob([schemaJson], { type: \"application/json\" });\n\t\t\tconst url = URL.createObjectURL(blob);\n\t\t\tconst a = document.createElement(\"a\");\n\t\t\ta.href = url;\n\t\t\ta.download = \"schema.json\";\n\t\t\ta.click();\n\t\t\tURL.revokeObjectURL(url);\n\t\t\tsetError(\"\");\n\t\t} catch (err) {\n\t\t\tsetError(\n\t\t\t\t`エクスポートエラー: ${err instanceof Error ? err.message : String(err)}`,\n\t\t\t);\n\t\t}\n\t}, [book]);\n\n\tconst handleImportSchemaFile = useCallback(() => {\n\t\tschemaFileInputRef.current?.click();\n\t}, []);\n\n\tconst handleSchemaFileChange = useCallback(\n\t\t(event: React.ChangeEvent<HTMLInputElement>) => {\n\t\t\tconst file = event.target.files?.[0];\n\t\t\tif (!file) return;\n\t\t\tconst reader = new FileReader();\n\t\t\treader.onload = (e) => {\n\t\t\t\ttry {\n\t\t\t\t\tconst raw = JSON.parse(e.target?.result as string);\n\t\t\t\t\tconst newPage = { grid: raw.grid, blocks: raw.blocks };\n\t\t\t\t\tconst newPages = [...book.pages] as typeof book.pages;\n\t\t\t\t\tnewPages[0] = newPage;\n\t\t\t\t\tonBookChange({ ...book, pages: newPages });\n\t\t\t\t\tsetError(\"\");\n\t\t\t\t\talert(\"スキーマをインポートしました\");\n\t\t\t\t} catch (err) {\n\t\t\t\t\tsetError(\n\t\t\t\t\t\t`インポートエラー: ${err instanceof Error ? err.message : String(err)}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t};\n\t\t\treader.readAsText(file);\n\t\t\tevent.target.value = \"\";\n\t\t},\n\t\t[book, onBookChange],\n\t);\n\n\treturn (\n\t\t<>\n\t\t\t<CollapsibleSection title=\"ブック\">\n\t\t\t\t<div className={styles.buttonGroup}>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclassName={styles.button}\n\t\t\t\t\t\tdata-testid=\"export-book-file\"\n\t\t\t\t\t\tonClick={handleExportBookFile}\n\t\t\t\t\t>\n\t\t\t\t\t\t📥 ファイルにエクスポート\n\t\t\t\t\t</button>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclassName={styles.button}\n\t\t\t\t\t\tdata-testid=\"export-book-clipboard\"\n\t\t\t\t\t\tonClick={handleExportBookClipboard}\n\t\t\t\t\t>\n\t\t\t\t\t\t📋 クリップボードにコピー\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t\t<div className={styles.buttonGroup}>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclassName={styles.button}\n\t\t\t\t\t\tdata-testid=\"import-book-file\"\n\t\t\t\t\t\tonClick={handleImportBookFile}\n\t\t\t\t\t>\n\t\t\t\t\t\t📤 ファイルからインポート\n\t\t\t\t\t</button>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclassName={styles.button}\n\t\t\t\t\t\tdata-testid=\"import-book-clipboard\"\n\t\t\t\t\t\tonClick={handleImportBookClipboard}\n\t\t\t\t\t>\n\t\t\t\t\t\t📋 クリップボードからペースト\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t\t<input\n\t\t\t\t\tref={bookFileInputRef}\n\t\t\t\t\ttype=\"file\"\n\t\t\t\t\taccept=\".json\"\n\t\t\t\t\tstyle={{ display: \"none\" }}\n\t\t\t\t\tonChange={handleBookFileChange}\n\t\t\t\t/>\n\t\t\t</CollapsibleSection>\n\n\t\t\t<CollapsibleSection title=\"値\">\n\t\t\t\t<div className={styles.buttonGroup}>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclassName={styles.button}\n\t\t\t\t\t\tdata-testid=\"export-values-file\"\n\t\t\t\t\t\tonClick={handleExportValuesFile}\n\t\t\t\t\t>\n\t\t\t\t\t\t📥 ファイルにエクスポート\n\t\t\t\t\t</button>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclassName={styles.button}\n\t\t\t\t\t\tdata-testid=\"export-values-clipboard\"\n\t\t\t\t\t\tonClick={handleExportValuesClipboard}\n\t\t\t\t\t>\n\t\t\t\t\t\t📋 クリップボードにコピー\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t\t<div className={styles.buttonGroup}>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclassName={styles.button}\n\t\t\t\t\t\tdata-testid=\"import-values-file\"\n\t\t\t\t\t\tonClick={handleImportValuesFile}\n\t\t\t\t\t>\n\t\t\t\t\t\t📤 ファイルからインポート\n\t\t\t\t\t</button>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclassName={styles.button}\n\t\t\t\t\t\tdata-testid=\"import-values-clipboard\"\n\t\t\t\t\t\tonClick={handleImportValuesClipboard}\n\t\t\t\t\t>\n\t\t\t\t\t\t📋 クリップボードからペースト\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t\t<input\n\t\t\t\t\tref={valuesFileInputRef}\n\t\t\t\t\ttype=\"file\"\n\t\t\t\t\taccept=\".json\"\n\t\t\t\t\tstyle={{ display: \"none\" }}\n\t\t\t\t\tonChange={handleValuesFileChange}\n\t\t\t\t/>\n\t\t\t</CollapsibleSection>\n\n\t\t\t<CollapsibleSection title=\"スキーマ\">\n\t\t\t\t<div className={styles.buttonGroup}>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclassName={styles.button}\n\t\t\t\t\t\tdata-testid=\"export-schema-file\"\n\t\t\t\t\t\tonClick={handleExportSchemaFile}\n\t\t\t\t\t>\n\t\t\t\t\t\t📥 スキーマをエクスポート\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t\t<div className={styles.buttonGroup}>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclassName={styles.button}\n\t\t\t\t\t\tdata-testid=\"import-schema-file\"\n\t\t\t\t\t\tonClick={handleImportSchemaFile}\n\t\t\t\t\t>\n\t\t\t\t\t\t📤 スキーマをインポート\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t\t<input\n\t\t\t\t\tref={schemaFileInputRef}\n\t\t\t\t\ttype=\"file\"\n\t\t\t\t\taccept=\".json\"\n\t\t\t\t\tstyle={{ display: \"none\" }}\n\t\t\t\t\tonChange={handleSchemaFileChange}\n\t\t\t\t/>\n\t\t\t</CollapsibleSection>\n\n\t\t\t{error && (\n\t\t\t\t<div className={styles.error} role=\"alert\">\n\t\t\t\t\t{error}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</>\n\t);\n};\n\nImportExportPanel.displayName = \"ImportExportPanel\";\n","import { TabPanel } from \"../../ui\";\nimport { ImportExportPanel } from \"./ImportExportPanel\";\n\nimport type React from \"react\";\nimport type { ReactNode } from \"react\";\nimport type { NoteContext } from \"../../../contexts/useNoteContext\";\n\n/**\n * `OtherPanel` コンポーネントへの props。\n */\nexport interface OtherPanelProps {\n\t/** NoteContext(`useNoteContext` が返すコンテキスト) */\n\tcontext: NoteContext;\n\n\t/** カスタムセクションの配列。未指定時はデフォルト構成(`ImportExportPanel`)が使用される */\n\tsections?: ReactNode[];\n}\n\n/**\n * その他設定パネル。インポート・エクスポートなどを含む。\n *\n * @remarks\n * **Shell** — `sections` で内容をカスタマイズできる。\n */\nexport const OtherPanel: React.FC<OtherPanelProps> = ({\n\tcontext,\n\tsections,\n}) => {\n\tconst defaultSections: ReactNode[] = [\n\t\t<ImportExportPanel\n\t\t\tkey=\"import-export\"\n\t\t\tbook={context.book}\n\t\t\tvalues={context.values}\n\t\t\tonBookChange={context.onBookChange}\n\t\t\tonValuesChange={context.onValuesChange ?? (() => {})}\n\t\t/>,\n\t];\n\n\tconst activeSections = sections ?? defaultSections;\n\n\treturn <TabPanel>{activeSections}</TabPanel>;\n};\n\nOtherPanel.displayName = \"OtherPanel\";\n","import { useCallback, useMemo } from \"react\";\n\nimport { useGridCalc } from \"../../../canvas/layers/GridLayer/hooks\";\nimport { NoteMode } from \"../../../types\";\nimport { DEFAULT_GRID } from \"../../../types/grid\";\nimport { startBlockDrag } from \"../../../utils/blockDrag\";\nimport styles from \"./PalettePanel.module.css\";\n\nimport type React from \"react\";\nimport type { NoteContext } from \"../../../contexts/useNoteContext\";\nimport type { ResolvedPlugin } from \"../../../plugin\";\nimport type { Value } from \"../../../types\";\nimport type { Block } from \"../../../types/block\";\n\n/**\n * `PalettePanel` コンポーネントへの props。\n */\nexport interface PalettePanelProps {\n\t/** NoteContext(`useNoteContext` が返すコンテキスト) */\n\tcontext: NoteContext;\n\n\t/** カスタムクラス名 */\n\tclassName?: string;\n}\n\n/**\n * ブロックをドラッグ&ドロップで挿入するためのパレットパネル。\n *\n * @remarks\n * **Shell** — ブロック未選択時にサイドバーに表示される。\n */\nexport const PalettePanel = ({ context, className }: PalettePanelProps) => {\n\tconst plugins = Object.values(context.pluginRegistry).filter(\n\t\t(p): p is ResolvedPlugin => p !== undefined,\n\t);\n\n\tconst currentPage = context.book.pages[context.editorState.pageIdx];\n\tconst { getBlockRectPx } = useGridCalc(\n\t\tcontext.book.paper,\n\t\tcurrentPage?.grid ?? DEFAULT_GRID,\n\t);\n\n\treturn (\n\t\t<div className={`${styles.container} ${className || \"\"}`}>\n\t\t\t<div className={styles.paletteItems}>\n\t\t\t\t{plugins.map((plugin) => {\n\t\t\t\t\tconst dSize = plugin.meta.defaultSize ?? { w: 1, h: 1 };\n\t\t\t\t\tconst rect = getBlockRectPx({\n\t\t\t\t\t\tid: \"ghost\",\n\t\t\t\t\t\tkind: plugin.kind,\n\t\t\t\t\t\tlayout: { x: 0, y: 0, w: dSize.w, h: dSize.h },\n\t\t\t\t\t\tprops: {},\n\t\t\t\t\t});\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<PaletteItem\n\t\t\t\t\t\t\tkey={plugin.kind}\n\t\t\t\t\t\t\tplugin={plugin}\n\t\t\t\t\t\t\tghostWidth={rect.width}\n\t\t\t\t\t\t\tghostHeight={rect.height}\n\t\t\t\t\t\t/>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nPalettePanel.displayName = \"PalettePanel\";\n\n/**\n * 個々のブロックアイテムの Props。\n *\n * @internal\n */\ninterface PaletteItemProps {\n\tplugin: ResolvedPlugin;\n\tghostWidth: number;\n\tghostHeight: number;\n}\n\nconst PaletteItem = ({ plugin, ghostWidth, ghostHeight }: PaletteItemProps) => {\n\t// プレビュー用のブロックオブジェクトを生成(canvas レイヤーへの依存を避けるため inline で生成)\n\tconst previewBlock = useMemo((): Block => {\n\t\treturn {\n\t\t\tid: `preview-${plugin.kind}`,\n\t\t\tkind: plugin.kind,\n\t\t\tlayout: {\n\t\t\t\tx: 0,\n\t\t\t\ty: 0,\n\t\t\t\tw: plugin.meta.defaultSize?.w ?? 1,\n\t\t\t\th: plugin.meta.defaultSize?.h ?? 1,\n\t\t\t},\n\t\t\tprops: {},\n\t\t};\n\t}, [plugin]);\n\n\t// プレビュー表示用のデフォルト値(パレットは外観確認のみのためnullで統一)\n\tconst previewValue: Value = null;\n\n\tconst handleDragStart = useCallback(\n\t\t(e: React.DragEvent<HTMLElement>) => {\n\t\t\tstartBlockDrag(e, plugin.kind, plugin.meta.defaultSize ?? { w: 1, h: 1 });\n\t\t\t// キャンバス側にゴーストが表示されるため、ドラッグ元はシンプルな半透明四角形にする\n\t\t\tconst w = Math.round(ghostWidth);\n\t\t\tconst h = Math.round(ghostHeight);\n\t\t\tconst ghost = document.createElement(\"div\");\n\t\t\tghost.style.cssText = `position:fixed;top:-9999px;left:-9999px;width:${w}px;height:${h}px;background:rgba(147,197,253,0.45);border-radius:4px;`;\n\t\t\tdocument.body.appendChild(ghost);\n\t\t\te.dataTransfer.setDragImage(ghost, w / 2, h / 2);\n\t\t\trequestAnimationFrame(() => document.body.removeChild(ghost));\n\t\t},\n\t\t[plugin, ghostWidth, ghostHeight],\n\t);\n\n\treturn (\n\t\t<div className={styles.item} data-testid={`palette-item-${plugin.kind}`}>\n\t\t\t{/* ドラッグ可能なヘッダー部分 */}\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tdraggable\n\t\t\t\tonDragStart={handleDragStart}\n\t\t\t\tclassName={styles.itemName}\n\t\t\t\taria-label={`${plugin.meta.displayName}ブロックを追加`}\n\t\t\t>\n\t\t\t\t{plugin.meta.displayName}\n\t\t\t</button>\n\t\t\t{/* プレビュー部分(非インタラクティブ) */}\n\t\t\t<div\n\t\t\t\tclassName={styles.itemPreview}\n\t\t\t\tdraggable\n\t\t\t\tonDragStart={handleDragStart}\n\t\t\t\taria-hidden=\"true\"\n\t\t\t>\n\t\t\t\t<plugin.Renderer\n\t\t\t\t\tid={previewBlock.id}\n\t\t\t\t\tprops={previewBlock.props}\n\t\t\t\t\tvalue={previewValue}\n\t\t\t\t\tonChange={() => {\n\t\t\t\t\t\t/* プレビューなので変更不可 */\n\t\t\t\t\t}}\n\t\t\t\t\treadOnly={true}\n\t\t\t\t\tmode={NoteMode.FORM}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nPaletteItem.displayName = \"PaletteItem\";\n"],"names":["ActionBarDivider","_props","styles","UndoIcon","size","rest","jsxs","jsx","RedoIcon","TrashIcon","CopyIcon","PasteIcon","DuplicateIcon","PrintIcon","StyleIcon","LayoutIcon","BlockSettingsIcon","ChevronLeftIcon","ChevronRightIcon","AddPageIcon","DeletePageIcon","ACTION_FEEDBACK_MAP","getActionFeedback","actionId","Checkbox","value","onChange","readOnly","propLabel","config","label","handleChange","useCallback","e","CollapsibleSection","title","children","collapsible","defaultCollapsed","isOpenProp","onOpenChange","description","actions","openLabel","closeLabel","noPadding","isCollapsedInternal","setIsCollapsedInternal","useState","isControlled","isCollapsed","handleToggle","nextOpen","showContent","contentClass","statusLabel","parseColor","hexMatch","hex","r","g","b","a","rgbaMatch","toHex","rgba","rHex","gHex","bHex","aHex","COLOR_PALETTE","ColorPalette","onColorSelect","selectedColor","color","index","isUndefined","isSelected","buttonStyle","NumberInput","propMin","propMax","propStep","propInteger","propPlaceholder","propWidth","propHeight","ariaLabel","onBlur","min","max","step","integer","placeholder","width","height","text","num","style","RGBAInputs","v","ColorPickerPopover","isOpen","onClose","onRgbaChange","popoverRef","useRef","useEffect","handleClickOutside","Z_INDEX","ColorPicker","showTextInput","propAllowUndefined","allowUndefined","setIsOpen","containerRef","rgbaValues","setRgbaValues","parsed","handleColorButtonClick","prev","textInputValue","setTextInputValue","handleTextChange","confirmTextInput","handleTextBlur","handleTextKeyDown","handlePaletteClick","colorValue","handleRgbaChange","channel","newValue","newRgba","displayText","colorStyle","containerStyle","DimensionInput","props","allowedUnits","currentUnit","handleValueChange","inputValue","unit","effectiveMin","handleBlur","handleUnitChange","newUnit","displayValue","displayUnit","u","Dropdown","options","allowEmpty","selectedValue","option","opt","hasValue","elementStyle","IconActionButton","icon","onClick","onMouseEnter","disabled","preventFocusOnMouseDown","TabPanel","emptyMessage","className","TabsContext","createContext","Tabs","defaultValue","propValue","onValueChange","variant","localValue","setLocalValue","TabsList","propStyle","context","useContext","computedStyle","TabsTrigger","TabsContent","TextInput","propMaxLength","propMultiline","propRows","maxLength","multiline","rows","commonProps","CanvasActionSection","actionContext","onActionFeedback","onPrint","resolvedCanUndo","resolvedCanRedo","resolvedHasCopied","runAction","feedback","Fragment","DEFAULT_DIMENSION","GridSettingsSection","grid","onGridChange","handleColsChange","newColCount","currentCols","expandSparseCols","currentColCount","newCols","i","colsToSparse","handleRowsChange","newRowCount","currentRows","expandSparseRows","currentRowCount","newRows","rowsToSparse","mmToUnit","mm","PRESET_OPTIONS","PaperSizePreset","PaperSettingsSection","paper","onPaperChange","isCustom","isFit","isWidthFit","handlePresetChange","preset","DEFAULT_PAPER_SIZES","handleWidthValueChange","target","val","minMm","toMm","minVal","newSize","handleHeightValueChange","handleHeightModeToggle","handleWidthModeToggle","setNestedValue","obj","path","keys","update","current","depth","key","_","nextValue","updated","getCommonValue","blocks","getValueByPath","firstValue","block","getPreviewSvgLines","borderStyle","w","h","lines","edgeLines","x1","y1","x2","y2","strokeW","_a","_b","dasharray","LineType","resolveBorderStyle","border","resolveEdge","edgeKey","edgeVal","result","BackgroundBorderPanel","selectedBlocks","onUpdateBlocks","handleBgColor","updates","handleBorderChange","edge","prop","edges","newStyle","currentBorder","edgeStyle","_c","previewBgColor","previewBorderStyle","useMemo","firstBlock","previewSvgLines","readEdge","renderInputs","BORDER_UNITS","triggerStyle","LayoutPanel","gridSize","isMultipleSelection","minX","minY","currentMin","maxX","maxY","boundingW","boundingH","clampedVal","offset","maxW","maxH","layoutPanelKey","AlignmentToggle","memo","isActive","DEFAULT_STYLE","checkboxStyleProp","labelStyle","rowStyle","CheckboxStyleEditor","checked","ClassicCheckboxVisual","BUTTONS","FontDecorationToggle","DEFAULT_FONT_FAMILY","FontStyleEditor","handleFontFamily","handleFontSize","handleColor","handleDecoration","decorationValue","FONT_UNITS","OptionsEditor","uid","useId","duplicateIndices","seen","dupes","handleAdd","newOption","handleRemove","handleLabelChange","newLabel","handleColorChange","newColor","handleAllowEmptyChange","inputStyle","PaddingLinkCheckbox","bulk","ZERO","PaddingEditor","handleBulkChange","handleAll","all","handleTop","top","handleRight","right","handleBottom","bottom","handleLeft","left","PADDING_UNITS","DEFAULT","textBehaviorProp","WORD_WRAP_OPTIONS","WordWrap","TextBehaviorEditor","lineHeight","wordWrap","COMBINED_OPTIONS","COMBINED_DROPDOWN_OPTIONS","o","PATTERN_HELP","TextValidationEditor","inputType","minLength","pattern","onChangeBatch","tooltipVisible","setTooltipVisible","tooltipStyle","setTooltipStyle","infoBtnRef","showTooltip","rect","hideTooltip","resolvedInputType","resolvedPattern","currentLabel","match","currentOpt","showLength","handleCombinedChange","nextPattern","k","createPortal","KIND_TITLES","HORIZONTAL_OPTIONS","HorizontalAlign","VERTICAL_OPTIONS","VerticalAlign","isDimension","isSelectOptionsConfig","PropDefEditor","kind","defaultProps","getVal","component","hValue","vValue","fontSizeRaw","fontStyleValue","rawTop","rawRight","rawBottom","rawLeft","rawBulk","rawAll","paddingValue","required","rawCfg","cfg","CustomComponent","primaryKey","rawVal","strVal","PropertyField","propDef","blockDefaults","onResetToDefault","primaryBlock","blockKind","isOverridden","handleOpenChange","open","defaults","PluginPanels","pluginRegistry","showGroupHeader","plugin","blockUpdates","handleChangeBatch","handleResetToDefault","newProps","fields","SelectionActionBarButton","SelectionActionBarContext","useSelectionActionBar","ctx","SelectionActionBar","items","onPointerDown","openPanel","setOpenPanel","wrapperEl","setWrapperEl","closeTimerRef","clearCloseTimer","handleWrapperMouseEnter","handleWrapperMouseLeave","handleMouseDown","openPanelByHover","panelId","openPanelByClick","SelectionActionBarPanel","id","getDefaultSelectionActionBarItems","editorState","selectedBlockIds","hasCopied","pageIdx","hasSelection","canPanel","canPlugin","runWithFeedback","fn","BAR_MARGIN","BAR_HEIGHT","SelectionActionBarOverlay","selectionBoundingBox","isDragging","zIndex","bbox","barTopAbove","barTop","overlayStyle","barStyle","useSelectionBounds","bounds","setBounds","rafId","container","containerRect","minLeft","minTop","maxRight","maxBottom","found","el","validateBlockId","currentId","allBlockIds","trimmed","MetaPanel","localId","setLocalId","idError","setIdError","handleIdBlur","newId","handleIdChange","newVal","handleReadOnlyChange","handleHeightFitChange","handleWidthFitChange","BlockPropertyPanel","DefaultBlockPropertyPanel","page","allSameKind","firstKind","DefaultsPropField","kindDefaults","onKindDefaultsChange","merged","pruned","BlockDefaultsPanel","pluginKinds","selectedKind","setSelectedKind","handleKindDefaultsChange","newKindDefaults","newBlockDefaults","p","BlockOrderPanel","onBlocksChange","onBlockHover","onBlockDragChange","draggedBlockId","setDraggedBlockId","previewInsertIndex","setPreviewInsertIndex","originalBlocksRef","dragStartDisplayIndexRef","displayBlocks","draggedIndex","idx","previewBlocks","draggedItem","clampedIndex","handleBringToFront","blockId","newBlocks","handleSendToBack","handleBringForward","temp","next","handleSendBackward","handleDragStart","displayIndex","actualIndex","handleDragEnd","handleDragOver","previewIndex","ghostPos","withoutIndex","mid","newInsertIndex","originalBlocks","originalDisplay","without","clamp","preview","handleDragLeave","handleDrop","finalBlocks","originalDisplayIndex","isGhost","CanvasActionPanel","canUndo","canRedo","CanvasPanel","GridSizePanel","MarginPanel","linkMargins","setLinkMargins","handleTopChange","newMargin","handleRightChange","handleBottomChange","handleLeftChange","PaperSizePanel","presetOptions","handleOrientationChange","landscape","handleWidthChange","handleHeightChange","heightLabel","widthLabel","minWidth","minHeight","DefaultCanvasPanel","book","onBookChange","handlePaperChange","newPaper","handleGridChange","newGrid","newPages","pg","gridSizeKey","handleBlocksChange","handleBlockDefaultsChange","computeValueChanges","changes","ImportExportPanel","values","onValuesChange","error","setError","bookFileInputRef","valuesFileInputRef","handleExportBookFile","json","serializeBook","blob","url","err","handleExportBookClipboard","importBookFromJson","newBook","deserializeBook","handleImportBookFile","handleBookFileChange","event","file","reader","handleImportBookClipboard","handleExportValuesFile","handleExportValuesClipboard","handleImportValuesFile","handleValuesFileChange","newValues","deserializeValues","handleImportValuesClipboard","schemaFileInputRef","handleExportSchemaFile","schemaJson","handleImportSchemaFile","handleSchemaFileChange","raw","newPage","OtherPanel","sections","defaultSections","activeSections","PalettePanel","plugins","currentPage","getBlockRectPx","useGridCalc","DEFAULT_GRID","dSize","PaletteItem","ghostWidth","ghostHeight","previewBlock","previewValue","startBlockDrag","ghost","NoteMode"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PalettePanel-BMZ6dfI3.cjs","sources":["../src/shell/bars/ActionBar/ActionBarDivider.tsx","../src/components/icons.tsx","../src/shell/actionFeedback/index.ts","../src/shell/ui/Checkbox/Checkbox.tsx","../src/shell/ui/CollapsibleSection/CollapsibleSection.tsx","../src/utils/color/func.ts","../src/utils/color/types.ts","../src/shell/ui/ColorPicker/ColorPalette.tsx","../src/shell/ui/NumberInput/NumberInput.tsx","../src/shell/ui/ColorPicker/RGBAInputs.tsx","../src/shell/ui/ColorPicker/ColorPickerPopover.tsx","../src/shell/ui/ColorPicker/ColorPicker.tsx","../src/shell/ui/DimensionInput/DimensionInput.tsx","../src/shell/ui/Dropdown/Dropdown.tsx","../src/shell/ui/IconActionButton/IconActionButton.tsx","../src/shell/ui/TabPanel/TabPanel.tsx","../src/shell/ui/Tabs/Tabs.tsx","../src/shell/ui/TextInput/TextInput.tsx","../src/shell/bars/ActionBar/CanvasActionSection.tsx","../src/shell/bars/ActionBar/GridSettingsSection.tsx","../src/shell/bars/ActionBar/PaperSettingsSection.tsx","../src/canvas/layers/BlockLayer/utils/setNestedValue.ts","../src/shell/panels/utils/getCommonValue.ts","../src/shell/panels/BlockPropertyPanel/BasePanels/BackgroundBorderPanel/BackgroundBorderPanel.tsx","../src/shell/panels/BlockPropertyPanel/BasePanels/LayoutPanel/LayoutPanel.tsx","../src/shell/panels/BlockPropertyPanel/PluginPanels/AlignmentToggle.tsx","../src/shell/panels/BlockPropertyPanel/PluginPanels/CheckboxStyleEditor.tsx","../src/shell/panels/BlockPropertyPanel/PluginPanels/FontDecorationToggle.tsx","../src/shell/panels/BlockPropertyPanel/PluginPanels/FontStyleEditor.tsx","../src/shell/panels/BlockPropertyPanel/PluginPanels/OptionsEditor.tsx","../src/shell/panels/BlockPropertyPanel/PluginPanels/PaddingLinkCheckbox.tsx","../src/shell/panels/BlockPropertyPanel/PluginPanels/PaddingEditor.tsx","../src/shell/panels/BlockPropertyPanel/PluginPanels/TextBehaviorEditor.tsx","../src/shell/panels/BlockPropertyPanel/PluginPanels/TextValidationEditor.tsx","../src/shell/panels/BlockPropertyPanel/PluginPanels/PropertyField.tsx","../src/shell/panels/BlockPropertyPanel/PluginPanels/PluginPanels.tsx","../src/shell/bars/SelectionActionBar/SelectionActionBarButton.tsx","../src/shell/bars/SelectionActionBar/SelectionActionBar.tsx","../src/shell/bars/SelectionActionBar/SelectionActionBarPanel.tsx","../src/shell/bars/SelectionActionBar/getDefaultSelectionActionBarItems.tsx","../src/shell/bars/SelectionActionBar/SelectionActionBarOverlay.tsx","../src/shell/bars/SelectionActionBar/useSelectionBounds.ts","../src/shell/panels/BlockPropertyPanel/BasePanels/MetaPanel/MetaPanel.tsx","../src/shell/panels/BlockPropertyPanel/BlockPropertyPanel.tsx","../src/shell/panels/BlockPropertyPanel/DefaultBlockPropertyPanel.tsx","../src/shell/panels/CanvasPanel/BlockDefaultsPanel/BlockDefaultsPanel.tsx","../src/shell/panels/CanvasPanel/BlockOrderPanel/BlockOrderPanel.tsx","../src/shell/panels/CanvasPanel/CanvasActionPanel/CanvasActionPanel.tsx","../src/shell/panels/CanvasPanel/CanvasPanel.tsx","../src/shell/panels/CanvasPanel/GridSizePanel/GridSizePanel.tsx","../src/shell/panels/CanvasPanel/MarginPanel/MarginPanel.tsx","../src/shell/panels/CanvasPanel/PaperSizePanel/PaperSizePanel.tsx","../src/shell/panels/CanvasPanel/DefaultCanvasPanel.tsx","../src/shell/panels/OtherPanel/ImportExportPanel/ImportExportPanel.tsx","../src/shell/panels/OtherPanel/OtherPanel.tsx","../src/shell/panels/PalettePanel/PalettePanel.tsx"],"sourcesContent":["import styles from \"./ActionBar.module.css\";\n\n/**\n * `ActionBar` 内のセクション間区切り線コンポーネントへの props。\n */\nexport type ActionBarDividerProps = Record<string, never>;\n\n/**\n * `ActionBar` 内のセクション間区切り線コンポーネント。\n *\n * @remarks\n * **Shell** — `ActionBar` により自動挿入される。通常は直接使用しない。\n */\nexport const ActionBarDivider = (_props: ActionBarDividerProps) => {\n\treturn <div className={styles.divider} aria-hidden=\"true\" />;\n};\n\nActionBarDivider.displayName = \"ActionBarDivider\";\n","import type { FC } from \"react\";\n\ninterface IconProps {\n\tsize?: number;\n\t\"aria-hidden\"?: boolean | \"true\" | \"false\";\n}\n\n/** 元に戻す(Undo) */\nexport const UndoIcon: FC<IconProps> = ({ size = 16, ...rest }) => (\n\t<svg\n\t\tviewBox=\"0 0 16 16\"\n\t\twidth={size}\n\t\theight={size}\n\t\tfill=\"none\"\n\t\tstroke=\"currentColor\"\n\t\tstrokeWidth={1.5}\n\t\tstrokeLinecap=\"round\"\n\t\tstrokeLinejoin=\"round\"\n\t\taria-hidden=\"true\"\n\t\t{...rest}\n\t>\n\t\t<path d=\"M3 7.5a5 5 0 1 1 1.5 3.5\" />\n\t\t<path d=\"M3 3.5v4h4\" />\n\t</svg>\n);\nUndoIcon.displayName = \"UndoIcon\";\n\n/** やり直し(Redo) */\nexport const RedoIcon: FC<IconProps> = ({ size = 16, ...rest }) => (\n\t<svg\n\t\tviewBox=\"0 0 16 16\"\n\t\twidth={size}\n\t\theight={size}\n\t\tfill=\"none\"\n\t\tstroke=\"currentColor\"\n\t\tstrokeWidth={1.5}\n\t\tstrokeLinecap=\"round\"\n\t\tstrokeLinejoin=\"round\"\n\t\taria-hidden=\"true\"\n\t\t{...rest}\n\t>\n\t\t<path d=\"M13 7.5a5 5 0 1 0-1.5 3.5\" />\n\t\t<path d=\"M13 3.5v4h-4\" />\n\t</svg>\n);\nRedoIcon.displayName = \"RedoIcon\";\n\n/** 削除(Delete / Trash) */\nexport const TrashIcon: FC<IconProps> = ({ size = 16, ...rest }) => (\n\t<svg\n\t\tviewBox=\"0 0 16 16\"\n\t\twidth={size}\n\t\theight={size}\n\t\tfill=\"none\"\n\t\tstroke=\"currentColor\"\n\t\tstrokeWidth={1.5}\n\t\tstrokeLinecap=\"round\"\n\t\tstrokeLinejoin=\"round\"\n\t\taria-hidden=\"true\"\n\t\t{...rest}\n\t>\n\t\t<polyline points=\"3,5 13,5\" />\n\t\t<path d=\"M6 5V3h4v2\" />\n\t\t<path d=\"M4 5l1 9h6l1-9\" />\n\t\t<line x1=\"6.5\" y1=\"7.5\" x2=\"6.5\" y2=\"11.5\" />\n\t\t<line x1=\"9.5\" y1=\"7.5\" x2=\"9.5\" y2=\"11.5\" />\n\t</svg>\n);\nTrashIcon.displayName = \"TrashIcon\";\n\n/** コピー(Copy) */\nexport const CopyIcon: FC<IconProps> = ({ size = 16, ...rest }) => (\n\t<svg\n\t\tviewBox=\"0 0 16 16\"\n\t\twidth={size}\n\t\theight={size}\n\t\tfill=\"none\"\n\t\tstroke=\"currentColor\"\n\t\tstrokeWidth={1.5}\n\t\tstrokeLinecap=\"round\"\n\t\tstrokeLinejoin=\"round\"\n\t\taria-hidden=\"true\"\n\t\t{...rest}\n\t>\n\t\t<rect x=\"5\" y=\"5\" width=\"8\" height=\"9\" rx=\"1\" />\n\t\t<path d=\"M3 11V3h8\" />\n\t</svg>\n);\nCopyIcon.displayName = \"CopyIcon\";\n\n/** 貼り付け(Paste) */\nexport const PasteIcon: FC<IconProps> = ({ size = 16, ...rest }) => (\n\t<svg\n\t\tviewBox=\"0 0 16 16\"\n\t\twidth={size}\n\t\theight={size}\n\t\tfill=\"none\"\n\t\tstroke=\"currentColor\"\n\t\tstrokeWidth={1.5}\n\t\tstrokeLinecap=\"round\"\n\t\tstrokeLinejoin=\"round\"\n\t\taria-hidden=\"true\"\n\t\t{...rest}\n\t>\n\t\t<rect x=\"2\" y=\"6\" width=\"12\" height=\"9\" rx=\"1\" />\n\t\t<path d=\"M5 6V4a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v2\" />\n\t\t<line x1=\"8\" y1=\"9\" x2=\"8\" y2=\"12\" />\n\t\t<line x1=\"6.5\" y1=\"10.5\" x2=\"9.5\" y2=\"10.5\" />\n\t</svg>\n);\nPasteIcon.displayName = \"PasteIcon\";\n\n/** 複製(Duplicate) */\nexport const DuplicateIcon: FC<IconProps> = ({ size = 16, ...rest }) => (\n\t<svg\n\t\tviewBox=\"0 0 16 16\"\n\t\twidth={size}\n\t\theight={size}\n\t\tfill=\"none\"\n\t\tstroke=\"currentColor\"\n\t\tstrokeWidth={1.5}\n\t\tstrokeLinecap=\"round\"\n\t\tstrokeLinejoin=\"round\"\n\t\taria-hidden=\"true\"\n\t\t{...rest}\n\t>\n\t\t<rect x=\"1\" y=\"4\" width=\"9\" height=\"9\" rx=\"1\" />\n\t\t<path d=\"M5 4V2h9v9h-2\" />\n\t</svg>\n);\nDuplicateIcon.displayName = \"DuplicateIcon\";\n\n/** 印刷(Print) */\nexport const PrintIcon: FC<IconProps> = ({ size = 16, ...rest }) => (\n\t<svg\n\t\tviewBox=\"0 0 16 16\"\n\t\twidth={size}\n\t\theight={size}\n\t\tfill=\"none\"\n\t\tstroke=\"currentColor\"\n\t\tstrokeWidth={1.5}\n\t\tstrokeLinecap=\"round\"\n\t\tstrokeLinejoin=\"round\"\n\t\taria-hidden=\"true\"\n\t\t{...rest}\n\t>\n\t\t<rect x=\"2\" y=\"5\" width=\"12\" height=\"8\" rx=\"1\" />\n\t\t<path d=\"M5 5V2h6v3\" />\n\t\t<path d=\"M5 12h6\" />\n\t\t<path d=\"M5 10h3\" />\n\t\t<rect\n\t\t\tx=\"4\"\n\t\t\ty=\"8\"\n\t\t\twidth=\"2\"\n\t\t\theight=\"1.5\"\n\t\t\tfill=\"currentColor\"\n\t\t\tstroke=\"none\"\n\t\t/>\n\t</svg>\n);\nPrintIcon.displayName = \"PrintIcon\";\n\n/** 選択解除(Close) */\nexport const CloseIcon: FC<IconProps> = ({ size = 16, ...rest }) => (\n\t<svg\n\t\tviewBox=\"0 0 16 16\"\n\t\twidth={size}\n\t\theight={size}\n\t\tfill=\"none\"\n\t\tstroke=\"currentColor\"\n\t\tstrokeWidth={1.5}\n\t\tstrokeLinecap=\"round\"\n\t\taria-hidden=\"true\"\n\t\t{...rest}\n\t>\n\t\t<line x1=\"3\" y1=\"3\" x2=\"13\" y2=\"13\" />\n\t\t<line x1=\"13\" y1=\"3\" x2=\"3\" y2=\"13\" />\n\t</svg>\n);\nCloseIcon.displayName = \"CloseIcon\";\n\n/** スタイル設定(Style) */\nexport const StyleIcon: FC<IconProps> = ({ size = 16, ...rest }) => (\n\t<svg\n\t\tviewBox=\"0 0 16 16\"\n\t\twidth={size}\n\t\theight={size}\n\t\tfill=\"none\"\n\t\tstroke=\"currentColor\"\n\t\tstrokeWidth={1.5}\n\t\tstrokeLinecap=\"round\"\n\t\tstrokeLinejoin=\"round\"\n\t\taria-hidden=\"true\"\n\t\t{...rest}\n\t>\n\t\t<circle cx=\"5\" cy=\"5\" r=\"2.5\" />\n\t\t<circle cx=\"11\" cy=\"5\" r=\"2.5\" />\n\t\t<circle cx=\"5\" cy=\"11\" r=\"2.5\" />\n\t\t<circle cx=\"11\" cy=\"11\" r=\"2.5\" />\n\t</svg>\n);\nStyleIcon.displayName = \"StyleIcon\";\n\n/** レイアウト設定(Layout) */\nexport const LayoutIcon: FC<IconProps> = ({ size = 16, ...rest }) => (\n\t<svg\n\t\tviewBox=\"0 0 16 16\"\n\t\twidth={size}\n\t\theight={size}\n\t\tfill=\"none\"\n\t\tstroke=\"currentColor\"\n\t\tstrokeWidth={1.5}\n\t\tstrokeLinecap=\"round\"\n\t\tstrokeLinejoin=\"round\"\n\t\taria-hidden=\"true\"\n\t\t{...rest}\n\t>\n\t\t<rect x=\"1.5\" y=\"1.5\" width=\"13\" height=\"13\" rx=\"1\" />\n\t\t<line x1=\"1.5\" y1=\"5.5\" x2=\"14.5\" y2=\"5.5\" />\n\t\t<line x1=\"7\" y1=\"5.5\" x2=\"7\" y2=\"14.5\" />\n\t</svg>\n);\nLayoutIcon.displayName = \"LayoutIcon\";\n\n/** ブロック設定(Block / Plugin) */\nexport const BlockSettingsIcon: FC<IconProps> = ({ size = 16, ...rest }) => (\n\t<svg\n\t\tviewBox=\"0 0 16 16\"\n\t\twidth={size}\n\t\theight={size}\n\t\tfill=\"none\"\n\t\tstroke=\"currentColor\"\n\t\tstrokeWidth={1.5}\n\t\tstrokeLinecap=\"round\"\n\t\tstrokeLinejoin=\"round\"\n\t\taria-hidden=\"true\"\n\t\t{...rest}\n\t>\n\t\t<rect x=\"2\" y=\"2\" width=\"5\" height=\"5\" rx=\"0.5\" />\n\t\t<rect x=\"9\" y=\"2\" width=\"5\" height=\"5\" rx=\"0.5\" />\n\t\t<rect x=\"2\" y=\"9\" width=\"5\" height=\"5\" rx=\"0.5\" />\n\t\t<circle cx=\"11.5\" cy=\"11.5\" r=\"2.5\" />\n\t\t<line x1=\"11.5\" y1=\"10\" x2=\"11.5\" y2=\"13\" />\n\t\t<line x1=\"10\" y1=\"11.5\" x2=\"13\" y2=\"11.5\" />\n\t</svg>\n);\nBlockSettingsIcon.displayName = \"BlockSettingsIcon\";\n\n/** 前のページへ(navigate_before / chevron_left) */\nexport const ChevronLeftIcon: FC<IconProps> = ({ size = 16, ...rest }) => (\n\t<svg\n\t\tviewBox=\"0 0 24 24\"\n\t\twidth={size}\n\t\theight={size}\n\t\tfill=\"currentColor\"\n\t\taria-hidden=\"true\"\n\t\t{...rest}\n\t>\n\t\t<path d=\"M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z\" />\n\t</svg>\n);\nChevronLeftIcon.displayName = \"ChevronLeftIcon\";\n\n/** 次のページへ(navigate_next / chevron_right) */\nexport const ChevronRightIcon: FC<IconProps> = ({ size = 16, ...rest }) => (\n\t<svg\n\t\tviewBox=\"0 0 24 24\"\n\t\twidth={size}\n\t\theight={size}\n\t\tfill=\"currentColor\"\n\t\taria-hidden=\"true\"\n\t\t{...rest}\n\t>\n\t\t<path d=\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\" />\n\t</svg>\n);\nChevronRightIcon.displayName = \"ChevronRightIcon\";\n\n/** ページ追加(add) */\nexport const AddPageIcon: FC<IconProps> = ({ size = 16, ...rest }) => (\n\t<svg\n\t\tviewBox=\"0 0 24 24\"\n\t\twidth={size}\n\t\theight={size}\n\t\tfill=\"currentColor\"\n\t\taria-hidden=\"true\"\n\t\t{...rest}\n\t>\n\t\t<path d=\"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\" />\n\t</svg>\n);\nAddPageIcon.displayName = \"AddPageIcon\";\n\n/** ページ削除(remove) */\nexport const DeletePageIcon: FC<IconProps> = ({ size = 16, ...rest }) => (\n\t<svg\n\t\tviewBox=\"0 0 24 24\"\n\t\twidth={size}\n\t\theight={size}\n\t\tfill=\"currentColor\"\n\t\taria-hidden=\"true\"\n\t\t{...rest}\n\t>\n\t\t<path d=\"M19 13H5v-2h14v2z\" />\n\t</svg>\n);\nDeletePageIcon.displayName = \"DeletePageIcon\";\n","/**\n * アクション実行後にトースト通知で表示するフィードバック情報。\n *\n * @remarks\n * `ActionBar` / `CanvasActionSection` に渡す `onActionFeedback` の引数型。\n */\nexport interface ActionFeedback {\n\t/** アクションの識別子 */\n\tactionId: string;\n\n\t/** トースト通知に表示するメッセージ */\n\tmessage: string;\n\n\t/** ショートカットキーの表示文字列(なしの場合は `null`) */\n\tshortcut: string | null;\n}\n\nconst ACTION_FEEDBACK_MAP: Record<string, ActionFeedback> = {\n\tundo: {\n\t\tactionId: \"undo\",\n\t\tmessage: \"元に戻しました\",\n\t\tshortcut: \"Ctrl+Z / Cmd+Z\",\n\t},\n\tredo: {\n\t\tactionId: \"redo\",\n\t\tmessage: \"やり直しました\",\n\t\tshortcut: \"Ctrl+Y / Cmd+Y, Ctrl+Shift+Z / Cmd+Shift+Z\",\n\t},\n\tdelete: {\n\t\tactionId: \"delete\",\n\t\tmessage: \"選択を削除しました\",\n\t\tshortcut: \"Delete / Backspace\",\n\t},\n\tcopy: {\n\t\tactionId: \"copy\",\n\t\tmessage: \"選択をコピーしました\",\n\t\tshortcut: \"Ctrl+C / Cmd+C\",\n\t},\n\tpaste: {\n\t\tactionId: \"paste\",\n\t\tmessage: \"貼り付けました\",\n\t\tshortcut: \"Ctrl+V / Cmd+V\",\n\t},\n\tduplicate: {\n\t\tactionId: \"duplicate\",\n\t\tmessage: \"選択を複製しました\",\n\t\tshortcut: \"Ctrl+D / Cmd+D\",\n\t},\n\tselect_all: {\n\t\tactionId: \"select_all\",\n\t\tmessage: \"全て選択しました\",\n\t\tshortcut: \"Ctrl+A / Cmd+A\",\n\t},\n\tdeselect_all: {\n\t\tactionId: \"deselect_all\",\n\t\tmessage: \"選択を解除しました\",\n\t\tshortcut: null,\n\t},\n\tprev_page: {\n\t\tactionId: \"prev_page\",\n\t\tmessage: \"前のページへ移動しました\",\n\t\tshortcut: null,\n\t},\n\tnext_page: {\n\t\tactionId: \"next_page\",\n\t\tmessage: \"次のページへ移動しました\",\n\t\tshortcut: null,\n\t},\n\tadd_page: {\n\t\tactionId: \"add_page\",\n\t\tmessage: \"ページを追加しました\",\n\t\tshortcut: null,\n\t},\n\tdelete_page: {\n\t\tactionId: \"delete_page\",\n\t\tmessage: \"ページを削除しました\",\n\t\tshortcut: null,\n\t},\n};\n\n/**\n * アクション ID に対応するフィードバック情報を返す。\n *\n * @param actionId - アクションの識別子\n * @returns 対応する `ActionFeedback` がない場合は `undefined`\n *\n * @remarks\n * `ActionBar` など内部コンポーネントで使用される。\n */\nexport const getActionFeedback = (\n\tactionId: string,\n): ActionFeedback | undefined => {\n\treturn ACTION_FEEDBACK_MAP[actionId];\n};\n","import { useCallback } from \"react\";\n\nimport styles from \"./Checkbox.module.css\";\n\nimport type React from \"react\";\nimport type { PropertyComponentProps } from \"../../../plugin\";\nimport type { Value } from \"../../../types/value\";\n\n/**\n * チェックボックス入力の設定オブジェクト。\n *\n * @remarks\n * **Shell** — `CheckboxProps.config` に渡す設定値の型。\n */\nexport interface CheckboxConfig {\n\t/** チェックボックスのラベルテキスト */\n\tlabel?: string;\n\t[key: string]: Value | undefined;\n}\n\n/**\n * チェックボックス入力コンポーネントへの props。\n */\nexport interface CheckboxProps\n\textends PropertyComponentProps<boolean | undefined> {\n\t/** チェックボックスのラベルテキスト */\n\tlabel?: string;\n\n\t/** `label` 等をまとめた設定オブジェクト。フィールドより優先度が低い */\n\tconfig?: CheckboxConfig;\n}\n\n/**\n * チェックボックス入力コンポーネント。\n *\n * @remarks\n * **Shell** — プラグインプロパティの編集 UI として使用する。\n */\nexport const Checkbox = ({\n\tvalue,\n\tonChange,\n\treadOnly = false,\n\tlabel: propLabel,\n\tconfig,\n}: CheckboxProps): React.ReactElement => {\n\tconst label = propLabel ?? config?.label;\n\n\tconst handleChange = useCallback(\n\t\t(e: React.ChangeEvent<HTMLInputElement>) => {\n\t\t\tonChange(e.target.checked);\n\t\t},\n\t\t[onChange],\n\t);\n\n\treturn (\n\t\t<label className={styles.container}>\n\t\t\t<input\n\t\t\t\ttype=\"checkbox\"\n\t\t\t\tclassName={styles.input}\n\t\t\t\tchecked={!!value}\n\t\t\t\tonChange={handleChange}\n\t\t\t\tdisabled={readOnly}\n\t\t\t/>\n\t\t\t{label && <span className={styles.label}>{label}</span>}\n\t\t</label>\n\t);\n};\n\nCheckbox.displayName = \"Checkbox\";\n","import { type ReactNode, useState } from \"react\";\n\nimport styles from \"./CollapsibleSection.module.css\";\n\n/**\n * 折りたたみ可能なセクションコンポーネントへの props。\n */\nexport interface CollapsibleSectionProps {\n\t/** セクションのタイトル */\n\ttitle: string;\n\n\t/** 子要素(コンテンツ) */\n\tchildren: ReactNode;\n\n\t/** 折りたたみ可能にするかどうか(デフォルト: false = 常時展開) */\n\tcollapsible?: boolean;\n\n\t/** 初期状態で折りたたむかどうか(collapsible が true のときのみ有効、デフォルト: true) */\n\tdefaultCollapsed?: boolean;\n\n\t/**\n\t * 開閉状態の外部制御(指定時は内部状態を使わず isOpen に従う)。\n\t * collapsible=true のときのみ有効。\n\t */\n\tisOpen?: boolean;\n\n\t/** 外部制御時の開閉変更コールバック */\n\tonOpenChange?: (open: boolean) => void;\n\n\t/** タイトル直右に表示する info アイコンのツールチップ説明文 */\n\tdescription?: string;\n\n\t/** ヘッダー右側に配置するアクション要素 */\n\tactions?: ReactNode;\n\n\t/** 開いているときに表示するラベル(例: \"カスタム\") */\n\topenLabel?: string;\n\n\t/** 閉じているときに表示するラベル(例: \"標準\") */\n\tcloseLabel?: string;\n\n\t/** コンテンツ領域のパディングを除去する */\n\tnoPadding?: boolean;\n}\n\n/**\n * 折りたたみ可能なセクションコンポーネント。\n *\n * @remarks\n * **Shell** — プロパティパネル等のセクション区切り UI として使用する。\n */\nexport const CollapsibleSection = ({\n\ttitle,\n\tchildren,\n\tcollapsible = false,\n\tdefaultCollapsed = true,\n\tisOpen: isOpenProp,\n\tonOpenChange,\n\tdescription,\n\tactions,\n\topenLabel,\n\tcloseLabel,\n\tnoPadding = false,\n}: CollapsibleSectionProps) => {\n\tconst [isCollapsedInternal, setIsCollapsedInternal] = useState(\n\t\tcollapsible ? defaultCollapsed : false,\n\t);\n\n\tconst isControlled = isOpenProp !== undefined;\n\tconst isCollapsed = isControlled ? !isOpenProp : isCollapsedInternal;\n\n\tconst handleToggle = () => {\n\t\tconst nextOpen = isCollapsed;\n\t\tif (isControlled) {\n\t\t\tonOpenChange?.(nextOpen);\n\t\t} else {\n\t\t\tsetIsCollapsedInternal(!nextOpen);\n\t\t\tonOpenChange?.(nextOpen);\n\t\t}\n\t};\n\n\tconst showContent = !collapsible || !isCollapsed;\n\tconst contentClass = noPadding ? styles.contentNoPadding : styles.content;\n\n\tconst statusLabel = collapsible\n\t\t? isCollapsed\n\t\t\t? closeLabel\n\t\t\t: openLabel\n\t\t: undefined;\n\n\treturn (\n\t\t<div className={styles.section}>\n\t\t\t{collapsible ? (\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclassName={styles.header}\n\t\t\t\t\tonClick={handleToggle}\n\t\t\t\t\taria-expanded={!isCollapsed}\n\t\t\t\t>\n\t\t\t\t\t<span className={styles.titleGroup}>\n\t\t\t\t\t\t<span className={styles.title}>{title}</span>\n\t\t\t\t\t\t{description && (\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tclassName={styles.infoIcon}\n\t\t\t\t\t\t\t\ttitle={description}\n\t\t\t\t\t\t\t\trole=\"img\"\n\t\t\t\t\t\t\t\taria-label={description}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\ti\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</span>\n\t\t\t\t\t{actions && (\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\trole=\"none\"\n\t\t\t\t\t\t\tclassName={styles.actions}\n\t\t\t\t\t\t\tonClick={(e) => e.stopPropagation()}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{actions}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t)}\n\t\t\t\t\t{statusLabel && (\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tclassName={`${styles.statusBadge} ${isCollapsed ? styles.statusBadgeOff : styles.statusBadgeOn}`}\n\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{statusLabel}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t)}\n\t\t\t\t\t<span\n\t\t\t\t\t\tclassName={`${styles.chevron} ${isCollapsed ? \"\" : styles.chevronOpen}`}\n\t\t\t\t\t\taria-hidden\n\t\t\t\t\t>\n\t\t\t\t\t\t▾\n\t\t\t\t\t</span>\n\t\t\t\t</button>\n\t\t\t) : (\n\t\t\t\t<div className={styles.header}>\n\t\t\t\t\t<span className={styles.titleGroup}>\n\t\t\t\t\t\t<span className={styles.title}>{title}</span>\n\t\t\t\t\t\t{description && (\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tclassName={styles.infoIcon}\n\t\t\t\t\t\t\t\ttitle={description}\n\t\t\t\t\t\t\t\trole=\"img\"\n\t\t\t\t\t\t\t\taria-label={description}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\ti\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</span>\n\t\t\t\t\t{actions && <span className={styles.actions}>{actions}</span>}\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{showContent && <div className={contentClass}>{children}</div>}\n\t\t</div>\n\t);\n};\n\nCollapsibleSection.displayName = \"CollapsibleSection\";\n","import type { RGBA } from \"./types\";\n\n/**\n * カラー文字列を RGBA オブジェクトに変換する。\n *\n * `#RRGGBB`・`#RRGGBBAA`(Hex)および `rgb()` / `rgba()` 形式に対応している。\n *\n * `value` が空・`undefined`、または認識できないフォーマットの場合は `null` を返す。\n */\nexport function parseColor(value: string | undefined): RGBA | null {\n\tif (!value) {\n\t\treturn null;\n\t}\n\n\t// Hex形式 (#RRGGBB または #RRGGBBAA)\n\tconst hexMatch = value.match(/^#([0-9a-f]{6}|[0-9a-f]{8})$/i);\n\tif (hexMatch && typeof hexMatch[1] === \"string\") {\n\t\tconst hex = hexMatch[1];\n\t\tconst r = Number.parseInt(hex.slice(0, 2), 16);\n\t\tconst g = Number.parseInt(hex.slice(2, 4), 16);\n\t\tconst b = Number.parseInt(hex.slice(4, 6), 16);\n\t\tconst a = hex.length === 8 ? Number.parseInt(hex.slice(6, 8), 16) / 255 : 1;\n\t\treturn { r, g, b, a };\n\t}\n\n\t// rgba形式\n\tconst rgbaMatch = value.match(\n\t\t/^rgba?\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(?:,\\s*([\\d.]+)\\s*)?\\)$/,\n\t);\n\tif (rgbaMatch) {\n\t\tconst r = Number.parseInt(rgbaMatch[1] ?? \"\", 10);\n\t\tconst g = Number.parseInt(rgbaMatch[2] ?? \"\", 10);\n\t\tconst b = Number.parseInt(rgbaMatch[3] ?? \"\", 10);\n\t\tconst a = rgbaMatch[4] ? Number.parseFloat(rgbaMatch[4]) : 1;\n\t\treturn { r, g, b, a };\n\t}\n\n\treturn null;\n}\n\n/**\n * RGBA オブジェクトを Hex 文字列に変換する。\n *\n * アルファ値が 1 未満の場合は `#RRGGBBAA` 形式、1 の場合は `#RRGGBB` 形式で返す。\n *\n * `a === 0`(完全透明)の場合は `undefined` を返す。\n */\nexport function toHex(rgba: RGBA): string | undefined {\n\tconst { r, g, b, a } = rgba;\n\n\tif (a === 0) {\n\t\treturn undefined;\n\t}\n\n\tconst rHex = r.toString(16).padStart(2, \"0\");\n\tconst gHex = g.toString(16).padStart(2, \"0\");\n\tconst bHex = b.toString(16).padStart(2, \"0\");\n\n\tif (a < 1) {\n\t\tconst aHex = Math.round(a * 255)\n\t\t\t.toString(16)\n\t\t\t.padStart(2, \"0\");\n\t\treturn `#${rHex}${gHex}${bHex}${aHex}`;\n\t}\n\n\treturn `#${rHex}${gHex}${bHex}`;\n}\n\n/**\n * Hex カラー文字列の妥当性をチェックする。\n *\n * `#RRGGBB` または `#RRGGBBAA` 形式の文字列を有効とみなす。\n */\nexport function isValidHex(hex: string): boolean {\n\treturn /^#([0-9a-f]{6}|[0-9a-f]{8})$/i.test(hex);\n}\n","/**\n * RGBA カラー型定義。\n */\nexport interface RGBA {\n\t/** 赤チャンネル(0–255) */\n\tr: number;\n\n\t/** 緑チャンネル(0–255) */\n\tg: number;\n\n\t/** 青チャンネル(0–255) */\n\tb: number;\n\n\t/** 不透明度(0–1) */\n\ta: number;\n}\n\n/**\n * カラーパレット定義(30色)。\n */\nexport const COLOR_PALETTE: { label: string; value: string | undefined }[] = [\n\t{ label: \"無色\", value: undefined },\n\t{ label: \"白\", value: \"#ffffff\" },\n\t{ label: \"グレー1\", value: \"#efefef\" },\n\t{ label: \"グレー2\", value: \"#d9d9d9\" },\n\t{ label: \"グレー3\", value: \"#cccccc\" },\n\t{ label: \"グレー4\", value: \"#b7b7b7\" },\n\t{ label: \"グレー5\", value: \"#999999\" },\n\t{ label: \"グレー6\", value: \"#666666\" },\n\t{ label: \"グレー7\", value: \"#434343\" },\n\t{ label: \"黒\", value: \"#000000\" },\n\t{ label: \"薄茶\", value: \"#E6B8AF\" },\n\t{ label: \"薄赤\", value: \"#F4CCCC\" },\n\t{ label: \"薄橙\", value: \"#FCE5CD\" },\n\t{ label: \"薄黄\", value: \"#FFF2CC\" },\n\t{ label: \"薄緑\", value: \"#D9EAD3\" },\n\t{ label: \"薄青緑\", value: \"#D0E0E3\" },\n\t{ label: \"薄青\", value: \"#C9DAF8\" },\n\t{ label: \"薄青紫\", value: \"#CFE2F3\" },\n\t{ label: \"薄紫\", value: \"#D9D2E9\" },\n\t{ label: \"薄赤紫\", value: \"#EAD1DC\" },\n\t{ label: \"茶\", value: \"#DD7E6B\" },\n\t{ label: \"赤\", value: \"#EA9999\" },\n\t{ label: \"橙\", value: \"#F9CB9C\" },\n\t{ label: \"黄\", value: \"#FFE599\" },\n\t{ label: \"緑\", value: \"#B6D7A8\" },\n\t{ label: \"青緑\", value: \"#A2C4C9\" },\n\t{ label: \"青\", value: \"#A4C2F4\" },\n\t{ label: \"青紫\", value: \"#9FC5E8\" },\n\t{ label: \"紫\", value: \"#B4A7D6\" },\n\t{ label: \"赤紫\", value: \"#D5A6BD\" },\n] as const;\n","import { COLOR_PALETTE } from \"../../../utils/color\";\nimport styles from \"./ColorPicker.module.css\";\n\nimport type React from \"react\";\n\n/**\n * カラーパレットコンポーネントへの props。\n */\nexport interface ColorPaletteProps {\n\t/** 色を選択時のコールバック */\n\tonColorSelect: (color: string | undefined) => void;\n\n\t/** 現在選択中の色(ハイライト用) */\n\tselectedColor?: string;\n\n\t/** `true` のとき読み取り専用 */\n\treadOnly?: boolean;\n}\n\n/**\n * カラーパレットコンポーネント。\n *\n * @remarks\n * `ColorPickerPopover` 内部のパレット UI。\n */\nexport const ColorPalette = ({\n\tonColorSelect,\n\tselectedColor,\n\treadOnly = false,\n}: ColorPaletteProps): React.ReactElement => {\n\treturn (\n\t\t<div className={styles.palette}>\n\t\t\t{COLOR_PALETTE.map((color, index) => {\n\t\t\t\tconst isUndefined = color.value === undefined;\n\t\t\t\tconst isSelected = color.value === selectedColor;\n\t\t\t\tconst buttonStyle: React.CSSProperties = isUndefined\n\t\t\t\t\t? {}\n\t\t\t\t\t: { backgroundColor: color.value };\n\n\t\t\t\treturn (\n\t\t\t\t\t<button\n\t\t\t\t\t\tkey={color.value ?? `undefined-${index}`}\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclassName={`${styles.paletteButton} ${isUndefined ? styles.transparentPaletteButton : \"\"} ${isSelected ? styles.selected : \"\"}`}\n\t\t\t\t\t\tonClick={() => onColorSelect(color.value)}\n\t\t\t\t\t\tdisabled={readOnly}\n\t\t\t\t\t\ttitle={color.label}\n\t\t\t\t\t\taria-label={color.label}\n\t\t\t\t\t\tstyle={buttonStyle}\n\t\t\t\t\t/>\n\t\t\t\t);\n\t\t\t})}\n\t\t</div>\n\t);\n};\n\nColorPalette.displayName = \"ColorPalette\";\n","import { useCallback } from \"react\";\n\nimport styles from \"./NumberInput.module.css\";\n\nimport type React from \"react\";\nimport type { PropertyComponentProps } from \"../../../plugin\";\nimport type { Value } from \"../../../types/value\";\n\n/**\n * 数値入力の設定オブジェクト。\n *\n * @remarks\n * **Shell** — `NumberInputProps.config` に渡す設定値の型。\n */\nexport interface NumberInputConfig {\n\t/** 最小値 */\n\tmin?: number;\n\n\t/** 最大値 */\n\tmax?: number;\n\n\t/** ステップ幅 */\n\tstep?: number;\n\n\t/** `true` のとき入力値を整数に丸める */\n\tinteger?: boolean;\n\n\t/** プレースホルダーテキスト */\n\tplaceholder?: string;\n\n\t/** 幅(px) */\n\twidth?: number;\n\n\t/** 高さ(px) */\n\theight?: number;\n\t[key: string]: Value | undefined;\n}\n\n/**\n * 数値入力コンポーネントへの props。\n */\nexport interface NumberInputProps\n\textends PropertyComponentProps<number | undefined> {\n\t/** 最小値 */\n\tmin?: number;\n\n\t/** 最大値 */\n\tmax?: number;\n\n\t/** ステップ幅 */\n\tstep?: number;\n\n\t/** `true` のとき入力値を整数に丸める */\n\tinteger?: boolean;\n\n\t/** プレースホルダーテキスト */\n\tplaceholder?: string;\n\n\t/** 幅(px) */\n\twidth?: number;\n\n\t/** 高さ(px) */\n\theight?: number;\n\n\t/** `aria-label` 属性に設定するテキスト */\n\tariaLabel?: string;\n\n\t/** `min`/`max`/`step` 等をまとめた設定オブジェクト。フィールドより優先度が低い */\n\tconfig?: NumberInputConfig;\n\n\t/** フォーカスが外れたときのコールバック */\n\tonBlur?: () => void;\n}\n\n/**\n * 数値入力コンポーネント。\n *\n * @remarks\n * **Shell** — プラグインプロパティの編集 UI として使用する。\n */\nexport const NumberInput = ({\n\tvalue,\n\tonChange,\n\treadOnly = false,\n\tmin: propMin,\n\tmax: propMax,\n\tstep: propStep,\n\tinteger: propInteger,\n\tplaceholder: propPlaceholder,\n\twidth: propWidth,\n\theight: propHeight,\n\tariaLabel,\n\tconfig,\n\tonBlur,\n}: NumberInputProps): React.ReactElement => {\n\tconst min = propMin ?? config?.min ?? 1;\n\tconst max = propMax ?? config?.max;\n\tconst step = propStep ?? config?.step ?? 1;\n\tconst integer = propInteger ?? config?.integer ?? false;\n\tconst placeholder = propPlaceholder ?? config?.placeholder;\n\tconst width = propWidth ?? config?.width;\n\tconst height = propHeight ?? config?.height;\n\n\tconst handleChange = useCallback(\n\t\t(e: React.ChangeEvent<HTMLInputElement>) => {\n\t\t\tconst text = e.target.value;\n\t\t\tif (text === \"\") {\n\t\t\t\tonChange(undefined);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlet num = Number.parseFloat(text);\n\t\t\tif (Number.isNaN(num)) return;\n\n\t\t\tif (integer) num = Math.round(num);\n\t\t\tif (min !== undefined && num < min) num = min;\n\t\t\tif (max !== undefined && num > max) num = max;\n\n\t\t\tonChange(num);\n\t\t},\n\t\t[onChange, min, max, integer],\n\t);\n\n\tconst style: React.CSSProperties = {};\n\tif (width !== undefined) style.width = `${width}px`;\n\n\tif (height !== undefined) {\n\t\tstyle.height = `${height}px`;\n\t\tstyle.paddingTop = 0;\n\t\tstyle.paddingBottom = 0;\n\t}\n\n\treturn (\n\t\t<input\n\t\t\ttype=\"number\"\n\t\t\tclassName={styles.input}\n\t\t\tstyle={style}\n\t\t\tvalue={value ?? \"\"}\n\t\t\tonChange={handleChange}\n\t\t\tonBlur={onBlur}\n\t\t\tdisabled={readOnly}\n\t\t\tmin={min}\n\t\t\tmax={max}\n\t\t\tstep={step}\n\t\t\tplaceholder={placeholder}\n\t\t\taria-label={ariaLabel}\n\t\t/>\n\t);\n};\n\nNumberInput.displayName = \"NumberInput\";\n","import { NumberInput } from \"../NumberInput/NumberInput\";\nimport styles from \"./ColorPicker.module.css\";\n\nimport type React from \"react\";\nimport type { RGBA } from \"../../../utils/color\";\n\n/**\n * RGBA 値入力コンポーネントへの props。\n */\nexport interface RGBAInputsProps {\n\t/** 現在の RGBA 値 */\n\trgba: RGBA;\n\n\t/** 各チャンネル変更時のコールバック(R/G/B: 0–2550、A: 0–1) */\n\tonChange: (channel: keyof RGBA, value: number | undefined) => void;\n\n\t/** `true` のとき読み取り専用 */\n\treadOnly?: boolean;\n}\n\n/**\n * RGBA 値入力コンポーネント。\n *\n * @remarks\n * `ColorPickerPopover` 内部の RGBA 入力 UI。\n */\nexport const RGBAInputs = ({\n\trgba,\n\tonChange,\n\treadOnly = false,\n}: RGBAInputsProps): React.ReactElement => {\n\treturn (\n\t\t<div className={styles.rgbaInputs}>\n\t\t\t<div className={styles.rgbaInputGroup}>\n\t\t\t\t<span className={styles.rgbaLabel}>R</span>\n\t\t\t\t<NumberInput\n\t\t\t\t\tvalue={rgba.r}\n\t\t\t\t\tonChange={(v) => onChange(\"r\", v)}\n\t\t\t\t\tmin={0}\n\t\t\t\t\tmax={255}\n\t\t\t\t\tstep={1}\n\t\t\t\t\tinteger={true}\n\t\t\t\t\twidth={48}\n\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t<div className={styles.rgbaInputGroup}>\n\t\t\t\t<span className={styles.rgbaLabel}>G</span>\n\t\t\t\t<NumberInput\n\t\t\t\t\tvalue={rgba.g}\n\t\t\t\t\tonChange={(v) => onChange(\"g\", v)}\n\t\t\t\t\tmin={0}\n\t\t\t\t\tmax={255}\n\t\t\t\t\tstep={1}\n\t\t\t\t\tinteger={true}\n\t\t\t\t\twidth={48}\n\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t<div className={styles.rgbaInputGroup}>\n\t\t\t\t<span className={styles.rgbaLabel}>B</span>\n\t\t\t\t<NumberInput\n\t\t\t\t\tvalue={rgba.b}\n\t\t\t\t\tonChange={(v) => onChange(\"b\", v)}\n\t\t\t\t\tmin={0}\n\t\t\t\t\tmax={255}\n\t\t\t\t\tstep={1}\n\t\t\t\t\tinteger={true}\n\t\t\t\t\twidth={48}\n\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t<div className={styles.rgbaInputGroup}>\n\t\t\t\t<span className={styles.rgbaLabel}>A</span>\n\t\t\t\t<NumberInput\n\t\t\t\t\tvalue={Math.round(rgba.a * 100)}\n\t\t\t\t\tonChange={(v) => onChange(\"a\", v !== undefined ? v / 100 : undefined)}\n\t\t\t\t\tmin={0}\n\t\t\t\t\tmax={100}\n\t\t\t\t\tstep={1}\n\t\t\t\t\tinteger={true}\n\t\t\t\t\twidth={48}\n\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nRGBAInputs.displayName = \"RGBAInputs\";\n","import { useEffect, useRef } from \"react\";\n\nimport { Z_INDEX } from \"../../../utils/zIndex/constants\";\nimport { ColorPalette } from \"./ColorPalette\";\nimport styles from \"./ColorPicker.module.css\";\nimport { RGBAInputs } from \"./RGBAInputs\";\n\nimport type React from \"react\";\nimport type { RGBA } from \"../../../utils/color\";\n\n/**\n * カラーピッカーポップオーバーコンポーネントへの props。\n */\nexport interface ColorPickerPopoverProps {\n\t/** ポップアップの開閉状態 */\n\tisOpen: boolean;\n\n\t/** 閉じるリクエスト時のコールバック */\n\tonClose: () => void;\n\n\t/** 現在の RGBA 値 */\n\trgba: RGBA;\n\n\t/** RGBA 各チャンネル変更時のコールバック */\n\tonRgbaChange: (channel: keyof RGBA, value: number | undefined) => void;\n\n\t/** パレットから色を選択時のコールバック */\n\tonColorSelect: (color: string | undefined) => void;\n\n\t/** 現在選択中の色(パレットハイライト用) */\n\tselectedColor?: string;\n\n\t/** `true` のとき読み取り専用 */\n\treadOnly?: boolean;\n}\n\n/**\n * カラーピッカーポップオーバーコンポーネント。\n *\n * @remarks\n * `ColorPicker` 内部のポップアップ UI。\n */\nexport const ColorPickerPopover = ({\n\tisOpen,\n\tonClose,\n\trgba,\n\tonRgbaChange,\n\tonColorSelect,\n\tselectedColor,\n\treadOnly = false,\n}: ColorPickerPopoverProps): React.ReactElement | null => {\n\tconst popoverRef = useRef<HTMLDivElement>(null);\n\n\t// 外側クリックでクローズ\n\tuseEffect(() => {\n\t\tif (!isOpen) return;\n\n\t\tconst handleClickOutside = (e: MouseEvent) => {\n\t\t\tif (\n\t\t\t\tpopoverRef.current &&\n\t\t\t\t!popoverRef.current.contains(e.target as Node)\n\t\t\t) {\n\t\t\t\tonClose();\n\t\t\t}\n\t\t};\n\n\t\tdocument.addEventListener(\"mousedown\", handleClickOutside);\n\t\treturn () => {\n\t\t\tdocument.removeEventListener(\"mousedown\", handleClickOutside);\n\t\t};\n\t}, [isOpen, onClose]);\n\n\tif (!isOpen) return null;\n\n\treturn (\n\t\t<div\n\t\t\tclassName={styles.popover}\n\t\t\tref={popoverRef}\n\t\t\tstyle={{ zIndex: Z_INDEX.DROPDOWN }}\n\t\t>\n\t\t\t{/* カラーパレット */}\n\t\t\t<ColorPalette\n\t\t\t\tonColorSelect={onColorSelect}\n\t\t\t\tselectedColor={selectedColor}\n\t\t\t\treadOnly={readOnly}\n\t\t\t/>\n\n\t\t\t{/* RGBA入力 */}\n\t\t\t<RGBAInputs rgba={rgba} onChange={onRgbaChange} readOnly={readOnly} />\n\t\t</div>\n\t);\n};\n\nColorPickerPopover.displayName = \"ColorPickerPopover\";\n","import { useCallback, useEffect, useRef, useState } from \"react\";\n\nimport { parseColor, toHex } from \"../../../utils/color\";\nimport styles from \"./ColorPicker.module.css\";\nimport { ColorPickerPopover } from \"./ColorPickerPopover\";\n\nimport type React from \"react\";\nimport type { PropertyComponentProps } from \"../../../plugin\";\nimport type { Value } from \"../../../types/value\";\nimport type { RGBA } from \"../../../utils/color\";\n\n/**\n * カラーピッカーの設定オブジェクト。\n *\n * @remarks\n * **Shell** — `ColorPickerProps.config` に渡す設定値の型。\n */\nexport interface ColorPickerConfig {\n\t/** `true` のとき未設定(`undefined`)を許容する */\n\tallowUndefined?: boolean;\n\n\t/** 幅(px) */\n\twidth?: number;\n\n\t/** 高さ(px) */\n\theight?: number;\n\t[key: string]: Value | undefined;\n}\n\n/**\n * カラーピッカーコンポーネントへの props。\n */\nexport interface ColorPickerProps\n\textends PropertyComponentProps<string | undefined> {\n\t/** カラーテキスト入力を表示するか */\n\tshowTextInput?: boolean;\n\n\t/** undefined(未設定)を許容するか */\n\tallowUndefined?: boolean;\n\n\t/** プレースホルダーテキスト */\n\tplaceholder?: string;\n\n\t/** 幅(px) */\n\twidth?: number;\n\n\t/** 高さ(px) */\n\theight?: number;\n\n\t/** 設定オブジェクト */\n\tconfig?: ColorPickerConfig;\n}\n\n/**\n * カラーピッカーコンポーネント。\n *\n * @remarks\n * **Shell** — プラグインプロパティの編集 UI として使用する。\n */\nexport const ColorPicker = ({\n\tvalue,\n\tonChange,\n\treadOnly = false,\n\tshowTextInput = true,\n\tallowUndefined: propAllowUndefined,\n\tplaceholder: propPlaceholder,\n\twidth: propWidth,\n\theight: propHeight,\n\tconfig,\n}: ColorPickerProps): React.ReactElement => {\n\tconst allowUndefined = propAllowUndefined ?? config?.allowUndefined ?? true;\n\tconst placeholder =\n\t\tpropPlaceholder ?? (allowUndefined ? \"未設定\" : \"#000000\");\n\tconst width = propWidth ?? config?.width;\n\tconst height = propHeight ?? config?.height;\n\n\tconst [isOpen, setIsOpen] = useState(false);\n\tconst containerRef = useRef<HTMLDivElement>(null);\n\n\tconst [rgbaValues, setRgbaValues] = useState<RGBA>(() => {\n\t\tconst parsed = parseColor(value);\n\t\treturn parsed ?? { r: 0, g: 0, b: 0, a: 1 };\n\t});\n\n\tuseEffect(() => {\n\t\tconst parsed = parseColor(value);\n\t\tif (parsed) {\n\t\t\tsetRgbaValues(parsed);\n\t\t}\n\t}, [value]);\n\n\tconst handleColorButtonClick = useCallback(() => {\n\t\tif (!readOnly) {\n\t\t\tsetIsOpen((prev) => !prev);\n\t\t}\n\t}, [readOnly]);\n\n\tconst [textInputValue, setTextInputValue] = useState(\n\t\tvalue ? value.replace(/^#/, \"\") : \"\",\n\t);\n\n\tuseEffect(() => {\n\t\tsetTextInputValue(value ? value.replace(/^#/, \"\") : \"\");\n\t}, [value]);\n\n\tconst handleTextChange = useCallback(\n\t\t(e: React.ChangeEvent<HTMLInputElement>) => {\n\t\t\tconst text = e.target.value;\n\t\t\tif (/^[0-9A-Fa-f]*$/.test(text)) {\n\t\t\t\tsetTextInputValue(text);\n\t\t\t}\n\t\t},\n\t\t[],\n\t);\n\n\tconst confirmTextInput = useCallback(\n\t\t(text: string) => {\n\t\t\tif (text === \"\" && allowUndefined) {\n\t\t\t\tonChange(undefined);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (/^[0-9A-Fa-f]{6}([0-9A-Fa-f]{2})?$/.test(text)) {\n\t\t\t\tconst hex = `#${text}`;\n\t\t\t\tconst parsed = parseColor(hex);\n\t\t\t\tif (parsed) setRgbaValues(parsed);\n\t\t\t\tonChange(hex);\n\t\t\t} else {\n\t\t\t\tsetTextInputValue(value ? value.replace(/^#/, \"\") : \"\");\n\t\t\t}\n\t\t},\n\t\t[onChange, allowUndefined, value],\n\t);\n\n\tconst handleTextBlur = useCallback(\n\t\t(e: React.FocusEvent<HTMLInputElement>) => {\n\t\t\tconfirmTextInput(e.target.value);\n\t\t},\n\t\t[confirmTextInput],\n\t);\n\n\tconst handleTextKeyDown = useCallback(\n\t\t(e: React.KeyboardEvent<HTMLInputElement>) => {\n\t\t\tif (e.key === \"Enter\") {\n\t\t\t\te.preventDefault();\n\t\t\t\tconfirmTextInput(e.currentTarget.value);\n\t\t\t\te.currentTarget.blur();\n\t\t\t}\n\t\t},\n\t\t[confirmTextInput],\n\t);\n\n\tconst handlePaletteClick = useCallback(\n\t\t(colorValue: string | undefined) => {\n\t\t\tif (colorValue) {\n\t\t\t\tconst parsed = parseColor(colorValue);\n\t\t\t\tif (parsed) {\n\t\t\t\t\tsetRgbaValues(parsed);\n\t\t\t\t\tsetTextInputValue(colorValue.replace(/^#/, \"\"));\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tsetTextInputValue(\"\");\n\t\t\t}\n\t\t\t// ポップオーバーは閉じない(RGBAバーで値が更新されたことをユーザーが確認できるように)\n\t\t\tonChange(colorValue);\n\t\t},\n\t\t[onChange],\n\t);\n\n\tconst handleRgbaChange = useCallback(\n\t\t(channel: keyof RGBA, newValue: number | undefined) => {\n\t\t\tif (newValue === undefined) return;\n\t\t\tconst newRgba = { ...rgbaValues, [channel]: newValue };\n\t\t\tsetRgbaValues(newRgba);\n\t\t\tonChange(toHex(newRgba));\n\t\t},\n\t\t[rgbaValues, onChange],\n\t);\n\n\tconst displayText = value ?? \"未設定\";\n\n\tconst colorStyle: React.CSSProperties = {};\n\tif (value) {\n\t\tcolorStyle.background = value;\n\t}\n\n\tconst containerStyle: React.CSSProperties = {};\n\tif (width !== undefined) {\n\t\tcontainerStyle.width = `${width}px`;\n\t} else {\n\t\tcontainerStyle.width = \"100%\";\n\t}\n\tif (height !== undefined) containerStyle.height = `${height}px`;\n\n\treturn (\n\t\t<div className={styles.container} style={containerStyle} ref={containerRef}>\n\t\t\t{/* カラーボタン */}\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tclassName={styles.colorButton}\n\t\t\t\tonClick={handleColorButtonClick}\n\t\t\t\tdisabled={readOnly}\n\t\t\t\ttitle={displayText}\n\t\t\t\taria-label=\"カラーピッカーを開く\"\n\t\t\t\tstyle={colorStyle}\n\t\t\t/>\n\t\t\t{/* テキスト入力 */}\n\t\t\t{showTextInput && (\n\t\t\t\t<div className={styles.textInputWrapper}>\n\t\t\t\t\t<span className={styles.textInputPrefix}>#</span>\n\t\t\t\t\t<input\n\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\tclassName={styles.textInput}\n\t\t\t\t\t\tvalue={textInputValue}\n\t\t\t\t\t\tonChange={handleTextChange}\n\t\t\t\t\t\tonKeyDown={handleTextKeyDown}\n\t\t\t\t\t\tonBlur={handleTextBlur}\n\t\t\t\t\t\tdisabled={readOnly}\n\t\t\t\t\t\tplaceholder={placeholder}\n\t\t\t\t\t\tmaxLength={8}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t{/* ポップオーバー */}\n\t\t\t<ColorPickerPopover\n\t\t\t\tisOpen={isOpen}\n\t\t\t\tonClose={() => setIsOpen(false)}\n\t\t\t\trgba={rgbaValues}\n\t\t\t\tonRgbaChange={handleRgbaChange}\n\t\t\t\tonColorSelect={handlePaletteClick}\n\t\t\t\tselectedColor={value}\n\t\t\t\treadOnly={readOnly}\n\t\t\t/>\n\t\t</div>\n\t);\n};\n\nColorPicker.displayName = \"ColorPicker\";\n","import { useCallback } from \"react\";\n\nimport styles from \"./DimensionInput.module.css\";\n\nimport type React from \"react\";\nimport type { PropertyComponentProps } from \"../../../plugin\";\nimport type { Dimension, Unit } from \"../../../types/unit\";\nimport type { Value } from \"../../../types/value\";\n\n/**\n * `Dimension`(値+単位)入力の設定オブジェクト。\n *\n * @remarks\n * **Shell** — `DimensionInputProps.config` に渡す設定値の型。\n */\nexport interface DimensionInputConfig<U extends Unit> {\n\t/** 選択可能な単位の一覧 */\n\tallowedUnits?: readonly U[];\n\n\t/** 最小値 */\n\tmin?: number;\n\n\t/** 最大値 */\n\tmax?: number;\n\n\t/** ステップ幅 */\n\tstep?: number;\n\n\t/** プレースホルダーテキスト */\n\tplaceholder?: string;\n\n\t/** 幅(px) */\n\twidth?: number;\n\n\t/** 高さ(px) */\n\theight?: number;\n\t[key: string]: Value | undefined;\n}\n\n/**\n * `Dimension`(値+単位)入力コンポーネントへの props。\n */\nexport interface DimensionInputProps<U extends Unit>\n\textends PropertyComponentProps<Dimension<U> | undefined> {\n\t/** 選択可能な単位の一覧 */\n\tallowedUnits?: readonly U[];\n\n\t/** 最小値 */\n\tmin?: number;\n\n\t/** 最大値 */\n\tmax?: number;\n\n\t/** ステップ幅 */\n\tstep?: number;\n\n\t/** プレースホルダーテキスト */\n\tplaceholder?: string;\n\n\t/** 幅(px) */\n\twidth?: number;\n\n\t/** 高さ(px) */\n\theight?: number;\n\n\t/** `aria-label` 属性に設定するテキスト */\n\tariaLabel?: string;\n\n\t/** 各フィールドをまとめた設定オブジェクト。フィールドより優先度が低い */\n\tconfig?: DimensionInputConfig<U>;\n}\n\n/**\n * `Dimension`(値+単位)入力コンポーネント。\n *\n * @remarks\n * **Shell** — プラグインプロパティの編集 UI として使用する。\n */\nexport const DimensionInput = <U extends Unit>(\n\tprops: DimensionInputProps<U>,\n): React.ReactElement => {\n\tconst { value, onChange, readOnly = false, config } = props;\n\n\tconst allowedUnits = props.allowedUnits ?? config?.allowedUnits;\n\tconst min = props.min ?? config?.min;\n\tconst max = props.max ?? config?.max;\n\tconst step = props.step ?? config?.step ?? 1;\n\tconst placeholder = props.placeholder ?? config?.placeholder;\n\tconst width = props.width ?? config?.width;\n\tconst height = props.height ?? config?.height;\n\tconst ariaLabel = props.ariaLabel;\n\n\tconst currentUnit = value?.unit ?? allowedUnits?.[0];\n\n\tconst handleValueChange = useCallback(\n\t\t(e: React.ChangeEvent<HTMLInputElement>) => {\n\t\t\tconst inputValue = e.target.value;\n\t\t\tconst unit = value?.unit ?? currentUnit;\n\t\t\tif (unit === undefined) return;\n\n\t\t\tlet newValue = Number.parseFloat(inputValue);\n\t\t\tif (Number.isNaN(newValue)) return;\n\n\t\t\tconst effectiveMin = min ?? 1;\n\t\t\tif (newValue < effectiveMin) {\n\t\t\t\tnewValue = effectiveMin;\n\t\t\t}\n\t\t\tif (max !== undefined && newValue > max) {\n\t\t\t\tnewValue = max;\n\t\t\t}\n\n\t\t\tonChange({ value: newValue, unit });\n\t\t},\n\t\t[value, onChange, currentUnit, min, max],\n\t);\n\n\tconst handleBlur = useCallback(\n\t\t(e: React.FocusEvent<HTMLInputElement>) => {\n\t\t\tconst inputValue = e.target.value;\n\t\t\tif (inputValue === \"\") return;\n\t\t\tconst unit = value?.unit ?? currentUnit;\n\t\t\tif (unit === undefined) return;\n\n\t\t\tlet newValue = Number.parseFloat(inputValue);\n\t\t\tif (Number.isNaN(newValue)) return;\n\n\t\t\tconst effectiveMin = min ?? 1;\n\t\t\tif (newValue < effectiveMin) {\n\t\t\t\tnewValue = effectiveMin;\n\t\t\t\tonChange({ value: newValue, unit });\n\t\t\t}\n\t\t\tif (max !== undefined && newValue > max) {\n\t\t\t\tnewValue = max;\n\t\t\t\tonChange({ value: newValue, unit });\n\t\t\t}\n\t\t},\n\t\t[value, onChange, currentUnit, min, max],\n\t);\n\n\tconst handleUnitChange = useCallback(\n\t\t(e: React.ChangeEvent<HTMLSelectElement>) => {\n\t\t\tconst newUnit = e.target.value as U;\n\t\t\tonChange({ value: value?.value ?? 1, unit: newUnit });\n\t\t},\n\t\t[value, onChange],\n\t);\n\n\tconst displayValue = value?.value ?? \"\";\n\tconst displayUnit = value?.unit ?? currentUnit ?? \"\";\n\n\tconst containerStyle: React.CSSProperties = {};\n\tif (width !== undefined) {\n\t\tcontainerStyle.width = `${width}px`;\n\t} else {\n\t\tcontainerStyle.width = \"100%\";\n\t}\n\tif (height !== undefined) containerStyle.height = `${height}px`;\n\n\treturn (\n\t\t<div className={styles.container} style={containerStyle}>\n\t\t\t<input\n\t\t\t\ttype=\"number\"\n\t\t\t\tclassName={styles.valueInput}\n\t\t\t\tvalue={displayValue}\n\t\t\t\tonChange={handleValueChange}\n\t\t\t\tonBlur={handleBlur}\n\t\t\t\tplaceholder={placeholder}\n\t\t\t\tmin={min ?? 1}\n\t\t\t\tmax={max}\n\t\t\t\tstep={step}\n\t\t\t\treadOnly={readOnly}\n\t\t\t\tdisabled={readOnly}\n\t\t\t\taria-label={ariaLabel}\n\t\t\t/>\n\t\t\t<select\n\t\t\t\tclassName={styles.unitSelect}\n\t\t\t\tvalue={displayUnit}\n\t\t\t\tonChange={handleUnitChange}\n\t\t\t\tdisabled={readOnly || !allowedUnits || allowedUnits.length <= 1}\n\t\t\t\taria-label=\"単位\"\n\t\t\t>\n\t\t\t\t{allowedUnits ? (\n\t\t\t\t\tallowedUnits.map((u) => (\n\t\t\t\t\t\t<option key={u} value={u}>\n\t\t\t\t\t\t\t{u}\n\t\t\t\t\t\t</option>\n\t\t\t\t\t))\n\t\t\t\t) : (\n\t\t\t\t\t<option value={displayUnit as string}>{displayUnit}</option>\n\t\t\t\t)}\n\t\t\t</select>\n\t\t</div>\n\t);\n};\n","import { useCallback } from \"react\";\n\nimport styles from \"./Dropdown.module.css\";\n\nimport type React from \"react\";\nimport type { PropertyComponentProps } from \"../../../plugin\";\nimport type { Value } from \"../../../types/value\";\n\n/**\n * ドロップダウンの選択肢オブジェクト。\n *\n * @remarks\n * **Shell** — `DropdownConfig.options` や `DropdownProps.options` に渡す選択肖の型。\n */\nexport interface DropdownOption {\n\t/** 選択時に `onChange` に渡される値 */\n\tvalue: Value;\n\n\t/** 画面表示ラベル */\n\tlabel: string;\n\t[key: string]: Value;\n}\n\n/**\n * ドロップダウン選択の設定オブジェクト。\n *\n * @remarks\n * **Shell** — `DropdownProps.config` に渡す設定値の型。\n */\nexport interface DropdownConfig {\n\t/** 選択肢の一覧 */\n\toptions?: readonly DropdownOption[];\n\n\t/** 未選択時のプレースホルダーテキスト */\n\tplaceholder?: string;\n\n\t/** 幅(px) */\n\twidth?: number;\n\n\t/** 高さ(px) */\n\theight?: number;\n\n\t/** `false` のとき「未選択」状態を選択不可にする(デフォルト: `true`) */\n\tallowEmpty?: boolean;\n\t[key: string]: Value | undefined;\n}\n\n/**\n * ドロップダウン選択コンポーネントへの props。\n */\nexport interface DropdownProps<T extends string = string>\n\textends PropertyComponentProps<T | undefined> {\n\t/** 選択肢の一覧 */\n\toptions?: readonly DropdownOption[];\n\n\t/** 未選択時のプレースホルダーテキスト */\n\tplaceholder?: string;\n\n\t/** 幅(px) */\n\twidth?: number;\n\n\t/** 高さ(px) */\n\theight?: number;\n\n\t/** `aria-label` 属性に設定するテキスト */\n\tariaLabel?: string;\n\n\t/** `false` のとき「未選択」状態を選択不可にする(デフォルト: `true`) */\n\tallowEmpty?: boolean;\n\n\t/** 各フィールドをまとめた設定オブジェクト。フィールドより優先度が低い */\n\tconfig?: DropdownConfig;\n}\n\n/**\n * ドロップダウン選択コンポーネント。\n *\n * @remarks\n * **Shell** — プラグインプロパティの編集 UI として使用する。\n */\nexport const Dropdown = <T extends string = string>(\n\tprops: DropdownProps<T>,\n): React.ReactElement => {\n\tconst { value, onChange, readOnly = false, config } = props;\n\n\tconst options = props.options ?? config?.options ?? [];\n\tconst placeholder =\n\t\tprops.placeholder ?? config?.placeholder ?? \"選択してください\";\n\tconst width = props.width ?? config?.width;\n\tconst height = props.height ?? config?.height;\n\tconst allowEmpty = props.allowEmpty ?? config?.allowEmpty ?? true;\n\n\tconst handleChange = useCallback(\n\t\t(e: React.ChangeEvent<HTMLSelectElement>) => {\n\t\t\tconst selectedValue = e.target.value;\n\t\t\tif (selectedValue === \"\") {\n\t\t\t\tonChange(undefined);\n\t\t\t} else {\n\t\t\t\tconst option = options.find(\n\t\t\t\t\t(opt) => String(opt.value) === selectedValue,\n\t\t\t\t);\n\t\t\t\tif (option) {\n\t\t\t\t\tonChange(option.value as T);\n\t\t\t\t} else {\n\t\t\t\t\tonChange(selectedValue as T);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t[onChange, options],\n\t);\n\n\tconst displayValue = value ?? \"\";\n\tconst hasValue = value !== undefined && value !== \"\";\n\n\tconst containerStyle: React.CSSProperties = {};\n\tif (width !== undefined) {\n\t\tcontainerStyle.width = `${width}px`;\n\t} else {\n\t\tcontainerStyle.width = \"100%\";\n\t}\n\n\tconst elementStyle: React.CSSProperties = {\n\t\twidth: \"100%\",\n\t\theight: height ? `${height}px` : undefined,\n\t};\n\n\treturn (\n\t\t<div className={styles.container} style={containerStyle}>\n\t\t\t{!hasValue && (\n\t\t\t\t<div className={styles.placeholderOverlay} style={elementStyle}>\n\t\t\t\t\t{placeholder}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t<select\n\t\t\t\tclassName={styles.select}\n\t\t\t\tstyle={elementStyle}\n\t\t\t\tvalue={displayValue}\n\t\t\t\tonChange={handleChange}\n\t\t\t\tdisabled={readOnly}\n\t\t\t\taria-label={props.ariaLabel}\n\t\t\t>\n\t\t\t\t{allowEmpty && <option value=\"\" style={{ display: \"none\" }} />}\n\t\t\t\t{options.map((option) => (\n\t\t\t\t\t<option key={String(option.value)} value={String(option.value)}>\n\t\t\t\t\t\t{option.label}\n\t\t\t\t\t</option>\n\t\t\t\t))}\n\t\t\t</select>\n\t\t</div>\n\t);\n};\n\nDropdown.displayName = \"Dropdown\";\n","import styles from \"./IconActionButton.module.css\";\n\nimport type React from \"react\";\n\n/**\n * アイコンボタンコンポーネントへの props。\n\n */\nexport interface IconActionButtonProps {\n\t/** ボタン内に表示するアイコン */\n\ticon: React.ReactNode;\n\n\t/** アクセシビリティ用ラベル(`aria-label` および `title` のデフォルト値) */\n\tlabel: string;\n\n\t/** クリック時のコールバック */\n\tonClick?: () => void;\n\n\t/** マウスホバー時のコールバック */\n\tonMouseEnter?: () => void;\n\n\t/** `true` のとき非活性化 */\n\tdisabled?: boolean;\n\n\t/** ツールチップテキスト。省略時は `label` を使用する */\n\ttitle?: string;\n\n\t/** `true` のとき `mousedown` でフォーカスを奪わない。パネルを閉じたくない操作に使用する */\n\tpreventFocusOnMouseDown?: boolean;\n}\n\n/**\n * アイコンボタンコンポーネント。\n *\n * @remarks\n * **Shell** — ツールバーヤアクションバーのアイコンボタン UI として使用する。\n */\nexport const IconActionButton = ({\n\ticon,\n\tlabel,\n\tonClick,\n\tonMouseEnter,\n\tdisabled,\n\ttitle,\n\tpreventFocusOnMouseDown = false,\n}: IconActionButtonProps) => {\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tclassName={styles.button}\n\t\t\tonMouseDown={\n\t\t\t\tpreventFocusOnMouseDown ? (e) => e.preventDefault() : undefined\n\t\t\t}\n\t\t\tonMouseEnter={onMouseEnter}\n\t\t\tonClick={onClick}\n\t\t\tdisabled={disabled}\n\t\t\ttitle={title ?? label}\n\t\t\taria-label={label}\n\t\t>\n\t\t\t{icon}\n\t\t</button>\n\t);\n};\n\nIconActionButton.displayName = \"IconActionButton\";\n","import styles from \"./TabPanel.module.css\";\n\nimport type { ReactNode } from \"react\";\n\n/**\n * タブパネル共通コンポーネントへの props。\n */\nexport interface TabPanelProps {\n\t/** パネルの内容 */\n\tchildren: ReactNode;\n\n\t/** 空状態のメッセージ(childrenがない場合に表示) */\n\temptyMessage?: string;\n\n\t/** カスタムクラス名 */\n\tclassName?: string;\n}\n\n/**\n * タブパネル共通コンポーネント。\n *\n * @remarks\n * **Shell** — サイドバーのタブコンテンツ領域として使用する。\n */\nexport const TabPanel = ({\n\tchildren,\n\temptyMessage,\n\tclassName,\n}: TabPanelProps) => {\n\treturn (\n\t\t<div className={`${styles.container} ${className || \"\"}`}>\n\t\t\t{children ? (\n\t\t\t\t<div className={styles.scrollArea}>{children}</div>\n\t\t\t) : (\n\t\t\t\temptyMessage && <div className={styles.emptyState}>{emptyMessage}</div>\n\t\t\t)}\n\t\t</div>\n\t);\n};\n","import { createContext, useContext, useState } from \"react\";\n\nimport styles from \"./Tabs.module.css\";\n\nimport type React from \"react\";\n\n// Context ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー\ninterface TabsContextType {\n\tvalue: string;\n\tonChange: (value: string) => void;\n\tvariant: \"default\" | \"segmented\";\n}\n\nconst TabsContext = createContext<TabsContextType | undefined>(undefined);\n\n// Components ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー\n\n/**\n * タブコンテナコンポーネントへの props。\n */\nexport interface TabsProps {\n\t/** 初期選択タブの値 */\n\tdefaultValue: string;\n\n\t/** 外部制御時の選択タブ値 */\n\tvalue?: string;\n\n\t/** 選択タブ変更時のコールバック */\n\tonValueChange?: (value: string) => void;\n\n\t/** 子要素 */\n\tchildren: React.ReactNode;\n\n\t/** 表示バリアント。`segmented` は分割ボタン型 */\n\tvariant?: \"default\" | \"segmented\";\n\n\t/** カスタムクラス名 */\n\tclassName?: string;\n}\n\n/**\n * タブコンテナコンポーネント。\n *\n * @remarks\n * **Shell** — サイドバー・パネルのタブ UI として使用する。\n */\nexport const Tabs: React.FC<TabsProps> = ({\n\tdefaultValue,\n\tvalue: propValue,\n\tonValueChange,\n\tchildren,\n\tvariant = \"default\",\n\tclassName = \"\",\n}) => {\n\tconst [localValue, setLocalValue] = useState(defaultValue);\n\tconst value = propValue ?? localValue;\n\n\tconst handleChange = (newValue: string) => {\n\t\tsetLocalValue(newValue);\n\t\tonValueChange?.(newValue);\n\t};\n\n\treturn (\n\t\t<TabsContext.Provider value={{ value, onChange: handleChange, variant }}>\n\t\t\t<div className={`${styles.root} ${className}`} data-variant={variant}>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t</TabsContext.Provider>\n\t);\n};\n\n/**\n * タブリストコンポーネントへの props。\n */\nexport interface TabsListProps {\n\t/** 子要素 */\n\tchildren: React.ReactNode;\n\n\t/** カスタムクラス名 */\n\tclassName?: string;\n\n\t/** 幅(px) */\n\twidth?: number;\n\n\t/** 高さ(px) */\n\theight?: number;\n\n\t/** インラインスタイル */\n\tstyle?: React.CSSProperties;\n}\n\n/**\n * タブリストコンポーネント。\n *\n * @remarks\n * **Shell** — `Tabs` の子要素として使用する。\n */\nexport const TabsList: React.FC<TabsListProps> = ({\n\tchildren,\n\tclassName = \"\",\n\twidth,\n\theight,\n\tstyle: propStyle,\n}) => {\n\tconst context = useContext(TabsContext);\n\tif (!context) {\n\t\tthrow new Error(\"TabsList must be used within a Tabs component\");\n\t}\n\tconst { variant } = context;\n\n\tconst computedStyle: React.CSSProperties = { ...propStyle };\n\tif (width !== undefined) computedStyle.width = `${width}px`;\n\tif (height !== undefined) computedStyle.height = `${height}px`;\n\n\treturn (\n\t\t<div\n\t\t\tclassName={`${styles.list} ${className}`}\n\t\t\tdata-variant={variant}\n\t\t\tstyle={computedStyle}\n\t\t>\n\t\t\t{children}\n\t\t</div>\n\t);\n};\n\n/**\n * タブトリガーボタンコンポーネントへの props。\n */\nexport interface TabsTriggerProps {\n\t/** このトリガーが対応するタブ値(`TabsContent.value` と対応) */\n\tvalue: string;\n\n\t/** ボタン内に表示する内容 */\n\tchildren: React.ReactNode;\n\n\t/** カスタムクラス名 */\n\tclassName?: string;\n\n\t/** `true` のとき非活性化 */\n\tdisabled?: boolean;\n\n\t/** 幅(px) */\n\twidth?: number;\n\n\t/** 高さ(px) */\n\theight?: number;\n\n\t/** インラインスタイル */\n\tstyle?: React.CSSProperties;\n}\n\n/**\n * タブトリガーボタンコンポーネント。\n *\n * @remarks\n * **Shell** — `TabsList` の子要素として使用する。\n */\nexport const TabsTrigger: React.FC<TabsTriggerProps> = ({\n\tvalue,\n\tchildren,\n\tclassName = \"\",\n\tdisabled = false,\n\twidth,\n\theight,\n\tstyle: propStyle,\n}) => {\n\tconst context = useContext(TabsContext);\n\tif (!context) {\n\t\tthrow new Error(\"TabsTrigger must be used within a Tabs component\");\n\t}\n\tconst { value: selectedValue, onChange, variant } = context;\n\tconst isSelected = selectedValue === value;\n\n\tconst computedStyle: React.CSSProperties = { ...propStyle };\n\tif (width !== undefined) computedStyle.width = `${width}px`;\n\tif (height !== undefined) computedStyle.height = `${height}px`;\n\n\treturn (\n\t\t<button\n\t\t\tclassName={`${styles.trigger} ${className}`}\n\t\t\tdata-state={isSelected ? \"active\" : \"inactive\"}\n\t\t\tdata-variant={variant}\n\t\t\tonClick={() => onChange(value)}\n\t\t\tdisabled={disabled}\n\t\t\ttype=\"button\"\n\t\t\tstyle={computedStyle}\n\t\t>\n\t\t\t{children}\n\t\t</button>\n\t);\n};\n\n/**\n * タブコンテンツコンポーネントへの props。\n */\nexport interface TabsContentProps {\n\t/** 対応するタブ値(`TabsTrigger.value` と対応) */\n\tvalue: string;\n\n\t/** 表示する内容 */\n\tchildren: React.ReactNode;\n\n\t/** カスタムクラス名 */\n\tclassName?: string;\n}\n\n/**\n * タブコンテンツコンポーネント。\n *\n * @remarks\n * **Shell** — `Tabs` の子要素として使用する。\n */\nexport const TabsContent: React.FC<TabsContentProps> = ({\n\tvalue,\n\tchildren,\n\tclassName = \"\",\n}) => {\n\tconst context = useContext(TabsContext);\n\tif (!context) {\n\t\tthrow new Error(\"TabsContent must be used within a Tabs component\");\n\t}\n\tconst { value: selectedValue } = context;\n\n\tif (selectedValue !== value) return null;\n\n\treturn <div className={`${styles.content} ${className}`}>{children}</div>;\n};\n","import { useCallback } from \"react\";\n\nimport styles from \"./TextInput.module.css\";\n\nimport type React from \"react\";\nimport type { PropertyComponentProps } from \"../../../plugin\";\nimport type { Value } from \"../../../types/value\";\n\n/**\n * テキスト入力の設定オブジェクト。\n *\n * @remarks\n * **Shell** — `TextInputProps.config` に渡す設定値の型。\n */\nexport interface TextInputConfig {\n\t/** プレースホルダーテキスト */\n\tplaceholder?: string;\n\n\t/** 最大文字数 */\n\tmaxLength?: number;\n\n\t/** `true` のとき `<textarea>` で表示する */\n\tmultiline?: boolean;\n\n\t/** `multiline` のとき表示する行数 */\n\trows?: number;\n\n\t/** 幅(px) */\n\twidth?: number;\n\n\t/** 高さ(px) */\n\theight?: number;\n\t[key: string]: Value | undefined;\n}\n\n/**\n * テキスト入力コンポーネントへの props。\n */\nexport interface TextInputProps\n\textends PropertyComponentProps<string | undefined> {\n\t/** プレースホルダーテキスト */\n\tplaceholder?: string;\n\n\t/** 最大文字数 */\n\tmaxLength?: number;\n\n\t/** `true` のとき `<textarea>` で表示する */\n\tmultiline?: boolean;\n\n\t/** `multiline` のとき表示する行数 */\n\trows?: number;\n\n\t/** 幅(px) */\n\twidth?: number;\n\n\t/** 高さ(px) */\n\theight?: number;\n\n\t/** `aria-label` 属性に設定するテキスト */\n\tariaLabel?: string;\n\n\t/** 各フィールドをまとめた設定オブジェクト。フィールドより優先度が低い */\n\tconfig?: TextInputConfig;\n\n\t/** フォーカスが外れたときのコールバック */\n\tonBlur?: () => void;\n}\n\n/**\n * テキスト入力コンポーネント。\n *\n * @remarks\n * **Shell** — プラグインプロパティの編集 UI として使用する。\n */\nexport const TextInput = ({\n\tvalue,\n\tonChange,\n\treadOnly = false,\n\tplaceholder: propPlaceholder,\n\tmaxLength: propMaxLength,\n\tmultiline: propMultiline,\n\trows: propRows,\n\twidth,\n\theight,\n\tariaLabel,\n\tconfig,\n\tonBlur,\n}: TextInputProps): React.ReactElement => {\n\tconst placeholder = propPlaceholder ?? config?.placeholder;\n\tconst maxLength = propMaxLength ?? config?.maxLength;\n\tconst multiline = propMultiline ?? config?.multiline ?? false;\n\tconst rows = propRows ?? config?.rows ?? 3;\n\n\tconst handleChange = useCallback(\n\t\t(e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n\t\t\tonChange(e.target.value);\n\t\t},\n\t\t[onChange],\n\t);\n\n\tconst style: React.CSSProperties = {};\n\tif (width !== undefined) {\n\t\tstyle.width = `${width}px`;\n\t} else {\n\t\tstyle.width = \"100%\";\n\t}\n\tif (height !== undefined) {\n\t\tstyle.height = `${height}px`;\n\t}\n\n\tconst commonProps = {\n\t\tclassName: styles.input,\n\t\tstyle,\n\t\tvalue: value ?? \"\",\n\t\tonChange: handleChange,\n\t\tdisabled: readOnly,\n\t\tplaceholder,\n\t\tmaxLength,\n\t\t\"aria-label\": ariaLabel,\n\t};\n\n\tif (multiline) {\n\t\treturn <textarea {...commonProps} rows={rows} />;\n\t}\n\n\treturn <input {...commonProps} type=\"text\" onBlur={onBlur} />;\n};\n\nTextInput.displayName = \"TextInput\";\n","import { useCallback } from \"react\";\n\nimport {\n\tPasteIcon,\n\tPrintIcon,\n\tRedoIcon,\n\tUndoIcon,\n} from \"../../../components/icons\";\nimport { getActionFeedback } from \"../../actionFeedback\";\nimport { IconActionButton } from \"../../ui\";\n\nimport type { ActionContext } from \"../../../types/context\";\nimport type { ActionFeedback } from \"../../actionFeedback\";\n\n/**\n * `CanvasActionSection` コンポーネントへの props。\n */\nexport interface CanvasActionSectionProps {\n\t/** アクション実行コンテキスト */\n\tactionContext: ActionContext;\n\n\t/** アクション実行時のフィードバック(トースト表示など) */\n\tonActionFeedback?: (feedback: ActionFeedback) => void;\n\n\t/** 印刷ボタン押下時のコールバック。省略時は `window.print()` を呼び出す */\n\tonPrint?: () => void;\n}\n\n/**\n * `ActionBar` に表示する Undo/Redo/Paste ボタン群コンポーネント。\n *\n * @remarks\n * **Shell** — 選択依存のアクション(Delete/Copy/Duplicate)は `SelectionActionBar` 側で担う。\n */\nexport const CanvasActionSection = ({\n\tactionContext,\n\tonActionFeedback,\n\tonPrint,\n}: CanvasActionSectionProps) => {\n\tconst resolvedCanUndo = actionContext.isEnabled(\"undo\");\n\tconst resolvedCanRedo = actionContext.isEnabled(\"redo\");\n\tconst resolvedHasCopied = actionContext.isEnabled(\"paste\");\n\n\tconst runAction = useCallback(\n\t\t(actionId: string) => {\n\t\t\tactionContext.execute(actionId);\n\t\t\tconst feedback = getActionFeedback(actionId);\n\t\t\tif (feedback) {\n\t\t\t\tonActionFeedback?.(feedback);\n\t\t\t}\n\t\t},\n\t\t[actionContext, onActionFeedback],\n\t);\n\n\treturn (\n\t\t<>\n\t\t\t<IconActionButton\n\t\t\t\ticon={<UndoIcon aria-hidden=\"true\" />}\n\t\t\t\tlabel=\"元に戻す\"\n\t\t\t\ttitle=\"元に戻す (Ctrl+Z / Cmd+Z)\"\n\t\t\t\tonClick={() => runAction(\"undo\")}\n\t\t\t\tdisabled={!resolvedCanUndo}\n\t\t\t\tpreventFocusOnMouseDown\n\t\t\t/>\n\t\t\t<IconActionButton\n\t\t\t\ticon={<RedoIcon aria-hidden=\"true\" />}\n\t\t\t\tlabel=\"やり直し\"\n\t\t\t\ttitle=\"やり直し (Ctrl+Y / Cmd+Y)\"\n\t\t\t\tonClick={() => runAction(\"redo\")}\n\t\t\t\tdisabled={!resolvedCanRedo}\n\t\t\t\tpreventFocusOnMouseDown\n\t\t\t/>\n\t\t\t<IconActionButton\n\t\t\t\ticon={<PasteIcon aria-hidden=\"true\" />}\n\t\t\t\tlabel=\"貼り付け\"\n\t\t\t\ttitle=\"貼り付け (Ctrl+V / Cmd+V)\"\n\t\t\t\tonClick={() => runAction(\"paste\")}\n\t\t\t\tdisabled={!resolvedHasCopied}\n\t\t\t\tpreventFocusOnMouseDown\n\t\t\t/>\n\t\t\t<IconActionButton\n\t\t\t\ticon={<PrintIcon aria-hidden=\"true\" />}\n\t\t\t\tlabel=\"印刷\"\n\t\t\t\ttitle=\"印刷 (Ctrl+P)\"\n\t\t\t\tonClick={() => (onPrint ? onPrint() : window.print())}\n\t\t\t\tpreventFocusOnMouseDown\n\t\t\t/>\n\t\t</>\n\t);\n};\n\nCanvasActionSection.displayName = \"CanvasActionSection\";\n","import { useCallback } from \"react\";\n\nimport {\n\tcolsToSparse,\n\texpandSparseCols,\n\texpandSparseRows,\n\trowsToSparse,\n} from \"../../../utils/grid\";\nimport styles from \"./ActionBar.module.css\";\n\nimport type React from \"react\";\nimport type { Grid } from \"../../../types/grid\";\n\n/**\n * `GridSettingsSection` コンポーネントへの props。\n */\nexport interface GridSettingsSectionProps {\n\t/** グリッド設定 */\n\tgrid: Grid;\n\n\t/** グリッド変更時のコールバック */\n\tonGridChange: (grid: Grid) => void;\n}\n\n// 新規列・行を追加する際のデフォルトディメンション値\nconst DEFAULT_DIMENSION = { value: 1, unit: \"fr\" as const };\n\n/**\n * `ActionBar` 上にグリッドの列数・行数を表示するコンパクトなコントロール。\n *\n * @remarks\n * **Shell** — `ActionBar` のグリッド列数・行数設定セクション。\n */\nexport const GridSettingsSection = ({\n\tgrid,\n\tonGridChange,\n}: GridSettingsSectionProps) => {\n\tconst handleColsChange = useCallback(\n\t\t(e: React.ChangeEvent<HTMLInputElement>) => {\n\t\t\tconst newColCount = parseInt(e.target.value, 10);\n\t\t\tif (!newColCount || newColCount < 1 || newColCount > 100) return;\n\n\t\t\tconst currentCols = expandSparseCols(grid);\n\t\t\tconst currentColCount = grid.colCount;\n\t\t\tconst newCols = [...currentCols];\n\n\t\t\tif (newColCount > currentColCount) {\n\t\t\t\tfor (let i = currentColCount; i < newColCount; i++) {\n\t\t\t\t\tnewCols.push({ ...DEFAULT_DIMENSION });\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tnewCols.splice(newColCount);\n\t\t\t}\n\n\t\t\tonGridChange({ ...grid, ...colsToSparse(newCols) });\n\t\t},\n\t\t[grid, onGridChange],\n\t);\n\n\tconst handleRowsChange = useCallback(\n\t\t(e: React.ChangeEvent<HTMLInputElement>) => {\n\t\t\tconst newRowCount = parseInt(e.target.value, 10);\n\t\t\tif (!newRowCount || newRowCount < 1 || newRowCount > 100) return;\n\n\t\t\tconst currentRows = expandSparseRows(grid);\n\t\t\tconst currentRowCount = grid.rowCount;\n\t\t\tconst newRows = [...currentRows];\n\n\t\t\tif (newRowCount > currentRowCount) {\n\t\t\t\tfor (let i = currentRowCount; i < newRowCount; i++) {\n\t\t\t\t\tnewRows.push({ ...DEFAULT_DIMENSION });\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tnewRows.splice(newRowCount);\n\t\t\t}\n\n\t\t\tonGridChange({ ...grid, ...rowsToSparse(newRows) });\n\t\t},\n\t\t[grid, onGridChange],\n\t);\n\n\treturn (\n\t\t<>\n\t\t\t<span className={styles.sectionLabel}>列</span>\n\t\t\t<input\n\t\t\t\ttype=\"number\"\n\t\t\t\tclassName={styles.numberInput}\n\t\t\t\tvalue={grid.colCount}\n\t\t\t\tmin={1}\n\t\t\t\tmax={100}\n\t\t\t\tonChange={handleColsChange}\n\t\t\t\taria-label=\"列数\"\n\t\t\t\ttitle=\"列数\"\n\t\t\t/>\n\t\t\t<span className={styles.sectionLabel}>行</span>\n\t\t\t<input\n\t\t\t\ttype=\"number\"\n\t\t\t\tclassName={styles.numberInput}\n\t\t\t\tvalue={grid.rowCount}\n\t\t\t\tmin={1}\n\t\t\t\tmax={100}\n\t\t\t\tonChange={handleRowsChange}\n\t\t\t\taria-label=\"行数\"\n\t\t\t\ttitle=\"行数\"\n\t\t\t/>\n\t\t</>\n\t);\n};\n\nGridSettingsSection.displayName = \"GridSettingsSection\";\n","import { useCallback } from \"react\";\n\nimport { DEFAULT_PAPER_SIZES, PaperSizePreset } from \"../../../types/paper\";\nimport { toMm } from \"../../../utils\";\nimport styles from \"./ActionBar.module.css\";\n\nimport type React from \"react\";\nimport type { Paper, PaperSize } from \"../../../types/paper\";\nimport type { PaperUnit } from \"../../../types/unit\";\n\n// mm を指定した用紙単位に変換するヘルパー\nfunction mmToUnit(mm: number, unit: PaperUnit): number {\n\tswitch (unit) {\n\t\tcase \"cm\":\n\t\t\treturn mm / 10;\n\t\tcase \"inch\":\n\t\t\treturn mm / 25.4;\n\t\tdefault:\n\t\t\treturn mm; // \"mm\"\n\t}\n}\n\n/**\n * `PaperSettingsSection` コンポーネントへの props。\n */\nexport interface PaperSettingsSectionProps {\n\t/** 用紙設定 */\n\tpaper: Paper;\n\n\t/** 用紙変更時のコールバック */\n\tonPaperChange: (paper: Paper) => void;\n}\n\n// 用紙サイズプリセットの選拡記述定義\nconst PRESET_OPTIONS: { value: PaperSizePreset; label: string }[] = [\n\t{ value: PaperSizePreset.A4, label: \"A4\" },\n\t{ value: PaperSizePreset.A3, label: \"A3\" },\n\t{ value: PaperSizePreset.B5, label: \"B5\" },\n\t{ value: PaperSizePreset.LETTER, label: \"Letter\" },\n\t{ value: PaperSizePreset.LEGAL, label: \"Legal\" },\n\t{ value: PaperSizePreset.CUSTOM, label: \"カスタム\" },\n];\n\n/**\n * `ActionBar` 上に用紙サイズプリセット選択を表示するコンパクトなコントロール。\n *\n * @remarks\n * **Shell** — カスタム選択時は幅・高さ・単位の入力も表示される。\n */\nexport const PaperSettingsSection = ({\n\tpaper,\n\tonPaperChange,\n}: PaperSettingsSectionProps) => {\n\tconst isCustom = paper.size.preset === PaperSizePreset.CUSTOM;\n\tconst isFit = paper.autoHeight === true;\n\tconst isWidthFit = paper.autoWidth === true;\n\n\tconst handlePresetChange = useCallback(\n\t\t(e: React.ChangeEvent<HTMLSelectElement>) => {\n\t\t\tconst preset = e.target.value as PaperSizePreset;\n\t\t\tif (!preset) return;\n\t\t\tonPaperChange({\n\t\t\t\t...paper,\n\t\t\t\tsize: { ...DEFAULT_PAPER_SIZES[preset] },\n\t\t\t});\n\t\t},\n\t\t[paper, onPaperChange],\n\t);\n\n\tconst handleWidthValueChange = useCallback(\n\t\t({ target }: { target: { value: string } }) => {\n\t\t\tconst val = Number(target.value);\n\t\t\tif (!val || val <= 0) return;\n\t\t\tconst minMm =\n\t\t\t\ttoMm.fromDim(paper.margin.left) + toMm.fromDim(paper.margin.right);\n\t\t\tconst minVal = mmToUnit(minMm, paper.size.width.unit);\n\t\t\tif (val < minVal) return;\n\t\t\tconst newSize: PaperSize = {\n\t\t\t\t...paper.size,\n\t\t\t\twidth: { ...paper.size.width, value: val },\n\t\t\t};\n\t\t\tonPaperChange({ ...paper, size: newSize });\n\t\t},\n\t\t[paper, onPaperChange],\n\t);\n\n\tconst handleHeightValueChange = useCallback(\n\t\t({ target }: { target: { value: string } }) => {\n\t\t\tconst val = Number(target.value);\n\t\t\tif (!val || val <= 0) return;\n\t\t\tconst minMm =\n\t\t\t\ttoMm.fromDim(paper.margin.top) + toMm.fromDim(paper.margin.bottom);\n\t\t\tconst minVal = mmToUnit(minMm, paper.size.height.unit);\n\t\t\tif (val < minVal) return;\n\t\t\tconst newSize: PaperSize = {\n\t\t\t\t...paper.size,\n\t\t\t\theight: { ...paper.size.height, value: val },\n\t\t\t};\n\t\t\tonPaperChange({ ...paper, size: newSize });\n\t\t},\n\t\t[paper, onPaperChange],\n\t);\n\n\tconst handleUnitChange = useCallback(\n\t\t({ target }: { target: { value: string } }) => {\n\t\t\tconst unit = target.value as PaperUnit;\n\t\t\tconst newSize: PaperSize = {\n\t\t\t\t...paper.size,\n\t\t\t\twidth: { ...paper.size.width, unit },\n\t\t\t\theight: { ...paper.size.height, unit },\n\t\t\t};\n\t\t\tonPaperChange({ ...paper, size: newSize });\n\t\t},\n\t\t[paper, onPaperChange],\n\t);\n\n\tconst handleHeightModeToggle = useCallback(() => {\n\t\tonPaperChange({ ...paper, autoHeight: isFit ? undefined : true });\n\t}, [paper, isFit, onPaperChange]);\n\n\tconst handleWidthModeToggle = useCallback(() => {\n\t\tonPaperChange({ ...paper, autoWidth: isWidthFit ? undefined : true });\n\t}, [paper, isWidthFit, onPaperChange]);\n\n\treturn (\n\t\t<>\n\t\t\t<span className={styles.sectionLabel}>用紙</span>\n\t\t\t<select\n\t\t\t\tclassName={styles.select}\n\t\t\t\tvalue={paper.size.preset}\n\t\t\t\tonChange={handlePresetChange}\n\t\t\t\taria-label=\"用紙サイズ\"\n\t\t\t\ttitle=\"用紙サイズ\"\n\t\t\t>\n\t\t\t\t{PRESET_OPTIONS.map((opt) => (\n\t\t\t\t\t<option key={opt.value} value={opt.value}>\n\t\t\t\t\t\t{opt.label}\n\t\t\t\t\t</option>\n\t\t\t\t))}\n\t\t\t</select>\n\t\t\t<div className={styles.heightModeSwitch}>\n\t\t\t\t<span\n\t\t\t\t\tclassName={`${styles.switchLabel} ${isFit ? \"\" : styles.switchLabelActive}`}\n\t\t\t\t>\n\t\t\t\t\t固定\n\t\t\t\t</span>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\trole=\"switch\"\n\t\t\t\t\taria-checked={isFit}\n\t\t\t\t\taria-label=\"高さモード\"\n\t\t\t\t\tclassName={styles.toggle}\n\t\t\t\t\tonClick={handleHeightModeToggle}\n\t\t\t\t>\n\t\t\t\t\t<span className={styles.thumb} />\n\t\t\t\t</button>\n\t\t\t\t<span\n\t\t\t\t\tclassName={`${styles.switchLabel} ${isFit ? styles.switchLabelActive : \"\"}`}\n\t\t\t\t>\n\t\t\t\t\t自動\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t\t<div className={styles.heightModeSwitch}>\n\t\t\t\t<span\n\t\t\t\t\tclassName={`${styles.switchLabel} ${isWidthFit ? \"\" : styles.switchLabelActive}`}\n\t\t\t\t>\n\t\t\t\t\t幅固定\n\t\t\t\t</span>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\trole=\"switch\"\n\t\t\t\t\taria-checked={isWidthFit}\n\t\t\t\t\taria-label=\"幅モード\"\n\t\t\t\t\tclassName={styles.toggle}\n\t\t\t\t\tonClick={handleWidthModeToggle}\n\t\t\t\t>\n\t\t\t\t\t<span className={styles.thumb} />\n\t\t\t\t</button>\n\t\t\t\t<span\n\t\t\t\t\tclassName={`${styles.switchLabel} ${isWidthFit ? styles.switchLabelActive : \"\"}`}\n\t\t\t\t>\n\t\t\t\t\t幅自動\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t\t{isCustom && (\n\t\t\t\t<>\n\t\t\t\t\t<input\n\t\t\t\t\t\ttype=\"number\"\n\t\t\t\t\t\tclassName={styles.numberInput}\n\t\t\t\t\t\tvalue={paper.size.width.value}\n\t\t\t\t\t\tmin={mmToUnit(\n\t\t\t\t\t\t\ttoMm.fromDim(paper.margin.left) +\n\t\t\t\t\t\t\t\ttoMm.fromDim(paper.margin.right),\n\t\t\t\t\t\t\tpaper.size.width.unit,\n\t\t\t\t\t\t)}\n\t\t\t\t\t\tmax={9999}\n\t\t\t\t\t\tstep={0.5}\n\t\t\t\t\t\tonChange={handleWidthValueChange}\n\t\t\t\t\t\taria-label=\"用紙幅\"\n\t\t\t\t\t\ttitle=\"幅\"\n\t\t\t\t\t/>\n\t\t\t\t\t<span className={styles.sectionLabel}>×</span>\n\t\t\t\t\t<input\n\t\t\t\t\t\ttype=\"number\"\n\t\t\t\t\t\tclassName={styles.numberInput}\n\t\t\t\t\t\tvalue={paper.size.height.value}\n\t\t\t\t\t\tmin={mmToUnit(\n\t\t\t\t\t\t\ttoMm.fromDim(paper.margin.top) +\n\t\t\t\t\t\t\t\ttoMm.fromDim(paper.margin.bottom),\n\t\t\t\t\t\t\tpaper.size.height.unit,\n\t\t\t\t\t\t)}\n\t\t\t\t\t\tmax={9999}\n\t\t\t\t\t\tstep={0.5}\n\t\t\t\t\t\tonChange={handleHeightValueChange}\n\t\t\t\t\t\taria-label=\"用紙高さ\"\n\t\t\t\t\t\ttitle=\"高さ\"\n\t\t\t\t\t/>\n\t\t\t\t\t<select\n\t\t\t\t\t\tclassName={styles.select}\n\t\t\t\t\t\tvalue={paper.size.width.unit}\n\t\t\t\t\t\tonChange={handleUnitChange}\n\t\t\t\t\t\taria-label=\"用紙単位\"\n\t\t\t\t\t\ttitle=\"単位\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<option value=\"mm\">mm</option>\n\t\t\t\t\t\t<option value=\"cm\">cm</option>\n\t\t\t\t\t\t<option value=\"inch\">inch</option>\n\t\t\t\t\t</select>\n\t\t\t\t</>\n\t\t\t)}\n\t\t</>\n\t);\n};\n\nPaperSettingsSection.displayName = \"PaperSettingsSection\";\n","/**\n * ネストされたオブジェクトパスへの値のセット/削除(不変)。\n *\n * 値が `null` または `undefined` の場合はそのキーを削除する。\n *\n * 削除の結果、親オブジェクトが空になった場合も親キーを再帰的に削除する。\n */\nexport function setNestedValue<T>(obj: T, path: string, value: unknown): T {\n\tconst keys = path.split(\".\");\n\tconst update = (\n\t\tcurrent: Record<string, unknown>,\n\t\tdepth: number,\n\t): Record<string, unknown> => {\n\t\tconst key = keys[depth] as string;\n\t\tif (depth === keys.length - 1) {\n\t\t\tif (value === undefined || value === null) {\n\t\t\t\tconst { [key]: _, ...rest } = current;\n\t\t\t\treturn rest;\n\t\t\t}\n\t\t\treturn { ...current, [key]: value };\n\t\t}\n\t\tconst nextValue =\n\t\t\t(current?.[key] as Record<string, unknown> | undefined) ?? {};\n\t\tconst updated = update(nextValue, depth + 1);\n\t\tif (Object.keys(updated).length === 0) {\n\t\t\tconst { [key]: _, ...rest } = current;\n\t\t\treturn rest;\n\t\t}\n\t\treturn { ...current, [key]: updated };\n\t};\n\treturn update(obj as Record<string, unknown>, 0) as T;\n}\n","import type { Block, Value } from \"../../../types\";\n\n/**\n * 選択中の複数ブロックから共通の値を取得する。\n *\n * ブロック間で値が異なる場合は `undefined` を返す。\n *\n * @param blocks - 選択中のブロック配列\n * @param path - ドット区切りのプロパティパス(例: `\"values.text\"`)\n * @returns 全ブロックが同一値を持つ場合はその値、異なる場合は `undefined`\n *\n * @remarks\n * `BlockPropertyPanel` 内のプラグインパネルで共通値を表示する際に使用する。\n */\nexport function getCommonValue<T = Value>(\n\tblocks: Block[],\n\tpath: string,\n): T | undefined {\n\tif (blocks.length === 0) return undefined;\n\n\tconst getValueByPath = (obj: unknown, keys: string[]): unknown => {\n\t\tlet current: unknown = obj;\n\t\tfor (const key of keys) {\n\t\t\tif (current == null) return undefined;\n\t\t\tif (typeof current !== \"object\" || Array.isArray(current))\n\t\t\t\treturn undefined;\n\t\t\tcurrent = (current as Record<string, unknown>)[key];\n\t\t}\n\t\treturn current;\n\t};\n\n\tconst keys = path.split(\".\");\n\tconst firstValue = getValueByPath(blocks[0], keys);\n\tconst allSame = blocks.every(\n\t\t(block) => getValueByPath(block, keys) === firstValue,\n\t);\n\n\treturn allSame ? (firstValue as T) : undefined;\n}\n","import { useMemo } from \"react\";\n\nimport { setNestedValue } from \"../../../../../canvas/layers/BlockLayer/utils/setNestedValue\";\nimport { LineType } from \"../../../../../types/line\";\nimport { BORDER_UNITS } from \"../../../../../types/unit\";\nimport { ColorPicker, DimensionInput, Dropdown } from \"../../../../ui\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"../../../../ui/Tabs\";\nimport { getCommonValue } from \"../../../utils/getCommonValue\";\n\nimport type React from \"react\";\nimport type { BorderEdge } from \"../../../../../canvas/layers/BlockLayer/hooks/useBlockStyle\";\nimport type { Block, BorderUnit, Dimension } from \"../../../../../types\";\nimport type { BorderStyle, LineStyle } from \"../../../../../types/line\";\n\n/**\n * `BackgroundBorderPanel` コンポーネントへの props。\n */\nexport interface BackgroundBorderPanelProps {\n\t/** 選択中のブロックの配列 */\n\tselectedBlocks: Block[];\n\n\t/** ブロック更新時のコールバック */\n\tonUpdateBlocks: (updates: Record<string, Partial<Block>>) => void;\n}\n\n// SVGプレビュー用: BorderStyle → CSS border properties\nfunction getPreviewSvgLines(\n\tborderStyle: BorderStyle | undefined,\n\tw: number,\n\th: number,\n): React.ReactElement[] {\n\tif (!borderStyle) return [];\n\tconst lines: React.ReactElement[] = [];\n\n\tconst edgeLines: {\n\t\tkey: string;\n\t\tstyle: LineStyle | undefined;\n\t\tx1: number;\n\t\ty1: number;\n\t\tx2: number;\n\t\ty2: number;\n\t}[] = [\n\t\t{ key: \"top\", style: borderStyle.top, x1: 0, y1: 0, x2: w, y2: 0 },\n\t\t{ key: \"right\", style: borderStyle.right, x1: w, y1: 0, x2: w, y2: h },\n\t\t{\n\t\t\tkey: \"bottom\",\n\t\t\tstyle: borderStyle.bottom,\n\t\t\tx1: 0,\n\t\t\ty1: h,\n\t\t\tx2: w,\n\t\t\ty2: h,\n\t\t},\n\t\t{ key: \"left\", style: borderStyle.left, x1: 0, y1: 0, x2: 0, y2: h },\n\t];\n\n\tfor (const { key, style, x1, y1, x2, y2 } of edgeLines) {\n\t\tif (!style?.type) continue;\n\t\tconst strokeW =\n\t\t\tstyle.width?.unit === \"px\"\n\t\t\t\t? style.width.value\n\t\t\t\t: (style.width?.value ?? 1);\n\t\tconst dasharray =\n\t\t\tstyle.type === LineType.DASHED\n\t\t\t\t? \"8 4\"\n\t\t\t\t: style.type === LineType.DOTTED\n\t\t\t\t\t? \"2 4\"\n\t\t\t\t\t: undefined;\n\t\tlines.push(\n\t\t\t<line\n\t\t\t\tkey={key}\n\t\t\t\tx1={x1}\n\t\t\t\ty1={y1}\n\t\t\t\tx2={x2}\n\t\t\t\ty2={y2}\n\t\t\t\tstroke={style.color ?? \"#000\"}\n\t\t\t\tstrokeWidth={strokeW}\n\t\t\t\tstrokeDasharray={dasharray}\n\t\t\t/>,\n\t\t);\n\t}\n\n\treturn lines;\n}\n\n// \"all\" エッジの値を top/right/bottom/left に展開して BorderStyle を構築\nfunction resolveBorderStyle(style: Block[\"style\"]): BorderStyle | undefined {\n\tconst border = style?.border;\n\tif (!border) return undefined;\n\n\tconst resolveEdge = (\n\t\tedgeKey: \"top\" | \"right\" | \"bottom\" | \"left\",\n\t): LineStyle | undefined => {\n\t\tconst edgeVal = border[edgeKey] ?? border.all;\n\t\tif (!edgeVal?.type) return undefined;\n\t\treturn edgeVal;\n\t};\n\n\tconst result: BorderStyle = {\n\t\ttop: resolveEdge(\"top\"),\n\t\tright: resolveEdge(\"right\"),\n\t\tbottom: resolveEdge(\"bottom\"),\n\t\tleft: resolveEdge(\"left\"),\n\t};\n\n\tif (!result.top && !result.right && !result.bottom && !result.left) {\n\t\treturn undefined;\n\t}\n\treturn result;\n}\n\n/**\n * ブロックの背景色と枠線を設定するパネル。\n *\n * @remarks\n * **Shell** — タブ切り替えで背景色と枠線を個別に設定できる。\n */\nexport const BackgroundBorderPanel: React.FC<BackgroundBorderPanelProps> = ({\n\tselectedBlocks,\n\tonUpdateBlocks,\n}) => {\n\tconst handleBgColor = (color: string | undefined) => {\n\t\tconst updates: Record<string, Partial<Block>> = {};\n\t\tfor (const b of selectedBlocks) {\n\t\t\tupdates[b.id] = { style: { ...b.style, backgroundColor: color } };\n\t\t}\n\t\tonUpdateBlocks(updates);\n\t};\n\n\tconst handleBorderChange = (\n\t\tedge: BorderEdge,\n\t\tprop: \"type\" | \"width\" | \"color\",\n\t\tval: Dimension<BorderUnit> | string | null | undefined,\n\t) => {\n\t\tconst updates: Record<string, Partial<Block>> = {};\n\t\t// \"all\" の場合は4辺すべてに適用(JSON形式を top/right/bottom/left に統一)\n\t\tconst edges: ReadonlyArray<\"top\" | \"right\" | \"bottom\" | \"left\"> =\n\t\t\tedge === \"all\" ? [\"top\", \"right\", \"bottom\", \"left\"] : [edge];\n\n\t\tfor (const b of selectedBlocks) {\n\t\t\tlet newStyle: Record<string, unknown> = (b.style || {}) as Record<\n\t\t\t\tstring,\n\t\t\t\tunknown\n\t\t\t>;\n\n\t\t\tfor (const e of edges) {\n\t\t\t\tnewStyle = setNestedValue(newStyle, `border.${e}.${prop}`, val);\n\n\t\t\t\tif (prop === \"type\" && (val === undefined || val === null)) {\n\t\t\t\t\tnewStyle = setNestedValue(newStyle, `border.${e}.width`, null);\n\t\t\t\t\tnewStyle = setNestedValue(newStyle, `border.${e}.color`, null);\n\t\t\t\t}\n\n\t\t\t\tif (prop === \"type\" && val !== undefined && val !== null) {\n\t\t\t\t\tconst currentBorder = (\n\t\t\t\t\t\tb.style as { border?: Record<string, unknown> }\n\t\t\t\t\t)?.border as\n\t\t\t\t\t\t| Record<string, { width?: unknown; color?: unknown }>\n\t\t\t\t\t\t| undefined;\n\t\t\t\t\tconst edgeStyle = currentBorder?.[e];\n\t\t\t\t\tif (!edgeStyle?.width) {\n\t\t\t\t\t\tnewStyle = setNestedValue(newStyle, `border.${e}.width`, {\n\t\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t\t\tunit: \"px\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tif (!edgeStyle?.color) {\n\t\t\t\t\t\tnewStyle = setNestedValue(newStyle, `border.${e}.color`, \"#000000\");\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (prop === \"color\" && val !== undefined && val !== null) {\n\t\t\t\t\tconst currentBorder = (\n\t\t\t\t\t\tb.style as { border?: Record<string, unknown> }\n\t\t\t\t\t)?.border as\n\t\t\t\t\t\t| Record<string, { type?: unknown; width?: unknown }>\n\t\t\t\t\t\t| undefined;\n\t\t\t\t\tconst edgeStyle = currentBorder?.[e];\n\t\t\t\t\tif (!edgeStyle?.type) {\n\t\t\t\t\t\tnewStyle = setNestedValue(\n\t\t\t\t\t\t\tnewStyle,\n\t\t\t\t\t\t\t`border.${e}.type`,\n\t\t\t\t\t\t\tLineType.SOLID,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tif (!edgeStyle?.width) {\n\t\t\t\t\t\tnewStyle = setNestedValue(newStyle, `border.${e}.width`, {\n\t\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t\t\tunit: \"px\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (prop === \"width\" && val !== undefined && val !== null) {\n\t\t\t\t\tconst currentBorder = (\n\t\t\t\t\t\tb.style as { border?: Record<string, unknown> }\n\t\t\t\t\t)?.border as\n\t\t\t\t\t\t| Record<string, { type?: unknown; color?: unknown }>\n\t\t\t\t\t\t| undefined;\n\t\t\t\t\tconst edgeStyle = currentBorder?.[e];\n\t\t\t\t\tif (!edgeStyle?.type) {\n\t\t\t\t\t\tnewStyle = setNestedValue(\n\t\t\t\t\t\t\tnewStyle,\n\t\t\t\t\t\t\t`border.${e}.type`,\n\t\t\t\t\t\t\tLineType.SOLID,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tif (!edgeStyle?.color) {\n\t\t\t\t\t\tnewStyle = setNestedValue(newStyle, `border.${e}.color`, \"#000000\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tupdates[b.id] = { style: newStyle };\n\t\t}\n\n\t\tonUpdateBlocks(updates);\n\t};\n\n\tconst previewBgColor = getCommonValue(\n\t\tselectedBlocks,\n\t\t\"style.backgroundColor\",\n\t) as string | undefined;\n\n\tconst previewBorderStyle = useMemo(() => {\n\t\tif (selectedBlocks.length !== 1) return undefined;\n\t\tconst firstBlock = selectedBlocks[0];\n\t\treturn resolveBorderStyle(firstBlock?.style);\n\t}, [selectedBlocks]);\n\n\tconst previewSvgLines = useMemo(\n\t\t() => getPreviewSvgLines(previewBorderStyle, 80, 80),\n\t\t[previewBorderStyle],\n\t);\n\n\tif (selectedBlocks.length === 0) return null;\n\n\t// \"all\" タブは top を代表値として読み取り(書き込みは4辺に展開済み)\n\tconst readEdge = (edge: BorderEdge) => (edge === \"all\" ? \"top\" : edge);\n\n\tconst renderInputs = (edge: BorderEdge) => (\n\t\t<div style={{ display: \"flex\", flexDirection: \"column\", gap: \"4px\" }}>\n\t\t\t<Dropdown\n\t\t\t\tvalue={getCommonValue(\n\t\t\t\t\tselectedBlocks,\n\t\t\t\t\t`style.border.${readEdge(edge)}.type`,\n\t\t\t\t)}\n\t\t\t\tonChange={(val) => handleBorderChange(edge, \"type\", val ?? null)}\n\t\t\t\tplaceholder=\"スタイル\"\n\t\t\t\theight={24}\n\t\t\t\toptions={[\n\t\t\t\t\t{ label: \"\", value: null },\n\t\t\t\t\t{ label: \"実線\", value: LineType.SOLID },\n\t\t\t\t\t{ label: \"破線\", value: LineType.DASHED },\n\t\t\t\t\t{ label: \"点線\", value: LineType.DOTTED },\n\t\t\t\t]}\n\t\t\t/>\n\t\t\t<DimensionInput\n\t\t\t\tvalue={\n\t\t\t\t\tgetCommonValue(\n\t\t\t\t\t\tselectedBlocks,\n\t\t\t\t\t\t`style.border.${readEdge(edge)}.width`,\n\t\t\t\t\t) as\n\t\t\t\t\t\t| { value: number; unit: (typeof BORDER_UNITS)[number] }\n\t\t\t\t\t\t| undefined\n\t\t\t\t}\n\t\t\t\tonChange={(val) => handleBorderChange(edge, \"width\", val)}\n\t\t\t\tplaceholder=\"太さ\"\n\t\t\t\theight={24}\n\t\t\t\tallowedUnits={BORDER_UNITS}\n\t\t\t\tmin={1}\n\t\t\t/>\n\t\t\t<ColorPicker\n\t\t\t\tvalue={\n\t\t\t\t\t(getCommonValue(\n\t\t\t\t\t\tselectedBlocks,\n\t\t\t\t\t\t`style.border.${readEdge(edge)}.color`,\n\t\t\t\t\t) as string | undefined) ?? undefined\n\t\t\t\t}\n\t\t\t\tonChange={(v: string | undefined) =>\n\t\t\t\t\thandleBorderChange(edge, \"color\", v ?? null)\n\t\t\t\t}\n\t\t\t\tshowTextInput={true}\n\t\t\t\tallowUndefined\n\t\t\t\theight={24}\n\t\t\t/>\n\t\t</div>\n\t);\n\n\tconst triggerStyle: React.CSSProperties = {\n\t\tflex: 1,\n\t\tpadding: \"0 2px\",\n\t\tfontSize: \"12px\",\n\t\tminWidth: 0,\n\t\twhiteSpace: \"nowrap\",\n\t\toverflow: \"hidden\",\n\t\ttextOverflow: \"ellipsis\",\n\t};\n\n\treturn (\n\t\t<div\n\t\t\tstyle={{\n\t\t\t\tdisplay: \"grid\",\n\t\t\t\tgridTemplateColumns: \"88px 1fr\",\n\t\t\t\tgridTemplateRows: \"auto auto\",\n\t\t\t\tgap: \"4px\",\n\t\t\t\tpadding: \"4px\",\n\t\t\t}}\n\t\t>\n\t\t\t{/* プレビュー */}\n\t\t\t<div\n\t\t\t\tstyle={{\n\t\t\t\t\tgridRow: \"1 / 3\",\n\t\t\t\t\tdisplay: \"flex\",\n\t\t\t\t\talignItems: \"center\",\n\t\t\t\t\tjustifyContent: \"center\",\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<div\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\twidth: \"80px\",\n\t\t\t\t\t\theight: \"80px\",\n\t\t\t\t\t\tborderRadius: \"0.25rem\",\n\t\t\t\t\t\tdisplay: \"flex\",\n\t\t\t\t\t\talignItems: \"center\",\n\t\t\t\t\t\tjustifyContent: \"center\",\n\t\t\t\t\t\tposition: \"relative\",\n\t\t\t\t\t\tbackgroundColor: previewBgColor ?? \"transparent\",\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<svg\n\t\t\t\t\t\twidth=\"80\"\n\t\t\t\t\t\theight=\"80\"\n\t\t\t\t\t\tviewBox=\"0 0 80 80\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\t\topacity: 0.3,\n\t\t\t\t\t\t\tpointerEvents: \"none\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<title>枠線ガイド</title>\n\t\t\t\t\t\t<line\n\t\t\t\t\t\t\tx1=\"40\"\n\t\t\t\t\t\t\ty1=\"0\"\n\t\t\t\t\t\t\tx2=\"40\"\n\t\t\t\t\t\t\ty2=\"80\"\n\t\t\t\t\t\t\tstroke=\"#9ca3af\"\n\t\t\t\t\t\t\tstrokeWidth=\"1\"\n\t\t\t\t\t\t\tstrokeDasharray=\"4 2\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<line\n\t\t\t\t\t\t\tx1=\"0\"\n\t\t\t\t\t\t\ty1=\"40\"\n\t\t\t\t\t\t\tx2=\"80\"\n\t\t\t\t\t\t\ty2=\"40\"\n\t\t\t\t\t\t\tstroke=\"#9ca3af\"\n\t\t\t\t\t\t\tstrokeWidth=\"1\"\n\t\t\t\t\t\t\tstrokeDasharray=\"4 2\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</svg>\n\n\t\t\t\t\t{previewSvgLines.length > 0 ? (\n\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\twidth=\"80\"\n\t\t\t\t\t\t\theight=\"80\"\n\t\t\t\t\t\t\tviewBox=\"0 0 80 80\"\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\t\t\tpointerEvents: \"none\",\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<title>枠線プレビュー</title>\n\t\t\t\t\t\t\t{previewSvgLines}\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\twidth=\"80\"\n\t\t\t\t\t\t\theight=\"80\"\n\t\t\t\t\t\t\tviewBox=\"0 0 80 80\"\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\t\t\topacity: 0.3,\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<title>枠線未設定</title>\n\t\t\t\t\t\t\t<rect\n\t\t\t\t\t\t\t\tx=\"0\"\n\t\t\t\t\t\t\t\ty=\"0\"\n\t\t\t\t\t\t\t\twidth=\"80\"\n\t\t\t\t\t\t\t\theight=\"80\"\n\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\tstroke=\"#9ca3af\"\n\t\t\t\t\t\t\t\tstrokeWidth=\"1\"\n\t\t\t\t\t\t\t\tstrokeDasharray=\"4 2\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t{/* 背景色 */}\n\t\t\t<ColorPicker\n\t\t\t\tvalue={previewBgColor}\n\t\t\t\tonChange={(color: string | undefined) => handleBgColor(color)}\n\t\t\t\tshowTextInput={true}\n\t\t\t\tallowUndefined\n\t\t\t/>\n\n\t\t\t{/* 枠線設定 */}\n\t\t\t<div style={{ minWidth: 0 }}>\n\t\t\t\t<Tabs defaultValue=\"all\" variant=\"segmented\">\n\t\t\t\t\t<div style={{ width: \"100%\" }}>\n\t\t\t\t\t\t<TabsList style={{ width: \"100%\", display: \"flex\" }}>\n\t\t\t\t\t\t\t<TabsTrigger value=\"all\" height={24} style={triggerStyle}>\n\t\t\t\t\t\t\t\t共通\n\t\t\t\t\t\t\t</TabsTrigger>\n\t\t\t\t\t\t\t<TabsTrigger value=\"top\" height={24} style={triggerStyle}>\n\t\t\t\t\t\t\t\t上\n\t\t\t\t\t\t\t</TabsTrigger>\n\t\t\t\t\t\t\t<TabsTrigger value=\"bottom\" height={24} style={triggerStyle}>\n\t\t\t\t\t\t\t\t下\n\t\t\t\t\t\t\t</TabsTrigger>\n\t\t\t\t\t\t\t<TabsTrigger value=\"left\" height={24} style={triggerStyle}>\n\t\t\t\t\t\t\t\t左\n\t\t\t\t\t\t\t</TabsTrigger>\n\t\t\t\t\t\t\t<TabsTrigger value=\"right\" height={24} style={triggerStyle}>\n\t\t\t\t\t\t\t\t右\n\t\t\t\t\t\t\t</TabsTrigger>\n\t\t\t\t\t\t</TabsList>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div style={{ marginTop: \"4px\" }}>\n\t\t\t\t\t\t<TabsContent value=\"all\">{renderInputs(\"all\")}</TabsContent>\n\t\t\t\t\t\t<TabsContent value=\"top\">{renderInputs(\"top\")}</TabsContent>\n\t\t\t\t\t\t<TabsContent value=\"bottom\">{renderInputs(\"bottom\")}</TabsContent>\n\t\t\t\t\t\t<TabsContent value=\"left\">{renderInputs(\"left\")}</TabsContent>\n\t\t\t\t\t\t<TabsContent value=\"right\">{renderInputs(\"right\")}</TabsContent>\n\t\t\t\t\t</div>\n\t\t\t\t</Tabs>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nBackgroundBorderPanel.displayName = \"BackgroundBorderPanel\";\n","import { layoutPanelKey } from \"../../../../../contexts/history/mergeKeys\";\nimport { NumberInput } from \"../../../../ui\";\nimport { getCommonValue } from \"../../../utils/getCommonValue\";\nimport styles from \"./LayoutPanel.module.css\";\n\nimport type React from \"react\";\nimport type { Block } from \"../../../../../types/block\";\n\n/**\n * `LayoutPanel` コンポーネントへの props。\n */\nexport interface LayoutPanelProps {\n\t/** 選択中のブロックの配列 */\n\tselectedBlocks: Block[];\n\n\t/** ブロック更新時のコールバック */\n\tonUpdateBlocks: (\n\t\tupdates: Record<string, Partial<Block>>,\n\t\toptions?: { mergeKey?: string },\n\t) => void;\n\n\t/** グリッドサイズ(最大入力値の制限に使用) */\n\tgridSize?: { cols: number; rows: number };\n}\n\n/**\n * ブロックの位置と大きさを設定するパネル。\n *\n * @remarks\n * **Shell** — 複数選択時はバウンディングボックスの最小座標を基準に相対変更する。\n */\nexport const LayoutPanel: React.FC<LayoutPanelProps> = ({\n\tselectedBlocks,\n\tonUpdateBlocks,\n\tgridSize,\n}) => {\n\tif (selectedBlocks.length === 0) return null;\n\n\tconst isMultipleSelection = selectedBlocks.length > 1;\n\n\tconst minX = isMultipleSelection\n\t\t? Math.min(...selectedBlocks.map((b) => b.layout.x))\n\t\t: undefined;\n\tconst minY = isMultipleSelection\n\t\t? Math.min(...selectedBlocks.map((b) => b.layout.y))\n\t\t: undefined;\n\n\tconst handleChange = (\n\t\tkey: \"x\" | \"y\" | \"w\" | \"h\",\n\t\tval: number | undefined,\n\t) => {\n\t\tif (val === undefined) return;\n\n\t\tconst updates: Record<string, Partial<Block>> = {};\n\n\t\tif (isMultipleSelection && (key === \"x\" || key === \"y\")) {\n\t\t\tconst currentMin = key === \"x\" ? minX : minY;\n\t\t\tif (currentMin === undefined) return;\n\n\t\t\tconst maxX = Math.max(\n\t\t\t\t...selectedBlocks.map((b) => b.layout.x + b.layout.w),\n\t\t\t);\n\t\t\tconst maxY = Math.max(\n\t\t\t\t...selectedBlocks.map((b) => b.layout.y + b.layout.h),\n\t\t\t);\n\t\t\tconst boundingW = maxX - (minX ?? 0);\n\t\t\tconst boundingH = maxY - (minY ?? 0);\n\n\t\t\tlet clampedVal = val;\n\t\t\tif (key === \"x\" && gridSize) {\n\t\t\t\tclampedVal = Math.max(0, Math.min(val, gridSize.cols - boundingW));\n\t\t\t} else if (key === \"y\" && gridSize) {\n\t\t\t\tclampedVal = Math.max(0, Math.min(val, gridSize.rows - boundingH));\n\t\t\t} else {\n\t\t\t\tclampedVal = Math.max(0, val);\n\t\t\t}\n\n\t\t\tconst offset = clampedVal - currentMin;\n\t\t\tselectedBlocks.forEach((b) => {\n\t\t\t\tconst newValue = b.layout[key] + offset;\n\t\t\t\tupdates[b.id] = { layout: { ...b.layout, [key]: newValue } };\n\t\t\t});\n\t\t} else {\n\t\t\tselectedBlocks.forEach((b) => {\n\t\t\t\tlet clampedVal = val;\n\t\t\t\tif (key === \"x\" && gridSize) {\n\t\t\t\t\tclampedVal = Math.max(0, Math.min(val, gridSize.cols - b.layout.w));\n\t\t\t\t} else if (key === \"y\" && gridSize) {\n\t\t\t\t\tclampedVal = Math.max(0, Math.min(val, gridSize.rows - b.layout.h));\n\t\t\t\t} else if (key === \"w\" && gridSize) {\n\t\t\t\t\tconst maxW = gridSize.cols - b.layout.x;\n\t\t\t\t\tclampedVal = Math.max(1, Math.min(val, maxW));\n\t\t\t\t} else if (key === \"h\" && gridSize) {\n\t\t\t\t\tconst maxH = gridSize.rows - b.layout.y;\n\t\t\t\t\tclampedVal = Math.max(1, Math.min(val, maxH));\n\t\t\t\t} else if (key === \"w\" || key === \"h\") {\n\t\t\t\t\tclampedVal = Math.max(1, val);\n\t\t\t\t} else {\n\t\t\t\t\tclampedVal = Math.max(0, val);\n\t\t\t\t}\n\t\t\t\tupdates[b.id] = { layout: { ...b.layout, [key]: clampedVal } };\n\t\t\t});\n\t\t}\n\t\tonUpdateBlocks(updates, {\n\t\t\tmergeKey: layoutPanelKey(\n\t\t\t\tkey as \"x\" | \"y\" | \"w\" | \"h\",\n\t\t\t\tselectedBlocks.map((b) => b.id),\n\t\t\t),\n\t\t});\n\t};\n\n\treturn (\n\t\t<div className={styles.container}>\n\t\t\t<div className={styles.grid}>\n\t\t\t\t{/* X */}\n\t\t\t\t<div className={styles.field}>\n\t\t\t\t\t<span className={styles.label}>X</span>\n\t\t\t\t\t<div className={styles.inputWrapper}>\n\t\t\t\t\t\t<NumberInput\n\t\t\t\t\t\t\tvalue={\n\t\t\t\t\t\t\t\tisMultipleSelection\n\t\t\t\t\t\t\t\t\t? minX\n\t\t\t\t\t\t\t\t\t: getCommonValue(selectedBlocks, \"layout.x\")\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tonChange={(v) => handleChange(\"x\", v)}\n\t\t\t\t\t\t\tmin={0}\n\t\t\t\t\t\t\tmax={gridSize ? gridSize.cols - 1 : undefined}\n\t\t\t\t\t\t\tinteger\n\t\t\t\t\t\t\theight={22}\n\t\t\t\t\t\t\tplaceholder=\"-\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t{/* Y */}\n\t\t\t\t<div className={styles.field}>\n\t\t\t\t\t<span className={styles.label}>Y</span>\n\t\t\t\t\t<div className={styles.inputWrapper}>\n\t\t\t\t\t\t<NumberInput\n\t\t\t\t\t\t\tvalue={\n\t\t\t\t\t\t\t\tisMultipleSelection\n\t\t\t\t\t\t\t\t\t? minY\n\t\t\t\t\t\t\t\t\t: getCommonValue(selectedBlocks, \"layout.y\")\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tonChange={(v) => handleChange(\"y\", v)}\n\t\t\t\t\t\t\tmin={0}\n\t\t\t\t\t\t\tmax={gridSize ? gridSize.rows - 1 : undefined}\n\t\t\t\t\t\t\tinteger\n\t\t\t\t\t\t\theight={22}\n\t\t\t\t\t\t\tplaceholder=\"-\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t{/* W */}\n\t\t\t\t<div className={styles.field}>\n\t\t\t\t\t<span className={styles.label}>W</span>\n\t\t\t\t\t<div className={styles.inputWrapper}>\n\t\t\t\t\t\t<NumberInput\n\t\t\t\t\t\t\tvalue={getCommonValue(selectedBlocks, \"layout.w\")}\n\t\t\t\t\t\t\tonChange={(v) => handleChange(\"w\", v)}\n\t\t\t\t\t\t\tmin={1}\n\t\t\t\t\t\t\tmax={gridSize ? gridSize.cols : undefined}\n\t\t\t\t\t\t\tinteger\n\t\t\t\t\t\t\theight={22}\n\t\t\t\t\t\t\tplaceholder=\"-\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t{/* H */}\n\t\t\t\t<div className={styles.field}>\n\t\t\t\t\t<span className={styles.label}>H</span>\n\t\t\t\t\t<div className={styles.inputWrapper}>\n\t\t\t\t\t\t<NumberInput\n\t\t\t\t\t\t\tvalue={getCommonValue(selectedBlocks, \"layout.h\")}\n\t\t\t\t\t\t\tonChange={(v) => handleChange(\"h\", v)}\n\t\t\t\t\t\t\tmin={1}\n\t\t\t\t\t\t\tmax={gridSize ? gridSize.rows : undefined}\n\t\t\t\t\t\t\tinteger\n\t\t\t\t\t\t\theight={22}\n\t\t\t\t\t\t\tplaceholder=\"-\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nLayoutPanel.displayName = \"LayoutPanel\";\n","import { memo } from \"react\";\n\nimport styles from \"./AlignmentToggle.module.css\";\n\nimport type React from \"react\";\nimport type { Value } from \"../../../../types\";\n\n/**\n * `AlignmentToggle` コンポーネントの選択肢。\n *\n * @remarks\n * 配置トグルの各ボタンの定義。\n */\nexport interface AlignmentToggleOption {\n\t/** ビット属性値 */\n\tvalue: Value;\n\n\t/** スクリーンリーダー向けラベル */\n\tlabel: string;\n\n\t/** ボタンに表示するアイコン */\n\ticon: React.ReactNode;\n}\n\ninterface AlignmentToggleProps {\n\toptions: AlignmentToggleOption[];\n\tcurrent: Value;\n\tonChange: (value: Value) => void;\n}\n\n/**\n * アライメントをトグル選択する UI コンポーネント。\n *\n * @remarks\n * `PluginPanels` 内で使用される。\n */\nexport const AlignmentToggle = memo(\n\t({ options, current, onChange }: AlignmentToggleProps) => {\n\t\treturn (\n\t\t\t<fieldset className={styles.group}>\n\t\t\t\t{options.map((option) => {\n\t\t\t\t\tconst isActive = current === option.value;\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tkey={String(option.value)}\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclassName={[styles.btn, isActive ? styles.active : \"\"]\n\t\t\t\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t\t\t\t.join(\" \")}\n\t\t\t\t\t\t\ttitle={option.label}\n\t\t\t\t\t\t\taria-label={option.label}\n\t\t\t\t\t\t\taria-pressed={isActive}\n\t\t\t\t\t\t\tonClick={() => onChange(option.value)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{option.icon}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</fieldset>\n\t\t);\n\t},\n);\n\nAlignmentToggle.displayName = \"AlignmentToggle\";\n","import { useCallback, useMemo } from \"react\";\n\nimport {\n\ttype CheckboxStyleConfig,\n\tcheckboxStyleProp,\n} from \"../../../../canvas/blocks/checkbox/props\";\nimport { ClassicCheckboxVisual } from \"../../../../canvas/blocks/checkbox/visual\";\nimport { ColorPicker, DimensionInput } from \"../../../ui\";\n\nimport type React from \"react\";\n\n/**\n * `CheckboxStyleEditor` コンポーネントへの props。\n */\nexport interface CheckboxStyleEditorProps {\n\t/** 現在のチェックボックススタイル設定 */\n\tvalue?: CheckboxStyleConfig;\n\n\t/** 変更時のコールバック */\n\tonChange: (v: CheckboxStyleConfig) => void;\n\n\t/** 読み取り専用モード */\n\treadOnly?: boolean;\n}\n\nconst DEFAULT_STYLE = checkboxStyleProp.defaultProps\n\t.styleConfig as CheckboxStyleConfig;\n\nconst labelStyle: React.CSSProperties = {\n\tfontSize: 11,\n\tcolor: \"#888\",\n\twhiteSpace: \"nowrap\",\n\twidth: 62,\n\tflexShrink: 0,\n};\n\nconst rowStyle: React.CSSProperties = {\n\tdisplay: \"flex\",\n\tgap: 4,\n\talignItems: \"center\",\n};\n\n/**\n * チェックボックスのスタイル(チェック有無・トグル切り替え)を編集する UI。\n *\n * @remarks\n * `PluginPanels` 内で使用される。\n */\nexport const CheckboxStyleEditor: React.FC<CheckboxStyleEditorProps> = ({\n\tvalue,\n\tonChange,\n\treadOnly = false,\n}) => {\n\tconst config = useMemo<CheckboxStyleConfig>(\n\t\t() => ({\n\t\t\tcheckboxSize: value?.checkboxSize ?? DEFAULT_STYLE.checkboxSize,\n\t\t\tborderWidth: value?.borderWidth ?? DEFAULT_STYLE.borderWidth,\n\t\t\tborderColor: value?.borderColor ?? DEFAULT_STYLE.borderColor,\n\t\t\tcheckWidth: value?.checkWidth ?? DEFAULT_STYLE.checkWidth,\n\t\t\tcheckColor: value?.checkColor ?? DEFAULT_STYLE.checkColor,\n\t\t\tbackgroundColor: value?.backgroundColor ?? DEFAULT_STYLE.backgroundColor,\n\t\t\tcheckedBackgroundColor:\n\t\t\t\tvalue?.checkedBackgroundColor ?? DEFAULT_STYLE.checkedBackgroundColor,\n\t\t}),\n\t\t[value],\n\t);\n\n\tconst handleChange = useCallback(\n\t\t(\n\t\t\tprop: keyof CheckboxStyleConfig,\n\t\t\tval: CheckboxStyleConfig[keyof CheckboxStyleConfig],\n\t\t) => {\n\t\t\tonChange({ ...(value ?? {}), [prop]: val });\n\t\t},\n\t\t[value, onChange],\n\t);\n\n\treturn (\n\t\t<div style={{ display: \"flex\", flexDirection: \"column\", gap: 4 }}>\n\t\t\t{/* プレビュー */}\n\t\t\t<div\n\t\t\t\tstyle={{\n\t\t\t\t\tpadding: 8,\n\t\t\t\t\tbackgroundColor: \"#f5f5f5\",\n\t\t\t\t\tborderRadius: 4,\n\t\t\t\t\tdisplay: \"flex\",\n\t\t\t\t\tjustifyContent: \"center\",\n\t\t\t\t\tgap: 24,\n\t\t\t\t\tmarginBottom: 4,\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t{[false, true].map((checked) => (\n\t\t\t\t\t<div key={String(checked)} style={{ textAlign: \"center\" }}>\n\t\t\t\t\t\t<div style={{ fontSize: 11, color: \"#888\", marginBottom: 4 }}>\n\t\t\t\t\t\t\t{checked ? \"チェック\" : \"未チェック\"}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div style={{ width: 24, height: 24 }}>\n\t\t\t\t\t\t\t<ClassicCheckboxVisual checked={checked} styleConfig={config} />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t))}\n\t\t\t</div>\n\n\t\t\t<div style={rowStyle}>\n\t\t\t\t<span style={labelStyle}>サイズ</span>\n\t\t\t\t<div style={{ flex: 1, minWidth: 0 }}>\n\t\t\t\t\t<DimensionInput\n\t\t\t\t\t\tvalue={config.checkboxSize}\n\t\t\t\t\t\tonChange={(v) => handleChange(\"checkboxSize\", v)}\n\t\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t\t\tallowedUnits={[\"px\", \"mm\"]}\n\t\t\t\t\t\tconfig={{ min: 8, max: 64, step: 1, placeholder: \"16px\" }}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div style={rowStyle}>\n\t\t\t\t<span style={labelStyle}>枠線 幅</span>\n\t\t\t\t<div style={{ flex: 1, minWidth: 0 }}>\n\t\t\t\t\t<DimensionInput\n\t\t\t\t\t\tvalue={config.borderWidth}\n\t\t\t\t\t\tonChange={(v) => handleChange(\"borderWidth\", v)}\n\t\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t\t\tallowedUnits={[\"px\", \"%\"]}\n\t\t\t\t\t\tconfig={{ min: 0, step: 0.5, placeholder: \"1px\" }}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div style={rowStyle}>\n\t\t\t\t<span style={labelStyle}>枠線 色</span>\n\t\t\t\t<div style={{ flex: 1, minWidth: 0 }}>\n\t\t\t\t\t<ColorPicker\n\t\t\t\t\t\tvalue={config.borderColor}\n\t\t\t\t\t\tonChange={(v: string | undefined) => handleChange(\"borderColor\", v)}\n\t\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t\t\tshowTextInput={true}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div style={rowStyle}>\n\t\t\t\t<span style={labelStyle}>チェック 幅</span>\n\t\t\t\t<div style={{ flex: 1, minWidth: 0 }}>\n\t\t\t\t\t<DimensionInput\n\t\t\t\t\t\tvalue={config.checkWidth}\n\t\t\t\t\t\tonChange={(v) => handleChange(\"checkWidth\", v)}\n\t\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t\t\tallowedUnits={[\"px\", \"%\"]}\n\t\t\t\t\t\tconfig={{ min: 0, step: 0.5, placeholder: \"3.5px\" }}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div style={rowStyle}>\n\t\t\t\t<span style={labelStyle}>チェック 色</span>\n\t\t\t\t<div style={{ flex: 1, minWidth: 0 }}>\n\t\t\t\t\t<ColorPicker\n\t\t\t\t\t\tvalue={config.checkColor}\n\t\t\t\t\t\tonChange={(v: string | undefined) => handleChange(\"checkColor\", v)}\n\t\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t\t\tshowTextInput={true}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div style={rowStyle}>\n\t\t\t\t<span style={labelStyle}>背景色</span>\n\t\t\t\t<div style={{ flex: 1, minWidth: 0 }}>\n\t\t\t\t\t<ColorPicker\n\t\t\t\t\t\tvalue={config.backgroundColor}\n\t\t\t\t\t\tonChange={(v: string | undefined) =>\n\t\t\t\t\t\t\thandleChange(\"backgroundColor\", v)\n\t\t\t\t\t\t}\n\t\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t\t\tshowTextInput={true}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div style={rowStyle}>\n\t\t\t\t<span style={labelStyle}>チェック時 背景色</span>\n\t\t\t\t<div style={{ flex: 1, minWidth: 0 }}>\n\t\t\t\t\t<ColorPicker\n\t\t\t\t\t\tvalue={config.checkedBackgroundColor}\n\t\t\t\t\t\tonChange={(v: string | undefined) =>\n\t\t\t\t\t\t\thandleChange(\"checkedBackgroundColor\", v)\n\t\t\t\t\t\t}\n\t\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t\t\tshowTextInput={true}\n\t\t\t\t\t\tallowUndefined\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nCheckboxStyleEditor.displayName = \"CheckboxStyleEditor\";\n","import styles from \"./FontDecorationToggle.module.css\";\n\n/**\n * `FontDecorationToggle` コンポーネントの値型。\n *\n * @remarks\n * フォント装飾の各スイッチの状態を表す型。\n */\nexport interface FontDecorationValue {\n\tfontWeight?: boolean;\n\titalic?: boolean;\n\tunderline?: boolean;\n\tlineThrough?: boolean;\n}\n\ninterface ButtonDef {\n\tkey: keyof FontDecorationValue;\n\tlabel: string;\n\ticon: React.ReactNode;\n}\n\nconst BUTTONS: ButtonDef[] = [\n\t{\n\t\tkey: \"fontWeight\",\n\t\tlabel: \"太字\",\n\t\ticon: (\n\t\t\t<span className={styles.iconBold} aria-hidden=\"true\">\n\t\t\t\tB\n\t\t\t</span>\n\t\t),\n\t},\n\t{\n\t\tkey: \"italic\",\n\t\tlabel: \"斜体\",\n\t\ticon: (\n\t\t\t<span className={styles.iconItalic} aria-hidden=\"true\">\n\t\t\t\tI\n\t\t\t</span>\n\t\t),\n\t},\n\t{\n\t\tkey: \"underline\",\n\t\tlabel: \"下線\",\n\t\ticon: (\n\t\t\t<span className={styles.iconUnderline} aria-hidden=\"true\">\n\t\t\t\tU\n\t\t\t</span>\n\t\t),\n\t},\n\t{\n\t\tkey: \"lineThrough\",\n\t\tlabel: \"取り消し線\",\n\t\ticon: (\n\t\t\t<span className={styles.iconLineThrough} aria-hidden=\"true\">\n\t\t\t\tS\n\t\t\t</span>\n\t\t),\n\t},\n];\n\ninterface FontDecorationToggleProps {\n\tvalue?: FontDecorationValue;\n\tonChange: (v: FontDecorationValue) => void;\n\treadOnly?: boolean;\n}\n\n/**\n * フォント装飾(太字・斜体・下線・取り消し線)をトグルする UI。\n *\n * @remarks\n * `PluginPanels` 内で `fontStyle` プロパティの装飾部分に使用される。\n */\nexport const FontDecorationToggle = ({\n\tvalue,\n\tonChange,\n\treadOnly = false,\n}: FontDecorationToggleProps) => {\n\tconst current = (value ?? {}) as FontDecorationValue;\n\n\tconst handleToggle = (key: keyof FontDecorationValue) => {\n\t\tif (readOnly) return;\n\t\tonChange({ ...current, [key]: !current[key] });\n\t};\n\n\treturn (\n\t\t<fieldset className={styles.group}>\n\t\t\t{BUTTONS.map(({ key, label, icon }) => {\n\t\t\t\tconst isActive = !!current[key];\n\t\t\t\treturn (\n\t\t\t\t\t<button\n\t\t\t\t\t\tkey={key}\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclassName={[styles.btn, isActive ? styles.active : \"\"]\n\t\t\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t\t\t.join(\" \")}\n\t\t\t\t\t\ttitle={label}\n\t\t\t\t\t\taria-label={label}\n\t\t\t\t\t\taria-pressed={isActive}\n\t\t\t\t\t\tdisabled={readOnly}\n\t\t\t\t\t\tonClick={() => handleToggle(key)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{icon}\n\t\t\t\t\t</button>\n\t\t\t\t);\n\t\t\t})}\n\t\t</fieldset>\n\t);\n};\n\nFontDecorationToggle.displayName = \"FontDecorationToggle\";\n","import { useCallback } from \"react\";\n\nimport { FONT_UNITS } from \"../../../../types\";\nimport { ColorPicker, DimensionInput, Dropdown } from \"../../../ui\";\nimport { FontDecorationToggle } from \"./FontDecorationToggle\";\nimport styles from \"./FontStyleEditor.module.css\";\n\nimport type { Dimension, FontUnit } from \"../../../../types\";\nimport type { FontDecorationValue } from \"./FontDecorationToggle\";\n\nconst DEFAULT_FONT_FAMILY = [\n\t{ label: \"ゴシック体\", value: \"sans-serif\" },\n\t{ label: \"明朝体\", value: \"serif\" },\n\t{ label: \"等幅\", value: \"monospace\" },\n\t{ label: \"Arial\", value: \"Arial, sans-serif\" },\n\t{ label: \"Times New Roman\", value: \"'Times New Roman', serif\" },\n] as const;\n\n/**\n * `FontStyleEditor` コンポーネントの値型。\n *\n * @remarks\n * フォント内容スタイルの各プロパティをまとめた型。\n */\nexport interface FontStyleEditorValue {\n\tfontFamily?: string;\n\n\t/** フォントサイズ。値と単位を持つ `Dimension<FontUnit>` 形式 */\n\tfontSize?: Dimension<FontUnit>;\n\n\tcolor?: string;\n\tfontWeight?: boolean;\n\titalic?: boolean;\n\tunderline?: boolean;\n\tlineThrough?: boolean;\n}\n\ninterface FontStyleEditorProps {\n\tvalue?: FontStyleEditorValue;\n\tonChange: (v: FontStyleEditorValue) => void;\n\treadOnly?: boolean;\n}\n\n/**\n * フォントサイズ・フォントファミリー・カラーを編集する UI。\n *\n * @remarks\n * `PluginPanels` 内で使用される。\n */\nexport const FontStyleEditor = ({\n\tvalue,\n\tonChange,\n\treadOnly = false,\n}: FontStyleEditorProps) => {\n\tconst current = (value ?? {}) as FontStyleEditorValue;\n\n\tconst handleFontFamily = useCallback(\n\t\t(v: string | undefined) => onChange({ ...current, fontFamily: v }),\n\t\t[current, onChange],\n\t);\n\n\tconst handleFontSize = useCallback(\n\t\t(v: Dimension<FontUnit> | undefined) =>\n\t\t\tonChange({ ...current, fontSize: v }),\n\t\t[current, onChange],\n\t);\n\n\tconst handleColor = useCallback(\n\t\t(v: string | undefined) => onChange({ ...current, color: v }),\n\t\t[current, onChange],\n\t);\n\n\tconst handleDecoration = useCallback(\n\t\t(v: FontDecorationValue) =>\n\t\t\tonChange({\n\t\t\t\t...current,\n\t\t\t\tfontWeight: v.fontWeight,\n\t\t\t\titalic: v.italic,\n\t\t\t\tunderline: v.underline,\n\t\t\t\tlineThrough: v.lineThrough,\n\t\t\t}),\n\t\t[current, onChange],\n\t);\n\n\tconst decorationValue: FontDecorationValue = {\n\t\tfontWeight: current.fontWeight,\n\t\titalic: current.italic,\n\t\tunderline: current.underline,\n\t\tlineThrough: current.lineThrough,\n\t};\n\n\treturn (\n\t\t<div className={styles.root}>\n\t\t\t{/* 行1: フォントドロップダウン + サイズ入力 */}\n\t\t\t<div className={styles.fontFamilyCell}>\n\t\t\t\t<Dropdown\n\t\t\t\t\tvalue={current.fontFamily}\n\t\t\t\t\tonChange={handleFontFamily}\n\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t\toptions={DEFAULT_FONT_FAMILY}\n\t\t\t\t\tplaceholder=\"フォント\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t<div className={styles.fontSizeCell}>\n\t\t\t\t<DimensionInput\n\t\t\t\t\tvalue={current.fontSize}\n\t\t\t\t\tonChange={handleFontSize}\n\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t\tconfig={{ allowedUnits: FONT_UNITS, min: 1, step: 1 }}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t{/* 行2: 文字色 + 文字装飾 */}\n\t\t\t<div className={styles.colorCell}>\n\t\t\t\t<ColorPicker\n\t\t\t\t\tvalue={current.color}\n\t\t\t\t\tonChange={handleColor}\n\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t\tallowUndefined\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t<div className={styles.decorationCell}>\n\t\t\t\t<FontDecorationToggle\n\t\t\t\t\tvalue={decorationValue}\n\t\t\t\t\tonChange={handleDecoration}\n\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nFontStyleEditor.displayName = \"FontStyleEditor\";\n","import { useCallback, useId, useMemo } from \"react\";\n\nimport { Checkbox, ColorPicker } from \"../../../ui\";\n\nimport type React from \"react\";\nimport type {\n\tSelectOption,\n\tSelectOptionsConfig,\n} from \"../../../../canvas/blocks/select/props\";\n\n/**\n * `OptionsEditor` コンポーネントへの props。\n */\nexport interface OptionsEditorProps {\n\t/** 現在の選択肢設定 */\n\tvalue: SelectOptionsConfig;\n\n\t/** 変更時のコールバック */\n\tonChange: (v: SelectOptionsConfig) => void;\n\n\t/** 読み取り専用モード */\n\treadOnly?: boolean;\n}\n\n/**\n * テキスト入力の選択肂を編集する UI。\n *\n * @remarks\n * `PluginPanels` 内で使用される。\n */\nexport const OptionsEditor: React.FC<OptionsEditorProps> = ({\n\tvalue,\n\tonChange,\n\treadOnly = false,\n}) => {\n\tconst options = value.options ?? [];\n\tconst uid = useId();\n\n\tconst duplicateIndices = useMemo(() => {\n\t\tconst seen = new Map<string, number>();\n\t\tconst dupes = new Set<number>();\n\t\tfor (const [i, opt] of options.entries()) {\n\t\t\tif (seen.has(opt.value)) {\n\t\t\t\tdupes.add(seen.get(opt.value) as number);\n\t\t\t\tdupes.add(i);\n\t\t\t} else {\n\t\t\t\tseen.set(opt.value, i);\n\t\t\t}\n\t\t}\n\t\treturn dupes;\n\t}, [options]);\n\n\tconst handleAdd = useCallback(() => {\n\t\tconst newOption: SelectOption = {\n\t\t\tlabel: `選択肢${options.length + 1}`,\n\t\t\tvalue: `option${options.length + 1}`,\n\t\t};\n\t\tonChange({ ...value, options: [...options, newOption] });\n\t}, [options, value, onChange]);\n\n\tconst handleRemove = useCallback(\n\t\t(index: number) => {\n\t\t\tonChange({ ...value, options: options.filter((_, i) => i !== index) });\n\t\t},\n\t\t[options, value, onChange],\n\t);\n\n\tconst handleLabelChange = useCallback(\n\t\t(index: number, newLabel: string) => {\n\t\t\tonChange({\n\t\t\t\t...value,\n\t\t\t\toptions: options.map((opt, i) =>\n\t\t\t\t\ti === index ? { ...opt, label: newLabel } : opt,\n\t\t\t\t),\n\t\t\t});\n\t\t},\n\t\t[options, value, onChange],\n\t);\n\n\tconst handleValueChange = useCallback(\n\t\t(index: number, newValue: string) => {\n\t\t\tonChange({\n\t\t\t\t...value,\n\t\t\t\toptions: options.map((opt, i) =>\n\t\t\t\t\ti === index ? { ...opt, value: newValue } : opt,\n\t\t\t\t),\n\t\t\t});\n\t\t},\n\t\t[options, value, onChange],\n\t);\n\n\tconst handleColorChange = useCallback(\n\t\t(index: number, newColor: string | undefined) => {\n\t\t\tonChange({\n\t\t\t\t...value,\n\t\t\t\toptions: options.map((opt, i) =>\n\t\t\t\t\ti === index ? { ...opt, color: newColor } : opt,\n\t\t\t\t),\n\t\t\t});\n\t\t},\n\t\t[options, value, onChange],\n\t);\n\n\tconst handleAllowEmptyChange = useCallback(\n\t\t(checked: boolean) => {\n\t\t\tonChange({ ...value, allowEmpty: checked });\n\t\t},\n\t\t[value, onChange],\n\t);\n\n\tconst inputStyle: React.CSSProperties = {\n\t\tpadding: \"4px 8px\",\n\t\tborder: \"1px solid #ccc\",\n\t\tborderRadius: 4,\n\t\tfontSize: 12,\n\t\tflex: 1,\n\t\tboxSizing: \"border-box\",\n\t\twidth: \"100%\",\n\t};\n\n\treturn (\n\t\t<div style={{ display: \"flex\", flexDirection: \"column\", gap: 4 }}>\n\t\t\t{/* 空選択を許可 */}\n\t\t\t<Checkbox\n\t\t\t\tvalue={value.allowEmpty ?? true}\n\t\t\t\tonChange={(checked) => handleAllowEmptyChange(checked ?? true)}\n\t\t\t\tlabel=\"空選択を許可\"\n\t\t\t\treadOnly={readOnly}\n\t\t\t/>\n\t\t\t<div\n\t\t\t\tstyle={{\n\t\t\t\t\tdisplay: \"flex\",\n\t\t\t\t\tflexDirection: \"column\",\n\t\t\t\t\tgap: 4,\n\t\t\t\t\tmaxHeight: 300,\n\t\t\t\t\toverflowY: \"auto\",\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t{options.map((option, index) => (\n\t\t\t\t\t<div\n\t\t\t\t\t\tkey={option.value || `option-${index}`}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tdisplay: \"flex\",\n\t\t\t\t\t\t\tflexDirection: \"column\",\n\t\t\t\t\t\t\tgap: 2,\n\t\t\t\t\t\t\tpadding: \"2px 0\",\n\t\t\t\t\t\t\tborderBottom: \"1px solid #f0f0f0\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tdisplay: \"flex\",\n\t\t\t\t\t\t\t\tjustifyContent: \"space-between\",\n\t\t\t\t\t\t\t\talignItems: \"center\",\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<span style={{ fontSize: 12, fontWeight: 600, color: \"#333\" }}>\n\t\t\t\t\t\t\t\tオプション{index + 1}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\tfontSize: 11,\n\t\t\t\t\t\t\t\t\tcolor: \"#e53e3e\",\n\t\t\t\t\t\t\t\t\tbackground: \"none\",\n\t\t\t\t\t\t\t\t\tborder: \"none\",\n\t\t\t\t\t\t\t\t\tcursor: \"pointer\",\n\t\t\t\t\t\t\t\t\tpadding: \"2px 4px\",\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tonClick={() => handleRemove(index)}\n\t\t\t\t\t\t\t\tdisabled={readOnly || options.length === 1}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t削除\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div style={{ display: \"flex\", alignItems: \"center\", gap: 4 }}>\n\t\t\t\t\t\t\t<label\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\tfontSize: 11,\n\t\t\t\t\t\t\t\t\tcolor: \"#666\",\n\t\t\t\t\t\t\t\t\tminWidth: 32,\n\t\t\t\t\t\t\t\t\tflexShrink: 0,\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\thtmlFor={`${uid}-label-${index}`}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tラベル\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\t\tid={`${uid}-label-${index}`}\n\t\t\t\t\t\t\t\tstyle={inputStyle}\n\t\t\t\t\t\t\t\tvalue={option.label}\n\t\t\t\t\t\t\t\tonChange={(e) => handleLabelChange(index, e.target.value)}\n\t\t\t\t\t\t\t\tdisabled={readOnly}\n\t\t\t\t\t\t\t\tplaceholder=\"表示名\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div style={{ display: \"flex\", alignItems: \"center\", gap: 4 }}>\n\t\t\t\t\t\t\t<label\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\tfontSize: 11,\n\t\t\t\t\t\t\t\t\tcolor: \"#666\",\n\t\t\t\t\t\t\t\t\tminWidth: 32,\n\t\t\t\t\t\t\t\t\tflexShrink: 0,\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\thtmlFor={`${uid}-value-${index}`}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t値\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t<div style={{ flex: 1 }}>\n\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\t\t\tid={`${uid}-value-${index}`}\n\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t...inputStyle,\n\t\t\t\t\t\t\t\t\t\tborderColor: duplicateIndices.has(index)\n\t\t\t\t\t\t\t\t\t\t\t? \"#e53e3e\"\n\t\t\t\t\t\t\t\t\t\t\t: \"#ccc\",\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\tvalue={option.value}\n\t\t\t\t\t\t\t\t\tonChange={(e) => handleValueChange(index, e.target.value)}\n\t\t\t\t\t\t\t\t\tdisabled={readOnly}\n\t\t\t\t\t\t\t\t\tplaceholder=\"内部値\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t{duplicateIndices.has(index) && (\n\t\t\t\t\t\t\t\t\t<p\n\t\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t\tfontSize: 11,\n\t\t\t\t\t\t\t\t\t\t\tcolor: \"#e53e3e\",\n\t\t\t\t\t\t\t\t\t\t\tmargin: \"2px 0 0\",\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t値が重複しています\n\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div style={{ display: \"flex\", alignItems: \"center\", gap: 4 }}>\n\t\t\t\t\t\t\t<label\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\tfontSize: 11,\n\t\t\t\t\t\t\t\t\tcolor: \"#666\",\n\t\t\t\t\t\t\t\t\tminWidth: 32,\n\t\t\t\t\t\t\t\t\tflexShrink: 0,\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\thtmlFor={`${uid}-color-${index}`}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t色\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t<ColorPicker\n\t\t\t\t\t\t\t\tvalue={option.color}\n\t\t\t\t\t\t\t\tonChange={(newColor: string | undefined) =>\n\t\t\t\t\t\t\t\t\thandleColorChange(index, newColor)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tallowUndefined\n\t\t\t\t\t\t\t\tplaceholder=\"色を選択\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t))}\n\t\t\t</div>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tstyle={{\n\t\t\t\t\tpadding: \"6px 12px\",\n\t\t\t\t\tborder: \"1px dashed #007bff\",\n\t\t\t\t\tborderRadius: 4,\n\t\t\t\t\tbackground: \"none\",\n\t\t\t\t\tcolor: \"#007bff\",\n\t\t\t\t\tfontSize: 12,\n\t\t\t\t\tcursor: \"pointer\",\n\t\t\t\t}}\n\t\t\t\tonClick={handleAdd}\n\t\t\t\tdisabled={readOnly}\n\t\t\t>\n\t\t\t\t+ 選択肢を追加\n\t\t\t</button>\n\t\t</div>\n\t);\n};\n\nOptionsEditor.displayName = \"OptionsEditor\";\n","import styles from \"./PaddingEditor.module.css\";\n\ninterface PaddingLinkCheckboxProps {\n\t/** 全辺一括モードかどうか */\n\tbulk: boolean;\n\t/** 変更時のコールバック */\n\tonChange: (v: boolean) => void;\n\treadOnly?: boolean;\n}\n\n/**\n * パディングの全辺一括設定リンクのチェックボックス。\n *\n * @remarks\n * `PaddingEditor` 内部で使用される。\n */\nexport const PaddingLinkCheckbox = ({\n\tbulk,\n\tonChange,\n\treadOnly = false,\n}: PaddingLinkCheckboxProps) => {\n\treturn (\n\t\t<label className={styles.linkLabel}>\n\t\t\t<input\n\t\t\t\ttype=\"checkbox\"\n\t\t\t\tchecked={bulk}\n\t\t\t\tdisabled={readOnly}\n\t\t\t\tonChange={(e) => onChange(e.target.checked)}\n\t\t\t/>\n\t\t\t全辺を一括設定\n\t\t</label>\n\t);\n};\n\nPaddingLinkCheckbox.displayName = \"PaddingLinkCheckbox\";\n","import { useCallback } from \"react\";\n\nimport { PADDING_UNITS } from \"../../../../types\";\nimport { DimensionInput } from \"../../../ui\";\nimport styles from \"./PaddingEditor.module.css\";\nimport { PaddingLinkCheckbox } from \"./PaddingLinkCheckbox\";\n\nimport type { Dimension, PaddingUnit } from \"../../../../types\";\n\n/**\n * `PaddingEditor` コンポーネントの値型。\n *\n * @remarks\n * 4辺のパディング値と一括モードフラグをまとめた型。\n */\nexport interface PaddingEditorValue {\n\t/** 上辺のパディング。値と単位を持つ `Dimension<PaddingUnit>` 形式 */\n\ttop?: Dimension<PaddingUnit>;\n\n\t/** 右辺のパディング。値と単位を持つ `Dimension<PaddingUnit>` 形式 */\n\tright?: Dimension<PaddingUnit>;\n\n\t/** 下辺のパディング。値と単位を持つ `Dimension<PaddingUnit>` 形式 */\n\tbottom?: Dimension<PaddingUnit>;\n\n\t/** 左辺のパディング。値と単位を持つ `Dimension<PaddingUnit>` 形式 */\n\tleft?: Dimension<PaddingUnit>;\n\n\t/** 全辺一括モード。`true` のとき `all` が全辺に適用される */\n\tbulk?: boolean;\n\n\t/** 全辺共通パディング(`bulk: true` のとき有効) */\n\tall?: Dimension<PaddingUnit>;\n}\n\nconst ZERO: Dimension<PaddingUnit> = { value: 0, unit: \"px\" };\n\ntype DimOnChange = (v: Dimension<PaddingUnit> | undefined) => void;\n\ninterface PaddingEditorProps {\n\tvalue?: PaddingEditorValue;\n\tonChange: (v: PaddingEditorValue) => void;\n\treadOnly?: boolean;\n}\n\n/**\n * パディング値を上下左右別に編集する UI。\n *\n * @remarks\n * `PluginPanels` 内で使用される。\n */\nexport const PaddingEditor = ({\n\tvalue,\n\tonChange,\n\treadOnly = false,\n}: PaddingEditorProps) => {\n\tconst current = (value ?? {}) as PaddingEditorValue;\n\tconst bulk = current.bulk ?? false;\n\n\tconst handleBulkChange = useCallback(\n\t\t(checked: boolean) => {\n\t\t\tif (checked) {\n\t\t\t\tonChange({ bulk: true, all: current.top ?? ZERO });\n\t\t\t} else {\n\t\t\t\tonChange({\n\t\t\t\t\tbulk: false,\n\t\t\t\t\ttop: current.top ?? current.all ?? ZERO,\n\t\t\t\t\tright: current.right ?? current.all ?? ZERO,\n\t\t\t\t\tbottom: current.bottom ?? current.all ?? ZERO,\n\t\t\t\t\tleft: current.left ?? current.all ?? ZERO,\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\t[current, onChange],\n\t);\n\n\tconst handleAll: DimOnChange = useCallback(\n\t\t(all) => {\n\t\t\tif (!all) return;\n\t\t\tonChange({ all });\n\t\t},\n\t\t[onChange],\n\t);\n\n\tconst handleTop: DimOnChange = useCallback(\n\t\t(top) => {\n\t\t\tif (!top) return;\n\t\t\tonChange({ top });\n\t\t},\n\t\t[onChange],\n\t);\n\n\tconst handleRight: DimOnChange = useCallback(\n\t\t(right) => {\n\t\t\tif (!right) return;\n\t\t\tonChange({ right });\n\t\t},\n\t\t[onChange],\n\t);\n\n\tconst handleBottom: DimOnChange = useCallback(\n\t\t(bottom) => {\n\t\t\tif (!bottom) return;\n\t\t\tonChange({ bottom });\n\t\t},\n\t\t[onChange],\n\t);\n\n\tconst handleLeft: DimOnChange = useCallback(\n\t\t(left) => {\n\t\t\tif (!left) return;\n\t\t\tonChange({ left });\n\t\t},\n\t\t[onChange],\n\t);\n\n\treturn (\n\t\t<div className={styles.root}>\n\t\t\t<PaddingLinkCheckbox\n\t\t\t\tbulk={bulk}\n\t\t\t\tonChange={handleBulkChange}\n\t\t\t\treadOnly={readOnly}\n\t\t\t/>\n\t\t\t{bulk ? (\n\t\t\t\t/* 一括モード:中央1入力 */\n\t\t\t\t<div className={styles.allRow}>\n\t\t\t\t\t<div className={styles.cell}>\n\t\t\t\t\t\t<DimensionInput\n\t\t\t\t\t\t\tvalue={current.all ?? ZERO}\n\t\t\t\t\t\t\tonChange={handleAll}\n\t\t\t\t\t\t\tconfig={{ allowedUnits: PADDING_UNITS, min: 0 }}\n\t\t\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t) : (\n\t\t\t\t/* 個別モード:十字レイアウト */\n\t\t\t\t<div className={styles.grid}>\n\t\t\t\t\t{/* 上 */}\n\t\t\t\t\t<div className={styles.cell}>\n\t\t\t\t\t\t<DimensionInput\n\t\t\t\t\t\t\tvalue={current.top ?? ZERO}\n\t\t\t\t\t\t\tonChange={handleTop}\n\t\t\t\t\t\t\tconfig={{ allowedUnits: PADDING_UNITS, min: 0 }}\n\t\t\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{/* 左・スペーサー・右 */}\n\t\t\t\t\t<div className={styles.sideRow}>\n\t\t\t\t\t\t<div className={styles.cell}>\n\t\t\t\t\t\t\t<DimensionInput\n\t\t\t\t\t\t\t\tvalue={current.left ?? ZERO}\n\t\t\t\t\t\t\t\tonChange={handleLeft}\n\t\t\t\t\t\t\t\tconfig={{ allowedUnits: PADDING_UNITS, min: 0 }}\n\t\t\t\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div className={styles.spacer} />\n\t\t\t\t\t\t<div className={styles.cell}>\n\t\t\t\t\t\t\t<DimensionInput\n\t\t\t\t\t\t\t\tvalue={current.right ?? ZERO}\n\t\t\t\t\t\t\t\tonChange={handleRight}\n\t\t\t\t\t\t\t\tconfig={{ allowedUnits: PADDING_UNITS, min: 0 }}\n\t\t\t\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{/* 下 */}\n\t\t\t\t\t<div className={styles.cell}>\n\t\t\t\t\t\t<DimensionInput\n\t\t\t\t\t\t\tvalue={current.bottom ?? ZERO}\n\t\t\t\t\t\t\tonChange={handleBottom}\n\t\t\t\t\t\t\tconfig={{ allowedUnits: PADDING_UNITS, min: 0 }}\n\t\t\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n};\n\nPaddingEditor.displayName = \"PaddingEditor\";\n","import {\n\ttextBehaviorProp,\n\tWordWrap,\n} from \"../../../../canvas/blocks/text/props\";\nimport { Checkbox, Dropdown, NumberInput } from \"../../../ui\";\n\nimport type React from \"react\";\nimport type { Value } from \"../../../../types\";\n\nconst DEFAULT = textBehaviorProp.defaultProps;\n\nconst WORD_WRAP_OPTIONS = [\n\t{ label: \"標準\", value: WordWrap.normal },\n\t{ label: \"単語で折り返し\", value: WordWrap.breakWord },\n\t{ label: \"文字で折り返し\", value: WordWrap.breakAll },\n] as const;\n\n/**\n * `TextBehaviorEditor` コンポーネントへの props。\n */\nexport interface TextBehaviorEditorProps {\n\t/** 複数行モードかどうか */\n\tmultiline?: boolean;\n\n\t/** 行間 */\n\tlineHeight?: number;\n\n\t/** 折り返し化設定 */\n\twordWrap?: WordWrap;\n\n\t/** 値変更時のコールバック */\n\tonChange: (key: string, value: Value) => void;\n\n\t/** 読み取り専用モード */\n\treadOnly?: boolean;\n}\n\nconst rowStyle: React.CSSProperties = {\n\tdisplay: \"flex\",\n\talignItems: \"center\",\n\tgap: 6,\n\tmarginBottom: 4,\n};\n\nconst labelStyle: React.CSSProperties = {\n\tfontSize: 11,\n\tcolor: \"#666\",\n\tminWidth: 72,\n\tflexShrink: 0,\n};\n\n/**\n * テキストの改行・行間距・折り返しなどの振る舞いを編集する UI。\n *\n * @remarks\n * `PluginPanels` 内で使用される。\n */\nexport const TextBehaviorEditor: React.FC<TextBehaviorEditorProps> = ({\n\tmultiline,\n\tlineHeight,\n\twordWrap,\n\tonChange,\n\treadOnly = false,\n}) => {\n\treturn (\n\t\t<div style={{ display: \"flex\", flexDirection: \"column\", gap: 2 }}>\n\t\t\t{/* 複数行モード */}\n\t\t\t<div style={rowStyle}>\n\t\t\t\t<span style={labelStyle}>複数行</span>\n\t\t\t\t<Checkbox\n\t\t\t\t\tvalue={multiline ?? DEFAULT.multiline}\n\t\t\t\t\tonChange={(v) => onChange(\"multiline\", v ?? false)}\n\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t\tlabel=\"複数行入力を有効にする\"\n\t\t\t\t/>\n\t\t\t</div>\n\n\t\t\t{/* 行間 */}\n\t\t\t<div style={rowStyle}>\n\t\t\t\t<span style={labelStyle}>行間</span>\n\t\t\t\t<div style={{ flex: 1 }}>\n\t\t\t\t\t<NumberInput\n\t\t\t\t\t\tvalue={lineHeight ?? DEFAULT.lineHeight}\n\t\t\t\t\t\tonChange={(v) => onChange(\"lineHeight\", v ?? DEFAULT.lineHeight)}\n\t\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t\t\tmin={0.5}\n\t\t\t\t\t\tmax={5}\n\t\t\t\t\t\tstep={0.1}\n\t\t\t\t\t\theight={24}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t{/* 折り返し */}\n\t\t\t<div style={rowStyle}>\n\t\t\t\t<span style={labelStyle}>折り返し</span>\n\t\t\t\t<div style={{ flex: 1 }}>\n\t\t\t\t\t<Dropdown\n\t\t\t\t\t\tvalue={wordWrap ?? DEFAULT.wordWrap}\n\t\t\t\t\t\tonChange={(v) => onChange(\"wordWrap\", v ?? DEFAULT.wordWrap)}\n\t\t\t\t\t\toptions={WORD_WRAP_OPTIONS}\n\t\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t\t\theight={24}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nTextBehaviorEditor.displayName = \"TextBehaviorEditor\";\n","import { useCallback, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nimport { Dropdown, NumberInput, TextInput } from \"../../../ui\";\n\nimport type React from \"react\";\nimport type { Value } from \"../../../../types\";\n\ntype CombinedOption = {\n\tlabel: string;\n\tinputType: string;\n\tpattern?: string;\n\tisCustom?: true;\n\thideLength?: true;\n};\n\nconst COMBINED_OPTIONS: CombinedOption[] = [\n\t{ label: \"テキスト\", inputType: \"text\" },\n\t{ label: \"数字のみ\", inputType: \"text\", pattern: \"[0-9]+\" },\n\t{ label: \"半角英字のみ\", inputType: \"text\", pattern: \"[a-zA-Z]+\" },\n\t{ label: \"半角英数字のみ\", inputType: \"text\", pattern: \"[a-zA-Z0-9]+\" },\n\t{ label: \"ひらがなのみ\", inputType: \"text\", pattern: \"[ぁ-ん]+\" },\n\t{ label: \"カタカナのみ\", inputType: \"text\", pattern: \"[ァ-ン]+\" },\n\t{\n\t\tlabel: \"郵便番号(123-4567)\",\n\t\tinputType: \"text\",\n\t\tpattern: \"[0-9]{3}-[0-9]{4}\",\n\t\thideLength: true,\n\t},\n\t{\n\t\tlabel: \"電話番号\",\n\t\tinputType: \"tel\",\n\t\tpattern: \"[0-9]{2,4}-[0-9]{2,4}-[0-9]{4}\",\n\t\thideLength: true,\n\t},\n\t{\n\t\tlabel: \"メールアドレス\",\n\t\tinputType: \"email\",\n\t\tpattern:\n\t\t\t\"^[a-zA-Z0-9_+\\\\-.]+@[a-zA-Z0-9\\\\-]+(\\\\.[a-zA-Z0-9\\\\-]+)*\\\\.[a-zA-Z]{2,}$\",\n\t\thideLength: true,\n\t},\n\t{\n\t\tlabel: \"URL\",\n\t\tinputType: \"url\",\n\t\tpattern: \"https?://[^\\\\s]+\",\n\t\thideLength: true,\n\t},\n\t{\n\t\tlabel: \"日付\",\n\t\tinputType: \"date\",\n\t\tpattern: \"[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])\",\n\t\thideLength: true,\n\t},\n\t{ label: \"その他\", inputType: \"text\", isCustom: true },\n];\n\nconst COMBINED_DROPDOWN_OPTIONS = COMBINED_OPTIONS.map((o) => ({\n\tlabel: o.label,\n\tvalue: o.label,\n}));\n\nconst PATTERN_HELP = `[0-9] 数字のみ\n[a-z] 英小文字\n[A-Z] 英大文字\n[ぁ-ん] ひらがな\n+ 1回以上繰り返し\n* 0回以上繰り返し\n{3} 3回繰り返し\n{3,5} 3〜5回繰り返し\n. 任意の1文字`;\n\n/**\n * `TextValidationEditor` コンポーネントへの props。\n */\nexport interface TextValidationEditorProps {\n\t/** 入力タイプ(`\"text\"`, `\"tel\"`, `\"email\"`, `\"date\"`, `\"url\"` 等) */\n\tinputType?: string;\n\n\t/** 最小文字数 */\n\tminLength?: number;\n\n\t/** 最大文字数 */\n\tmaxLength?: number;\n\n\t/** 入力パターン(正規表現の文字クラス等) */\n\tpattern?: string;\n\n\t/** 単一キー値変更コールバック */\n\tonChange: (key: string, value: Value) => void;\n\n\t/** 複数キー一括変更コールバック */\n\tonChangeBatch?: (updates: Record<string, Value>) => void;\n\n\t/** 読み取り専用モード */\n\treadOnly?: boolean;\n}\n\nconst rowStyle: React.CSSProperties = {\n\tdisplay: \"flex\",\n\talignItems: \"center\",\n\tgap: 6,\n\tmarginBottom: 4,\n};\nconst labelStyle: React.CSSProperties = {\n\tfontSize: 11,\n\tcolor: \"#666\",\n\tminWidth: 72,\n\tflexShrink: 0,\n};\n\n/**\n * テキスト入力のバリデーションルール(入力タイプ・文字数・パターン)を編集する UI。\n *\n * @remarks\n * `PluginPanels` 内で使用される。\n */\nexport const TextValidationEditor: React.FC<TextValidationEditorProps> = ({\n\tinputType,\n\tminLength,\n\tmaxLength,\n\tpattern,\n\tonChange,\n\tonChangeBatch,\n\treadOnly = false,\n}) => {\n\tconst [tooltipVisible, setTooltipVisible] = useState(false);\n\tconst [tooltipStyle, setTooltipStyle] = useState<React.CSSProperties>({});\n\tconst infoBtnRef = useRef<HTMLButtonElement>(null);\n\n\tconst showTooltip = useCallback(() => {\n\t\tconst rect = infoBtnRef.current?.getBoundingClientRect();\n\t\tif (!rect) return;\n\t\tsetTooltipStyle({\n\t\t\tposition: \"fixed\",\n\t\t\tbottom: window.innerHeight - rect.top + 4,\n\t\t\tright: window.innerWidth - rect.right,\n\t\t});\n\t\tsetTooltipVisible(true);\n\t}, []);\n\n\tconst hideTooltip = useCallback(() => setTooltipVisible(false), []);\n\n\t// propsから現在の選択肢ラベルを算出\n\t// pattern: null/undefined → resolvedPattern: undefined → \"テキスト\" にマッチ\n\t// pattern: \"\" → resolvedPattern: \"\" → どのプリセットにもマッチせず → \"その他\"\n\tconst resolvedInputType = inputType ?? \"text\";\n\tconst resolvedPattern = pattern ?? undefined;\n\tconst currentLabel = (() => {\n\t\tconst match = COMBINED_OPTIONS.find((o) => {\n\t\t\tif (o.isCustom) return false;\n\t\t\tif (o.inputType !== resolvedInputType) return false;\n\t\t\treturn o.pattern === resolvedPattern;\n\t\t});\n\t\treturn match?.label ?? \"その他\";\n\t})();\n\tconst isCustom = currentLabel === \"その他\";\n\tconst currentOpt = COMBINED_OPTIONS.find((o) => o.label === currentLabel);\n\tconst showLength = !currentOpt?.hideLength;\n\n\tconst handleCombinedChange = useCallback(\n\t\t(label: string | undefined) => {\n\t\t\tconst opt = COMBINED_OPTIONS.find((o) => o.label === label);\n\t\t\tif (!opt) return;\n\t\t\t// isCustom の場合は pattern を \"\" にして currentLabel を \"その他\" に固定する\n\t\t\t// (null → resolvedPattern=undefined → \"テキスト\" とマッチしてしまうため空文字で区別)\n\t\t\tconst nextPattern: Value = opt.isCustom ? \"\" : (opt.pattern ?? null);\n\t\t\tconst updates: Record<string, Value> = {\n\t\t\t\tinputType: opt.inputType,\n\t\t\t\tpattern: nextPattern,\n\t\t\t};\n\t\t\tif (onChangeBatch) {\n\t\t\t\tonChangeBatch(updates);\n\t\t\t} else {\n\t\t\t\tfor (const [k, v] of Object.entries(updates)) {\n\t\t\t\t\tonChange(k, v);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t[onChange, onChangeBatch],\n\t);\n\n\treturn (\n\t\t<div style={{ display: \"flex\", flexDirection: \"column\", gap: 2 }}>\n\t\t\t{/* 入力タイプ */}\n\t\t\t<div style={rowStyle}>\n\t\t\t\t<span style={labelStyle}>入力タイプ</span>\n\t\t\t\t<div style={{ flex: 1 }}>\n\t\t\t\t\t<Dropdown\n\t\t\t\t\t\tvalue={currentLabel}\n\t\t\t\t\t\tonChange={handleCombinedChange}\n\t\t\t\t\t\toptions={COMBINED_DROPDOWN_OPTIONS}\n\t\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t\t\theight={24}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t{/* 文字数(文字数が固定されるオプションでは非表示) */}\n\t\t\t{showLength && (\n\t\t\t\t<div style={rowStyle}>\n\t\t\t\t\t<span style={labelStyle}>文字数</span>\n\t\t\t\t\t<div\n\t\t\t\t\t\tstyle={{ display: \"flex\", alignItems: \"center\", gap: 4, flex: 1 }}\n\t\t\t\t\t>\n\t\t\t\t\t\t<div style={{ flex: 1 }}>\n\t\t\t\t\t\t\t<NumberInput\n\t\t\t\t\t\t\t\tvalue={minLength}\n\t\t\t\t\t\t\t\tonChange={(v) => onChange(\"minLength\", v ?? null)}\n\t\t\t\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t\t\t\t\tmin={0}\n\t\t\t\t\t\t\t\tplaceholder=\"min\"\n\t\t\t\t\t\t\t\theight={24}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<span style={{ fontSize: 11, color: \"#666\" }}>〜</span>\n\t\t\t\t\t\t<div style={{ flex: 1 }}>\n\t\t\t\t\t\t\t<NumberInput\n\t\t\t\t\t\t\t\tvalue={maxLength}\n\t\t\t\t\t\t\t\tonChange={(v) => onChange(\"maxLength\", v ?? null)}\n\t\t\t\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t\t\t\t\tmin={0}\n\t\t\t\t\t\t\t\tplaceholder=\"max\"\n\t\t\t\t\t\t\t\theight={24}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<span style={{ fontSize: 11, color: \"#666\" }}>文字</span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{/* カスタムパターン(「その他」選択時のみ表示) */}\n\t\t\t{isCustom && (\n\t\t\t\t<div style={rowStyle}>\n\t\t\t\t\t<span\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t...labelStyle,\n\t\t\t\t\t\t\tdisplay: \"flex\",\n\t\t\t\t\t\t\talignItems: \"center\",\n\t\t\t\t\t\t\tgap: 2,\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\tパターン\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tref={infoBtnRef}\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tdisplay: \"inline-flex\",\n\t\t\t\t\t\t\t\talignItems: \"center\",\n\t\t\t\t\t\t\t\tjustifyContent: \"center\",\n\t\t\t\t\t\t\t\twidth: 14,\n\t\t\t\t\t\t\t\theight: 14,\n\t\t\t\t\t\t\t\tborder: \"none\",\n\t\t\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\t\t\tborderRadius: 9999,\n\t\t\t\t\t\t\t\tbackgroundColor: \"#d1d5db\",\n\t\t\t\t\t\t\t\tcolor: \"#fff\",\n\t\t\t\t\t\t\t\tfontSize: 9,\n\t\t\t\t\t\t\t\tfontWeight: 700,\n\t\t\t\t\t\t\t\tcursor: \"help\",\n\t\t\t\t\t\t\t\toutline: \"none\",\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\taria-label=\"入力パターンの使い方\"\n\t\t\t\t\t\t\tonMouseEnter={showTooltip}\n\t\t\t\t\t\t\tonMouseLeave={hideTooltip}\n\t\t\t\t\t\t\tonFocus={showTooltip}\n\t\t\t\t\t\t\tonBlur={hideTooltip}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\ti\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</span>\n\t\t\t\t\t<div style={{ flex: 1 }}>\n\t\t\t\t\t\t<TextInput\n\t\t\t\t\t\t\tvalue={pattern ?? \"\"}\n\t\t\t\t\t\t\tonChange={(v) => {\n\t\t\t\t\t\t\t\t// 空文字のまま保持することで currentLabel が \"その他\" を維持する\n\t\t\t\t\t\t\t\tonChange(\"pattern\", v ?? \"\");\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t\t\t\tplaceholder=\"例: [0-9]+\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{tooltipVisible &&\n\t\t\t\tcreatePortal(\n\t\t\t\t\t<pre\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t...tooltipStyle,\n\t\t\t\t\t\t\tzIndex: 9999999,\n\t\t\t\t\t\t\twidth: \"max-content\",\n\t\t\t\t\t\t\tmargin: 0,\n\t\t\t\t\t\t\tpadding: \"6px 10px\",\n\t\t\t\t\t\t\tfontSize: 11,\n\t\t\t\t\t\t\tfontFamily: \"monospace\",\n\t\t\t\t\t\t\tlineHeight: 1.6,\n\t\t\t\t\t\t\tcolor: \"#f3f4f6\",\n\t\t\t\t\t\t\tbackgroundColor: \"rgba(30, 30, 30, 0.95)\",\n\t\t\t\t\t\t\tborderRadius: 6,\n\t\t\t\t\t\t\tboxShadow: \"0 4px 12px rgba(0,0,0,0.4)\",\n\t\t\t\t\t\t\twhiteSpace: \"pre\",\n\t\t\t\t\t\t\tpointerEvents: \"none\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{PATTERN_HELP}\n\t\t\t\t\t</pre>,\n\t\t\t\t\tdocument.body,\n\t\t\t\t)}\n\t\t</div>\n\t);\n};\n\nTextValidationEditor.displayName = \"TextValidationEditor\";\n","import { memo, useCallback } from \"react\";\n\nimport {\n\tHorizontalAlign,\n\tVerticalAlign,\n} from \"../../../../plugin/properties/alignment\";\nimport { Checkbox, CollapsibleSection, TextInput } from \"../../../ui\";\nimport { getCommonValue } from \"../../utils/getCommonValue\";\nimport { AlignmentToggle } from \"./AlignmentToggle\";\nimport { CheckboxStyleEditor } from \"./CheckboxStyleEditor\";\nimport { FontStyleEditor } from \"./FontStyleEditor\";\nimport { OptionsEditor } from \"./OptionsEditor\";\nimport { PaddingEditor } from \"./PaddingEditor\";\nimport { TextBehaviorEditor } from \"./TextBehaviorEditor\";\nimport { TextValidationEditor } from \"./TextValidationEditor\";\n\nimport type { ComponentType } from \"react\";\nimport type { CheckboxStyleConfig } from \"../../../../canvas/blocks/checkbox/props\";\nimport type { SelectOptionsConfig } from \"../../../../canvas/blocks/select/props\";\nimport type { PropDef, PropertyComponentProps } from \"../../../../plugin\";\nimport type {\n\tBlock,\n\tDimension,\n\tFontUnit,\n\tPaddingUnit,\n\tUnit,\n\tValue,\n} from \"../../../../types\";\nimport type { BlockDefaults } from \"../../../../types/schema\";\nimport type { AlignmentToggleOption } from \"./AlignmentToggle\";\nimport type { FontStyleEditorValue } from \"./FontStyleEditor\";\nimport type { PaddingEditorValue } from \"./PaddingEditor\";\n\n/**\n * `PropDefEditor`(ブロックデフォルト用)および `PropertyField` コンポーネントへの props。\n */\nexport interface PropertyFieldProps {\n\t/** プロパティ定義(種類・ドィスプレイ名・デフォルト値など) */\n\tpropDef: PropDef;\n\n\t/** 選択中のブロックの配列 */\n\tselectedBlocks: Block[];\n\n\t/** 容橋値変更時のコールバック */\n\tonChange: (key: string, value: Value) => void;\n\n\t/** 複数値一括変更時のコールバック */\n\tonChangeBatch?: (updates: Record<string, Value>) => void;\n\t/** `true` のときカスタムコンポーネントに `readOnly` を渡す */\n\treadOnly?: boolean;\n\t/** ブロックデフォルト設定 */\n\tblockDefaults?: BlockDefaults;\n\n\t/** デフォルト値にリセット実行時のコールバック */\n\tonResetToDefault?: (keys: string[]) => void;\n}\n\n/**\n * `PropDef` の kind に対応する日本語表示名のマップ。\n *\n * @remarks\n * `PropertyField` のセクションヘッダに使用される。\n */\nexport const KIND_TITLES: Record<string, string> = {\n\talignment: \"配置\",\n\tfontStyle: \"フォントスタイル\",\n\tpadding: \"パディング\",\n\trequired: \"必須入力\",\n\tplaceholder: \"プレースホルダー\",\n\ttextValidation: \"入力検証\",\n\ttextBehavior: \"テキスト動作\",\n\tselectConfig: \"選択肢設定\",\n\tcheckboxStyle: \"チェックボックスデザイン\",\n};\n\nconst HORIZONTAL_OPTIONS: AlignmentToggleOption[] = [\n\t{\n\t\tvalue: HorizontalAlign.left,\n\t\tlabel: \"左揃え\",\n\t\ticon: (\n\t\t\t<svg viewBox=\"0 0 16 16\" fill=\"currentColor\" aria-hidden=\"true\">\n\t\t\t\t<rect x=\"1\" y=\"2\" width=\"1.5\" height=\"12\" rx=\"0.5\" />\n\t\t\t\t<rect x=\"4\" y=\"3\" width=\"6\" height=\"2.5\" rx=\"0.5\" />\n\t\t\t\t<rect x=\"4\" y=\"7\" width=\"10\" height=\"2.5\" rx=\"0.5\" />\n\t\t\t\t<rect x=\"4\" y=\"11\" width=\"7\" height=\"2.5\" rx=\"0.5\" />\n\t\t\t</svg>\n\t\t),\n\t},\n\t{\n\t\tvalue: HorizontalAlign.center,\n\t\tlabel: \"中央揃え\",\n\t\ticon: (\n\t\t\t<svg viewBox=\"0 0 16 16\" fill=\"currentColor\" aria-hidden=\"true\">\n\t\t\t\t<rect x=\"7.25\" y=\"2\" width=\"1.5\" height=\"12\" rx=\"0.5\" />\n\t\t\t\t<rect x=\"3.5\" y=\"3\" width=\"9\" height=\"2.5\" rx=\"0.5\" />\n\t\t\t\t<rect x=\"1\" y=\"7\" width=\"14\" height=\"2.5\" rx=\"0.5\" />\n\t\t\t\t<rect x=\"4.5\" y=\"11\" width=\"7\" height=\"2.5\" rx=\"0.5\" />\n\t\t\t</svg>\n\t\t),\n\t},\n\t{\n\t\tvalue: HorizontalAlign.right,\n\t\tlabel: \"右揃え\",\n\t\ticon: (\n\t\t\t<svg viewBox=\"0 0 16 16\" fill=\"currentColor\" aria-hidden=\"true\">\n\t\t\t\t<rect x=\"13.5\" y=\"2\" width=\"1.5\" height=\"12\" rx=\"0.5\" />\n\t\t\t\t<rect x=\"6\" y=\"3\" width=\"6\" height=\"2.5\" rx=\"0.5\" />\n\t\t\t\t<rect x=\"2\" y=\"7\" width=\"10\" height=\"2.5\" rx=\"0.5\" />\n\t\t\t\t<rect x=\"5\" y=\"11\" width=\"7\" height=\"2.5\" rx=\"0.5\" />\n\t\t\t</svg>\n\t\t),\n\t},\n];\n\nconst VERTICAL_OPTIONS: AlignmentToggleOption[] = [\n\t{\n\t\tvalue: VerticalAlign.top,\n\t\tlabel: \"上揃え\",\n\t\ticon: (\n\t\t\t<svg viewBox=\"0 0 16 16\" fill=\"currentColor\" aria-hidden=\"true\">\n\t\t\t\t<rect x=\"1\" y=\"1\" width=\"14\" height=\"1\" />\n\t\t\t\t<rect x=\"2\" y=\"3\" width=\"4\" height=\"8\" rx=\"0.5\" />\n\t\t\t\t<rect x=\"10\" y=\"3\" width=\"4\" height=\"5\" rx=\"0.5\" />\n\t\t\t</svg>\n\t\t),\n\t},\n\t{\n\t\tvalue: VerticalAlign.center,\n\t\tlabel: \"中央揃え\",\n\t\ticon: (\n\t\t\t<svg viewBox=\"0 0 16 16\" fill=\"currentColor\" aria-hidden=\"true\">\n\t\t\t\t<rect x=\"1\" y=\"7.5\" width=\"14\" height=\"1\" />\n\t\t\t\t<rect x=\"2\" y=\"3\" width=\"4\" height=\"10\" rx=\"0.5\" />\n\t\t\t\t<rect x=\"10\" y=\"4.5\" width=\"4\" height=\"7\" rx=\"0.5\" />\n\t\t\t</svg>\n\t\t),\n\t},\n\t{\n\t\tvalue: VerticalAlign.bottom,\n\t\tlabel: \"下揃え\",\n\t\ticon: (\n\t\t\t<svg viewBox=\"0 0 16 16\" fill=\"currentColor\" aria-hidden=\"true\">\n\t\t\t\t<rect x=\"1\" y=\"14\" width=\"14\" height=\"1\" />\n\t\t\t\t<rect x=\"2\" y=\"5\" width=\"4\" height=\"8\" rx=\"0.5\" />\n\t\t\t\t<rect x=\"10\" y=\"8\" width=\"4\" height=\"5\" rx=\"0.5\" />\n\t\t\t</svg>\n\t\t),\n\t},\n];\n\nfunction isDimension<U extends Unit>(v: unknown): v is Dimension<U> {\n\treturn (\n\t\ttypeof v === \"object\" &&\n\t\tv !== null &&\n\t\ttypeof (v as Record<string, unknown>).value === \"number\" &&\n\t\ttypeof (v as Record<string, unknown>).unit === \"string\"\n\t);\n}\n\nfunction isSelectOptionsConfig(v: unknown): v is SelectOptionsConfig {\n\treturn (\n\t\ttypeof v === \"object\" &&\n\t\tv !== null &&\n\t\tArray.isArray((v as Record<string, unknown>).options)\n\t);\n}\n\n/**\n * `PropDefEditor` コンポーネントへの props。\n */\nexport interface PropDefEditorProps {\n\t/** プロパティの種類(`\"alignment\"`, `\"fontStyle\"`, `\"padding\"` 等) */\n\tkind: string;\n\n\t/** PropDef から解決されたデフォルト値のマップ */\n\tdefaultProps: Record<string, Value>;\n\n\t/** 指定キーの現在値を取得するゲッター */\n\tgetVal: (key: string) => Value;\n\n\t/** 単一キーの値変更コールバック */\n\tonChange: (key: string, value: Value) => void;\n\n\t/** 複数キーの一括変更コールバック */\n\tonChangeBatch?: (updates: Record<string, Value>) => void;\n\n\t/** 読み取り専用にするかどうか(カスタムコンポーネントに渡われる) */\n\treadOnly?: boolean;\n\n\t/** PropDef に指定されたカスタムUIコンポーネント */\n\tcomponent?: ComponentType<PropertyComponentProps<Value>>;\n}\n\n/**\n * `PropDef` の種類に応じた編集 UI を描画する純粋コンポーネント。\n *\n * @remarks\n * `PropertyField` の内部で使用される。\n */\nexport const PropDefEditor = memo(\n\t({\n\t\tkind,\n\t\tdefaultProps,\n\t\tgetVal,\n\t\tonChange,\n\t\tonChangeBatch,\n\t\treadOnly,\n\t\tcomponent,\n\t}: PropDefEditorProps) => {\n\t\tswitch (kind) {\n\t\t\tcase \"alignment\": {\n\t\t\t\tconst hValue = getVal(\"horizontal\") ?? HorizontalAlign.left;\n\t\t\t\tconst vValue = getVal(\"vertical\") ?? VerticalAlign.center;\n\t\t\t\treturn (\n\t\t\t\t\t<div\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tdisplay: \"flex\",\n\t\t\t\t\t\t\tgap: 8,\n\t\t\t\t\t\t\talignItems: \"center\",\n\t\t\t\t\t\t\tflexWrap: \"wrap\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<AlignmentToggle\n\t\t\t\t\t\t\toptions={HORIZONTAL_OPTIONS}\n\t\t\t\t\t\t\tcurrent={hValue}\n\t\t\t\t\t\t\tonChange={(v) => onChange(\"horizontal\", v)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<AlignmentToggle\n\t\t\t\t\t\t\toptions={VERTICAL_OPTIONS}\n\t\t\t\t\t\t\tcurrent={vValue}\n\t\t\t\t\t\t\tonChange={(v) => onChange(\"vertical\", v)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase \"fontStyle\": {\n\t\t\t\tconst fontSizeRaw = getVal(\"fontSize\");\n\t\t\t\tconst fontStyleValue: FontStyleEditorValue = {\n\t\t\t\t\tfontFamily: getVal(\"fontFamily\") as string | undefined,\n\t\t\t\t\tfontSize: isDimension<FontUnit>(fontSizeRaw)\n\t\t\t\t\t\t? fontSizeRaw\n\t\t\t\t\t\t: undefined,\n\t\t\t\t\tcolor: getVal(\"color\") as string | undefined,\n\t\t\t\t\tfontWeight: getVal(\"fontWeight\") as boolean | undefined,\n\t\t\t\t\titalic: getVal(\"italic\") as boolean | undefined,\n\t\t\t\t\tunderline: getVal(\"underline\") as boolean | undefined,\n\t\t\t\t\tlineThrough: getVal(\"lineThrough\") as boolean | undefined,\n\t\t\t\t};\n\t\t\t\treturn (\n\t\t\t\t\t<FontStyleEditor\n\t\t\t\t\t\tvalue={fontStyleValue}\n\t\t\t\t\t\tonChange={(v) => {\n\t\t\t\t\t\t\tif (onChangeBatch) {\n\t\t\t\t\t\t\t\tonChangeBatch(v as Record<string, Value>);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tfor (const [k, val] of Object.entries(v)) {\n\t\t\t\t\t\t\t\t\tonChange(k, val as Value);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase \"padding\": {\n\t\t\t\tconst rawTop = getVal(\"top\");\n\t\t\t\tconst rawRight = getVal(\"right\");\n\t\t\t\tconst rawBottom = getVal(\"bottom\");\n\t\t\t\tconst rawLeft = getVal(\"left\");\n\t\t\t\tconst rawBulk = getVal(\"bulk\");\n\t\t\t\tconst rawAll = getVal(\"all\");\n\t\t\t\tconst paddingValue: PaddingEditorValue = {\n\t\t\t\t\ttop: isDimension<PaddingUnit>(rawTop) ? rawTop : undefined,\n\t\t\t\t\tright: isDimension<PaddingUnit>(rawRight) ? rawRight : undefined,\n\t\t\t\t\tbottom: isDimension<PaddingUnit>(rawBottom) ? rawBottom : undefined,\n\t\t\t\t\tleft: isDimension<PaddingUnit>(rawLeft) ? rawLeft : undefined,\n\t\t\t\t\tbulk: typeof rawBulk === \"boolean\" ? rawBulk : false,\n\t\t\t\t\tall: isDimension<PaddingUnit>(rawAll) ? rawAll : undefined,\n\t\t\t\t};\n\t\t\t\treturn (\n\t\t\t\t\t<PaddingEditor\n\t\t\t\t\t\tvalue={paddingValue}\n\t\t\t\t\t\tonChange={(v) => {\n\t\t\t\t\t\t\tif (onChangeBatch) {\n\t\t\t\t\t\t\t\tonChangeBatch(v as Record<string, Value>);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tfor (const [k, val] of Object.entries(v)) {\n\t\t\t\t\t\t\t\t\tonChange(k, val as Value);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase \"required\": {\n\t\t\t\tconst required = getVal(\"required\") as boolean | undefined;\n\t\t\t\treturn (\n\t\t\t\t\t<Checkbox\n\t\t\t\t\t\tvalue={required ?? false}\n\t\t\t\t\t\tonChange={(v) => onChange(\"required\", v ?? false)}\n\t\t\t\t\t\tlabel=\"必須\"\n\t\t\t\t\t/>\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase \"placeholder\": {\n\t\t\t\tconst placeholder = getVal(\"placeholder\") as string | undefined;\n\t\t\t\treturn (\n\t\t\t\t\t<TextInput\n\t\t\t\t\t\tvalue={placeholder ?? \"\"}\n\t\t\t\t\t\tonChange={(v) => onChange(\"placeholder\", v ?? \"\")}\n\t\t\t\t\t/>\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase \"textValidation\": {\n\t\t\t\treturn (\n\t\t\t\t\t<TextValidationEditor\n\t\t\t\t\t\tinputType={getVal(\"inputType\") as string | undefined}\n\t\t\t\t\t\tminLength={\n\t\t\t\t\t\t\t(getVal(\"minLength\") as number | null | undefined) ?? undefined\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmaxLength={\n\t\t\t\t\t\t\t(getVal(\"maxLength\") as number | null | undefined) ?? undefined\n\t\t\t\t\t\t}\n\t\t\t\t\t\tpattern={\n\t\t\t\t\t\t\t(getVal(\"pattern\") as string | null | undefined) ?? undefined\n\t\t\t\t\t\t}\n\t\t\t\t\t\tonChange={onChange}\n\t\t\t\t\t\tonChangeBatch={onChangeBatch}\n\t\t\t\t\t/>\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase \"textBehavior\": {\n\t\t\t\treturn (\n\t\t\t\t\t<TextBehaviorEditor\n\t\t\t\t\t\tmultiline={getVal(\"multiline\") as boolean | undefined}\n\t\t\t\t\t\tlineHeight={\n\t\t\t\t\t\t\t(getVal(\"lineHeight\") as number | null | undefined) ?? undefined\n\t\t\t\t\t\t}\n\t\t\t\t\t\twordWrap={\n\t\t\t\t\t\t\tgetVal(\"wordWrap\") as\n\t\t\t\t\t\t\t\t| import(\"../../../../canvas/blocks/text/props\").WordWrap\n\t\t\t\t\t\t\t\t| undefined\n\t\t\t\t\t\t}\n\t\t\t\t\t\tonChange={onChange}\n\t\t\t\t\t/>\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase \"checkboxStyle\": {\n\t\t\t\tconst config = getVal(\"styleConfig\") as CheckboxStyleConfig | undefined;\n\t\t\t\treturn (\n\t\t\t\t\t<CheckboxStyleEditor\n\t\t\t\t\t\tvalue={config}\n\t\t\t\t\t\tonChange={(v) => onChange(\"styleConfig\", v as Value)}\n\t\t\t\t\t/>\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase \"selectConfig\": {\n\t\t\t\tconst rawCfg = getVal(\"selectConfig\");\n\t\t\t\tconst cfg = isSelectOptionsConfig(rawCfg) ? rawCfg : { options: [] };\n\t\t\t\treturn (\n\t\t\t\t\t<OptionsEditor\n\t\t\t\t\t\tvalue={cfg}\n\t\t\t\t\t\tonChange={(v) => onChange(\"selectConfig\", v as unknown as Value)}\n\t\t\t\t\t/>\n\t\t\t\t);\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\t// PropDef にカスタムコンポーネントが指定されている場合はそれを使用\n\t\t\t\tif (component) {\n\t\t\t\t\tconst CustomComponent = component;\n\t\t\t\t\tconst primaryKey = Object.keys(defaultProps)[0] ?? kind;\n\t\t\t\t\tconst rawVal = getVal(primaryKey);\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<CustomComponent\n\t\t\t\t\t\t\tvalue={rawVal}\n\t\t\t\t\t\t\tonChange={(v) => onChange(primaryKey, v)}\n\t\t\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t\t\t/>\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\t// 未知の kind: 最初のキーを TextInput で表示\n\t\t\t\tconst primaryKey = Object.keys(defaultProps)[0] ?? kind;\n\t\t\t\tconst rawVal = getVal(primaryKey);\n\t\t\t\tconst strVal =\n\t\t\t\t\trawVal === null || rawVal === undefined\n\t\t\t\t\t\t? \"\"\n\t\t\t\t\t\t: typeof rawVal === \"object\"\n\t\t\t\t\t\t\t? JSON.stringify(rawVal)\n\t\t\t\t\t\t\t: String(rawVal);\n\t\t\t\treturn (\n\t\t\t\t\t<TextInput\n\t\t\t\t\t\tvalue={strVal}\n\t\t\t\t\t\tonChange={(v) => onChange(primaryKey, v ?? \"\")}\n\t\t\t\t\t/>\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t},\n);\n\nPropDefEditor.displayName = \"PropDefEditor\";\n\n/**\n * `PropDef` の種類に応じたプロパティ編集フィールドを描画するコンポーネント。\n *\n * @remarks\n * `PluginPanels` から各ブロックのプロパティを編集するために使用される。\n */\nexport const PropertyField = memo(\n\t({\n\t\tpropDef,\n\t\tselectedBlocks,\n\t\tonChange,\n\t\tonChangeBatch,\n\t\treadOnly,\n\t\tblockDefaults,\n\t\tonResetToDefault,\n\t}: PropertyFieldProps) => {\n\t\tconst { kind, defaultProps } = propDef;\n\t\tconst primaryBlock = selectedBlocks[0];\n\t\tconst blockKind = primaryBlock?.kind ?? \"\";\n\n\t\t// 現在値: block.props[key] > blockDefaults[blockKind][key] > defaultProps[key]\n\t\tconst getVal = (key: string): Value => {\n\t\t\tconst v = getCommonValue(selectedBlocks, `props.${key}`);\n\t\t\treturn v !== undefined\n\t\t\t\t? v\n\t\t\t\t: (blockDefaults?.[blockKind]?.[key] ?? defaultProps[key] ?? null);\n\t\t};\n\n\t\t// 個別設定が有効かどうか: ANY のキーが block.props に存在する\n\t\tconst isOverridden =\n\t\t\tprimaryBlock !== undefined &&\n\t\t\tObject.keys(defaultProps).some((k) => k in (primaryBlock?.props ?? {}));\n\n\t\tconst handleOpenChange = useCallback(\n\t\t\t(open: boolean) => {\n\t\t\t\tif (open) {\n\t\t\t\t\t// 全デフォルト値を1回のバッチ更新で書き込む(複数onChangeコール時の上書き問題を回避)\n\t\t\t\t\tconst defaults: Record<string, Value> = {};\n\t\t\t\t\tfor (const [k, v] of Object.entries(defaultProps)) {\n\t\t\t\t\t\tdefaults[k] = blockDefaults?.[blockKind]?.[k] ?? v;\n\t\t\t\t\t}\n\t\t\t\t\tif (onChangeBatch) {\n\t\t\t\t\t\tonChangeBatch(defaults);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfor (const [k, v] of Object.entries(defaults)) {\n\t\t\t\t\t\t\tonChange(k, v);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tonResetToDefault?.(Object.keys(defaultProps));\n\t\t\t\t}\n\t\t\t},\n\t\t\t[\n\t\t\t\tonChange,\n\t\t\t\tonChangeBatch,\n\t\t\t\tonResetToDefault,\n\t\t\t\tdefaultProps,\n\t\t\t\tblockDefaults,\n\t\t\t\tblockKind,\n\t\t\t],\n\t\t);\n\n\t\treturn (\n\t\t\t<CollapsibleSection\n\t\t\t\ttitle={KIND_TITLES[kind] ?? kind}\n\t\t\t\tcollapsible={true}\n\t\t\t\tisOpen={isOverridden}\n\t\t\t\tonOpenChange={handleOpenChange}\n\t\t\t\topenLabel=\"カスタム\"\n\t\t\t\tcloseLabel=\"標準\"\n\t\t\t>\n\t\t\t\t<PropDefEditor\n\t\t\t\t\tkind={kind}\n\t\t\t\t\tdefaultProps={defaultProps}\n\t\t\t\t\tgetVal={getVal}\n\t\t\t\t\tonChange={onChange}\n\t\t\t\t\tonChangeBatch={onChangeBatch}\n\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t\tcomponent={propDef.component}\n\t\t\t\t/>\n\t\t\t</CollapsibleSection>\n\t\t);\n\t},\n);\n\nPropertyField.displayName = \"PropertyField\";\n","import { CollapsibleSection } from \"../../../ui\";\nimport { PropertyField } from \"./PropertyField\";\n\nimport type React from \"react\";\nimport type { PluginRegistry } from \"../../../../plugin\";\nimport type { Block, Value } from \"../../../../types\";\nimport type { BlockDefaults } from \"../../../../types/schema\";\n\n/**\n * `PluginPanels` コンポーネントへの props。\n */\nexport interface PluginPanelsProps {\n\t/** 選択中のブロックの配列 */\n\tselectedBlocks: Block[];\n\n\t/** プラグインレジストリ */\n\tpluginRegistry: PluginRegistry;\n\n\t/** ブロック更新時のコールバック */\n\tonUpdateBlocks: (updates: Record<string, Partial<Block>>) => void;\n\n\t/** ブロックデフォルト設定 */\n\tblockDefaults?: BlockDefaults;\n\n\t/** `true` のときグループヘッダーを表示(デフォルト: `true`) */\n\tshowGroupHeader?: boolean;\n}\n\n/**\n * 選択ブロックのプラグイン固有属性パネルを表示するコンポーネント。\n *\n * @remarks\n * **Shell** — プラグインの `propDefs` に従ってプロパティフィールドを動的に表示する。\n */\nexport const PluginPanels: React.FC<PluginPanelsProps> = ({\n\tselectedBlocks,\n\tpluginRegistry,\n\tonUpdateBlocks,\n\tblockDefaults,\n\tshowGroupHeader = true,\n}) => {\n\tconst primaryBlock = selectedBlocks[0];\n\tconst plugin = primaryBlock ? pluginRegistry[primaryBlock.kind] : undefined;\n\n\tif (!primaryBlock || !plugin || selectedBlocks.length === 0) return null;\n\n\tconst handleChange = (key: string, value: Value) => {\n\t\tconst blockUpdates: Record<string, Partial<Block>> = {};\n\t\tselectedBlocks.forEach((block) => {\n\t\t\tblockUpdates[block.id] = {\n\t\t\t\tprops: { ...block.props, [key]: value },\n\t\t\t};\n\t\t});\n\t\tonUpdateBlocks(blockUpdates);\n\t};\n\n\tconst handleChangeBatch = (updates: Record<string, Value>) => {\n\t\tconst blockUpdates: Record<string, Partial<Block>> = {};\n\t\tselectedBlocks.forEach((block) => {\n\t\t\tblockUpdates[block.id] = {\n\t\t\t\tprops: { ...block.props, ...updates },\n\t\t\t};\n\t\t});\n\t\tonUpdateBlocks(blockUpdates);\n\t};\n\n\tconst handleResetToDefault = (keys: string[]) => {\n\t\tconst blockUpdates: Record<string, Partial<Block>> = {};\n\t\tselectedBlocks.forEach((block) => {\n\t\t\tconst newProps = { ...block.props };\n\t\t\tfor (const key of keys) {\n\t\t\t\tdelete newProps[key];\n\t\t\t}\n\t\t\tblockUpdates[block.id] = { props: newProps };\n\t\t});\n\t\tonUpdateBlocks(blockUpdates);\n\t};\n\n\tconst fields = plugin.properties.map((propDef) => (\n\t\t<PropertyField\n\t\t\tkey={propDef.kind}\n\t\t\tpropDef={propDef}\n\t\t\tselectedBlocks={selectedBlocks}\n\t\t\tonChange={handleChange}\n\t\t\tonChangeBatch={handleChangeBatch}\n\t\t\tblockDefaults={blockDefaults}\n\t\t\tonResetToDefault={handleResetToDefault}\n\t\t/>\n\t));\n\n\tif (plugin.properties.length === 0) return null;\n\n\tif (showGroupHeader) {\n\t\treturn (\n\t\t\t<CollapsibleSection title={plugin.meta.displayName}>\n\t\t\t\t{fields}\n\t\t\t</CollapsibleSection>\n\t\t);\n\t}\n\n\treturn <div>{fields}</div>;\n};\n\nPluginPanels.displayName = \"PluginPanels\";\n","import { IconActionButton } from \"../../ui/IconActionButton\";\n\nimport type { ReactNode } from \"react\";\n\n/**\n * `SelectionActionBarButton` コンポーネントへの props。\n */\nexport interface SelectionActionBarButtonProps {\n\t/** ボタン内に表示するアイコン(SVG コンポーネントや絵文字など) */\n\ticon: ReactNode;\n\n\t/** aria-label / title に使用するラベル */\n\tlabel: string;\n\n\t/** クリック時のコールバック */\n\tonClick?: () => void;\n\n\t/** マウスオーバー時のコールバック */\n\tonMouseEnter?: () => void;\n\n\t/** ツールチップに表示するテキスト(省略時は `label` を使用) */\n\ttitle?: string;\n\n\t/** `true` のときボタンを無効化 */\n\tdisabled?: boolean;\n}\n\n/**\n * `SelectionActionBar` の個別ボタン。バー以外の UI からも単体で使用可能。\n *\n * @remarks\n * **Shell** — `SelectionActionBar` の各ボタン。\n */\nexport const SelectionActionBarButton = ({\n\ticon,\n\tlabel,\n\tonClick,\n\tonMouseEnter,\n\ttitle,\n\tdisabled,\n}: SelectionActionBarButtonProps): ReactNode => {\n\treturn (\n\t\t<IconActionButton\n\t\t\ticon={icon}\n\t\t\tlabel={label}\n\t\t\ttitle={title}\n\t\t\tonClick={onClick}\n\t\t\tonMouseEnter={onMouseEnter}\n\t\t\tdisabled={disabled}\n\t\t\tpreventFocusOnMouseDown\n\t\t/>\n\t);\n};\n\nSelectionActionBarButton.displayName = \"SelectionActionBarButton\";\n","import {\n\tcreateContext,\n\tuseCallback,\n\tuseContext,\n\tuseEffect,\n\tuseRef,\n\tuseState,\n} from \"react\";\n\nimport styles from \"./SelectionActionBar.module.css\";\n\nimport type React from \"react\";\nimport type { ReactNode } from \"react\";\n\n/**\n * `SelectionActionBar` コンテキストで共有される値。\n */\nexport interface SelectionActionBarContextValue {\n\t/** 現在開いているパネルの ID */\n\topenPanel: string | null;\n\n\t/** ホバーでパネルを開く */\n\topenPanelByHover: (panelId: string) => void;\n\n\t/** クリックでパネルを開く */\n\topenPanelByClick: (panelId: string) => void;\n\n\t/** バー外のイベント用 pointer-down ハンドラ */\n\tonPointerDown?: React.PointerEventHandler<HTMLDivElement>;\n\n\t/** ポータルベースのポップオーバー描画用ターゲット要素 */\n\twrapperEl: HTMLDivElement | null;\n}\n\n/**\n * `SelectionActionBar` コンポーネントツリー内で共有されるコンテキスト。\n */\nexport const SelectionActionBarContext =\n\tcreateContext<SelectionActionBarContextValue | null>(null);\n\n/**\n * `SelectionActionBar` コンテキスト値を取得するフック。\n *\n * @remarks\n * **Shell** — `SelectionActionBar` の子コンポーネント内でのみ使用可能。\n *\n * バー外で呼び出すと `Error` をスローする。\n */\nexport function useSelectionActionBar(): SelectionActionBarContextValue {\n\tconst ctx = useContext(SelectionActionBarContext);\n\tif (ctx === null) {\n\t\tthrow new Error(\n\t\t\t\"useSelectionActionBar must be used inside SelectionActionBar\",\n\t\t);\n\t}\n\treturn ctx;\n}\n\n/**\n * `SelectionActionBar` コンポーネントへの props。\n */\nexport interface SelectionActionBarProps {\n\t/**\n\t * バーに表示するアイテムの配列(SelectionActionBarButton / SelectionActionBarPanel など)。\n\t * デフォルト値は `getDefaultSelectionActionBarItems()` で取得できる。\n\t */\n\titems?: ReactNode[];\n\n\t/** バールート要素への追加 CSS クラス */\n\tclassName?: string;\n\n\t/** バールート要素へのインラインスタイル */\n\tstyle?: React.CSSProperties;\n\n\t/** コンテキストに渡す pointer-down ハンドラ */\n\tonPointerDown?: React.PointerEventHandler<HTMLDivElement>;\n}\n\n/**\n * フローティングボタンバー + ポップオーバーフレームワークのコンテナ。\n *\n * @remarks\n * **Shell** — `items` 配列でボタン・パネルを渡す。デフォルト構成は `getDefaultSelectionActionBarItems()` で取得できる。\n */\nexport const SelectionActionBar = ({\n\titems = [],\n\tclassName,\n\tstyle,\n\tonPointerDown,\n}: SelectionActionBarProps) => {\n\tconst [openPanel, setOpenPanel] = useState<string | null>(null);\n\tconst [wrapperEl, setWrapperEl] = useState<HTMLDivElement | null>(null);\n\tconst closeTimerRef = useRef<number | null>(null);\n\n\tconst clearCloseTimer = useCallback(() => {\n\t\tif (closeTimerRef.current !== null) {\n\t\t\twindow.clearTimeout(closeTimerRef.current);\n\t\t\tcloseTimerRef.current = null;\n\t\t}\n\t}, []);\n\n\tconst handleWrapperMouseEnter = useCallback(() => {\n\t\tclearCloseTimer();\n\t}, [clearCloseTimer]);\n\n\tconst handleWrapperMouseLeave = useCallback(() => {\n\t\tclearCloseTimer();\n\t\tcloseTimerRef.current = window.setTimeout(() => {\n\t\t\tsetOpenPanel(null);\n\t\t}, 120);\n\t}, [clearCloseTimer]);\n\n\t// ポップオーバー外クリック時にパネルを閉じる\n\tuseEffect(() => {\n\t\tif (openPanel === null) return;\n\t\tconst handleMouseDown = (e: MouseEvent) => {\n\t\t\tif (wrapperEl && !wrapperEl.contains(e.target as Node)) {\n\t\t\t\tsetOpenPanel(null);\n\t\t\t}\n\t\t};\n\t\tdocument.addEventListener(\"mousedown\", handleMouseDown);\n\t\treturn () => document.removeEventListener(\"mousedown\", handleMouseDown);\n\t}, [openPanel, wrapperEl]);\n\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\tclearCloseTimer();\n\t\t};\n\t}, [clearCloseTimer]);\n\n\tconst openPanelByHover = useCallback(\n\t\t(panelId: string) => {\n\t\t\tclearCloseTimer();\n\t\t\tsetOpenPanel(panelId);\n\t\t},\n\t\t[clearCloseTimer],\n\t);\n\n\tconst openPanelByClick = useCallback(\n\t\t(panelId: string) => {\n\t\t\tclearCloseTimer();\n\t\t\tsetOpenPanel(panelId);\n\t\t},\n\t\t[clearCloseTimer],\n\t);\n\n\treturn (\n\t\t<SelectionActionBarContext.Provider\n\t\t\tvalue={{\n\t\t\t\topenPanel,\n\t\t\t\topenPanelByHover,\n\t\t\t\topenPanelByClick,\n\t\t\t\tonPointerDown,\n\t\t\t\twrapperEl,\n\t\t\t}}\n\t\t>\n\t\t\t<div\n\t\t\t\tref={setWrapperEl}\n\t\t\t\tclassName={styles.barWrapper}\n\t\t\t\tstyle={style}\n\t\t\t\tonMouseEnter={handleWrapperMouseEnter}\n\t\t\t\tonMouseLeave={handleWrapperMouseLeave}\n\t\t\t\tonPointerDown={onPointerDown}\n\t\t\t\trole=\"toolbar\"\n\t\t\t\taria-label=\"Selection Action Bar\"\n\t\t\t\tdata-testid=\"selection-action-bar\"\n\t\t\t>\n\t\t\t\t<div\n\t\t\t\t\tclassName={`${styles.bar}${className ? ` ${className}` : \"\"}`}\n\t\t\t\t\tonPointerDown={onPointerDown}\n\t\t\t\t>\n\t\t\t\t\t{items}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</SelectionActionBarContext.Provider>\n\t);\n};\n\nSelectionActionBar.displayName = \"SelectionActionBar\";\n","import { createPortal } from \"react-dom\";\n\nimport { useSelectionActionBar } from \"./SelectionActionBar\";\nimport styles from \"./SelectionActionBar.module.css\";\nimport { SelectionActionBarButton } from \"./SelectionActionBarButton\";\n\nimport type { ReactNode } from \"react\";\n\n/**\n * `SelectionActionBarPanel` コンポーネントへの props。\n */\nexport interface SelectionActionBarPanelProps {\n\t/** このパネルを一意に識別する ID */\n\tid: string;\n\n\t/** トリガーボタンのアイコン(SVG コンポーネントや絵文字など) */\n\ticon: ReactNode;\n\n\t/** トリガーボタンのラベル(aria-label) */\n\tlabel: string;\n\n\t/** ポップオーバーのコンテンツ */\n\tchildren: ReactNode;\n}\n\n/**\n * `SelectionActionBar` 内でポップオーバーパネルを1件管理するコンポーネント。\n *\n * @remarks\n * **Shell** — トリガーボタンはバー内に描画し、ポップオーバーはラッパー要素にポータル描画される。\n */\nexport const SelectionActionBarPanel = ({\n\tid,\n\ticon,\n\tlabel,\n\tchildren,\n}: SelectionActionBarPanelProps) => {\n\tconst {\n\t\topenPanel,\n\t\topenPanelByHover,\n\t\topenPanelByClick,\n\t\tonPointerDown,\n\t\twrapperEl,\n\t} = useSelectionActionBar();\n\n\tconst isOpen = openPanel === id;\n\n\treturn (\n\t\t<>\n\t\t\t<SelectionActionBarButton\n\t\t\t\ticon={icon}\n\t\t\t\tlabel={label}\n\t\t\t\tonMouseEnter={() => openPanelByHover(id)}\n\t\t\t\tonClick={() => openPanelByClick(id)}\n\t\t\t/>\n\t\t\t{isOpen &&\n\t\t\t\twrapperEl &&\n\t\t\t\tcreatePortal(\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={styles.popover}\n\t\t\t\t\t\tdata-testid={`popover-${id}`}\n\t\t\t\t\t\tonPointerDown={onPointerDown}\n\t\t\t\t\t>\n\t\t\t\t\t\t{children}\n\t\t\t\t\t</div>,\n\t\t\t\t\twrapperEl,\n\t\t\t\t)}\n\t\t</>\n\t);\n};\n\nSelectionActionBarPanel.displayName = \"SelectionActionBarPanel\";\n","import {\n\tBlockSettingsIcon,\n\tCopyIcon,\n\tDuplicateIcon,\n\tLayoutIcon,\n\tPasteIcon,\n\tStyleIcon,\n\tTrashIcon,\n} from \"../../../components/icons\";\nimport { getActionFeedback } from \"../../actionFeedback\";\nimport { BackgroundBorderPanel } from \"../../panels/BlockPropertyPanel/BasePanels/BackgroundBorderPanel\";\nimport { LayoutPanel } from \"../../panels/BlockPropertyPanel/BasePanels/LayoutPanel\";\nimport { PluginPanels } from \"../../panels/BlockPropertyPanel/PluginPanels\";\nimport styles from \"./SelectionActionBar.module.css\";\nimport { SelectionActionBarButton } from \"./SelectionActionBarButton\";\nimport { SelectionActionBarPanel } from \"./SelectionActionBarPanel\";\n\nimport type { ReactNode } from \"react\";\nimport type { NoteContext } from \"../../../contexts/useNoteContext\";\nimport type { Block } from \"../../../types/block\";\nimport type { ActionFeedback } from \"../../actionFeedback\";\n\n/**\n * `GetDefaultSelectionActionBarItemsOptions` のオプション。\n *\n * @remarks\n * **Shell** — `getDefaultSelectionActionBarItems()` の引数型。\n */\nexport interface GetDefaultSelectionActionBarItemsOptions {\n\t/** NoteContext(`useNoteContext` が返すコンテキスト) */\n\tcontext: NoteContext;\n\n\t/** グリッドサイズ(レイアウトパネルに使用) */\n\tgridSize?: { cols: number; rows: number };\n\n\t/** アクション実行時のフィードバック(トースト表示など) */\n\tonActionFeedback?: (feedback: ActionFeedback) => void;\n}\n\n/**\n * `SelectionActionBar` に渡すデフォルト items 配列を返す。\n *\n * @remarks\n * **Shell** — 各要素には `key` が付いているため `filter` / `map` でプログラマブルに操作できる。\n *\n * @example\n * ```tsx\n * const items = getDefaultSelectionActionBarItems({ context });\n * // 削除ボタンを除外\n * <SelectionActionBar items={items.filter((i) => i.key !== \"delete\")} />\n * ```\n */\nexport function getDefaultSelectionActionBarItems({\n\tcontext,\n\tgridSize,\n\tonActionFeedback,\n}: GetDefaultSelectionActionBarItemsOptions): ReactNode[] {\n\tconst { actionContext, pluginRegistry } = context;\n\tconst editorState = context.editorState;\n\tconst selectedBlockIds = editorState.selectedBlockIds ?? [];\n\tconst hasCopied = actionContext.isEnabled(\"paste\");\n\tconst pageIdx = editorState.pageIdx;\n\tconst selectedBlocks = (context.book.pages[pageIdx]?.blocks ?? []).filter(\n\t\t(b) => selectedBlockIds.includes(b.id),\n\t);\n\n\tconst hasSelection = selectedBlockIds.length > 0;\n\tconst canPanel = selectedBlocks.length > 0;\n\tconst canPlugin = canPanel && Object.keys(pluginRegistry).length > 0;\n\tconst onUpdateBlocks = (\n\t\tupdates: Record<string, Partial<Block>>,\n\t\toptions?: { mergeKey?: string },\n\t) => actionContext.execute(\"updateBlocks\", { updates, options });\n\n\tconst runWithFeedback = (actionId: string, fn: () => void) => {\n\t\tfn();\n\t\tconst feedback = getActionFeedback(actionId);\n\t\tif (feedback) {\n\t\t\tonActionFeedback?.(feedback);\n\t\t}\n\t};\n\n\tconst items: ReactNode[] = [\n\t\t<SelectionActionBarButton\n\t\t\tkey=\"delete\"\n\t\t\ticon={<TrashIcon aria-hidden=\"true\" />}\n\t\t\tlabel=\"選択を削除\"\n\t\t\ttitle=\"削除 (Delete / Backspace)\"\n\t\t\tonClick={() =>\n\t\t\t\trunWithFeedback(\"delete\", () => actionContext.execute(\"delete\"))\n\t\t\t}\n\t\t\tdisabled={!hasSelection}\n\t\t/>,\n\t\t<SelectionActionBarButton\n\t\t\tkey=\"copy\"\n\t\t\ticon={<CopyIcon aria-hidden=\"true\" />}\n\t\t\tlabel=\"選択をコピー\"\n\t\t\ttitle=\"コピー (Ctrl+C / Cmd+C)\"\n\t\t\tonClick={() =>\n\t\t\t\trunWithFeedback(\"copy\", () => actionContext.execute(\"copy\"))\n\t\t\t}\n\t\t\tdisabled={!hasSelection}\n\t\t/>,\n\t\t<SelectionActionBarButton\n\t\t\tkey=\"duplicate\"\n\t\t\ticon={<DuplicateIcon aria-hidden=\"true\" />}\n\t\t\tlabel=\"選択を複製\"\n\t\t\ttitle=\"複製 (Ctrl+D / Cmd+D)\"\n\t\t\tonClick={() =>\n\t\t\t\trunWithFeedback(\"duplicate\", () => actionContext.execute(\"duplicate\"))\n\t\t\t}\n\t\t\tdisabled={!hasSelection}\n\t\t/>,\n\t\t<div key=\"divider-paste\" className={styles.divider} aria-hidden=\"true\" />,\n\t\t<SelectionActionBarButton\n\t\t\tkey=\"paste\"\n\t\t\ticon={<PasteIcon aria-hidden=\"true\" />}\n\t\t\tlabel=\"貼り付け\"\n\t\t\ttitle=\"貼り付け (Ctrl+V / Cmd+V)\"\n\t\t\tonClick={() =>\n\t\t\t\trunWithFeedback(\"paste\", () => actionContext.execute(\"paste\"))\n\t\t\t}\n\t\t\tdisabled={!hasCopied}\n\t\t/>,\n\t];\n\n\tif (canPanel || canPlugin) {\n\t\titems.push(\n\t\t\t<div\n\t\t\t\tkey=\"divider-panels\"\n\t\t\t\tclassName={styles.divider}\n\t\t\t\taria-hidden=\"true\"\n\t\t\t/>,\n\t\t);\n\t}\n\n\tif (canPanel) {\n\t\titems.push(\n\t\t\t<SelectionActionBarPanel\n\t\t\t\tkey=\"style\"\n\t\t\t\tid=\"style\"\n\t\t\t\ticon={<StyleIcon aria-hidden=\"true\" />}\n\t\t\t\tlabel=\"スタイル設定\"\n\t\t\t>\n\t\t\t\t<BackgroundBorderPanel\n\t\t\t\t\tselectedBlocks={selectedBlocks}\n\t\t\t\t\tonUpdateBlocks={onUpdateBlocks}\n\t\t\t\t/>\n\t\t\t</SelectionActionBarPanel>,\n\t\t\t<SelectionActionBarPanel\n\t\t\t\tkey=\"layout\"\n\t\t\t\tid=\"layout\"\n\t\t\t\ticon={<LayoutIcon aria-hidden=\"true\" />}\n\t\t\t\tlabel=\"レイアウト設定\"\n\t\t\t>\n\t\t\t\t<LayoutPanel\n\t\t\t\t\tselectedBlocks={selectedBlocks}\n\t\t\t\t\tonUpdateBlocks={onUpdateBlocks}\n\t\t\t\t\tgridSize={gridSize}\n\t\t\t\t/>\n\t\t\t</SelectionActionBarPanel>,\n\t\t);\n\t}\n\n\tif (canPlugin) {\n\t\titems.push(\n\t\t\t<SelectionActionBarPanel\n\t\t\t\tkey=\"plugin\"\n\t\t\t\tid=\"plugin\"\n\t\t\t\ticon={<BlockSettingsIcon aria-hidden=\"true\" />}\n\t\t\t\tlabel=\"ブロック設定\"\n\t\t\t>\n\t\t\t\t<PluginPanels\n\t\t\t\t\tselectedBlocks={selectedBlocks}\n\t\t\t\t\tpluginRegistry={pluginRegistry}\n\t\t\t\t\tonUpdateBlocks={onUpdateBlocks}\n\t\t\t\t\tshowGroupHeader={false}\n\t\t\t\t/>\n\t\t\t</SelectionActionBarPanel>,\n\t\t);\n\t}\n\n\treturn items;\n}\n","import { Z_INDEX } from \"../../../utils/zIndex\";\n\nimport type { ReactNode } from \"react\";\nimport type { SelectionBoundingBox } from \"./useSelectionBoundingBox\";\n\n// バーとブロック選択領域の間の余白 (px)\nconst BAR_MARGIN = 8;\n// バーの想定高さ (px)。上端配置の位置計算に使用\nconst BAR_HEIGHT = 36;\n\n/**\n * `SelectionActionBarOverlay` コンポーネントへの props。\n */\nexport interface SelectionActionBarOverlayProps {\n\t/**\n\t * 選択ブロック群の bounding box(px座標)。\n\t *\n\t * `useSelectionBoundingBox` で算出して渡す。`null` の場合は非表示。\n\t */\n\tselectionBoundingBox?: SelectionBoundingBox | null;\n\n\t/** ドラッグ中のとき `true` を渡すと非表示になる */\n\tisDragging?: boolean;\n\n\t/** z-index(デフォルト: `Z_INDEX.SELECTION_ACTION_BAR`) */\n\tzIndex?: number;\n\n\t/** オーバーレイ内に描画するコンテンツ */\n\tchildren?: ReactNode;\n}\n\n/**\n * `selectionBoundingBox` の右上コーナーの右上に `children` を浮かせるコンテナ。\n *\n * @remarks\n * **Shell** — `isDragging=true` または `selectionBoundingBox` が `null` の場合は何も描画しない。\n *\n * 配置ルール: 水平はバーの右端を `bbox.right` に揃える。垂直はブロック上に表示し上端がキャンバス外の場合はブロック下に反転。\n */\nexport const SelectionActionBarOverlay = ({\n\tselectionBoundingBox,\n\tisDragging,\n\tzIndex = Z_INDEX.SELECTION_ACTION_BAR,\n\tchildren,\n}: SelectionActionBarOverlayProps) => {\n\tif (selectionBoundingBox == null || isDragging) {\n\t\treturn null;\n\t}\n\n\tconst bbox = selectionBoundingBox;\n\n\t// 上に配置。上端がキャンバス外(< 0)になる場合はブロック下に反転\n\tconst barTopAbove = bbox.top - BAR_MARGIN - BAR_HEIGHT;\n\tconst barTop = barTopAbove >= 0 ? barTopAbove : bbox.bottom + BAR_MARGIN;\n\n\tconst overlayStyle: React.CSSProperties = {\n\t\tposition: \"absolute\",\n\t\tinset: 0,\n\t\tpointerEvents: \"none\",\n\t\tzIndex,\n\t};\n\n\tconst barStyle: React.CSSProperties = {\n\t\tposition: \"absolute\",\n\t\ttop: `${barTop}px`,\n\t\t// バーの右端を bbox.right に揃える。translateX(-100%) でバー幅分だけ左にずらす\n\t\tleft: `${bbox.right}px`,\n\t\ttransform: \"translateX(-100%)\",\n\t\tpointerEvents: \"auto\",\n\t};\n\n\treturn (\n\t\t<div\n\t\t\tstyle={overlayStyle}\n\t\t\tdata-testid=\"selection-action-bar-overlay\"\n\t\t\tdata-selection-action-bar=\"true\"\n\t\t>\n\t\t\t<div\n\t\t\t\tstyle={barStyle}\n\t\t\t\tonPointerDown={(e) => e.stopPropagation()}\n\t\t\t\tdata-testid=\"selection-action-bar-container\"\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import { type RefObject, useEffect, useState } from \"react\";\n\nimport type { SelectionBoundingBox } from \"./useSelectionBoundingBox\";\n\n/**\n * 選択中ブロックの bounding box をコンテナ相対 px 座標で返すフック。\n *\n * @remarks\n * **Shell** — `position: relative` なコンテナ内に `<Note>` と `<DefaultSelectionActionBarOverlay>` を並べる構成で使用する。\n *\n * 「いつ再計測するか」は呼び出し側の責任。ブロックの座標変化時にも再計測したい場合は、\n * `selectedBlockIds` に新しい配列参照を渡すこと。\n *\n * @example\n * ```tsx\n * const containerRef = useRef<HTMLDivElement>(null);\n * const selectionBoundingBox = useSelectionBounds(containerRef, selectedBlockIds);\n * ```\n *\n * @param containerRef - Note を包む `position: relative` なコンテナの ref\n * @param selectedBlockIds - 選択中のブロック ID 一覧(再計測が必要なときは新しい配列参照を渡すこと)\n * @returns 選択範囲の bounding box。選択なし・要素未発見時は null\n */\nexport function useSelectionBounds(\n\tcontainerRef: RefObject<HTMLElement | null>,\n\tselectedBlockIds: string[],\n): SelectionBoundingBox | null {\n\tconst [bounds, setBounds] = useState<SelectionBoundingBox | null>(null);\n\n\tuseEffect(() => {\n\t\tif (selectedBlockIds.length === 0) {\n\t\t\tsetBounds(null);\n\t\t\treturn;\n\t\t}\n\n\t\t// React レンダリング後に DOM 計測するため requestAnimationFrame を使用\n\t\tconst rafId = requestAnimationFrame(() => {\n\t\t\tconst container = containerRef.current;\n\t\t\tif (!container) {\n\t\t\t\tsetBounds(null);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst containerRect = container.getBoundingClientRect();\n\t\t\tlet minLeft = Infinity;\n\t\t\tlet minTop = Infinity;\n\t\t\tlet maxRight = -Infinity;\n\t\t\tlet maxBottom = -Infinity;\n\t\t\tlet found = false;\n\n\t\t\tfor (const id of selectedBlockIds) {\n\t\t\t\tconst el = container.querySelector(`[data-block-id=\"${id}\"]`);\n\t\t\t\tif (!el) continue;\n\t\t\t\tconst rect = el.getBoundingClientRect();\n\t\t\t\tminLeft = Math.min(minLeft, rect.left - containerRect.left);\n\t\t\t\tminTop = Math.min(minTop, rect.top - containerRect.top);\n\t\t\t\tmaxRight = Math.max(maxRight, rect.right - containerRect.left);\n\t\t\t\tmaxBottom = Math.max(maxBottom, rect.bottom - containerRect.top);\n\t\t\t\tfound = true;\n\t\t\t}\n\n\t\t\tif (!found) {\n\t\t\t\tsetBounds(null);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsetBounds({\n\t\t\t\tleft: minLeft,\n\t\t\t\ttop: minTop,\n\t\t\t\tright: maxRight,\n\t\t\t\tbottom: maxBottom,\n\t\t\t\twidth: maxRight - minLeft,\n\t\t\t\theight: maxBottom - minTop,\n\t\t\t});\n\t\t});\n\n\t\treturn () => cancelAnimationFrame(rafId);\n\t}, [containerRef, selectedBlockIds]);\n\n\treturn bounds;\n}\n","import { useEffect, useState } from \"react\";\n\nimport { Checkbox, TextInput } from \"../../../../ui\";\nimport { getCommonValue } from \"../../../utils/getCommonValue\";\nimport styles from \"./MetaPanel.module.css\";\n\nimport type React from \"react\";\nimport type { Block } from \"../../../../../types/block\";\n\n/**\n * `MetaPanel` コンポーネントへの props。\n */\nexport interface MetaPanelProps {\n\t/** 選択中のブロックの配列 */\n\tselectedBlocks: Block[];\n\n\t/** ブロック更新時のコールバック */\n\tonUpdateBlocks: (updates: Record<string, Partial<Block>>) => void;\n\n\t/** 全ブロックの ID セット(重複チェックに使用) */\n\tallBlockIds?: Set<string>;\n}\n\nfunction validateBlockId(\n\tvalue: string,\n\tcurrentId: string,\n\tallBlockIds?: Set<string>,\n): string | null {\n\tconst trimmed = value.trim();\n\tif (!trimmed) return \"IDを入力してください\";\n\tif (/\\s/.test(trimmed)) return \"スペースは使用できません\";\n\tif (trimmed !== currentId && allBlockIds?.has(trimmed))\n\t\treturn \"このIDは既に使用されています\";\n\treturn null;\n}\n\n/**\n * ブロックの ID と非表示設定を編集するパネル。\n *\n * @remarks\n * **Shell** — ID の重複チェックおよびバリデーションを含む。\n */\nexport const MetaPanel: React.FC<MetaPanelProps> = ({\n\tselectedBlocks,\n\tonUpdateBlocks,\n\tallBlockIds,\n}) => {\n\tconst [localId, setLocalId] = useState(\"\");\n\tconst [idError, setIdError] = useState<string | null>(null);\n\n\tconst primaryBlock = selectedBlocks[0];\n\n\tuseEffect(() => {\n\t\tif (selectedBlocks.length === 1 && primaryBlock) {\n\t\t\tsetLocalId(primaryBlock.id);\n\t\t\tsetIdError(null);\n\t\t}\n\t}, [selectedBlocks, primaryBlock]);\n\n\tconst handleIdBlur = () => {\n\t\tif (!primaryBlock) return;\n\t\tconst currentId = primaryBlock.id;\n\t\tconst newId = localId.trim();\n\t\tif (newId === currentId || !newId) {\n\t\t\tsetLocalId(currentId);\n\t\t\tsetIdError(null);\n\t\t\treturn;\n\t\t}\n\t\tconst error = validateBlockId(newId, currentId, allBlockIds);\n\t\tif (error) {\n\t\t\tsetLocalId(currentId);\n\t\t\tsetIdError(null);\n\t\t\treturn;\n\t\t}\n\t\tonUpdateBlocks({ [currentId]: { id: newId } });\n\t};\n\n\tconst handleIdChange = (val: string | undefined) => {\n\t\tconst newVal = val ?? \"\";\n\t\tsetLocalId(newVal);\n\t\tif (primaryBlock) {\n\t\t\tsetIdError(validateBlockId(newVal, primaryBlock.id, allBlockIds));\n\t\t}\n\t};\n\n\tconst handleReadOnlyChange = (val: boolean | undefined) => {\n\t\tconst updates: Record<string, Partial<Block>> = {};\n\t\tselectedBlocks.forEach((b) => {\n\t\t\tupdates[b.id] = {\n\t\t\t\tbehavior: { ...b.behavior, readOnly: !!val || undefined },\n\t\t\t};\n\t\t});\n\t\tonUpdateBlocks(updates);\n\t};\n\n\tconst handleHeightFitChange = (val: boolean | undefined) => {\n\t\tconst updates: Record<string, Partial<Block>> = {};\n\t\tselectedBlocks.forEach((b) => {\n\t\t\tupdates[b.id] = {\n\t\t\t\tbehavior: { ...b.behavior, heightFit: val || undefined },\n\t\t\t};\n\t\t});\n\t\tonUpdateBlocks(updates);\n\t};\n\n\tconst handleWidthFitChange = (val: boolean | undefined) => {\n\t\tconst updates: Record<string, Partial<Block>> = {};\n\t\tselectedBlocks.forEach((b) => {\n\t\t\tupdates[b.id] = {\n\t\t\t\tbehavior: { ...b.behavior, widthFit: val || undefined },\n\t\t\t};\n\t\t});\n\t\tonUpdateBlocks(updates);\n\t};\n\n\treturn (\n\t\t<div className={styles.container}>\n\t\t\t{selectedBlocks.length === 1 && (\n\t\t\t\t<div className={styles.row}>\n\t\t\t\t\t<span className={styles.label}>ID</span>\n\t\t\t\t\t<div className={styles.inputWrapper}>\n\t\t\t\t\t\t<TextInput\n\t\t\t\t\t\t\tvalue={localId}\n\t\t\t\t\t\t\tonChange={handleIdChange}\n\t\t\t\t\t\t\tonBlur={handleIdBlur}\n\t\t\t\t\t\t\tplaceholder=\"IDを入力\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t{idError && <span className={styles.error}>{idError}</span>}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t{selectedBlocks.length > 0 && (\n\t\t\t\t<div className={styles.row}>\n\t\t\t\t\t<div className={styles.inputWrapper}>\n\t\t\t\t\t\t<Checkbox\n\t\t\t\t\t\t\tlabel=\"読み取り専用\"\n\t\t\t\t\t\t\tvalue={!!getCommonValue(selectedBlocks, \"behavior.readOnly\")}\n\t\t\t\t\t\t\tonChange={handleReadOnlyChange}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t{selectedBlocks.length > 0 && (\n\t\t\t\t<div className={styles.row}>\n\t\t\t\t\t<div className={styles.inputWrapper}>\n\t\t\t\t\t\t<Checkbox\n\t\t\t\t\t\t\tlabel=\"高さ自動フィット\"\n\t\t\t\t\t\t\tvalue={!!getCommonValue(selectedBlocks, \"behavior.heightFit\")}\n\t\t\t\t\t\t\tonChange={handleHeightFitChange}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t{selectedBlocks.length > 0 && (\n\t\t\t\t<div className={styles.row}>\n\t\t\t\t\t<div className={styles.inputWrapper}>\n\t\t\t\t\t\t<Checkbox\n\t\t\t\t\t\t\tlabel=\"幅自動フィット\"\n\t\t\t\t\t\t\tvalue={!!getCommonValue(selectedBlocks, \"behavior.widthFit\")}\n\t\t\t\t\t\t\tonChange={handleWidthFitChange}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n};\n\nMetaPanel.displayName = \"MetaPanel\";\n","import styles from \"./BlockPropertyPanel.module.css\";\n\nimport type { ReactNode } from \"react\";\n\n/**\n * `BlockPropertyPanel` コンポーネントへの props。\n */\nexport interface BlockPropertyPanelProps {\n\t/** パネルのコンテンツ */\n\tchildren?: ReactNode;\n\n\t/** カスタムクラス名 */\n\tclassName?: string;\n}\n\n/**\n * ブロックプロパティパネルの純粹なコンテナ。レイアウトシェルのみを提供する。\n *\n * @remarks\n * **Shell** — ビジネスロジックを含む実装は `DefaultBlockPropertyPanel` を使用してください。\n */\nexport const BlockPropertyPanel = ({\n\tchildren,\n\tclassName = \"\",\n}: BlockPropertyPanelProps) => (\n\t<div className={`${styles.container}${className ? ` ${className}` : \"\"}`}>\n\t\t{children}\n\t</div>\n);\n\nBlockPropertyPanel.displayName = \"BlockPropertyPanel\";\n","import { memo, useMemo } from \"react\";\n\nimport { CollapsibleSection } from \"../../ui\";\nimport { BackgroundBorderPanel, LayoutPanel, MetaPanel } from \"./BasePanels\";\nimport { BlockPropertyPanel } from \"./BlockPropertyPanel\";\nimport styles from \"./BlockPropertyPanel.module.css\";\nimport { PluginPanels } from \"./PluginPanels\";\n\nimport type { NoteContext } from \"../../../contexts/useNoteContext\";\nimport type { Block } from \"../../../types/block\";\n\n/**\n * `DefaultBlockPropertyPanel` コンポーネントへの props。\n */\nexport interface DefaultBlockPropertyPanelProps {\n\t/** NoteContext(`useNoteContext` が返すコンテキスト) */\n\tcontext: NoteContext;\n\n\t/** グリッドサイズ(レイアウトパネルに渡す) */\n\tgridSize?: { cols: number; rows: number };\n\n\t/** カスタムクラス名 */\n\tclassName?: string;\n}\n\n/**\n * 選択ブロックのプロパティを編集するコンポーネントのデフォルト実装。\n *\n * @remarks\n * **Shell** — レイアウト・背景・枠線・メタ情報・プラグインプロパティパネルを内包する。\n */\nexport const DefaultBlockPropertyPanel = memo(\n\t({ context, gridSize, className = \"\" }: DefaultBlockPropertyPanelProps) => {\n\t\tconst { pluginRegistry, actionContext } = context;\n\t\tconst pageIdx = context.editorState.pageIdx;\n\t\tconst page = context.book.pages[pageIdx];\n\t\tconst selectedBlockIds = context.editorState.selectedBlockIds ?? [];\n\t\tconst selectedBlocks =\n\t\t\tpage?.blocks.filter((b) => selectedBlockIds.includes(b.id)) ?? [];\n\t\tconst blockDefaults = page?.blockDefaults;\n\t\tconst onUpdateBlocks = (\n\t\t\tupdates: Record<string, Partial<Block>>,\n\t\t\toptions?: { mergeKey?: string },\n\t\t) => actionContext.execute(\"updateBlocks\", { updates, options });\n\t\tconst allBlockIds = new Set(page?.blocks.map((b) => b.id) ?? []);\n\t\tconst primaryBlock = selectedBlocks[0];\n\t\tconst plugin = primaryBlock ? pluginRegistry[primaryBlock.kind] : undefined;\n\n\t\tconst allSameKind = useMemo(() => {\n\t\t\tif (selectedBlocks.length === 0) return false;\n\t\t\tconst firstKind = selectedBlocks[0]?.kind;\n\t\t\treturn selectedBlocks.every((block) => block.kind === firstKind);\n\t\t}, [selectedBlocks]);\n\n\t\tif (selectedBlocks.length === 0) {\n\t\t\treturn (\n\t\t\t\t<BlockPropertyPanel className={className}>\n\t\t\t\t\t<div className={styles.emptyState}>\n\t\t\t\t\t\tブロックを選択すると\n\t\t\t\t\t\t<br />\n\t\t\t\t\t\tプロパティが表示されます\n\t\t\t\t\t</div>\n\t\t\t\t</BlockPropertyPanel>\n\t\t\t);\n\t\t}\n\n\t\treturn (\n\t\t\t<BlockPropertyPanel className={className}>\n\t\t\t\t<div className={styles.scrollArea}>\n\t\t\t\t\t<CollapsibleSection\n\t\t\t\t\t\ttitle=\"配置・サイズ\"\n\t\t\t\t\t\tdescription=\"ブロックの位置(X・Y座標)と大きさ(幅・高さ)をグリッド単位で設定します\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<LayoutPanel\n\t\t\t\t\t\t\tselectedBlocks={selectedBlocks}\n\t\t\t\t\t\t\tonUpdateBlocks={onUpdateBlocks}\n\t\t\t\t\t\t\tgridSize={gridSize}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</CollapsibleSection>\n\n\t\t\t\t\t<CollapsibleSection\n\t\t\t\t\t\ttitle=\"背景・枠線\"\n\t\t\t\t\t\tdescription=\"ブロックの背景色と枠線(線の種類・色・太さ)を設定します\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<BackgroundBorderPanel\n\t\t\t\t\t\t\tselectedBlocks={selectedBlocks}\n\t\t\t\t\t\t\tonUpdateBlocks={onUpdateBlocks}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</CollapsibleSection>\n\n\t\t\t\t\t{plugin && allSameKind && plugin.properties.length > 0 && (\n\t\t\t\t\t\t<PluginPanels\n\t\t\t\t\t\t\tselectedBlocks={selectedBlocks}\n\t\t\t\t\t\t\tpluginRegistry={pluginRegistry}\n\t\t\t\t\t\t\tonUpdateBlocks={onUpdateBlocks}\n\t\t\t\t\t\t\tblockDefaults={blockDefaults}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\n\t\t\t\t\t<CollapsibleSection\n\t\t\t\t\t\ttitle=\"基本設定\"\n\t\t\t\t\t\tdescription=\"ブロックのID(識別子)や読み取り専用にするかどうかなど、動作に関わる設定をします\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<MetaPanel\n\t\t\t\t\t\t\tselectedBlocks={selectedBlocks}\n\t\t\t\t\t\t\tonUpdateBlocks={onUpdateBlocks}\n\t\t\t\t\t\t\tallBlockIds={allBlockIds}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</CollapsibleSection>\n\t\t\t\t</div>\n\t\t\t</BlockPropertyPanel>\n\t\t);\n\t},\n);\n\nDefaultBlockPropertyPanel.displayName = \"DefaultBlockPropertyPanel\";\n","import { memo, useCallback, useState } from \"react\";\n\nimport { CollapsibleSection } from \"../../../ui\";\nimport {\n\tKIND_TITLES,\n\tPropDefEditor,\n} from \"../../BlockPropertyPanel/PluginPanels/PropertyField\";\nimport styles from \"./BlockDefaultsPanel.module.css\";\n\nimport type { PluginRegistry, PropDef } from \"../../../../plugin\";\nimport type { Value } from \"../../../../types\";\nimport type { BlockDefaults } from \"../../../../types/schema\";\n\n/**\n * `BlockDefaultsPanel` コンポーネントへの props。\n */\nexport interface BlockDefaultsPanelProps {\n\t/** 現在のブロックデフォルト設定 */\n\tblockDefaults: BlockDefaults;\n\n\t/** プラグインレジストリ(全プラグイン情報) */\n\tpluginRegistry: PluginRegistry;\n\n\t/** デフォルト値変更時のコールバック */\n\tonChange: (newBlockDefaults: BlockDefaults) => void;\n}\n\n// 1つの PropDef に対応するデフォルト値編集行(内部コンポーネント)\nconst DefaultsPropField = memo(\n\t({\n\t\tpropDef,\n\t\tkindDefaults,\n\t\tonKindDefaultsChange,\n\t}: {\n\t\tpropDef: PropDef;\n\t\tkindDefaults: Record<string, Value>;\n\t\tonKindDefaultsChange: (newKindDefaults: Record<string, Value>) => void;\n\t}) => {\n\t\tconst { kind, defaultProps } = propDef;\n\n\t\t// 一つでもキーが kindDefaults に存在すれば「カスタム」状態\n\t\tconst isOpen = Object.keys(defaultProps).some((k) => k in kindDefaults);\n\n\t\tconst getVal = (key: string): Value =>\n\t\t\tkindDefaults[key] ?? defaultProps[key] ?? null;\n\n\t\tconst handleChange = (key: string, value: Value) =>\n\t\t\tonKindDefaultsChange({ ...kindDefaults, [key]: value });\n\n\t\tconst handleOpenChange = (open: boolean) => {\n\t\t\tif (open) {\n\t\t\t\t// 全キーを一括書き込み(既存カスタム値を優先)\n\t\t\t\tconst merged = { ...kindDefaults };\n\t\t\t\tfor (const [k, v] of Object.entries(defaultProps)) {\n\t\t\t\t\tmerged[k] = kindDefaults[k] ?? v;\n\t\t\t\t}\n\t\t\t\tonKindDefaultsChange(merged);\n\t\t\t} else {\n\t\t\t\t// 全キーを一括削除\n\t\t\t\tconst pruned = { ...kindDefaults };\n\t\t\t\tfor (const k of Object.keys(defaultProps)) {\n\t\t\t\t\tdelete pruned[k];\n\t\t\t\t}\n\t\t\t\tonKindDefaultsChange(pruned);\n\t\t\t}\n\t\t};\n\n\t\treturn (\n\t\t\t<CollapsibleSection\n\t\t\t\ttitle={KIND_TITLES[kind] ?? kind}\n\t\t\t\tcollapsible={true}\n\t\t\t\tisOpen={isOpen}\n\t\t\t\tonOpenChange={handleOpenChange}\n\t\t\t\topenLabel=\"カスタム\"\n\t\t\t\tcloseLabel=\"標準\"\n\t\t\t>\n\t\t\t\t<PropDefEditor\n\t\t\t\t\tkind={kind}\n\t\t\t\t\tdefaultProps={defaultProps}\n\t\t\t\t\tgetVal={getVal}\n\t\t\t\t\tonChange={handleChange}\n\t\t\t\t/>\n\t\t\t</CollapsibleSection>\n\t\t);\n\t},\n);\n\nDefaultsPropField.displayName = \"DefaultsPropField\";\n\n/**\n * ブロック種類ごとのデフォルトプロパティ設定パネル。\n *\n * @remarks\n * **Shell** — `DefaultCanvasPanel` 内で使用される。\n */\nexport const BlockDefaultsPanel = memo(\n\t({ blockDefaults, pluginRegistry, onChange }: BlockDefaultsPanelProps) => {\n\t\tconst pluginKinds = Object.keys(pluginRegistry);\n\n\t\t// 選択中のプラグイン種類\n\t\tconst [selectedKind, setSelectedKind] = useState<string>(\n\t\t\tpluginKinds[0] ?? \"\",\n\t\t);\n\n\t\tconst plugin = selectedKind ? pluginRegistry[selectedKind] : undefined;\n\n\t\tconst handleKindDefaultsChange = useCallback(\n\t\t\t(newKindDefaults: Record<string, Value>) => {\n\t\t\t\tconst newBlockDefaults = { ...blockDefaults };\n\t\t\t\tif (Object.keys(newKindDefaults).length === 0) {\n\t\t\t\t\tdelete newBlockDefaults[selectedKind];\n\t\t\t\t} else {\n\t\t\t\t\tnewBlockDefaults[selectedKind] = newKindDefaults;\n\t\t\t\t}\n\t\t\t\tonChange(newBlockDefaults);\n\t\t\t},\n\t\t\t[blockDefaults, selectedKind, onChange],\n\t\t);\n\n\t\tif (pluginKinds.length === 0) {\n\t\t\treturn (\n\t\t\t\t<div className={styles.emptyState}>プラグインが登録されていません</div>\n\t\t\t);\n\t\t}\n\n\t\treturn (\n\t\t\t<CollapsibleSection\n\t\t\t\ttitle=\"ブロック共通デフォルト\"\n\t\t\t\tcollapsible\n\t\t\t\tnoPadding\n\t\t\t\tdescription=\"各ブロック種類に共通して適用されるデフォルト値です\"\n\t\t\t>\n\t\t\t\t{/* プラグイン種類の選択タブ */}\n\t\t\t\t<div className={styles.kindSelector}>\n\t\t\t\t\t{pluginKinds.map((kind) => {\n\t\t\t\t\t\tconst p = pluginRegistry[kind];\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tkey={kind}\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclassName={`${styles.kindTab} ${selectedKind === kind ? styles.kindTabActive : \"\"}`}\n\t\t\t\t\t\t\t\tonClick={() => setSelectedKind(kind)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{p?.meta.displayName ?? kind}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t);\n\t\t\t\t\t})}\n\t\t\t\t</div>\n\n\t\t\t\t{/* 選択中プラグインの PropDef 一覧 */}\n\t\t\t\t{plugin && (\n\t\t\t\t\t<div className={styles.propertyList}>\n\t\t\t\t\t\t{plugin.properties.length === 0 ? (\n\t\t\t\t\t\t\t<div className={styles.emptyState}>\n\t\t\t\t\t\t\t\tカスタマイズ可能なプロパティがありません\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\tplugin.properties.map((propDef: PropDef) => (\n\t\t\t\t\t\t\t\t<DefaultsPropField\n\t\t\t\t\t\t\t\t\tkey={propDef.kind}\n\t\t\t\t\t\t\t\t\tpropDef={propDef}\n\t\t\t\t\t\t\t\t\tkindDefaults={\n\t\t\t\t\t\t\t\t\t\t(blockDefaults[selectedKind] ?? {}) as Record<string, Value>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tonKindDefaultsChange={handleKindDefaultsChange}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t))\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</CollapsibleSection>\n\t\t);\n\t},\n);\n\nBlockDefaultsPanel.displayName = \"BlockDefaultsPanel\";\n","import { useCallback, useMemo, useRef, useState } from \"react\";\n\nimport { CollapsibleSection } from \"../../../ui\";\nimport styles from \"./BlockOrderPanel.module.css\";\n\nimport type { Block } from \"../../../../types/block\";\n\n/**\n * `BlockOrderPanel` コンポーネントへの props。\n */\nexport interface BlockOrderPanelProps {\n\t/** ブロック一覧 */\n\tblocks: Block[];\n\n\t/** ブロック更新時のコールバック (blocks 配列全体を更新) */\n\tonBlocksChange: (blocks: Block[]) => void;\n\n\t/** 選択中のブロック ID 一覧 */\n\tselectedBlockIds?: string[];\n\n\t/** ホバー時のコールバック(キャンバス上でのホバーハイライト用。ドラッグ選択とは別) */\n\tonBlockHover?: (id: string | null) => void;\n\n\t/** ドラッグ中のブロック ID 通知(キャンバス上にソリッド枠を表示するために使用) */\n\tonBlockDragChange?: (id: string | null) => void;\n}\n\n/**\n * ブロックの配列順序を変更するパネル。UI では上が最前面、下が最背面。\n *\n * @remarks\n * **Shell** — 内部配列では最後が最前面。\n */\nexport const BlockOrderPanel = ({\n\tblocks,\n\tonBlocksChange,\n\tselectedBlockIds,\n\tonBlockHover,\n\tonBlockDragChange,\n}: BlockOrderPanelProps) => {\n\t// ドラッグ中のブロック ID(blocks 変更後も追従するよう ID で保持)\n\tconst [draggedBlockId, setDraggedBlockId] = useState<string | null>(null);\n\t// ドラッグ先の挿入位置(dragged 除外リスト上のインデックス)\n\tconst [previewInsertIndex, setPreviewInsertIndex] = useState<number | null>(\n\t\tnull,\n\t);\n\t// キャンセル時に元の順序に戻すための保存\n\tconst originalBlocksRef = useRef<Block[] | null>(null);\n\t// ドラッグ開始時の displayIndex(UI上の位置)を保存(ghostPos のフォールバック用)\n\tconst dragStartDisplayIndexRef = useRef<number | null>(null);\n\n\t// UIでは逆順で表示(上が最前面)\n\tconst displayBlocks = [...blocks].reverse();\n\n\t// draggedBlockId から現在の displayBlocks 上のインデックスを導出\n\tconst draggedIndex = (() => {\n\t\tif (draggedBlockId === null) return null;\n\t\tconst idx = displayBlocks.findIndex((b) => b.id === draggedBlockId);\n\t\treturn idx === -1 ? null : idx;\n\t})();\n\n\t// ドラッグ中はリアルタイムでプレビュー順序を表示する\n\tconst previewBlocks = useMemo(() => {\n\t\tif (draggedIndex === null || previewInsertIndex === null)\n\t\t\treturn displayBlocks;\n\t\tconst draggedItem = displayBlocks[draggedIndex];\n\t\tif (!draggedItem) return displayBlocks;\n\t\tconst without = displayBlocks.filter((_, i) => i !== draggedIndex);\n\t\tconst result = [...without];\n\t\tconst clampedIndex = Math.max(\n\t\t\t0,\n\t\t\tMath.min(previewInsertIndex, result.length),\n\t\t);\n\t\tresult.splice(clampedIndex, 0, draggedItem);\n\t\treturn result;\n\t}, [displayBlocks, draggedIndex, previewInsertIndex]);\n\n\t// 最前面へ移動(配列の最後に移動)\n\tconst handleBringToFront = useCallback(\n\t\t(blockId: string) => {\n\t\t\tconst index = blocks.findIndex((b) => b.id === blockId);\n\t\t\tif (index === -1 || index === blocks.length - 1) return;\n\n\t\t\tconst newBlocks = [...blocks];\n\t\t\tconst [block] = newBlocks.splice(index, 1);\n\t\t\tif (!block) return;\n\t\t\tnewBlocks.push(block);\n\t\t\tonBlocksChange(newBlocks);\n\t\t},\n\t\t[blocks, onBlocksChange],\n\t);\n\n\t// 最背面へ移動(配列の先頭に移動)\n\tconst handleSendToBack = useCallback(\n\t\t(blockId: string) => {\n\t\t\tconst index = blocks.findIndex((b) => b.id === blockId);\n\t\t\tif (index === -1 || index === 0) return;\n\n\t\t\tconst newBlocks = [...blocks];\n\t\t\tconst [block] = newBlocks.splice(index, 1);\n\t\t\tif (!block) return;\n\t\t\tnewBlocks.unshift(block);\n\t\t\tonBlocksChange(newBlocks);\n\t\t},\n\t\t[blocks, onBlocksChange],\n\t);\n\n\t// 前面へ移動(1つ後ろに移動)\n\tconst handleBringForward = useCallback(\n\t\t(blockId: string) => {\n\t\t\tconst index = blocks.findIndex((b) => b.id === blockId);\n\t\t\tif (index === -1 || index === blocks.length - 1) return;\n\n\t\t\tconst newBlocks = [...blocks];\n\t\t\tconst temp = newBlocks[index];\n\t\t\tconst next = newBlocks[index + 1];\n\t\t\tif (!temp || !next) return;\n\t\t\tnewBlocks[index] = next;\n\t\t\tnewBlocks[index + 1] = temp;\n\t\t\tonBlocksChange(newBlocks);\n\t\t},\n\t\t[blocks, onBlocksChange],\n\t);\n\n\t// 背面へ移動(1つ前に移動)\n\tconst handleSendBackward = useCallback(\n\t\t(blockId: string) => {\n\t\t\tconst index = blocks.findIndex((b) => b.id === blockId);\n\t\t\tif (index === -1 || index === 0) return;\n\n\t\t\tconst newBlocks = [...blocks];\n\t\t\tconst temp = newBlocks[index];\n\t\t\tconst prev = newBlocks[index - 1];\n\t\t\tif (!temp || !prev) return;\n\t\t\tnewBlocks[index] = prev;\n\t\t\tnewBlocks[index - 1] = temp;\n\t\t\tonBlocksChange(newBlocks);\n\t\t},\n\t\t[blocks, onBlocksChange],\n\t);\n\n\t// ドラッグ開始\n\tconst handleDragStart = useCallback(\n\t\t(e: React.DragEvent<HTMLElement>, displayIndex: number) => {\n\t\t\te.dataTransfer.effectAllowed = \"move\";\n\t\t\tconst actualIndex = blocks.length - 1 - displayIndex;\n\t\t\tconst blockId = blocks[actualIndex]?.id ?? \"\";\n\t\t\te.dataTransfer.setData(\"text/plain\", blockId);\n\t\t\toriginalBlocksRef.current = [...blocks];\n\t\t\tdragStartDisplayIndexRef.current = displayIndex;\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\tsetDraggedBlockId(blockId);\n\t\t\t\tsetPreviewInsertIndex(displayIndex);\n\t\t\t\tonBlockDragChange?.(blockId);\n\t\t\t});\n\t\t},\n\t\t[blocks, onBlockDragChange],\n\t);\n\n\t// ドラッグ終了\n\tconst handleDragEnd = useCallback(() => {\n\t\tif (originalBlocksRef.current) {\n\t\t\tonBlocksChange(originalBlocksRef.current);\n\t\t\toriginalBlocksRef.current = null;\n\t\t}\n\t\tsetDraggedBlockId(null);\n\t\tsetPreviewInsertIndex(null);\n\t\tonBlockHover?.(null);\n\t\tonBlockDragChange?.(null);\n\t}, [onBlocksChange, onBlockHover, onBlockDragChange]);\n\n\t// ドラッグオーバー(プレビュー挿入位置を更新)\n\tconst handleDragOver = useCallback(\n\t\t(\n\t\t\te: React.DragEvent<HTMLElement>,\n\t\t\tpreviewIndex: number,\n\t\t\tblockId: string,\n\t\t) => {\n\t\t\te.preventDefault();\n\t\t\te.dataTransfer.dropEffect = \"move\";\n\t\t\tif (draggedBlockId === null || blockId === draggedBlockId) return;\n\n\t\t\tconst ghostPos =\n\t\t\t\tpreviewInsertIndex ?? dragStartDisplayIndexRef.current ?? 0;\n\t\t\tconst withoutIndex =\n\t\t\t\tpreviewIndex < ghostPos ? previewIndex : previewIndex - 1;\n\n\t\t\tconst rect = e.currentTarget.getBoundingClientRect();\n\t\t\tconst mid = rect.top + rect.height / 2;\n\t\t\tconst newInsertIndex = e.clientY < mid ? withoutIndex : withoutIndex + 1;\n\t\t\tif (newInsertIndex === previewInsertIndex) return;\n\t\t\tsetPreviewInsertIndex(newInsertIndex);\n\n\t\t\tconst originalBlocks = originalBlocksRef.current;\n\t\t\tif (originalBlocks) {\n\t\t\t\tconst originalDisplay = [...originalBlocks].reverse();\n\t\t\t\tconst draggedItem = originalDisplay.find(\n\t\t\t\t\t(b) => b.id === draggedBlockId,\n\t\t\t\t);\n\t\t\t\tif (draggedItem) {\n\t\t\t\t\tconst without = originalDisplay.filter(\n\t\t\t\t\t\t(b) => b.id !== draggedBlockId,\n\t\t\t\t\t);\n\t\t\t\t\tconst clamp = Math.max(0, Math.min(newInsertIndex, without.length));\n\t\t\t\t\tconst preview = [...without];\n\t\t\t\t\tpreview.splice(clamp, 0, draggedItem);\n\t\t\t\t\tonBlocksChange([...preview].reverse());\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t[draggedBlockId, previewInsertIndex, onBlocksChange],\n\t);\n\n\t// ドラッグリーブ\n\tconst handleDragLeave = useCallback(\n\t\t(e: React.DragEvent<HTMLElement>) => {\n\t\t\tif (!e.currentTarget.contains(e.relatedTarget as Node)) {\n\t\t\t\tsetPreviewInsertIndex(draggedIndex);\n\t\t\t}\n\t\t},\n\t\t[draggedIndex],\n\t);\n\n\t// ドロップ\n\tconst handleDrop = useCallback(\n\t\t(e: React.DragEvent<HTMLElement>) => {\n\t\t\te.preventDefault();\n\t\t\toriginalBlocksRef.current = null;\n\n\t\t\tif (draggedIndex !== null && previewInsertIndex !== null) {\n\t\t\t\tconst draggedItem = displayBlocks[draggedIndex];\n\t\t\t\tif (draggedItem) {\n\t\t\t\t\tconst without = displayBlocks.filter((_, i) => i !== draggedIndex);\n\t\t\t\t\tconst clamp = Math.max(\n\t\t\t\t\t\t0,\n\t\t\t\t\t\tMath.min(previewInsertIndex, without.length),\n\t\t\t\t\t);\n\t\t\t\t\tconst preview = [...without];\n\t\t\t\t\tpreview.splice(clamp, 0, draggedItem);\n\t\t\t\t\tconst finalBlocks = [...preview].reverse();\n\t\t\t\t\tconst unchanged = finalBlocks.every((b, i) => b.id === blocks[i]?.id);\n\t\t\t\t\tif (!unchanged) {\n\t\t\t\t\t\tonBlocksChange(finalBlocks);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tsetDraggedBlockId(null);\n\t\t\tsetPreviewInsertIndex(null);\n\t\t},\n\t\t[blocks, draggedIndex, previewInsertIndex, displayBlocks, onBlocksChange],\n\t);\n\n\treturn (\n\t\t<CollapsibleSection\n\t\t\ttitle=\"ブロック順序\"\n\t\t\tcollapsible\n\t\t\tdescription=\"ブロックの重なり順序を管理します。上にあるほど最前面、下にあるほど最背面に表示されます。ドラッグして並び替えができます\"\n\t\t>\n\t\t\t<ul\n\t\t\t\tclassName={styles.list}\n\t\t\t\tonMouseLeave={() => {\n\t\t\t\t\tif (draggedBlockId === null) onBlockHover?.(null);\n\t\t\t\t}}\n\t\t\t\tonDragLeave={handleDragLeave}\n\t\t\t\tonDrop={handleDrop}\n\t\t\t\tonDragOver={(e) => e.preventDefault()}\n\t\t\t>\n\t\t\t\t{previewBlocks.map((block, previewIndex) => {\n\t\t\t\t\tconst originalDisplayIndex = displayBlocks.findIndex(\n\t\t\t\t\t\t(b) => b.id === block.id,\n\t\t\t\t\t);\n\t\t\t\t\tconst isGhost = block.id === draggedBlockId;\n\t\t\t\t\tconst actualIndex = blocks.length - 1 - originalDisplayIndex;\n\t\t\t\t\tconst isSelected = selectedBlockIds?.includes(block.id) ?? false;\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<li\n\t\t\t\t\t\t\tkey={block.id}\n\t\t\t\t\t\t\tclassName={`${styles.item} ${isGhost ? styles.ghost : \"\"} ${isSelected ? styles.selected : \"\"}`}\n\t\t\t\t\t\t\tdraggable={!isGhost}\n\t\t\t\t\t\t\tonDragStart={\n\t\t\t\t\t\t\t\tisGhost\n\t\t\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t\t\t: (e) => handleDragStart(e, originalDisplayIndex)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tonDragEnd={handleDragEnd}\n\t\t\t\t\t\t\tonDragOver={\n\t\t\t\t\t\t\t\tisGhost\n\t\t\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t\t\t: (e) => handleDragOver(e, previewIndex, block.id)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tonMouseEnter={\n\t\t\t\t\t\t\t\tisGhost ? undefined : () => onBlockHover?.(block.id)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<span className={styles.dragHandle} aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n\t\t\t\t\t\t\t\t\t<title>ドラッグハンドル</title>\n\t\t\t\t\t\t\t\t\t<circle cx=\"6\" cy=\"4\" r=\"1\" fill=\"currentColor\" />\n\t\t\t\t\t\t\t\t\t<circle cx=\"10\" cy=\"4\" r=\"1\" fill=\"currentColor\" />\n\t\t\t\t\t\t\t\t\t<circle cx=\"6\" cy=\"8\" r=\"1\" fill=\"currentColor\" />\n\t\t\t\t\t\t\t\t\t<circle cx=\"10\" cy=\"8\" r=\"1\" fill=\"currentColor\" />\n\t\t\t\t\t\t\t\t\t<circle cx=\"6\" cy=\"12\" r=\"1\" fill=\"currentColor\" />\n\t\t\t\t\t\t\t\t\t<circle cx=\"10\" cy=\"12\" r=\"1\" fill=\"currentColor\" />\n\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<div className={styles.itemInfo}>\n\t\t\t\t\t\t\t\t<div className={styles.itemId}>{block.id}</div>\n\t\t\t\t\t\t\t\t<div className={styles.itemMeta}>\n\t\t\t\t\t\t\t\t\t<span className={styles.itemKind}>{block.kind}</span>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t<div className={styles.itemActions}>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tclassName={styles.actionButton}\n\t\t\t\t\t\t\t\t\tonClick={() => handleBringToFront(block.id)}\n\t\t\t\t\t\t\t\t\ttitle=\"最前面へ\"\n\t\t\t\t\t\t\t\t\taria-label=\"最前面へ移動\"\n\t\t\t\t\t\t\t\t\tdisabled={isGhost || actualIndex === blocks.length - 1}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n\t\t\t\t\t\t\t\t\t\t<title>最前面へ</title>\n\t\t\t\t\t\t\t\t\t\t<path d=\"M4 12v-8M8 12v-8M12 12v-8\" stroke=\"currentColor\" />\n\t\t\t\t\t\t\t\t\t\t<path d=\"M12 4h-8\" stroke=\"currentColor\" strokeWidth=\"2\" />\n\t\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tclassName={styles.actionButton}\n\t\t\t\t\t\t\t\t\tonClick={() => handleBringForward(block.id)}\n\t\t\t\t\t\t\t\t\ttitle=\"前面へ\"\n\t\t\t\t\t\t\t\t\taria-label=\"前面へ移動\"\n\t\t\t\t\t\t\t\t\tdisabled={isGhost || actualIndex === blocks.length - 1}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n\t\t\t\t\t\t\t\t\t\t<title>前面へ</title>\n\t\t\t\t\t\t\t\t\t\t<path d=\"M8 4v8\" stroke=\"currentColor\" />\n\t\t\t\t\t\t\t\t\t\t<path d=\"M5 7l3-3 3 3\" stroke=\"currentColor\" />\n\t\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tclassName={styles.actionButton}\n\t\t\t\t\t\t\t\t\tonClick={() => handleSendBackward(block.id)}\n\t\t\t\t\t\t\t\t\ttitle=\"背面へ\"\n\t\t\t\t\t\t\t\t\taria-label=\"背面へ移動\"\n\t\t\t\t\t\t\t\t\tdisabled={isGhost || actualIndex === 0}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n\t\t\t\t\t\t\t\t\t\t<title>背面へ</title>\n\t\t\t\t\t\t\t\t\t\t<path d=\"M8 12v-8\" stroke=\"currentColor\" />\n\t\t\t\t\t\t\t\t\t\t<path d=\"M5 9l3 3 3-3\" stroke=\"currentColor\" />\n\t\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tclassName={styles.actionButton}\n\t\t\t\t\t\t\t\t\tonClick={() => handleSendToBack(block.id)}\n\t\t\t\t\t\t\t\t\ttitle=\"最背面へ\"\n\t\t\t\t\t\t\t\t\taria-label=\"最背面へ移動\"\n\t\t\t\t\t\t\t\t\tdisabled={isGhost || actualIndex === 0}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n\t\t\t\t\t\t\t\t\t\t<title>最背面へ</title>\n\t\t\t\t\t\t\t\t\t\t<path d=\"M4 12v-8M8 12v-8M12 12v-8\" stroke=\"currentColor\" />\n\t\t\t\t\t\t\t\t\t\t<path d=\"M12 12h-8\" stroke=\"currentColor\" strokeWidth=\"2\" />\n\t\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</ul>\n\t\t\t{blocks.length === 0 && (\n\t\t\t\t<div className={styles.empty}>ブロックがありません</div>\n\t\t\t)}\n\t\t</CollapsibleSection>\n\t);\n};\n\nBlockOrderPanel.displayName = \"BlockOrderPanel\";\n","import {\n\tCopyIcon,\n\tDuplicateIcon,\n\tPasteIcon,\n\tRedoIcon,\n\tTrashIcon,\n\tUndoIcon,\n} from \"../../../../components/icons\";\nimport { getActionFeedback } from \"../../../actionFeedback\";\nimport { IconActionButton } from \"../../../ui\";\nimport styles from \"./CanvasActionPanel.module.css\";\n\nimport type { NoteContext } from \"../../../../contexts/useNoteContext\";\nimport type { ActionFeedback } from \"../../../actionFeedback\";\n\n/**\n * `CanvasActionPanel` コンポーネントへの props。\n */\nexport interface CanvasActionPanelProps {\n\t/** NoteContext(`useNoteContext` が返すコンテキスト) */\n\tcontext: NoteContext;\n\n\t/** アクション実行時のフィードバック(トースト表示など) */\n\tonActionFeedback?: (feedback: ActionFeedback) => void;\n}\n\n/**\n * `CanvasPanel` 最上部に表示するアクションボタン行。\n *\n * @remarks\n * **Shell** — Undo/Redo/Delete/Copy/Paste/Duplicate ボタンを提供する。\n */\nexport const CanvasActionPanel = ({\n\tcontext,\n\tonActionFeedback,\n}: CanvasActionPanelProps) => {\n\tconst { actionContext } = context;\n\tconst selectedBlockIds = context.editorState.selectedBlockIds;\n\tconst hasSelection = (selectedBlockIds?.length ?? 0) > 0;\n\tconst canUndo = actionContext.isEnabled(\"undo\");\n\tconst canRedo = actionContext.isEnabled(\"redo\");\n\tconst hasCopied = actionContext.isEnabled(\"paste\");\n\n\tconst runAction = (actionId: string) => {\n\t\tactionContext.execute(actionId);\n\t\tconst feedback = getActionFeedback(actionId);\n\t\tif (feedback) {\n\t\t\tonActionFeedback?.(feedback);\n\t\t}\n\t};\n\n\treturn (\n\t\t<div className={styles.container} data-testid=\"canvas-action-panel\">\n\t\t\t<div className={styles.group}>\n\t\t\t\t<IconActionButton\n\t\t\t\t\ticon={<UndoIcon aria-hidden=\"true\" />}\n\t\t\t\t\tlabel=\"元に戻す\"\n\t\t\t\t\ttitle=\"元に戻す (Ctrl+Z / Cmd+Z)\"\n\t\t\t\t\tonClick={() => runAction(\"undo\")}\n\t\t\t\t\tdisabled={!canUndo}\n\t\t\t\t/>\n\t\t\t\t<IconActionButton\n\t\t\t\t\ticon={<RedoIcon aria-hidden=\"true\" />}\n\t\t\t\t\tlabel=\"やり直し\"\n\t\t\t\t\ttitle=\"やり直し (Ctrl+Y / Cmd+Y)\"\n\t\t\t\t\tonClick={() => runAction(\"redo\")}\n\t\t\t\t\tdisabled={!canRedo}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t<div className={styles.divider} aria-hidden=\"true\" />\n\t\t\t<div className={styles.group}>\n\t\t\t\t<IconActionButton\n\t\t\t\t\ticon={<TrashIcon aria-hidden=\"true\" />}\n\t\t\t\t\tlabel=\"選択を削除\"\n\t\t\t\t\ttitle=\"削除 (Delete / Backspace)\"\n\t\t\t\t\tonClick={() => runAction(\"delete\")}\n\t\t\t\t\tdisabled={!hasSelection}\n\t\t\t\t/>\n\t\t\t\t<IconActionButton\n\t\t\t\t\ticon={<CopyIcon aria-hidden=\"true\" />}\n\t\t\t\t\tlabel=\"選択をコピー\"\n\t\t\t\t\ttitle=\"コピー (Ctrl+C / Cmd+C)\"\n\t\t\t\t\tonClick={() => runAction(\"copy\")}\n\t\t\t\t\tdisabled={!hasSelection}\n\t\t\t\t/>\n\t\t\t\t<IconActionButton\n\t\t\t\t\ticon={<PasteIcon aria-hidden=\"true\" />}\n\t\t\t\t\tlabel=\"貼り付け\"\n\t\t\t\t\ttitle=\"貼り付け (Ctrl+V / Cmd+V)\"\n\t\t\t\t\tonClick={() => runAction(\"paste\")}\n\t\t\t\t\tdisabled={!hasCopied}\n\t\t\t\t/>\n\t\t\t\t<IconActionButton\n\t\t\t\t\ticon={<DuplicateIcon aria-hidden=\"true\" />}\n\t\t\t\t\tlabel=\"選択を複製\"\n\t\t\t\t\ttitle=\"複製 (Ctrl+D / Cmd+D)\"\n\t\t\t\t\tonClick={() => runAction(\"duplicate\")}\n\t\t\t\t\tdisabled={!hasSelection}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nCanvasActionPanel.displayName = \"CanvasActionPanel\";\n","import { TabPanel } from \"../../ui\";\n\nimport type { ReactNode } from \"react\";\n\n/**\n * `CanvasPanel` コンポーネントへの props。\n */\nexport interface CanvasPanelProps {\n\t/** パネルのコンテンツ */\n\tchildren?: ReactNode;\n\n\t/** カスタムクラス名 */\n\tclassName?: string;\n}\n\n/**\n * キャンバス設定パネルの純粹なコンテナ。`TabPanel` ラッパーのみを提供する。\n *\n * @remarks\n * **Shell** — ビジネスロジックを含む実装は `DefaultCanvasPanel` を使用してください。\n */\nexport const CanvasPanel = ({ children, className }: CanvasPanelProps) => (\n\t<TabPanel className={className}>{children}</TabPanel>\n);\n\nCanvasPanel.displayName = \"CanvasPanel\";\n","import { useCallback } from \"react\";\n\nimport {\n\tcolsToSparse,\n\texpandSparseCols,\n\texpandSparseRows,\n\trowsToSparse,\n} from \"../../../../utils/grid\";\nimport { CollapsibleSection, NumberInput } from \"../../../ui\";\nimport styles from \"./GridSizePanel.module.css\";\n\nimport type { Grid } from \"../../../../types/grid\";\n\n// デフォルトのグリッド列/行サイズ(1fr)\nconst DEFAULT_DIMENSION = { value: 1, unit: \"fr\" as const };\n\n/**\n * `GridSizePanel` コンポーネントへの props。\n */\nexport interface GridSizePanelProps {\n\t/** グリッド設定 */\n\tgrid: Grid;\n\n\t/** グリッド変更時のコールバック */\n\tonGridChange: (grid: Grid) => void;\n}\n\n/**\n * 行・列数を変更するパネル。\n *\n * @remarks\n * **Shell** — 行・列数変更パネル。\n */\nexport const GridSizePanel = ({ grid, onGridChange }: GridSizePanelProps) => {\n\t// 列数変更ハンドラ\n\tconst handleColsChange = useCallback(\n\t\t(newColCount: number | undefined) => {\n\t\t\tif (!newColCount || newColCount < 1 || newColCount > 100) return;\n\n\t\t\tconst currentCols = expandSparseCols(grid);\n\t\t\tconst currentColCount = grid.colCount;\n\t\t\tconst newCols = [...currentCols];\n\n\t\t\tif (newColCount > currentColCount) {\n\t\t\t\t// 列を追加\n\t\t\t\tfor (let i = currentColCount; i < newColCount; i++) {\n\t\t\t\t\tnewCols.push({ ...DEFAULT_DIMENSION });\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// 列を削除\n\t\t\t\tnewCols.splice(newColCount);\n\t\t\t}\n\n\t\t\tonGridChange({ ...grid, ...colsToSparse(newCols) });\n\t\t},\n\t\t[grid, onGridChange],\n\t);\n\n\t// 行数変更ハンドラ\n\tconst handleRowsChange = useCallback(\n\t\t(newRowCount: number | undefined) => {\n\t\t\tif (!newRowCount || newRowCount < 1 || newRowCount > 100) return;\n\n\t\t\tconst currentRows = expandSparseRows(grid);\n\t\t\tconst currentRowCount = grid.rowCount;\n\t\t\tconst newRows = [...currentRows];\n\n\t\t\tif (newRowCount > currentRowCount) {\n\t\t\t\t// 行を追加\n\t\t\t\tfor (let i = currentRowCount; i < newRowCount; i++) {\n\t\t\t\t\tnewRows.push({ ...DEFAULT_DIMENSION });\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// 行を削除\n\t\t\t\tnewRows.splice(newRowCount);\n\t\t\t}\n\n\t\t\tonGridChange({ ...grid, ...rowsToSparse(newRows) });\n\t\t},\n\t\t[grid, onGridChange],\n\t);\n\n\treturn (\n\t\t<CollapsibleSection\n\t\t\ttitle=\"グリッドサイズ\"\n\t\t\tcollapsible\n\t\t\tdefaultCollapsed={false}\n\t\t\tdescription=\"ブロックを配置するグリッドの列数と行数を設定します\"\n\t\t>\n\t\t\t<div className={styles.gridSizeRow}>\n\t\t\t\t<div className={`${styles.field} ${styles.horizontal}`}>\n\t\t\t\t\t<span className={styles.label}>列数</span>\n\t\t\t\t\t<NumberInput\n\t\t\t\t\t\tvalue={grid.colCount}\n\t\t\t\t\t\tonChange={handleColsChange}\n\t\t\t\t\t\tmin={1}\n\t\t\t\t\t\tmax={100}\n\t\t\t\t\t\tstep={1}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\n\t\t\t\t<div className={`${styles.field} ${styles.horizontal}`}>\n\t\t\t\t\t<span className={styles.label}>行数</span>\n\t\t\t\t\t<NumberInput\n\t\t\t\t\t\tvalue={grid.rowCount}\n\t\t\t\t\t\tonChange={handleRowsChange}\n\t\t\t\t\t\tmin={1}\n\t\t\t\t\t\tmax={100}\n\t\t\t\t\t\tstep={1}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</CollapsibleSection>\n\t);\n};\n\nGridSizePanel.displayName = \"GridSizePanel\";\n","import { useCallback, useState } from \"react\";\n\nimport { CollapsibleSection, DimensionInput } from \"../../../ui\";\nimport styles from \"./MarginPanel.module.css\";\n\nimport type { Paper, PaperMargin } from \"../../../../types/paper\";\nimport type { Dimension, PaperUnit } from \"../../../../types/unit\";\n\n/**\n * `MarginPanel` コンポーネントへの props。\n */\nexport interface MarginPanelProps {\n\t/** 用紙設定 */\n\tpaper: Paper;\n\n\t/** 用紙変更時のコールバック */\n\tonPaperChange: (paper: Paper) => void;\n}\n\n/**\n * マージンを変更するパネル。\n *\n * @remarks\n * **Shell** — 全辺一括設定モードあり。\n */\nexport const MarginPanel = ({ paper, onPaperChange }: MarginPanelProps) => {\n\t// 全辺一括設定モード\n\tconst [linkMargins, setLinkMargins] = useState(false);\n\n\t// 上マージン変更ハンドラ\n\tconst handleTopChange = useCallback(\n\t\t(top: Dimension<PaperUnit> | undefined) => {\n\t\t\tif (!top) return;\n\n\t\t\tconst newMargin: PaperMargin = linkMargins\n\t\t\t\t? {\n\t\t\t\t\t\ttop,\n\t\t\t\t\t\tright: top,\n\t\t\t\t\t\tbottom: top,\n\t\t\t\t\t\tleft: top,\n\t\t\t\t\t}\n\t\t\t\t: {\n\t\t\t\t\t\t...paper.margin,\n\t\t\t\t\t\ttop,\n\t\t\t\t\t};\n\n\t\t\tonPaperChange({\n\t\t\t\t...paper,\n\t\t\t\tmargin: newMargin,\n\t\t\t});\n\t\t},\n\t\t[paper, onPaperChange, linkMargins],\n\t);\n\n\t// 右マージン変更ハンドラ\n\tconst handleRightChange = useCallback(\n\t\t(right: Dimension<PaperUnit> | undefined) => {\n\t\t\tif (!right) return;\n\n\t\t\tonPaperChange({\n\t\t\t\t...paper,\n\t\t\t\tmargin: {\n\t\t\t\t\t...paper.margin,\n\t\t\t\t\tright,\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t\t[paper, onPaperChange],\n\t);\n\n\t// 下マージン変更ハンドラ\n\tconst handleBottomChange = useCallback(\n\t\t(bottom: Dimension<PaperUnit> | undefined) => {\n\t\t\tif (!bottom) return;\n\n\t\t\tonPaperChange({\n\t\t\t\t...paper,\n\t\t\t\tmargin: {\n\t\t\t\t\t...paper.margin,\n\t\t\t\t\tbottom,\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t\t[paper, onPaperChange],\n\t);\n\n\t// 左マージン変更ハンドラ\n\tconst handleLeftChange = useCallback(\n\t\t(left: Dimension<PaperUnit> | undefined) => {\n\t\t\tif (!left) return;\n\n\t\t\tonPaperChange({\n\t\t\t\t...paper,\n\t\t\t\tmargin: {\n\t\t\t\t\t...paper.margin,\n\t\t\t\t\tleft,\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t\t[paper, onPaperChange],\n\t);\n\n\treturn (\n\t\t<CollapsibleSection\n\t\t\ttitle=\"マージン\"\n\t\t\tcollapsible\n\t\t\tdefaultCollapsed={false}\n\t\t\tdescription=\"印刷時にコンテンツが配置されない余白(マージン)を設定します\"\n\t\t>\n\t\t\t{/* topRow: 個別[スイッチ]一括 + 上(一括時は全辺)マージン */}\n\t\t\t<div className={styles.topRow}>\n\t\t\t\t<div className={styles.linkSwitch}>\n\t\t\t\t\t<span\n\t\t\t\t\t\tclassName={`${styles.switchLabel} ${!linkMargins ? styles.switchLabelActive : \"\"}`}\n\t\t\t\t\t>\n\t\t\t\t\t\t個別\n\t\t\t\t\t</span>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\trole=\"switch\"\n\t\t\t\t\t\taria-checked={linkMargins}\n\t\t\t\t\t\tclassName={styles.toggle}\n\t\t\t\t\t\tonClick={() => setLinkMargins((v) => !v)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<span className={styles.thumb} />\n\t\t\t\t\t</button>\n\t\t\t\t\t<span\n\t\t\t\t\t\tclassName={`${styles.switchLabel} ${linkMargins ? styles.switchLabelActive : \"\"}`}\n\t\t\t\t\t>\n\t\t\t\t\t\t一括\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t\t<div className={styles.topCell}>\n\t\t\t\t\t<DimensionInput\n\t\t\t\t\t\tvalue={paper.margin.top}\n\t\t\t\t\t\tonChange={handleTopChange}\n\t\t\t\t\t\tallowedUnits={[\"mm\", \"cm\", \"inch\"]}\n\t\t\t\t\t\tmin={0}\n\t\t\t\t\t\tmax={1000}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t{!linkMargins && (\n\t\t\t\t<>\n\t\t\t\t\t<div className={styles.sideMargins}>\n\t\t\t\t\t\t<div className={styles.sideCell}>\n\t\t\t\t\t\t\t<DimensionInput\n\t\t\t\t\t\t\t\tvalue={paper.margin.left}\n\t\t\t\t\t\t\t\tonChange={handleLeftChange}\n\t\t\t\t\t\t\t\tallowedUnits={[\"mm\", \"cm\", \"inch\"]}\n\t\t\t\t\t\t\t\tmin={0}\n\t\t\t\t\t\t\t\tmax={1000}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div className={styles.sideCell}>\n\t\t\t\t\t\t\t<DimensionInput\n\t\t\t\t\t\t\t\tvalue={paper.margin.right}\n\t\t\t\t\t\t\t\tonChange={handleRightChange}\n\t\t\t\t\t\t\t\tallowedUnits={[\"mm\", \"cm\", \"inch\"]}\n\t\t\t\t\t\t\t\tmin={0}\n\t\t\t\t\t\t\t\tmax={1000}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className={styles.bottomCell}>\n\t\t\t\t\t\t<DimensionInput\n\t\t\t\t\t\t\tvalue={paper.margin.bottom}\n\t\t\t\t\t\t\tonChange={handleBottomChange}\n\t\t\t\t\t\t\tallowedUnits={[\"mm\", \"cm\", \"inch\"]}\n\t\t\t\t\t\t\tmin={0}\n\t\t\t\t\t\t\tmax={1000}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</>\n\t\t\t)}\n\t\t</CollapsibleSection>\n\t);\n};\n\nMarginPanel.displayName = \"MarginPanel\";\n","import { useCallback, useMemo } from \"react\";\n\nimport { DEFAULT_PAPER_SIZES, PaperSizePreset } from \"../../../../types/paper\";\nimport { toMm } from \"../../../../utils\";\nimport {\n\tCheckbox,\n\tCollapsibleSection,\n\tDimensionInput,\n\tDropdown,\n} from \"../../../ui\";\nimport styles from \"./PaperSizePanel.module.css\";\n\nimport type { Paper, PaperSize } from \"../../../../types/paper\";\nimport type { Dimension, PaperUnit } from \"../../../../types/unit\";\n\n// mm を指定した用紙単位に変換するヘルパー\nfunction mmToUnit(mm: number, unit: PaperUnit): number {\n\tswitch (unit) {\n\t\tcase \"cm\":\n\t\t\treturn mm / 10;\n\t\tcase \"inch\":\n\t\t\treturn mm / 25.4;\n\t\tdefault:\n\t\t\treturn mm; // \"mm\"\n\t}\n}\n\n/**\n * `PaperSizePanel` コンポーネントへの props。\n */\nexport interface PaperSizePanelProps {\n\t/** 用紙設定 */\n\tpaper: Paper;\n\n\t/** 用紙変更時のコールバック */\n\tonPaperChange: (paper: Paper) => void;\n}\n\n/**\n * 用紙サイズ・向き・自動サイズモードを変更するパネル。\n *\n * @remarks\n * **Shell** — カスタム選択時は幅・高さ・単位の入力も表示される。\n */\nexport const PaperSizePanel = ({\n\tpaper,\n\tonPaperChange,\n}: PaperSizePanelProps) => {\n\t// プリセット選択肢\n\tconst presetOptions = useMemo(\n\t\t() => [\n\t\t\t{ value: PaperSizePreset.A4, label: \"A4 (210 × 297 mm)\" },\n\t\t\t{ value: PaperSizePreset.A3, label: \"A3 (297 × 420 mm)\" },\n\t\t\t{ value: PaperSizePreset.B5, label: \"B5 (182 × 257 mm)\" },\n\t\t\t{ value: PaperSizePreset.LETTER, label: \"Letter (8.5 × 11 inch)\" },\n\t\t\t{ value: PaperSizePreset.LEGAL, label: \"Legal (8.5 × 14 inch)\" },\n\t\t\t{ value: PaperSizePreset.CUSTOM, label: \"カスタム\" },\n\t\t],\n\t\t[],\n\t);\n\n\t// 向き変更ハンドラ(true = 横向き、false/undefined = 縦向き)\n\tconst handleOrientationChange = useCallback(\n\t\t(landscape: boolean | undefined) => {\n\t\t\tonPaperChange({ ...paper, orientation: landscape || undefined });\n\t\t},\n\t\t[paper, onPaperChange],\n\t);\n\n\t// プリセット変更ハンドラ\n\tconst handlePresetChange = useCallback(\n\t\t(preset: PaperSizePreset | undefined) => {\n\t\t\tif (!preset) return;\n\t\t\tonPaperChange({ ...paper, size: DEFAULT_PAPER_SIZES[preset] });\n\t\t},\n\t\t[paper, onPaperChange],\n\t);\n\n\t// 幅変更ハンドラ\n\tconst handleWidthChange = useCallback(\n\t\t(width: Dimension<PaperUnit> | undefined) => {\n\t\t\tif (!width) return;\n\t\t\tconst newSize: PaperSize = {\n\t\t\t\t...paper.size,\n\t\t\t\tpreset: PaperSizePreset.CUSTOM,\n\t\t\t\twidth,\n\t\t\t};\n\t\t\tonPaperChange({ ...paper, size: newSize });\n\t\t},\n\t\t[paper, onPaperChange],\n\t);\n\n\t// 高さ変更ハンドラ\n\tconst handleHeightChange = useCallback(\n\t\t(height: Dimension<PaperUnit> | undefined) => {\n\t\t\tif (!height) return;\n\t\t\tconst newSize: PaperSize = {\n\t\t\t\t...paper.size,\n\t\t\t\tpreset: PaperSizePreset.CUSTOM,\n\t\t\t\theight,\n\t\t\t};\n\t\t\tonPaperChange({ ...paper, size: newSize });\n\t\t},\n\t\t[paper, onPaperChange],\n\t);\n\n\tconst isCustom = paper.size.preset === PaperSizePreset.CUSTOM;\n\tconst isFit = paper.autoHeight === true;\n\tconst isWidthFit = paper.autoWidth === true;\n\n\tconst handleHeightModeToggle = useCallback(() => {\n\t\tonPaperChange({ ...paper, autoHeight: isFit ? undefined : true });\n\t}, [paper, isFit, onPaperChange]);\n\n\tconst handleWidthModeToggle = useCallback(() => {\n\t\tonPaperChange({ ...paper, autoWidth: isWidthFit ? undefined : true });\n\t}, [paper, isWidthFit, onPaperChange]);\n\n\tconst heightLabel = isFit ? \"最小高さ\" : \"高さ\";\n\tconst widthLabel = isWidthFit ? \"最小幅\" : \"幅\";\n\n\t// カスタムサイズの最小値: マージンの合計をキャンバスの単位に換算\n\tconst minWidth = useMemo(() => {\n\t\tconst minMm =\n\t\t\ttoMm.fromDim(paper.margin.left) + toMm.fromDim(paper.margin.right);\n\t\treturn mmToUnit(minMm, paper.size.width.unit);\n\t}, [paper.margin.left, paper.margin.right, paper.size.width.unit]);\n\n\tconst minHeight = useMemo(() => {\n\t\tconst minMm =\n\t\t\ttoMm.fromDim(paper.margin.top) + toMm.fromDim(paper.margin.bottom);\n\t\treturn mmToUnit(minMm, paper.size.height.unit);\n\t}, [paper.margin.top, paper.margin.bottom, paper.size.height.unit]);\n\n\treturn (\n\t\t<CollapsibleSection\n\t\t\ttitle=\"用紙設定\"\n\t\t\tcollapsible\n\t\t\tdefaultCollapsed={false}\n\t\t\tdescription=\"用紙のサイズと向きを設定します\"\n\t\t>\n\t\t\t<div className={styles.grid}>\n\t\t\t\t{/* 行 0: プリセット select + 横向き checkbox */}\n\t\t\t\t<span className={`${styles.label} ${styles.colSpan2}`}>用紙サイズ</span>\n\t\t\t\t<div className={styles.colSpan3}>\n\t\t\t\t\t<Dropdown\n\t\t\t\t\t\tvalue={paper.size.preset}\n\t\t\t\t\t\toptions={presetOptions}\n\t\t\t\t\t\tonChange={handlePresetChange}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<span className={`${styles.label} ${styles.colSpan2}`}>横向き</span>\n\t\t\t\t<div className={styles.checkboxCell}>\n\t\t\t\t\t<Checkbox\n\t\t\t\t\t\tvalue={paper.orientation === true}\n\t\t\t\t\t\tonChange={handleOrientationChange}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\n\t\t\t\t{/* 行 1: 幅・高さ自動モードトグル(1行に収める) */}\n\t\t\t\t<span className={styles.modeLabel}>幅</span>\n\t\t\t\t<div className={styles.modeToggle}>\n\t\t\t\t\t<span\n\t\t\t\t\t\tclassName={`${styles.switchLabel} ${isWidthFit ? styles.switchLabelActive : \"\"}`}\n\t\t\t\t\t>\n\t\t\t\t\t\t自動\n\t\t\t\t\t</span>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\trole=\"switch\"\n\t\t\t\t\t\taria-checked={isWidthFit}\n\t\t\t\t\t\taria-label=\"幅モード\"\n\t\t\t\t\t\tclassName={styles.toggle}\n\t\t\t\t\t\tonClick={handleWidthModeToggle}\n\t\t\t\t\t>\n\t\t\t\t\t\t<span className={styles.thumb} />\n\t\t\t\t\t</button>\n\t\t\t\t\t<span\n\t\t\t\t\t\tclassName={`${styles.switchLabel} ${!isWidthFit ? styles.switchLabelActive : \"\"}`}\n\t\t\t\t\t>\n\t\t\t\t\t\t固定\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t\t<span className={styles.modeLabel}>高さ</span>\n\t\t\t\t<div className={styles.modeToggle}>\n\t\t\t\t\t<span\n\t\t\t\t\t\tclassName={`${styles.switchLabel} ${isFit ? styles.switchLabelActive : \"\"}`}\n\t\t\t\t\t>\n\t\t\t\t\t\t自動\n\t\t\t\t\t</span>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\trole=\"switch\"\n\t\t\t\t\t\taria-checked={isFit}\n\t\t\t\t\t\taria-label=\"高さモード\"\n\t\t\t\t\t\tclassName={styles.toggle}\n\t\t\t\t\t\tonClick={handleHeightModeToggle}\n\t\t\t\t\t>\n\t\t\t\t\t\t<span className={styles.thumb} />\n\t\t\t\t\t</button>\n\t\t\t\t\t<span\n\t\t\t\t\t\tclassName={`${styles.switchLabel} ${!isFit ? styles.switchLabelActive : \"\"}`}\n\t\t\t\t\t>\n\t\t\t\t\t\t固定\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\n\t\t\t\t{/* 行 2: カスタムサイズ入力(Custom 選択時のみ) */}\n\t\t\t\t{isCustom && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<span className={styles.label}>{widthLabel}</span>\n\t\t\t\t\t\t<div className={styles.colSpan3}>\n\t\t\t\t\t\t\t<DimensionInput\n\t\t\t\t\t\t\t\tvalue={paper.size.width}\n\t\t\t\t\t\t\t\tonChange={handleWidthChange}\n\t\t\t\t\t\t\t\tallowedUnits={[\"mm\", \"cm\", \"inch\"]}\n\t\t\t\t\t\t\t\tmin={minWidth}\n\t\t\t\t\t\t\t\tmax={500}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<span className={styles.label}>{heightLabel}</span>\n\t\t\t\t\t\t<div className={styles.colSpan3}>\n\t\t\t\t\t\t\t<DimensionInput\n\t\t\t\t\t\t\t\tvalue={paper.size.height}\n\t\t\t\t\t\t\t\tonChange={handleHeightChange}\n\t\t\t\t\t\t\t\tallowedUnits={[\"mm\", \"cm\", \"inch\"]}\n\t\t\t\t\t\t\t\tmin={minHeight}\n\t\t\t\t\t\t\t\tmax={500}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</CollapsibleSection>\n\t);\n};\n\nPaperSizePanel.displayName = \"PaperSizePanel\";\n","import { useCallback } from \"react\";\n\nimport { gridSizeKey } from \"../../../contexts/history/mergeKeys\";\nimport {\n\tBlockDefaultsPanel,\n\tBlockOrderPanel,\n\tCanvasActionPanel,\n\tGridSizePanel,\n\tMarginPanel,\n\tPaperSizePanel,\n} from \".\";\nimport { CanvasPanel } from \"./CanvasPanel\";\n\nimport type { NoteContext } from \"../../../contexts/useNoteContext\";\nimport type { Block } from \"../../../types/block\";\nimport type { Grid } from \"../../../types/grid\";\nimport type { Paper } from \"../../../types/paper\";\nimport type { BlockDefaults } from \"../../../types/schema\";\nimport type { ActionFeedback } from \"../../actionFeedback\";\n\n/**\n * `DefaultCanvasPanel` コンポーネントへの props。\n */\nexport interface DefaultCanvasPanelProps {\n\t/** NoteContext(`useNoteContext` が返すコンテキスト) */\n\tcontext: NoteContext;\n\n\t/** ホバー中のブロック ID 通知 */\n\tonBlockHover?: (id: string | null) => void;\n\n\t/** ドラッグ中のブロック ID 通知 */\n\tonBlockDragChange?: (id: string | null) => void;\n\n\t/** アクション実行時のフィードバック(トースト表示など) */\n\tonActionFeedback?: (feedback: ActionFeedback) => void;\n}\n\n/**\n * キャンバス設定統合パネルのデフォルト実装。\n *\n * @remarks\n * **Shell** — 内部に CanvasActionPanel, PaperSizePanel, MarginPanel, GridSizePanel, BlockDefaultsPanel, BlockOrderPanel を含む。\n */\nexport const DefaultCanvasPanel = ({\n\tcontext,\n\tonBlockHover,\n\tonBlockDragChange,\n\tonActionFeedback,\n}: DefaultCanvasPanelProps) => {\n\tconst { book, onBookChange, pluginRegistry } = context;\n\tconst pageIdx = context.editorState.pageIdx;\n\tconst selectedBlockIds = context.editorState.selectedBlockIds;\n\tconst page = book.pages[pageIdx] ?? book.pages[0];\n\n\t// 用紙設定変更\n\tconst handlePaperChange = useCallback(\n\t\t(newPaper: Paper) => {\n\t\t\tonBookChange({ ...book, paper: newPaper });\n\t\t},\n\t\t[book, onBookChange],\n\t);\n\n\t// グリッド設定変更\n\tconst handleGridChange = useCallback(\n\t\t(newGrid: Grid) => {\n\t\t\tconst newPages = book.pages.map((pg, i) =>\n\t\t\t\ti === pageIdx ? { ...pg, grid: newGrid } : pg,\n\t\t\t) as typeof book.pages;\n\t\t\tonBookChange(\n\t\t\t\t{ ...book, pages: newPages },\n\t\t\t\t{ mergeKey: gridSizeKey(pageIdx) },\n\t\t\t);\n\t\t},\n\t\t[book, onBookChange, pageIdx],\n\t);\n\n\t// ブロック順序変更\n\tconst handleBlocksChange = useCallback(\n\t\t(newBlocks: Block[]) => {\n\t\t\tconst newPages = book.pages.map((pg, i) =>\n\t\t\t\ti === pageIdx ? { ...pg, blocks: newBlocks } : pg,\n\t\t\t) as typeof book.pages;\n\t\t\tonBookChange({ ...book, pages: newPages });\n\t\t},\n\t\t[book, onBookChange, pageIdx],\n\t);\n\n\t// ブロックデフォルト設定変更\n\tconst handleBlockDefaultsChange = useCallback(\n\t\t(newBlockDefaults: BlockDefaults) => {\n\t\t\tconst newPages = book.pages.map((pg, i) =>\n\t\t\t\ti === pageIdx ? { ...pg, blockDefaults: newBlockDefaults } : pg,\n\t\t\t) as typeof book.pages;\n\t\t\tonBookChange({ ...book, pages: newPages });\n\t\t},\n\t\t[book, onBookChange, pageIdx],\n\t);\n\n\treturn (\n\t\t<CanvasPanel>\n\t\t\t<CanvasActionPanel\n\t\t\t\tcontext={context}\n\t\t\t\tonActionFeedback={onActionFeedback}\n\t\t\t/>\n\t\t\t<PaperSizePanel paper={book.paper} onPaperChange={handlePaperChange} />\n\t\t\t<MarginPanel paper={book.paper} onPaperChange={handlePaperChange} />\n\t\t\t<GridSizePanel grid={page.grid} onGridChange={handleGridChange} />\n\t\t\t{pluginRegistry && Object.keys(pluginRegistry).length > 0 && (\n\t\t\t\t<BlockDefaultsPanel\n\t\t\t\t\tblockDefaults={page.blockDefaults ?? {}}\n\t\t\t\t\tpluginRegistry={pluginRegistry}\n\t\t\t\t\tonChange={handleBlockDefaultsChange}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t<BlockOrderPanel\n\t\t\t\tblocks={page.blocks}\n\t\t\t\tonBlocksChange={handleBlocksChange}\n\t\t\t\tselectedBlockIds={selectedBlockIds}\n\t\t\t\tonBlockHover={onBlockHover}\n\t\t\t\tonBlockDragChange={onBlockDragChange}\n\t\t\t/>\n\t\t</CanvasPanel>\n\t);\n};\n\nDefaultCanvasPanel.displayName = \"DefaultCanvasPanel\";\n","import { useCallback, useRef, useState } from \"react\";\n\nimport { migratePage } from \"../../../../utils/migration\";\nimport { deserializeBook, serializeBook } from \"../../../../utils/schema\";\nimport { deserializeValues } from \"../../../../utils/values\";\nimport { CollapsibleSection } from \"../../../ui\";\nimport styles from \"./ImportExportPanel.module.css\";\n\nimport type React from \"react\";\nimport type {\n\tOnBookChange,\n\tOnValuesChange,\n\tValueChange,\n} from \"../../../../types/callbacks\";\nimport type { Book } from \"../../../../types/schema\";\nimport type { Value } from \"../../../../types/value\";\n\n/**\n * `ImportExportPanel` コンポーネントへの props。\n */\nexport interface ImportExportPanelProps {\n\t/** ブックデータ */\n\tbook: Book;\n\n\t/** 入力値のマップ */\n\tvalues: Record<string, Value>;\n\n\t/** ブック変更時のコールバック */\n\tonBookChange: OnBookChange;\n\n\t/** 入力値変更時のコールバック */\n\tonValuesChange: OnValuesChange;\n}\n\n// 現在値と次値の差分変更配列を生成するヘルパー\nconst computeValueChanges = (\n\tcurrent: Record<string, Value>,\n\tnext: Record<string, Value>,\n): ValueChange[] => {\n\tconst changes: ValueChange[] = [];\n\tfor (const id of Object.keys(current)) {\n\t\tif (!(id in next)) changes.push({ id, value: undefined });\n\t}\n\tfor (const [id, value] of Object.entries(next)) {\n\t\tchanges.push({ id, value });\n\t}\n\treturn changes;\n};\n\n/**\n * JSON 形式でブックデータのインポート・エクスポートを行うパネル。\n *\n * @remarks\n * **Shell** — `OtherPanel` のデフォルトセクションとして使用される。\n */\nexport const ImportExportPanel: React.FC<ImportExportPanelProps> = ({\n\tbook,\n\tvalues,\n\tonBookChange,\n\tonValuesChange,\n}) => {\n\tconst [error, setError] = useState<string>(\"\");\n\tconst bookFileInputRef = useRef<HTMLInputElement>(null);\n\tconst valuesFileInputRef = useRef<HTMLInputElement>(null);\n\n\tconst handleExportBookFile = useCallback(() => {\n\t\ttry {\n\t\t\tconst json = serializeBook(book);\n\t\t\tconst blob = new Blob([json], { type: \"application/json\" });\n\t\t\tconst url = URL.createObjectURL(blob);\n\t\t\tconst a = document.createElement(\"a\");\n\t\t\ta.href = url;\n\t\t\ta.download = \"book.json\";\n\t\t\ta.click();\n\t\t\tURL.revokeObjectURL(url);\n\t\t\tsetError(\"\");\n\t\t} catch (err) {\n\t\t\tsetError(\n\t\t\t\t`エクスポートエラー: ${err instanceof Error ? err.message : String(err)}`,\n\t\t\t);\n\t\t}\n\t}, [book]);\n\n\tconst handleExportBookClipboard = useCallback(async () => {\n\t\ttry {\n\t\t\tconst json = serializeBook(book);\n\t\t\tawait navigator.clipboard.writeText(json);\n\t\t\tsetError(\"\");\n\t\t\talert(\"ブックをクリップボードにコピーしました\");\n\t\t} catch (err) {\n\t\t\tsetError(\n\t\t\t\t`クリップボードエラー: ${err instanceof Error ? err.message : String(err)}`,\n\t\t\t);\n\t\t}\n\t}, [book]);\n\n\tconst importBookFromJson = useCallback(\n\t\t(json: string) => {\n\t\t\tconst newBook = deserializeBook(json);\n\t\t\tonBookChange(newBook);\n\t\t},\n\t\t[onBookChange],\n\t);\n\n\tconst handleImportBookFile = useCallback(() => {\n\t\tbookFileInputRef.current?.click();\n\t}, []);\n\n\tconst handleBookFileChange = useCallback(\n\t\t(event: React.ChangeEvent<HTMLInputElement>) => {\n\t\t\tconst file = event.target.files?.[0];\n\t\t\tif (!file) return;\n\t\t\tconst reader = new FileReader();\n\t\t\treader.onload = (e) => {\n\t\t\t\ttry {\n\t\t\t\t\timportBookFromJson(e.target?.result as string);\n\t\t\t\t\tsetError(\"\");\n\t\t\t\t\talert(\"インポートしました\");\n\t\t\t\t} catch (err) {\n\t\t\t\t\tsetError(\n\t\t\t\t\t\t`インポートエラー: ${err instanceof Error ? err.message : String(err)}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t};\n\t\t\treader.readAsText(file);\n\t\t\tevent.target.value = \"\";\n\t\t},\n\t\t[importBookFromJson],\n\t);\n\n\tconst handleImportBookClipboard = useCallback(async () => {\n\t\ttry {\n\t\t\tconst json = await navigator.clipboard.readText();\n\t\t\timportBookFromJson(json);\n\t\t\tsetError(\"\");\n\t\t\talert(\"インポートしました\");\n\t\t} catch (err) {\n\t\t\tsetError(\n\t\t\t\t`インポートエラー: ${err instanceof Error ? err.message : String(err)}`,\n\t\t\t);\n\t\t}\n\t}, [importBookFromJson]);\n\n\tconst handleExportValuesFile = useCallback(() => {\n\t\ttry {\n\t\t\tconst json = JSON.stringify(values, null, 2);\n\t\t\tconst blob = new Blob([json], { type: \"application/json\" });\n\t\t\tconst url = URL.createObjectURL(blob);\n\t\t\tconst a = document.createElement(\"a\");\n\t\t\ta.href = url;\n\t\t\ta.download = \"values.json\";\n\t\t\ta.click();\n\t\t\tURL.revokeObjectURL(url);\n\t\t\tsetError(\"\");\n\t\t} catch (err) {\n\t\t\tsetError(\n\t\t\t\t`エクスポートエラー: ${err instanceof Error ? err.message : String(err)}`,\n\t\t\t);\n\t\t}\n\t}, [values]);\n\n\tconst handleExportValuesClipboard = useCallback(async () => {\n\t\ttry {\n\t\t\tconst json = JSON.stringify(values, null, 2);\n\t\t\tawait navigator.clipboard.writeText(json);\n\t\t\tsetError(\"\");\n\t\t\talert(\"値をクリップボードにコピーしました\");\n\t\t} catch (err) {\n\t\t\tsetError(\n\t\t\t\t`クリップボードエラー: ${err instanceof Error ? err.message : String(err)}`,\n\t\t\t);\n\t\t}\n\t}, [values]);\n\n\tconst handleImportValuesFile = useCallback(() => {\n\t\tvaluesFileInputRef.current?.click();\n\t}, []);\n\n\tconst handleValuesFileChange = useCallback(\n\t\t(event: React.ChangeEvent<HTMLInputElement>) => {\n\t\t\tconst file = event.target.files?.[0];\n\t\t\tif (!file) return;\n\t\t\tconst reader = new FileReader();\n\t\t\treader.onload = (e) => {\n\t\t\t\ttry {\n\t\t\t\t\tconst newValues = deserializeValues(e.target?.result as string);\n\t\t\t\t\tconst changes = computeValueChanges(values, newValues);\n\t\t\t\t\tonValuesChange(changes);\n\t\t\t\t\tsetError(\"\");\n\t\t\t\t\talert(\"値をインポートしました\");\n\t\t\t\t} catch (err) {\n\t\t\t\t\tsetError(\n\t\t\t\t\t\t`インポートエラー: ${err instanceof Error ? err.message : String(err)}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t};\n\t\t\treader.readAsText(file);\n\t\t\tevent.target.value = \"\";\n\t\t},\n\t\t[onValuesChange, values],\n\t);\n\n\tconst handleImportValuesClipboard = useCallback(async () => {\n\t\ttry {\n\t\t\tconst json = await navigator.clipboard.readText();\n\t\t\tconst newValues = deserializeValues(json);\n\t\t\tconst changes = computeValueChanges(values, newValues);\n\t\t\tonValuesChange(changes);\n\t\t\tsetError(\"\");\n\t\t\talert(\"値をインポートしました\");\n\t\t} catch (err) {\n\t\t\tsetError(\n\t\t\t\t`クリップボードエラー: ${err instanceof Error ? err.message : String(err)}`,\n\t\t\t);\n\t\t}\n\t}, [onValuesChange, values]);\n\n\t// ─── Schema (Page) import/export ─────────────────────────────────────\n\tconst schemaFileInputRef = useRef<HTMLInputElement>(null);\n\n\tconst handleExportSchemaFile = useCallback(() => {\n\t\ttry {\n\t\t\tconst page = book.pages[0];\n\t\t\tconst schemaJson = JSON.stringify(\n\t\t\t\t{ grid: page.grid, blocks: page.blocks },\n\t\t\t\tnull,\n\t\t\t\t2,\n\t\t\t);\n\t\t\tconst blob = new Blob([schemaJson], { type: \"application/json\" });\n\t\t\tconst url = URL.createObjectURL(blob);\n\t\t\tconst a = document.createElement(\"a\");\n\t\t\ta.href = url;\n\t\t\ta.download = \"schema.json\";\n\t\t\ta.click();\n\t\t\tURL.revokeObjectURL(url);\n\t\t\tsetError(\"\");\n\t\t} catch (err) {\n\t\t\tsetError(\n\t\t\t\t`エクスポートエラー: ${err instanceof Error ? err.message : String(err)}`,\n\t\t\t);\n\t\t}\n\t}, [book]);\n\n\tconst handleImportSchemaFile = useCallback(() => {\n\t\tschemaFileInputRef.current?.click();\n\t}, []);\n\n\tconst handleSchemaFileChange = useCallback(\n\t\t(event: React.ChangeEvent<HTMLInputElement>) => {\n\t\t\tconst file = event.target.files?.[0];\n\t\t\tif (!file) return;\n\t\t\tconst reader = new FileReader();\n\t\t\treader.onload = (e) => {\n\t\t\t\ttry {\n\t\t\t\t\tconst raw = JSON.parse(e.target?.result as string);\n\t\t\t\t\tconst newPage = migratePage({\n\t\t\t\t\t\tgrid: raw.grid,\n\t\t\t\t\t\tblocks: raw.blocks ?? [],\n\t\t\t\t\t\t...(raw.metaData !== undefined ? { metaData: raw.metaData } : {}),\n\t\t\t\t\t\t...(raw.blockDefaults !== undefined\n\t\t\t\t\t\t\t? { blockDefaults: raw.blockDefaults }\n\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t});\n\t\t\t\t\tconst newPages = [...book.pages] as typeof book.pages;\n\t\t\t\t\tnewPages[0] = newPage;\n\t\t\t\t\tonBookChange({ ...book, pages: newPages });\n\t\t\t\t\tsetError(\"\");\n\t\t\t\t\talert(\"スキーマをインポートしました\");\n\t\t\t\t} catch (err) {\n\t\t\t\t\tsetError(\n\t\t\t\t\t\t`インポートエラー: ${err instanceof Error ? err.message : String(err)}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t};\n\t\t\treader.readAsText(file);\n\t\t\tevent.target.value = \"\";\n\t\t},\n\t\t[book, onBookChange],\n\t);\n\n\treturn (\n\t\t<>\n\t\t\t<CollapsibleSection title=\"ブック\">\n\t\t\t\t<div className={styles.buttonGroup}>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclassName={styles.button}\n\t\t\t\t\t\tdata-testid=\"export-book-file\"\n\t\t\t\t\t\tonClick={handleExportBookFile}\n\t\t\t\t\t>\n\t\t\t\t\t\t📥 ファイルにエクスポート\n\t\t\t\t\t</button>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclassName={styles.button}\n\t\t\t\t\t\tdata-testid=\"export-book-clipboard\"\n\t\t\t\t\t\tonClick={handleExportBookClipboard}\n\t\t\t\t\t>\n\t\t\t\t\t\t📋 クリップボードにコピー\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t\t<div className={styles.buttonGroup}>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclassName={styles.button}\n\t\t\t\t\t\tdata-testid=\"import-book-file\"\n\t\t\t\t\t\tonClick={handleImportBookFile}\n\t\t\t\t\t>\n\t\t\t\t\t\t📤 ファイルからインポート\n\t\t\t\t\t</button>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclassName={styles.button}\n\t\t\t\t\t\tdata-testid=\"import-book-clipboard\"\n\t\t\t\t\t\tonClick={handleImportBookClipboard}\n\t\t\t\t\t>\n\t\t\t\t\t\t📋 クリップボードからペースト\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t\t<input\n\t\t\t\t\tref={bookFileInputRef}\n\t\t\t\t\ttype=\"file\"\n\t\t\t\t\taccept=\".json\"\n\t\t\t\t\tstyle={{ display: \"none\" }}\n\t\t\t\t\tonChange={handleBookFileChange}\n\t\t\t\t/>\n\t\t\t</CollapsibleSection>\n\n\t\t\t<CollapsibleSection title=\"値\">\n\t\t\t\t<div className={styles.buttonGroup}>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclassName={styles.button}\n\t\t\t\t\t\tdata-testid=\"export-values-file\"\n\t\t\t\t\t\tonClick={handleExportValuesFile}\n\t\t\t\t\t>\n\t\t\t\t\t\t📥 ファイルにエクスポート\n\t\t\t\t\t</button>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclassName={styles.button}\n\t\t\t\t\t\tdata-testid=\"export-values-clipboard\"\n\t\t\t\t\t\tonClick={handleExportValuesClipboard}\n\t\t\t\t\t>\n\t\t\t\t\t\t📋 クリップボードにコピー\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t\t<div className={styles.buttonGroup}>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclassName={styles.button}\n\t\t\t\t\t\tdata-testid=\"import-values-file\"\n\t\t\t\t\t\tonClick={handleImportValuesFile}\n\t\t\t\t\t>\n\t\t\t\t\t\t📤 ファイルからインポート\n\t\t\t\t\t</button>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclassName={styles.button}\n\t\t\t\t\t\tdata-testid=\"import-values-clipboard\"\n\t\t\t\t\t\tonClick={handleImportValuesClipboard}\n\t\t\t\t\t>\n\t\t\t\t\t\t📋 クリップボードからペースト\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t\t<input\n\t\t\t\t\tref={valuesFileInputRef}\n\t\t\t\t\ttype=\"file\"\n\t\t\t\t\taccept=\".json\"\n\t\t\t\t\tstyle={{ display: \"none\" }}\n\t\t\t\t\tonChange={handleValuesFileChange}\n\t\t\t\t/>\n\t\t\t</CollapsibleSection>\n\n\t\t\t<CollapsibleSection title=\"スキーマ\">\n\t\t\t\t<div className={styles.buttonGroup}>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclassName={styles.button}\n\t\t\t\t\t\tdata-testid=\"export-schema-file\"\n\t\t\t\t\t\tonClick={handleExportSchemaFile}\n\t\t\t\t\t>\n\t\t\t\t\t\t📥 スキーマをエクスポート\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t\t<div className={styles.buttonGroup}>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclassName={styles.button}\n\t\t\t\t\t\tdata-testid=\"import-schema-file\"\n\t\t\t\t\t\tonClick={handleImportSchemaFile}\n\t\t\t\t\t>\n\t\t\t\t\t\t📤 スキーマをインポート\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t\t<input\n\t\t\t\t\tref={schemaFileInputRef}\n\t\t\t\t\ttype=\"file\"\n\t\t\t\t\taccept=\".json\"\n\t\t\t\t\tstyle={{ display: \"none\" }}\n\t\t\t\t\tonChange={handleSchemaFileChange}\n\t\t\t\t/>\n\t\t\t</CollapsibleSection>\n\n\t\t\t{error && (\n\t\t\t\t<div className={styles.error} role=\"alert\">\n\t\t\t\t\t{error}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</>\n\t);\n};\n\nImportExportPanel.displayName = \"ImportExportPanel\";\n","import { TabPanel } from \"../../ui\";\nimport { ImportExportPanel } from \"./ImportExportPanel\";\n\nimport type React from \"react\";\nimport type { ReactNode } from \"react\";\nimport type { NoteContext } from \"../../../contexts/useNoteContext\";\n\n/**\n * `OtherPanel` コンポーネントへの props。\n */\nexport interface OtherPanelProps {\n\t/** NoteContext(`useNoteContext` が返すコンテキスト) */\n\tcontext: NoteContext;\n\n\t/** カスタムセクションの配列。未指定時はデフォルト構成(`ImportExportPanel`)が使用される */\n\tsections?: ReactNode[];\n}\n\n/**\n * その他設定パネル。インポート・エクスポートなどを含む。\n *\n * @remarks\n * **Shell** — `sections` で内容をカスタマイズできる。\n */\nexport const OtherPanel: React.FC<OtherPanelProps> = ({\n\tcontext,\n\tsections,\n}) => {\n\tconst defaultSections: ReactNode[] = [\n\t\t<ImportExportPanel\n\t\t\tkey=\"import-export\"\n\t\t\tbook={context.book}\n\t\t\tvalues={context.values}\n\t\t\tonBookChange={context.onBookChange}\n\t\t\tonValuesChange={context.onValuesChange ?? (() => {})}\n\t\t/>,\n\t];\n\n\tconst activeSections = sections ?? defaultSections;\n\n\treturn <TabPanel>{activeSections}</TabPanel>;\n};\n\nOtherPanel.displayName = \"OtherPanel\";\n","import { useCallback, useMemo } from \"react\";\n\nimport { useGridCalc } from \"../../../canvas/layers/GridLayer/hooks\";\nimport { NoteMode } from \"../../../types\";\nimport { DEFAULT_GRID } from \"../../../types/grid\";\nimport { startBlockDrag } from \"../../../utils/blockDrag\";\nimport styles from \"./PalettePanel.module.css\";\n\nimport type React from \"react\";\nimport type { NoteContext } from \"../../../contexts/useNoteContext\";\nimport type { ResolvedPlugin } from \"../../../plugin\";\nimport type { Value } from \"../../../types\";\nimport type { Block } from \"../../../types/block\";\n\n/**\n * `PalettePanel` コンポーネントへの props。\n */\nexport interface PalettePanelProps {\n\t/** NoteContext(`useNoteContext` が返すコンテキスト) */\n\tcontext: NoteContext;\n\n\t/** カスタムクラス名 */\n\tclassName?: string;\n}\n\n/**\n * ブロックをドラッグ&ドロップで挿入するためのパレットパネル。\n *\n * @remarks\n * **Shell** — ブロック未選択時にサイドバーに表示される。\n */\nexport const PalettePanel = ({ context, className }: PalettePanelProps) => {\n\tconst plugins = Object.values(context.pluginRegistry).filter(\n\t\t(p): p is ResolvedPlugin => p !== undefined,\n\t);\n\n\tconst currentPage = context.book.pages[context.editorState.pageIdx];\n\tconst { getBlockRectPx } = useGridCalc(\n\t\tcontext.book.paper,\n\t\tcurrentPage?.grid ?? DEFAULT_GRID,\n\t);\n\n\treturn (\n\t\t<div className={`${styles.container} ${className || \"\"}`}>\n\t\t\t<div className={styles.paletteItems}>\n\t\t\t\t{plugins.map((plugin) => {\n\t\t\t\t\tconst dSize = plugin.meta.defaultSize ?? { w: 1, h: 1 };\n\t\t\t\t\tconst rect = getBlockRectPx({\n\t\t\t\t\t\tid: \"ghost\",\n\t\t\t\t\t\tkind: plugin.kind,\n\t\t\t\t\t\tlayout: { x: 0, y: 0, w: dSize.w, h: dSize.h },\n\t\t\t\t\t\tprops: {},\n\t\t\t\t\t});\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<PaletteItem\n\t\t\t\t\t\t\tkey={plugin.kind}\n\t\t\t\t\t\t\tplugin={plugin}\n\t\t\t\t\t\t\tghostWidth={rect.width}\n\t\t\t\t\t\t\tghostHeight={rect.height}\n\t\t\t\t\t\t/>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nPalettePanel.displayName = \"PalettePanel\";\n\n/**\n * 個々のブロックアイテムの Props。\n *\n * @internal\n */\ninterface PaletteItemProps {\n\tplugin: ResolvedPlugin;\n\tghostWidth: number;\n\tghostHeight: number;\n}\n\nconst PaletteItem = ({ plugin, ghostWidth, ghostHeight }: PaletteItemProps) => {\n\t// プレビュー用のブロックオブジェクトを生成(canvas レイヤーへの依存を避けるため inline で生成)\n\tconst previewBlock = useMemo((): Block => {\n\t\treturn {\n\t\t\tid: `preview-${plugin.kind}`,\n\t\t\tkind: plugin.kind,\n\t\t\tlayout: {\n\t\t\t\tx: 0,\n\t\t\t\ty: 0,\n\t\t\t\tw: plugin.meta.defaultSize?.w ?? 1,\n\t\t\t\th: plugin.meta.defaultSize?.h ?? 1,\n\t\t\t},\n\t\t\tprops: {},\n\t\t};\n\t}, [plugin]);\n\n\t// プレビュー表示用のデフォルト値(パレットは外観確認のみのためnullで統一)\n\tconst previewValue: Value = null;\n\n\tconst handleDragStart = useCallback(\n\t\t(e: React.DragEvent<HTMLElement>) => {\n\t\t\tstartBlockDrag(e, plugin.kind, plugin.meta.defaultSize ?? { w: 1, h: 1 });\n\t\t\t// キャンバス側にゴーストが表示されるため、ドラッグ元はシンプルな半透明四角形にする\n\t\t\tconst w = Math.round(ghostWidth);\n\t\t\tconst h = Math.round(ghostHeight);\n\t\t\tconst ghost = document.createElement(\"div\");\n\t\t\tghost.style.cssText = `position:fixed;top:-9999px;left:-9999px;width:${w}px;height:${h}px;background:rgba(147,197,253,0.45);border-radius:4px;`;\n\t\t\tdocument.body.appendChild(ghost);\n\t\t\te.dataTransfer.setDragImage(ghost, w / 2, h / 2);\n\t\t\trequestAnimationFrame(() => document.body.removeChild(ghost));\n\t\t},\n\t\t[plugin, ghostWidth, ghostHeight],\n\t);\n\n\treturn (\n\t\t<div className={styles.item} data-testid={`palette-item-${plugin.kind}`}>\n\t\t\t{/* ドラッグ可能なヘッダー部分 */}\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tdraggable\n\t\t\t\tonDragStart={handleDragStart}\n\t\t\t\tclassName={styles.itemName}\n\t\t\t\taria-label={`${plugin.meta.displayName}ブロックを追加`}\n\t\t\t>\n\t\t\t\t{plugin.meta.displayName}\n\t\t\t</button>\n\t\t\t{/* プレビュー部分(非インタラクティブ) */}\n\t\t\t<div\n\t\t\t\tclassName={styles.itemPreview}\n\t\t\t\tdraggable\n\t\t\t\tonDragStart={handleDragStart}\n\t\t\t\taria-hidden=\"true\"\n\t\t\t>\n\t\t\t\t<plugin.Renderer\n\t\t\t\t\tid={previewBlock.id}\n\t\t\t\t\tprops={previewBlock.props}\n\t\t\t\t\tvalue={previewValue}\n\t\t\t\t\tonChange={() => {\n\t\t\t\t\t\t/* プレビューなので変更不可 */\n\t\t\t\t\t}}\n\t\t\t\t\treadOnly={true}\n\t\t\t\t\tmode={NoteMode.FORM}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nPaletteItem.displayName = \"PaletteItem\";\n"],"names":["ActionBarDivider","_props","styles","UndoIcon","size","rest","jsxs","jsx","RedoIcon","TrashIcon","CopyIcon","PasteIcon","DuplicateIcon","PrintIcon","StyleIcon","LayoutIcon","BlockSettingsIcon","ChevronLeftIcon","ChevronRightIcon","AddPageIcon","DeletePageIcon","ACTION_FEEDBACK_MAP","getActionFeedback","actionId","Checkbox","value","onChange","readOnly","propLabel","config","label","handleChange","useCallback","e","CollapsibleSection","title","children","collapsible","defaultCollapsed","isOpenProp","onOpenChange","description","actions","openLabel","closeLabel","noPadding","isCollapsedInternal","setIsCollapsedInternal","useState","isControlled","isCollapsed","handleToggle","nextOpen","showContent","contentClass","statusLabel","parseColor","hexMatch","hex","r","g","b","a","rgbaMatch","toHex","rgba","rHex","gHex","bHex","aHex","COLOR_PALETTE","ColorPalette","onColorSelect","selectedColor","color","index","isUndefined","isSelected","buttonStyle","NumberInput","propMin","propMax","propStep","propInteger","propPlaceholder","propWidth","propHeight","ariaLabel","onBlur","min","max","step","integer","placeholder","width","height","text","num","style","RGBAInputs","v","ColorPickerPopover","isOpen","onClose","onRgbaChange","popoverRef","useRef","useEffect","handleClickOutside","Z_INDEX","ColorPicker","showTextInput","propAllowUndefined","allowUndefined","setIsOpen","containerRef","rgbaValues","setRgbaValues","parsed","handleColorButtonClick","prev","textInputValue","setTextInputValue","handleTextChange","confirmTextInput","handleTextBlur","handleTextKeyDown","handlePaletteClick","colorValue","handleRgbaChange","channel","newValue","newRgba","displayText","colorStyle","containerStyle","DimensionInput","props","allowedUnits","currentUnit","handleValueChange","inputValue","unit","effectiveMin","handleBlur","handleUnitChange","newUnit","displayValue","displayUnit","u","Dropdown","options","allowEmpty","selectedValue","option","opt","hasValue","elementStyle","IconActionButton","icon","onClick","onMouseEnter","disabled","preventFocusOnMouseDown","TabPanel","emptyMessage","className","TabsContext","createContext","Tabs","defaultValue","propValue","onValueChange","variant","localValue","setLocalValue","TabsList","propStyle","context","useContext","computedStyle","TabsTrigger","TabsContent","TextInput","propMaxLength","propMultiline","propRows","maxLength","multiline","rows","commonProps","CanvasActionSection","actionContext","onActionFeedback","onPrint","resolvedCanUndo","resolvedCanRedo","resolvedHasCopied","runAction","feedback","Fragment","DEFAULT_DIMENSION","GridSettingsSection","grid","onGridChange","handleColsChange","newColCount","currentCols","expandSparseCols","currentColCount","newCols","i","colsToSparse","handleRowsChange","newRowCount","currentRows","expandSparseRows","currentRowCount","newRows","rowsToSparse","mmToUnit","mm","PRESET_OPTIONS","PaperSizePreset","PaperSettingsSection","paper","onPaperChange","isCustom","isFit","isWidthFit","handlePresetChange","preset","DEFAULT_PAPER_SIZES","handleWidthValueChange","target","val","minMm","toMm","minVal","newSize","handleHeightValueChange","handleHeightModeToggle","handleWidthModeToggle","setNestedValue","obj","path","keys","update","current","depth","key","_","nextValue","updated","getCommonValue","blocks","getValueByPath","firstValue","block","getPreviewSvgLines","borderStyle","w","h","lines","edgeLines","x1","y1","x2","y2","strokeW","_a","_b","dasharray","LineType","resolveBorderStyle","border","resolveEdge","edgeKey","edgeVal","result","BackgroundBorderPanel","selectedBlocks","onUpdateBlocks","handleBgColor","updates","handleBorderChange","edge","prop","edges","newStyle","currentBorder","edgeStyle","_c","previewBgColor","previewBorderStyle","useMemo","firstBlock","previewSvgLines","readEdge","renderInputs","BORDER_UNITS","triggerStyle","LayoutPanel","gridSize","isMultipleSelection","minX","minY","currentMin","maxX","maxY","boundingW","boundingH","clampedVal","offset","maxW","maxH","layoutPanelKey","AlignmentToggle","memo","isActive","DEFAULT_STYLE","checkboxStyleProp","labelStyle","rowStyle","CheckboxStyleEditor","checked","ClassicCheckboxVisual","BUTTONS","FontDecorationToggle","DEFAULT_FONT_FAMILY","FontStyleEditor","handleFontFamily","handleFontSize","handleColor","handleDecoration","decorationValue","FONT_UNITS","OptionsEditor","uid","useId","duplicateIndices","seen","dupes","handleAdd","newOption","handleRemove","handleLabelChange","newLabel","handleColorChange","newColor","handleAllowEmptyChange","inputStyle","PaddingLinkCheckbox","bulk","ZERO","PaddingEditor","handleBulkChange","handleAll","all","handleTop","top","handleRight","right","handleBottom","bottom","handleLeft","left","PADDING_UNITS","DEFAULT","textBehaviorProp","WORD_WRAP_OPTIONS","WordWrap","TextBehaviorEditor","lineHeight","wordWrap","COMBINED_OPTIONS","COMBINED_DROPDOWN_OPTIONS","o","PATTERN_HELP","TextValidationEditor","inputType","minLength","pattern","onChangeBatch","tooltipVisible","setTooltipVisible","tooltipStyle","setTooltipStyle","infoBtnRef","showTooltip","rect","hideTooltip","resolvedInputType","resolvedPattern","currentLabel","match","currentOpt","showLength","handleCombinedChange","nextPattern","k","createPortal","KIND_TITLES","HORIZONTAL_OPTIONS","HorizontalAlign","VERTICAL_OPTIONS","VerticalAlign","isDimension","isSelectOptionsConfig","PropDefEditor","kind","defaultProps","getVal","component","hValue","vValue","fontSizeRaw","fontStyleValue","rawTop","rawRight","rawBottom","rawLeft","rawBulk","rawAll","paddingValue","required","rawCfg","cfg","CustomComponent","primaryKey","rawVal","strVal","PropertyField","propDef","blockDefaults","onResetToDefault","primaryBlock","blockKind","isOverridden","handleOpenChange","open","defaults","PluginPanels","pluginRegistry","showGroupHeader","plugin","blockUpdates","handleChangeBatch","handleResetToDefault","newProps","fields","SelectionActionBarButton","SelectionActionBarContext","useSelectionActionBar","ctx","SelectionActionBar","items","onPointerDown","openPanel","setOpenPanel","wrapperEl","setWrapperEl","closeTimerRef","clearCloseTimer","handleWrapperMouseEnter","handleWrapperMouseLeave","handleMouseDown","openPanelByHover","panelId","openPanelByClick","SelectionActionBarPanel","id","getDefaultSelectionActionBarItems","editorState","selectedBlockIds","hasCopied","pageIdx","hasSelection","canPanel","canPlugin","runWithFeedback","fn","BAR_MARGIN","BAR_HEIGHT","SelectionActionBarOverlay","selectionBoundingBox","isDragging","zIndex","bbox","barTopAbove","barTop","overlayStyle","barStyle","useSelectionBounds","bounds","setBounds","rafId","container","containerRect","minLeft","minTop","maxRight","maxBottom","found","el","validateBlockId","currentId","allBlockIds","trimmed","MetaPanel","localId","setLocalId","idError","setIdError","handleIdBlur","newId","handleIdChange","newVal","handleReadOnlyChange","handleHeightFitChange","handleWidthFitChange","BlockPropertyPanel","DefaultBlockPropertyPanel","page","allSameKind","firstKind","DefaultsPropField","kindDefaults","onKindDefaultsChange","merged","pruned","BlockDefaultsPanel","pluginKinds","selectedKind","setSelectedKind","handleKindDefaultsChange","newKindDefaults","newBlockDefaults","p","BlockOrderPanel","onBlocksChange","onBlockHover","onBlockDragChange","draggedBlockId","setDraggedBlockId","previewInsertIndex","setPreviewInsertIndex","originalBlocksRef","dragStartDisplayIndexRef","displayBlocks","draggedIndex","idx","previewBlocks","draggedItem","clampedIndex","handleBringToFront","blockId","newBlocks","handleSendToBack","handleBringForward","temp","next","handleSendBackward","handleDragStart","displayIndex","actualIndex","handleDragEnd","handleDragOver","previewIndex","ghostPos","withoutIndex","mid","newInsertIndex","originalBlocks","originalDisplay","without","clamp","preview","handleDragLeave","handleDrop","finalBlocks","originalDisplayIndex","isGhost","CanvasActionPanel","canUndo","canRedo","CanvasPanel","GridSizePanel","MarginPanel","linkMargins","setLinkMargins","handleTopChange","newMargin","handleRightChange","handleBottomChange","handleLeftChange","PaperSizePanel","presetOptions","handleOrientationChange","landscape","handleWidthChange","handleHeightChange","heightLabel","widthLabel","minWidth","minHeight","DefaultCanvasPanel","book","onBookChange","handlePaperChange","newPaper","handleGridChange","newGrid","newPages","pg","gridSizeKey","handleBlocksChange","handleBlockDefaultsChange","computeValueChanges","changes","ImportExportPanel","values","onValuesChange","error","setError","bookFileInputRef","valuesFileInputRef","handleExportBookFile","json","serializeBook","blob","url","err","handleExportBookClipboard","importBookFromJson","newBook","deserializeBook","handleImportBookFile","handleBookFileChange","event","file","reader","handleImportBookClipboard","handleExportValuesFile","handleExportValuesClipboard","handleImportValuesFile","handleValuesFileChange","newValues","deserializeValues","handleImportValuesClipboard","schemaFileInputRef","handleExportSchemaFile","schemaJson","handleImportSchemaFile","handleSchemaFileChange","raw","newPage","migratePage","OtherPanel","sections","defaultSections","activeSections","PalettePanel","plugins","currentPage","getBlockRectPx","useGridCalc","DEFAULT_GRID","dSize","PaletteItem","ghostWidth","ghostHeight","previewBlock","previewValue","startBlockDrag","ghost","NoteMode"],"mappings":"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"}
|