@tatamicks/core 1.0.2 → 1.0.4
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-BTB1LkgU.cjs +9 -0
- package/dist/PalettePanel-BTB1LkgU.cjs.map +1 -0
- package/dist/{PalettePanel-Cigl9i1N.js → PalettePanel-CrA2BGLq.js} +961 -959
- package/dist/PalettePanel-CrA2BGLq.js.map +1 -0
- package/dist/PalettePanel.css +1 -1
- package/dist/canvas.cjs +1 -1
- package/dist/canvas.mjs +4 -4
- package/dist/index.cjs +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.css +1 -1
- package/dist/index.mjs +352 -343
- package/dist/index.mjs.map +1 -1
- package/dist/{paperSettingsWidget-DvtghSA5.js → paperSettingsWidget-CAIw_Ofm.js} +1582 -1535
- package/dist/paperSettingsWidget-CAIw_Ofm.js.map +1 -0
- package/dist/paperSettingsWidget-CIRKgnz4.cjs +2 -0
- package/dist/paperSettingsWidget-CIRKgnz4.cjs.map +1 -0
- package/dist/shell.cjs +1 -1
- package/dist/shell.mjs +2 -2
- package/dist/sidebarPortal-Bigm11qq.js +880 -0
- package/dist/sidebarPortal-Bigm11qq.js.map +1 -0
- package/dist/sidebarPortal-Dit8f3sD.cjs +3 -0
- package/dist/sidebarPortal-Dit8f3sD.cjs.map +1 -0
- package/dist/src/canvas.d.ts +4 -0
- package/dist/src/index.d.ts +5 -3
- package/dist/src/shell.d.ts +3 -1
- package/package.json +1 -1
- package/dist/PalettePanel-BMZ6dfI3.cjs +0 -9
- package/dist/PalettePanel-BMZ6dfI3.cjs.map +0 -1
- package/dist/PalettePanel-Cigl9i1N.js.map +0 -1
- package/dist/paperSettingsWidget-7766a5Fe.cjs +0 -2
- package/dist/paperSettingsWidget-7766a5Fe.cjs.map +0 -1
- package/dist/paperSettingsWidget-DvtghSA5.js.map +0 -1
- package/dist/sidebarPortal-BN6FVwaF.js +0 -870
- package/dist/sidebarPortal-BN6FVwaF.js.map +0 -1
- package/dist/sidebarPortal-Cr-dLvA_.cjs +0 -3
- package/dist/sidebarPortal-Cr-dLvA_.cjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PalettePanel-Cigl9i1N.js","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","PalettePanel","plugins","currentPage","getBlockRectPx","useGridCalc","DEFAULT_GRID","dSize","PaletteItem","ghostWidth","ghostHeight","previewBlock","previewValue","startBlockDrag","ghost","NoteMode"],"mappings":"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"}
|