@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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paperSettingsWidget-CAIw_Ofm.js","sources":["../src/plugin/properties/fontStyle.ts","../src/plugin/properties/padding.ts","../src/plugin/properties/placeholder.ts","../src/plugin/properties/required.ts","../src/types/validation.ts","../src/plugin/validation.ts","../src/utils/block/index.ts","../src/types/schema.ts","../src/utils/zIndex/helpers.ts","../src/utils/book/index.ts","../src/utils/print/index.ts","../src/canvas/blocks/checkbox/renderer.tsx","../src/canvas/blocks/checkbox/plugin.ts","../src/canvas/blocks/select/props.ts","../src/canvas/blocks/select/renderer.tsx","../src/canvas/blocks/select/plugin.ts","../src/canvas/blocks/text/renderer.tsx","../src/canvas/blocks/text/plugin.ts","../src/contexts/action/useBookActionContext.ts","../src/contexts/binding/useBookBindingContext.ts","../src/contexts/history/useBookHistory.ts","../src/canvas/layers/BlockLayer/borderUtils.ts","../src/canvas/layers/BlockLayer/BlockBorder.tsx","../src/canvas/layers/BlockLayer/BlockCanvas.tsx","../src/canvas/layers/BlockLayer/BlockGuideBorder.tsx","../src/canvas/layers/BlockLayer/BlockRenderer.tsx","../src/canvas/layers/BlockLayer/utils/resolveBlockProps.ts","../src/canvas/layers/BlockLayer/ValidationOverlay.tsx","../src/canvas/layers/BlockLayer/BlockContainer.tsx","../src/canvas/layers/BlockLayer/BlockLayer.tsx","../src/canvas/layers/GridLayer/utils/getStrokeDasharray.ts","../src/canvas/layers/GridLayer/BorderOverlay.tsx","../src/canvas/layers/GridLayer/GridCanvas.tsx","../src/canvas/layers/GridLayer/GridDimensionLabel/GridUnitEditor.tsx","../src/canvas/layers/GridLayer/GridDimensionLabel/GridDimensionLabel.tsx","../src/canvas/layers/GridLayer/utils/getGridPathD.ts","../src/canvas/layers/GridLayer/GridOverlay.tsx","../src/canvas/layers/GridLayer/GridResizeHandle/GridResizeHandle.tsx","../src/canvas/layers/GridLayer/MarginOverlay.tsx","../src/canvas/layers/GridLayer/GridLayer.tsx","../src/canvas/layers/InteractionLayer/hooks/useInteractionState.ts","../src/canvas/layers/InteractionLayer/types.ts","../src/canvas/layers/InteractionLayer/utils/calcResize.ts","../src/canvas/layers/InteractionLayer/utils/clampMultipleBlocks.ts","../src/canvas/layers/InteractionLayer/utils/createBlock.ts","../src/canvas/layers/InteractionLayer/DragLayer.tsx","../src/canvas/layers/InteractionLayer/EditingBlock.tsx","../src/canvas/layers/InteractionLayer/InteractionBlock.tsx","../src/canvas/layers/InteractionLayer/SelectionLayer.tsx","../src/canvas/layers/InteractionLayer/utils/clampBlock.ts","../src/canvas/layers/InteractionLayer/utils/duplicateOffset.ts","../src/canvas/layers/InteractionLayer/utils/hitTest.ts","../src/canvas/layers/InteractionLayer/InteractionLayer.tsx","../src/plugin/context.ts","../src/utils/grid/calcGridSize.ts","../src/note/hooks/useNoteLayout.ts","../src/note/NoteEdit/NoteEdit.tsx","../src/note/NoteForm/NoteForm.tsx","../src/note/NoteView/NoteView.tsx","../src/note/Note/Note.tsx","../src/canvas/blocks/button/execute.ts","../src/canvas/blocks/button/props.ts","../src/canvas/blocks/button/renderer.tsx","../src/canvas/blocks/button/plugin.ts","../src/canvas/widgets/primitives/numberInputBlock.ts","../src/canvas/widgets/primitives/unitSelectBlock.ts","../src/canvas/blocks/stepper/props.ts","../src/canvas/blocks/stepper/step.ts","../src/canvas/blocks/stepper/renderer.tsx","../src/canvas/blocks/stepper/plugin.ts","../src/canvas/widgets/grid/gridSettingsWidget.ts","../src/canvas/blocks/note/renderer.tsx","../src/canvas/blocks/note/plugin.ts","../src/canvas/widgets/paper/paperSettingsWidget.ts"],"sourcesContent":["import type { Dimension, FontUnit } from \"../../types\";\nimport type { PropDef } from \"../types\";\n\n/**\n * ブロック内のフォントスタイルを保持する Props。\n */\nexport interface FontStyleProps {\n\t/** フォントファミリー */\n\tfontFamily?: string;\n\n\t/** フォントサイズ */\n\tfontSize?: Dimension<FontUnit>;\n\n\t/** 文字色(CSS カラー値) */\n\tcolor?: string;\n\n\t/** `true` のとき太字 */\n\tfontWeight?: boolean;\n\n\t/** `true` のときイタリック */\n\titalic?: boolean;\n\n\t/** `true` のとき下線 */\n\tunderline?: boolean;\n\n\t/** `true` のとき取り消し線 */\n\tlineThrough?: boolean;\n}\n\n/**\n * フォントスタイルプロパティの `PropDef`。\n *\n * @remarks\n * **Canvas** — ブロックプラグイン実装時に `plugin.props` へ追加する。\n */\nexport const fontStyleProp = {\n\tkind: \"fontStyle\",\n\tdefaultProps: {\n\t\tfontFamily: \"sans-serif\",\n\t\tfontSize: { value: 16, unit: \"px\" },\n\t\tcolor: \"#000000\",\n\t\tfontWeight: false,\n\t\titalic: false,\n\t\tunderline: false,\n\t\tlineThrough: false,\n\t},\n} satisfies PropDef;\n","import type { Dimension, PaddingUnit } from \"../../types\";\nimport type { PropDef } from \"../types\";\n\n/**\n * ブロック内の上下左右の余白を保持する Props。\n */\nexport interface PaddingProps {\n\ttop?: Dimension<PaddingUnit>;\n\tright?: Dimension<PaddingUnit>;\n\tbottom?: 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\n/**\n * 余白プロパティの `PropDef`。\n *\n * @remarks\n * **Canvas** — ブロックプラグイン実装時に `plugin.props` へ追加する。\n */\nexport const paddingProp = {\n\tkind: \"padding\",\n\tdefaultProps: {\n\t\ttop: { value: 0, unit: \"px\" },\n\t\tright: { value: 0, unit: \"px\" },\n\t\tbottom: { value: 0, unit: \"px\" },\n\t\tleft: { value: 0, unit: \"px\" },\n\t},\n} satisfies PropDef;\n","import type { PropDef } from \"../types\";\n\n/**\n * ブロックのプレースホルダーテキストを保持する Props。\n */\nexport interface PlaceholderProps {\n\t/** 未入力時に表示するプレースホルダー文字列 */\n\tplaceholder?: string;\n}\n\n/**\n * プレースホルダープロパティの `PropDef`。\n *\n * @remarks\n * **Canvas** — ブロックプラグイン実装時に `plugin.props` へ追加する。\n */\nexport const placeholderProp = {\n\tkind: \"placeholder\",\n\tdefaultProps: {\n\t\tplaceholder: \"テキストを入力\",\n\t},\n} satisfies PropDef;\n","import type { PropDef } from \"../types\";\n\n/**\n * ブロックの必須入力設定を保持する Props。\n */\nexport interface RequiredProps {\n\t/** `true` のとき、値が空の場合にバリデーションエラーとなる */\n\trequired?: boolean;\n}\n\n/**\n * 必須入力プロパティの `PropDef`。\n *\n * @remarks\n * **Canvas** — ブロックプラグイン実装時に `plugin.props` へ追加する。\n */\nexport const requiredProp = {\n\tkind: \"required\",\n\tdefaultProps: {\n\t\trequired: false,\n\t},\n} satisfies PropDef;\n","import type { Value } from \"./value\";\n\n/**\n * バリデーション結果の重大度レベル。\n */\nexport enum ValidationSeverity {\n\t/** 修正が必要なエラー */\n\tERROR = \"error\",\n\n\t/** 推奨される修正があるが続行可能な警告 */\n\tWARNING = \"warning\",\n\n\t/** 参考情報 */\n\tINFO = \"info\",\n}\n\n/**\n * バリデーション結果の1件分。プラグインのバリデーター関数が返す配列の要素型。\n *\n * @remarks\n * `useNoteLayout` が `Record<blockId, ValidationError[]>` として管理する。\n */\nexport interface ValidationError {\n\t/** ユーザーに表示するエラーメッセージ */\n\tmessage: string;\n\n\t/** エラー種別を識別するコード(例: `\"required\"`, `\"min_length\"`) */\n\tcode: string;\n\n\t/** エラーに関連するフィールド名。ブロック内の特定フィールドを示す場合に使用。 */\n\tfield?: string;\n\n\t/** 重大度レベル */\n\tseverity: ValidationSeverity;\n\n\t/** プラグインが付加する任意のメタデータ */\n\tmetadata?: Record<string, Value>;\n}\n","import { ValidationSeverity } from \"../types/validation\";\n\nimport type { ValidationError } from \"../types/validation\";\n\n/**\n * 必須バリデーションのみのスキーマ(Select・Checkbox で使用)。\n */\nexport interface RequiredSchema {\n\t/** `true` のとき、未入力または空値でエラーとなる。省略時はバリデーションしない */\n\trequired?: boolean;\n}\n\n/**\n * バリデーションプロパティのスキーマ(Text で使用)。\n */\nexport interface ValidationSchema extends RequiredSchema {\n\t/** 入力文字数の最小値。省略時はチェックしない */\n\tminLength?: number;\n\n\t/** 入力文字数の最大値。省略時はチェックしない */\n\tmaxLength?: number;\n\n\t/** 入力値にマッチさせる正規表現パターン。省略時はチェックしない */\n\tpattern?: string;\n}\n\n// ReDoS の原因となる危険な正規表現パターン(ネスト量詞子等)を検出する簡易チェック\nfunction isSafePattern(pattern: string): boolean {\n\tif (pattern.length > 200) return false;\n\tif (/\\((?:[^[\\]()*+?\\\\]|\\\\.|\\[[^\\]]*\\])[+*][^()]*\\)[+*{]/.test(pattern))\n\t\treturn false;\n\treturn true;\n}\n\n/**\n * `block.props` がバリデーションルールを持つかどうかを判定する型ガード。\n */\nexport function hasValidationRule(props: unknown): props is ValidationSchema {\n\tif (typeof props !== \"object\" || props === null) return false;\n\tconst p = props as Record<string, unknown>;\n\treturn (\n\t\tp.required !== undefined ||\n\t\tp.minLength !== undefined ||\n\t\tp.maxLength !== undefined ||\n\t\tp.pattern !== undefined\n\t);\n}\n\n/**\n * `ValidationSchema` の設定値と実際の値を照合し、違反しているエラーを返す。\n *\n * エラーがなければ空配列を返す。\n */\nexport function evaluateValidation(\n\tschema: ValidationSchema,\n\tvalue: string | undefined,\n): ValidationError[] {\n\tconst errors: ValidationError[] = [];\n\tconst v = value ?? \"\";\n\n\tif (schema.required && v.length === 0) {\n\t\terrors.push({\n\t\t\tcode: \"REQUIRED\",\n\t\t\tmessage: \"必須項目です\",\n\t\t\tseverity: ValidationSeverity.ERROR,\n\t\t});\n\t}\n\n\tif (schema.minLength !== undefined && v.length < schema.minLength) {\n\t\terrors.push({\n\t\t\tcode: \"MIN_LENGTH\",\n\t\t\tmessage: `${schema.minLength}文字以上入力してください`,\n\t\t\tseverity: ValidationSeverity.ERROR,\n\t\t});\n\t}\n\n\tif (schema.maxLength !== undefined && v.length > schema.maxLength) {\n\t\terrors.push({\n\t\t\tcode: \"MAX_LENGTH\",\n\t\t\tmessage: `${schema.maxLength}文字以内で入力してください`,\n\t\t\tseverity: ValidationSeverity.ERROR,\n\t\t});\n\t}\n\n\tif (schema.pattern) {\n\t\tif (isSafePattern(schema.pattern)) {\n\t\t\ttry {\n\t\t\t\tconst re = new RegExp(schema.pattern);\n\t\t\t\tif (!re.test(v)) {\n\t\t\t\t\terrors.push({\n\t\t\t\t\t\tcode: \"PATTERN\",\n\t\t\t\t\t\tmessage: \"形式が正しくありません\",\n\t\t\t\t\t\tseverity: ValidationSeverity.ERROR,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// 不正な正規表現は無視する\n\t\t\t}\n\t\t}\n\t}\n\n\treturn errors;\n}\n\n/**\n * チェックボックス用バリデーション。\n *\n * エラーがなければ空配列を返す。\n */\nexport function evaluateCheckboxValidation(\n\tschema: RequiredSchema,\n\tvalue: boolean | undefined,\n): ValidationError[] {\n\tif (schema.required && value !== true) {\n\t\treturn [\n\t\t\t{\n\t\t\t\tcode: \"REQUIRED\",\n\t\t\t\tmessage: \"必須項目です\",\n\t\t\t\tseverity: ValidationSeverity.ERROR,\n\t\t\t},\n\t\t];\n\t}\n\treturn [];\n}\n","import type { HiddenBinding } from \"../../types/block\";\nimport type { BindingContext } from \"../../types/context\";\n\n/**\n * ブロックの一意 ID を生成する。\n *\n * `kind` をプレフィックスにした UUID 形式(例: `text_xxxxxxxx-...`)。\n */\nexport function createBlockId(kind: string): string {\n\treturn `${kind}_${crypto.randomUUID()}`;\n}\n\n/**\n * `hiddenBinding` の条件を評価し、ブロックを非表示にすべきか返す。\n *\n * - `undefined` / `bindingContext` がない場合は常に `false`(表示)\n * - `string` 形式: `Boolean(get(path))` が truthy → `true`(非表示)\n * - `{ path, eq }` 形式: `get(path) === eq` → `true`(非表示)\n * - `{ path, neq }` 形式: `get(path) !== neq` → `true`(非表示)\n */\nexport function evalHiddenBinding(\n\thidden: HiddenBinding | undefined,\n\tbindingContext: BindingContext | undefined,\n): boolean {\n\tif (hidden == null || bindingContext == null) return false;\n\tif (typeof hidden === \"string\") return Boolean(bindingContext.get(hidden));\n\tconst cur = bindingContext.get(hidden.path);\n\tif (\"eq\" in hidden) return cur === hidden.eq;\n\treturn cur !== hidden.neq;\n}\n","import { DEFAULT_GRID, type Grid } from \"./grid\";\nimport { DEFAULT_PAPER, type Paper } from \"./paper\";\n\nimport type { Block } from \"./block\";\nimport type { Value } from \"./value\";\n\n/**\n * ブロック種別ごとの共通デフォルトプロパティ。\n *\n * @remarks\n * - キー: プラグインの kind(例: `\"text\"`, `\"checkbox\"`)\n * - 値: プロパティの部分辞書。`block.props` にキーが存在しない場合に参照され、\n * それも存在しない場合は `PropDef.defaultProps` にフォールバックする\n *\n * @example\n * ```ts\n * const defaults: BlockDefaults = {\n * text: { fontFamily: \"serif\", verticalAlign: \"center\" },\n * checkbox: { horizontalAlign: \"center\" },\n * };\n * ```\n */\nexport type BlockDefaults = Record<string, Record<string, Value>>;\n\n/**\n * 1ページ分のフォームスキーマ。\n */\nexport interface Page {\n\t/** ページの一意 ID。保存済み Book に ID がない場合は {@link ensurePageIds} で付与できる */\n\tid?: string;\n\n\t/** グリッド設定(スパース形式)。全列・全行が 1fr の場合は colCount / rowCount のみ */\n\tgrid: Grid;\n\n\t/** 配置されているブロック一覧 */\n\tblocks: Block[];\n\n\t/** ブロック種別ごとの共通デフォルト設定。値解決順序は `Block` の @remarks を参照 */\n\tblockDefaults?: BlockDefaults;\n\n\t/** ページ固有のメタデータ(バージョン・タイトルなど) */\n\tmetaData?: Record<string, Value>;\n}\n\n/**\n * デフォルトフォームスキーマ(空ページ)。\n */\nexport const DEFAULT_PAGE: Page = {\n\tgrid: DEFAULT_GRID,\n\tblocks: [],\n};\n\n/**\n * 複数ページのフォームを表すスキーマ(Book)。\n *\n * @remarks\n * - `pages` は最低1ページ必須(タプル型で空配列を禁止)\n * - `Page.id` はオプション。index による識別がベースだが、並び替え・外部同期には `id` を利用する\n * - `block.id` はブック全体でユニークであること\n * - `paper` はブック全体で共通(全ページ同一の用紙設定を維持する)\n */\nexport interface Book {\n\t/** ブック全体の用紙設定。全ページ共通(PDF の慣習に従いページごとの変更は不可) */\n\tpaper: Paper;\n\n\t/** ページ一覧(0-based インデックス順) */\n\tpages: [Page, ...Page[]];\n\n\t/** ブックレベルのメタデータ。例: `{ title: \"月次業務報告書\", version: \"2\" }` */\n\tmetaData?: Record<string, Value>;\n}\n\n/**\n * デフォルト Book(1ページ・空スキーマ)。\n */\nexport const DEFAULT_BOOK: Book = {\n\tpaper: DEFAULT_PAPER,\n\tpages: [DEFAULT_PAGE],\n};\n","import { Z_INDEX } from \"./constants\";\n\n/**\n * ブロックの表示順序インデックスから CSS z-index 値を返す。\n *\n * `index` が範囲上限(`BLOCK_LAYER_MAX`)を超えた場合は `BLOCK_LAYER_MAX` にクランプする。\n */\nexport function getBlockZIndex(index: number): number {\n\tconst zIndex = Z_INDEX.BLOCK_LAYER_MIN + index * Z_INDEX.BLOCK_LAYER_STEP;\n\tif (zIndex >= Z_INDEX.BLOCK_LAYER_MAX) {\n\t\treturn Z_INDEX.BLOCK_LAYER_MAX;\n\t}\n\treturn zIndex;\n}\n\n/**\n * ブロックのベース z-index にサブインデックスオフセットを加えた値を返す。\n *\n * `subIndex` は `0` 以上 `BLOCK_LAYER_STEP - 1` 以下にクランプされる。\n */\nexport function getSubZIndex(baseZIndex: number, subIndex: number): number {\n\tconst clampedOffset = Math.min(\n\t\tMath.max(0, subIndex),\n\t\tZ_INDEX.BLOCK_LAYER_STEP - 1,\n\t);\n\treturn baseZIndex + clampedOffset;\n}\n\n/**\n * z-index 範囲内に配置できる最大ブロック数を返す。\n */\nexport function getMaxBlockCount(): number {\n\treturn Math.floor(\n\t\t(Z_INDEX.BLOCK_LAYER_MAX - Z_INDEX.BLOCK_LAYER_MIN) /\n\t\t\tZ_INDEX.BLOCK_LAYER_STEP,\n\t);\n}\n","import { DEFAULT_PAGE } from \"../../types/schema\";\nimport { ValidationSeverity } from \"../../types/validation\";\nimport { getMaxBlockCount } from \"../zIndex\";\n\nimport type { Book, Page } from \"../../types/schema\";\nimport type { ValidationError } from \"../../types/validation\";\nimport type { Value } from \"../../types/value\";\n\n/**\n * Book 全体の blockId 重複・ページごとのブロック数上限を検証する。\n *\n * 問題があれば `ValidationError[]` を返す。空配列は valid。\n */\nexport function validateBook(book: Book): ValidationError[] {\n\tconst errors: ValidationError[] = [];\n\tconst seen = new Set<string>();\n\tconst duplicates = new Set<string>();\n\tconst maxBlockCount = getMaxBlockCount();\n\n\tfor (const [pageIndex, page] of book.pages.entries()) {\n\t\tfor (const block of page.blocks) {\n\t\t\tif (seen.has(block.id)) {\n\t\t\t\tduplicates.add(block.id);\n\t\t\t} else {\n\t\t\t\tseen.add(block.id);\n\t\t\t}\n\t\t}\n\t\tif (page.blocks.length > maxBlockCount) {\n\t\t\terrors.push({\n\t\t\t\tmessage: `ページ ${pageIndex + 1} のブロック数 (${page.blocks.length}) が上限 (${maxBlockCount}) を超えています`,\n\t\t\t\tcode: \"BLOCK_COUNT_EXCEEDED\",\n\t\t\t\tfield: page.id ?? `page-${pageIndex}`,\n\t\t\t\tseverity: ValidationSeverity.ERROR,\n\t\t\t});\n\t\t}\n\t}\n\n\tfor (const id of duplicates) {\n\t\terrors.push({\n\t\t\tmessage: `blockId \"${id}\" が複数ページに重複して存在します`,\n\t\t\tcode: \"DUPLICATE_BLOCK_ID\",\n\t\t\tfield: id,\n\t\t\tseverity: ValidationSeverity.ERROR,\n\t\t});\n\t}\n\n\treturn errors;\n}\n\nfunction toNonEmptyPages(pages: Page[]): Book[\"pages\"] {\n\tif (pages.length === 0) throw new Error(\"pages must not be empty\");\n\treturn pages as Book[\"pages\"];\n}\n\n/**\n * 末尾に空ページを追加した新しい Book を返す。\n */\nexport function addPage(book: Book): Book {\n\tconst emptyPage: Page = { ...DEFAULT_PAGE, id: crypto.randomUUID() };\n\treturn {\n\t\t...book,\n\t\tpages: toNonEmptyPages([...book.pages, emptyPage]),\n\t};\n}\n\n/**\n * `id` を持たないページに一意 ID を付与した新しい Book を返す。\n *\n * 保存済み Book の migration に使用する。既に `id` があるページは変更しない。\n */\nexport function ensurePageIds(book: Book): Book {\n\tconst pages = toNonEmptyPages(\n\t\tbook.pages.map((page) =>\n\t\t\tpage.id !== undefined ? page : { ...page, id: crypto.randomUUID() },\n\t\t),\n\t);\n\treturn { ...book, pages };\n}\n\n/**\n * 指定インデックスのページを削除した新しい Book を返す。\n *\n * 1ページのみの場合は no-op。\n */\nexport function removePage(book: Book, index: number): Book {\n\tif (book.pages.length <= 1) return book;\n\tconst pages = book.pages.filter((_, i) => i !== index);\n\treturn { ...book, pages: toNonEmptyPages(pages) };\n}\n\n/**\n * ページの順序を変えた新しい Book を返す。\n *\n * `from === to` の場合は no-op。\n */\nexport function movePage(book: Book, from: number, to: number): Book {\n\tif (from === to) return book;\n\tconst pages = [...book.pages];\n\tconst moved = pages.splice(from, 1)[0];\n\tif (!moved) return book;\n\tpages.splice(to, 0, moved);\n\treturn { ...book, pages: toNonEmptyPages(pages) };\n}\n\n/**\n * 指定インデックスのページを置き換えた新しい Book を返す。\n */\nexport function setPage(book: Book, pageIdx: number, page: Page): Book {\n\treturn {\n\t\t...book,\n\t\tpages: toNonEmptyPages(\n\t\t\tbook.pages.map((p, i) => (i === pageIdx ? page : p)),\n\t\t),\n\t};\n}\n\n/**\n * `afterIdx` の直後に新しいページを挿入した新しい Book を返す。\n */\nexport function insertPage(book: Book, afterIdx: number, page: Page): Book {\n\tconst newPages = [\n\t\t...book.pages.slice(0, afterIdx + 1),\n\t\tpage,\n\t\t...book.pages.slice(afterIdx + 1),\n\t];\n\treturn { ...book, pages: toNonEmptyPages(newPages) };\n}\n\n/**\n * Book に存在しない blockId のエントリを `values` から除去して返す。\n */\nexport function cleanValues(\n\tbook: Book,\n\tvalues: Record<string, Value>,\n): Record<string, Value> {\n\tconst existingIds = new Set(\n\t\tbook.pages.flatMap((page) => page.blocks.map((b) => b.id)),\n\t);\n\treturn Object.fromEntries(\n\t\tObject.entries(values).filter(([k]) => existingIds.has(k)),\n\t);\n}\n","import {\n\tDEFAULT_PAPER_SIZES,\n\ttype Paper,\n\ttype PaperSizePreset,\n} from \"../../types/paper\";\nimport { toMm } from \"../convert\";\n\nimport type { PrintMargin, PrintSettings } from \"../../types/print\";\nimport type { Book } from \"../../types/schema\";\n\n/**\n * プリセット用紙サイズの対応寸法を mm 単位で返す。\n *\n * `orientation` が `true` のとき横向き(幅と高さを入れ替え)。\n */\nexport function getPaperSize(\n\tpreset: Exclude<PaperSizePreset, PaperSizePreset.CUSTOM>,\n\torientation: boolean,\n): { width: number; height: number } {\n\tconst size = DEFAULT_PAPER_SIZES[preset];\n\tconst w = toMm.fromDim(size.width);\n\tconst h = toMm.fromDim(size.height);\n\treturn orientation ? { width: h, height: w } : { width: w, height: h };\n}\n\n/**\n * `book.paper` に `printSettings` のサイズ・向きをマージした実効用紙設定を返す。\n *\n * `printSettings` を省略した場合は `book.paper` をそのまま返す。\n */\nexport function resolveEffectivePaper(\n\tbook: Book,\n\tprintSettings?: PrintSettings,\n): Paper {\n\treturn {\n\t\t...book.paper,\n\t\tsize:\n\t\t\tprintSettings?.paperSize != null\n\t\t\t\t? (DEFAULT_PAPER_SIZES[printSettings.paperSize] ?? book.paper.size)\n\t\t\t\t: book.paper.size,\n\t\torientation: printSettings?.orientation ?? book.paper.orientation,\n\t};\n}\n\n/**\n * 用紙設定から `@page` CSS 文字列を生成する。\n *\n * `margin` を省略した場合は `margin:0` になる。\n */\nexport function buildPageCss(paper: Paper, margin?: PrintMargin): string {\n\tconst isLandscape = paper.orientation === true;\n\tconst w = Math.round(\n\t\ttoMm.fromDim(isLandscape ? paper.size.height : paper.size.width),\n\t);\n\tconst h = Math.round(\n\t\ttoMm.fromDim(isLandscape ? paper.size.width : paper.size.height),\n\t);\n\tconst marginCss = margin\n\t\t? `margin-top:${margin.top ?? \"0\"};margin-right:${margin.right ?? \"0\"};margin-bottom:${margin.bottom ?? \"0\"};margin-left:${margin.left ?? \"0\"};`\n\t\t: \"margin:0;\";\n\treturn `@page { size: ${w}mm ${h}mm; ${marginCss} }`;\n}\n","import {\n\ttype CSSProperties,\n\tforwardRef,\n\tuseImperativeHandle,\n\tuseMemo,\n\tuseRef,\n} from \"react\";\n\nimport {\n\tHorizontalAlign,\n\tVerticalAlign,\n} from \"../../../plugin/properties/alignment\";\nimport { dimensionToString, toPx } from \"../../../utils\";\nimport { ClassicCheckboxVisual } from \"./visual\";\n\nimport type { BlockRef, RendererProps } from \"../../../plugin/types\";\nimport type { CheckboxBlockProps, CheckboxBlockValue } from \"./types\";\n\n// HorizontalAlign → CSS justifyContent のマッピングテーブル\nconst H_ALIGN_CSS: Record<HorizontalAlign, CSSProperties[\"justifyContent\"]> = {\n\t[HorizontalAlign.left]: \"flex-start\",\n\t[HorizontalAlign.center]: \"center\",\n\t[HorizontalAlign.right]: \"flex-end\",\n};\n\n// VerticalAlign → CSS alignItems のマッピングテーブル\nconst V_ALIGN_CSS: Record<VerticalAlign, CSSProperties[\"alignItems\"]> = {\n\t[VerticalAlign.top]: \"flex-start\",\n\t[VerticalAlign.center]: \"center\",\n\t[VerticalAlign.bottom]: \"flex-end\",\n};\n\n/**\n * チェックボックスブロックのレンダラーコンポーネント。\n *\n * `value`(`boolean`)のトグル操作をし、SVG ビジュアルでチェック状態を表示する。\n */\nexport const CheckboxRenderer = forwardRef<\n\tBlockRef,\n\tRendererProps<CheckboxBlockProps, CheckboxBlockValue>\n>(({ id, props, value, onChange, readOnly, ariaLabel }, ref) => {\n\tconst divRef = useRef<HTMLDivElement>(null);\n\tuseImperativeHandle(\n\t\tref,\n\t\t() => ({ focus: () => divRef.current?.focus() }),\n\t\t[],\n\t);\n\n\tconst isChecked = value ?? false;\n\n\tconst containerStyle = useMemo((): CSSProperties => {\n\t\tconst css: CSSProperties = {\n\t\t\twidth: \"100%\",\n\t\t\theight: \"100%\",\n\t\t\tdisplay: \"flex\",\n\t\t\tboxSizing: \"border-box\",\n\t\t\toverflow: \"hidden\",\n\t\t\tcursor: readOnly ? \"default\" : \"pointer\",\n\t\t};\n\n\t\tcss.justifyContent =\n\t\t\tH_ALIGN_CSS[props.horizontal ?? HorizontalAlign.center];\n\t\tcss.alignItems = V_ALIGN_CSS[props.vertical ?? VerticalAlign.center];\n\n\t\tconst padAll = props.bulk ? props.all : undefined;\n\t\tconst padTop = padAll ?? props.top;\n\t\tconst padRight = padAll ?? props.right;\n\t\tconst padBottom = padAll ?? props.bottom;\n\t\tconst padLeft = padAll ?? props.left;\n\t\tif (padTop) css.paddingTop = dimensionToString(padTop);\n\t\tif (padRight) css.paddingRight = dimensionToString(padRight);\n\t\tif (padBottom) css.paddingBottom = dimensionToString(padBottom);\n\t\tif (padLeft) css.paddingLeft = dimensionToString(padLeft);\n\n\t\treturn css;\n\t}, [props, readOnly]);\n\n\tconst sizePx = props.styleConfig?.checkboxSize\n\t\t? toPx.fromDim(props.styleConfig.checkboxSize)\n\t\t: 16;\n\n\tconst handleClick = () => {\n\t\tif (readOnly) return;\n\t\tonChange(!isChecked);\n\t};\n\n\treturn (\n\t\t<div\n\t\t\tref={divRef}\n\t\t\tstyle={containerStyle}\n\t\t\trole=\"switch\"\n\t\t\taria-checked={isChecked}\n\t\t\taria-label={ariaLabel}\n\t\t\ttabIndex={readOnly ? -1 : 0}\n\t\t\tonClick={handleClick}\n\t\t\tonKeyDown={(e) => {\n\t\t\t\tif (e.key === \" \" || e.key === \"Enter\") {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\thandleClick();\n\t\t\t\t}\n\t\t\t}}\n\t\t>\n\t\t\t<input\n\t\t\t\tid={id}\n\t\t\t\ttype=\"checkbox\"\n\t\t\t\tchecked={isChecked}\n\t\t\t\tonChange={() => {}}\n\t\t\t\tstyle={{ display: \"none\" }}\n\t\t\t\ttabIndex={-1}\n\t\t\t\treadOnly\n\t\t\t/>\n\t\t\t<div\n\t\t\t\tstyle={{\n\t\t\t\t\twidth: sizePx,\n\t\t\t\t\theight: sizePx,\n\t\t\t\t\tflexShrink: 0,\n\t\t\t\t\tpointerEvents: \"none\",\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<ClassicCheckboxVisual\n\t\t\t\t\tchecked={isChecked}\n\t\t\t\t\tstyleConfig={props.styleConfig}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t);\n});\n\nCheckboxRenderer.displayName = \"CheckboxRenderer\";\n","import { alignmentProp, paddingProp, requiredProp } from \"../../../plugin\";\nimport { HorizontalAlign } from \"../../../plugin/properties/alignment\";\nimport { checkboxStyleProp } from \"./props\";\nimport { CheckboxRenderer } from \"./renderer\";\n\nimport type { BlockPlugin } from \"../../../plugin\";\nimport type { CheckboxBlockProps, CheckboxBlockValue } from \"./types\";\n\n// checkboxAlignmentProp: デフォルトを中央寄せにオーバーライドしたチェックボックス専用の alignment prop\nconst checkboxAlignmentProp = {\n\t...alignmentProp,\n\tdefaultProps: {\n\t\t...alignmentProp.defaultProps,\n\t\thorizontal: HorizontalAlign.center,\n\t},\n};\n\n/**\n * チェックボックスブロックのプラグイン定義。\n *\n * `kind: \"checkbox\"` で登録され、チェック・非チェックを `boolean` 値で管理する。\n */\nexport const CheckboxPlugin: BlockPlugin<\n\tCheckboxBlockProps,\n\tCheckboxBlockValue\n> = {\n\tkind: \"checkbox\",\n\n\tmeta: {\n\t\tdisplayName: \"チェックボックス\",\n\t\tdescription: \"チェック/非チェックを選択する入力ブロック\",\n\t\tdefaultSize: { w: 2, h: 2 },\n\t},\n\n\tRenderer: CheckboxRenderer,\n\n\tproperties: [\n\t\tcheckboxAlignmentProp,\n\t\tpaddingProp,\n\t\trequiredProp,\n\t\tcheckboxStyleProp,\n\t],\n\n\tvalidateProps: (props: unknown): CheckboxBlockProps => {\n\t\tconst p = (\n\t\t\ttypeof props === \"object\" && props !== null ? props : {}\n\t\t) as Record<string, unknown>;\n\t\treturn { ...p } as CheckboxBlockProps;\n\t},\n\n\tvalidateValue: (value: unknown): CheckboxBlockValue => {\n\t\tif (typeof value === \"boolean\") return value;\n\t\treturn false;\n\t},\n};\n","import type { PropDef } from \"../../../plugin\";\n\n/**\n * セレクトボックスの個々の選択肢。\n */\nexport interface SelectOption {\n\t/** ユーザーに表示するラベル。 */\n\tlabel: string;\n\n\t/** 選択時にブロック値として記録される内部値。 */\n\tvalue: string;\n\n\t/** ラベルに適用する文字色(任意)。 */\n\tcolor?: string;\n}\n\n/**\n * セレクトボックスの選択肢一覧と機能設定。\n */\nexport interface SelectOptionsConfig {\n\t/** 選択肢の配列。 */\n\toptions: SelectOption[];\n\n\t/** `true` のとき空白選択(未選択)を許可する。 */\n\tallowEmpty?: boolean;\n}\n\n/**\n * セレクトボックスの選択肢設定 props。\n */\nexport interface SelectConfigProps {\n\t/** 選択肢と機能設定。 */\n\tselectConfig: SelectOptionsConfig;\n}\n\n/**\n * `selectConfig` prop 定義。セレクトボックスの選択肢デフォルト値を含む。\n */\nexport const selectConfigProp = {\n\tkind: \"selectConfig\",\n\tdefaultProps: {\n\t\tselectConfig: {\n\t\t\toptions: [\n\t\t\t\t{ label: \"option1\", value: \"option1\" },\n\t\t\t\t{ label: \"option2\", value: \"option2\" },\n\t\t\t],\n\t\t},\n\t},\n} satisfies PropDef;\n","import {\n\ttype CSSProperties,\n\tforwardRef,\n\tuseImperativeHandle,\n\tuseMemo,\n\tuseRef,\n} from \"react\";\n\nimport {\n\tHorizontalAlign,\n\tVerticalAlign,\n} from \"../../../plugin/properties/alignment\";\nimport { NoteMode } from \"../../../types\";\nimport { dimensionToString, toPx } from \"../../../utils\";\n\nimport type { BlockRef, RendererProps } from \"../../../plugin/types\";\nimport type { SelectBlockProps, SelectBlockValue } from \"./types\";\n\n// isValidCssColor: 色文字列が CSS background に安全に渡せる形式(# + 16進数)かをチェックする\nfunction isValidCssColor(color: string): boolean {\n\treturn /^#[0-9a-fA-F]{3,8}$/.test(color);\n}\n\n// HorizontalAlign → CSS textAlign のマッピングテーブル\nconst H_ALIGN_TEXT: Record<HorizontalAlign, CSSProperties[\"textAlign\"]> = {\n\t[HorizontalAlign.left]: \"left\",\n\t[HorizontalAlign.center]: \"center\",\n\t[HorizontalAlign.right]: \"right\",\n};\n\n// VerticalAlign → CSS alignItems のマッピングテーブル\nconst V_ALIGN_CSS: Record<VerticalAlign, CSSProperties[\"alignItems\"]> = {\n\t[VerticalAlign.top]: \"flex-start\",\n\t[VerticalAlign.center]: \"center\",\n\t[VerticalAlign.bottom]: \"flex-end\",\n};\n\n/**\n * セレクトボックスブロックのレンダラーコンポーネント。\n *\n * 選択肢一覧からユーザーが 1 つを選択し、`string | null` 値を管理する。\n *\n * `mode === NoteMode.VIEW` のときは選択ラベルをテキストとして表示する。\n */\nexport const SelectRenderer = forwardRef<\n\tBlockRef,\n\tRendererProps<SelectBlockProps, SelectBlockValue>\n>(\n\t(\n\t\t{\n\t\t\tid,\n\t\t\tprops,\n\t\t\tvalue,\n\t\t\tonChange,\n\t\t\treadOnly,\n\t\t\tmode,\n\t\t\tariaLabel,\n\t\t\tblockBackgroundColor,\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst selectRef = useRef<HTMLSelectElement>(null);\n\t\tuseImperativeHandle(\n\t\t\tref,\n\t\t\t() => ({ focus: () => selectRef.current?.focus() }),\n\t\t\t[],\n\t\t);\n\n\t\tconst isDisabled = readOnly || mode === NoteMode.VIEW;\n\n\t\tconst selectedOption = (props.selectConfig?.options ?? []).find(\n\t\t\t(o) => o.value === value,\n\t\t);\n\t\tconst selectedColor = selectedOption?.color;\n\t\tconst bgColor =\n\t\t\tselectedColor && isValidCssColor(selectedColor)\n\t\t\t\t? selectedColor\n\t\t\t\t: undefined;\n\n\t\tconst containerStyle = useMemo((): CSSProperties => {\n\t\t\tconst css: CSSProperties = {\n\t\t\t\twidth: \"100%\",\n\t\t\t\theight: \"100%\",\n\t\t\t\tposition: \"relative\",\n\t\t\t\tdisplay: \"flex\",\n\t\t\t\talignItems: V_ALIGN_CSS[props.vertical ?? VerticalAlign.center],\n\t\t\t\tboxSizing: \"border-box\",\n\t\t\t\toverflow: \"hidden\",\n\t\t\t};\n\t\t\tif (bgColor) css.backgroundColor = bgColor;\n\t\t\tconst padAll = props.bulk ? props.all : undefined;\n\t\t\tconst padTop = padAll ?? props.top;\n\t\t\tconst padRight = padAll ?? props.right;\n\t\t\tconst padBottom = padAll ?? props.bottom;\n\t\t\tconst padLeft = padAll ?? props.left;\n\t\t\tif (padTop) css.paddingTop = dimensionToString(padTop);\n\t\t\tif (padRight) css.paddingRight = dimensionToString(padRight);\n\t\t\tif (padBottom) css.paddingBottom = dimensionToString(padBottom);\n\t\t\tif (padLeft) css.paddingLeft = dimensionToString(padLeft);\n\t\t\treturn css;\n\t\t}, [props, bgColor]);\n\n\t\tconst selectStyle = useMemo((): CSSProperties => {\n\t\t\tconst css: CSSProperties = {\n\t\t\t\tappearance: \"none\",\n\t\t\t\tWebkitAppearance: \"none\",\n\t\t\t\tbackground: \"transparent\",\n\t\t\t\tborder: \"none\",\n\t\t\t\toutline: \"none\",\n\t\t\t\twidth: \"100%\",\n\t\t\t\theight: \"auto\",\n\t\t\t\tpadding: \"0 20px 0 4px\",\n\t\t\t\tboxSizing: \"border-box\",\n\t\t\t\tcursor: isDisabled ? \"default\" : \"pointer\",\n\t\t\t\ttextAlign: H_ALIGN_TEXT[props.horizontal ?? HorizontalAlign.left],\n\t\t\t};\n\t\t\tif (props.fontFamily) css.fontFamily = props.fontFamily;\n\t\t\tif (props.fontSize) css.fontSize = `${toPx.fromDim(props.fontSize)}px`;\n\t\t\tif (props.color) css.color = props.color;\n\t\t\tcss.fontWeight = props.fontWeight ? \"bold\" : \"normal\";\n\t\t\tcss.fontStyle = props.italic ? \"italic\" : \"normal\";\n\t\t\tconst dec: string[] = [];\n\t\t\tif (props.underline) dec.push(\"underline\");\n\t\t\tif (props.lineThrough) dec.push(\"line-through\");\n\t\t\tif (dec.length > 0) css.textDecoration = dec.join(\" \");\n\t\t\treturn css;\n\t\t}, [props, isDisabled]);\n\n\t\tconst arrowStyle: CSSProperties = {\n\t\t\tposition: \"absolute\",\n\t\t\tright: 6,\n\t\t\ttop: \"50%\",\n\t\t\ttransform: \"translateY(-50%)\",\n\t\t\twidth: 0,\n\t\t\theight: 0,\n\t\t\tborderLeft: \"5px solid transparent\",\n\t\t\tborderRight: \"5px solid transparent\",\n\t\t\tborderTop: `5px solid ${isDisabled ? \"#aaa\" : \"#555\"}`,\n\t\t\tpointerEvents: \"none\",\n\t\t};\n\n\t\tconst handleChange = (e: React.ChangeEvent<HTMLSelectElement>) => {\n\t\t\tconst newValue = e.target.value === \"\" ? null : e.target.value;\n\t\t\tonChange(newValue);\n\t\t};\n\n\t\t// パディング領域などのコンテナ空白部分をクリックしたときもドロップダウンを開く\n\t\tconst handleContainerClick = (e: React.MouseEvent<HTMLDivElement>) => {\n\t\t\tif (!isDisabled && e.target !== selectRef.current) {\n\t\t\t\tselectRef.current?.showPicker?.();\n\t\t\t}\n\t\t};\n\n\t\tconst handleContainerKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n\t\t\tif (!isDisabled && (e.key === \"Enter\" || e.key === \" \")) {\n\t\t\t\te.preventDefault();\n\t\t\t\tselectRef.current?.showPicker?.();\n\t\t\t}\n\t\t};\n\n\t\tif (mode === NoteMode.VIEW) {\n\t\t\tconst label =\n\t\t\t\tselectedOption?.label ??\n\t\t\t\t(value != null ? String(value) : (props.placeholder ?? \"\"));\n\t\t\tconst viewStyle: CSSProperties = {\n\t\t\t\t...selectStyle,\n\t\t\t\theight: \"auto\",\n\t\t\t\tpadding: \"0 4px\",\n\t\t\t};\n\t\t\treturn (\n\t\t\t\t<div style={containerStyle}>\n\t\t\t\t\t<div style={viewStyle}>{label}</div>\n\t\t\t\t</div>\n\t\t\t);\n\t\t}\n\n\t\tconst resolveOptionBackground = (color?: string): string | undefined => {\n\t\t\tif (color && isValidCssColor(color)) return color;\n\t\t\treturn blockBackgroundColor;\n\t\t};\n\n\t\t// <label> ラッパーは使わず、コンテナ onClick + showPicker でパディング領域のクリックも対応する\n\t\tconst inner = (\n\t\t\t<>\n\t\t\t\t<select\n\t\t\t\t\tref={selectRef}\n\t\t\t\t\tid={id}\n\t\t\t\t\tvalue={value ?? \"\"}\n\t\t\t\t\tonChange={handleChange}\n\t\t\t\t\tdisabled={isDisabled}\n\t\t\t\t\tstyle={selectStyle}\n\t\t\t\t\taria-label={ariaLabel}\n\t\t\t\t>\n\t\t\t\t\t{props.placeholder !== undefined &&\n\t\t\t\t\t\t!props.required &&\n\t\t\t\t\t\tprops.selectConfig?.allowEmpty !== false && (\n\t\t\t\t\t\t\t<option\n\t\t\t\t\t\t\t\tvalue=\"\"\n\t\t\t\t\t\t\t\tstyle={\n\t\t\t\t\t\t\t\t\tblockBackgroundColor\n\t\t\t\t\t\t\t\t\t\t? { backgroundColor: blockBackgroundColor }\n\t\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{props.placeholder}\n\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t)}\n\t\t\t\t\t{(props.selectConfig?.options ?? []).map((opt) => {\n\t\t\t\t\t\tconst optBg = resolveOptionBackground(opt.color);\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<option\n\t\t\t\t\t\t\t\tkey={opt.value}\n\t\t\t\t\t\t\t\tvalue={opt.value}\n\t\t\t\t\t\t\t\tstyle={optBg ? { backgroundColor: optBg } : undefined}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{opt.label}\n\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t);\n\t\t\t\t\t})}\n\t\t\t\t</select>\n\t\t\t\t<div style={arrowStyle} aria-hidden=\"true\" />\n\t\t\t</>\n\t\t);\n\n\t\tif (isDisabled) {\n\t\t\treturn <div style={containerStyle}>{inner}</div>;\n\t\t}\n\t\treturn (\n\t\t\t<div\n\t\t\t\tstyle={containerStyle}\n\t\t\t\trole=\"none\"\n\t\t\t\tonClick={handleContainerClick}\n\t\t\t\tonKeyDown={handleContainerKeyDown}\n\t\t\t>\n\t\t\t\t{inner}\n\t\t\t</div>\n\t\t);\n\t},\n);\n\nSelectRenderer.displayName = \"SelectRenderer\";\n","import {\n\talignmentProp,\n\tfontStyleProp,\n\tpaddingProp,\n\tplaceholderProp,\n\trequiredProp,\n} from \"../../../plugin\";\nimport { selectConfigProp } from \"./props\";\nimport { SelectRenderer } from \"./renderer\";\n\nimport type { BlockPlugin } from \"../../../plugin\";\nimport type { SelectOptionsConfig } from \"./props\";\nimport type { SelectBlockProps, SelectBlockValue } from \"./types\";\n\n/**\n * セレクトボックスブロックのプラグイン定義。\n *\n * `kind: \"select\"` で登録され、選択肢設定・必須入力・フォントなどの prop まとまりを提供する。\n */\nexport const SelectPlugin: BlockPlugin<SelectBlockProps, SelectBlockValue> = {\n\tkind: \"select\",\n\n\tmeta: {\n\t\tdisplayName: \"セレクトボックス\",\n\t\tdescription: \"ドロップダウンから選択肢を選ぶ入力ブロック\",\n\t\tdefaultSize: { w: 4, h: 2 },\n\t},\n\n\tRenderer: SelectRenderer,\n\n\tproperties: [\n\t\talignmentProp,\n\t\tpaddingProp,\n\t\tfontStyleProp,\n\t\tplaceholderProp,\n\t\trequiredProp,\n\t\tselectConfigProp,\n\t],\n\n\tvalidateProps: (props: unknown): SelectBlockProps => {\n\t\tif (typeof props !== \"object\" || props === null) {\n\t\t\treturn {} as SelectBlockProps;\n\t\t}\n\n\t\tconst p = props as Record<string, unknown>;\n\n\t\t// selectConfig.options の各要素が { label: string, value: string } であることを確認\n\t\tconst rawCfg = p.selectConfig;\n\t\tconst isValidSelectConfig =\n\t\t\ttypeof rawCfg === \"object\" &&\n\t\t\trawCfg !== null &&\n\t\t\tArray.isArray((rawCfg as Record<string, unknown>).options) &&\n\t\t\t((rawCfg as Record<string, unknown>).options as unknown[]).every(\n\t\t\t\t(opt: unknown) =>\n\t\t\t\t\ttypeof opt === \"object\" &&\n\t\t\t\t\topt !== null &&\n\t\t\t\t\ttypeof (opt as Record<string, unknown>).label === \"string\" &&\n\t\t\t\t\ttypeof (opt as Record<string, unknown>).value === \"string\",\n\t\t\t);\n\n\t\tif (isValidSelectConfig) {\n\t\t\treturn {\n\t\t\t\t...p,\n\t\t\t\tselectConfig: rawCfg as SelectOptionsConfig,\n\t\t\t} as SelectBlockProps;\n\t\t}\n\n\t\tconst { selectConfig: _ignored, ...rest } = p;\n\t\treturn { ...rest, selectConfig: { options: [] } } as SelectBlockProps;\n\t},\n\n\tvalidateValue: (value: unknown): SelectBlockValue => {\n\t\tif (typeof value === \"string\") return value;\n\t\treturn null;\n\t},\n};\n","import {\n\ttype CSSProperties,\n\tforwardRef,\n\tuseCallback,\n\tuseImperativeHandle,\n\tuseLayoutEffect,\n\tuseMemo,\n\tuseRef,\n\tuseState,\n} from \"react\";\n\nimport {\n\tHorizontalAlign,\n\tVerticalAlign,\n} from \"../../../plugin/properties/alignment\";\nimport { NoteMode } from \"../../../types\";\nimport { dimensionToString, toPx } from \"../../../utils\";\n\nimport type { BlockRef, RendererProps } from \"../../../plugin/types\";\nimport type { TextBlockProps, TextBlockValue } from \"./types\";\n\n// HorizontalAlign → CSS justifyContent のマッピングテーブル\nconst H_ALIGN_CSS: Record<HorizontalAlign, CSSProperties[\"justifyContent\"]> = {\n\t[HorizontalAlign.left]: \"flex-start\",\n\t[HorizontalAlign.center]: \"center\",\n\t[HorizontalAlign.right]: \"flex-end\",\n};\n\n// VerticalAlign → CSS alignItems のマッピングテーブル\nconst V_ALIGN_CSS: Record<VerticalAlign, CSSProperties[\"alignItems\"]> = {\n\t[VerticalAlign.top]: \"flex-start\",\n\t[VerticalAlign.center]: \"center\",\n\t[VerticalAlign.bottom]: \"flex-end\",\n};\n\n/**\n * テキストブロックのレンダラーコンポーネント。\n *\n * `multiline` prop に応じて `<input>` と `<textarea>` を切り替える。\n *\n * `onMeasureHeight` / `onMeasureWidth` を通じてコンテンツ高さ・幅を外部に通知する。\n */\nexport const TextRenderer = forwardRef<\n\tBlockRef,\n\tRendererProps<TextBlockProps, TextBlockValue>\n>(\n\t(\n\t\t{\n\t\t\tprops,\n\t\t\tvalue,\n\t\t\tonChange,\n\t\t\tonBlur,\n\t\t\treadOnly,\n\t\t\tmode,\n\t\t\tonMeasureHeight,\n\t\t\tonMeasureWidth,\n\t\t\tariaLabel,\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst inputRef = useRef<HTMLInputElement | HTMLTextAreaElement>(null);\n\t\tconst containerRef = useRef<HTMLDivElement>(null);\n\t\tconst ghostRef = useRef<HTMLDivElement>(null);\n\t\tconst widthSpanRef = useRef<HTMLSpanElement>(null);\n\n\t\tconst [textareaHeight, setTextareaHeight] = useState<number | null>(null);\n\t\tconst lastReportedHeight = useRef<number | null>(null);\n\t\tconst lastReportedWidth = useRef<number | null>(null);\n\n\t\t// value が number など非 string 型で渡された場合の防御的変換\n\t\tconst safeValue = value != null ? String(value) : \"\";\n\n\t\t// multiline: ゴースト要素でコンテンツ高さを計測する\n\t\t// 縦方向配置はコンテナのflexbox (alignItems) に委ねる\n\t\tuseLayoutEffect(() => {\n\t\t\tif (!props.multiline) return;\n\n\t\t\tconst ghost = ghostRef.current;\n\t\t\tconst container = containerRef.current;\n\t\t\tif (!ghost || !container) return;\n\n\t\t\t// ghost の textContent を直接セット(safeValue を effect 内で使うことで正当な依存にする)\n\t\t\tconst displayValue = safeValue + (safeValue.endsWith(\"\\n\") ? \" \" : \"\");\n\t\t\tghost.textContent = displayValue || \"\\u00a0\";\n\n\t\t\tconst cs = window.getComputedStyle(container);\n\t\t\tconst paddingTop = Number.parseFloat(cs.paddingTop);\n\t\t\tconst paddingBottom = Number.parseFloat(cs.paddingBottom);\n\t\t\tconst paddingLeft = Number.parseFloat(cs.paddingLeft);\n\t\t\tconst paddingRight = Number.parseFloat(cs.paddingRight);\n\n\t\t\tconst availableWidth = container.clientWidth - paddingLeft - paddingRight;\n\n\t\t\tghost.style.width = `${availableWidth}px`;\n\t\t\tghost.style.paddingTop = \"0px\";\n\t\t\tghost.style.paddingBottom = \"0px\";\n\n\t\t\tconst contentHeight = ghost.scrollHeight;\n\t\t\t// テキストエリアはコンテンツの自然な高さに設定(スクロールバーが出ない最小値)\n\t\t\tsetTextareaHeight(contentHeight);\n\n\t\t\tif (onMeasureHeight) {\n\t\t\t\tconst neededHeight = contentHeight + paddingTop + paddingBottom;\n\t\t\t\tif (neededHeight !== lastReportedHeight.current) {\n\t\t\t\t\tlastReportedHeight.current = neededHeight;\n\t\t\t\t\tonMeasureHeight(neededHeight);\n\t\t\t\t}\n\t\t\t}\n\t\t}, [props, safeValue, onMeasureHeight]);\n\n\t\t// 幅計測: hidden span で実際のテキスト幅を計測(scrollWidth は循環依存があるため不使用)\n\t\tuseLayoutEffect(() => {\n\t\t\tif (!onMeasureWidth) return;\n\t\t\tconst span = widthSpanRef.current;\n\t\t\tif (!span) return;\n\t\t\tspan.textContent = safeValue;\n\t\t\tconst w = span.offsetWidth + 2; // +2 for cursor/border safety\n\t\t\tif (w !== lastReportedWidth.current) {\n\t\t\t\tlastReportedWidth.current = w;\n\t\t\t\tonMeasureWidth(w);\n\t\t\t}\n\t\t}, [safeValue, onMeasureWidth]);\n\n\t\tuseImperativeHandle(\n\t\t\tref,\n\t\t\t() => ({ focus: () => inputRef.current?.focus() }),\n\t\t\t[],\n\t\t);\n\n\t\tconst isEditable = !readOnly;\n\n\t\tconst containerStyle = useMemo((): CSSProperties => {\n\t\t\tconst css: CSSProperties = {\n\t\t\t\tposition: \"relative\",\n\t\t\t\twidth: \"100%\",\n\t\t\t\theight: \"100%\",\n\t\t\t\tdisplay: \"flex\",\n\t\t\t\tboxSizing: \"border-box\",\n\t\t\t\toverflow: \"hidden\",\n\t\t\t\tcursor: isEditable ? \"text\" : \"default\",\n\t\t\t};\n\t\t\tcss.justifyContent =\n\t\t\t\tH_ALIGN_CSS[props.horizontal ?? HorizontalAlign.left];\n\t\t\tcss.alignItems = V_ALIGN_CSS[props.vertical ?? VerticalAlign.center];\n\t\t\tconst padAll = props.bulk ? props.all : undefined;\n\t\t\tconst padTop = padAll ?? props.top;\n\t\t\tconst padRight = padAll ?? props.right;\n\t\t\tconst padBottom = padAll ?? props.bottom;\n\t\t\tconst padLeft = padAll ?? props.left;\n\t\t\tif (padTop) css.paddingTop = dimensionToString(padTop);\n\t\t\tif (padRight) css.paddingRight = dimensionToString(padRight);\n\t\t\tif (padBottom) css.paddingBottom = dimensionToString(padBottom);\n\t\t\tif (padLeft) css.paddingLeft = dimensionToString(padLeft);\n\t\t\treturn css;\n\t\t}, [props, isEditable]);\n\n\t\tconst inputStyle = useMemo((): CSSProperties => {\n\t\t\tconst css: CSSProperties = {\n\t\t\t\tbackground: \"transparent\",\n\t\t\t\tborder: \"none\",\n\t\t\t\toutline: \"none\",\n\t\t\t\tresize: \"none\",\n\t\t\t\tpadding: 0,\n\t\t\t\tmargin: 0,\n\t\t\t\twidth: \"100%\",\n\t\t\t\twhiteSpace: onMeasureWidth\n\t\t\t\t\t? props.multiline\n\t\t\t\t\t\t? \"pre\"\n\t\t\t\t\t\t: \"nowrap\"\n\t\t\t\t\t: undefined,\n\t\t\t\tboxSizing: \"border-box\",\n\t\t\t\tfontFamily: \"inherit\",\n\t\t\t\tcolor: \"inherit\",\n\t\t\t};\n\t\t\tif (props.fontSize) css.fontSize = `${toPx.fromDim(props.fontSize)}px`;\n\t\t\tif (props.fontFamily) css.fontFamily = props.fontFamily;\n\t\t\tif (props.color) css.color = props.color;\n\t\t\tcss.fontWeight = props.fontWeight ? \"bold\" : \"normal\";\n\t\t\tcss.fontStyle = props.italic ? \"italic\" : \"normal\";\n\t\t\tconst dec: string[] = [];\n\t\t\tif (props.underline) dec.push(\"underline\");\n\t\t\tif (props.lineThrough) dec.push(\"line-through\");\n\t\t\tcss.textDecoration = dec.length > 0 ? dec.join(\" \") : \"none\";\n\t\t\tif (props.lineHeight) css.lineHeight = props.lineHeight;\n\t\t\tswitch (props.horizontal) {\n\t\t\t\tcase HorizontalAlign.center:\n\t\t\t\t\tcss.textAlign = \"center\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase HorizontalAlign.right:\n\t\t\t\t\tcss.textAlign = \"right\";\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tcss.textAlign = \"left\";\n\t\t\t}\n\t\t\treturn css;\n\t\t}, [props, onMeasureWidth]);\n\n\t\tconst widthSpanStyle = useMemo(\n\t\t\t(): CSSProperties => ({\n\t\t\t\t...inputStyle,\n\t\t\t\tposition: \"absolute\",\n\t\t\t\ttop: 0,\n\t\t\t\tleft: 0,\n\t\t\t\tvisibility: \"hidden\",\n\t\t\t\tpointerEvents: \"none\",\n\t\t\t\twhiteSpace: \"pre\",\n\t\t\t\twidth: \"auto\",\n\t\t\t\theight: \"auto\",\n\t\t\t\toverflow: \"visible\",\n\t\t\t}),\n\t\t\t[inputStyle],\n\t\t);\n\n\t\tconst ghostStyle = useMemo((): CSSProperties => {\n\t\t\tconst noWrap = !!onMeasureWidth;\n\t\t\treturn {\n\t\t\t\t...inputStyle,\n\t\t\t\tposition: \"absolute\",\n\t\t\t\ttop: 0,\n\t\t\t\tleft: 0,\n\t\t\t\twidth: \"100%\",\n\t\t\t\theight: \"auto\",\n\t\t\t\tvisibility: \"hidden\",\n\t\t\t\tpointerEvents: \"none\",\n\t\t\t\toverflow: \"hidden\",\n\t\t\t\twhiteSpace: noWrap ? \"pre\" : \"pre-wrap\",\n\t\t\t\twordWrap: noWrap ? \"normal\" : \"break-word\",\n\t\t\t\toverflowWrap: noWrap ? \"normal\" : \"break-word\",\n\t\t\t\tpadding: 0,\n\t\t\t\tborder: \"none\",\n\t\t\t\tboxSizing: \"border-box\",\n\t\t\t};\n\t\t}, [inputStyle, onMeasureWidth]);\n\n\t\tconst handleChange = (\n\t\t\te: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>,\n\t\t) => {\n\t\t\tonChange(e.target.value);\n\t\t};\n\n\t\tconst handleBlur = () => {\n\t\t\tonBlur?.(value);\n\t\t};\n\n\t\t// パターンが ^[...]+$ 形式なら1文字単位のフィルタ正規表現を導出する\n\t\t// 例: \"[0-9]+\" → /^[0-9]$/ \"[ぁ-ん]+\" → /^[ぁ-ん]$/\n\t\t// \"[0-9]{3}-[0-9]{4}\" のような複合パターンはフィルタなし(自由入力)\n\t\tconst charFilterRegex = useMemo((): RegExp | null => {\n\t\t\tif (!props.pattern) return null;\n\t\t\tconst m = props.pattern.match(/^(\\[.+?\\])\\+$/);\n\t\t\tif (!m) return null;\n\t\t\ttry {\n\t\t\t\treturn new RegExp(`^${m[1]}$`);\n\t\t\t} catch {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}, [props.pattern]);\n\n\t\t// inputTypeとパターンから適切な inputMode を導出\n\t\tconst resolvedInputMode = useMemo(() => {\n\t\t\tif (props.inputType === \"number\") return \"numeric\";\n\t\t\tif (props.inputType === \"tel\") return \"tel\";\n\t\t\tif (props.inputType === \"email\") return \"email\";\n\t\t\tif (props.inputType === \"url\") return \"url\";\n\t\t\tif (props.pattern === \"[0-9]+\") return \"numeric\";\n\t\t\treturn \"text\";\n\t\t}, [props.inputType, props.pattern]);\n\n\t\t// 文字フィルタが定義されている場合:1文字ずつ検証し、不許可文字を遮断\n\t\tconst handleBeforeInput = useCallback(\n\t\t\t(e: React.FormEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n\t\t\t\tif (!charFilterRegex) return;\n\t\t\t\tconst nativeEvent = e.nativeEvent as InputEvent;\n\t\t\t\tif (nativeEvent.data) {\n\t\t\t\t\tfor (const char of nativeEvent.data) {\n\t\t\t\t\t\tif (!charFilterRegex.test(char)) {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\treturn;\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\t[charFilterRegex],\n\t\t);\n\n\t\t// IME確定後に許可外文字が混入した場合も除去\n\t\tconst handleCompositionEnd = useCallback(\n\t\t\t(e: React.CompositionEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n\t\t\t\tif (!charFilterRegex) return;\n\t\t\t\tconst el = e.currentTarget;\n\t\t\t\tconst filtered = [...el.value]\n\t\t\t\t\t.filter((c) => charFilterRegex.test(c))\n\t\t\t\t\t.join(\"\");\n\t\t\t\tif (filtered !== el.value) {\n\t\t\t\t\tonChange(filtered);\n\t\t\t\t}\n\t\t\t},\n\t\t\t[charFilterRegex, onChange],\n\t\t);\n\n\t\tconst shouldShowPlaceholder =\n\t\t\tmode === NoteMode.EDIT || mode === NoteMode.FORM;\n\t\tconst placeholder = shouldShowPlaceholder ? props.placeholder : undefined;\n\n\t\tconst handleContainerClick = (e: React.MouseEvent<HTMLDivElement>) => {\n\t\t\t// コンテナ上の余白クリック時でも input/textarea にフォーカスを移す\n\t\t\tif (isEditable && e.target === e.currentTarget) {\n\t\t\t\tinputRef.current?.focus();\n\t\t\t}\n\t\t};\n\n\t\tif (props.multiline) {\n\t\t\tconst textareaStyle: CSSProperties = {\n\t\t\t\t...inputStyle,\n\t\t\t\tresize: \"none\",\n\t\t\t\toverflow: onMeasureWidth\n\t\t\t\t\t? \"hidden\"\n\t\t\t\t\t: mode === NoteMode.VIEW\n\t\t\t\t\t\t? \"hidden\"\n\t\t\t\t\t\t: \"auto\",\n\t\t\t\t// ゴースト計測済みの場合はコンテンツ高さを使用\n\t\t\t\t// これにより flexbox の alignItems で垂直方向の配置が機能する\n\t\t\t\theight: textareaHeight !== null ? `${textareaHeight}px` : \"auto\",\n\t\t\t};\n\n\t\t\tconst setTextareaRefs = (el: HTMLTextAreaElement | null) => {\n\t\t\t\tinputRef.current = el;\n\t\t\t};\n\n\t\t\treturn (\n\t\t\t\t<div\n\t\t\t\t\tref={containerRef}\n\t\t\t\t\tstyle={containerStyle}\n\t\t\t\t\trole=\"none\"\n\t\t\t\t\tonClick={handleContainerClick}\n\t\t\t\t\tonKeyDown={(e) => {\n\t\t\t\t\t\tif (isEditable && (e.key === \"Enter\" || e.key === \" \"))\n\t\t\t\t\t\t\tinputRef.current?.focus();\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<div ref={ghostRef} style={ghostStyle} aria-hidden=\"true\" />\n\t\t\t\t\t<textarea\n\t\t\t\t\t\tref={setTextareaRefs}\n\t\t\t\t\t\tvalue={safeValue}\n\t\t\t\t\t\tonChange={handleChange}\n\t\t\t\t\t\tonBlur={handleBlur}\n\t\t\t\t\t\tonBeforeInput={handleBeforeInput}\n\t\t\t\t\t\tonCompositionEnd={handleCompositionEnd}\n\t\t\t\t\t\tinputMode={resolvedInputMode}\n\t\t\t\t\t\tstyle={textareaStyle}\n\t\t\t\t\t\tplaceholder={placeholder}\n\t\t\t\t\t\treadOnly={!isEditable}\n\t\t\t\t\t\ttabIndex={isEditable ? 0 : -1}\n\t\t\t\t\t\taria-label={ariaLabel}\n\t\t\t\t\t/>\n\t\t\t\t\t{onMeasureWidth && (\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tref={widthSpanRef}\n\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\tstyle={widthSpanStyle}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t);\n\t\t}\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tstyle={containerStyle}\n\t\t\t\trole=\"none\"\n\t\t\t\tonClick={handleContainerClick}\n\t\t\t\tonKeyDown={(e) => {\n\t\t\t\t\tif (isEditable && (e.key === \"Enter\" || e.key === \" \"))\n\t\t\t\t\t\tinputRef.current?.focus();\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<input\n\t\t\t\t\tref={inputRef as React.RefObject<HTMLInputElement>}\n\t\t\t\t\ttype={props.inputType ?? \"text\"}\n\t\t\t\t\tvalue={safeValue}\n\t\t\t\t\tonChange={handleChange}\n\t\t\t\t\tonBlur={handleBlur}\n\t\t\t\t\tonBeforeInput={handleBeforeInput}\n\t\t\t\t\tonCompositionEnd={handleCompositionEnd}\n\t\t\t\t\tinputMode={resolvedInputMode}\n\t\t\t\t\tstyle={inputStyle}\n\t\t\t\t\tplaceholder={placeholder}\n\t\t\t\t\treadOnly={!isEditable}\n\t\t\t\t\ttabIndex={isEditable ? 0 : -1}\n\t\t\t\t\taria-label={ariaLabel}\n\t\t\t\t\tmin={props.min}\n\t\t\t\t\tmax={props.max}\n\t\t\t\t\tstep={props.step}\n\t\t\t\t/>\n\t\t\t\t{onMeasureWidth && (\n\t\t\t\t\t<span ref={widthSpanRef} aria-hidden=\"true\" style={widthSpanStyle} />\n\t\t\t\t)}\n\t\t\t</div>\n\t\t);\n\t},\n);\n\nTextRenderer.displayName = \"TextRenderer\";\n","import {\n\talignmentProp,\n\tfontStyleProp,\n\tpaddingProp,\n\tplaceholderProp,\n\trequiredProp,\n} from \"../../../plugin\";\nimport { textBehaviorProp, textValidationProp } from \"./props\";\nimport { TextRenderer } from \"./renderer\";\n\nimport type { BlockPlugin } from \"../../../plugin\";\nimport type { TextBlockProps, TextBlockValue } from \"./types\";\n\n/**\n * テキスト入力ブロックのプラグイン定義。\n *\n * `kind: \"text\"` で登録され、フォント・バリデーション・改行・必須入力などの prop まとまりを提供する。\n */\nexport const TextPlugin: BlockPlugin<TextBlockProps, TextBlockValue> = {\n\tkind: \"text\",\n\n\tmeta: {\n\t\tdisplayName: \"テキスト\",\n\t\tdescription: \"テキスト入力用ブロック\",\n\t\tdefaultSize: { w: 3, h: 1 },\n\t},\n\n\tRenderer: TextRenderer,\n\n\tproperties: [\n\t\talignmentProp,\n\t\tpaddingProp,\n\t\tfontStyleProp,\n\t\tplaceholderProp,\n\t\trequiredProp,\n\t\ttextBehaviorProp,\n\t\ttextValidationProp,\n\t],\n\n\tvalidateProps: (props: unknown): TextBlockProps => {\n\t\tconst p = (\n\t\t\ttypeof props === \"object\" && props !== null ? props : {}\n\t\t) as Record<string, unknown>;\n\t\tconst patched: Record<string, unknown> = { ...p };\n\t\tif (typeof patched.minLength !== \"number\") patched.minLength = undefined;\n\t\tif (typeof patched.maxLength !== \"number\") patched.maxLength = undefined;\n\t\tif (typeof patched.pattern !== \"string\") patched.pattern = undefined;\n\t\tconst validInputTypes = [\n\t\t\t\"text\",\n\t\t\t\"number\",\n\t\t\t\"email\",\n\t\t\t\"tel\",\n\t\t\t\"url\",\n\t\t\t\"date\",\n\t\t\t\"password\",\n\t\t];\n\t\tif (!validInputTypes.includes(patched.inputType as string)) {\n\t\t\tpatched.inputType = undefined;\n\t\t}\n\t\tfor (const key of [\"min\", \"max\", \"step\"] as const) {\n\t\t\tif (key in patched && typeof patched[key] !== \"number\") {\n\t\t\t\tpatched[key] = undefined;\n\t\t\t}\n\t\t}\n\t\treturn patched as TextBlockProps;\n\t},\n\n\tvalidateValue: (value: unknown): TextBlockValue | undefined => {\n\t\tif (typeof value === \"string\") return value;\n\t\tif (typeof value === \"number\") return String(value);\n\t\treturn undefined;\n\t},\n};\n","import { useCallback, useMemo, useRef } from \"react\";\n\nimport type { ActionContext, BuiltinActionId } from \"../../types/context\";\n\n/**\n * 個別アクションのハンドラ定義。\n *\n * @internal\n */\ntype ActionHandler = {\n\texecute: (payload?: unknown) => void;\n\tisEnabled: () => boolean;\n\tvalidatePayload?: (payload: unknown) => boolean;\n};\n\n/**\n * アクション ID をキーとしたハンドラマップ。\n *\n * `useBookActionContext` に渡すことで {@link ActionContext} として組み立てられる。\n */\nexport type ActionHandlers = {\n\t[K in BuiltinActionId]?: ActionHandler;\n} & {\n\t[actionId: string]: ActionHandler | undefined;\n};\n\n/**\n * `ActionHandlers` から {@link ActionContext} を組み立てるフック。\n *\n * @remarks\n * **Canvas** — 通常は {@link useNoteContext} 経由で利用してください。\n *\n * 直接使用する場合はアクションの有効/無効判定を自前で実装する必要があります。\n */\nexport function useBookActionContext(handlers: ActionHandlers): ActionContext {\n\tconst handlersRef = useRef(handlers);\n\thandlersRef.current = handlers;\n\n\tconst execute = useCallback((actionId: string, payload?: unknown): void => {\n\t\tconst handler = handlersRef.current[actionId];\n\t\tif (!handler) return;\n\t\tif (\n\t\t\tpayload !== undefined &&\n\t\t\thandler.validatePayload !== undefined &&\n\t\t\t!handler.validatePayload(payload)\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\thandler.execute(payload);\n\t}, []);\n\n\tconst isEnabled = useCallback((actionId: string): boolean => {\n\t\treturn handlersRef.current[actionId]?.isEnabled() ?? false;\n\t}, []);\n\n\treturn useMemo(() => ({ execute, isEnabled }), [execute, isEnabled]);\n}\n","import { useCallback, useMemo, useRef } from \"react\";\n\nimport { bindingKey } from \"../history/mergeKeys\";\n\nimport type { OnBookChange } from \"../../types/callbacks\";\nimport type { BindingContext } from \"../../types/context\";\nimport type { Book } from \"../../types/schema\";\nimport type { Value } from \"../../types/value\";\n\n/**\n * ネストしたオブジェクトの指定キーパスに値をセットした新しいオブジェクトを返す。\n *\n * `keys` が空の場合は `value` をそのまま返す。途中のキーが存在しない場合は空オブジェクトとして扱う。\n */\nexport function setNested(obj: unknown, keys: string[], value: Value): unknown {\n\tif (keys.length === 0) return value;\n\tconst [head, ...tail] = keys as [string, ...string[]];\n\tconst current = (\n\t\ttypeof obj === \"object\" && obj !== null ? obj : {}\n\t) as Record<string, unknown>;\n\treturn {\n\t\t...current,\n\t\t[head]: setNested(current[head], tail, value),\n\t};\n}\n\n/**\n * `Book` のドットパス位置に値をセットした新しい `Book` を返す。\n */\nexport function setPath(obj: Book, path: string, value: Value): Book {\n\tconst keys = path.split(\".\");\n\treturn setNested(obj, keys, value) as Book;\n}\n\n/**\n * オブジェクトのドットパスを再帰的にたどり、値を返す。\n *\n * 途中のキーが `null` またはオブジェクト以外の場合は `null` を返す。\n */\nexport function resolvePath(obj: unknown, path: string): Value {\n\tconst keys = path.split(\".\");\n\tlet current: unknown = obj;\n\tfor (const key of keys) {\n\t\tif (current === null || typeof current !== \"object\") return null;\n\t\tcurrent = (current as Record<string, unknown>)[key];\n\t}\n\treturn (current as Value) ?? null;\n}\n\n/**\n * {@link useBookBindingContext} のオプション。\n */\nexport interface BookBindingContextOptions {\n\t/**\n\t * `grid.*` パスの解決対象ページインデックス。デフォルト: 0。\n\t */\n\tpageIdx?: number;\n\n\t/**\n\t * ユーザー定義の追加 BindingContext。\n\t * 組み込みパスより優先して参照される。\n\t * `get` が `undefined` を返した場合 / `set` が処理しなかった場合は組み込みにフォールバックする。\n\t * 注意: `set` のフォールバック判定は `extra.get(path)` が `undefined` かどうかを基準にする。\n\t */\n\textra?: BindingContext;\n}\n\n/**\n * book 全体の読み書きを担う BindingContext を生成するフック。\n *\n * @remarks\n * **Canvas** — 通常は {@link useNoteContext} 経由で自動生成される。\n *\n * 直接呼ぶのは独自の BindingContext レイヤーを構築する場合のみとすること。\n *\n * 以下のパス名前空間を組み込みで処理する:\n * - `paper.*` — `book.paper.*` に対応\n * - `margin.*` — `book.paper.margin.*` に対応(`margin.bulk` / `margin.all.*` も通常パスとして解決)\n * - `grid.*` — `book.pages[pageIdx].grid.*` に対応(`options.pageIdx` で制御)\n * - 上記以外 — `book` のルートから直接解決(後方互換)\n *\n * @example\n * ```tsx\n * const bindingContext = useBookBindingContext(book, onBookChange, { pageIdx });\n *\n * // 全ての widget に同じ bindingContext を渡すだけ\n * <FloatingWidget bindingContext={bindingContext} ... />\n * ```\n */\nexport function useBookBindingContext(\n\tbook: Book,\n\tonBookChange: OnBookChange,\n\toptions?: BookBindingContextOptions,\n): BindingContext {\n\tconst bookRef = useRef(book);\n\tbookRef.current = book;\n\tconst pageIdxRef = useRef(options?.pageIdx ?? 0);\n\tpageIdxRef.current = options?.pageIdx ?? 0;\n\tconst extraRef = useRef(options?.extra);\n\textraRef.current = options?.extra;\n\tconst get = useCallback((path: string): Value => {\n\t\t// extra を先に試みる\n\t\tconst extra = extraRef.current;\n\t\tif (extra) {\n\t\t\tconst v = extra.get(path);\n\t\t\tif (v !== undefined) return v;\n\t\t}\n\n\t\tconst b = bookRef.current;\n\n\t\t// margin.* → paper.margin.*\n\t\tif (path.startsWith(\"margin.\")) {\n\t\t\treturn resolvePath(b.paper.margin, path.slice(7));\n\t\t}\n\n\t\t// grid.* → pages[pageIdx].grid.*\n\t\tif (path.startsWith(\"grid.\")) {\n\t\t\treturn resolvePath(b.pages[pageIdxRef.current]?.grid, path.slice(5));\n\t\t}\n\n\t\t// それ以外はルートから直接解決(paper.* を含む)\n\t\treturn resolvePath(b, path);\n\t}, []);\n\n\tconst set = useCallback(\n\t\t(path: string, value: Value): void => {\n\t\t\t// extra を先に試みる(extra が処理するパスかどうかは get で判定)\n\t\t\tconst extra = extraRef.current;\n\t\t\tif (extra) {\n\t\t\t\tconst v = extra.get(path);\n\t\t\t\tif (v !== undefined) {\n\t\t\t\t\textra.set(path, value);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst b = bookRef.current;\n\n\t\t\t// margin.* → paper.margin.* (純粋エイリアス)\n\t\t\tif (path.startsWith(\"margin.\")) {\n\t\t\t\t// margin.bulk が true に切り替わるとき、margin.all が未設定なら margin.top で初期化する\n\t\t\t\t// (unit なしの中間状態を防ぐ)\n\t\t\t\tif (path === \"margin.bulk\" && value === true) {\n\t\t\t\t\tconst margin = b.paper.margin;\n\t\t\t\t\tconst all = margin.all?.unit ? margin.all : margin.top;\n\t\t\t\t\tonBookChange(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t...b,\n\t\t\t\t\t\t\tpaper: { ...b.paper, margin: { ...margin, bulk: true, all } },\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{ mergeKey: bindingKey(path) },\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst subKey = path.slice(7);\n\t\t\t\tconst newMargin = setNested(\n\t\t\t\t\tb.paper.margin,\n\t\t\t\t\tsubKey.split(\".\"),\n\t\t\t\t\tvalue,\n\t\t\t\t) as typeof b.paper.margin;\n\t\t\t\tonBookChange(\n\t\t\t\t\t{ ...b, paper: { ...b.paper, margin: newMargin } },\n\t\t\t\t\t{ mergeKey: bindingKey(path) },\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// grid.* → pages[pageIdx].grid.*\n\t\t\tif (path.startsWith(\"grid.\")) {\n\t\t\t\tconst pi = pageIdxRef.current;\n\t\t\t\tconst page = b.pages[pi];\n\t\t\t\tif (!page) return;\n\t\t\t\tconst newGrid = setNested(page.grid, path.slice(5).split(\".\"), value);\n\t\t\t\tconst newPages = b.pages.map((p, i) =>\n\t\t\t\t\ti === pi ? { ...p, grid: newGrid } : p,\n\t\t\t\t);\n\t\t\t\tonBookChange(\n\t\t\t\t\t{ ...b, pages: newPages as typeof b.pages },\n\t\t\t\t\t{ mergeKey: bindingKey(path) },\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// それ以外はルートから直接更新(paper.* を含む)\n\t\t\tonBookChange(setPath(b, path, value), { mergeKey: bindingKey(path) });\n\t\t},\n\t\t[onBookChange],\n\t);\n\n\treturn useMemo(() => ({ get, set }), [get, set]);\n}\n","import { useCallback, useReducer } from \"react\";\n\nimport type { Book } from \"../../types/schema\";\nimport type { ActionHandlers } from \"../action/useBookActionContext\";\n\nconst MERGE_WINDOW_MS = 500;\n\n// 履歴の1エントリ(Book + mergeKey + タイムスタンプ)\ninterface HistoryEntry {\n\tbook: Book;\n\tmergeKey?: string;\n\ttimestamp: number;\n}\n\n// 履歴全体の状態(エントリ配列 + 現在インデックス)\ninterface HistState {\n\tentries: HistoryEntry[];\n\tidx: number;\n}\n\n// 履歴 reducer のアクション型\ntype HistAction =\n\t| {\n\t\t\ttype: \"push\";\n\t\t\tbook: Book;\n\t\t\tmergeKey?: string;\n\t\t\t/** true のとき 500ms 時間窓を無視してマージする(セッション型 mergeKey 専用)。 */\n\t\t\tnoTimeWindow?: boolean;\n\t\t\ttimestamp: number;\n\t\t\tmaxHistory: number;\n\t }\n\t| { type: \"undo\" }\n\t| { type: \"redo\" };\n\n// 履歴の追加・戹除(Undo/Redo)を処理する純粋な reducer\nfunction histReducer(state: HistState, action: HistAction): HistState {\n\tswitch (action.type) {\n\t\tcase \"push\": {\n\t\t\tconst last = state.entries[state.idx];\n\t\t\tconst shouldMerge =\n\t\t\t\taction.mergeKey !== undefined &&\n\t\t\t\tlast?.mergeKey === action.mergeKey &&\n\t\t\t\t(action.noTimeWindow === true ||\n\t\t\t\t\taction.timestamp - (last?.timestamp ?? 0) < MERGE_WINDOW_MS);\n\n\t\t\tif (shouldMerge) {\n\t\t\t\treturn {\n\t\t\t\t\tentries: [\n\t\t\t\t\t\t...state.entries.slice(0, state.idx),\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tbook: action.book,\n\t\t\t\t\t\t\tmergeKey: action.mergeKey,\n\t\t\t\t\t\t\ttimestamp: action.timestamp,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tidx: state.idx,\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst newEntries = [\n\t\t\t\t...state.entries.slice(0, state.idx + 1),\n\t\t\t\t{\n\t\t\t\t\tbook: action.book,\n\t\t\t\t\tmergeKey: action.mergeKey,\n\t\t\t\t\ttimestamp: action.timestamp,\n\t\t\t\t},\n\t\t\t];\n\t\t\tconst trimmed =\n\t\t\t\tnewEntries.length > action.maxHistory\n\t\t\t\t\t? newEntries.slice(newEntries.length - action.maxHistory)\n\t\t\t\t\t: newEntries;\n\t\t\treturn {\n\t\t\t\tentries: trimmed,\n\t\t\t\tidx: trimmed.length - 1,\n\t\t\t};\n\t\t}\n\t\tcase \"undo\":\n\t\t\treturn { ...state, idx: Math.max(0, state.idx - 1) };\n\t\tcase \"redo\":\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tidx: Math.min(state.entries.length - 1, state.idx + 1),\n\t\t\t};\n\t}\n}\n\nconst DEFAULT_MAX_HISTORY = 100;\n\n/**\n * {@link useBookHistory} のオプション。\n */\nexport interface UseBookHistoryOptions {\n\t/** 履歴の初期 Book。 */\n\tinitialBook: Book;\n\n\t/**\n\t * 保持する最大履歴件数。`null` または省略時は `100` が使われる。\n\t *\n\t * 超過した古いエントリは末尾追加時に先頭から切り捨てられる。\n\t */\n\tmaxHistory?: number | null;\n}\n\n/**\n * {@link useBookHistory} の戻り値。\n */\nexport interface UseBookHistoryResult {\n\t/** 現在の Book(履歴上のカレントポインタ側)。 */\n\tbook: Book;\n\n\t/** Book の変更を履歴に追加するコールバック。`mergeKey` が同じ変更はマージされる(`noTimeWindow: true` で時間窓なし)。 */\n\thandleBookChange: (\n\t\tbook: Book,\n\t\toptions?: { mergeKey?: string; noTimeWindow?: boolean },\n\t) => void;\n\n\t/** Undo 可能かどうか。 */\n\tcanUndo: boolean;\n\n\t/** Redo 可能かどうか。 */\n\tcanRedo: boolean;\n\n\t/** Undo 実行関数。 */\n\tundo: () => void;\n\n\t/** Redo 実行関数。 */\n\tredo: () => void;\n\n\t/** `useBookActionContext` にそのまま渡せる undo/redo の ActionHandlers。 */\n\thistoryActionHandlers: ActionHandlers;\n}\n\n/**\n * `useReducer` ベースの Undo/Redo 履歴管理フック。\n *\n * 同じ `mergeKey` かつ {@link MERGE_WINDOW_MS} ms 以内の変更は履歴エントリをマージする。\n *\n * @remarks\n * **Canvas** — 通常は {@link useNoteContext} から自動利用される。\n *\n * 直接呼ぶのは独自の履歴層を構築する場合のみとすること。\n */\nexport function useBookHistory({\n\tinitialBook,\n\tmaxHistory = DEFAULT_MAX_HISTORY,\n}: UseBookHistoryOptions): UseBookHistoryResult {\n\tconst resolvedMaxHistory = maxHistory ?? DEFAULT_MAX_HISTORY;\n\n\tconst [state, dispatch] = useReducer(histReducer, undefined, () => ({\n\t\tentries: [{ book: initialBook, timestamp: Date.now() }],\n\t\tidx: 0,\n\t}));\n\n\tconst book = state.entries[state.idx]?.book ?? initialBook;\n\n\tconst handleBookChange = useCallback(\n\t\t(\n\t\t\tnewBook: Book,\n\t\t\toptions?: { mergeKey?: string; noTimeWindow?: boolean },\n\t\t) => {\n\t\t\tdispatch({\n\t\t\t\ttype: \"push\",\n\t\t\t\tbook: newBook,\n\t\t\t\tmergeKey: options?.mergeKey,\n\t\t\t\tnoTimeWindow: options?.noTimeWindow,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\tmaxHistory: resolvedMaxHistory,\n\t\t\t});\n\t\t},\n\t\t[resolvedMaxHistory],\n\t);\n\n\tconst undo = useCallback(() => dispatch({ type: \"undo\" }), []);\n\tconst redo = useCallback(() => dispatch({ type: \"redo\" }), []);\n\n\treturn {\n\t\tbook,\n\t\thandleBookChange,\n\t\tcanUndo: state.idx > 0,\n\t\tcanRedo: state.idx < state.entries.length - 1,\n\t\tundo,\n\t\tredo,\n\t\thistoryActionHandlers: {\n\t\t\tundo: { execute: undo, isEnabled: () => state.idx > 0 },\n\t\t\tredo: {\n\t\t\t\texecute: redo,\n\t\t\t\tisEnabled: () => state.idx < state.entries.length - 1,\n\t\t\t},\n\t\t},\n\t};\n}\n","// ブロック枠線・ガイド線の SVG 描画ヘルパー\n\nimport { LineType } from \"../../../types/line\";\nimport { toPx } from \"../../../utils/convert\";\n\nimport type { LineStyle } from \"../../../types/line\";\n\n/**\n * 線種とライン幅から SVG の `stroke-dasharray` 値を返します。\n * @param type - 線の種類(実線 / 破線 / 点線)。\n * @param lineWidth - 線幅の数値(単位は px)。\n * @returns DASHED / DOTTED の場合は dasharray 文字列、SOLID の場合は `undefined`。\n */\nexport function getLineDasharray(\n\ttype: LineType,\n\tlineWidth: number,\n): string | undefined {\n\tif (type === LineType.DASHED) return `${lineWidth * 4} ${lineWidth * 2}`;\n\tif (type === LineType.DOTTED) return `${lineWidth * 1} ${lineWidth * 2}`;\n\treturn undefined;\n}\n\n/**\n * `LineStyle` を SVG line 要素の属性オブジェクトに変換します。\n * @param style - ライン設定(色・幅・線種)。\n * @param dpi - DPI 値。幅の単位変換に使用します。\n */\nexport function lineAttrs(style: LineStyle, dpi: number) {\n\treturn {\n\t\tstroke: style.color,\n\t\tstrokeWidth: toPx.fromDim(style.width, dpi),\n\t\tstrokeDasharray: getLineDasharray(style.type, style.width.value),\n\t};\n}\n","import { type FC, memo } from \"react\";\n\nimport { DEFAULT_DPI } from \"../../../utils/convert\";\nimport { BLOCK_SUB_INDEX, getSubZIndex } from \"../../../utils/zIndex\";\nimport { lineAttrs } from \"./borderUtils\";\n\nimport type { BorderStyle } from \"../../../types/line\";\nimport type { BlockSizePx } from \"../types\";\n\n/**\n * `BlockBorder` コンポーネントへの props。\n */\nexport interface BlockBorderProps {\n\t/** ブロックのサイズ(px)。 */\n\tblockSizePx: BlockSizePx;\n\n\t/** ユーザー設定の枠線スタイル。省略時は描画しない。 */\n\tborderStyle?: BorderStyle;\n\n\t/** z-index のベース値。 */\n\tblockZIndex: number;\n\n\t/** z-index のサブオフセット(既定値: `BLOCK_SUB_INDEX.BORDER`)。 */\n\tsubZIndex?: number;\n\n\t/** `false` にすると枠線全体を非表示にする(既定値: `true`)。 */\n\tvisible?: boolean;\n\n\t/** DPI 値。線幅の単位変換に使用する(既定値: `DEFAULT_DPI`)。 */\n\tdpi?: number;\n}\n\n/**\n * ユーザー設定の枠線を SVG で描画するコンポーネント。\n *\n * 枠線スタイルが未設定、または全辺が空の場合は `null` を返します。\n *\n * @remarks\n * **Canvas** — {@link BlockLayer} のブロック枠線描画サブコンポーネント。\n */\nexport const BlockBorder: FC<BlockBorderProps> = memo(\n\t({\n\t\tblockSizePx,\n\t\tborderStyle,\n\t\tblockZIndex,\n\t\tsubZIndex = BLOCK_SUB_INDEX.BORDER,\n\t\tvisible = true,\n\t\tdpi = DEFAULT_DPI,\n\t}) => {\n\t\tif (!visible || !borderStyle) return null;\n\t\tconst { top, right, bottom, left } = borderStyle;\n\t\tif (!top && !right && !bottom && !left) return null;\n\n\t\tconst { width: w, height: h } = blockSizePx;\n\t\tconst zIndex = getSubZIndex(blockZIndex, subZIndex);\n\n\t\treturn (\n\t\t\t<svg\n\t\t\t\trole=\"presentation\"\n\t\t\t\taria-hidden=\"true\"\n\t\t\t\tstyle={{\n\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\tinset: 0,\n\t\t\t\t\twidth: `${w}px`,\n\t\t\t\t\theight: `${h}px`,\n\t\t\t\t\tpointerEvents: \"none\",\n\t\t\t\t\toverflow: \"visible\",\n\t\t\t\t\tzIndex,\n\t\t\t\t}}\n\t\t\t\twidth={w}\n\t\t\t\theight={h}\n\t\t\t\tdata-testid=\"block-border\"\n\t\t\t>\n\t\t\t\t{top && <line x1={0} y1={0} x2={w} y2={0} {...lineAttrs(top, dpi)} />}\n\t\t\t\t{right && (\n\t\t\t\t\t<line x1={w} y1={0} x2={w} y2={h} {...lineAttrs(right, dpi)} />\n\t\t\t\t)}\n\t\t\t\t{bottom && (\n\t\t\t\t\t<line x1={0} y1={h} x2={w} y2={h} {...lineAttrs(bottom, dpi)} />\n\t\t\t\t)}\n\t\t\t\t{left && <line x1={0} y1={0} x2={0} y2={h} {...lineAttrs(left, dpi)} />}\n\t\t\t</svg>\n\t\t);\n\t},\n);\n\nBlockBorder.displayName = \"BlockBorder\";\n","import { type CSSProperties, type FC, memo } from \"react\";\n\nimport { BLOCK_SUB_INDEX, getSubZIndex } from \"../../../utils/zIndex\";\n\nimport type { BlockSizePx } from \"../types\";\n\n/**\n * `BlockCanvas` コンポーネントへの props。\n */\nexport interface BlockCanvasProps {\n\t/** ブロックのサイズ(px)。 */\n\tblockSizePx: BlockSizePx;\n\n\t/** z-index のベース値。 */\n\tblockZIndex: number;\n\n\t/** z-index のサブオフセット(既定値: `BLOCK_SUB_INDEX.BG`)。 */\n\tsubZIndex?: number;\n\n\t/** 背景色(既定値: `\"transparent\"`)。 */\n\tbackgroundColor?: string;\n}\n\n/**\n * ブロックの背景を描画するコンポーネント。\n *\n * @remarks\n * **Canvas** — {@link BlockLayer} のブロック背景描画サブコンポーネント。\n */\nexport const BlockCanvas: FC<BlockCanvasProps> = memo(\n\t({\n\t\tblockSizePx,\n\t\tblockZIndex,\n\t\tsubZIndex = BLOCK_SUB_INDEX.BG,\n\t\tbackgroundColor = \"transparent\",\n\t}) => {\n\t\tconst zIndex = getSubZIndex(blockZIndex, subZIndex);\n\n\t\tconst style: CSSProperties = {\n\t\t\tposition: \"absolute\",\n\t\t\tinset: 0,\n\t\t\twidth: `${blockSizePx.width}px`,\n\t\t\theight: `${blockSizePx.height}px`,\n\t\t\tbackgroundColor,\n\t\t\tpointerEvents: \"none\",\n\t\t\tzIndex,\n\t\t};\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tstyle={style}\n\t\t\t\trole=\"presentation\"\n\t\t\t\taria-hidden=\"true\"\n\t\t\t\tdata-testid=\"block-canvas\"\n\t\t\t/>\n\t\t);\n\t},\n);\n\nBlockCanvas.displayName = \"BlockCanvas\";\n","import { type FC, memo } from \"react\";\n\nimport { LineType } from \"../../../types/line\";\nimport { BLOCK_SUB_INDEX, getSubZIndex } from \"../../../utils/zIndex\";\n\nimport type { BorderStyle } from \"../../../types/line\";\nimport type { BlockSizePx } from \"../types\";\n\n// 線種・ストローク幅から SVG ダッシュパターン文字列を生成するヘルパー\nfunction toDashArray(type: LineType, strokeWidth: number): string | undefined {\n\tif (type === LineType.DASHED) return `${strokeWidth * 3} ${strokeWidth * 2}`;\n\tif (type === LineType.DOTTED) return `${strokeWidth} ${strokeWidth * 2}`;\n\treturn undefined;\n}\n\n/**\n * ユーザー設定枠線が未設定のブロックに適用するデフォルトのガイド枠線スタイル。\n *\n * @remarks\n * **Canvas** — {@link BlockGuideBorder} のデフォルト枠線スタイル。\n */\nexport const DEFAULT_GUIDE_BORDER: BorderStyle = {\n\ttop: {\n\t\tcolor: \"#cccccc\",\n\t\twidth: { value: 1, unit: \"px\" },\n\t\ttype: LineType.SOLID,\n\t},\n\tright: {\n\t\tcolor: \"#cccccc\",\n\t\twidth: { value: 1, unit: \"px\" },\n\t\ttype: LineType.SOLID,\n\t},\n\tbottom: {\n\t\tcolor: \"#cccccc\",\n\t\twidth: { value: 1, unit: \"px\" },\n\t\ttype: LineType.SOLID,\n\t},\n\tleft: {\n\t\tcolor: \"#cccccc\",\n\t\twidth: { value: 1, unit: \"px\" },\n\t\ttype: LineType.SOLID,\n\t},\n};\n\n/**\n * `BlockGuideBorder` コンポーネントへの props。\n */\nexport interface BlockGuideBorderProps {\n\t/** ブロックのサイズ(px)。 */\n\tblockSizePx: BlockSizePx;\n\n\t/** z-index のベース値。 */\n\tblockZIndex: number;\n\n\t/** z-index のサブオフセット(既定値: `BLOCK_SUB_INDEX.GUIDE`)。 */\n\tsubZIndex?: number;\n\n\t/** 表示するガイド枠線スタイル(既定値: `DEFAULT_GUIDE_BORDER`)。 */\n\tborderStyle?: BorderStyle;\n\n\t/** `false` にするとガイド枠線全体を非表示にする(既定値: `true`)。 */\n\tvisible?: boolean;\n}\n\n/**\n * 編集ガイド用の薄い枠線を SVG で描画するコンポーネント。\n *\n * ユーザー設定枠線がない場合にレイアウト確認用として表示します。\n *\n * @remarks\n * **Canvas** — {@link BlockLayer} のガイド枠線描画サブコンポーネント。\n */\nexport const BlockGuideBorder: FC<BlockGuideBorderProps> = memo(\n\t({\n\t\tblockSizePx,\n\t\tblockZIndex,\n\t\tsubZIndex = BLOCK_SUB_INDEX.GUIDE,\n\t\tborderStyle = DEFAULT_GUIDE_BORDER,\n\t\tvisible = true,\n\t}) => {\n\t\tif (!visible || !borderStyle) return null;\n\t\tconst { top, right, bottom, left } = borderStyle;\n\t\tif (!top && !right && !bottom && !left) return null;\n\n\t\tconst { width: w, height: h } = blockSizePx;\n\t\tconst zIndex = getSubZIndex(blockZIndex, subZIndex);\n\n\t\t// ガイド枠線:borderStyleの太さ・タイプを反映して描画\n\t\treturn (\n\t\t\t<svg\n\t\t\t\trole=\"presentation\"\n\t\t\t\taria-hidden=\"true\"\n\t\t\t\tstyle={{\n\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\tinset: 0,\n\t\t\t\t\twidth: `${w}px`,\n\t\t\t\t\theight: `${h}px`,\n\t\t\t\t\tpointerEvents: \"none\",\n\t\t\t\t\toverflow: \"visible\",\n\t\t\t\t\tzIndex,\n\t\t\t\t}}\n\t\t\t\twidth={w}\n\t\t\t\theight={h}\n\t\t\t\tdata-testid=\"block-guide-border\"\n\t\t\t>\n\t\t\t\t{top && (\n\t\t\t\t\t<line\n\t\t\t\t\t\tx1={0}\n\t\t\t\t\t\ty1={0}\n\t\t\t\t\t\tx2={w}\n\t\t\t\t\t\ty2={0}\n\t\t\t\t\t\tstroke={top.color}\n\t\t\t\t\t\tstrokeWidth={top.width.value}\n\t\t\t\t\t\tstrokeDasharray={toDashArray(top.type, top.width.value)}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t\t{right && (\n\t\t\t\t\t<line\n\t\t\t\t\t\tx1={w}\n\t\t\t\t\t\ty1={0}\n\t\t\t\t\t\tx2={w}\n\t\t\t\t\t\ty2={h}\n\t\t\t\t\t\tstroke={right.color}\n\t\t\t\t\t\tstrokeWidth={right.width.value}\n\t\t\t\t\t\tstrokeDasharray={toDashArray(right.type, right.width.value)}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t\t{bottom && (\n\t\t\t\t\t<line\n\t\t\t\t\t\tx1={0}\n\t\t\t\t\t\ty1={h}\n\t\t\t\t\t\tx2={w}\n\t\t\t\t\t\ty2={h}\n\t\t\t\t\t\tstroke={bottom.color}\n\t\t\t\t\t\tstrokeWidth={bottom.width.value}\n\t\t\t\t\t\tstrokeDasharray={toDashArray(bottom.type, bottom.width.value)}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t\t{left && (\n\t\t\t\t\t<line\n\t\t\t\t\t\tx1={0}\n\t\t\t\t\t\ty1={0}\n\t\t\t\t\t\tx2={0}\n\t\t\t\t\t\ty2={h}\n\t\t\t\t\t\tstroke={left.color}\n\t\t\t\t\t\tstrokeWidth={left.width.value}\n\t\t\t\t\t\tstrokeDasharray={toDashArray(left.type, left.width.value)}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</svg>\n\t\t);\n\t},\n);\n\nBlockGuideBorder.displayName = \"BlockGuideBorder\";\n","import {\n\ttype CSSProperties,\n\ttype ForwardedRef,\n\tforwardRef,\n\tmemo,\n\tuseImperativeHandle,\n\tuseRef,\n} from \"react\";\n\nimport { BLOCK_SUB_INDEX, getSubZIndex } from \"../../../utils/zIndex\";\n\nimport type { ResolvedPlugin } from \"../../../plugin/registry\";\nimport type { BlockRef, RendererProps } from \"../../../plugin/types\";\nimport type { ActionContext, BindingContext } from \"../../../types/context\";\nimport type { NoteMode } from \"../../../types/mode\";\nimport type { Value } from \"../../../types/value\";\nimport type { BlockSizePx } from \"../types\";\n\n/**\n * `BlockRenderer` コンポーネントへの props。\n */\nexport interface BlockRendererProps {\n\t/** ブロックの ID。 */\n\tid: string;\n\n\t/** 解決済みプラグイン。 */\n\tresolvedPlugin: ResolvedPlugin;\n\n\t/** プロパティマップ(プラグインデフォルトとユーザー値をマージ済み)。 */\n\tprops: Record<string, Value>;\n\n\t/** ブロックの現在値。 */\n\tvalue: Value;\n\n\t/** 値変更時のコールバック。読み取り専用の場合は不要。 */\n\tonChange?: (value: Value) => void;\n\n\t/** `true` の場合、レンダラーは読み取り専用で入力を受け付けない。 */\n\treadOnly: boolean;\n\n\t/** 表示モード。 */\n\tmode: NoteMode;\n\n\t/** ブロックのサイズ(px)。 */\n\tblockSizePx: BlockSizePx;\n\n\t/** z-index のベース値。 */\n\tblockZIndex: number;\n\n\t/** z-index のサブオフセット(既定値: `BLOCK_SUB_INDEX.CONTENT`)。 */\n\tsubZIndex?: number;\n\n\t/** 高さが動的に測定された際のコールバック。 */\n\tonMeasureHeight?: (heightPx: number) => void;\n\n\t/** 幅が動的に測定された際のコールバック。 */\n\tonMeasureWidth?: (widthPx: number) => void;\n\n\t/** フォーカス離脱時の値確定通知コールバック。 */\n\tonBlur?: (value: Value) => void;\n\n\t/** 値バインディング用コンテキスト。 */\n\tbindingContext?: BindingContext;\n\n\t/** アクション実行用コンテキスト。 */\n\tactionContext?: ActionContext;\n\n\t/** ブロックに設定されたベース背景色。 */\n\tblockBackgroundColor?: string;\n}\n\n// forwardRef でラップする前の内部実装関数\nconst BlockRendererInner = (\n\t{\n\t\tid,\n\t\tresolvedPlugin,\n\t\tprops,\n\t\tvalue,\n\t\tonChange,\n\t\tonBlur,\n\t\treadOnly,\n\t\tmode,\n\t\tblockSizePx,\n\t\tblockZIndex,\n\t\tsubZIndex = BLOCK_SUB_INDEX.CONTENT,\n\t\tonMeasureHeight,\n\t\tonMeasureWidth,\n\t\tbindingContext,\n\t\tactionContext,\n\t\tblockBackgroundColor,\n\t}: BlockRendererProps,\n\tref: ForwardedRef<BlockRef>,\n) => {\n\tconst innerRef = useRef<BlockRef>(null);\n\n\tuseImperativeHandle(\n\t\tref,\n\t\t() => ({ focus: () => innerRef.current?.focus() }),\n\t\t[],\n\t);\n\n\tconst zIndex = getSubZIndex(blockZIndex, subZIndex);\n\n\tconst containerStyle: CSSProperties = {\n\t\tposition: \"absolute\",\n\t\tinset: 0,\n\t\twidth: `${blockSizePx.width}px`,\n\t\theight: `${blockSizePx.height}px`,\n\t\tzIndex,\n\t\tpointerEvents: \"auto\",\n\t};\n\n\tconst rendererProps: RendererProps<Record<string, Value>, Value> = {\n\t\tid,\n\t\tprops,\n\t\tvalue,\n\t\tonChange: onChange ?? (() => {}),\n\t\tonBlur,\n\t\treadOnly,\n\t\tmode,\n\t\tdimensions: { widthPx: blockSizePx.width, heightPx: blockSizePx.height },\n\t\tonMeasureHeight,\n\t\tonMeasureWidth,\n\t\tariaLabel: resolvedPlugin.meta.displayName,\n\t\tbindingContext,\n\t\tactionContext,\n\t\tblockBackgroundColor,\n\t};\n\n\tconst { Renderer } = resolvedPlugin;\n\n\treturn (\n\t\t<div\n\t\t\tstyle={containerStyle}\n\t\t\tdata-testid=\"block-renderer\"\n\t\t\tdata-block-id={id}\n\t\t\tdata-plugin-kind={resolvedPlugin.kind}\n\t\t>\n\t\t\t<Renderer ref={innerRef} {...rendererProps} />\n\t\t</div>\n\t);\n};\n\n/**\n * プラグインの `Renderer` を実行し、コンテナ内にマウントするコンポーネント。\n *\n * `ref` で {@link BlockRef} を取得できます。\n *\n * @remarks\n * **Canvas** — {@link BlockLayer} 内でプラグインレンダラーを実行するサブコンポーネント。\n */\nexport const BlockRenderer = memo(\n\tforwardRef<BlockRef, BlockRendererProps>(BlockRendererInner),\n);\n\nBlockRenderer.displayName = \"BlockRenderer\";\n","// BlockLayer のみで使用するユーティリティ。\n// block.props + plugin のデフォルト props + page-level blockDefaults を合成して\n// 完全な props オブジェクトを返す。\n\nimport type { ResolvedPlugin } from \"../../../../plugin\";\nimport type { Block, BlockDefaults, Value } from \"../../../../types\";\n\n/**\n * ブロックの完全な props を解決する。\n *\n * 優先順位(高→低): block.props > blockDefaults[kind] > plugin.defaultProps\n */\nexport function resolveBlockProps(\n\tblock: Block,\n\tresolvedPlugin: ResolvedPlugin,\n\tblockDefaults?: BlockDefaults,\n): Record<string, Value> {\n\tconst kindDefaults = blockDefaults?.[block.kind] ?? {};\n\treturn {\n\t\t...resolvedPlugin.defaultProps,\n\t\t...kindDefaults,\n\t\t...block.props,\n\t};\n}\n","import { type CSSProperties, type FC, memo, useState } from \"react\";\n\nimport { BLOCK_SUB_INDEX, getSubZIndex } from \"../../../utils/zIndex\";\n\nimport type { ValidationError } from \"../../../types/validation\";\nimport type { BlockSizePx } from \"../types\";\n\n/**\n * `ValidationOverlay` コンポーネントへの props。\n */\nexport interface ValidationOverlayProps {\n\t/** ブロックのサイズ(px)。 */\n\tblockSizePx: BlockSizePx;\n\n\t/** z-index のベース値。 */\n\tblockZIndex: number;\n\n\t/** 表示するバリデーションエラー一覧。空配列の場合は描画しない。 */\n\terrors: ValidationError[];\n}\n\n/**\n * バリデーションエラーを示すオーバーレイコンポーネント。\n *\n * エラーがある場合は黒黄の縞模様を表示し、ホバー時にエラーメッセージをツールチップが示します。\n *\n * @remarks\n * **Canvas** — {@link BlockLayer} のバリデーションオーバーレイサブコンポーネント。\n *\n * 通常は {@link BlockLayer} の `showValidation` prop で制御する。\n */\nexport const ValidationOverlay: FC<ValidationOverlayProps> = memo(\n\t({ blockSizePx, blockZIndex, errors }) => {\n\t\tconst [hovered, setHovered] = useState(false);\n\n\t\tif (errors.length === 0) return null;\n\n\t\tconst zIndex = getSubZIndex(blockZIndex, BLOCK_SUB_INDEX.VALIDATION);\n\t\tconst BORDER_WIDTH = 3;\n\t\tconst stripe =\n\t\t\t\"repeating-linear-gradient(45deg, #1a1a1a 0px, #1a1a1a 4px, #FFD700 4px, #FFD700 8px)\";\n\n\t\tconst containerStyle: CSSProperties = {\n\t\t\tposition: \"absolute\",\n\t\t\ttop: -BORDER_WIDTH,\n\t\t\tleft: -BORDER_WIDTH,\n\t\t\twidth: `${blockSizePx.width + BORDER_WIDTH * 2}px`,\n\t\t\theight: `${blockSizePx.height + BORDER_WIDTH * 2}px`,\n\t\t\tzIndex,\n\t\t\tpointerEvents: \"none\",\n\t\t};\n\n\t\tconst edgeStyle = (side: CSSProperties): CSSProperties => ({\n\t\t\tposition: \"absolute\",\n\t\t\tbackground: stripe,\n\t\t\t...side,\n\t\t});\n\n\t\treturn (\n\t\t\t<div style={containerStyle} data-testid=\"validation-overlay\">\n\t\t\t\t<div\n\t\t\t\t\tstyle={edgeStyle({\n\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\twidth: \"100%\",\n\t\t\t\t\t\theight: BORDER_WIDTH,\n\t\t\t\t\t})}\n\t\t\t\t/>\n\t\t\t\t<div\n\t\t\t\t\tstyle={edgeStyle({\n\t\t\t\t\t\tbottom: 0,\n\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\twidth: \"100%\",\n\t\t\t\t\t\theight: BORDER_WIDTH,\n\t\t\t\t\t})}\n\t\t\t\t/>\n\t\t\t\t<div\n\t\t\t\t\tstyle={edgeStyle({\n\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\twidth: BORDER_WIDTH,\n\t\t\t\t\t\theight: \"100%\",\n\t\t\t\t\t})}\n\t\t\t\t/>\n\t\t\t\t<div\n\t\t\t\t\tstyle={edgeStyle({\n\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\tright: 0,\n\t\t\t\t\t\twidth: BORDER_WIDTH,\n\t\t\t\t\t\theight: \"100%\",\n\t\t\t\t\t})}\n\t\t\t\t/>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\t\ttop: -8,\n\t\t\t\t\t\tright: -8,\n\t\t\t\t\t\twidth: 16,\n\t\t\t\t\t\theight: 16,\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\tfontSize: 11,\n\t\t\t\t\t\tlineHeight: 1,\n\t\t\t\t\t\tcursor: \"default\",\n\t\t\t\t\t\tpointerEvents: \"auto\",\n\t\t\t\t\t\tuserSelect: \"none\",\n\t\t\t\t\t\tbackground: \"none\",\n\t\t\t\t\t\tborder: \"none\",\n\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t}}\n\t\t\t\t\tonMouseEnter={() => setHovered(true)}\n\t\t\t\t\tonMouseLeave={() => setHovered(false)}\n\t\t\t\t\taria-label={errors.map((e) => e.message).join(\" / \")}\n\t\t\t\t>\n\t\t\t\t\t⚠\n\t\t\t\t\t{hovered && (\n\t\t\t\t\t\t<div\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: \"calc(100% + 4px)\",\n\t\t\t\t\t\t\t\tright: 0,\n\t\t\t\t\t\t\t\tminWidth: 160,\n\t\t\t\t\t\t\t\tmaxWidth: 240,\n\t\t\t\t\t\t\t\tbackgroundColor: \"rgba(30,30,30,0.92)\",\n\t\t\t\t\t\t\t\tcolor: \"#fff\",\n\t\t\t\t\t\t\t\tfontSize: 11,\n\t\t\t\t\t\t\t\tlineHeight: 1.5,\n\t\t\t\t\t\t\t\tpadding: \"6px 8px\",\n\t\t\t\t\t\t\t\tborderRadius: 4,\n\t\t\t\t\t\t\t\tboxShadow: \"0 2px 6px rgba(0,0,0,0.4)\",\n\t\t\t\t\t\t\t\tpointerEvents: \"none\",\n\t\t\t\t\t\t\t\twhiteSpace: \"pre-wrap\",\n\t\t\t\t\t\t\t\twordBreak: \"break-all\",\n\t\t\t\t\t\t\t\tzIndex: zIndex + 1,\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{errors.map((e) => (\n\t\t\t\t\t\t\t\t<div key={e.code}>{e.message}</div>\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</button>\n\t\t\t\t<style>{`@media print { [data-testid=\"validation-overlay\"] { display: none !important; } }`}</style>\n\t\t\t</div>\n\t\t);\n\t},\n);\n\nValidationOverlay.displayName = \"ValidationOverlay\";\n","import {\n\ttype CSSProperties,\n\tforwardRef,\n\tmemo,\n\tuseCallback,\n\tuseMemo,\n\tuseState,\n} from \"react\";\n\nimport { NoteMode } from \"../../../types/mode\";\nimport { DEFAULT_DPI } from \"../../../utils/convert\";\nimport { BLOCK_SUB_INDEX, Z_INDEX } from \"../../../utils/zIndex\";\nimport { BlockBorder } from \"./BlockBorder\";\nimport { BlockCanvas } from \"./BlockCanvas\";\nimport { BlockGuideBorder, DEFAULT_GUIDE_BORDER } from \"./BlockGuideBorder\";\nimport { BlockRenderer } from \"./BlockRenderer\";\nimport { resolveBlockProps } from \"./utils/resolveBlockProps\";\nimport { ValidationOverlay } from \"./ValidationOverlay\";\n\nimport type { ResolvedPlugin } from \"../../../plugin/registry\";\nimport type { BlockRef } from \"../../../plugin/types\";\nimport type { Block } from \"../../../types/block\";\nimport type { ActionContext, BindingContext } from \"../../../types/context\";\nimport type { BorderStyle } from \"../../../types/line\";\nimport type { BlockDefaults } from \"../../../types/schema\";\nimport type { ValidationError } from \"../../../types/validation\";\nimport type { Value } from \"../../../types/value\";\nimport type { BlockRectPx, BlockSizePx } from \"../types\";\n\n/**\n * 1ブロック全体(背景・レンダラー・枠線・ガイド・バリデーション)をまとめるコンテナコンポーネント。\n */\nexport interface BlockContainerProps {\n\t/** 対象ブロックデータ。 */\n\tblock: Block;\n\n\t/** 解決済みプラグイン。 */\n\tresolvedPlugin: ResolvedPlugin;\n\n\t/** ブロックの位置とサイズ(px)。 */\n\tblockRectPx: BlockRectPx;\n\n\t/** z-index のベース値。 */\n\tblockZIndex: number;\n\n\t/** 表示モード(ビュー / フォーム / 編集)。 */\n\tmode: NoteMode;\n\n\t/** ブロックの現在値。 */\n\tvalue: Value;\n\n\t/** ブロックのデフォルト値設定。 */\n\tblockDefaults?: BlockDefaults;\n\n\t/** 値変更時のコールバック。 */\n\tonValueChange?: (val: Value) => void;\n\n\t/** フォーカス離脱時の値確定通知コールバック。 */\n\tonBlur?: (value: Value) => void;\n\n\t/** ガイド枠線を表示するか(既定値: `true`)。 */\n\tshowGuides?: boolean;\n\n\t/** ユーザー設定枠線を表示するか(既定値: `true`)。 */\n\tshowBorder?: boolean;\n\n\t/** デフォルトのガイド枠線スタイル。 */\n\tdefaultGuideBorder?: BorderStyle;\n\n\t/** DPI 値(既定値: `DEFAULT_DPI`)。 */\n\tdpi?: number;\n\n\t/** ポインターイベントの通過設定(既定値: `\"none\"`)。 */\n\tpointerEvents?: \"auto\" | \"none\";\n\n\t/** バリデーションオーバーレイを表示するか(既定値: `false`)。 */\n\tshowValidation?: boolean;\n\n\t/** バリデーションエラー一覧。 */\n\tvalidationErrors?: ValidationError[];\n\n\t/** ブロックの高さが動的に測定された際のコールバック。 */\n\tonMeasureHeight?: (blockId: string, heightPx: number) => void;\n\n\t/** ブロックの幅が動的に測定された際のコールバック。 */\n\tonMeasureWidth?: (blockId: string, widthPx: number) => void;\n\n\t/** フォーカス中のブロック ID。 */\n\tfocusedBlockId?: string;\n\n\t/** 値バインディング用コンテキスト。 */\n\tbindingContext?: BindingContext;\n\n\t/** アクション実行用コンテキスト。 */\n\tactionContext?: ActionContext;\n}\n\n/**\n * ブロックの全構成要素を統合するコンテナコンポーネント。\n *\n * `ref` で {@link BlockRef} を取得できます。\n *\n * @remarks\n * **Canvas** — {@link BlockLayer} の1ブロック統合コンテナ。\n */\nexport const BlockContainer = memo(\n\tforwardRef<BlockRef, BlockContainerProps>(\n\t\t(\n\t\t\t{\n\t\t\t\tblock,\n\t\t\t\tresolvedPlugin,\n\t\t\t\tblockRectPx,\n\t\t\t\tblockZIndex,\n\t\t\t\tmode,\n\t\t\t\tvalue,\n\t\t\t\tblockDefaults,\n\t\t\t\tonValueChange,\n\t\t\t\tonBlur,\n\t\t\t\tshowGuides = true,\n\t\t\t\tshowBorder = true,\n\t\t\t\tdefaultGuideBorder = DEFAULT_GUIDE_BORDER,\n\t\t\t\tdpi = DEFAULT_DPI,\n\t\t\t\tpointerEvents = \"none\",\n\t\t\t\tshowValidation = false,\n\t\t\t\tvalidationErrors,\n\t\t\t\tonMeasureHeight,\n\t\t\t\tonMeasureWidth,\n\t\t\t\tfocusedBlockId,\n\t\t\t\tbindingContext,\n\t\t\t\tactionContext,\n\t\t\t},\n\t\t\tref,\n\t\t) => {\n\t\t\tconst [localHeight, setLocalHeight] = useState<number | null>(null);\n\t\t\tconst [localWidth, setLocalWidth] = useState<number | null>(null);\n\n\t\t\tconst handleContentHeight = useCallback(\n\t\t\t\t(heightPx: number) => {\n\t\t\t\t\tsetLocalHeight(heightPx);\n\t\t\t\t\tonMeasureHeight?.(block.id, heightPx);\n\t\t\t\t},\n\t\t\t\t[block.id, onMeasureHeight],\n\t\t\t);\n\n\t\t\tconst handleContentWidth = useCallback(\n\t\t\t\t(widthPx: number) => {\n\t\t\t\t\tsetLocalWidth(widthPx);\n\t\t\t\t\tonMeasureWidth?.(block.id, widthPx);\n\t\t\t\t},\n\t\t\t\t[block.id, onMeasureWidth],\n\t\t\t);\n\n\t\t\tconst effectiveHeight = onMeasureHeight\n\t\t\t\t? Math.max(blockRectPx.height, localHeight ?? 0)\n\t\t\t\t: blockRectPx.height;\n\n\t\t\tconst effectiveWidth = onMeasureWidth\n\t\t\t\t? Math.max(blockRectPx.width, localWidth ?? 0)\n\t\t\t\t: blockRectPx.width;\n\n\t\t\tconst containerStyle: CSSProperties = {\n\t\t\t\tposition: \"absolute\",\n\t\t\t\tleft: `${blockRectPx.left}px`,\n\t\t\t\ttop: `${blockRectPx.top}px`,\n\t\t\t\twidth: `${effectiveWidth}px`,\n\t\t\t\theight: `${effectiveHeight}px`,\n\t\t\t\tzIndex: blockZIndex,\n\t\t\t\tpointerEvents,\n\t\t\t\tboxSizing: \"border-box\",\n\t\t\t};\n\n\t\t\tconst effectiveBlockSizePx: BlockSizePx = useMemo(\n\t\t\t\t() => ({ width: effectiveWidth, height: effectiveHeight }),\n\t\t\t\t[effectiveWidth, effectiveHeight],\n\t\t\t);\n\n\t\t\tconst resolvedProps = resolveBlockProps(\n\t\t\t\tblock,\n\t\t\t\tresolvedPlugin,\n\t\t\t\tblockDefaults,\n\t\t\t);\n\t\t\tconst validatedProps = resolvedPlugin.validateProps\n\t\t\t\t? resolvedPlugin.validateProps(resolvedProps)\n\t\t\t\t: resolvedProps;\n\t\t\tconst validatedValue = resolvedPlugin.validateValue\n\t\t\t\t? (resolvedPlugin.validateValue(value, validatedProps) ??\n\t\t\t\t\tblock.initValue ??\n\t\t\t\t\tvalue)\n\t\t\t\t: value;\n\n\t\t\tconst hasErrors = validationErrors && validationErrors.length > 0;\n\t\t\tconst errorDescId = hasErrors ? `error-${block.id}` : undefined;\n\t\t\tconst isFocused = focusedBlockId === block.id;\n\n\t\t\treturn (\n\t\t\t\t<section\n\t\t\t\t\taria-label={resolvedPlugin.meta.displayName}\n\t\t\t\t\taria-invalid={hasErrors || undefined}\n\t\t\t\t\taria-describedby={errorDescId}\n\t\t\t\t\tstyle={containerStyle}\n\t\t\t\t\tdata-testid={`block-${block.id}`}\n\t\t\t\t\tdata-block-id={block.id}\n\t\t\t\t>\n\t\t\t\t\t{/* 背景 */}\n\t\t\t\t\t<BlockCanvas\n\t\t\t\t\t\tblockSizePx={effectiveBlockSizePx}\n\t\t\t\t\t\tblockZIndex={blockZIndex}\n\t\t\t\t\t\tbackgroundColor={block.style?.backgroundColor}\n\t\t\t\t\t\tsubZIndex={BLOCK_SUB_INDEX.BG}\n\t\t\t\t\t/>\n\t\t\t\t\t{/* ガイド枠線(編集モードで enumBorder なし) */}\n\t\t\t\t\t{showGuides && !block.style?.border && (\n\t\t\t\t\t\t<BlockGuideBorder\n\t\t\t\t\t\t\tblockSizePx={effectiveBlockSizePx}\n\t\t\t\t\t\t\tblockZIndex={blockZIndex}\n\t\t\t\t\t\t\tsubZIndex={BLOCK_SUB_INDEX.GUIDE}\n\t\t\t\t\t\t\tborderStyle={defaultGuideBorder}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t\t{/* コンテンツ(Renderer) */}\n\t\t\t\t\t<BlockRenderer\n\t\t\t\t\t\tref={ref}\n\t\t\t\t\t\tid={block.id}\n\t\t\t\t\t\tresolvedPlugin={resolvedPlugin}\n\t\t\t\t\t\tprops={validatedProps}\n\t\t\t\t\t\tvalue={validatedValue}\n\t\t\t\t\t\tonChange={onValueChange}\n\t\t\t\t\t\tonBlur={onBlur}\n\t\t\t\t\t\treadOnly={\n\t\t\t\t\t\t\tmode === NoteMode.EDIT\n\t\t\t\t\t\t\t\t? (block.behavior?.readOnly ?? false)\n\t\t\t\t\t\t\t\t: true\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmode={mode}\n\t\t\t\t\t\tblockSizePx={effectiveBlockSizePx}\n\t\t\t\t\t\tblockZIndex={blockZIndex}\n\t\t\t\t\t\tsubZIndex={BLOCK_SUB_INDEX.CONTENT}\n\t\t\t\t\t\tonMeasureHeight={onMeasureHeight ? handleContentHeight : undefined}\n\t\t\t\t\t\tonMeasureWidth={onMeasureWidth ? handleContentWidth : undefined}\n\t\t\t\t\t\tbindingContext={bindingContext}\n\t\t\t\t\t\tactionContext={actionContext}\n\t\t\t\t\t\tblockBackgroundColor={block.style?.backgroundColor}\n\t\t\t\t\t/>\n\t\t\t\t\t{/* ユーザー設定枠線 */}\n\t\t\t\t\t<BlockBorder\n\t\t\t\t\t\tblockSizePx={effectiveBlockSizePx}\n\t\t\t\t\t\tblockZIndex={blockZIndex}\n\t\t\t\t\t\tborderStyle={block.style?.border}\n\t\t\t\t\t\tsubZIndex={BLOCK_SUB_INDEX.BORDER}\n\t\t\t\t\t\tvisible={showBorder}\n\t\t\t\t\t\tdpi={dpi}\n\t\t\t\t\t/>\n\t\t\t\t\t{/* バリデーションオーバーレイ */}\n\t\t\t\t\t{showValidation && hasErrors && (\n\t\t\t\t\t\t<ValidationOverlay\n\t\t\t\t\t\t\tblockSizePx={effectiveBlockSizePx}\n\t\t\t\t\t\t\tblockZIndex={blockZIndex}\n\t\t\t\t\t\t\terrors={validationErrors}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t\t{/* a11y: エラー記述 */}\n\t\t\t\t\t{hasErrors && (\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tid={errorDescId}\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\twidth: \"1px\",\n\t\t\t\t\t\t\t\theight: \"1px\",\n\t\t\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\t\t\tmargin: \"-1px\",\n\t\t\t\t\t\t\t\toverflow: \"hidden\",\n\t\t\t\t\t\t\t\tclip: \"rect(0,0,0,0)\",\n\t\t\t\t\t\t\t\twhiteSpace: \"nowrap\",\n\t\t\t\t\t\t\t\tborder: 0,\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{validationErrors.map((e) => e.message).join(\", \")}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t)}\n\t\t\t\t\t{/* フォーカスリング */}\n\t\t\t\t\t{isFocused && (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\taria-hidden=\"true\"\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\tinset: 0,\n\t\t\t\t\t\t\t\tboxShadow: \"0 0 0 2px #3b82f6, 0 0 0 4px rgba(59,130,246,0.15)\",\n\t\t\t\t\t\t\t\tpointerEvents: \"none\",\n\t\t\t\t\t\t\t\tzIndex: Z_INDEX.HOVER_OUTLINE,\n\t\t\t\t\t\t\t\tboxSizing: \"border-box\",\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</section>\n\t\t\t);\n\t\t},\n\t),\n\t// blockRectPx は毎回新規オブジェクトが渡されるため、数値比較で再レンダリングを抑制する\n\t(prev, next) =>\n\t\tprev.block === next.block &&\n\t\tprev.resolvedPlugin === next.resolvedPlugin &&\n\t\tprev.blockRectPx.left === next.blockRectPx.left &&\n\t\tprev.blockRectPx.top === next.blockRectPx.top &&\n\t\tprev.blockRectPx.width === next.blockRectPx.width &&\n\t\tprev.blockRectPx.height === next.blockRectPx.height &&\n\t\tprev.blockZIndex === next.blockZIndex &&\n\t\tprev.mode === next.mode &&\n\t\tprev.value === next.value &&\n\t\tprev.blockDefaults === next.blockDefaults &&\n\t\t// onValueChange は BlockLayer 内でブロックごとに毎回新しいクロージャが生成されるため比較しない。\n\t\t// onBlur も同様に BlockLayer 内で毎回新しいクロージャが生成されるため比較しない。\n\t\t// 外側のコールバックは useCallback で安定しており、block.id は prev.block === next.block で担保済み。\n\t\tprev.showGuides === next.showGuides &&\n\t\tprev.showBorder === next.showBorder &&\n\t\tprev.defaultGuideBorder === next.defaultGuideBorder &&\n\t\tprev.dpi === next.dpi &&\n\t\tprev.pointerEvents === next.pointerEvents &&\n\t\tprev.showValidation === next.showValidation &&\n\t\tprev.validationErrors === next.validationErrors &&\n\t\tprev.onMeasureHeight === next.onMeasureHeight &&\n\t\tprev.onMeasureWidth === next.onMeasureWidth &&\n\t\tprev.focusedBlockId === next.focusedBlockId &&\n\t\tprev.bindingContext === next.bindingContext &&\n\t\tprev.actionContext === next.actionContext,\n);\n\nBlockContainer.displayName = \"BlockContainer\";\n","import { type CSSProperties, Fragment, memo, useRef } from \"react\";\n\nimport { evalHiddenBinding } from \"../../../utils/block\";\nimport { DEFAULT_DPI } from \"../../../utils/convert\";\nimport { getBlockZIndex, Z_INDEX } from \"../../../utils/zIndex\";\nimport { BlockContainer } from \"./BlockContainer\";\nimport { DEFAULT_GUIDE_BORDER } from \"./BlockGuideBorder\";\n\nimport type { PluginRegistry } from \"../../../plugin/registry\";\nimport type { BlockRef } from \"../../../plugin/types\";\nimport type { Block } from \"../../../types/block\";\nimport type { ActionContext, BindingContext } from \"../../../types/context\";\nimport type { BorderStyle } from \"../../../types/line\";\nimport type { NoteMode } from \"../../../types/mode\";\nimport type { BlockDefaults } from \"../../../types/schema\";\nimport type { ValidationError } from \"../../../types/validation\";\nimport type { Value } from \"../../../types/value\";\nimport type { BlockRectPx } from \"../types\";\n\n// ブロック個別 fit 用の no-op コールバック(安定参照)\nconst NOOP_MEASURE_HEIGHT = (_id: string, _h: number) => {};\nconst NOOP_MEASURE_WIDTH = (_id: string, _w: number) => {};\n\n/**\n * `BlockLayer` コンポーネントへの props。\n */\nexport interface BlockLayerProps {\n\t/** 描画対象のブロック一覧。 */\n\tblocks: Block[];\n\n\t/** プラグインレジストリ。 */\n\tpluginRegistry: PluginRegistry;\n\n\t/** 表示モード。 */\n\tmode: NoteMode;\n\n\t/** ブロック ID → 現在値のマップ。 */\n\tvalues: Record<string, Value>;\n\n\t/** ブロックのデフォルト値設定。 */\n\tblockDefaults?: BlockDefaults;\n\n\t/** 選択中のブロック ID 一覧(既定値: `[]`)。 */\n\tselectedBlockIds?: string[];\n\n\t/** ブロックからキャンバス上の矩形座標(px)を返す関数。 */\n\tgetBlockRectPx: (block: Block) => BlockRectPx;\n\n\t/** ブロックの値が変更されたときのコールバック。 */\n\tonValueChange?: (blockId: string, value: Value) => void;\n\n\t/** フォーカス離脱時の値確定通知コールバック。 */\n\tonBlur?: (blockId: string, value: Value) => void;\n\n\t/** ガイド枠線を表示するか(既定値: `true`)。 */\n\tshowGuides?: boolean;\n\n\t/** ユーザー設定枠線を表示するか(既定値: `true`)。 */\n\tshowBorder?: boolean;\n\n\t/** デフォルトのガイド枠線スタイル。 */\n\tdefaultGuideBorder?: BorderStyle;\n\n\t/** DPI 値(既定値: `DEFAULT_DPI`)。 */\n\tdpi?: number;\n\n\t/** バリデーションオーバーレイを表示するか(既定値: `false`)。 */\n\tshowValidation?: boolean;\n\n\t/** ブロック ID → バリデーションエラー一覧のマップ。 */\n\tvalidationErrors?: Record<string, ValidationError[]>;\n\n\t/** ブロックの高さが測定された際のコールバック。 */\n\tonMeasureHeight?: (blockId: string, heightPx: number) => void;\n\n\t/** ブロックの幅が測定された際のコールバック。 */\n\tonMeasureWidth?: (blockId: string, widthPx: number) => void;\n\n\t/** フォーカス中のブロック ID。 */\n\tfocusedBlockId?: string;\n\n\t/** 値バインディング用コンテキスト。 */\n\tbindingContext?: BindingContext;\n\n\t/** アクション実行用コンテキスト。 */\n\tactionContext?: ActionContext;\n}\n\n/**\n * ブロック一覧を描画するレイヤーコンポーネント。\n *\n * @remarks\n * **Canvas** — {@link Note} 実装を担う低レベルブロックレンダリングレイヤー。\n *\n * 通常は {@link Note} を使用する。\n */\nexport const BlockLayer = memo(\n\t({\n\t\tblocks,\n\t\tpluginRegistry,\n\t\tmode,\n\t\tvalues,\n\t\tblockDefaults,\n\t\tselectedBlockIds = [],\n\t\tgetBlockRectPx,\n\t\tonValueChange,\n\t\tonBlur,\n\t\tshowGuides = true,\n\t\tshowBorder = true,\n\t\tdefaultGuideBorder = DEFAULT_GUIDE_BORDER,\n\t\tdpi = DEFAULT_DPI,\n\t\tshowValidation = false,\n\t\tvalidationErrors,\n\t\tonMeasureHeight,\n\t\tonMeasureWidth,\n\t\tfocusedBlockId,\n\t\tbindingContext,\n\t\tactionContext,\n\t}: BlockLayerProps) => {\n\t\tconst blockRefs = useRef<Map<string, BlockRef>>(new Map());\n\n\t\tconst layerStyle: CSSProperties = {\n\t\t\tposition: \"absolute\",\n\t\t\tinset: 0,\n\t\t\tpointerEvents: \"none\",\n\t\t};\n\n\t\treturn (\n\t\t\t<div style={layerStyle} data-testid=\"block-layer\">\n\t\t\t\t{blocks.map((block, index) => {\n\t\t\t\t\tconst resolvedPlugin = pluginRegistry[block.kind];\n\t\t\t\t\tif (!resolvedPlugin) {\n\t\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t\t`[tatamicks] Block kind \"${block.kind}\" is not registered. Add the plugin to createPluginRegistry.`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t\tconst isHidden = evalHiddenBinding(\n\t\t\t\t\t\tblock.hiddenBinding,\n\t\t\t\t\t\tbindingContext,\n\t\t\t\t\t);\n\t\t\t\t\tif (isHidden) return null;\n\n\t\t\t\t\tconst blockRectPx = getBlockRectPx(block);\n\t\t\t\t\tconst isSelected = selectedBlockIds.includes(block.id);\n\t\t\t\t\tconst blockZIndex = isSelected\n\t\t\t\t\t\t? Z_INDEX.SELECT_BLOCK\n\t\t\t\t\t\t: getBlockZIndex(index);\n\n\t\t\t\t\t// binding 経由の値解決\n\t\t\t\t\tconst binding =\n\t\t\t\t\t\tblock.props !== null &&\n\t\t\t\t\t\ttypeof block.props === \"object\" &&\n\t\t\t\t\t\t\"binding\" in block.props\n\t\t\t\t\t\t\t? (block.props as { binding?: string }).binding\n\t\t\t\t\t\t\t: undefined;\n\n\t\t\t\t\tconst value =\n\t\t\t\t\t\tbinding && bindingContext\n\t\t\t\t\t\t\t? (bindingContext.get(binding) ?? null)\n\t\t\t\t\t\t\t: block.id in values\n\t\t\t\t\t\t\t\t? values[block.id]\n\t\t\t\t\t\t\t\t: (block.initValue ?? null);\n\n\t\t\t\t\tconst handleValueChange: ((val: Value) => void) | undefined =\n\t\t\t\t\t\tbinding && bindingContext\n\t\t\t\t\t\t\t? (val) => bindingContext.set(binding, val)\n\t\t\t\t\t\t\t: onValueChange\n\t\t\t\t\t\t\t\t? (val) => onValueChange(block.id, val)\n\t\t\t\t\t\t\t\t: undefined;\n\n\t\t\t\t\tconst blockMeasureHeight = block.behavior?.heightFit\n\t\t\t\t\t\t? (onMeasureHeight ?? NOOP_MEASURE_HEIGHT)\n\t\t\t\t\t\t: undefined;\n\t\t\t\t\tconst blockMeasureWidth = block.behavior?.widthFit\n\t\t\t\t\t\t? (onMeasureWidth ?? NOOP_MEASURE_WIDTH)\n\t\t\t\t\t\t: undefined;\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<Fragment key={block.id}>\n\t\t\t\t\t\t\t<BlockContainer\n\t\t\t\t\t\t\t\tref={(r) => {\n\t\t\t\t\t\t\t\t\tif (r) blockRefs.current.set(block.id, r);\n\t\t\t\t\t\t\t\t\telse blockRefs.current.delete(block.id);\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tblock={block}\n\t\t\t\t\t\t\t\tresolvedPlugin={resolvedPlugin}\n\t\t\t\t\t\t\t\tblockRectPx={blockRectPx}\n\t\t\t\t\t\t\t\tblockZIndex={blockZIndex}\n\t\t\t\t\t\t\t\tmode={mode}\n\t\t\t\t\t\t\t\tvalue={value ?? null}\n\t\t\t\t\t\t\t\tblockDefaults={blockDefaults}\n\t\t\t\t\t\t\t\tonValueChange={handleValueChange}\n\t\t\t\t\t\t\t\tonBlur={onBlur ? (val) => onBlur(block.id, val) : undefined}\n\t\t\t\t\t\t\t\tshowGuides={showGuides}\n\t\t\t\t\t\t\t\tshowBorder={showBorder}\n\t\t\t\t\t\t\t\tdefaultGuideBorder={defaultGuideBorder}\n\t\t\t\t\t\t\t\tdpi={dpi}\n\t\t\t\t\t\t\t\tpointerEvents=\"none\"\n\t\t\t\t\t\t\t\tshowValidation={showValidation}\n\t\t\t\t\t\t\t\tvalidationErrors={validationErrors?.[block.id]}\n\t\t\t\t\t\t\t\tonMeasureHeight={blockMeasureHeight}\n\t\t\t\t\t\t\t\tonMeasureWidth={blockMeasureWidth}\n\t\t\t\t\t\t\t\tfocusedBlockId={focusedBlockId}\n\t\t\t\t\t\t\t\tbindingContext={bindingContext}\n\t\t\t\t\t\t\t\tactionContext={actionContext}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</Fragment>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</div>\n\t\t);\n\t},\n);\n\nBlockLayer.displayName = \"BlockLayer\";\n","import { LineType } from \"../../../../types/line\";\n\nimport type { LineStyle } from \"../../../../types/line\";\n\n/**\n * `LineStyle` から SVG の `stroke-dasharray` 値を返します。\n * @param lineStyle - 線スタイル。`undefined` または SOLID の場合は `undefined` を返します。\n */\nexport function getStrokeDasharray(lineStyle?: LineStyle): string | undefined {\n\tif (!lineStyle?.width || !lineStyle?.type) return undefined;\n\tconst w = lineStyle.width.value;\n\tif (w === 0) return undefined;\n\tif (lineStyle.type === LineType.DASHED) return `${w * 4} ${w * 2}`;\n\tif (lineStyle.type === LineType.DOTTED) return `${w * 1} ${w * 2}`;\n\treturn undefined;\n}\n","import { memo } from \"react\";\n\nimport { DEFAULT_DPI, toPx } from \"../../../utils/convert\";\nimport { Z_INDEX } from \"../../../utils/zIndex\";\nimport { getStrokeDasharray } from \"./utils/getStrokeDasharray\";\n\nimport type { BorderStyle, LineStyle } from \"../../../types/line\";\nimport type { PaperContentPx } from \"./types\";\n\n/**\n * `BorderOverlay` コンポーネントへの props。\n */\nexport interface BorderOverlayProps {\n\t/** コンテンツ領域のサイズ(px)。 */\n\tcontentPx: PaperContentPx;\n\n\t/** 左マージン(px)。SVG の配置基点として使用。 */\n\tmarginLeftPx: number;\n\n\t/** 上マージン(px)。SVG の配置基点として使用。 */\n\tmarginTopPx: number;\n\n\t/** 用紙枠線のスタイル。省略時は描画しない。 */\n\tborderStyle?: BorderStyle;\n\n\t/** DPI 値(既定値: `DEFAULT_DPI`)。 */\n\tdpi?: number;\n\n\t/** z-index (既定値: `Z_INDEX.BORDER_OVERLAY`)。 */\n\tzIndex?: number;\n}\n\n// LineStyle を SVG 属性オブジェクトに変換するヘルパー\nfunction lineAttrs(style: LineStyle, dpi: number) {\n\treturn {\n\t\tstroke: style.color,\n\t\tstrokeWidth: toPx.fromDim(style.width, dpi),\n\t\tstrokeDasharray: getStrokeDasharray(style),\n\t};\n}\n\n/**\n * コンテンツ領域の四辺に SVG 線で用紙枠線を描画するコンポーネント。\n */\nexport const BorderOverlay: React.FC<BorderOverlayProps> = memo(\n\t({\n\t\tcontentPx,\n\t\tmarginLeftPx,\n\t\tmarginTopPx,\n\t\tborderStyle,\n\t\tdpi = DEFAULT_DPI,\n\t\tzIndex = Z_INDEX.BORDER_OVERLAY,\n\t}) => {\n\t\tif (!borderStyle) return null;\n\n\t\tconst { top, right, bottom, left } = borderStyle;\n\t\tif (!top && !right && !bottom && !left) return null;\n\n\t\tconst w = contentPx.width;\n\t\tconst h = contentPx.height;\n\n\t\treturn (\n\t\t\t<svg\n\t\t\t\trole=\"presentation\"\n\t\t\t\taria-hidden=\"true\"\n\t\t\t\tstyle={{\n\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\tleft: `${marginLeftPx}px`,\n\t\t\t\t\ttop: `${marginTopPx}px`,\n\t\t\t\t\tpointerEvents: \"none\",\n\t\t\t\t\toverflow: \"visible\",\n\t\t\t\t\tzIndex,\n\t\t\t\t}}\n\t\t\t\twidth={w}\n\t\t\t\theight={h}\n\t\t\t\tdata-testid=\"border-overlay\"\n\t\t\t>\n\t\t\t\t{top && <line x1={0} y1={0} x2={w} y2={0} {...lineAttrs(top, dpi)} />}\n\t\t\t\t{right && (\n\t\t\t\t\t<line x1={w} y1={0} x2={w} y2={h} {...lineAttrs(right, dpi)} />\n\t\t\t\t)}\n\t\t\t\t{bottom && (\n\t\t\t\t\t<line x1={0} y1={h} x2={w} y2={h} {...lineAttrs(bottom, dpi)} />\n\t\t\t\t)}\n\t\t\t\t{left && <line x1={0} y1={0} x2={0} y2={h} {...lineAttrs(left, dpi)} />}\n\t\t\t</svg>\n\t\t);\n\t},\n);\n\nBorderOverlay.displayName = \"BorderOverlay\";\n","import { memo } from \"react\";\n\nimport { Z_INDEX } from \"../../../utils/zIndex\";\n\nimport type { PaperCanvasPx } from \"./types\";\n\n/**\n * `GridCanvas` コンポーネントへの props。\n */\nexport interface GridCanvasProps {\n\t/** キャンバス全体のサイズ(px)。 */\n\tcanvasPx: PaperCanvasPx;\n\n\t/** 用紙背景色(既定値: `\"#ffffff\"`)。 */\n\tbackgroundColor?: string;\n\n\t/** `box-shadow` CSS 値(既定値: 軽い影)。 */\n\tboxShadow?: string;\n\n\t/** z-index(既定値: `Z_INDEX.GRID_CANVAS`)。 */\n\tzIndex?: number;\n}\n\n/**\n * 用紙キャンバス背景(白矩形 + 影)を描画するコンポーネント。\n */\nexport const GridCanvas: React.FC<GridCanvasProps> = memo(\n\t({\n\t\tcanvasPx,\n\t\tbackgroundColor = \"#ffffff\",\n\t\tboxShadow = \"0 2px 8px rgba(0, 0, 0, 0.1)\",\n\t\tzIndex = Z_INDEX.GRID_CANVAS,\n\t}) => (\n\t\t<div\n\t\t\trole=\"presentation\"\n\t\t\taria-label=\"Paper background\"\n\t\t\tdata-testid=\"grid-canvas\"\n\t\t\tstyle={{\n\t\t\t\tposition: \"absolute\",\n\t\t\t\tinset: 0,\n\t\t\t\twidth: `${canvasPx.width}px`,\n\t\t\t\theight: `${canvasPx.height}px`,\n\t\t\t\tbackgroundColor,\n\t\t\t\tboxShadow,\n\t\t\t\tpointerEvents: \"none\",\n\t\t\t\tzIndex,\n\t\t\t}}\n\t\t/>\n\t),\n);\n\nGridCanvas.displayName = \"GridCanvas\";\n","import { memo, useEffect, useRef, useState } from \"react\";\n\nimport { toMm } from \"../../../../utils/convert\";\nimport styles from \"./GridUnitEditor.module.css\";\n\nimport type { Dimension, GridUnit } from \"../../../../types/unit\";\n\n/**\n * `GridUnitEditor` コンポーネントへの props。\n */\nexport interface GridUnitEditorProps {\n\t/** 列・行のどちらのエディターか。 */\n\tdirection: \"column\" | \"row\";\n\n\t/** 現在編集中の寸法。 */\n\tdimension: Dimension<GridUnit>;\n\n\t/** 列・行の現在サイズ(px)。局所単位変換に使用。 */\n\tcurrentPxSize: number;\n\n\t/** エディターを表示する座標(px)。 */\n\tposition: number;\n\n\t/** 左マージン(px)。絶対配置の基点。 */\n\tmarginLeftPx: number;\n\n\t/** 上マージン(px)。絶対配置の基点。 */\n\tmarginTopPx: number;\n\n\t/** 寸法変更を確定した際のコールバック。 */\n\tonChange: (dimension: Dimension<GridUnit>) => void;\n\n\t/** 編集をキャンセルした際のコールバック。 */\n\tonCancel: () => void;\n}\n\n// サポートする全単位の一覧\nconst SUPPORTED_UNITS: GridUnit[] = [\"fr\", \"px\", \"mm\", \"cm\", \"pt\", \"inch\"];\n\n// px を指定単位に変換するローカルヘルパー(fr 単位を除き各単位へ変換)\nfunction convertPxToUnit(pxSize: number, targetUnit: GridUnit): number {\n\tif (targetUnit === \"fr\") return 1;\n\tswitch (targetUnit) {\n\t\tcase \"px\":\n\t\t\treturn pxSize;\n\t\tcase \"mm\":\n\t\t\treturn Math.round(toMm.fromPx(pxSize) * 10) / 10;\n\t\tcase \"cm\":\n\t\t\treturn Math.round((toMm.fromPx(pxSize) / 10) * 100) / 100;\n\t\tcase \"inch\":\n\t\t\treturn Math.round((toMm.fromPx(pxSize) / 25.4) * 100) / 100;\n\t\tcase \"pt\":\n\t\t\treturn Math.round((toMm.fromPx(pxSize) / 25.4) * 72 * 10) / 10;\n\t\tdefault: {\n\t\t\tconst _exhaustive: never = targetUnit;\n\t\t\tthrow new Error(`Unsupported unit: ${_exhaustive}`);\n\t\t}\n\t}\n}\n\n/**\n * グリッド列・行の寸法を入力するインラインエディターコンポーネント。\n *\n * 単位切り替え時に値を局所変換する。\n */\nexport const GridUnitEditor = memo(\n\t({\n\t\tdirection,\n\t\tdimension,\n\t\tcurrentPxSize,\n\t\tposition,\n\t\tmarginLeftPx,\n\t\tmarginTopPx,\n\t\tonChange,\n\t\tonCancel,\n\t}: GridUnitEditorProps) => {\n\t\tconst [value, setValue] = useState(dimension.value.toString());\n\t\tconst [unit, setUnit] = useState<GridUnit>(dimension.unit as GridUnit);\n\t\tconst inputRef = useRef<HTMLInputElement>(null);\n\t\tconst containerRef = useRef<HTMLDivElement>(null);\n\n\t\tconst editorStyle: React.CSSProperties =\n\t\t\tdirection === \"column\"\n\t\t\t\t? {\n\t\t\t\t\t\tleft: `${marginLeftPx + position}px`,\n\t\t\t\t\t\ttop: `${marginTopPx + 24}px`,\n\t\t\t\t\t\ttransform: \"translateX(-50%)\",\n\t\t\t\t\t}\n\t\t\t\t: {\n\t\t\t\t\t\tleft: `${marginLeftPx + 24}px`,\n\t\t\t\t\t\ttop: `${marginTopPx + position}px`,\n\t\t\t\t\t\ttransform: \"translateY(-50%)\",\n\t\t\t\t\t};\n\n\t\tuseEffect(() => {\n\t\t\tinputRef.current?.focus();\n\t\t\tinputRef.current?.select();\n\t\t}, []);\n\n\t\tuseEffect(() => {\n\t\t\tconst handleClickOutside = (event: MouseEvent) => {\n\t\t\t\tif (\n\t\t\t\t\tcontainerRef.current &&\n\t\t\t\t\t!containerRef.current.contains(event.target as Node)\n\t\t\t\t) {\n\t\t\t\t\tonCancel();\n\t\t\t\t}\n\t\t\t};\n\t\t\tdocument.addEventListener(\"mousedown\", handleClickOutside);\n\t\t\treturn () =>\n\t\t\t\tdocument.removeEventListener(\"mousedown\", handleClickOutside);\n\t\t}, [onCancel]);\n\n\t\tconst handleSubmit = () => {\n\t\t\tconst numValue = Number.parseFloat(value);\n\t\t\tif (!Number.isNaN(numValue) && numValue >= 0.1) {\n\t\t\t\tonChange({ unit, value: numValue });\n\t\t\t} else {\n\t\t\t\tonCancel();\n\t\t\t}\n\t\t};\n\n\t\tconst handleKeyDown = (e: React.KeyboardEvent) => {\n\t\t\tif (e.key === \"Enter\") {\n\t\t\t\te.preventDefault();\n\t\t\t\thandleSubmit();\n\t\t\t} else if (e.key === \"Escape\") {\n\t\t\t\te.preventDefault();\n\t\t\t\tonCancel();\n\t\t\t}\n\t\t};\n\n\t\tconst handleUnitChange = (e: React.ChangeEvent<HTMLSelectElement>) => {\n\t\t\tconst newUnit = e.target.value as GridUnit;\n\t\t\tsetUnit(newUnit);\n\t\t\tsetValue(convertPxToUnit(currentPxSize, newUnit).toString());\n\t\t};\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={containerRef}\n\t\t\t\tclassName={styles.editor}\n\t\t\t\tstyle={editorStyle}\n\t\t\t\tdata-testid={`grid-unit-editor-${direction}`}\n\t\t\t>\n\t\t\t\t<input\n\t\t\t\t\tref={inputRef}\n\t\t\t\t\ttype=\"number\"\n\t\t\t\t\tclassName={styles.input}\n\t\t\t\t\tvalue={value}\n\t\t\t\t\tonChange={(e) => setValue(e.target.value)}\n\t\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t\t\tmin=\"0.1\"\n\t\t\t\t\tstep={unit === \"fr\" ? \"0.1\" : \"1\"}\n\t\t\t\t/>\n\t\t\t\t<select\n\t\t\t\t\tclassName={styles.select}\n\t\t\t\t\tvalue={unit}\n\t\t\t\t\tonChange={handleUnitChange}\n\t\t\t\t>\n\t\t\t\t\t{SUPPORTED_UNITS.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</select>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclassName={styles.button}\n\t\t\t\t\tonClick={handleSubmit}\n\t\t\t\t\ttitle=\"確定\"\n\t\t\t\t>\n\t\t\t\t\t✓\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t);\n\t},\n);\n\nGridUnitEditor.displayName = \"GridUnitEditor\";\n","import { memo, useState } from \"react\";\n\nimport { toMm } from \"../../../../utils/convert\";\nimport styles from \"./GridDimensionLabel.module.css\";\nimport { GridUnitEditor } from \"./GridUnitEditor\";\n\nimport type { Dimension, GridUnit } from \"../../../../types/unit\";\n\n/**\n * `GridDimensionLabel` コンポーネントへの props。\n */\nexport interface GridDimensionLabelProps {\n\t/** 列・行のどちらのラベルを描画するか。 */\n\tdirection: \"column\" | \"row\";\n\n\t/** グリッド内のインデックス。 */\n\tindex: number;\n\n\t/** 現在の対象グリッド列・行の寸法。 */\n\tdimension: Dimension<GridUnit>;\n\n\t/** ラベルを表示する座標(px)。 */\n\tposition: number;\n\n\t/** 現在のグリッド列・行のサイズ(px)。局所单位変換に使用。 */\n\tcurrentPxSize: number;\n\n\t/** 左マージン(px)。絶対配置の基点。 */\n\tmarginLeftPx: number;\n\n\t/** 上マージン(px)。絶対配置の基点。 */\n\tmarginTopPx: number;\n\n\t/** `true` の場合はカーソルが近くにあるとみなしラベルを表示する。 */\n\tisNearCursor: boolean;\n\n\t/** リサイズ中の最新サイズ(px)。提供時は変化後の寸法をライブ表示する。 */\n\tresizingPxSize?: number;\n\n\t/** 寸法変更時のコールバック。 */\n\tonDimensionChange?: (\n\t\tdirection: \"column\" | \"row\",\n\t\tindex: number,\n\t\tdimension: Dimension<GridUnit>,\n\t) => void;\n}\n\n// px を指定単位に変換するヘルパー(fr は元値の比率で計算)\nfunction convertPxToUnit(\n\tpxSize: number,\n\ttargetUnit: GridUnit,\n\toriginalValue?: number,\n\toriginalPxSize?: number,\n): number {\n\tif (targetUnit === \"fr\") {\n\t\tif (\n\t\t\toriginalValue !== undefined &&\n\t\t\toriginalPxSize !== undefined &&\n\t\t\toriginalPxSize > 0\n\t\t) {\n\t\t\treturn Math.round(originalValue * (pxSize / originalPxSize) * 100) / 100;\n\t\t}\n\t\treturn 1;\n\t}\n\tswitch (targetUnit) {\n\t\tcase \"px\":\n\t\t\treturn Math.round(pxSize);\n\t\tcase \"mm\":\n\t\t\treturn Math.round(toMm.fromPx(pxSize) * 10) / 10;\n\t\tcase \"cm\":\n\t\t\treturn Math.round((toMm.fromPx(pxSize) / 10) * 100) / 100;\n\t\tcase \"inch\":\n\t\t\treturn Math.round((toMm.fromPx(pxSize) / 25.4) * 100) / 100;\n\t\tcase \"pt\":\n\t\t\treturn Math.round((toMm.fromPx(pxSize) / 25.4) * 72 * 10) / 10;\n\t\tdefault: {\n\t\t\tconst _exhaustive: never = targetUnit;\n\t\t\tthrow new Error(`Unsupported unit: ${_exhaustive}`);\n\t\t}\n\t}\n}\n\n/**\n * グリッド列・行の寸法をラベル表示し、クリックで寸法編集を起動するコンポーネント。\n */\nexport const GridDimensionLabel = memo(\n\t({\n\t\tdirection,\n\t\tindex,\n\t\tdimension,\n\t\tposition,\n\t\tcurrentPxSize,\n\t\tmarginLeftPx,\n\t\tmarginTopPx,\n\t\tisNearCursor,\n\t\tresizingPxSize,\n\t\tonDimensionChange,\n\t}: GridDimensionLabelProps) => {\n\t\tconst [isEditing, setIsEditing] = useState(false);\n\n\t\tif (!isNearCursor && !isEditing) return null;\n\n\t\tconst labelStyle: React.CSSProperties =\n\t\t\tdirection === \"column\"\n\t\t\t\t? {\n\t\t\t\t\t\tleft: `${marginLeftPx + position}px`,\n\t\t\t\t\t\ttop: `${marginTopPx - 20}px`,\n\t\t\t\t\t\ttransform: \"translateX(-50%)\",\n\t\t\t\t\t}\n\t\t\t\t: {\n\t\t\t\t\t\tleft: `${marginLeftPx - 20}px`,\n\t\t\t\t\t\ttop: `${marginTopPx + position}px`,\n\t\t\t\t\t\ttransform: \"translateY(-50%)\",\n\t\t\t\t\t\twritingMode: \"vertical-rl\",\n\t\t\t\t\t};\n\n\t\tconst formatDimension = (dim: Dimension<GridUnit>): string =>\n\t\t\tdim.unit === \"fr\" ? `${dim.value}fr` : `${dim.value}${dim.unit}`;\n\n\t\tconst displayText = resizingPxSize\n\t\t\t? (() => {\n\t\t\t\t\tconst v = convertPxToUnit(\n\t\t\t\t\t\tresizingPxSize,\n\t\t\t\t\t\tdimension.unit,\n\t\t\t\t\t\tdimension.value,\n\t\t\t\t\t\tcurrentPxSize,\n\t\t\t\t\t);\n\t\t\t\t\treturn dimension.unit === \"fr\" ? `${v}fr` : `${v}${dimension.unit}`;\n\t\t\t\t})()\n\t\t\t: formatDimension(dimension);\n\n\t\treturn (\n\t\t\t<>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclassName={styles.label}\n\t\t\t\t\tstyle={labelStyle}\n\t\t\t\t\tonDoubleClick={() => setIsEditing(true)}\n\t\t\t\t\tdata-testid={`grid-dimension-${direction}-${index}`}\n\t\t\t\t\taria-label={`グリッド寸法: ${displayText}`}\n\t\t\t\t>\n\t\t\t\t\t{displayText}\n\t\t\t\t</button>\n\t\t\t\t{isEditing && (\n\t\t\t\t\t<GridUnitEditor\n\t\t\t\t\t\tdirection={direction}\n\t\t\t\t\t\tdimension={dimension}\n\t\t\t\t\t\tcurrentPxSize={currentPxSize}\n\t\t\t\t\t\tposition={position}\n\t\t\t\t\t\tmarginLeftPx={marginLeftPx}\n\t\t\t\t\t\tmarginTopPx={marginTopPx}\n\t\t\t\t\t\tonChange={(newDim) => {\n\t\t\t\t\t\t\tonDimensionChange?.(direction, index, newDim);\n\t\t\t\t\t\t\tsetIsEditing(false);\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonCancel={() => setIsEditing(false)}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</>\n\t\t);\n\t},\n);\n\nGridDimensionLabel.displayName = \"GridDimensionLabel\";\n","/**\n * 内側の列・行境界 px 座標配列から SVG グリッドライン用の `path d` 文字列を生成します。\n * @param colPxs - 内側列境界の x 座標配列(先頭・末尾の境界を除く)。\n * @param rowPxs - 内側行境界の y 座標配列(先頭・末尾の境界を除く)。\n * @param width - コンテンツ領域の幅(px)。\n * @param height - コンテンツ領域の高さ(px)。\n * @returns SVG `path` 要素の `d` 属性値。\n */\nexport function getGridPathD(\n\tcolPxs: number[],\n\trowPxs: number[],\n\twidth: number,\n\theight: number,\n): string {\n\tlet d = \"\";\n\tfor (const x of colPxs) d += `M ${x} 0 L ${x} ${height} `;\n\tfor (const y of rowPxs) d += `M 0 ${y} L ${width} ${y} `;\n\treturn d;\n}\n","import { type FC, memo, useMemo } from \"react\";\n\nimport { DEFAULT_DPI, toPx } from \"../../../utils/convert\";\nimport { Z_INDEX } from \"../../../utils/zIndex\";\nimport { getGridPathD } from \"./utils/getGridPathD\";\nimport { getStrokeDasharray } from \"./utils/getStrokeDasharray\";\n\nimport type { LineStyle } from \"../../../types/line\";\nimport type { GridPosPx, PaperContentPx } from \"./types\";\n\n/**\n * `GridOverlay` コンポーネントへの props。\n */\nexport interface GridOverlayProps {\n\t/** グリッド境界の px 座標配列。 */\n\tgridPosPx: GridPosPx;\n\n\t/** コンテンツ領域のサイズ(px)。 */\n\tcontentPx: PaperContentPx;\n\n\t/** 左マージン(px)。SVG の配置基点。 */\n\tmarginLeftPx: number;\n\n\t/** 上マージン(px)。SVG の配置基点。 */\n\tmarginTopPx: number;\n\n\t/** グリッド線のスタイル。省略時は描画しない。 */\n\tlineStyle?: LineStyle;\n\n\t/** z-index(既定値: `Z_INDEX.GRID_OVERLAY`)。 */\n\tzIndex?: number;\n\n\t/** DPI 値(既定値: `DEFAULT_DPI`)。 */\n\tdpi?: number;\n}\n\n/**\n * グリッド線を SVG パスで描画するコンポーネント。\n *\n * `lineStyle` が未設定の場合は `null` を返します。\n */\nexport const GridOverlay: FC<GridOverlayProps> = memo(\n\t({\n\t\tgridPosPx,\n\t\tcontentPx,\n\t\tmarginLeftPx,\n\t\tmarginTopPx,\n\t\tlineStyle,\n\t\tzIndex = Z_INDEX.GRID_OVERLAY,\n\t\tdpi = DEFAULT_DPI,\n\t}) => {\n\t\tconst pathData = useMemo(\n\t\t\t() =>\n\t\t\t\tgetGridPathD(\n\t\t\t\t\tgridPosPx.cols.slice(1, -1),\n\t\t\t\t\tgridPosPx.rows.slice(1, -1),\n\t\t\t\t\tcontentPx.width,\n\t\t\t\t\tcontentPx.height,\n\t\t\t\t),\n\t\t\t[gridPosPx, contentPx],\n\t\t);\n\n\t\tif (!lineStyle) return null;\n\n\t\treturn (\n\t\t\t<svg\n\t\t\t\tstyle={{\n\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\tleft: `${marginLeftPx}px`,\n\t\t\t\t\ttop: `${marginTopPx}px`,\n\t\t\t\t\tpointerEvents: \"none\",\n\t\t\t\t\tzIndex,\n\t\t\t\t}}\n\t\t\t\twidth={contentPx.width}\n\t\t\t\theight={contentPx.height}\n\t\t\t\trole=\"img\"\n\t\t\t\taria-label=\"Grid overlay lines\"\n\t\t\t>\n\t\t\t\t<path\n\t\t\t\t\td={pathData}\n\t\t\t\t\tstroke={lineStyle.color}\n\t\t\t\t\tstrokeWidth={toPx.fromDim(lineStyle.width, dpi)}\n\t\t\t\t\tstrokeDasharray={getStrokeDasharray(lineStyle)}\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t/>\n\t\t\t</svg>\n\t\t);\n\t},\n);\n\nGridOverlay.displayName = \"GridOverlay\";\n","import { type CSSProperties, memo, useCallback, useState } from \"react\";\n\nimport styles from \"./GridResizeHandle.module.css\";\n\n/**\n * `GridResizeHandle` コンポーネントへの props。\n */\nexport interface GridResizeHandleProps {\n\t/** リサイズ対象の方向。 */\n\tdirection: \"column\" | \"row\";\n\n\t/** グリッド内のインデックス。 */\n\tindex: number;\n\n\t/** ハンドルを表示する座標(px)。 */\n\tposition: number;\n\n\t/** 左マージン(px)。絶対配置の基点。 */\n\tmarginLeftPx: number;\n\n\t/** 上マージン(px)。絶対配置の基点。 */\n\tmarginTopPx: number;\n\n\t/** ドラッグ開始時に呼び出されるコールバック。 */\n\tonResizeStart?: (direction: \"column\" | \"row\", index: number) => void;\n\n\t/** ドラッグ中に呼び出されるコールバック。 */\n\tonResize?: (\n\t\tdirection: \"column\" | \"row\",\n\t\tindex: number,\n\t\tdelta: number,\n\t) => void;\n\n\t/** ドラッグ終了時に呼び出されるコールバック。 */\n\tonResizeEnd?: (\n\t\tdirection: \"column\" | \"row\",\n\t\tindex: number,\n\t\tdelta: number,\n\t) => void;\n}\n\n/**\n * グリッド列・行のリサイズ操作ハンドルコンポーネント。\n *\n * ポインターイベントを直接受け取り、デルタ値を親に通知します。\n */\nexport const GridResizeHandle = memo(\n\t({\n\t\tdirection,\n\t\tindex,\n\t\tposition,\n\t\tmarginLeftPx,\n\t\tmarginTopPx,\n\t\tonResizeStart,\n\t\tonResize,\n\t\tonResizeEnd,\n\t}: GridResizeHandleProps) => {\n\t\tconst [isDragging, setIsDragging] = useState(false);\n\n\t\tconst HANDLE_SIZE = 12;\n\t\tconst HANDLE_OFFSET = HANDLE_SIZE / 2;\n\n\t\tconst handleStyle: CSSProperties =\n\t\t\tdirection === \"column\"\n\t\t\t\t? {\n\t\t\t\t\t\tleft: `${marginLeftPx + position - HANDLE_OFFSET}px`,\n\t\t\t\t\t\ttop: `${marginTopPx - HANDLE_OFFSET}px`,\n\t\t\t\t\t\twidth: `${HANDLE_SIZE}px`,\n\t\t\t\t\t\theight: `${HANDLE_SIZE}px`,\n\t\t\t\t\t\tcursor: \"col-resize\",\n\t\t\t\t\t}\n\t\t\t\t: {\n\t\t\t\t\t\tleft: `${marginLeftPx - HANDLE_OFFSET}px`,\n\t\t\t\t\t\ttop: `${marginTopPx + position - HANDLE_OFFSET}px`,\n\t\t\t\t\t\twidth: `${HANDLE_SIZE}px`,\n\t\t\t\t\t\theight: `${HANDLE_SIZE}px`,\n\t\t\t\t\t\tcursor: \"row-resize\",\n\t\t\t\t\t};\n\n\t\tconst handlePointerDown = useCallback(\n\t\t\t(e: React.PointerEvent) => {\n\t\t\t\te.stopPropagation();\n\t\t\t\te.preventDefault();\n\n\t\t\t\tconst initialPos = direction === \"column\" ? e.clientX : e.clientY;\n\t\t\t\tsetIsDragging(true);\n\t\t\t\tonResizeStart?.(direction, index);\n\n\t\t\t\tconst handlePointerMove = (moveEvent: PointerEvent) => {\n\t\t\t\t\tconst currentPos =\n\t\t\t\t\t\tdirection === \"column\" ? moveEvent.clientX : moveEvent.clientY;\n\t\t\t\t\tonResize?.(direction, index, currentPos - initialPos);\n\t\t\t\t};\n\n\t\t\t\tconst handlePointerUp = (upEvent: PointerEvent) => {\n\t\t\t\t\tconst currentPos =\n\t\t\t\t\t\tdirection === \"column\" ? upEvent.clientX : upEvent.clientY;\n\t\t\t\t\tsetIsDragging(false);\n\t\t\t\t\tonResizeEnd?.(direction, index, currentPos - initialPos);\n\t\t\t\t\twindow.removeEventListener(\"pointermove\", handlePointerMove);\n\t\t\t\t\twindow.removeEventListener(\"pointerup\", handlePointerUp);\n\t\t\t\t};\n\n\t\t\t\twindow.addEventListener(\"pointermove\", handlePointerMove);\n\t\t\t\twindow.addEventListener(\"pointerup\", handlePointerUp);\n\t\t\t},\n\t\t\t[direction, index, onResizeStart, onResize, onResizeEnd],\n\t\t);\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tclassName={`${styles.handle} ${isDragging ? styles.dragging : \"\"}`}\n\t\t\t\tstyle={handleStyle}\n\t\t\t\tonPointerDown={handlePointerDown}\n\t\t\t\tdata-testid={`grid-resize-handle-${direction}-${index}`}\n\t\t\t/>\n\t\t);\n\t},\n);\n\nGridResizeHandle.displayName = \"GridResizeHandle\";\n","import { type CSSProperties, type FC, memo } from \"react\";\n\nimport { Z_INDEX } from \"../../../utils/zIndex\";\n\nimport type { PaperPx } from \"./types\";\n\n/**\n * `MarginOverlay` コンポーネントへの props。\n */\nexport interface MarginOverlayProps {\n\t/** 用紙全体のサイズ・マージン・コンテンツ領域情報(px)。 */\n\tpaperPx: PaperPx;\n\n\t/** マージン領域背景色(既定値: 半透明の黒)。 */\n\tmarginColor?: string;\n\n\t/** z-index(既定値: `Z_INDEX.MARGIN_OVERLAY`)。 */\n\tzIndex?: number;\n}\n\n/**\n * 用紙四辺のマージン領域に半透明のオーバーレイを描画するコンポーネント。\n */\nexport const MarginOverlay: FC<MarginOverlayProps> = memo(\n\t({\n\t\tpaperPx,\n\t\tmarginColor = \"rgba(0, 0, 0, 0.05)\",\n\t\tzIndex = Z_INDEX.MARGIN_OVERLAY,\n\t}) => {\n\t\tconst side: CSSProperties = {\n\t\t\tposition: \"absolute\",\n\t\t\tbackgroundColor: marginColor,\n\t\t\tpointerEvents: \"none\",\n\t\t};\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\trole=\"presentation\"\n\t\t\t\taria-label=\"Printable area margin\"\n\t\t\t\tdata-testid=\"margin-overlay\"\n\t\t\t\tstyle={{\n\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\tinset: 0,\n\t\t\t\t\tpointerEvents: \"none\",\n\t\t\t\t\twidth: `${paperPx.canvas.width}px`,\n\t\t\t\t\theight: `${paperPx.canvas.height}px`,\n\t\t\t\t\tzIndex,\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t{paperPx.margin.top > 0 && (\n\t\t\t\t\t<div\n\t\t\t\t\t\tdata-testid=\"margin-top\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t...side,\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\twidth: \"100%\",\n\t\t\t\t\t\t\theight: `${paperPx.margin.top}px`,\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t\t{paperPx.margin.bottom > 0 && (\n\t\t\t\t\t<div\n\t\t\t\t\t\tdata-testid=\"margin-bottom\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t...side,\n\t\t\t\t\t\t\tbottom: 0,\n\t\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\t\twidth: \"100%\",\n\t\t\t\t\t\t\theight: `${paperPx.margin.bottom}px`,\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t\t{paperPx.margin.left > 0 && (\n\t\t\t\t\t<div\n\t\t\t\t\t\tdata-testid=\"margin-left\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t...side,\n\t\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\t\ttop: `${paperPx.margin.top}px`,\n\t\t\t\t\t\t\theight: `${paperPx.content.height}px`,\n\t\t\t\t\t\t\twidth: `${paperPx.margin.left}px`,\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t\t{paperPx.margin.right > 0 && (\n\t\t\t\t\t<div\n\t\t\t\t\t\tdata-testid=\"margin-right\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t...side,\n\t\t\t\t\t\t\tright: 0,\n\t\t\t\t\t\t\ttop: `${paperPx.margin.top}px`,\n\t\t\t\t\t\t\theight: `${paperPx.content.height}px`,\n\t\t\t\t\t\t\twidth: `${paperPx.margin.right}px`,\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);\n\t},\n);\n\nMarginOverlay.displayName = \"MarginOverlay\";\n","import { memo, useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\nimport { DEFAULT_DPI } from \"../../../utils/convert\";\nimport { Z_INDEX } from \"../../../utils/zIndex\";\nimport { BorderOverlay } from \"./BorderOverlay\";\nimport { GridCanvas } from \"./GridCanvas\";\nimport { GridDimensionLabel } from \"./GridDimensionLabel/GridDimensionLabel\";\nimport { GridOverlay } from \"./GridOverlay\";\nimport { GridResizeHandle } from \"./GridResizeHandle/GridResizeHandle\";\nimport { MarginOverlay } from \"./MarginOverlay\";\n\nimport type { BorderStyle, LineStyle } from \"../../../types/line\";\nimport type { Dimension, GridUnit } from \"../../../types/unit\";\nimport type { GridPosPx, PaperPx } from \"./types\";\n\n/**\n * `GridLayer` コンポーネントへの props。\n *\n * @remarks\n * **Advanced use only.** `Note` キャンバスの低レベルビルディングブロックです。通常の利用では {@link Note} を使用してください。\n */\nexport interface GridLayerProps {\n\t/** 用紙全体の px サイズ情報(キャンバス・マージン・コンテンツ)。 */\n\tpaperPx: PaperPx;\n\n\t/** グリッド境界の px 座標配列。 */\n\tgridPosPx: GridPosPx;\n\n\t/** グリッド各列・行の寸法定義。省略時は寸法ラベルを非表示にする。 */\n\tgridDimensions?: {\n\t\tcols: Array<Dimension<GridUnit>>;\n\t\trows: Array<Dimension<GridUnit>>;\n\t};\n\n\t/** グリッド線のスタイル。省略時は描画しない。 */\n\tgridLineStyle?: LineStyle;\n\n\t/** 用紙枠線のスタイル。省略時は描画しない。 */\n\tborderStyle?: BorderStyle;\n\n\t/** 用紙背景色(既定値: `\"#ffffff\"`)。 */\n\tbackgroundColor?: string;\n\n\t/** 用紙の `box-shadow` CSS 値。 */\n\tboxShadow?: string;\n\n\t/** マージン領域の背景色。 */\n\tmarginFillColor?: string;\n\n\t/** グリッド線を表示するか。 */\n\tshowGridLines?: boolean;\n\n\t/** マージン領域のオーバーレイを表示するか。 */\n\tshowMargins?: boolean;\n\n\t/** 用紙枠線を表示するか。 */\n\tshowBorder?: boolean;\n\n\t/** リサイズハンドルを表示するか。 */\n\tshowResizeHandles?: boolean;\n\n\t/** 寸法ラベルを表示するか。 */\n\tshowDimensionLabels?: boolean;\n\n\t/** DPI 値(既定値: `DEFAULT_DPI`)。 */\n\tdpi?: number;\n\n\t/** グリッドのリサイズ操作時のコールバック。 */\n\tonGridResize?: (\n\t\tdirection: \"column\" | \"row\",\n\t\tindex: number,\n\t\tdelta: number,\n\t) => void;\n\n\t/** 寸法単位変更時のコールバック。 */\n\tonDimensionChange?: (\n\t\tdirection: \"column\" | \"row\",\n\t\tindex: number,\n\t\tdimension: Dimension<GridUnit>,\n\t) => void;\n\n\t/** ルート要素の CSS クラス名。 */\n\tclassName?: string;\n\n\t/** 各子コンポーネントの z-index 上書き。 */\n\tzIndex?: {\n\t\tcanvas?: number;\n\t\tmargin?: number;\n\t\tgrid?: number;\n\t\tborder?: number;\n\t};\n}\n\n/**\n * グリッド・用紙枠線・マージンおよびリサイズ UI をまとめて描画するレイヤーコンポーネント。\n *\n * @remarks\n * **Advanced use only.** `Note` キャンバスの低レベルビルディングブロックです。通常の利用では {@link Note} を使用してください。\n */\nexport const GridLayer: React.FC<GridLayerProps> = memo(\n\t({\n\t\tpaperPx,\n\t\tgridPosPx,\n\t\tgridDimensions,\n\t\tgridLineStyle,\n\t\tborderStyle,\n\t\tbackgroundColor = \"#ffffff\",\n\t\tboxShadow = \"0 2px 8px rgba(0, 0, 0, 0.1)\",\n\t\tmarginFillColor,\n\t\tshowGridLines = true,\n\t\tshowMargins = true,\n\t\tshowBorder = true,\n\t\tshowResizeHandles = false,\n\t\tshowDimensionLabels = false,\n\t\tdpi = DEFAULT_DPI,\n\t\tonGridResize,\n\t\tonDimensionChange,\n\t\tclassName = \"\",\n\t\tzIndex = {},\n\t}) => {\n\t\tconst [ghostLine, setGhostLine] = useState<{\n\t\t\tdirection: \"column\" | \"row\";\n\t\t\tposition: number;\n\t\t} | null>(null);\n\t\tconst [draggingHandle, setDraggingHandle] = useState<{\n\t\t\tdirection: \"column\" | \"row\";\n\t\t\tindex: number;\n\t\t} | null>(null);\n\t\tconst [mousePos, setMousePos] = useState<{ x: number; y: number } | null>(\n\t\t\tnull,\n\t\t);\n\t\tconst containerRef = useRef<HTMLDivElement>(null);\n\n\t\tuseEffect(() => {\n\t\t\tconst handleMouseMove = (e: MouseEvent) => {\n\t\t\t\tif (!containerRef.current) return;\n\t\t\t\tconst rect = containerRef.current.getBoundingClientRect();\n\t\t\t\tsetMousePos({ x: e.clientX - rect.left, y: e.clientY - rect.top });\n\t\t\t};\n\t\t\tconst handleMouseLeave = (e: MouseEvent) => {\n\t\t\t\tif (!containerRef.current) return;\n\t\t\t\tconst rect = containerRef.current.getBoundingClientRect();\n\t\t\t\tif (\n\t\t\t\t\te.clientX < rect.left ||\n\t\t\t\t\te.clientX > rect.right ||\n\t\t\t\t\te.clientY < rect.top ||\n\t\t\t\t\te.clientY > rect.bottom\n\t\t\t\t) {\n\t\t\t\t\tsetMousePos(null);\n\t\t\t\t}\n\t\t\t};\n\t\t\twindow.addEventListener(\"mousemove\", handleMouseMove);\n\t\t\twindow.addEventListener(\"mouseleave\", handleMouseLeave);\n\t\t\treturn () => {\n\t\t\t\twindow.removeEventListener(\"mousemove\", handleMouseMove);\n\t\t\t\twindow.removeEventListener(\"mouseleave\", handleMouseLeave);\n\t\t\t};\n\t\t}, []);\n\n\t\tconst shouldShowDimensionLabels = useMemo(() => {\n\t\t\tif (!mousePos) return false;\n\t\t\tconst isInsideCanvas =\n\t\t\t\tmousePos.x >= paperPx.margin.left &&\n\t\t\t\tmousePos.x <= paperPx.margin.left + paperPx.content.width &&\n\t\t\t\tmousePos.y >= paperPx.margin.top &&\n\t\t\t\tmousePos.y <= paperPx.margin.top + paperPx.content.height;\n\t\t\treturn !isInsideCanvas;\n\t\t}, [mousePos, paperPx]);\n\n\t\tconst resizingPreviewSizes = useMemo(() => {\n\t\t\tif (!ghostLine || !draggingHandle) return null;\n\t\t\tconst gridLines =\n\t\t\t\tdraggingHandle.direction === \"column\" ? gridPosPx.cols : gridPosPx.rows;\n\t\t\tconst index = draggingHandle.index;\n\t\t\tconst prevStart = gridLines[index - 1];\n\t\t\tconst nextEnd = gridLines[index + 1];\n\t\t\treturn {\n\t\t\t\tdirection: draggingHandle.direction,\n\t\t\t\tprevIndex: index - 1,\n\t\t\t\tprevSize: prevStart !== undefined ? ghostLine.position - prevStart : 0,\n\t\t\t\tnextIndex: index,\n\t\t\t\tnextSize: nextEnd !== undefined ? nextEnd - ghostLine.position : 0,\n\t\t\t};\n\t\t}, [ghostLine, draggingHandle, gridPosPx]);\n\n\t\tconst clampDelta = useCallback(\n\t\t\t(direction: \"column\" | \"row\", index: number, delta: number): number => {\n\t\t\t\tconst MIN_GAP = 10;\n\t\t\t\tconst gridLines =\n\t\t\t\t\tdirection === \"column\" ? gridPosPx.cols : gridPosPx.rows;\n\t\t\t\tconst originalPos = gridLines[index];\n\t\t\t\tif (originalPos === undefined) return delta;\n\t\t\t\tconst prevLinePos = gridLines[index - 1];\n\t\t\t\tconst nextLinePos = gridLines[index + 1];\n\t\t\t\tlet clamped = delta;\n\t\t\t\tif (prevLinePos !== undefined)\n\t\t\t\t\tclamped = Math.max(clamped, prevLinePos + MIN_GAP - originalPos);\n\t\t\t\tif (nextLinePos !== undefined)\n\t\t\t\t\tclamped = Math.min(clamped, nextLinePos - MIN_GAP - originalPos);\n\t\t\t\treturn clamped;\n\t\t\t},\n\t\t\t[gridPosPx],\n\t\t);\n\n\t\tconst handleResizeStart = useCallback(\n\t\t\t(direction: \"column\" | \"row\", index: number) => {\n\t\t\t\tsetDraggingHandle({ direction, index });\n\t\t\t},\n\t\t\t[],\n\t\t);\n\n\t\tconst handleResize = useCallback(\n\t\t\t(direction: \"column\" | \"row\", index: number, delta: number) => {\n\t\t\t\tconst gridLines =\n\t\t\t\t\tdirection === \"column\" ? gridPosPx.cols : gridPosPx.rows;\n\t\t\t\tconst originalPos = gridLines[index];\n\t\t\t\tif (originalPos === undefined) return;\n\t\t\t\tsetGhostLine({\n\t\t\t\t\tdirection,\n\t\t\t\t\tposition: originalPos + clampDelta(direction, index, delta),\n\t\t\t\t});\n\t\t\t},\n\t\t\t[gridPosPx, clampDelta],\n\t\t);\n\n\t\tconst handleResizeEnd = useCallback(\n\t\t\t(direction: \"column\" | \"row\", index: number, delta: number) => {\n\t\t\t\tsetGhostLine(null);\n\t\t\t\tsetDraggingHandle(null);\n\t\t\t\tonGridResize?.(direction, index, clampDelta(direction, index, delta));\n\t\t\t},\n\t\t\t[clampDelta, onGridResize],\n\t\t);\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={containerRef}\n\t\t\t\tclassName={className}\n\t\t\t\tstyle={{ position: \"relative\", width: \"100%\", height: \"100%\" }}\n\t\t\t>\n\t\t\t\t<GridCanvas\n\t\t\t\t\tcanvasPx={paperPx.canvas}\n\t\t\t\t\tbackgroundColor={backgroundColor}\n\t\t\t\t\tboxShadow={boxShadow}\n\t\t\t\t\tzIndex={zIndex.canvas ?? Z_INDEX.GRID_CANVAS}\n\t\t\t\t/>\n\n\t\t\t\t{showMargins && (\n\t\t\t\t\t<MarginOverlay\n\t\t\t\t\t\tpaperPx={paperPx}\n\t\t\t\t\t\tmarginColor={marginFillColor}\n\t\t\t\t\t\tzIndex={zIndex.margin ?? Z_INDEX.MARGIN_OVERLAY}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\n\t\t\t\t{showGridLines && (\n\t\t\t\t\t<GridOverlay\n\t\t\t\t\t\tgridPosPx={gridPosPx}\n\t\t\t\t\t\tcontentPx={paperPx.content}\n\t\t\t\t\t\tmarginLeftPx={paperPx.margin.left}\n\t\t\t\t\t\tmarginTopPx={paperPx.margin.top}\n\t\t\t\t\t\tlineStyle={gridLineStyle}\n\t\t\t\t\t\tdpi={dpi}\n\t\t\t\t\t\tzIndex={zIndex.grid ?? Z_INDEX.GRID_OVERLAY}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\n\t\t\t\t{showBorder && (\n\t\t\t\t\t<BorderOverlay\n\t\t\t\t\t\tcontentPx={paperPx.content}\n\t\t\t\t\t\tmarginLeftPx={paperPx.margin.left}\n\t\t\t\t\t\tmarginTopPx={paperPx.margin.top}\n\t\t\t\t\t\tborderStyle={borderStyle}\n\t\t\t\t\t\tdpi={dpi}\n\t\t\t\t\t\tzIndex={zIndex.border ?? Z_INDEX.BORDER_OVERLAY}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\n\t\t\t\t{showResizeHandles && onGridResize && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t{gridPosPx.cols.map((colPos, index) => {\n\t\t\t\t\t\t\tif (index === 0 || index === gridPosPx.cols.length - 1)\n\t\t\t\t\t\t\t\treturn null;\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<GridResizeHandle\n\t\t\t\t\t\t\t\t\tkey={`col-${colPos}`}\n\t\t\t\t\t\t\t\t\tdirection=\"column\"\n\t\t\t\t\t\t\t\t\tindex={index}\n\t\t\t\t\t\t\t\t\tposition={colPos}\n\t\t\t\t\t\t\t\t\tmarginLeftPx={paperPx.margin.left}\n\t\t\t\t\t\t\t\t\tmarginTopPx={paperPx.margin.top}\n\t\t\t\t\t\t\t\t\tonResizeStart={handleResizeStart}\n\t\t\t\t\t\t\t\t\tonResize={handleResize}\n\t\t\t\t\t\t\t\t\tonResizeEnd={handleResizeEnd}\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\t{gridPosPx.rows.map((rowPos, index) => {\n\t\t\t\t\t\t\tif (index === 0 || index === gridPosPx.rows.length - 1)\n\t\t\t\t\t\t\t\treturn null;\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<GridResizeHandle\n\t\t\t\t\t\t\t\t\tkey={`row-${rowPos}`}\n\t\t\t\t\t\t\t\t\tdirection=\"row\"\n\t\t\t\t\t\t\t\t\tindex={index}\n\t\t\t\t\t\t\t\t\tposition={rowPos}\n\t\t\t\t\t\t\t\t\tmarginLeftPx={paperPx.margin.left}\n\t\t\t\t\t\t\t\t\tmarginTopPx={paperPx.margin.top}\n\t\t\t\t\t\t\t\t\tonResizeStart={handleResizeStart}\n\t\t\t\t\t\t\t\t\tonResize={handleResize}\n\t\t\t\t\t\t\t\t\tonResizeEnd={handleResizeEnd}\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\n\t\t\t\t{showDimensionLabels && gridDimensions && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t{gridDimensions.cols.map((dimension, index) => {\n\t\t\t\t\t\t\tconst startPos = gridPosPx.cols[index];\n\t\t\t\t\t\t\tconst endPos = gridPosPx.cols[index + 1];\n\t\t\t\t\t\t\tif (startPos === undefined || endPos === undefined) return null;\n\t\t\t\t\t\t\tconst isDraggingAdjacent =\n\t\t\t\t\t\t\t\tdraggingHandle?.direction === \"column\" &&\n\t\t\t\t\t\t\t\t(draggingHandle.index === index ||\n\t\t\t\t\t\t\t\t\tdraggingHandle.index === index + 1);\n\t\t\t\t\t\t\tlet resizingPxSize: number | undefined;\n\t\t\t\t\t\t\tif (resizingPreviewSizes?.direction === \"column\") {\n\t\t\t\t\t\t\t\tif (resizingPreviewSizes.prevIndex === index)\n\t\t\t\t\t\t\t\t\tresizingPxSize = resizingPreviewSizes.prevSize;\n\t\t\t\t\t\t\t\telse if (resizingPreviewSizes.nextIndex === index)\n\t\t\t\t\t\t\t\t\tresizingPxSize = resizingPreviewSizes.nextSize;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<GridDimensionLabel\n\t\t\t\t\t\t\t\t\tkey={`col-dim-${startPos}`}\n\t\t\t\t\t\t\t\t\tdirection=\"column\"\n\t\t\t\t\t\t\t\t\tindex={index}\n\t\t\t\t\t\t\t\t\tdimension={dimension}\n\t\t\t\t\t\t\t\t\tposition={(startPos + endPos) / 2}\n\t\t\t\t\t\t\t\t\tcurrentPxSize={endPos - startPos}\n\t\t\t\t\t\t\t\t\tmarginLeftPx={paperPx.margin.left}\n\t\t\t\t\t\t\t\t\tmarginTopPx={paperPx.margin.top}\n\t\t\t\t\t\t\t\t\tisNearCursor={shouldShowDimensionLabels || isDraggingAdjacent}\n\t\t\t\t\t\t\t\t\tresizingPxSize={resizingPxSize}\n\t\t\t\t\t\t\t\t\tonDimensionChange={onDimensionChange}\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\t{gridDimensions.rows.map((dimension, index) => {\n\t\t\t\t\t\t\tconst startPos = gridPosPx.rows[index];\n\t\t\t\t\t\t\tconst endPos = gridPosPx.rows[index + 1];\n\t\t\t\t\t\t\tif (startPos === undefined || endPos === undefined) return null;\n\t\t\t\t\t\t\tconst isDraggingAdjacent =\n\t\t\t\t\t\t\t\tdraggingHandle?.direction === \"row\" &&\n\t\t\t\t\t\t\t\t(draggingHandle.index === index ||\n\t\t\t\t\t\t\t\t\tdraggingHandle.index === index + 1);\n\t\t\t\t\t\t\tlet resizingPxSize: number | undefined;\n\t\t\t\t\t\t\tif (resizingPreviewSizes?.direction === \"row\") {\n\t\t\t\t\t\t\t\tif (resizingPreviewSizes.prevIndex === index)\n\t\t\t\t\t\t\t\t\tresizingPxSize = resizingPreviewSizes.prevSize;\n\t\t\t\t\t\t\t\telse if (resizingPreviewSizes.nextIndex === index)\n\t\t\t\t\t\t\t\t\tresizingPxSize = resizingPreviewSizes.nextSize;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<GridDimensionLabel\n\t\t\t\t\t\t\t\t\tkey={`row-dim-${startPos}`}\n\t\t\t\t\t\t\t\t\tdirection=\"row\"\n\t\t\t\t\t\t\t\t\tindex={index}\n\t\t\t\t\t\t\t\t\tdimension={dimension}\n\t\t\t\t\t\t\t\t\tposition={(startPos + endPos) / 2}\n\t\t\t\t\t\t\t\t\tcurrentPxSize={endPos - startPos}\n\t\t\t\t\t\t\t\t\tmarginLeftPx={paperPx.margin.left}\n\t\t\t\t\t\t\t\t\tmarginTopPx={paperPx.margin.top}\n\t\t\t\t\t\t\t\t\tisNearCursor={shouldShowDimensionLabels || isDraggingAdjacent}\n\t\t\t\t\t\t\t\t\tresizingPxSize={resizingPxSize}\n\t\t\t\t\t\t\t\t\tonDimensionChange={onDimensionChange}\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\n\t\t\t\t{ghostLine && (\n\t\t\t\t\t<div\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\t\t\tleft:\n\t\t\t\t\t\t\t\tghostLine.direction === \"column\"\n\t\t\t\t\t\t\t\t\t? paperPx.margin.left + ghostLine.position\n\t\t\t\t\t\t\t\t\t: paperPx.margin.left,\n\t\t\t\t\t\t\ttop:\n\t\t\t\t\t\t\t\tghostLine.direction === \"row\"\n\t\t\t\t\t\t\t\t\t? paperPx.margin.top + ghostLine.position\n\t\t\t\t\t\t\t\t\t: paperPx.margin.top,\n\t\t\t\t\t\t\twidth:\n\t\t\t\t\t\t\t\tghostLine.direction === \"column\"\n\t\t\t\t\t\t\t\t\t? \"2px\"\n\t\t\t\t\t\t\t\t\t: paperPx.content.width,\n\t\t\t\t\t\t\theight:\n\t\t\t\t\t\t\t\tghostLine.direction === \"row\" ? \"2px\" : paperPx.content.height,\n\t\t\t\t\t\t\tbackgroundColor: \"#3b82f6\",\n\t\t\t\t\t\t\topacity: 0.5,\n\t\t\t\t\t\t\tpointerEvents: \"none\",\n\t\t\t\t\t\t\tzIndex: Z_INDEX.GRID_GHOST,\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);\n\t},\n);\n\nGridLayer.displayName = \"GridLayer\";\n","import { useState } from \"react\";\n\nimport type { InteractionState } from \"../types\";\n\n/**\n * `InteractionLayer` に渡す `state` と `onStateChange` を提供する。\n *\n * @example\n * ```tsx\n * const [state, onStateChange] = useInteractionState();\n * return <InteractionLayer state={state} onStateChange={onStateChange} ... />;\n * ```\n *\n * @remarks\n * **Canvas** — {@link InteractionLayer} の `state` / `onStateChange` を提供するシンプルなフック。\n */\nexport function useInteractionState(initialState?: Partial<InteractionState>) {\n\treturn useState<InteractionState>({\n\t\teditingBlockId: null,\n\t\t...initialState,\n\t});\n}\n","/**\n * インタラクションモード(dragging/editingBlockId から導出)\n *\n * @remarks\n * **Canvas** — {@link InteractionLayer} の動作モード列挙型。\n */\nexport enum InteractionMode {\n\tIDLE = \"idle\",\n\tPRESSING = \"pressing\",\n\tDRAGGING = \"dragging\",\n\tINSERT = \"insert\",\n\tEDITING = \"editing\",\n}\n\n/**\n * リサイズハンドル方向(8方向)\n *\n * @remarks\n * **Canvas** — {@link InteractionLayer} のリサイズハンドル方向。\n */\nexport enum ResizeHandle {\n\tN = \"n\",\n\tNE = \"ne\",\n\tE = \"e\",\n\tSE = \"se\",\n\tS = \"s\",\n\tSW = \"sw\",\n\tW = \"w\",\n\tNW = \"nw\",\n}\n\n/**\n * ドラッグ種別\n *\n * @remarks\n * **Canvas** — {@link InteractionLayer} のドラッグ種別。\n */\nexport enum DragType {\n\tMOVE = \"move\",\n\tRESIZE = \"resize\",\n\tINSERT = \"insert\",\n}\n\n/**\n * ドラッグ中の詳細状態\n *\n * @remarks\n * **Canvas** — {@link InteractionLayer} のドラッグ中状態型。\n */\nexport interface DraggingState {\n\ttype: DragType;\n\tblockIds: string[];\n\tstartGrid: { col: number; row: number };\n\tcurrentGrid: { col: number; row: number };\n\t/** マウスの現在座標 (px, キャンバス相対)。キャンバス外ゴースト表示用 */\n\tcurrentMousePx?: { x: number; y: number };\n\t/** リサイズ用ハンドル方向 */\n\thandle?: ResizeHandle;\n\t/** 挿入用: プラグイン種別 */\n\tpluginKind?: string;\n\t/** 挿入用: デフォルトサイズ */\n\tdefaultSize?: { w: number; h: number };\n\t/** キャンバス外フラグ */\n\tisOutside?: boolean;\n}\n\n/**\n * インタラクション状態(外部で管理する controlled state)\n *\n * - 選択状態 (`selectedBlockIds`) は外部で管理されるため含まない\n * - モード (`InteractionMode`) は `editingBlockId` と `dragging` から導出する\n *\n * @remarks\n * **Canvas** — {@link InteractionLayer} に渡す制御状態型。\n */\nexport interface InteractionState {\n\t/** 編集中ブロックID。null = 非編集 */\n\teditingBlockId: string | null;\n\t/** ドラッグ中状態 */\n\tdragging?: DraggingState;\n}\n\n/**\n * `InteractionState` から現在モードを導出する\n *\n * @remarks\n * **Canvas** — {@link InteractionState} から動作モードを導出するユーティリティ。\n */\nexport function getInteractionMode(state: InteractionState): InteractionMode {\n\tif (state.editingBlockId !== null) return InteractionMode.EDITING;\n\tif (state.dragging) {\n\t\tif (state.dragging.type === DragType.INSERT) return InteractionMode.INSERT;\n\t\tif (state.dragging.type === DragType.RESIZE)\n\t\t\treturn InteractionMode.DRAGGING;\n\t\tconst gridChanged =\n\t\t\tstate.dragging.currentGrid.col !== state.dragging.startGrid.col ||\n\t\t\tstate.dragging.currentGrid.row !== state.dragging.startGrid.row;\n\t\treturn gridChanged ? InteractionMode.DRAGGING : InteractionMode.PRESSING;\n\t}\n\treturn InteractionMode.IDLE;\n}\n","// リサイズ後レイアウト計算\n\nimport { ResizeHandle } from \"../types\";\n\n/**\n * リサイズ計算に必要なブロックのレイアウト情報(グリッド単位)。\n */\nexport interface BlockLayout {\n\t/** 左端の列インデックス。 */\n\tx: number;\n\n\t/** 上端の行インデックス。 */\n\ty: number;\n\n\t/** 幅(グリッド列数)。 */\n\tw: number;\n\n\t/** 高さ(グリッド行数)。 */\n\th: number;\n}\n\n/**\n * `calculateResizedLayout` への入力パラメータ。\n */\nexport interface ResizeParams {\n\t/** リサイズ前のブロックレイアウト。 */\n\tlayout: BlockLayout;\n\n\t/** 操作したリサイズハンドルの方向。 */\n\thandle: ResizeHandle;\n\n\t/** 列方向のドラッグデルタ(グリッド列数)。 */\n\tdeltaCol: number;\n\n\t/** 行方向のドラッグデルタ(グリッド行数)。 */\n\tdeltaRow: number;\n\n\t/** グリッドの列数。境界クランプに使用。 */\n\tgridCols: number;\n\n\t/** グリッドの行数。境界クランプに使用。 */\n\tgridRows: number;\n}\n\n/**\n * リサイズ後のレイアウトを計算する(最小 1x1、グリッド範囲内にクランプ)。\n */\nexport function calculateResizedLayout({\n\tlayout,\n\thandle,\n\tdeltaCol,\n\tdeltaRow,\n\tgridCols,\n\tgridRows,\n}: ResizeParams): BlockLayout {\n\tconst newLayout = { ...layout };\n\n\t// --- 横方向 ---\n\tif (\n\t\thandle === ResizeHandle.E ||\n\t\thandle === ResizeHandle.NE ||\n\t\thandle === ResizeHandle.SE\n\t) {\n\t\tconst maxW = gridCols - layout.x;\n\t\tnewLayout.w = Math.max(1, Math.min(layout.w + deltaCol, maxW));\n\t} else if (\n\t\thandle === ResizeHandle.W ||\n\t\thandle === ResizeHandle.NW ||\n\t\thandle === ResizeHandle.SW\n\t) {\n\t\tconst maxShrink = layout.w - 1;\n\t\tconst validDCol = deltaCol > 0 ? Math.min(deltaCol, maxShrink) : deltaCol;\n\t\tif (layout.x + validDCol >= 0) {\n\t\t\tnewLayout.x = layout.x + validDCol;\n\t\t\tnewLayout.w = layout.w - validDCol;\n\t\t} else {\n\t\t\tnewLayout.x = 0;\n\t\t\tnewLayout.w = layout.w + layout.x;\n\t\t}\n\t}\n\n\t// --- 縦方向 ---\n\tif (\n\t\thandle === ResizeHandle.S ||\n\t\thandle === ResizeHandle.SE ||\n\t\thandle === ResizeHandle.SW\n\t) {\n\t\tconst maxH = gridRows - layout.y;\n\t\tnewLayout.h = Math.max(1, Math.min(layout.h + deltaRow, maxH));\n\t} else if (\n\t\thandle === ResizeHandle.N ||\n\t\thandle === ResizeHandle.NE ||\n\t\thandle === ResizeHandle.NW\n\t) {\n\t\tconst maxShrink = layout.h - 1;\n\t\tconst validDRow = deltaRow > 0 ? Math.min(deltaRow, maxShrink) : deltaRow;\n\t\tif (layout.y + validDRow >= 0) {\n\t\t\tnewLayout.y = layout.y + validDRow;\n\t\t\tnewLayout.h = layout.h - validDRow;\n\t\t} else {\n\t\t\tnewLayout.y = 0;\n\t\t\tnewLayout.h = layout.h + layout.y;\n\t\t}\n\t}\n\n\treturn newLayout;\n}\n","import type { Block } from \"../../../../types/block\";\n\n/**\n * 複数ブロックの移動クランプ結果。\n */\nexport interface ClampedBlockPosition {\n\t/** 対象ブロックの ID。 */\n\tblockId: string;\n\n\t/** クランプ後の列インデックス。 */\n\tx: number;\n\n\t/** クランプ後の行インデックス。 */\n\ty: number;\n}\n\n/**\n * 複数ブロックの移動をグリッド範囲内にクランプする。\n *\n * バウンディングボックス全体を基準にクランプするため、相対位置関係が保たれる。\n */\nexport function clampMultipleBlocks(\n\tblocks: Block[],\n\tdeltaCol: number,\n\tdeltaRow: number,\n\tgridCols: number,\n\tgridRows: number,\n): ClampedBlockPosition[] {\n\tif (blocks.length === 0) return [];\n\n\tif (blocks.length === 1) {\n\t\tconst block = blocks[0];\n\t\tif (!block) return [];\n\t\tconst maxX = gridCols - block.layout.w;\n\t\tconst maxY = gridRows - block.layout.h;\n\t\treturn [\n\t\t\t{\n\t\t\t\tblockId: block.id,\n\t\t\t\tx: Math.max(0, Math.min(block.layout.x + deltaCol, maxX)),\n\t\t\t\ty: Math.max(0, Math.min(block.layout.y + deltaRow, maxY)),\n\t\t\t},\n\t\t];\n\t}\n\n\t// バウンディングボックスで一括クランプ\n\tconst minX = Math.min(...blocks.map((b) => b.layout.x));\n\tconst minY = Math.min(...blocks.map((b) => b.layout.y));\n\tconst maxBoundX = Math.max(...blocks.map((b) => b.layout.x + b.layout.w));\n\tconst maxBoundY = Math.max(...blocks.map((b) => b.layout.y + b.layout.h));\n\n\tconst boundW = maxBoundX - minX;\n\tconst boundH = maxBoundY - minY;\n\n\tconst clampedMinX = Math.max(0, Math.min(minX + deltaCol, gridCols - boundW));\n\tconst clampedMinY = Math.max(0, Math.min(minY + deltaRow, gridRows - boundH));\n\n\tconst actualDeltaCol = clampedMinX - minX;\n\tconst actualDeltaRow = clampedMinY - minY;\n\n\treturn blocks.map((block) => ({\n\t\tblockId: block.id,\n\t\tx: block.layout.x + actualDeltaCol,\n\t\ty: block.layout.y + actualDeltaRow,\n\t}));\n}\n","import { createBlockId } from \"../../../../utils/block\";\n\nimport type { Block, BlockPos, BlockSize } from \"../../../../types/block\";\n\ninterface BlockFactoryPlugin {\n\tkind: string;\n\tmeta: {\n\t\tdisplayName?: string;\n\t\tdefaultSize?: BlockSize;\n\t};\n}\n\n/**\n * プラグインとグリッド位置から新規 `Block` を生成する。\n *\n * - `w/h` は `plugin.meta.defaultSize` から取得(未設定なら 1x1)\n * - `props` は空オブジェクト(resolveBlockProps が後でデフォルトを補完する)\n */\nexport function createBlock(\n\tplugin: BlockFactoryPlugin,\n\tposition: BlockPos,\n): Block {\n\treturn {\n\t\tid: createBlockId(plugin.kind),\n\t\tkind: plugin.kind,\n\t\tlayout: {\n\t\t\tx: position.x,\n\t\t\ty: position.y,\n\t\t\tw: plugin.meta.defaultSize?.w ?? 1,\n\t\t\th: plugin.meta.defaultSize?.h ?? 1,\n\t\t},\n\t\tprops: {},\n\t};\n}\n","import { type CSSProperties, memo } from \"react\";\n\nimport { LineType } from \"../../../types/line\";\nimport { NoteMode } from \"../../../types/mode\";\nimport { DEFAULT_DPI } from \"../../../utils/convert\";\nimport { BLOCK_SUB_INDEX, Z_INDEX } from \"../../../utils/zIndex\";\nimport { BlockBorder } from \"../BlockLayer/BlockBorder\";\nimport { BlockCanvas } from \"../BlockLayer/BlockCanvas\";\nimport { BlockGuideBorder } from \"../BlockLayer/BlockGuideBorder\";\nimport { BlockRenderer } from \"../BlockLayer/BlockRenderer\";\nimport { resolveBlockProps } from \"../BlockLayer/utils/resolveBlockProps\";\nimport { DragType as DT } from \"./types\";\nimport { calculateResizedLayout } from \"./utils/calcResize\";\nimport { clampMultipleBlocks } from \"./utils/clampMultipleBlocks\";\nimport { createBlock } from \"./utils/createBlock\";\n\nimport type { PluginRegistry, ResolvedPlugin } from \"../../../plugin/registry\";\nimport type { Block } from \"../../../types/block\";\nimport type { BorderStyle } from \"../../../types/line\";\nimport type { BlockDefaults } from \"../../../types/schema\";\nimport type { BlockRectPx } from \"../types\";\nimport type { DraggingState, ResizeHandle } from \"./types\";\n\n// ゴーストブロック用のガイド枠線(破線・太め)\nconst GHOST_GUIDE_BORDER: BorderStyle = {\n\ttop: {\n\t\tcolor: \"#888888\",\n\t\twidth: { value: 3, unit: \"px\" },\n\t\ttype: LineType.DASHED,\n\t},\n\tright: {\n\t\tcolor: \"#888888\",\n\t\twidth: { value: 3, unit: \"px\" },\n\t\ttype: LineType.DASHED,\n\t},\n\tbottom: {\n\t\tcolor: \"#888888\",\n\t\twidth: { value: 3, unit: \"px\" },\n\t\ttype: LineType.DASHED,\n\t},\n\tleft: {\n\t\tcolor: \"#888888\",\n\t\twidth: { value: 3, unit: \"px\" },\n\t\ttype: LineType.DASHED,\n\t},\n};\n\n/**\n * `DragLayer` コンポーネントへの props。\n */\nexport interface DragLayerProps {\n\t/** 全ブロックのデータ一覧。ゴースト描画の元データとして使用。 */\n\tblocks: Block[];\n\n\t/** プラグインレジストリ。 */\n\tpluginRegistry: PluginRegistry;\n\n\t/** グリッドの列数・行数。 */\n\tgridLength: { cols: number; rows: number };\n\n\t/** ドラッグ中の状態。`undefined` の場合は描画しない。 */\n\tdraggingState: DraggingState | undefined;\n\n\t/** ブロックからキャンバス上の矩形座標(px)を返す関数。 */\n\tgetBlockRectPx: (block: Block) => BlockRectPx;\n\n\t/** ブロックのデフォルト値設定。 */\n\tblockDefaults?: BlockDefaults;\n\n\t/** 選択枠線スタイル。 */\n\tselectionStyle?: BorderStyle;\n\n\t/** ゴーストの z-index(既定値: `Z_INDEX.BLOCK_GHOST`)。 */\n\tghostZIndex?: number;\n\n\t/** 選択枠線の z-index。 */\n\tselectBorderZIndex?: number;\n\n\t/** リサイズハンドルの z-index。 */\n\tblockHandlesZIndex?: number;\n}\n\n// ゴーストブロック1つを描画するヘルパー\nconst GhostBlock = memo(\n\t({\n\t\tblock,\n\t\tresolvedPlugin,\n\t\tblockDefaults,\n\t\trect,\n\t\topacity,\n\t\tghostZIndex,\n\t}: {\n\t\tblock: Block;\n\t\tresolvedPlugin: ResolvedPlugin;\n\t\tblockDefaults?: BlockDefaults;\n\t\trect: BlockRectPx;\n\t\topacity: number;\n\t\tghostZIndex: number;\n\t}) => {\n\t\tconst props = resolveBlockProps(block, resolvedPlugin, blockDefaults);\n\t\tconst sizePx = { width: rect.width, height: rect.height };\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tstyle={{\n\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\tleft: `${rect.left}px`,\n\t\t\t\t\ttop: `${rect.top}px`,\n\t\t\t\t\twidth: `${rect.width}px`,\n\t\t\t\t\theight: `${rect.height}px`,\n\t\t\t\t\topacity,\n\t\t\t\t\tzIndex: ghostZIndex,\n\t\t\t\t\tpointerEvents: \"none\",\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<BlockCanvas\n\t\t\t\t\tblockSizePx={sizePx}\n\t\t\t\t\tblockZIndex={0}\n\t\t\t\t\tsubZIndex={BLOCK_SUB_INDEX.BG}\n\t\t\t\t\tbackgroundColor={block.style?.backgroundColor}\n\t\t\t\t/>\n\t\t\t\t<BlockRenderer\n\t\t\t\t\tid={block.id}\n\t\t\t\t\tresolvedPlugin={resolvedPlugin}\n\t\t\t\t\tprops={props}\n\t\t\t\t\tvalue={block.initValue ?? null}\n\t\t\t\t\treadOnly={true}\n\t\t\t\t\tmode={NoteMode.FORM}\n\t\t\t\t\tblockSizePx={sizePx}\n\t\t\t\t\tblockZIndex={0}\n\t\t\t\t\tsubZIndex={BLOCK_SUB_INDEX.CONTENT}\n\t\t\t\t/>\n\t\t\t\t{/* ガイド枠線(ブロックに枠線なしの場合)*/}\n\t\t\t\t{!block.style?.border && (\n\t\t\t\t\t<BlockGuideBorder\n\t\t\t\t\t\tblockSizePx={sizePx}\n\t\t\t\t\t\tblockZIndex={0}\n\t\t\t\t\t\tsubZIndex={BLOCK_SUB_INDEX.GUIDE}\n\t\t\t\t\t\tborderStyle={GHOST_GUIDE_BORDER}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t\t<BlockBorder\n\t\t\t\t\tblockSizePx={sizePx}\n\t\t\t\t\tborderStyle={block.style?.border}\n\t\t\t\t\tblockZIndex={0}\n\t\t\t\t\tsubZIndex={BLOCK_SUB_INDEX.BORDER}\n\t\t\t\t\tdpi={DEFAULT_DPI}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t);\n\t},\n);\nGhostBlock.displayName = \"GhostBlock\";\n\n/**\n * 移動・リサイズ・挿入ドラッグ中のゴースト UI を描画するコンポーネント。\n *\n * `draggingState` が `undefined` の場合は `null` を返します。\n */\nexport const DragLayer = memo(\n\t({\n\t\tblocks,\n\t\tpluginRegistry,\n\t\tgridLength,\n\t\tdraggingState,\n\t\tgetBlockRectPx,\n\t\tblockDefaults,\n\t\tghostZIndex = Z_INDEX.BLOCK_GHOST,\n\t}: DragLayerProps) => {\n\t\tif (!draggingState) return null;\n\n\t\tconst deltaCol =\n\t\t\tdraggingState.currentGrid.col - draggingState.startGrid.col;\n\t\tconst deltaRow =\n\t\t\tdraggingState.currentGrid.row - draggingState.startGrid.row;\n\n\t\tconst wrapper: CSSProperties = {\n\t\t\tposition: \"absolute\",\n\t\t\tinset: 0,\n\t\t\tpointerEvents: \"none\",\n\t\t};\n\n\t\t// --- 移動ゴースト ---\n\t\tif (draggingState.type === DT.MOVE) {\n\t\t\tconst dragTargets = draggingState.blockIds\n\t\t\t\t.map((id) => blocks.find((b) => b.id === id))\n\t\t\t\t.filter(Boolean) as Block[];\n\n\t\t\tconst clampedPositions = clampMultipleBlocks(\n\t\t\t\tdragTargets,\n\t\t\t\tdeltaCol,\n\t\t\t\tdeltaRow,\n\t\t\t\tgridLength.cols,\n\t\t\t\tgridLength.rows,\n\t\t\t);\n\n\t\t\treturn (\n\t\t\t\t<div style={wrapper} data-testid=\"drag-layer-move\">\n\t\t\t\t\t{dragTargets.map((block) => {\n\t\t\t\t\t\tconst resolvedPlugin = pluginRegistry[block.kind];\n\t\t\t\t\t\tif (!resolvedPlugin) return null;\n\n\t\t\t\t\t\tlet ghostRect: BlockRectPx;\n\t\t\t\t\t\tconst isOutside = draggingState.isOutside ?? false;\n\t\t\t\t\t\tconst currentMousePx = draggingState.currentMousePx;\n\n\t\t\t\t\t\tif (isOutside && currentMousePx) {\n\t\t\t\t\t\t\tconst origRect = getBlockRectPx(block);\n\t\t\t\t\t\t\tghostRect = {\n\t\t\t\t\t\t\t\tleft: currentMousePx.x - origRect.width / 2,\n\t\t\t\t\t\t\t\ttop: currentMousePx.y - origRect.height / 2,\n\t\t\t\t\t\t\t\twidth: origRect.width,\n\t\t\t\t\t\t\t\theight: origRect.height,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst clampedPos = clampedPositions.find(\n\t\t\t\t\t\t\t\t(p) => p.blockId === block.id,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tif (!clampedPos) return null;\n\t\t\t\t\t\t\tconst ghostBlock: Block = {\n\t\t\t\t\t\t\t\t...block,\n\t\t\t\t\t\t\t\tlayout: {\n\t\t\t\t\t\t\t\t\t...block.layout,\n\t\t\t\t\t\t\t\t\tx: clampedPos.x,\n\t\t\t\t\t\t\t\t\ty: clampedPos.y,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tghostRect = getBlockRectPx(ghostBlock);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<GhostBlock\n\t\t\t\t\t\t\t\tkey={block.id}\n\t\t\t\t\t\t\t\tblock={block}\n\t\t\t\t\t\t\t\tresolvedPlugin={resolvedPlugin}\n\t\t\t\t\t\t\t\tblockDefaults={blockDefaults}\n\t\t\t\t\t\t\t\trect={ghostRect}\n\t\t\t\t\t\t\t\topacity={isOutside ? 0.3 : 0.5}\n\t\t\t\t\t\t\t\tghostZIndex={ghostZIndex}\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</div>\n\t\t\t);\n\t\t}\n\n\t\t// --- リサイズゴースト ---\n\t\tif (draggingState.type === DT.RESIZE) {\n\t\t\tconst blockId = draggingState.blockIds[0];\n\t\t\tconst handle = draggingState.handle as ResizeHandle;\n\t\t\tif (!blockId || !handle) return null;\n\n\t\t\tconst block = blocks.find((b) => b.id === blockId);\n\t\t\tconst resolvedPlugin = block ? pluginRegistry[block.kind] : undefined;\n\t\t\tif (!block || !resolvedPlugin) return null;\n\n\t\t\tconst newLayout = calculateResizedLayout({\n\t\t\t\tlayout: block.layout,\n\t\t\t\thandle,\n\t\t\t\tdeltaCol,\n\t\t\t\tdeltaRow,\n\t\t\t\tgridCols: gridLength.cols,\n\t\t\t\tgridRows: gridLength.rows,\n\t\t\t});\n\n\t\t\tconst ghostBlock: Block = { ...block, layout: newLayout };\n\t\t\tconst ghostRect = getBlockRectPx(ghostBlock);\n\n\t\t\treturn (\n\t\t\t\t<div style={wrapper} data-testid=\"drag-layer-resize\">\n\t\t\t\t\t<GhostBlock\n\t\t\t\t\t\tblock={block}\n\t\t\t\t\t\tresolvedPlugin={resolvedPlugin}\n\t\t\t\t\t\tblockDefaults={blockDefaults}\n\t\t\t\t\t\trect={ghostRect}\n\t\t\t\t\t\topacity={draggingState.isOutside ? 0.3 : 0.5}\n\t\t\t\t\t\tghostZIndex={ghostZIndex}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t);\n\t\t}\n\n\t\t// --- 挿入ゴースト ---\n\t\tif (draggingState.type === DT.INSERT) {\n\t\t\tconst { pluginKind, defaultSize, currentGrid, currentMousePx } =\n\t\t\t\tdraggingState;\n\t\t\tif (!pluginKind || !defaultSize) return null;\n\n\t\t\tconst resolvedPlugin = pluginRegistry[pluginKind];\n\t\t\tif (!resolvedPlugin) return null;\n\n\t\t\tconst isOutside = draggingState.isOutside ?? false;\n\n\t\t\tlet ghostRect: BlockRectPx;\n\n\t\t\tif (isOutside && currentMousePx) {\n\t\t\t\t// クランプなし仮ブロックでサイズを取得\n\t\t\t\tconst tempBlock = createBlock(resolvedPlugin, { x: 0, y: 0 });\n\t\t\t\tconst tempRect = getBlockRectPx({\n\t\t\t\t\t...tempBlock,\n\t\t\t\t\tlayout: { ...tempBlock.layout, w: defaultSize.w, h: defaultSize.h },\n\t\t\t\t});\n\t\t\t\tghostRect = {\n\t\t\t\t\tleft: currentMousePx.x - tempRect.width / 2,\n\t\t\t\t\ttop: currentMousePx.y - tempRect.height / 2,\n\t\t\t\t\twidth: tempRect.width,\n\t\t\t\t\theight: tempRect.height,\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tconst maxX = gridLength.cols - defaultSize.w;\n\t\t\t\tconst maxY = gridLength.rows - defaultSize.h;\n\t\t\t\tconst x = Math.max(0, Math.min(currentGrid.col, maxX));\n\t\t\t\tconst y = Math.max(0, Math.min(currentGrid.row, maxY));\n\t\t\t\tconst ghostBlock = createBlock(resolvedPlugin, { x, y });\n\t\t\t\tconst blockWithSize: Block = {\n\t\t\t\t\t...ghostBlock,\n\t\t\t\t\tlayout: { ...ghostBlock.layout, w: defaultSize.w, h: defaultSize.h },\n\t\t\t\t};\n\t\t\t\tghostRect = getBlockRectPx(blockWithSize);\n\t\t\t}\n\n\t\t\tconst displayBlock: Block = {\n\t\t\t\t...createBlock(resolvedPlugin, { x: 0, y: 0 }),\n\t\t\t\tlayout: {\n\t\t\t\t\tx: 0,\n\t\t\t\t\ty: 0,\n\t\t\t\t\tw: defaultSize.w,\n\t\t\t\t\th: defaultSize.h,\n\t\t\t\t},\n\t\t\t};\n\n\t\t\treturn (\n\t\t\t\t<div style={wrapper} data-testid=\"drag-layer-insert\">\n\t\t\t\t\t<GhostBlock\n\t\t\t\t\t\tblock={displayBlock}\n\t\t\t\t\t\tresolvedPlugin={resolvedPlugin}\n\t\t\t\t\t\tblockDefaults={blockDefaults}\n\t\t\t\t\t\trect={ghostRect}\n\t\t\t\t\t\topacity={isOutside ? 0.3 : 0.5}\n\t\t\t\t\t\tghostZIndex={ghostZIndex}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t);\n\t\t}\n\n\t\treturn null;\n\t},\n);\n\nDragLayer.displayName = \"DragLayer\";\n","import {\n\ttype ForwardedRef,\n\tforwardRef,\n\tmemo,\n\tuseImperativeHandle,\n\tuseRef,\n} from \"react\";\n\nimport { NoteMode } from \"../../../types/mode\";\nimport { DEFAULT_DPI } from \"../../../utils/convert\";\nimport { BLOCK_SUB_INDEX, Z_INDEX } from \"../../../utils/zIndex\";\nimport { BlockBorder } from \"../BlockLayer/BlockBorder\";\nimport { BlockCanvas } from \"../BlockLayer/BlockCanvas\";\nimport { BlockRenderer } from \"../BlockLayer/BlockRenderer\";\n\nimport type { ResolvedPlugin } from \"../../../plugin/registry\";\nimport type { BlockRef } from \"../../../plugin/types\";\nimport type { Block } from \"../../../types/block\";\nimport type { ActionContext, BindingContext } from \"../../../types/context\";\nimport type { Value } from \"../../../types/value\";\nimport type { BlockRectPx } from \"../types\";\n\n/**\n * `EditingBlock` コンポーネントへの props。\n */\nexport interface EditingBlockProps {\n\t/** ブロックの ID。 */\n\tid: string;\n\n\t/** 解決済みプラグイン。 */\n\tresolvedPlugin: ResolvedPlugin;\n\n\t/** プロパティマップ。 */\n\tprops: Record<string, Value>;\n\n\t/** 編集中のブロックの値。 */\n\tvalue: Value;\n\n\t/** 値変更時のコールバック。 */\n\tonChange: (value: Value) => void;\n\n\t/** ブロックの位置とサイズ(px)。 */\n\tblockRectPx: BlockRectPx;\n\n\t/** ブロックデータ(スタイル参照用)。 */\n\tblock: Block;\n\n\t/** z-index(既定値: `Z_INDEX.EDIT_BLOCK`)。 */\n\tzIndex?: number;\n\n\t/** 値バインディング用コンテキスト。 */\n\tbindingContext?: BindingContext;\n\n\t/** アクション実行用コンテキスト。 */\n\tactionContext?: ActionContext;\n}\n\n// forwardRef でラップする前の内部実装関数\nconst EditingBlockInner = (\n\t{\n\t\tid,\n\t\tresolvedPlugin,\n\t\tprops,\n\t\tvalue,\n\t\tonChange,\n\t\tblockRectPx,\n\t\tblock,\n\t\tzIndex = Z_INDEX.EDIT_BLOCK,\n\t\tbindingContext,\n\t\tactionContext,\n\t}: EditingBlockProps,\n\tref: ForwardedRef<BlockRef>,\n) => {\n\tconst innerRef = useRef<BlockRef>(null);\n\n\tuseImperativeHandle(\n\t\tref,\n\t\t() => ({ focus: () => innerRef.current?.focus() }),\n\t\t[],\n\t);\n\n\tconst sizePx = { width: blockRectPx.width, height: blockRectPx.height };\n\n\treturn (\n\t\t<div\n\t\t\tstyle={{\n\t\t\t\tposition: \"absolute\",\n\t\t\t\tleft: `${blockRectPx.left}px`,\n\t\t\t\ttop: `${blockRectPx.top}px`,\n\t\t\t\twidth: `${sizePx.width}px`,\n\t\t\t\theight: `${sizePx.height}px`,\n\t\t\t\tzIndex,\n\t\t\t\tpointerEvents: \"auto\",\n\t\t\t}}\n\t\t\tdata-testid=\"editing-block\"\n\t\t>\n\t\t\t<BlockCanvas\n\t\t\t\tblockSizePx={sizePx}\n\t\t\t\tblockZIndex={0}\n\t\t\t\tsubZIndex={BLOCK_SUB_INDEX.BG}\n\t\t\t\tbackgroundColor={block.style?.backgroundColor}\n\t\t\t/>\n\t\t\t<BlockRenderer\n\t\t\t\tref={innerRef}\n\t\t\t\tid={id}\n\t\t\t\tresolvedPlugin={resolvedPlugin}\n\t\t\t\tprops={props}\n\t\t\t\tvalue={value}\n\t\t\t\tonChange={onChange}\n\t\t\t\treadOnly={false}\n\t\t\t\tmode={NoteMode.EDIT}\n\t\t\t\tblockSizePx={sizePx}\n\t\t\t\tblockZIndex={0}\n\t\t\t\tsubZIndex={BLOCK_SUB_INDEX.CONTENT}\n\t\t\t\tbindingContext={bindingContext}\n\t\t\t\tactionContext={actionContext}\n\t\t\t/>\n\t\t\t<BlockBorder\n\t\t\t\tblockSizePx={sizePx}\n\t\t\t\tborderStyle={block.style?.border}\n\t\t\t\tblockZIndex={0}\n\t\t\t\tsubZIndex={BLOCK_SUB_INDEX.BORDER}\n\t\t\t\tdpi={DEFAULT_DPI}\n\t\t\t/>\n\t\t</div>\n\t);\n};\n\n/**\n * 編集中ブロックの Renderer を InteractionLayer 上に表示するコンポーネント。\n *\n * `ref` で {@link BlockRef} を取得できます。\n */\nexport const EditingBlock = memo(forwardRef(EditingBlockInner));\nEditingBlock.displayName = \"EditingBlock\";\n","import { type CSSProperties, memo } from \"react\";\n\nimport { LineType } from \"../../../types/line\";\nimport { DEFAULT_DPI } from \"../../../utils/convert\";\nimport { Z_INDEX } from \"../../../utils/zIndex\";\nimport { BlockBorder } from \"../BlockLayer/BlockBorder\";\nimport { ResizeHandle } from \"./types\";\n\nimport type { Block } from \"../../../types/block\";\nimport type { BorderStyle } from \"../../../types/line\";\nimport type { BlockRectPx } from \"../types\";\n\n// 選択枠線の各辺スタイル(青半透明の実線 4px)\nconst SELECTION_LINE = {\n\tcolor: \"#3b82f688\",\n\twidth: { value: 4, unit: \"px\" as const },\n\ttype: LineType.SOLID,\n};\n\n/**\n * 選択中ブロックに重ねる枠線スタイル(青半透明の実線 4px)。\n */\nexport const SELECTION_STYLE: BorderStyle = {\n\ttop: SELECTION_LINE,\n\tright: SELECTION_LINE,\n\tbottom: SELECTION_LINE,\n\tleft: SELECTION_LINE,\n};\n\n// リサイズハンドルのサイズ(px)\nconst HANDLE_SIZE = 12;\n// ハンドルを枠線に半分かかるようにするオフセット\nconst HANDLE_OFFSET = HANDLE_SIZE / 2;\n\n// 8 方向リサイズハンドルの位置・カーソル定義\nconst HANDLES = [\n\t{ id: ResizeHandle.NW, cursor: \"nwse-resize\", x: 0, y: 0 },\n\t{ id: ResizeHandle.N, cursor: \"ns-resize\", x: 50, y: 0 },\n\t{ id: ResizeHandle.NE, cursor: \"nesw-resize\", x: 100, y: 0 },\n\t{ id: ResizeHandle.W, cursor: \"ew-resize\", x: 0, y: 50 },\n\t{ id: ResizeHandle.E, cursor: \"ew-resize\", x: 100, y: 50 },\n\t{ id: ResizeHandle.SW, cursor: \"nesw-resize\", x: 0, y: 100 },\n\t{ id: ResizeHandle.S, cursor: \"ns-resize\", x: 50, y: 100 },\n\t{ id: ResizeHandle.SE, cursor: \"nwse-resize\", x: 100, y: 100 },\n] as const;\n\n/**\n * `InteractionBlock` コンポーネントへの props。\n */\nexport interface InteractionBlockProps {\n\t/** 対象ブロックデータ。 */\n\tblock: Block;\n\n\t/** ブロックの位置とサイズ(px)。 */\n\trect: BlockRectPx;\n\n\t/** `true` の場合はリサイズハンドル(8方向)を表示する(既定値: `false`)。 */\n\tshowHandles?: boolean;\n\n\t/** リサイズ開始時のコールバック。 */\n\tonResizeStart?: (e: React.PointerEvent, handle: ResizeHandle) => void;\n\n\t/** 現在操作中のハンドル方向。ハイライト表示に使用。 */\n\tactiveHandle?: ResizeHandle | null;\n\n\t/** 選択枠線のスタイル(既定値: `SELECTION_STYLE`)。 */\n\tselectionStyle?: BorderStyle;\n\n\t/** 選択枠線の z-index(既定値: `Z_INDEX.BLOCK_SELECT_BORDER`)。 */\n\tselectBorderZIndex?: number;\n\n\t/** リサイズハンドルの z-index(既定値: `Z_INDEX.BLOCK_HANDLES`)。 */\n\tblockHandlesZIndex?: number;\n}\n\n/**\n * ブロックの選択枠線とリサイズハンドル(8方向)を描画する単一コンポーネント。\n */\nexport const InteractionBlock = memo(\n\t({\n\t\tblock,\n\t\trect,\n\t\tshowHandles = false,\n\t\tonResizeStart,\n\t\tactiveHandle,\n\t\tselectionStyle = SELECTION_STYLE,\n\t\tselectBorderZIndex = Z_INDEX.BLOCK_SELECT_BORDER,\n\t\tblockHandlesZIndex = Z_INDEX.BLOCK_HANDLES,\n\t}: InteractionBlockProps) => {\n\t\tconst containerStyle: CSSProperties = {\n\t\t\tposition: \"absolute\",\n\t\t\tleft: `${rect.left}px`,\n\t\t\ttop: `${rect.top}px`,\n\t\t\twidth: `${rect.width}px`,\n\t\t\theight: `${rect.height}px`,\n\t\t\tpointerEvents: \"none\",\n\t\t};\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tstyle={containerStyle}\n\t\t\t\tdata-testid=\"interaction-block\"\n\t\t\t\tdata-block-id={block.id}\n\t\t\t>\n\t\t\t\t{/* 選択枠 */}\n\t\t\t\t<BlockBorder\n\t\t\t\t\tblockSizePx={{ width: rect.width, height: rect.height }}\n\t\t\t\t\tborderStyle={selectionStyle}\n\t\t\t\t\tblockZIndex={selectBorderZIndex}\n\t\t\t\t\tsubZIndex={0}\n\t\t\t\t\tdpi={DEFAULT_DPI}\n\t\t\t\t/>\n\n\t\t\t\t{/* リサイズハンドル(8方向) */}\n\t\t\t\t{showHandles &&\n\t\t\t\t\tonResizeStart &&\n\t\t\t\t\tHANDLES.map(({ id, cursor, x, y }) => {\n\t\t\t\t\t\tconst left =\n\t\t\t\t\t\t\tx === 50\n\t\t\t\t\t\t\t\t? `calc(50% - ${HANDLE_OFFSET}px)`\n\t\t\t\t\t\t\t\t: x === 100\n\t\t\t\t\t\t\t\t\t? `calc(100% - ${HANDLE_OFFSET}px)`\n\t\t\t\t\t\t\t\t\t: `-${HANDLE_OFFSET}px`;\n\t\t\t\t\t\tconst top =\n\t\t\t\t\t\t\ty === 50\n\t\t\t\t\t\t\t\t? `calc(50% - ${HANDLE_OFFSET}px)`\n\t\t\t\t\t\t\t\t: y === 100\n\t\t\t\t\t\t\t\t\t? `calc(100% - ${HANDLE_OFFSET}px)`\n\t\t\t\t\t\t\t\t\t: `-${HANDLE_OFFSET}px`;\n\n\t\t\t\t\t\tconst isActive = activeHandle === id;\n\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tkey={id}\n\t\t\t\t\t\t\t\tonPointerDown={(e) => {\n\t\t\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t\t\t\tonResizeStart(e, id);\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\t\t\t\t\tleft,\n\t\t\t\t\t\t\t\t\ttop,\n\t\t\t\t\t\t\t\t\twidth: `${HANDLE_SIZE}px`,\n\t\t\t\t\t\t\t\t\theight: `${HANDLE_SIZE}px`,\n\t\t\t\t\t\t\t\t\tbackgroundColor: isActive ? \"#3b82f6\" : \"#ffffff\",\n\t\t\t\t\t\t\t\t\tborder: \"1px solid #3b82f6\",\n\t\t\t\t\t\t\t\t\tborderRadius: \"50%\",\n\t\t\t\t\t\t\t\t\tcursor,\n\t\t\t\t\t\t\t\t\tzIndex: blockHandlesZIndex,\n\t\t\t\t\t\t\t\t\tpointerEvents: \"auto\",\n\t\t\t\t\t\t\t\t\tboxSizing: \"border-box\",\n\t\t\t\t\t\t\t\t\ttransform: isActive ? \"scale(1.2)\" : undefined,\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tdata-testid={`resize-handle-${id}`}\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</div>\n\t\t);\n\t},\n);\n\nInteractionBlock.displayName = \"InteractionBlock\";\n","import { memo } from \"react\";\n\nimport { InteractionBlock, SELECTION_STYLE } from \"./InteractionBlock\";\nimport { DragType } from \"./types\";\n\nimport type { Block } from \"../../../types/block\";\nimport type { BorderStyle } from \"../../../types/line\";\nimport type { BlockRectPx } from \"../types\";\nimport type { DraggingState, ResizeHandle } from \"./types\";\n\n/**\n * `SelectionLayer` コンポーネントへの props。\n */\nexport interface SelectionLayerProps {\n\t/** 全ブロックデータ一覧。 */\n\tblocks: Block[];\n\n\t/** 選択されているブロック ID 一覧。 */\n\tselectedBlockIds: string[];\n\n\t/** ドラッグ中かどうか。移動・挿入中は選択枠線を非表示にする。 */\n\tisDragging: boolean;\n\n\t/** 現在のドラッグ状態。リサイズ履歴の参照に使用。 */\n\tdraggingState?: DraggingState;\n\n\t/** ブロックからキャンバス上の矩形座標(px)を返す関数。 */\n\tgetBlockRectPx: (block: Block) => BlockRectPx;\n\n\t/** リサイズ開始時のコールバック。 */\n\tonResizeStart: (\n\t\te: React.PointerEvent,\n\t\thandle: ResizeHandle,\n\t\tblockId: string,\n\t) => void;\n\n\t/** 選択枠線のスタイル(既定値: `SELECTION_STYLE`)。 */\n\tselectionStyle?: BorderStyle;\n\n\t/** 選択枠線の z-index。 */\n\tselectBorderZIndex?: number;\n\n\t/** リサイズハンドルの z-index。 */\n\tblockHandlesZIndex?: number;\n}\n\n/**\n * 選択中ブロックに `InteractionBlock`(選択枠線 + リサイズハンドル)を重ねて描画するレイヤー。\n *\n * 移動中・挿入中は選択枠線を非表示にします。\n */\nexport const SelectionLayer = memo(\n\t({\n\t\tblocks,\n\t\tselectedBlockIds,\n\t\tisDragging,\n\t\tdraggingState,\n\t\tgetBlockRectPx,\n\t\tonResizeStart,\n\t\tselectionStyle = SELECTION_STYLE,\n\t\tselectBorderZIndex,\n\t\tblockHandlesZIndex,\n\t}: SelectionLayerProps) => {\n\t\t// 移動中・挿入中は枠を非表示(リサイズ中は表示を維持)\n\t\tconst isMoving = isDragging && draggingState?.type !== DragType.RESIZE;\n\t\tif (isMoving) return null;\n\n\t\tconst uniqueIds = Array.from(new Set(selectedBlockIds));\n\n\t\treturn (\n\t\t\t<div style={{ position: \"absolute\", inset: 0, pointerEvents: \"none\" }}>\n\t\t\t\t{uniqueIds.map((id) => {\n\t\t\t\t\tconst block = blocks.find((b) => b.id === id);\n\t\t\t\t\tif (!block) return null;\n\n\t\t\t\t\tconst isResizing =\n\t\t\t\t\t\tdraggingState?.type === DragType.RESIZE &&\n\t\t\t\t\t\tdraggingState.blockIds.includes(id);\n\t\t\t\t\tconst activeHandle = isResizing ? draggingState?.handle : null;\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<InteractionBlock\n\t\t\t\t\t\t\tkey={block.id}\n\t\t\t\t\t\t\tblock={block}\n\t\t\t\t\t\t\trect={getBlockRectPx(block)}\n\t\t\t\t\t\t\tshowHandles={true}\n\t\t\t\t\t\t\tonResizeStart={(e, handle) => onResizeStart(e, handle, id)}\n\t\t\t\t\t\t\tactiveHandle={activeHandle ?? null}\n\t\t\t\t\t\t\tselectionStyle={selectionStyle}\n\t\t\t\t\t\t\tselectBorderZIndex={selectBorderZIndex}\n\t\t\t\t\t\t\tblockHandlesZIndex={blockHandlesZIndex}\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);\n\t},\n);\n\nSelectionLayer.displayName = \"SelectionLayer\";\n","/**\n * ブロックの位置をグリッド範囲内にクランプする。\n *\n * - x: 0 〜 (gridCols - w)\n * - y: 0 〜 (gridRows - h)\n */\nexport function clampBlockToGrid(\n\tposition: { x: number; y: number },\n\tsize: { w: number; h: number },\n\tgridCols: number,\n\tgridRows: number,\n): { x: number; y: number } {\n\tconst maxX = gridCols - size.w;\n\tconst maxY = gridRows - size.h;\n\treturn {\n\t\tx: Math.max(0, Math.min(position.x, maxX)),\n\t\ty: Math.max(0, Math.min(position.y, maxY)),\n\t};\n}\n","import type { BlockRect } from \"../../../../types/block\";\n\n/**\n * 複製・貼り付け先の位置を計算する。\n *\n * - グリッド右端・下端でなければ +1(右・下)方向へオフセット\n * - 右端・下端に達している場合は -1(左・上)方向へオフセット\n */\nexport function calcDuplicatePosition(\n\tlayout: BlockRect,\n\tgridCols: number,\n\tgridRows: number,\n): { x: number; y: number } {\n\tconst newX =\n\t\tlayout.x + layout.w < gridCols ? layout.x + 1 : Math.max(0, layout.x - 1);\n\tconst newY =\n\t\tlayout.y + layout.h < gridRows ? layout.y + 1 : Math.max(0, layout.y - 1);\n\treturn { x: newX, y: newY };\n}\n","import type { Block } from \"../../../../types/block\";\nimport type { BlockRectPx } from \"../../types\";\n\n/**\n * 指定座標にあるブロックIDを返す(キャンバス相対座標)。\n *\n * 描画順(Z順)を考慮し、配列後方(手前のブロック)から走査する。\n */\nexport function findBlockAtPoint(\n\tpoint: { x: number; y: number },\n\tblocks: Block[],\n\tgetBlockRectPx: (block: Block) => BlockRectPx,\n): string | null {\n\tconst { x, y } = point;\n\tfor (let i = blocks.length - 1; i >= 0; i--) {\n\t\tconst block = blocks[i];\n\t\tif (!block) continue;\n\t\tconst rect = getBlockRectPx(block);\n\t\tif (\n\t\t\tx >= rect.left &&\n\t\t\tx <= rect.left + rect.width &&\n\t\t\ty >= rect.top &&\n\t\t\ty <= rect.top + rect.height\n\t\t) {\n\t\t\treturn block.id;\n\t\t}\n\t}\n\treturn null;\n}\n","import { memo, useCallback, useEffect, useRef } from \"react\";\n\nimport {\n\tarrowMoveKey,\n\tinitValueKey,\n\tkeyboardResizeKey,\n} from \"../../../contexts/history/mergeKeys\";\nimport { createBlockId } from \"../../../utils/block\";\nimport { Z_INDEX } from \"../../../utils/zIndex\";\nimport { resolveBlockProps } from \"../BlockLayer/utils/resolveBlockProps\";\nimport { DragLayer } from \"./DragLayer\";\nimport { EditingBlock } from \"./EditingBlock\";\nimport { SelectionLayer } from \"./SelectionLayer\";\nimport {\n\tDragType,\n\tgetInteractionMode,\n\tInteractionMode,\n\tResizeHandle,\n} from \"./types\";\nimport { calculateResizedLayout } from \"./utils/calcResize\";\nimport { clampBlockToGrid } from \"./utils/clampBlock\";\nimport { clampMultipleBlocks } from \"./utils/clampMultipleBlocks\";\nimport { createBlock } from \"./utils/createBlock\";\nimport { calcDuplicatePosition } from \"./utils/duplicateOffset\";\nimport { findBlockAtPoint } from \"./utils/hitTest\";\n\nimport type { PluginRegistry } from \"../../../plugin/registry\";\nimport type { BlockRef } from \"../../../plugin/types\";\nimport type { Block } from \"../../../types/block\";\nimport type { OnSelectionChange } from \"../../../types/callbacks\";\nimport type { ActionContext, BindingContext } from \"../../../types/context\";\nimport type { BorderStyle } from \"../../../types/line\";\nimport type { BlockDefaults, Page } from \"../../../types/schema\";\nimport type { BlockRectPx } from \"../types\";\nimport type { InteractionState } from \"./types\";\n\n/**\n * `InteractionLayer` コンポーネントへの props。\n */\nexport interface InteractionLayerProps {\n\t/** 描画対象のページデータ。 */\n\tpage: Page;\n\n\t/** プラグインレジストリ。 */\n\tpluginRegistry: PluginRegistry;\n\n\t/** グリッドの列数・行数。 */\n\tgridLength: { cols: number; rows: number };\n\n\t/** ブロックのデフォルト値設定。 */\n\tblockDefaults?: BlockDefaults;\n\n\t/** ブロックからキャンバス上の矩形座標(px)を返す関数。 */\n\tgetBlockRectPx: (block: Block) => BlockRectPx;\n\n\t/** x 座標(px)からグリッド列インデックスを返す関数。 */\n\tgetColIndex: (px: number) => number;\n\n\t/** y 座標(px)からグリッド行インデックスを返す関数。 */\n\tgetRowIndex: (px: number) => number;\n\n\t/** インタラクション状態(controlled)。 */\n\tstate: InteractionState;\n\n\t/** 状態変更時のコールバック。 */\n\tonStateChange: (state: InteractionState) => void;\n\n\t/** 選択中のブロック ID 一覧(controlled)。 */\n\tselectedBlockIds: string[];\n\n\t/** 選択変更時のコールバック。 */\n\tonSelectionChange: OnSelectionChange;\n\n\t/** ページ変更(ブロック追加・削除・移動など)時のコールバック。 */\n\tonPageChange: (\n\t\tpage: Page,\n\t\toptions?: { mergeKey?: string; noTimeWindow?: boolean },\n\t) => void;\n\n\t/** アクション実行用コンテキスト(undo/redo など)。 */\n\tactionContext: ActionContext;\n\n\t/** 値バインディング用コンテキスト。 */\n\tbindingContext?: BindingContext;\n\n\t/** キャンバスのスケール倍率(既定値: `1.0`)。 */\n\tscale?: number;\n\n\t/** ルート要素の CSS クラス名。 */\n\tclassName?: string;\n\n\t/** 選択枠線のスタイル。 */\n\tselectionStyle?: BorderStyle;\n}\n\n/**\n * ブロックの移動・リサイズ・挿入・編集のインタラクションを集約した全体制御レイヤーコンポーネント。\n *\n * @remarks\n * **Canvas** — {@link Note} 実装を担う低レベルインタラクションレイヤー。\n *\n * 通常は {@link Note} を使用する。\n */\nexport const InteractionLayer = memo(\n\t({\n\t\tpage,\n\t\tpluginRegistry,\n\t\tgridLength,\n\t\tblockDefaults,\n\t\tgetBlockRectPx,\n\t\tgetColIndex,\n\t\tgetRowIndex,\n\t\tstate,\n\t\tonStateChange,\n\t\tselectedBlockIds,\n\t\tonSelectionChange,\n\t\tonPageChange,\n\t\tactionContext,\n\t\tbindingContext,\n\t\tscale = 1.0,\n\t\tclassName = \"\",\n\t\tselectionStyle,\n\t}: InteractionLayerProps) => {\n\t\tconst blocks = page.blocks;\n\t\tconst layerRef = useRef<HTMLDivElement>(null);\n\t\tconst editingBlockRef = useRef<BlockRef>(null);\n\t\tconst focusTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n\t\t// アンマウント時に残存フォーカスタイマーをキャンセル\n\t\tuseEffect(() => {\n\t\t\treturn () => {\n\t\t\t\tif (focusTimerRef.current !== null) {\n\t\t\t\t\tclearTimeout(focusTimerRef.current);\n\t\t\t\t}\n\t\t\t};\n\t\t}, []);\n\n\t\tconst mode = getInteractionMode(state);\n\n\t\t// 矢印キー移動セッション管理(方向・ブロック選択が変わるかキーアップで新セッション)\n\t\tconst arrowSessionRef = useRef<{\n\t\t\tdirection: string;\n\t\t\tblockIds: string;\n\t\t\tid: number;\n\t\t} | null>(null);\n\t\tconst arrowSessionCounterRef = useRef(0);\n\n\t\t// Shift+矢印キーリサイズセッション管理(移動セッションと同じ切り替ルール)\n\t\tconst resizeSessionRef = useRef<{\n\t\t\tdirection: string;\n\t\t\tblockIds: string;\n\t\t\tid: number;\n\t\t} | null>(null);\n\t\tconst resizeSessionCounterRef = useRef(0);\n\n\t\t// INSERT モード時: カーソルがレイヤー外でリリースされたらキャンセル\n\t\tconst stateRef = useRef(state);\n\t\tstateRef.current = state;\n\t\tconst onStateChangeRef = useRef(onStateChange);\n\t\tonStateChangeRef.current = onStateChange;\n\t\tuseEffect(() => {\n\t\t\tif (mode !== InteractionMode.INSERT) return;\n\t\t\tconst handleWindowPointerUp = (e: PointerEvent) => {\n\t\t\t\tconst layer = layerRef.current;\n\t\t\t\tif (layer && (e.target === layer || layer.contains(e.target as Node))) {\n\t\t\t\t\t// レイヤー内リリース → React の onPointerUp ハンドラに任せる\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// レイヤー外リリース → INSERT モードをキャンセル\n\t\t\t\tonStateChangeRef.current({ ...stateRef.current, dragging: undefined });\n\t\t\t};\n\t\t\twindow.addEventListener(\"pointerup\", handleWindowPointerUp);\n\t\t\treturn () =>\n\t\t\t\twindow.removeEventListener(\"pointerup\", handleWindowPointerUp);\n\t\t}, [mode]);\n\n\t\t// 編集モード時のフォーカス処理\n\t\tuseEffect(() => {\n\t\t\tif (mode === InteractionMode.EDITING && state.editingBlockId) {\n\t\t\t\tconst id = setTimeout(() => {\n\t\t\t\t\teditingBlockRef.current?.focus();\n\t\t\t\t}, 0);\n\t\t\t\treturn () => clearTimeout(id);\n\t\t\t}\n\t\t\treturn undefined;\n\t\t}, [mode, state.editingBlockId]);\n\n\t\t// 削除されたブロックIDを選択から除外\n\t\tuseEffect(() => {\n\t\t\tconst blockIds = new Set(blocks.map((b) => b.id));\n\t\t\tconst validIds = selectedBlockIds.filter((id) => blockIds.has(id));\n\t\t\tif (validIds.length !== selectedBlockIds.length) {\n\t\t\t\tonSelectionChange(validIds);\n\t\t\t}\n\t\t}, [blocks, selectedBlockIds, onSelectionChange]);\n\n\t\t// --- PointerDown ---\n\t\tconst handlePointerDown = useCallback(\n\t\t\t(e: React.PointerEvent) => {\n\t\t\t\tif (e.button !== 0) return;\n\n\t\t\t\tconst rect = layerRef.current?.getBoundingClientRect();\n\t\t\t\tif (!rect) return;\n\t\t\t\tconst sf = scale;\n\t\t\t\tconst px = {\n\t\t\t\t\tx: (e.clientX - rect.left) / sf,\n\t\t\t\t\ty: (e.clientY - rect.top) / sf,\n\t\t\t\t};\n\n\t\t\t\tconst targetId = findBlockAtPoint(px, blocks, getBlockRectPx);\n\n\t\t\t\t// 編集モード中\n\t\t\t\tif (mode === InteractionMode.EDITING) {\n\t\t\t\t\tif (targetId !== state.editingBlockId) {\n\t\t\t\t\t\tonStateChange({ ...state, editingBlockId: null });\n\t\t\t\t\t\tif (!targetId) onSelectionChange([]);\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst gridCol = getColIndex(px.x);\n\t\t\t\tconst gridRow = getRowIndex(px.y);\n\n\t\t\t\tif (targetId) {\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\tconst isSelected = selectedBlockIds.includes(targetId);\n\n\t\t\t\t\tif (isSelected && e.shiftKey) {\n\t\t\t\t\t\tonSelectionChange(selectedBlockIds.filter((id) => id !== targetId));\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t(e.currentTarget as Element).setPointerCapture(e.pointerId);\n\n\t\t\t\t\tif (isSelected) {\n\t\t\t\t\t\tonStateChange({\n\t\t\t\t\t\t\t...state,\n\t\t\t\t\t\t\tdragging: {\n\t\t\t\t\t\t\t\ttype: DragType.MOVE,\n\t\t\t\t\t\t\t\tblockIds: selectedBlockIds,\n\t\t\t\t\t\t\t\tstartGrid: { col: gridCol, row: gridRow },\n\t\t\t\t\t\t\t\tcurrentGrid: { col: gridCol, row: gridRow },\n\t\t\t\t\t\t\t\tisOutside: false,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (e.shiftKey) {\n\t\t\t\t\t\t\tonSelectionChange([...selectedBlockIds, targetId]);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tonSelectionChange([targetId]);\n\t\t\t\t\t\t\tonStateChange({\n\t\t\t\t\t\t\t\t...state,\n\t\t\t\t\t\t\t\tdragging: {\n\t\t\t\t\t\t\t\t\ttype: DragType.MOVE,\n\t\t\t\t\t\t\t\t\tblockIds: [targetId],\n\t\t\t\t\t\t\t\t\tstartGrid: { col: gridCol, row: gridRow },\n\t\t\t\t\t\t\t\t\tcurrentGrid: { col: gridCol, row: gridRow },\n\t\t\t\t\t\t\t\t\tisOutside: false,\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} else {\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\tonSelectionChange([]);\n\t\t\t\t}\n\t\t\t},\n\t\t\t[\n\t\t\t\tblocks,\n\t\t\t\tgetBlockRectPx,\n\t\t\t\tgetColIndex,\n\t\t\t\tgetRowIndex,\n\t\t\t\tmode,\n\t\t\t\tselectedBlockIds,\n\t\t\t\tonSelectionChange,\n\t\t\t\tonStateChange,\n\t\t\t\tscale,\n\t\t\t\tstate,\n\t\t\t],\n\t\t);\n\n\t\t// --- PointerMove ---\n\t\tconst handlePointerMove = useCallback(\n\t\t\t(e: React.PointerEvent) => {\n\t\t\t\tif (\n\t\t\t\t\tmode !== InteractionMode.PRESSING &&\n\t\t\t\t\tmode !== InteractionMode.DRAGGING &&\n\t\t\t\t\tmode !== InteractionMode.INSERT\n\t\t\t\t)\n\t\t\t\t\treturn;\n\t\t\t\tif (!state.dragging) return;\n\n\t\t\t\tconst rect = layerRef.current?.getBoundingClientRect();\n\t\t\t\tif (!rect) return;\n\t\t\t\tconst sf = scale;\n\t\t\t\tconst canvasW = rect.width / sf;\n\t\t\t\tconst canvasH = rect.height / sf;\n\t\t\t\tconst rawX = (e.clientX - rect.left) / sf;\n\t\t\t\tconst rawY = (e.clientY - rect.top) / sf;\n\n\t\t\t\tconst isOutside =\n\t\t\t\t\tstate.dragging.type !== DragType.RESIZE &&\n\t\t\t\t\t(rawX < 0 || rawX > canvasW || rawY < 0 || rawY > canvasH);\n\n\t\t\t\tconst clampedX = Math.max(0, Math.min(rawX, canvasW));\n\t\t\t\tconst clampedY = Math.max(0, Math.min(rawY, canvasH));\n\n\t\t\t\tlet currentCol = getColIndex(clampedX);\n\t\t\t\tlet currentRow = getRowIndex(clampedY);\n\n\t\t\t\t// リサイズ: 境界グリッドインデックスに補正\n\t\t\t\tif (state.dragging.type === DragType.RESIZE && state.dragging.handle) {\n\t\t\t\t\tconst h = state.dragging.handle;\n\t\t\t\t\tif (\n\t\t\t\t\t\th === ResizeHandle.E ||\n\t\t\t\t\t\th === ResizeHandle.NE ||\n\t\t\t\t\t\th === ResizeHandle.SE\n\t\t\t\t\t) {\n\t\t\t\t\t\tcurrentCol = getColIndex(clampedX) + 1;\n\t\t\t\t\t}\n\t\t\t\t\tif (\n\t\t\t\t\t\th === ResizeHandle.S ||\n\t\t\t\t\t\th === ResizeHandle.SE ||\n\t\t\t\t\t\th === ResizeHandle.SW\n\t\t\t\t\t) {\n\t\t\t\t\t\tcurrentRow = getRowIndex(clampedY) + 1;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tonStateChange({\n\t\t\t\t\t...state,\n\t\t\t\t\tdragging: {\n\t\t\t\t\t\t...state.dragging,\n\t\t\t\t\t\tcurrentGrid: { col: currentCol, row: currentRow },\n\t\t\t\t\t\tcurrentMousePx: { x: rawX, y: rawY },\n\t\t\t\t\t\tisOutside,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t},\n\t\t\t[mode, state, getColIndex, getRowIndex, onStateChange, scale],\n\t\t);\n\n\t\t// --- PointerUp ---\n\t\tconst handlePointerUp = useCallback(\n\t\t\t(e: React.PointerEvent) => {\n\t\t\t\tif (\n\t\t\t\t\t(mode === InteractionMode.DRAGGING ||\n\t\t\t\t\t\tmode === InteractionMode.INSERT) &&\n\t\t\t\t\tstate.dragging\n\t\t\t\t) {\n\t\t\t\t\t// キャンバス外 → 削除(MOVE のみ)\n\t\t\t\t\tif (state.dragging.isOutside) {\n\t\t\t\t\t\tif (state.dragging.type === DragType.MOVE) {\n\t\t\t\t\t\t\tconst deletedIds = new Set(state.dragging.blockIds);\n\t\t\t\t\t\t\tonPageChange({\n\t\t\t\t\t\t\t\t...page,\n\t\t\t\t\t\t\t\tblocks: blocks.filter((b) => !deletedIds.has(b.id)),\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tonSelectionChange([]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tonStateChange({ ...state, dragging: undefined });\n\t\t\t\t\t\t(e.currentTarget as Element).releasePointerCapture(e.pointerId);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst deltaCol =\n\t\t\t\t\t\tstate.dragging.currentGrid.col - state.dragging.startGrid.col;\n\t\t\t\t\tconst deltaRow =\n\t\t\t\t\t\tstate.dragging.currentGrid.row - state.dragging.startGrid.row;\n\n\t\t\t\t\t// 移動確定\n\t\t\t\t\tif (\n\t\t\t\t\t\tstate.dragging.type === DragType.MOVE &&\n\t\t\t\t\t\t(deltaCol !== 0 || deltaRow !== 0)\n\t\t\t\t\t) {\n\t\t\t\t\t\tconst dragTargets = state.dragging.blockIds\n\t\t\t\t\t\t\t.map((id) => blocks.find((b) => b.id === id))\n\t\t\t\t\t\t\t.filter(Boolean) as Block[];\n\n\t\t\t\t\t\tif (dragTargets.length > 0) {\n\t\t\t\t\t\t\tconst clampedPositions = clampMultipleBlocks(\n\t\t\t\t\t\t\t\tdragTargets,\n\t\t\t\t\t\t\t\tdeltaCol,\n\t\t\t\t\t\t\t\tdeltaRow,\n\t\t\t\t\t\t\t\tgridLength.cols,\n\t\t\t\t\t\t\t\tgridLength.rows,\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tonPageChange({\n\t\t\t\t\t\t\t\t...page,\n\t\t\t\t\t\t\t\tblocks: blocks.map((b) => {\n\t\t\t\t\t\t\t\t\tconst pos = clampedPositions.find((p) => p.blockId === b.id);\n\t\t\t\t\t\t\t\t\tif (!pos) return b;\n\t\t\t\t\t\t\t\t\treturn { ...b, layout: { ...b.layout, x: pos.x, y: pos.y } };\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\t// 挿入確定\n\t\t\t\t\telse if (state.dragging.type === DragType.INSERT) {\n\t\t\t\t\t\tconst { pluginKind, currentGrid, defaultSize } = state.dragging;\n\t\t\t\t\t\tif (pluginKind && defaultSize) {\n\t\t\t\t\t\t\tconst resolved = pluginRegistry[pluginKind];\n\t\t\t\t\t\t\tif (resolved) {\n\t\t\t\t\t\t\t\tconst { x, y } = clampBlockToGrid(\n\t\t\t\t\t\t\t\t\t{ x: currentGrid.col, y: currentGrid.row },\n\t\t\t\t\t\t\t\t\t{ w: defaultSize.w, h: defaultSize.h },\n\t\t\t\t\t\t\t\t\tgridLength.cols,\n\t\t\t\t\t\t\t\t\tgridLength.rows,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tconst newBlock: Block = {\n\t\t\t\t\t\t\t\t\t...createBlock(resolved, { x, y }),\n\t\t\t\t\t\t\t\t\tlayout: {\n\t\t\t\t\t\t\t\t\t\tx,\n\t\t\t\t\t\t\t\t\t\ty,\n\t\t\t\t\t\t\t\t\t\tw: defaultSize.w,\n\t\t\t\t\t\t\t\t\t\th: defaultSize.h,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\tonPageChange({ ...page, blocks: [...blocks, newBlock] });\n\t\t\t\t\t\t\t\tonSelectionChange([newBlock.id]);\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\t// リサイズ確定\n\t\t\t\t\telse if (state.dragging.type === DragType.RESIZE) {\n\t\t\t\t\t\tconst targetId = state.dragging.blockIds[0];\n\t\t\t\t\t\tconst block = blocks.find((b) => b.id === targetId);\n\t\t\t\t\t\tconst handle = state.dragging.handle;\n\n\t\t\t\t\t\tif (block && handle && (deltaCol !== 0 || deltaRow !== 0)) {\n\t\t\t\t\t\t\tconst newLayout = calculateResizedLayout({\n\t\t\t\t\t\t\t\tlayout: block.layout,\n\t\t\t\t\t\t\t\thandle,\n\t\t\t\t\t\t\t\tdeltaCol,\n\t\t\t\t\t\t\t\tdeltaRow,\n\t\t\t\t\t\t\t\tgridCols: gridLength.cols,\n\t\t\t\t\t\t\t\tgridRows: gridLength.rows,\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tnewLayout.x !== block.layout.x ||\n\t\t\t\t\t\t\t\tnewLayout.y !== block.layout.y ||\n\t\t\t\t\t\t\t\tnewLayout.w !== block.layout.w ||\n\t\t\t\t\t\t\t\tnewLayout.h !== block.layout.h\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tonPageChange({\n\t\t\t\t\t\t\t\t\t...page,\n\t\t\t\t\t\t\t\t\tblocks: blocks.map((b) =>\n\t\t\t\t\t\t\t\t\t\tb.id === block.id ? { ...b, layout: newLayout } : b,\n\t\t\t\t\t\t\t\t\t),\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\n\t\t\t\t\tonStateChange({ ...state, dragging: undefined });\n\t\t\t\t} else if (mode === InteractionMode.PRESSING && state.dragging) {\n\t\t\t\t\tif (\n\t\t\t\t\t\tstate.dragging.isOutside &&\n\t\t\t\t\t\tstate.dragging.type === DragType.MOVE\n\t\t\t\t\t) {\n\t\t\t\t\t\tconst deletedIds = new Set(state.dragging.blockIds);\n\t\t\t\t\t\tonPageChange({\n\t\t\t\t\t\t\t...page,\n\t\t\t\t\t\t\tblocks: blocks.filter((b) => !deletedIds.has(b.id)),\n\t\t\t\t\t\t});\n\t\t\t\t\t\tonSelectionChange([]);\n\t\t\t\t\t}\n\t\t\t\t\tonStateChange({ ...state, dragging: undefined });\n\t\t\t\t}\n\n\t\t\t\t(e.currentTarget as Element).releasePointerCapture(e.pointerId);\n\t\t\t},\n\t\t\t[\n\t\t\t\tmode,\n\t\t\t\tstate,\n\t\t\t\tblocks,\n\t\t\t\tpage,\n\t\t\t\tgridLength,\n\t\t\t\tpluginRegistry,\n\t\t\t\tonPageChange,\n\t\t\t\tonStateChange,\n\t\t\t\tonSelectionChange,\n\t\t\t],\n\t\t);\n\n\t\t// --- DoubleClick (編集開始) ---\n\t\tconst handleDoubleClick = useCallback(\n\t\t\t(e: React.MouseEvent) => {\n\t\t\t\tconst rect = layerRef.current?.getBoundingClientRect();\n\t\t\t\tif (!rect) return;\n\t\t\t\tconst sf = scale;\n\t\t\t\tconst px = {\n\t\t\t\t\tx: (e.clientX - rect.left) / sf,\n\t\t\t\t\ty: (e.clientY - rect.top) / sf,\n\t\t\t\t};\n\t\t\t\tconst targetId = findBlockAtPoint(px, blocks, getBlockRectPx);\n\t\t\t\tif (targetId) {\n\t\t\t\t\tif (!selectedBlockIds.includes(targetId)) {\n\t\t\t\t\t\tonSelectionChange([targetId]);\n\t\t\t\t\t}\n\t\t\t\t\tonStateChange({ ...state, editingBlockId: targetId });\n\t\t\t\t}\n\t\t\t},\n\t\t\t[\n\t\t\t\tblocks,\n\t\t\t\tgetBlockRectPx,\n\t\t\t\tonSelectionChange,\n\t\t\t\tonStateChange,\n\t\t\t\tscale,\n\t\t\t\tselectedBlockIds,\n\t\t\t\tstate,\n\t\t\t],\n\t\t);\n\n\t\t// --- PointerLeave ---\n\t\tconst handlePointerLeave = useCallback(\n\t\t\t(e: React.PointerEvent) => {\n\t\t\t\tif (\n\t\t\t\t\t(mode === InteractionMode.PRESSING ||\n\t\t\t\t\t\tmode === InteractionMode.DRAGGING ||\n\t\t\t\t\t\tmode === InteractionMode.INSERT) &&\n\t\t\t\t\tstate.dragging\n\t\t\t\t) {\n\t\t\t\t\tconst rect = layerRef.current?.getBoundingClientRect();\n\t\t\t\t\tif (!rect) return;\n\t\t\t\t\tconst sf = scale;\n\t\t\t\t\tconst rawX = (e.clientX - rect.left) / sf;\n\t\t\t\t\tconst rawY = (e.clientY - rect.top) / sf;\n\t\t\t\t\tconst canvasW = rect.width / sf;\n\t\t\t\t\tconst canvasH = rect.height / sf;\n\t\t\t\t\tconst clampedX = Math.max(0, Math.min(rawX, canvasW));\n\t\t\t\t\tconst clampedY = Math.max(0, Math.min(rawY, canvasH));\n\n\t\t\t\t\tonStateChange({\n\t\t\t\t\t\t...state,\n\t\t\t\t\t\tdragging: {\n\t\t\t\t\t\t\t...state.dragging,\n\t\t\t\t\t\t\tcurrentGrid: {\n\t\t\t\t\t\t\t\tcol: getColIndex(clampedX),\n\t\t\t\t\t\t\t\trow: getRowIndex(clampedY),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tcurrentMousePx: { x: rawX, y: rawY },\n\t\t\t\t\t\t\tisOutside: true,\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\t[mode, state, scale, getColIndex, getRowIndex, onStateChange],\n\t\t);\n\n\t\t// --- KeyDown ---\n\t\tconst handleKeyDown = useCallback(\n\t\t\t(e: React.KeyboardEvent) => {\n\t\t\t\tconst isEditing = mode === InteractionMode.EDITING;\n\n\t\t\t\t// Escape\n\t\t\t\tif (e.key === \"Escape\") {\n\t\t\t\t\tif (isEditing) {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\tonStateChange({ ...state, editingBlockId: null });\n\t\t\t\t\t\tfocusTimerRef.current = setTimeout(\n\t\t\t\t\t\t\t() => layerRef.current?.focus(),\n\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t);\n\t\t\t\t\t} else if (selectedBlockIds.length > 0) {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\tonSelectionChange([]);\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (isEditing) return;\n\n\t\t\t\t// Ctrl+Z: Undo\n\t\t\t\tif (\n\t\t\t\t\te.key.toLowerCase() === \"z\" &&\n\t\t\t\t\t(e.ctrlKey || e.metaKey) &&\n\t\t\t\t\t!e.shiftKey\n\t\t\t\t) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tactionContext?.execute(\"undo\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Ctrl+Y / Ctrl+Shift+Z: Redo\n\t\t\t\tif (\n\t\t\t\t\t(e.key.toLowerCase() === \"y\" && (e.ctrlKey || e.metaKey)) ||\n\t\t\t\t\t(e.key.toLowerCase() === \"z\" &&\n\t\t\t\t\t\t(e.ctrlKey || e.metaKey) &&\n\t\t\t\t\t\te.shiftKey)\n\t\t\t\t) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tactionContext?.execute(\"redo\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Ctrl+C: コピー\n\t\t\t\tif (\n\t\t\t\t\te.key === \"c\" &&\n\t\t\t\t\t(e.ctrlKey || e.metaKey) &&\n\t\t\t\t\tselectedBlockIds.length > 0\n\t\t\t\t) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tactionContext.execute(\"copy\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Ctrl+X: カット(コピー → 削除)\n\t\t\t\tif (\n\t\t\t\t\te.key === \"x\" &&\n\t\t\t\t\t(e.ctrlKey || e.metaKey) &&\n\t\t\t\t\tselectedBlockIds.length > 0\n\t\t\t\t) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tactionContext.execute(\"copy\");\n\t\t\t\t\tconst deletedIds = new Set(selectedBlockIds);\n\t\t\t\t\tonPageChange({\n\t\t\t\t\t\t...page,\n\t\t\t\t\t\tblocks: blocks.filter((b) => !deletedIds.has(b.id)),\n\t\t\t\t\t});\n\t\t\t\t\tonSelectionChange([]);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Ctrl+V: ペースト\n\t\t\t\tif (e.key === \"v\" && (e.ctrlKey || e.metaKey)) {\n\t\t\t\t\tif (actionContext.isEnabled(\"paste\")) {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\tactionContext.execute(\"paste\");\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Ctrl+D: 複製\n\t\t\t\tif (\n\t\t\t\t\te.key === \"d\" &&\n\t\t\t\t\t(e.ctrlKey || e.metaKey) &&\n\t\t\t\t\tselectedBlockIds.length > 0\n\t\t\t\t) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tconst selected = blocks.filter((b) =>\n\t\t\t\t\t\tselectedBlockIds.includes(b.id),\n\t\t\t\t\t);\n\t\t\t\t\tconst newBlocks = selected.map((b) => {\n\t\t\t\t\t\tconst { x, y } = calcDuplicatePosition(\n\t\t\t\t\t\t\tb.layout,\n\t\t\t\t\t\t\tgridLength.cols,\n\t\t\t\t\t\t\tgridLength.rows,\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t...b,\n\t\t\t\t\t\t\tid: createBlockId(b.kind),\n\t\t\t\t\t\t\tlayout: { ...b.layout, x, y },\n\t\t\t\t\t\t};\n\t\t\t\t\t});\n\t\t\t\t\tonPageChange({ ...page, blocks: [...blocks, ...newBlocks] });\n\t\t\t\t\tonSelectionChange(newBlocks.map((b) => b.id));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Delete / Backspace: 削除\n\t\t\t\tif (\n\t\t\t\t\t(e.key === \"Delete\" || e.key === \"Backspace\") &&\n\t\t\t\t\tselectedBlockIds.length > 0\n\t\t\t\t) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tconst deletedIds = new Set(selectedBlockIds);\n\t\t\t\t\tonPageChange({\n\t\t\t\t\t\t...page,\n\t\t\t\t\t\tblocks: blocks.filter((b) => !deletedIds.has(b.id)),\n\t\t\t\t\t});\n\t\t\t\t\tonSelectionChange([]);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Ctrl+A: 全選択\n\t\t\t\tif (e.key === \"a\" && (e.ctrlKey || e.metaKey)) {\n\t\t\t\t\tif (blocks.length === 0) return;\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tonSelectionChange(blocks.map((b) => b.id));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Tab: ブロック間巡回\n\t\t\t\tif (e.key === \"Tab\") {\n\t\t\t\t\tif (blocks.length === 0) return;\n\t\t\t\t\tconst sorted = [...blocks].sort((a, b) =>\n\t\t\t\t\t\ta.layout.y !== b.layout.y\n\t\t\t\t\t\t\t? a.layout.y - b.layout.y\n\t\t\t\t\t\t\t: a.layout.x - b.layout.x,\n\t\t\t\t\t);\n\t\t\t\t\tconst selectedId =\n\t\t\t\t\t\tselectedBlockIds.length === 1 ? selectedBlockIds[0] : null;\n\t\t\t\t\tconst curIdx =\n\t\t\t\t\t\tselectedId !== null\n\t\t\t\t\t\t\t? sorted.findIndex((b) => b.id === selectedId)\n\t\t\t\t\t\t\t: -1;\n\n\t\t\t\t\tif (e.shiftKey) {\n\t\t\t\t\t\tif (curIdx <= 0) {\n\t\t\t\t\t\t\tonSelectionChange([]);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst prev = sorted[curIdx - 1];\n\t\t\t\t\t\tif (!prev) return;\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\tonSelectionChange([prev.id]);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (curIdx === -1) {\n\t\t\t\t\t\t\tconst first = sorted[0];\n\t\t\t\t\t\t\tif (!first) return;\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\tonSelectionChange([first.id]);\n\t\t\t\t\t\t} else if (curIdx >= sorted.length - 1) {\n\t\t\t\t\t\t\tonSelectionChange([]);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst next = sorted[curIdx + 1];\n\t\t\t\t\t\t\tif (!next) return;\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\tonSelectionChange([next.id]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// 矢印キー: 1グリッド移動\n\t\t\t\tif (selectedBlockIds.length === 0) return;\n\n\t\t\t\t// Shift+矢印キー: 1グリッドリサイズ\n\t\t\t\tif (e.shiftKey) {\n\t\t\t\t\tconst resizeDeltas: Record<string, { dw: number; dh: number }> = {\n\t\t\t\t\t\tArrowRight: { dw: 1, dh: 0 },\n\t\t\t\t\t\tArrowLeft: { dw: -1, dh: 0 },\n\t\t\t\t\t\tArrowDown: { dw: 0, dh: 1 },\n\t\t\t\t\t\tArrowUp: { dw: 0, dh: -1 },\n\t\t\t\t\t};\n\t\t\t\t\tconst resizeDelta = resizeDeltas[e.key];\n\t\t\t\t\tif (!resizeDelta) return;\n\n\t\t\t\t\te.preventDefault();\n\n\t\t\t\t\t// セッション判定: 方向またはブロック選択が変わったら新セッション\n\t\t\t\t\tconst sortedResizeIds = [...selectedBlockIds].sort().join(\",\");\n\t\t\t\t\tconst prevResize = resizeSessionRef.current;\n\t\t\t\t\tif (\n\t\t\t\t\t\tprevResize === null ||\n\t\t\t\t\t\tprevResize.direction !== e.key ||\n\t\t\t\t\t\tprevResize.blockIds !== sortedResizeIds\n\t\t\t\t\t) {\n\t\t\t\t\t\tresizeSessionCounterRef.current += 1;\n\t\t\t\t\t\tresizeSessionRef.current = {\n\t\t\t\t\t\t\tdirection: e.key,\n\t\t\t\t\t\t\tblockIds: sortedResizeIds,\n\t\t\t\t\t\t\tid: resizeSessionCounterRef.current,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\tconst resizeSession = resizeSessionRef.current;\n\t\t\t\t\tif (!resizeSession) return;\n\n\t\t\t\t\tonPageChange(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t...page,\n\t\t\t\t\t\t\tblocks: blocks.map((b) => {\n\t\t\t\t\t\t\t\tif (!selectedBlockIds.includes(b.id)) return b;\n\t\t\t\t\t\t\t\tconst w = Math.max(\n\t\t\t\t\t\t\t\t\t1,\n\t\t\t\t\t\t\t\t\tMath.min(\n\t\t\t\t\t\t\t\t\t\tb.layout.w + resizeDelta.dw,\n\t\t\t\t\t\t\t\t\t\tgridLength.cols - b.layout.x,\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tconst h = Math.max(\n\t\t\t\t\t\t\t\t\t1,\n\t\t\t\t\t\t\t\t\tMath.min(\n\t\t\t\t\t\t\t\t\t\tb.layout.h + resizeDelta.dh,\n\t\t\t\t\t\t\t\t\t\tgridLength.rows - b.layout.y,\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\treturn { ...b, layout: { ...b.layout, w, h } };\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tmergeKey: keyboardResizeKey(String(resizeSession.id)),\n\t\t\t\t\t\t\tnoTimeWindow: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst arrowDeltas: Record<\n\t\t\t\t\tstring,\n\t\t\t\t\t{ deltaCol: number; deltaRow: number }\n\t\t\t\t> = {\n\t\t\t\t\tArrowLeft: { deltaCol: -1, deltaRow: 0 },\n\t\t\t\t\tArrowRight: { deltaCol: 1, deltaRow: 0 },\n\t\t\t\t\tArrowUp: { deltaCol: 0, deltaRow: -1 },\n\t\t\t\t\tArrowDown: { deltaCol: 0, deltaRow: 1 },\n\t\t\t\t};\n\t\t\t\tconst delta = arrowDeltas[e.key];\n\t\t\t\tif (!delta) return;\n\n\t\t\t\te.preventDefault();\n\t\t\t\tconst selected = blocks.filter((b) => selectedBlockIds.includes(b.id));\n\t\t\t\tconst canMove = selected.every((b) => {\n\t\t\t\t\tconst nx = b.layout.x + delta.deltaCol;\n\t\t\t\t\tconst ny = b.layout.y + delta.deltaRow;\n\t\t\t\t\treturn (\n\t\t\t\t\t\tnx >= 0 &&\n\t\t\t\t\t\tnx + b.layout.w <= gridLength.cols &&\n\t\t\t\t\t\tny >= 0 &&\n\t\t\t\t\t\tny + b.layout.h <= gridLength.rows\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t\tif (!canMove) return;\n\n\t\t\t\t// セッション判定: 方向またはブロック選択が変わったら新セッション\n\t\t\t\tconst sortedIds = [...selectedBlockIds].sort().join(\",\");\n\t\t\t\tconst prev = arrowSessionRef.current;\n\t\t\t\tif (\n\t\t\t\t\tprev === null ||\n\t\t\t\t\tprev.direction !== e.key ||\n\t\t\t\t\tprev.blockIds !== sortedIds\n\t\t\t\t) {\n\t\t\t\t\tarrowSessionCounterRef.current += 1;\n\t\t\t\t\tarrowSessionRef.current = {\n\t\t\t\t\t\tdirection: e.key,\n\t\t\t\t\t\tblockIds: sortedIds,\n\t\t\t\t\t\tid: arrowSessionCounterRef.current,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\t// arrowSessionRef.current は上のブロックで必ず設定される\n\t\t\t\tconst session = arrowSessionRef.current;\n\t\t\t\tif (!session) return;\n\t\t\t\tconst sessionId = String(session.id);\n\n\t\t\t\tonPageChange(\n\t\t\t\t\t{\n\t\t\t\t\t\t...page,\n\t\t\t\t\t\tblocks: blocks.map((b) =>\n\t\t\t\t\t\t\tselectedBlockIds.includes(b.id)\n\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\t...b,\n\t\t\t\t\t\t\t\t\t\tlayout: {\n\t\t\t\t\t\t\t\t\t\t\t...b.layout,\n\t\t\t\t\t\t\t\t\t\t\tx: b.layout.x + delta.deltaCol,\n\t\t\t\t\t\t\t\t\t\t\ty: b.layout.y + delta.deltaRow,\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: b,\n\t\t\t\t\t\t),\n\t\t\t\t\t},\n\t\t\t\t\t{ mergeKey: arrowMoveKey(sessionId), noTimeWindow: true },\n\t\t\t\t);\n\t\t\t},\n\t\t\t[\n\t\t\t\tmode,\n\t\t\t\tselectedBlockIds,\n\t\t\t\tblocks,\n\t\t\t\tpage,\n\t\t\t\tgridLength,\n\t\t\t\tstate,\n\t\t\t\tonStateChange,\n\t\t\t\tonSelectionChange,\n\t\t\t\tonPageChange,\n\t\t\t\tactionContext,\n\t\t\t],\n\t\t);\n\n\t\t// keyUp ではセッションをリセットしない。\n\t\t// セッションは「方向変更」または「ブロック選択変更」でのみ切り替わる。\n\t\t// これにより、同じ方向へ複数回押した場合もすべて同一セッション(同一 mergeKey)に入り、\n\t\t// Ctrl+Z 1 回で一括 Undo できる。\n\n\t\t// リサイズハンドルのポインターダウン処理\n\t\tconst handleResizeStart = useCallback(\n\t\t\t(e: React.PointerEvent, handle: ResizeHandle, blockId: string) => {\n\t\t\t\tif (mode === InteractionMode.EDITING) {\n\t\t\t\t\tonStateChange({ ...state, editingBlockId: null });\n\t\t\t\t}\n\t\t\t\t(e.currentTarget as Element).setPointerCapture(e.pointerId);\n\n\t\t\t\tconst block = blocks.find((b) => b.id === blockId);\n\t\t\t\tif (!block) return;\n\n\t\t\t\tconst startCol = (() => {\n\t\t\t\t\tswitch (handle) {\n\t\t\t\t\t\tcase ResizeHandle.E:\n\t\t\t\t\t\tcase ResizeHandle.NE:\n\t\t\t\t\t\tcase ResizeHandle.SE:\n\t\t\t\t\t\t\treturn block.layout.x + block.layout.w;\n\t\t\t\t\t\tcase ResizeHandle.W:\n\t\t\t\t\t\tcase ResizeHandle.NW:\n\t\t\t\t\t\tcase ResizeHandle.SW:\n\t\t\t\t\t\t\treturn block.layout.x;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\treturn 0;\n\t\t\t\t\t}\n\t\t\t\t})();\n\t\t\t\tconst startRow = (() => {\n\t\t\t\t\tswitch (handle) {\n\t\t\t\t\t\tcase ResizeHandle.S:\n\t\t\t\t\t\tcase ResizeHandle.SE:\n\t\t\t\t\t\tcase ResizeHandle.SW:\n\t\t\t\t\t\t\treturn block.layout.y + block.layout.h;\n\t\t\t\t\t\tcase ResizeHandle.N:\n\t\t\t\t\t\tcase ResizeHandle.NE:\n\t\t\t\t\t\tcase ResizeHandle.NW:\n\t\t\t\t\t\t\treturn block.layout.y;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\treturn 0;\n\t\t\t\t\t}\n\t\t\t\t})();\n\n\t\t\t\tonStateChange({\n\t\t\t\t\t...state,\n\t\t\t\t\tdragging: {\n\t\t\t\t\t\ttype: DragType.RESIZE,\n\t\t\t\t\t\tblockIds: [blockId],\n\t\t\t\t\t\tstartGrid: { col: startCol, row: startRow },\n\t\t\t\t\t\tcurrentGrid: { col: startCol, row: startRow },\n\t\t\t\t\t\thandle,\n\t\t\t\t\t\tisOutside: false,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t},\n\t\t\t[mode, state, blocks, onStateChange],\n\t\t);\n\n\t\t// 編集中ブロックのレンダリング\n\t\tconst editingContent = (() => {\n\t\t\tif (!state.editingBlockId) return null;\n\t\t\tconst editingBlock = blocks.find((b) => b.id === state.editingBlockId);\n\t\t\tconst resolved = editingBlock ? pluginRegistry[editingBlock.kind] : null;\n\t\t\tif (!editingBlock || !resolved) return null;\n\n\t\t\tconst props = resolveBlockProps(editingBlock, resolved, blockDefaults);\n\n\t\t\treturn (\n\t\t\t\t<EditingBlock\n\t\t\t\t\tref={editingBlockRef}\n\t\t\t\t\tid={editingBlock.id}\n\t\t\t\t\tresolvedPlugin={resolved}\n\t\t\t\t\tprops={props}\n\t\t\t\t\tvalue={editingBlock.initValue ?? null}\n\t\t\t\t\tonChange={(val) => {\n\t\t\t\t\t\tonPageChange(\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t...page,\n\t\t\t\t\t\t\t\tblocks: blocks.map((b) =>\n\t\t\t\t\t\t\t\t\tb.id === editingBlock.id ? { ...b, initValue: val } : b,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{ mergeKey: initValueKey(editingBlock.id) },\n\t\t\t\t\t\t);\n\t\t\t\t\t}}\n\t\t\t\t\tblockRectPx={getBlockRectPx(editingBlock)}\n\t\t\t\t\tblock={editingBlock}\n\t\t\t\t\tbindingContext={bindingContext}\n\t\t\t\t\tactionContext={actionContext}\n\t\t\t\t/>\n\t\t\t);\n\t\t})();\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={layerRef}\n\t\t\t\tclassName={className}\n\t\t\t\tstyle={{\n\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\tinset: 0,\n\t\t\t\t\tzIndex: Z_INDEX.INTERACTION_LAYER_BASE,\n\t\t\t\t\tpointerEvents: \"auto\",\n\t\t\t\t\ttouchAction: \"none\",\n\t\t\t\t}}\n\t\t\t\trole=\"application\"\n\t\t\t\taria-label=\"Interactive canvas layer\"\n\t\t\t\ttabIndex={-1}\n\t\t\t\tonPointerDown={handlePointerDown}\n\t\t\t\tonPointerMove={handlePointerMove}\n\t\t\t\tonPointerUp={handlePointerUp}\n\t\t\t\tonPointerLeave={handlePointerLeave}\n\t\t\t\tonDoubleClick={handleDoubleClick}\n\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t\tdata-testid=\"interaction-layer\"\n\t\t\t>\n\t\t\t\t{/* 編集中ブロック */}\n\t\t\t\t{editingContent}\n\n\t\t\t\t{/* 選択枠 + リサイズハンドル */}\n\t\t\t\t<SelectionLayer\n\t\t\t\t\tblocks={blocks}\n\t\t\t\t\tselectedBlockIds={selectedBlockIds}\n\t\t\t\t\tisDragging={mode === InteractionMode.DRAGGING}\n\t\t\t\t\tdraggingState={state.dragging}\n\t\t\t\t\tgetBlockRectPx={getBlockRectPx}\n\t\t\t\t\tonResizeStart={handleResizeStart}\n\t\t\t\t\tselectionStyle={selectionStyle}\n\t\t\t\t/>\n\n\t\t\t\t{/* ドラッグゴースト */}\n\t\t\t\t<DragLayer\n\t\t\t\t\tblocks={blocks}\n\t\t\t\t\tpluginRegistry={pluginRegistry}\n\t\t\t\t\tgridLength={gridLength}\n\t\t\t\t\tdraggingState={state.dragging}\n\t\t\t\t\tgetBlockRectPx={getBlockRectPx}\n\t\t\t\t\tblockDefaults={blockDefaults}\n\t\t\t\t\tselectionStyle={selectionStyle}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t);\n\t},\n);\n\nInteractionLayer.displayName = \"InteractionLayer\";\n","import { createContext } from \"react\";\n\nimport type { PluginRegistry } from \"./registry\";\n\n/**\n * `createPluginRegistry` で生成したプラグインレジストリを React ツリーに注入するコンテキスト。\n *\n * `null` はプロバイダーが未設定であることを示す。\n */\nexport const PluginRegistryContext = createContext<PluginRegistry | null>(null);\n","import { toMm, toPx } from \"../convert\";\n\nimport type { Dimension, GridUnit } from \"../../types\";\n\n// px 値を指定された単位に変換する関数\nfunction convertPxToUnit(pxValue: number, unit: GridUnit): number {\n\tswitch (unit) {\n\t\tcase \"px\":\n\t\t\treturn Math.round(pxValue);\n\t\tcase \"mm\":\n\t\t\treturn Math.round(toMm.fromPx(pxValue) * 10) / 10;\n\t\tcase \"cm\":\n\t\t\treturn Math.round((toMm.fromPx(pxValue) / 10) * 100) / 100;\n\t\tcase \"inch\":\n\t\t\treturn Math.round((toMm.fromPx(pxValue) / 25.4) * 100) / 100;\n\t\tcase \"pt\":\n\t\t\treturn Math.round((toMm.fromPx(pxValue) / 25.4) * 72 * 10) / 10;\n\t\tcase \"fr\":\n\t\t\treturn 1;\n\t\tdefault: {\n\t\t\tconst _exhaustive: never = unit;\n\t\t\tthrow new Error(`Unsupported unit: ${_exhaustive}`);\n\t\t}\n\t}\n}\n\n// fr と固定単位をリサイズする関数\nfunction resizeFrAndFixed(\n\tdimensions: Dimension<GridUnit>[],\n\tindex: number,\n\tdeltaPx: number,\n\tfixedSide: \"current\" | \"next\",\n\ttotalContentPx: number,\n): Dimension<GridUnit>[] {\n\tconst current = dimensions[index];\n\tconst next = dimensions[index + 1];\n\tif (!current || !next) return dimensions;\n\n\tlet totalFr = 0;\n\tlet totalFixedPx = 0;\n\tfor (const dim of dimensions) {\n\t\tif (dim.unit === \"fr\") totalFr += dim.value;\n\t\telse totalFixedPx += toPx.fromDim(dim);\n\t}\n\n\tconst availableForFrPx = totalContentPx - totalFixedPx;\n\tconst currentFrToPx = totalFr > 0 ? availableForFrPx / totalFr : 0;\n\n\tif (fixedSide === \"next\") {\n\t\tconst nextPx = toPx.fromDim(next);\n\t\tconst newNextPx = Math.max(10, nextPx - deltaPx);\n\t\tdimensions[index + 1] = {\n\t\t\t...next,\n\t\t\tvalue: convertPxToUnit(newNextPx, next.unit),\n\t\t};\n\t\tconst newAvailableForFrPx = availableForFrPx - (newNextPx - nextPx);\n\t\tconst newCurrentPx = Math.max(10, current.value * currentFrToPx + deltaPx);\n\t\tconst newCurrentFr =\n\t\t\ttotalFr > 0 ? (newCurrentPx / newAvailableForFrPx) * totalFr : 1;\n\t\tdimensions[index] = {\n\t\t\t...current,\n\t\t\tvalue: Math.round(newCurrentFr * 100) / 100,\n\t\t};\n\t} else {\n\t\tconst currentPx = toPx.fromDim(current);\n\t\tconst newCurrentPx = Math.max(10, currentPx + deltaPx);\n\t\tdimensions[index] = {\n\t\t\t...current,\n\t\t\tvalue: convertPxToUnit(newCurrentPx, current.unit),\n\t\t};\n\t\tconst newAvailableForFrPx = availableForFrPx - (newCurrentPx - currentPx);\n\t\tconst newNextPx = Math.max(10, next.value * currentFrToPx - deltaPx);\n\t\tconst newNextFr =\n\t\t\ttotalFr > 0 ? (newNextPx / newAvailableForFrPx) * totalFr : 1;\n\t\tdimensions[index + 1] = {\n\t\t\t...next,\n\t\t\tvalue: Math.round(newNextFr * 100) / 100,\n\t\t};\n\t}\n\treturn dimensions;\n}\n\n// 固定単位同士をリサイズする関数\nfunction resizeFixedPair(\n\tdimensions: Dimension<GridUnit>[],\n\tindex: number,\n\tdeltaPx: number,\n): Dimension<GridUnit>[] {\n\tconst current = dimensions[index];\n\tconst next = dimensions[index + 1];\n\tif (!current || !next) return dimensions;\n\n\tconst newCurrentPx = Math.max(10, toPx.fromDim(current) + deltaPx);\n\tconst newNextPx = Math.max(10, toPx.fromDim(next) - deltaPx);\n\n\tdimensions[index] = {\n\t\t...current,\n\t\tvalue: convertPxToUnit(newCurrentPx, current.unit),\n\t};\n\tdimensions[index + 1] = {\n\t\t...next,\n\t\tvalue: convertPxToUnit(newNextPx, next.unit),\n\t};\n\treturn dimensions;\n}\n\n// fr 同士をリサイズする関数\nfunction resizeFrPair(\n\tdimensions: Dimension<GridUnit>[],\n\tindex: number,\n\tdeltaPx: number,\n\ttotalContentPx: number,\n): Dimension<GridUnit>[] {\n\tconst current = dimensions[index];\n\tconst next = dimensions[index + 1];\n\tif (!current || !next) return dimensions;\n\n\tconst totalFr = dimensions.reduce(\n\t\t(sum, dim) => (dim.unit === \"fr\" ? sum + dim.value : sum),\n\t\t0,\n\t);\n\tconst frToPx = totalContentPx / totalFr;\n\tconst newCurrentFr = Math.max(10, current.value * frToPx + deltaPx) / frToPx;\n\tconst newNextFr = Math.max(10, next.value * frToPx - deltaPx) / frToPx;\n\n\tdimensions[index] = {\n\t\t...current,\n\t\tvalue: Math.round(newCurrentFr * 100) / 100,\n\t};\n\tdimensions[index + 1] = { ...next, value: Math.round(newNextFr * 100) / 100 };\n\treturn dimensions;\n}\n\n/**\n * グリッドの列または行をドラッグリサイズしたときの新しいサイズ配列を計算する。\n *\n * `index` 番目と `index + 1` 番目を隣接ペアとして扱い、\n * `fr` / 固定 / 混在の組み合わせに応じて適切な計算を行う。最小サイズは 10px に固定される。\n *\n * @param dimensions リサイズ前のサイズ配列\n * @param index リサイズ起点となる列/行のインデックス\n * @param deltaPx ドラッグ量uff08pxuff09。正値で右/下に拡大\n * @param totalContentPx コンテンツ領域の合計幅/高さuff08pxuff09。`fr` 計算に使用\n */\nexport function calcGridResize(\n\tdimensions: Dimension<GridUnit>[],\n\tindex: number,\n\tdeltaPx: number,\n\ttotalContentPx: number,\n): Dimension<GridUnit>[] {\n\tif (index < 0 || index >= dimensions.length) return dimensions;\n\n\tconst newDimensions = [...dimensions];\n\tconst current = newDimensions[index];\n\tconst next = newDimensions[index + 1];\n\tif (!current || !next) return dimensions;\n\n\tif (current.unit === \"fr\" && next.unit === \"fr\") {\n\t\treturn resizeFrPair(newDimensions, index, deltaPx, totalContentPx);\n\t}\n\tif (current.unit !== \"fr\" && next.unit !== \"fr\") {\n\t\treturn resizeFixedPair(newDimensions, index, deltaPx);\n\t}\n\tif (current.unit === \"fr\" && next.unit !== \"fr\") {\n\t\treturn resizeFrAndFixed(\n\t\t\tnewDimensions,\n\t\t\tindex,\n\t\t\tdeltaPx,\n\t\t\t\"next\",\n\t\t\ttotalContentPx,\n\t\t);\n\t}\n\treturn resizeFrAndFixed(\n\t\tnewDimensions,\n\t\tindex,\n\t\tdeltaPx,\n\t\t\"current\",\n\t\ttotalContentPx,\n\t);\n}\n","import { useCallback, useMemo, useState } from \"react\";\n\nimport { useGridCalc } from \"../../canvas/layers/GridLayer/hooks\";\nimport { evaluateValidation, hasValidationRule } from \"../../plugin\";\nimport { evalHiddenBinding } from \"../../utils/block\";\nimport { DEFAULT_DPI } from \"../../utils/convert\";\n\nimport type { BindingContext } from \"../../types/context\";\nimport type { Book } from \"../../types/schema\";\nimport type { ValidationError } from \"../../types/validation\";\nimport type { Value } from \"../../types/value\";\n\n/**\n * `useNoteLayout` の入力パラメータ。\n *\n * @internal\n */\ninterface UseNoteLayoutParams {\n\t/** 表示対象の Book。 */\n\tbook: Book;\n\n\t/** 表示するページのインデックス。 */\n\tpageIdx: number;\n\n\t/** `true` のときバリデーションエラーを計算する。 */\n\tshowValidation: boolean;\n\n\t/** 入力コントロールの現在値マップ(バリデーション評価に使用)。 */\n\tvalues: Record<string, Value>;\n\n\t/** hidden バインディング解決に使用する BindingContext。 */\n\tbindingContext?: BindingContext;\n}\n\n/**\n * `NoteEdit` / `NoteView` で共通する寸法計算・バリデーション計算ロジック。\n *\n * グリッド座標 → px 変換、autoHeight / autoWidth 対応の canvas サイズ計算、\n * バリデーションエラーの集約を行い、各描画コンポーネントに渡す値を返す。\n *\n * @remarks\n * `NoteEdit` / `NoteView` の内部フック。\n * 独自レイアウトが必要な場合のみ直接利用すること。\n */\nexport function useNoteLayout({\n\tbook,\n\tpageIdx,\n\tshowValidation,\n\tvalues,\n\tbindingContext,\n}: UseNoteLayoutParams) {\n\tconst page = book.pages[pageIdx] ?? book.pages[0];\n\tconst paper = book.paper;\n\n\tconst { paperPx, gridPosPx, getBlockRectPx } = useGridCalc(\n\t\tpaper,\n\t\tpage.grid,\n\t\tDEFAULT_DPI,\n\t);\n\n\tconst isFit = paper.autoHeight === true;\n\tconst isWidthFit = paper.autoWidth === true;\n\n\tconst [measuredHeights, setMeasuredHeights] = useState<Map<string, number>>(\n\t\tnew Map(),\n\t);\n\tconst [measuredWidths, setMeasuredWidths] = useState<Map<string, number>>(\n\t\tnew Map(),\n\t);\n\n\tconst handleMeasureHeight = useCallback(\n\t\t(blockId: string, heightPx: number) => {\n\t\t\tsetMeasuredHeights((prev) => {\n\t\t\t\tif (prev.get(blockId) === heightPx) return prev;\n\t\t\t\tconst next = new Map(prev);\n\t\t\t\tnext.set(blockId, heightPx);\n\t\t\t\treturn next;\n\t\t\t});\n\t\t},\n\t\t[],\n\t);\n\n\tconst handleMeasureWidth = useCallback((blockId: string, widthPx: number) => {\n\t\tsetMeasuredWidths((prev) => {\n\t\t\tif (prev.get(blockId) === widthPx) return prev;\n\t\t\tconst next = new Map(prev);\n\t\t\tnext.set(blockId, widthPx);\n\t\t\treturn next;\n\t\t});\n\t}, []);\n\n\tconst measuredContentBottomPx = useMemo(() => {\n\t\tif (!isFit || measuredHeights.size === 0) return 0;\n\t\tlet maxBottom = 0;\n\t\tfor (const block of page.blocks) {\n\t\t\tconst isHidden = evalHiddenBinding(block.hiddenBinding, bindingContext);\n\t\t\tif (isHidden) continue;\n\t\t\tconst rect = getBlockRectPx(block);\n\t\t\tconst blockH = measuredHeights.get(block.id) ?? rect.height;\n\t\t\tmaxBottom = Math.max(maxBottom, rect.top - paperPx.margin.top + blockH);\n\t\t}\n\t\treturn maxBottom;\n\t}, [\n\t\tisFit,\n\t\tmeasuredHeights,\n\t\tpage.blocks,\n\t\tgetBlockRectPx,\n\t\tpaperPx.margin.top,\n\t\tbindingContext,\n\t]);\n\n\tconst measuredContentRightPx = useMemo(() => {\n\t\tif (!isWidthFit || measuredWidths.size === 0) return 0;\n\t\tlet maxRight = 0;\n\t\tfor (const block of page.blocks) {\n\t\t\tconst isHidden = evalHiddenBinding(block.hiddenBinding, bindingContext);\n\t\t\tif (isHidden) continue;\n\t\t\tconst rect = getBlockRectPx(block);\n\t\t\tconst blockW = measuredWidths.get(block.id) ?? rect.width;\n\t\t\tmaxRight = Math.max(maxRight, rect.left - paperPx.margin.left + blockW);\n\t\t}\n\t\treturn maxRight;\n\t}, [\n\t\tisWidthFit,\n\t\tmeasuredWidths,\n\t\tpage.blocks,\n\t\tgetBlockRectPx,\n\t\tpaperPx.margin.left,\n\t\tbindingContext,\n\t]);\n\n\tconst canvasHeightPx = useMemo(() => {\n\t\tif (!isFit) return paperPx.canvas.height;\n\t\tif (measuredContentBottomPx === 0 && measuredHeights.size === 0) {\n\t\t\treturn paperPx.canvas.height;\n\t\t}\n\t\treturn (\n\t\t\tpaperPx.margin.top +\n\t\t\tMath.max(0, measuredContentBottomPx) +\n\t\t\tpaperPx.margin.bottom\n\t\t);\n\t}, [isFit, paperPx, measuredContentBottomPx, measuredHeights.size]);\n\n\tconst canvasWidthPx = useMemo(() => {\n\t\tconst gridTotalWidth =\n\t\t\t(gridPosPx.cols[gridPosPx.cols.length - 1] ?? 0) +\n\t\t\tpaperPx.margin.left +\n\t\t\tpaperPx.margin.right;\n\t\tif (!isWidthFit) return gridTotalWidth;\n\t\tif (measuredContentRightPx === 0 && measuredWidths.size === 0) {\n\t\t\treturn gridTotalWidth;\n\t\t}\n\t\tconst fitWidth =\n\t\t\tpaperPx.margin.left +\n\t\t\tMath.max(0, measuredContentRightPx) +\n\t\t\tpaperPx.margin.right;\n\t\treturn Math.max(gridTotalWidth, fitWidth);\n\t}, [\n\t\tisWidthFit,\n\t\tpaperPx,\n\t\tgridPosPx.cols,\n\t\tmeasuredContentRightPx,\n\t\tmeasuredWidths.size,\n\t]);\n\n\tconst effectivePaperPx = useMemo(\n\t\t() => ({\n\t\t\t...paperPx,\n\t\t\tcanvas: {\n\t\t\t\t...paperPx.canvas,\n\t\t\t\theight: canvasHeightPx,\n\t\t\t\twidth: canvasWidthPx,\n\t\t\t},\n\t\t}),\n\t\t[paperPx, canvasHeightPx, canvasWidthPx],\n\t);\n\n\tconst validationErrors = useMemo(():\n\t\t| Record<string, ValidationError[]>\n\t\t| undefined => {\n\t\tif (!showValidation) return undefined;\n\t\tconst result: Record<string, ValidationError[]> = {};\n\t\tfor (const block of page.blocks) {\n\t\t\tif (!hasValidationRule(block.props)) continue;\n\t\t\tconst raw = values[block.id];\n\t\t\tconst strVal =\n\t\t\t\traw === null || raw === undefined ? undefined : String(raw);\n\t\t\tconst errors = evaluateValidation(block.props, strVal);\n\t\t\tif (errors.length > 0) result[block.id] = errors;\n\t\t}\n\t\treturn result;\n\t}, [showValidation, page.blocks, values]);\n\n\treturn {\n\t\tpage,\n\t\tisFit,\n\t\tisWidthFit,\n\t\tpaperPx,\n\t\tgridPosPx,\n\t\tgetBlockRectPx,\n\t\tmeasuredHeights,\n\t\tmeasuredWidths,\n\t\thandleMeasureHeight,\n\t\thandleMeasureWidth,\n\t\tcanvasHeightPx,\n\t\tcanvasWidthPx,\n\t\teffectivePaperPx,\n\t\tvalidationErrors,\n\t};\n}\n","import { memo, useCallback, useMemo, useState } from \"react\";\n\nimport { BlockLayer, GridLayer } from \"../../canvas/layers\";\nimport { PluginRegistryContext } from \"../../plugin/context\";\nimport { NoteMode } from \"../../types/mode\";\nimport { STACKING_ISOLATION_STYLE } from \"../../utils/zIndex\";\nimport { useNoteLayout } from \"../hooks/useNoteLayout\";\n\nimport type { NoteContext } from \"../../contexts/useNoteContext\";\nimport type { Value } from \"../../types/value\";\n\n/**\n * {@link NoteEdit} の props。\n */\nexport interface NoteEditProps {\n\t/** `useNoteContext` が返すコンテキスト。 */\n\tcontext: NoteContext;\n\n\t/** `true` のときバリデーションエラーを表示する(デフォルト: false)。 */\n\tshowValidation?: boolean;\n\n\t/** 表示倍率(デフォルト: 1)。 */\n\tscale?: number;\n\n\t/** ルート要素に追加する className。 */\n\tclassName?: string;\n}\n\n/**\n * 値入力モード(EDIT モード)専用コンポーネント。\n *\n * ブロックの配置・サイズ変更は不可。直接 value を編集できる。\n * `useNoteContext` で生成した `context` を渡して使用する。\n *\n * @remarks 通常は {@link Note} を `mode={NoteMode.EDIT}` で使用する。\n */\nexport const NoteEdit = memo(function NoteEdit({\n\tcontext,\n\tshowValidation = false,\n\tscale = 1.0,\n\tclassName,\n}: NoteEditProps) {\n\tconst { book, pluginRegistry } = context;\n\n\tconst values = context.values;\n\tconst onValuesChange = context.onValuesChange;\n\tconst onValueChange = useCallback(\n\t\t(id: string, value: Value) => onValuesChange?.([{ id, value }]),\n\t\t[onValuesChange],\n\t);\n\n\tconst {\n\t\tpage,\n\t\tisFit,\n\t\tisWidthFit,\n\t\tgridPosPx,\n\t\tgetBlockRectPx,\n\t\thandleMeasureHeight,\n\t\thandleMeasureWidth,\n\t\tcanvasHeightPx,\n\t\tcanvasWidthPx,\n\t\teffectivePaperPx,\n\t\tvalidationErrors,\n\t} = useNoteLayout({\n\t\tbook,\n\t\tpageIdx: context.editorState.pageIdx,\n\t\tshowValidation,\n\t\tvalues,\n\t\tbindingContext: context.bindingContext,\n\t});\n\n\tconst [focusedBlockId, setFocusedBlockId] = useState<string | null>(null);\n\n\t// Tab キーで視覚的な順序(上→下、左→右)にフォーカスが移るようグリッド順でソート\n\tconst sortedBlocks = useMemo(\n\t\t() =>\n\t\t\t[...page.blocks].sort((a, b) =>\n\t\t\t\ta.layout.y !== b.layout.y\n\t\t\t\t\t? a.layout.y - b.layout.y\n\t\t\t\t\t: a.layout.x - b.layout.x,\n\t\t\t),\n\t\t[page.blocks],\n\t);\n\n\tconst handleFocusCapture = useCallback((e: React.FocusEvent<HTMLElement>) => {\n\t\tconst blockEl = (e.target as Element).closest(\"[data-block-id]\");\n\t\tsetFocusedBlockId(blockEl?.getAttribute(\"data-block-id\") ?? null);\n\t}, []);\n\n\tconst handleBlurCapture = useCallback((e: React.FocusEvent<HTMLElement>) => {\n\t\tif (!e.currentTarget.contains(e.relatedTarget as Node)) {\n\t\t\tsetFocusedBlockId(null);\n\t\t}\n\t}, []);\n\n\treturn (\n\t\t<PluginRegistryContext.Provider value={pluginRegistry}>\n\t\t\t<form\n\t\t\t\tdata-testid=\"note-container\"\n\t\t\t\taria-label=\"フォーム\"\n\t\t\t\tclassName={className}\n\t\t\t\tonSubmit={(e) => e.preventDefault()}\n\t\t\t\tonFocusCapture={handleFocusCapture}\n\t\t\t\tonBlurCapture={handleBlurCapture}\n\t\t\t\tstyle={{\n\t\t\t\t\tposition: \"relative\",\n\t\t\t\t\twidth: `${canvasWidthPx}px`,\n\t\t\t\t\theight: `${canvasHeightPx}px`,\n\t\t\t\t\tmargin: \"0 auto\",\n\t\t\t\t\tboxShadow: \"0 2px 8px rgba(0,0,0,0.1)\",\n\t\t\t\t\tbackgroundColor: \"#fff\",\n\t\t\t\t\ttransform: scale !== 1 ? `scale(${scale})` : undefined,\n\t\t\t\t\ttransformOrigin: \"top center\",\n\t\t\t\t\t...STACKING_ISOLATION_STYLE,\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<GridLayer\n\t\t\t\t\tpaperPx={effectivePaperPx}\n\t\t\t\t\tgridPosPx={gridPosPx}\n\t\t\t\t\tshowGridLines={false}\n\t\t\t\t\tshowMargins={false}\n\t\t\t\t\tshowBorder={false}\n\t\t\t\t/>\n\t\t\t\t<BlockLayer\n\t\t\t\t\tblocks={sortedBlocks}\n\t\t\t\t\tpluginRegistry={pluginRegistry}\n\t\t\t\t\tmode={NoteMode.EDIT}\n\t\t\t\t\tvalues={values}\n\t\t\t\t\tblockDefaults={page.blockDefaults}\n\t\t\t\t\tgetBlockRectPx={getBlockRectPx}\n\t\t\t\t\tonMeasureHeight={isFit ? handleMeasureHeight : undefined}\n\t\t\t\t\tonMeasureWidth={isWidthFit ? handleMeasureWidth : undefined}\n\t\t\t\t\tonValueChange={onValuesChange ? onValueChange : undefined}\n\t\t\t\t\tshowGuides={true}\n\t\t\t\t\tshowBorder={true}\n\t\t\t\t\tshowValidation={showValidation}\n\t\t\t\t\tvalidationErrors={validationErrors}\n\t\t\t\t\tfocusedBlockId={focusedBlockId ?? undefined}\n\t\t\t\t\tbindingContext={context.bindingContext}\n\t\t\t\t\tactionContext={context.actionContext}\n\t\t\t\t/>\n\t\t\t</form>\n\t\t</PluginRegistryContext.Provider>\n\t);\n});\n","import { memo, useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\nimport {\n\tBlockLayer,\n\tGridLayer,\n\tInteractionLayer,\n\tuseInteractionState,\n} from \"../../canvas/layers\";\nimport {\n\tuseExpandedGrid,\n\tuseGridCalc,\n} from \"../../canvas/layers/GridLayer/hooks\";\nimport { DragType } from \"../../canvas/layers/InteractionLayer/types\";\nimport { clampBlockToGrid } from \"../../canvas/layers/InteractionLayer/utils/clampBlock\";\nimport { createBlock } from \"../../canvas/layers/InteractionLayer/utils/createBlock\";\nimport { initValueKey } from \"../../contexts/history/mergeKeys\";\nimport { PluginRegistryContext } from \"../../plugin/context\";\nimport { SIDEBAR_PORTAL_SELECTOR } from \"../../shell/bars/Sidebar/sidebarPortal\";\nimport { LineType } from \"../../types/line\";\nimport { NoteMode } from \"../../types/mode\";\nimport { evalHiddenBinding } from \"../../utils/block\";\nimport {\n\tBLOCK_DRAG_MIME,\n\tgetBlockDragData,\n\tgetBlockDragKind,\n} from \"../../utils/blockDrag\";\nimport { setPage } from \"../../utils/book\";\nimport { DEFAULT_DPI } from \"../../utils/convert\";\nimport { calcGridResize, colsToSparse, rowsToSparse } from \"../../utils/grid\";\nimport { STACKING_ISOLATION_STYLE } from \"../../utils/zIndex\";\n\nimport type React from \"react\";\nimport type { BlockRectPx } from \"../../canvas/layers/types\";\nimport type { NoteContext } from \"../../contexts/useNoteContext\";\nimport type { Block } from \"../../types/block\";\nimport type { Page } from \"../../types/schema\";\nimport type { Dimension, GridUnit } from \"../../types/unit\";\nimport type { Value } from \"../../types/value\";\n\n/**\n * {@link NoteForm} の props。\n *\n * テンプレートデザインモード専用。`context` は必須。\n * `useNoteContext` を使って context を生成し、ActionBar / Sidebar と共に使用する。\n */\nexport interface NoteFormProps {\n\t/** `useNoteContext` が返すコンテキスト(必須)。 */\n\tcontext: NoteContext;\n\n\t/** 表示倍率(デフォルト: 1)。 */\n\tscale?: number;\n\n\t/** ルート要素に追加する className。 */\n\tclassName?: string;\n}\n\n/**\n * テンプレート作成モード(FORM モード)専用コンポーネント。\n *\n * ブロックの配置・サイズ変更が可能。ダブルクリックで initValue を編集できる。\n * `useNoteContext` で生成した `context` を渡す。ActionBar / Sidebar と組み合わせて使用する。\n *\n * @remarks 通常は {@link Note} を `mode={NoteMode.FORM}` で使用する。\n */\nexport const NoteForm = memo(function NoteForm({\n\tcontext,\n\tscale = 1.0,\n\tclassName,\n}: NoteFormProps) {\n\tconst { book, onBookChange, pluginRegistry } = context;\n\tconst pageIdx = context.editorState.pageIdx;\n\tconst selectedBlockIds = context.editorState.selectedBlockIds;\n\tconst actionContext = context.actionContext;\n\n\tconst page = book.pages[pageIdx] ?? book.pages[0];\n\n\t// stale closure 回避: onPageChange の deps から book/pageIdx を除去するために ref を使う\n\tconst bookRef = useRef(book);\n\tbookRef.current = book;\n\tconst pageIdxRef = useRef(pageIdx);\n\tpageIdxRef.current = pageIdx;\n\n\tconst onPageChange = useCallback(\n\t\t(\n\t\t\tnewPage: Page,\n\t\t\toptions?: { mergeKey?: string; noTimeWindow?: boolean },\n\t\t) => {\n\t\t\tif (onBookChange) {\n\t\t\t\tonBookChange(\n\t\t\t\t\tsetPage(bookRef.current, pageIdxRef.current, newPage),\n\t\t\t\t\toptions,\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\t\t[onBookChange],\n\t);\n\n\t// --- インタラクション状態管理\n\tconst [interactionState, onStateChange] = useInteractionState();\n\n\tconst onStateChangeRef = useRef(onStateChange);\n\tonStateChangeRef.current = onStateChange;\n\n\tconst onSelectionChange = useCallback(\n\t\t(ids: string[]) => actionContext.execute(\"selectBlocks\", ids),\n\t\t[actionContext],\n\t);\n\n\t// 用紙要素への参照\n\tconst paperRef = useRef<HTMLElement>(null);\n\n\tconst { expandedCols, expandedRows } = useExpandedGrid(page.grid);\n\n\tconst { paperPx, gridPosPx, getBlockRectPx, getColIndex, getRowIndex } =\n\t\tuseGridCalc(book.paper, page.grid, DEFAULT_DPI);\n\n\t// --- ドロップゾーンハンドラ(ブロック DnD 挿入)\n\tconst handleDragEnter = useCallback(\n\t\t(e: React.DragEvent<HTMLDivElement>) => {\n\t\t\tconst kind = getBlockDragKind(e);\n\t\t\tif (!kind) return;\n\t\t\te.preventDefault();\n\t\t\tconst plugin = pluginRegistry[kind];\n\t\t\tconst defaultSize = plugin?.meta.defaultSize ?? { w: 1, h: 1 };\n\t\t\tconst rect = paperRef.current?.getBoundingClientRect();\n\t\t\tconst col = rect ? getColIndex(e.clientX - rect.left) : 0;\n\t\t\tconst row = rect ? getRowIndex(e.clientY - rect.top) : 0;\n\t\t\tonStateChangeRef.current({\n\t\t\t\teditingBlockId: null,\n\t\t\t\tdragging: {\n\t\t\t\t\ttype: DragType.INSERT,\n\t\t\t\t\tblockIds: [],\n\t\t\t\t\tpluginKind: kind,\n\t\t\t\t\tdefaultSize,\n\t\t\t\t\tstartGrid: { col, row },\n\t\t\t\t\tcurrentGrid: { col, row },\n\t\t\t\t\tcurrentMousePx: { x: e.clientX, y: e.clientY },\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t\t[pluginRegistry, getColIndex, getRowIndex],\n\t);\n\n\tconst handleDragOver = useCallback(\n\t\t(e: React.DragEvent<HTMLDivElement>) => {\n\t\t\tif (!e.dataTransfer.types.includes(BLOCK_DRAG_MIME)) return;\n\t\t\te.preventDefault();\n\t\t\te.dataTransfer.dropEffect = \"copy\";\n\t\t\tconst rect = paperRef.current?.getBoundingClientRect();\n\t\t\tif (!rect) return;\n\t\t\tconst col = getColIndex(e.clientX - rect.left);\n\t\t\tconst row = getRowIndex(e.clientY - rect.top);\n\t\t\tonStateChangeRef.current((prev) => {\n\t\t\t\tif (prev.dragging?.type !== DragType.INSERT) return prev;\n\t\t\t\treturn {\n\t\t\t\t\t...prev,\n\t\t\t\t\tdragging: {\n\t\t\t\t\t\t...prev.dragging,\n\t\t\t\t\t\tcurrentGrid: { col, row },\n\t\t\t\t\t\tcurrentMousePx: { x: e.clientX, y: e.clientY },\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t});\n\t\t},\n\t\t[getColIndex, getRowIndex],\n\t);\n\n\tconst handleDragLeave = useCallback((e: React.DragEvent<HTMLDivElement>) => {\n\t\tif (!e.dataTransfer.types.includes(BLOCK_DRAG_MIME)) return;\n\t\t// paper div の子孫への移動は無視(子要素へ入っても dragleave が発火するため)\n\t\tif (paperRef.current?.contains(e.relatedTarget as Node)) return;\n\t\tonStateChangeRef.current({ editingBlockId: null, dragging: undefined });\n\t}, []);\n\n\tconst handleDrop = useCallback(\n\t\t(e: React.DragEvent<HTMLDivElement>) => {\n\t\t\te.preventDefault();\n\t\t\tconst data = getBlockDragData(e);\n\t\t\tif (!data) return;\n\t\t\tconst rect = paperRef.current?.getBoundingClientRect();\n\t\t\tif (!rect) return;\n\t\t\tconst col = getColIndex(e.clientX - rect.left);\n\t\t\tconst row = getRowIndex(e.clientY - rect.top);\n\t\t\tconst defaultSize = data.defaultSize ?? { w: 1, h: 1 };\n\t\t\tconst resolved = pluginRegistry[data.kind];\n\t\t\tif (!resolved) return;\n\t\t\tconst { x, y } = clampBlockToGrid(\n\t\t\t\t{ x: col, y: row },\n\t\t\t\tdefaultSize,\n\t\t\t\tpage.grid.colCount,\n\t\t\t\tpage.grid.rowCount,\n\t\t\t);\n\t\t\tconst newBlock: Block = {\n\t\t\t\t...createBlock(resolved, { x, y }),\n\t\t\t\tlayout: { x, y, w: defaultSize.w, h: defaultSize.h },\n\t\t\t};\n\t\t\tonPageChange({ ...page, blocks: [...page.blocks, newBlock] });\n\t\t\tonSelectionChange([newBlock.id]);\n\t\t\tonStateChangeRef.current({ editingBlockId: null, dragging: undefined });\n\t\t},\n\t\t[\n\t\t\tpage,\n\t\t\tpluginRegistry,\n\t\t\tgetColIndex,\n\t\t\tgetRowIndex,\n\t\t\tonPageChange,\n\t\t\tonSelectionChange,\n\t\t],\n\t);\n\n\t// heightFit/widthFit ブロックの計測値を追跡する\n\tconst [measuredHeights, setMeasuredHeights] = useState<Map<string, number>>(\n\t\tnew Map(),\n\t);\n\tconst [measuredWidths, setMeasuredWidths] = useState<Map<string, number>>(\n\t\tnew Map(),\n\t);\n\n\tconst handleMeasureHeight = useCallback((blockId: string, h: number) => {\n\t\tsetMeasuredHeights((prev) => {\n\t\t\tif (prev.get(blockId) === h) return prev;\n\t\t\tconst next = new Map(prev);\n\t\t\tnext.set(blockId, h);\n\t\t\treturn next;\n\t\t});\n\t}, []);\n\n\tconst handleMeasureWidth = useCallback((blockId: string, w: number) => {\n\t\tsetMeasuredWidths((prev) => {\n\t\t\tif (prev.get(blockId) === w) return prev;\n\t\t\tconst next = new Map(prev);\n\t\t\tnext.set(blockId, w);\n\t\t\treturn next;\n\t\t});\n\t}, []);\n\n\tconst getAdjustedBlockRectPx = useCallback(\n\t\t(block: Block): BlockRectPx => {\n\t\t\tconst rect = getBlockRectPx(block);\n\t\t\tconst h = measuredHeights.get(block.id);\n\t\t\tconst w = measuredWidths.get(block.id);\n\t\t\treturn {\n\t\t\t\t...rect,\n\t\t\t\theight: h !== undefined ? Math.max(rect.height, h) : rect.height,\n\t\t\t\twidth: w !== undefined ? Math.max(rect.width, w) : rect.width,\n\t\t\t};\n\t\t},\n\t\t[getBlockRectPx, measuredHeights, measuredWidths],\n\t);\n\n\t// initValue 変更ハンドラ(ダブルクリックで編集)\n\tconst handleInitValueChange = useCallback(\n\t\t(id: string, val: Value) => {\n\t\t\tconst nextBlocks = page.blocks.map((block: Block) => {\n\t\t\t\tif (block.id === id) {\n\t\t\t\t\treturn { ...block, initValue: val };\n\t\t\t\t}\n\t\t\t\treturn block;\n\t\t\t});\n\t\t\tonPageChange(\n\t\t\t\t{ ...page, blocks: nextBlocks },\n\t\t\t\t{ mergeKey: initValueKey(id) },\n\t\t\t);\n\t\t},\n\t\t[page, onPageChange],\n\t);\n\n\t// 用紙外のクリックを検知して選択を解除\n\tuseEffect(() => {\n\t\tconst handleClickOutside = (event: MouseEvent) => {\n\t\t\tif (selectedBlockIds.length === 0) return;\n\n\t\t\tconst target = event.target as Node;\n\n\t\t\t// SVGElement は HTMLElement のサブクラスではないため Element で判定する\n\t\t\tif (target instanceof Element) {\n\t\t\t\tconst isSidebar = target.closest(SIDEBAR_PORTAL_SELECTOR);\n\t\t\t\tconst isActionBar = target.closest(\n\t\t\t\t\t'[data-selection-action-bar=\"true\"]',\n\t\t\t\t);\n\t\t\t\tif (isSidebar || isActionBar) return;\n\t\t\t}\n\n\t\t\tif (paperRef.current && !paperRef.current.contains(target)) {\n\t\t\t\tonSelectionChange([]);\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}, [selectedBlockIds, onSelectionChange]);\n\n\t// グリッドリサイズハンドラ\n\tconst handleGridResize = useCallback(\n\t\t(direction: \"column\" | \"row\", index: number, deltaPx: number) => {\n\t\t\t// グリッド線 index=1 → dimension[0] と dimension[1] の間\n\t\t\tconst dimensionIndex = index - 1;\n\n\t\t\tif (direction === \"column\") {\n\t\t\t\tconst newCols = calcGridResize(\n\t\t\t\t\texpandedCols,\n\t\t\t\t\tdimensionIndex,\n\t\t\t\t\tdeltaPx,\n\t\t\t\t\tpaperPx.content.width,\n\t\t\t\t);\n\t\t\t\tonPageChange({\n\t\t\t\t\t...page,\n\t\t\t\t\tgrid: { ...page.grid, ...colsToSparse(newCols) },\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tconst newRows = calcGridResize(\n\t\t\t\t\texpandedRows,\n\t\t\t\t\tdimensionIndex,\n\t\t\t\t\tdeltaPx,\n\t\t\t\t\tpaperPx.content.height,\n\t\t\t\t);\n\t\t\t\tonPageChange({\n\t\t\t\t\t...page,\n\t\t\t\t\tgrid: { ...page.grid, ...rowsToSparse(newRows) },\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\t[page, paperPx, expandedCols, expandedRows, onPageChange],\n\t);\n\n\t// グリッド寸法の単位値を変更した際のハンドラ\n\tconst handleDimensionChange = useCallback(\n\t\t(\n\t\t\tdirection: \"column\" | \"row\",\n\t\t\tindex: number,\n\t\t\tdimension: Dimension<GridUnit>,\n\t\t) => {\n\t\t\tif (direction === \"column\") {\n\t\t\t\tconst newCols = [...expandedCols];\n\t\t\t\tnewCols[index] = dimension;\n\t\t\t\tonPageChange({\n\t\t\t\t\t...page,\n\t\t\t\t\tgrid: { ...page.grid, ...colsToSparse(newCols) },\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tconst newRows = [...expandedRows];\n\t\t\t\tnewRows[index] = dimension;\n\t\t\t\tonPageChange({\n\t\t\t\t\t...page,\n\t\t\t\t\tgrid: { ...page.grid, ...rowsToSparse(newRows) },\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\t[onPageChange, page, expandedCols, expandedRows],\n\t);\n\n\t// hiddenBinding を評価して非表示ブロックを除外した値(FORM モードは bindingContext なし)\n\tconst visibleValues = useMemo(() => {\n\t\tconst result: Record<string, Value> = {};\n\t\tfor (const block of page.blocks) {\n\t\t\tconst isHidden = evalHiddenBinding(block.hiddenBinding, undefined);\n\t\t\tif (!isHidden && block.initValue !== undefined) {\n\t\t\t\tresult[block.id] = block.initValue;\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}, [page.blocks]);\n\n\treturn (\n\t\t<PluginRegistryContext.Provider value={pluginRegistry}>\n\t\t\t<section\n\t\t\t\tref={paperRef}\n\t\t\t\tdata-testid=\"note-container\"\n\t\t\t\tclassName={className}\n\t\t\t\taria-label=\"用紙\"\n\t\t\t\tonDragEnter={handleDragEnter}\n\t\t\t\tonDragOver={handleDragOver}\n\t\t\t\tonDragLeave={handleDragLeave}\n\t\t\t\tonDrop={handleDrop}\n\t\t\t\tstyle={{\n\t\t\t\t\tposition: \"relative\",\n\t\t\t\t\twidth: `${paperPx.canvas.width}px`,\n\t\t\t\t\theight: `${paperPx.canvas.height}px`,\n\t\t\t\t\tmargin: \"0 auto\",\n\t\t\t\t\tboxShadow: \"0 2px 8px rgba(0,0,0,0.1)\",\n\t\t\t\t\tbackgroundColor: \"#fff\",\n\t\t\t\t\ttransform: scale !== 1 ? `scale(${scale})` : undefined,\n\t\t\t\t\ttransformOrigin: \"top center\",\n\t\t\t\t\t...STACKING_ISOLATION_STYLE,\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<GridLayer\n\t\t\t\t\tpaperPx={paperPx}\n\t\t\t\t\tgridPosPx={gridPosPx}\n\t\t\t\t\tgridDimensions={{\n\t\t\t\t\t\tcols: expandedCols,\n\t\t\t\t\t\trows: expandedRows,\n\t\t\t\t\t}}\n\t\t\t\t\tshowGridLines={true}\n\t\t\t\t\tshowMargins={true}\n\t\t\t\t\tshowBorder={true}\n\t\t\t\t\tshowResizeHandles={true}\n\t\t\t\t\tshowDimensionLabels={true}\n\t\t\t\t\tonGridResize={handleGridResize}\n\t\t\t\t\tonDimensionChange={handleDimensionChange}\n\t\t\t\t\tgridLineStyle={{\n\t\t\t\t\t\tcolor: \"#e5e7eb\",\n\t\t\t\t\t\twidth: { value: 1, unit: \"px\" },\n\t\t\t\t\t\ttype: LineType.SOLID,\n\t\t\t\t\t}}\n\t\t\t\t\tborderStyle={{\n\t\t\t\t\t\ttop: {\n\t\t\t\t\t\t\tcolor: \"#000000\",\n\t\t\t\t\t\t\twidth: { value: 1, unit: \"px\" },\n\t\t\t\t\t\t\ttype: LineType.SOLID,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tright: {\n\t\t\t\t\t\t\tcolor: \"#000000\",\n\t\t\t\t\t\t\twidth: { value: 1, unit: \"px\" },\n\t\t\t\t\t\t\ttype: LineType.SOLID,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tbottom: {\n\t\t\t\t\t\t\tcolor: \"#000000\",\n\t\t\t\t\t\t\twidth: { value: 1, unit: \"px\" },\n\t\t\t\t\t\t\ttype: LineType.SOLID,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tleft: {\n\t\t\t\t\t\t\tcolor: \"#000000\",\n\t\t\t\t\t\t\twidth: { value: 1, unit: \"px\" },\n\t\t\t\t\t\t\ttype: LineType.SOLID,\n\t\t\t\t\t\t},\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t\t<BlockLayer\n\t\t\t\t\tblocks={page.blocks}\n\t\t\t\t\tpluginRegistry={pluginRegistry}\n\t\t\t\t\tmode={NoteMode.FORM}\n\t\t\t\t\tvalues={visibleValues}\n\t\t\t\t\tselectedBlockIds={selectedBlockIds}\n\t\t\t\t\tblockDefaults={page.blockDefaults}\n\t\t\t\t\tgetBlockRectPx={getBlockRectPx}\n\t\t\t\t\tonValueChange={handleInitValueChange}\n\t\t\t\t\tonMeasureHeight={handleMeasureHeight}\n\t\t\t\t\tonMeasureWidth={handleMeasureWidth}\n\t\t\t\t\tshowGuides={true}\n\t\t\t\t\tshowBorder={true}\n\t\t\t\t/>\n\t\t\t\t<InteractionLayer\n\t\t\t\t\tpage={page}\n\t\t\t\t\tgridLength={{\n\t\t\t\t\t\tcols: page.grid.colCount,\n\t\t\t\t\t\trows: page.grid.rowCount,\n\t\t\t\t\t}}\n\t\t\t\t\tpluginRegistry={pluginRegistry}\n\t\t\t\t\tblockDefaults={page.blockDefaults}\n\t\t\t\t\tgetBlockRectPx={getAdjustedBlockRectPx}\n\t\t\t\t\tgetColIndex={getColIndex}\n\t\t\t\t\tgetRowIndex={getRowIndex}\n\t\t\t\t\tselectedBlockIds={selectedBlockIds}\n\t\t\t\t\tonSelectionChange={onSelectionChange}\n\t\t\t\t\tstate={interactionState}\n\t\t\t\t\tonStateChange={onStateChange}\n\t\t\t\t\tonPageChange={onPageChange}\n\t\t\t\t\tactionContext={actionContext}\n\t\t\t\t\tscale={scale}\n\t\t\t\t/>\n\t\t\t</section>\n\t\t</PluginRegistryContext.Provider>\n\t);\n});\n","import { memo } from \"react\";\n\nimport { BlockLayer, GridLayer } from \"../../canvas/layers\";\nimport { PluginRegistryContext } from \"../../plugin/context\";\nimport { NoteMode } from \"../../types/mode\";\nimport { STACKING_ISOLATION_STYLE } from \"../../utils/zIndex\";\nimport { useNoteLayout } from \"../hooks/useNoteLayout\";\n\nimport type { NoteContext } from \"../../contexts/useNoteContext\";\nimport type { PluginRegistry } from \"../../plugin/registry\";\nimport type { Book } from \"../../types/schema\";\nimport type { Value } from \"../../types/value\";\n\n/**\n * {@link NoteViewProps} の共通フィールド\n *\n * @internal\n */\ninterface NoteViewPropsBase {\n\t/** `true` のときバリデーションエラーを表示する(デフォルト: false)。 */\n\tshowValidation?: boolean;\n\n\t/** 表示倍率(デフォルト: 1)。 */\n\tscale?: number;\n\n\t/** ルート要素に追加する className。 */\n\tclassName?: string;\n}\n\n/**\n * `context` ありの場合の props。`book` / `pluginRegistry` は `context` から取得する。\n *\n * @internal\n */\ninterface NoteViewPropsWithContext extends NoteViewPropsBase {\n\t/** `useNoteContext` が返すコンテキスト。バインディング・アクション・ページ選択が有効になる。 */\n\tcontext: NoteContext;\n\n\t/** `context` がある場合は渡せない(型は `never`)。値は `context.values` から取得される。 */\n\tvalues?: never;\n}\n\n/**\n * `book` ありの場合の props。`context` は渡せない。\n *\n * @internal\n */\ninterface NoteViewPropsWithBook extends NoteViewPropsBase {\n\tcontext?: never;\n\n\t/** Book(用紙設定・ページを含む)。 */\n\tbook: Book;\n\n\t/** ブロックプラグインのレジストリ(`createPluginRegistry` で生成)。 */\n\tpluginRegistry: PluginRegistry;\n\n\t/** ブロックの入力値。省略時は `initValue` のみが表示される。 */\n\tvalues?: Record<string, Value>;\n\n\t/** 表示するページインデックス(デフォルト: 0)。複数ページ Book の特定ページを静的表示する場合に指定する。 */\n\tpageIdx?: number;\n}\n\n/**\n * {@link NoteView} の props。`context` か `book` のどちらか一方が必須。\n */\nexport type NoteViewProps = NoteViewPropsWithContext | NoteViewPropsWithBook;\n\n/**\n * 閲覧モード(VIEW モード)専用コンポーネント。\n *\n * すべて読み取り専用。ブロックの配置変更・値の編集は不可。\n *\n * `context` は省略可能。省略した場合、`book` と `values` を渡すだけで静的表示できる。\n * `context` を渡した場合はバインディング・アクション・ページ選択が有効になる。\n *\n * @remarks 通常は {@link Note} を `mode={NoteMode.VIEW}` で使用する。\n */\nexport const NoteView = memo(function NoteView(props: NoteViewProps) {\n\tconst book = props.context !== undefined ? props.context.book : props.book;\n\tconst pluginRegistry =\n\t\tprops.context !== undefined\n\t\t\t? props.context.pluginRegistry\n\t\t\t: props.pluginRegistry;\n\tconst values = props.context?.values ?? props.values ?? {};\n\tconst showValidation = props.showValidation ?? false;\n\tconst scale = props.scale ?? 1.0;\n\tconst { className } = props;\n\tconst bindingContext = props.context?.bindingContext;\n\tconst actionContext = props.context?.actionContext;\n\n\tconst {\n\t\tpage,\n\t\tisFit,\n\t\tisWidthFit,\n\t\tgridPosPx,\n\t\tgetBlockRectPx,\n\t\thandleMeasureHeight,\n\t\thandleMeasureWidth,\n\t\tcanvasHeightPx,\n\t\tcanvasWidthPx,\n\t\teffectivePaperPx,\n\t\tvalidationErrors,\n\t} = useNoteLayout({\n\t\tbook,\n\t\tpageIdx:\n\t\t\tprops.context !== undefined\n\t\t\t\t? props.context.editorState.pageIdx\n\t\t\t\t: (props.pageIdx ?? 0),\n\t\tshowValidation,\n\t\tvalues,\n\t\tbindingContext,\n\t});\n\n\treturn (\n\t\t<PluginRegistryContext.Provider value={pluginRegistry}>\n\t\t\t<div\n\t\t\t\tdata-testid=\"note-container\"\n\t\t\t\tclassName={className}\n\t\t\t\tstyle={{\n\t\t\t\t\tposition: \"relative\",\n\t\t\t\t\twidth: `${canvasWidthPx}px`,\n\t\t\t\t\theight: `${canvasHeightPx}px`,\n\t\t\t\t\tmargin: \"0 auto\",\n\t\t\t\t\tboxShadow: \"0 2px 8px rgba(0,0,0,0.1)\",\n\t\t\t\t\tbackgroundColor: \"#fff\",\n\t\t\t\t\ttransform: scale !== 1 ? `scale(${scale})` : undefined,\n\t\t\t\t\ttransformOrigin: \"top center\",\n\t\t\t\t\t...STACKING_ISOLATION_STYLE,\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<GridLayer\n\t\t\t\t\tpaperPx={effectivePaperPx}\n\t\t\t\t\tgridPosPx={gridPosPx}\n\t\t\t\t\tshowGridLines={false}\n\t\t\t\t\tshowMargins={false}\n\t\t\t\t\tshowBorder={false}\n\t\t\t\t/>\n\t\t\t\t<BlockLayer\n\t\t\t\t\tblocks={page.blocks}\n\t\t\t\t\tpluginRegistry={pluginRegistry}\n\t\t\t\t\tmode={NoteMode.VIEW}\n\t\t\t\t\tvalues={values}\n\t\t\t\t\tblockDefaults={page.blockDefaults}\n\t\t\t\t\tgetBlockRectPx={getBlockRectPx}\n\t\t\t\t\tonMeasureHeight={isFit ? handleMeasureHeight : undefined}\n\t\t\t\t\tonMeasureWidth={isWidthFit ? handleMeasureWidth : undefined}\n\t\t\t\t\tshowGuides={false}\n\t\t\t\t\tshowBorder={true}\n\t\t\t\t\tshowValidation={showValidation}\n\t\t\t\t\tvalidationErrors={validationErrors}\n\t\t\t\t\tbindingContext={bindingContext}\n\t\t\t\t\tactionContext={actionContext}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</PluginRegistryContext.Provider>\n\t);\n});\n","import { NoteMode } from \"../../types/mode\";\nimport { STACKING_ISOLATION_STYLE } from \"../../utils/zIndex\";\nimport { NoteEdit } from \"../NoteEdit\";\nimport { NoteForm } from \"../NoteForm\";\nimport { NoteView } from \"../NoteView\";\n\nimport type { NoteProps } from \"../types\";\n\n/**\n * `mode` prop で FORM / EDIT / VIEW を切り替えられる統一 Note コンポーネント。\n *\n * 内部で `NoteForm` / `NoteEdit` / `NoteView` への薄いラッパーとして機能する。\n * 印刷は `printNote(context)` で起動できる。\n */\nexport function Note({\n\tcontext,\n\tmode,\n\tclassName,\n\tstyle,\n\tshowValidation,\n\tscale,\n}: NoteProps) {\n\tif (mode === NoteMode.FORM) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tstyle={{ ...style, ...STACKING_ISOLATION_STYLE }}\n\t\t\t\tclassName={className}\n\t\t\t>\n\t\t\t\t<NoteForm scale={scale} context={context} />\n\t\t\t</div>\n\t\t);\n\t}\n\n\tif (mode === NoteMode.VIEW) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tstyle={{ ...style, ...STACKING_ISOLATION_STYLE }}\n\t\t\t\tclassName={className}\n\t\t\t>\n\t\t\t\t<NoteView\n\t\t\t\t\tshowValidation={showValidation}\n\t\t\t\t\tscale={scale}\n\t\t\t\t\tcontext={context}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t);\n\t}\n\n\t// NoteMode.EDIT (デフォルト)\n\treturn (\n\t\t<div\n\t\t\tstyle={{ ...style, ...STACKING_ISOLATION_STYLE }}\n\t\t\tclassName={className}\n\t\t>\n\t\t\t<NoteEdit\n\t\t\t\tshowValidation={showValidation}\n\t\t\t\tscale={scale}\n\t\t\t\tcontext={context}\n\t\t\t/>\n\t\t</div>\n\t);\n}\n","import type { ActionContext, BindingContext } from \"../../../types/context\";\nimport type { ButtonActionProps } from \"./props\";\n\n/**\n * @internal\n * ButtonActionProps から取得したアクション指定の型エイリアス\n */\ntype ButtonAction = ButtonActionProps[\"action\"];\n\n/**\n * @internal\n * executeButtonAction / isButtonActionEnabled に渡す実行コンテキスト\n */\ninterface ExecuteContext {\n\tactionContext?: ActionContext;\n\tbindingContext?: BindingContext;\n\tonChange: (value: null) => void;\n}\n\n/**\n * ボタンの `action` 設定に応じてクリック時の処理を実行する。\n *\n * - 文字列 action: `actionContext.execute` を呼び出す\n * - オブジェクト action: `bindingContext.set` で指定パスに値をセットする\n * - どちらでもない場合: `onChange(null)` を呼び出す\n *\n * @remarks\n * **Canvas** — カスタムプラグイン実装者向け\n */\nexport function executeButtonAction(\n\taction: ButtonAction,\n\t{ actionContext, bindingContext, onChange }: ExecuteContext,\n): void {\n\tif (typeof action === \"string\") {\n\t\tif (action && actionContext) {\n\t\t\tactionContext.execute(action);\n\t\t} else {\n\t\t\tonChange(null);\n\t\t}\n\t\treturn;\n\t}\n\tif (action != null && bindingContext != null) {\n\t\tbindingContext.set(action.path, action.value);\n\t\treturn;\n\t}\n\tonChange(null);\n}\n\n/**\n * ボタンの `action` が現在有効か(クリック可能状態か)を返す。\n *\n * @remarks\n * **Canvas** — カスタムプラグイン実装者向け\n */\nexport function isButtonActionEnabled(\n\taction: ButtonAction,\n\tactionContext: ActionContext | undefined,\n): boolean {\n\tif (typeof action !== \"string\") return true;\n\tif (!action || !actionContext) return true;\n\treturn actionContext.isEnabled(action);\n}\n\n/**\n * ボタンの `action` がアクティブ状態か(トグル選択中か)を返す。\n *\n * オブジェクト形式の action でバインディング値と一致する場合に `true` を返す。\n *\n * @remarks\n * **Canvas** — カスタムプラグイン実装者向け\n */\nexport function getButtonActionActive(\n\taction: ButtonAction,\n\tbindingContext: BindingContext | undefined,\n): boolean {\n\tif (action == null || typeof action !== \"object\" || bindingContext == null) {\n\t\treturn false;\n\t}\n\treturn bindingContext.get(action.path) === action.value;\n}\n","import type { PropDef } from \"../../../plugin\";\nimport type { Value } from \"../../../types/value\";\n\n/**\n * ボタンの表示内容(ラベル・アイコン)props。\n */\nexport interface ButtonContentProps {\n\t/** ボタンに表示するテキスト。 */\n\tlabel?: string;\n\n\t/** アイコン文字列(Unicode 絵文字等を `<span>` テキストとして表示)。 */\n\ticon?: string;\n\n\t/** SVG パスデータ。`icon` より優先される。 */\n\ticonPath?: string;\n\n\t/** ツールチップに表示するテキスト。 */\n\ttitle?: string;\n}\n\n/**\n * `buttonContent` prop 定義。\n *\n * @remarks\n * **Canvas** — カスタムプラグイン専用。\n */\nexport const buttonContentProp = {\n\tkind: \"buttonContent\",\n\tdefaultProps: {\n\t\tlabel: \"ボタン\",\n\t\ticon: \"\",\n\t\ticonPath: \"\",\n\t\ttitle: \"\",\n\t},\n} satisfies PropDef;\n\n/**\n * ボタンクリック時のアクション設定 props。\n */\nexport interface ButtonActionProps {\n\t/** クリック時のアクション。文字列の場合はパス評価、オブジェクトの場合は指定パスへ値をセットする。 */\n\taction?: string | { path: string; value: Value };\n}\n\n/**\n * `buttonAction` prop 定義。\n *\n * @remarks\n * **Canvas** — カスタムプラグイン専用。\n */\nexport const buttonActionProp = {\n\tkind: \"buttonAction\",\n\tdefaultProps: {\n\t\taction: \"\",\n\t},\n} satisfies PropDef;\n","import {\n\ttype CSSProperties,\n\tforwardRef,\n\tuseCallback,\n\tuseImperativeHandle,\n\tuseMemo,\n\tuseRef,\n\tuseState,\n} from \"react\";\n\nimport {\n\tHorizontalAlign,\n\tVerticalAlign,\n} from \"../../../plugin/properties/alignment\";\nimport { dimensionToString } from \"../../../utils\";\nimport {\n\texecuteButtonAction,\n\tgetButtonActionActive,\n\tisButtonActionEnabled,\n} from \"./execute\";\n\nimport type { BlockRef, RendererProps } from \"../../../plugin/types\";\nimport type { ButtonBlockProps, ButtonBlockValue } from \"./types\";\n\n/**\n * @internal\n * HorizontalAlign → CSS justifyContent のマッピングテーブル\n */\nconst H_ALIGN_CSS: Record<HorizontalAlign, CSSProperties[\"justifyContent\"]> = {\n\t[HorizontalAlign.left]: \"flex-start\",\n\t[HorizontalAlign.center]: \"center\",\n\t[HorizontalAlign.right]: \"flex-end\",\n};\n\n/**\n * @internal\n * VerticalAlign → CSS alignItems のマッピングテーブル\n */\nconst V_ALIGN_CSS: Record<VerticalAlign, CSSProperties[\"alignItems\"]> = {\n\t[VerticalAlign.top]: \"flex-start\",\n\t[VerticalAlign.center]: \"center\",\n\t[VerticalAlign.bottom]: \"flex-end\",\n};\n\n/**\n * ボタンブロックのレンダラーコンポーネント。\n *\n * `action` props に応じてクリック時にバインディング操作またはアクション実行を行う。\n *\n * @remarks\n * **Canvas** — ButtonPlugin と組み合わせて使用する実装コンポーネント。\n */\nexport const ButtonRenderer = forwardRef<\n\tBlockRef,\n\tRendererProps<ButtonBlockProps, ButtonBlockValue>\n>(\n\t(\n\t\t{ props, readOnly, onChange, ariaLabel, actionContext, bindingContext },\n\t\tref,\n\t) => {\n\t\tconst buttonRef = useRef<HTMLButtonElement>(null);\n\t\tconst [pressed, setPressed] = useState(false);\n\n\t\tuseImperativeHandle(\n\t\t\tref,\n\t\t\t() => ({ focus: () => buttonRef.current?.focus() }),\n\t\t\t[],\n\t\t);\n\n\t\tconst isActionEnabled = isButtonActionEnabled(props.action, actionContext);\n\t\tconst isDisabled = readOnly || !isActionEnabled;\n\t\tconst isActive = getButtonActionActive(props.action, bindingContext);\n\n\t\tconst handleClick = useCallback(() => {\n\t\t\tif (isDisabled) return;\n\t\t\texecuteButtonAction(props.action, {\n\t\t\t\tactionContext,\n\t\t\t\tbindingContext,\n\t\t\t\tonChange,\n\t\t\t});\n\t\t}, [isDisabled, props.action, actionContext, bindingContext, onChange]);\n\n\t\tconst handlePointerDown = useCallback(() => {\n\t\t\tif (!isDisabled) setPressed(true);\n\t\t}, [isDisabled]);\n\n\t\tconst handlePointerUp = useCallback(() => setPressed(false), []);\n\n\t\tconst containerStyle = useMemo((): CSSProperties => {\n\t\t\tconst css: CSSProperties = {\n\t\t\t\twidth: \"100%\",\n\t\t\t\theight: \"100%\",\n\t\t\t\tboxSizing: \"border-box\",\n\t\t\t\toverflow: \"hidden\",\n\t\t\t\tcursor: isDisabled ? \"default\" : \"pointer\",\n\t\t\t\tuserSelect: \"none\",\n\t\t\t\toutline: \"none\",\n\t\t\t\tappearance: \"none\",\n\t\t\t\tborder: \"none\",\n\t\t\t\tbackground: \"none\",\n\t\t\t\topacity: isDisabled ? 0.4 : pressed ? 0.7 : isActive ? 0.85 : 1,\n\t\t\t\ttransform: pressed ? \"scale(0.97)\" : \"scale(1)\",\n\t\t\t\ttransition: pressed\n\t\t\t\t\t? \"none\"\n\t\t\t\t\t: \"opacity 150ms ease, transform 150ms ease\",\n\t\t\t};\n\n\t\t\tif (props.iconPath) {\n\t\t\t\tcss.display = \"flex\";\n\t\t\t\tcss.alignItems = V_ALIGN_CSS[props.vertical ?? VerticalAlign.center];\n\t\t\t\tcss.justifyContent =\n\t\t\t\t\tH_ALIGN_CSS[props.horizontal ?? HorizontalAlign.center];\n\t\t\t\tcss.containerType = \"size\";\n\t\t\t\tcss.color = \"inherit\";\n\t\t\t} else if (props.icon && !props.label) {\n\t\t\t\tcss.display = \"flex\";\n\t\t\t\tcss.alignItems = V_ALIGN_CSS[props.vertical ?? VerticalAlign.center];\n\t\t\t\tcss.justifyContent =\n\t\t\t\t\tH_ALIGN_CSS[props.horizontal ?? HorizontalAlign.center];\n\t\t\t\tcss.containerType = \"size\";\n\t\t\t\tcss.fontFamily = \"inherit\";\n\t\t\t\tcss.color = \"inherit\";\n\t\t\t} else {\n\t\t\t\tcss.display = \"flex\";\n\t\t\t\tcss.alignItems = V_ALIGN_CSS[props.vertical ?? VerticalAlign.center];\n\t\t\t\tcss.justifyContent =\n\t\t\t\t\tH_ALIGN_CSS[props.horizontal ?? HorizontalAlign.center];\n\t\t\t\tcss.gap = \"4px\";\n\t\t\t\tcss.fontFamily = \"inherit\";\n\t\t\t\tcss.fontSize = \"inherit\";\n\t\t\t\tcss.color = \"inherit\";\n\t\t\t}\n\n\t\t\tconst padAll = props.bulk ? props.all : undefined;\n\t\t\tconst padTop = padAll ?? props.top;\n\t\t\tconst padRight = padAll ?? props.right;\n\t\t\tconst padBottom = padAll ?? props.bottom;\n\t\t\tconst padLeft = padAll ?? props.left;\n\t\t\tif (padTop) css.paddingTop = dimensionToString(padTop);\n\t\t\tif (padRight) css.paddingRight = dimensionToString(padRight);\n\t\t\tif (padBottom) css.paddingBottom = dimensionToString(padBottom);\n\t\t\tif (padLeft) css.paddingLeft = dimensionToString(padLeft);\n\n\t\t\treturn css;\n\t\t}, [props, isDisabled, pressed, isActive]);\n\n\t\treturn (\n\t\t\t<button\n\t\t\t\tref={buttonRef}\n\t\t\t\ttype=\"button\"\n\t\t\t\tdisabled={isDisabled}\n\t\t\t\taria-pressed={isActive ? true : undefined}\n\t\t\t\taria-label={ariaLabel ?? props.label ?? \"ボタン\"}\n\t\t\t\ttitle={props.title}\n\t\t\t\tstyle={containerStyle}\n\t\t\t\tonClick={handleClick}\n\t\t\t\tonPointerDown={handlePointerDown}\n\t\t\t\tonPointerUp={handlePointerUp}\n\t\t\t\tonPointerLeave={handlePointerUp}\n\t\t\t\tonKeyDown={(e) => {\n\t\t\t\t\tif (e.key === \"Enter\" || e.key === \" \") {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\thandleClick();\n\t\t\t\t\t}\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t{props.iconPath ? (\n\t\t\t\t\t<svg\n\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tdisplay: \"block\",\n\t\t\t\t\t\t\tmargin: \"auto\",\n\t\t\t\t\t\t\twidth: \"min(55cqi, 55cqb)\",\n\t\t\t\t\t\t\theight: \"min(55cqi, 55cqb)\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<path d={props.iconPath} fill=\"currentColor\" />\n\t\t\t\t\t</svg>\n\t\t\t\t) : props.icon ? (\n\t\t\t\t\t<span\n\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\tstyle={\n\t\t\t\t\t\t\t!props.label\n\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\tdisplay: \"block\",\n\t\t\t\t\t\t\t\t\t\twidth: \"100%\",\n\t\t\t\t\t\t\t\t\t\ttextAlign: \"center\",\n\t\t\t\t\t\t\t\t\t\tfontSize: \"min(55cqi, 55cqb)\",\n\t\t\t\t\t\t\t\t\t\tlineHeight: \"1\",\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t}\n\t\t\t\t\t>\n\t\t\t\t\t\t{props.icon}\n\t\t\t\t\t</span>\n\t\t\t\t) : null}\n\t\t\t\t{!props.iconPath && (props.label || !props.icon) && (\n\t\t\t\t\t<span>{props.label ?? \"ボタン\"}</span>\n\t\t\t\t)}\n\t\t\t</button>\n\t\t);\n\t},\n);\n\nButtonRenderer.displayName = \"ButtonRenderer\";\n","import { alignmentProp } from \"../../../plugin/properties/alignment\";\nimport { paddingProp } from \"../../../plugin/properties/padding\";\nimport { buttonActionProp, buttonContentProp } from \"./props\";\nimport { ButtonRenderer } from \"./renderer\";\n\nimport type { BlockPlugin } from \"../../../plugin/types\";\nimport type { ButtonBlockProps, ButtonBlockValue } from \"./types\";\n\n/**\n * ボタンブロックのプラグイン定義。\n *\n * `kind: \"button\"` で登録され、クリックで `action` prop に定義したバインディング操作を実行する。\n *\n * @remarks\n * **Canvas** — カスタムプラグインの実装例。\n *\n * 標準フォーム構築では `createPluginRegistry` に渡すだけで使用できる。\n */\nexport const ButtonPlugin: BlockPlugin<ButtonBlockProps, ButtonBlockValue> = {\n\tkind: \"button\",\n\tmeta: {\n\t\tdisplayName: \"ボタン\",\n\t\tdescription: \"クリックでアクションを実行するボタンブロック\",\n\t\tdefaultSize: { w: 2, h: 1 },\n\t},\n\tRenderer: ButtonRenderer,\n\tproperties: [alignmentProp, paddingProp, buttonContentProp, buttonActionProp],\n\tvalidateProps: (props: unknown): ButtonBlockProps => {\n\t\tif (typeof props !== \"object\" || props === null)\n\t\t\treturn {} as ButtonBlockProps;\n\t\treturn props as ButtonBlockProps;\n\t},\n\tvalidateValue: (): ButtonBlockValue => null,\n};\n","import type { Block } from \"../../../types/block\";\n\n/**\n * TextBlock を数値入力専用設定にしたブロック定義ヘルパー。\n *\n * @remarks\n * **Canvas** — カスタムシェル構築向レイアウトヘルパー。\n *\n * binding には数値を保持するパス(例: \"paper.size.width.value\")を渡す。\n *\n * 返り値のレイアウトはデフォルト `{ x:0, y:0, w:1, h:1 }` のため、\n * 複合 widget 内で spread して上書きすること。\n *\n * @example\n * ```ts\n * {\n * ...numberInputBlock(\"width-value\", \"paper.size.width.value\"),\n * layout: { x: 0, y: 0, w: 2, h: 1 },\n * }\n * ```\n */\nexport function numberInputBlock(id: string, binding: string): Block {\n\treturn {\n\t\tid,\n\t\tkind: \"text\",\n\t\tlayout: { x: 0, y: 0, w: 1, h: 1 },\n\t\tprops: {\n\t\t\tbinding,\n\t\t\tplaceholder: \"0\",\n\t\t\t// 整数・小数のみ許可(マイナス不可)\n\t\t\tpattern: \"^[0-9]*\\\\.?[0-9]*$\",\n\t\t\tmultiline: false,\n\t\t\thorizontal: \"right\",\n\t\t\tvertical: \"center\",\n\t\t\ttop: { value: 2, unit: \"px\" },\n\t\t\tright: { value: 5, unit: \"px\" },\n\t\t},\n\t};\n}\n","import type { Block } from \"../../../types/block\";\n\n// mm / cm / inch の選択肢\nconst UNIT_OPTIONS = [\n\t{ label: \"mm\", value: \"mm\" },\n\t{ label: \"cm\", value: \"cm\" },\n\t{ label: \"inch\", value: \"inch\" },\n];\n\n/**\n * SelectBlock を PaperUnit (mm / cm / inch) 選択専用設定にしたブロック定義ヘルパー。\n *\n * @remarks\n * **Canvas** — カスタムシェル構築向レイアウトヘルパー。\n *\n * binding には単位を保持するパス(例: \"paper.size.width.unit\")を渡す。\n *\n * 返り値のレイアウトはデフォルト `{ x:0, y:0, w:1, h:1 }` のため、\n * 複合 widget 内で spread して上書きすること。\n *\n * @example\n * ```ts\n * {\n * ...unitSelectBlock(\"width-unit\", \"paper.size.width.unit\"),\n * layout: { x: 2, y: 0, w: 1, h: 1 },\n * }\n * ```\n */\nexport function unitSelectBlock(id: string, binding: string): Block {\n\treturn {\n\t\tid,\n\t\tkind: \"select\",\n\t\tlayout: { x: 0, y: 0, w: 1, h: 1 },\n\t\tprops: {\n\t\t\tbinding,\n\t\t\tselectConfig: {\n\t\t\t\toptions: UNIT_OPTIONS,\n\t\t\t\tallowEmpty: false,\n\t\t\t\tdefaultValue: \"mm\",\n\t\t\t},\n\t\t\thorizontal: \"left\",\n\t\t\tleft: { value: 2, unit: \"px\" },\n\t\t},\n\t};\n}\n","import type { PropDef } from \"../../../plugin/types\";\n\n/**\n * ステッパーの矢印外観カスタマイズ設定。\n *\n * @remarks\n * **Canvas** — カスタムプラグイン実装時に利用すること。\n */\nexport interface StepperStyleConfig {\n\t/** 矢印の色(CSS 値 / `currentColor` も可)。 */\n\tarrowColor?: string;\n\n\t/** 矢印の幅(px)。 */\n\tarrowWidth?: number;\n\n\t/** 矢印の高さ(px)。 */\n\tarrowHeight?: number;\n\n\t/** 矢印と値表示領域の間距(px)。 */\n\tarrowGap?: number;\n}\n\n/**\n * ステッパーの数値範囲・ステップ幅の振る舞い props。\n *\n * @remarks\n * **Canvas** — カスタムプラグイン実装時に利用する。\n */\nexport interface StepperBehaviorProps {\n\t/** 1ステップ当たりの増減幅。デフォルト: 1。 */\n\tstep?: number;\n\n\t/** 入力可能な最小値。 */\n\tmin?: number;\n\n\t/** 入力可能な最大値。 */\n\tmax?: number;\n}\n\n/**\n * `stepperBehavior` prop 定義。\n *\n * @remarks\n * **Canvas** — カスタムプラグイン実装時に利用する。\n */\nexport const stepperBehaviorProp = {\n\tkind: \"stepperBehavior\",\n\tdefaultProps: {\n\t\tstep: 1,\n\t},\n} satisfies PropDef;\n\n/**\n * ステッパーブロックの外観カスタマイズ props。\n *\n * @remarks\n * **Canvas** — カスタムプラグイン実装時に利用する。\n */\nexport interface StepperStyleProps {\n\t/** 矢印外観カスタマイズ設定。 */\n\tstyleConfig?: StepperStyleConfig;\n}\n\n/**\n * `stepperStyle` prop 定義。\n *\n * @remarks\n * **Canvas** — カスタムプラグイン実装時に利用する。\n */\nexport const stepperStyleProp = {\n\tkind: \"stepperStyle\",\n\tdefaultProps: {\n\t\tstyleConfig: {\n\t\t\tarrowWidth: 50,\n\t\t\tarrowHeight: 25,\n\t\t\tarrowColor: \"currentColor\",\n\t\t\tarrowGap: 20,\n\t\t},\n\t},\n} satisfies PropDef;\n","/**\n * ステッパーの増減ロジック(純粋関数)\n *\n * @remarks\n * **Canvas** — カスタムプラグイン実装時に利用する純粹関数。\n *\n * 現在値に delta を加算し、min/max でクランプした結果を返す。\n */\nexport function clampStep(\n\tcurrent: number,\n\tdelta: number,\n\tmin?: number,\n\tmax?: number,\n): number {\n\tlet next = current + delta;\n\tif (max !== undefined) next = Math.min(max, next);\n\tif (min !== undefined) next = Math.max(min, next);\n\treturn next;\n}\n","import {\n\ttype CSSProperties,\n\tforwardRef,\n\tuseCallback,\n\tuseImperativeHandle,\n\tuseRef,\n\tuseState,\n} from \"react\";\n\nimport { clampStep } from \"./step\";\n\nimport type { BlockRef, RendererProps } from \"../../../plugin/types\";\nimport type { StepperBlockProps, StepperBlockValue } from \"./types\";\n\n// UP_PATH: 上向き三角矢印の SVG パスデータ\nconst UP_PATH = \"M 10,0 L 20,10 L 0,10 Z\";\n// DOWN_PATH: 下向き三角矢印の SVG パスデータ\nconst DOWN_PATH = \"M 0,0 L 20,0 L 10,10 Z\";\n\n// buttonOverlayStyle: ステッパーの上・下ボタン共通のオーバーレイスタイルを生成する\nconst buttonOverlayStyle = (disabled: boolean): CSSProperties => ({\n\tposition: \"absolute\",\n\tleft: 0,\n\twidth: \"100%\",\n\theight: \"50%\",\n\tpadding: 0,\n\tborder: \"none\",\n\tbackground: \"none\",\n\tappearance: \"none\",\n\tcursor: disabled ? \"default\" : \"pointer\",\n\tboxSizing: \"border-box\",\n});\n\n/**\n * ステッパーブロックのレンダラーコンポーネント。\n *\n * 上下のボタンで数値を `step` 幅分増減し、`min`/`max` でクランプする。\n *\n * @remarks\n * **Canvas** — `StepperPlugin` と組み合わせて使用する実装コンポーネント。\n */\nexport const StepperRenderer = forwardRef<\n\tBlockRef,\n\tRendererProps<StepperBlockProps, StepperBlockValue>\n>(({ props, value, onChange, readOnly }, ref) => {\n\tconst divRef = useRef<HTMLDivElement>(null);\n\tconst [pressedUp, setPressedUp] = useState(false);\n\tconst [pressedDown, setPressedDown] = useState(false);\n\n\tconst isDisabled = readOnly;\n\tconst step = props.step ?? 1;\n\tconst arrowColor = props.styleConfig?.arrowColor ?? \"currentColor\";\n\tconst arrowWidth = props.styleConfig?.arrowWidth ?? 50;\n\tconst arrowHeight = props.styleConfig?.arrowHeight ?? 25;\n\tconst arrowGap = props.styleConfig?.arrowGap ?? 20;\n\tconst arrowLeft = (100 - arrowWidth) / 2;\n\n\tuseImperativeHandle(\n\t\tref,\n\t\t() => ({\n\t\t\tfocus: () => divRef.current?.querySelector(\"button\")?.focus(),\n\t\t}),\n\t\t[],\n\t);\n\n\tconst apply = useCallback(\n\t\t(delta: number) => {\n\t\t\tif (isDisabled) return;\n\t\t\tconst cur = Number(value ?? 0);\n\t\t\tconst next = clampStep(cur, delta, props.min, props.max);\n\t\t\tonChange(next);\n\t\t},\n\t\t[isDisabled, value, onChange, props.min, props.max],\n\t);\n\n\tconst handleUp = useCallback(() => apply(step), [apply, step]);\n\tconst handleDown = useCallback(() => apply(-step), [apply, step]);\n\n\tconst svgFeedback = (pressed: boolean): CSSProperties => ({\n\t\topacity: isDisabled ? 0.4 : pressed ? 0.6 : 1,\n\t\ttransform: pressed ? \"scale(0.9)\" : \"scale(1)\",\n\t\ttransition: pressed ? \"none\" : \"opacity 150ms ease, transform 150ms ease\",\n\t});\n\n\treturn (\n\t\t<div\n\t\t\tref={divRef}\n\t\t\tstyle={{\n\t\t\t\tposition: \"relative\",\n\t\t\t\twidth: \"100%\",\n\t\t\t\theight: \"100%\",\n\t\t\t\toverflow: \"visible\",\n\t\t\t\tcolor: arrowColor,\n\t\t\t}}\n\t\t>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tdisabled={isDisabled}\n\t\t\t\taria-label=\"増やす\"\n\t\t\t\tstyle={{ ...buttonOverlayStyle(isDisabled), top: 0 }}\n\t\t\t\tonClick={handleUp}\n\t\t\t\tonPointerDown={() => {\n\t\t\t\t\tif (!isDisabled) setPressedUp(true);\n\t\t\t\t}}\n\t\t\t\tonPointerUp={() => setPressedUp(false)}\n\t\t\t\tonPointerLeave={() => setPressedUp(false)}\n\t\t\t/>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tdisabled={isDisabled}\n\t\t\t\taria-label=\"減らす\"\n\t\t\t\tstyle={{ ...buttonOverlayStyle(isDisabled), bottom: 0 }}\n\t\t\t\tonClick={handleDown}\n\t\t\t\tonPointerDown={() => {\n\t\t\t\t\tif (!isDisabled) setPressedDown(true);\n\t\t\t\t}}\n\t\t\t\tonPointerUp={() => setPressedDown(false)}\n\t\t\t\tonPointerLeave={() => setPressedDown(false)}\n\t\t\t/>\n\t\t\t<svg\n\t\t\t\tviewBox=\"0 0 20 10\"\n\t\t\t\tpreserveAspectRatio=\"none\"\n\t\t\t\taria-hidden=\"true\"\n\t\t\t\tstyle={{\n\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\tleft: `${arrowLeft}%`,\n\t\t\t\t\tbottom: `calc(50% + ${arrowGap / 2}%)`,\n\t\t\t\t\twidth: `${arrowWidth}%`,\n\t\t\t\t\theight: `${arrowHeight}%`,\n\t\t\t\t\tpointerEvents: \"none\",\n\t\t\t\t\ttransformOrigin: \"center bottom\",\n\t\t\t\t\t...svgFeedback(pressedUp),\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<path d={UP_PATH} fill=\"currentColor\" />\n\t\t\t</svg>\n\t\t\t<svg\n\t\t\t\tviewBox=\"0 0 20 10\"\n\t\t\t\tpreserveAspectRatio=\"none\"\n\t\t\t\taria-hidden=\"true\"\n\t\t\t\tstyle={{\n\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\tleft: `${arrowLeft}%`,\n\t\t\t\t\ttop: `calc(50% + ${arrowGap / 2}%)`,\n\t\t\t\t\twidth: `${arrowWidth}%`,\n\t\t\t\t\theight: `${arrowHeight}%`,\n\t\t\t\t\tpointerEvents: \"none\",\n\t\t\t\t\ttransformOrigin: \"center top\",\n\t\t\t\t\t...svgFeedback(pressedDown),\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<path d={DOWN_PATH} fill=\"currentColor\" />\n\t\t\t</svg>\n\t\t</div>\n\t);\n});\n\nStepperRenderer.displayName = \"StepperRenderer\";\n","import { alignmentProp } from \"../../../plugin/properties/alignment\";\nimport { stepperBehaviorProp, stepperStyleProp } from \"./props\";\nimport { StepperRenderer } from \"./renderer\";\n\nimport type { BlockPlugin } from \"../../../plugin/types\";\nimport type { StepperBlockProps, StepperBlockValue } from \"./types\";\n\n/**\n * ステッパーブロックのプラグイン定義。\n *\n * `kind: \"stepper\"` で登録され、数値を±ボタンで増減する UI ブロック。\n *\n * @remarks\n * **Canvas** — カスタムプラグインの実装例。\n *\n * ステッパー機能が必要なフォームに `createPluginRegistry` に渡す。\n *\n * 標準フォーム構築では `createPluginRegistry` に渡すだけで使用できる。\n */\nexport const StepperPlugin: BlockPlugin<StepperBlockProps, StepperBlockValue> =\n\t{\n\t\tkind: \"stepper\",\n\t\tmeta: {\n\t\t\tdisplayName: \"ステッパー\",\n\t\t\tdescription: \"数値を増減するステッパーブロック\",\n\t\t\tdefaultSize: { w: 1, h: 1 },\n\t\t},\n\t\tRenderer: StepperRenderer,\n\t\tproperties: [alignmentProp, stepperBehaviorProp, stepperStyleProp],\n\t\tvalidateProps: (props: unknown): StepperBlockProps => {\n\t\t\tif (typeof props !== \"object\" || props === null)\n\t\t\t\treturn {} as StepperBlockProps;\n\t\t\tconst p = props as Record<string, unknown>;\n\t\t\tif (\n\t\t\t\t\"styleConfig\" in p &&\n\t\t\t\t(typeof p.styleConfig !== \"object\" || p.styleConfig === null)\n\t\t\t) {\n\t\t\t\treturn { ...p, styleConfig: {} } as StepperBlockProps;\n\t\t\t}\n\t\t\treturn props as StepperBlockProps;\n\t\t},\n\t\tvalidateValue: (value: unknown): StepperBlockValue =>\n\t\t\ttypeof value === \"number\" ? value : null,\n\t};\n","import { PaperSizePreset } from \"../../../types/paper\";\nimport { StepperPlugin } from \"../../blocks/stepper\";\nimport { TextPlugin } from \"../../blocks/text\";\nimport { numberInputBlock } from \"../primitives/numberInputBlock\";\n\nimport type { WidgetDef } from \"../types\";\n\n// atom widget 共通のペーパー設定(高さ 8mm・余白なし・ autoFit)\nconst ATOM_PAPER = {\n\tsize: {\n\t\tpreset: PaperSizePreset.CUSTOM,\n\t\twidth: { value: 100, unit: \"mm\" as const },\n\t\theight: { value: 8, unit: \"mm\" as const },\n\t},\n\tmargin: {\n\t\ttop: { value: 0, unit: \"mm\" as const },\n\t\tright: { value: 0, unit: \"mm\" as const },\n\t\tbottom: { value: 0, unit: \"mm\" as const },\n\t\tleft: { value: 0, unit: \"mm\" as const },\n\t},\n\tautoHeight: true,\n\tautoWidth: true,\n};\n\n// atom widget 共通の 3 列グリッド設定\n// - 列 0 (1fr): ラベル\n// - 列 1 (1fr): numberInput\n// - 列 2 (8mm): stepper\nconst ATOM_GRID = {\n\tcolCount: 3,\n\trowCount: 1,\n\tcols: { 2: { value: 8, unit: \"mm\" as const } },\n} as const;\n\n/**\n * グリッド行数 atom widget。\n *\n * @remarks\n * **Canvas** — カスタムシェル構築専用。\n *\n * 3 列 × 1 行: [行数ラベル][数値入力][stepper]\n *\n * binding: `grid.rowCount`\n */\nexport const gridRowCountWidget: WidgetDef = {\n\tprops: {\n\t\tbook: {\n\t\t\tpaper: ATOM_PAPER,\n\t\t\tpages: [\n\t\t\t\t{\n\t\t\t\t\tgrid: ATOM_GRID,\n\t\t\t\t\tblocks: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"grid-row-count-label\",\n\t\t\t\t\t\t\tkind: \"text\",\n\t\t\t\t\t\t\tlayout: { x: 0, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t\tinitValue: \"行数\",\n\t\t\t\t\t\t\tbehavior: { readOnly: true },\n\t\t\t\t\t\t\tprops: { horizontal: \"center\", vertical: \"center\" },\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t...numberInputBlock(\"grid-row-count-value\", \"grid.rowCount\"),\n\t\t\t\t\t\t\tlayout: { x: 1, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"grid-row-count-stepper\",\n\t\t\t\t\t\t\tkind: \"stepper\",\n\t\t\t\t\t\t\tlayout: { x: 2, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t\tprops: { binding: \"grid.rowCount\", step: 1, min: 1 },\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},\n\t},\n\tplugins: [TextPlugin, StepperPlugin],\n};\n\n/**\n * グリッド列数 atom widget。\n *\n * @remarks\n * **Canvas** — カスタムシェル構築専用。\n *\n * 3 列 × 1 行: [列数ラベル][数値入力][stepper]\n *\n * binding: `grid.colCount`\n */\nexport const gridColCountWidget: WidgetDef = {\n\tprops: {\n\t\tbook: {\n\t\t\tpaper: ATOM_PAPER,\n\t\t\tpages: [\n\t\t\t\t{\n\t\t\t\t\tgrid: ATOM_GRID,\n\t\t\t\t\tblocks: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"grid-col-count-label\",\n\t\t\t\t\t\t\tkind: \"text\",\n\t\t\t\t\t\t\tlayout: { x: 0, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t\tinitValue: \"列数\",\n\t\t\t\t\t\t\tbehavior: { readOnly: true },\n\t\t\t\t\t\t\tprops: { horizontal: \"center\", vertical: \"center\" },\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t...numberInputBlock(\"grid-col-count-value\", \"grid.colCount\"),\n\t\t\t\t\t\t\tlayout: { x: 1, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"grid-col-count-stepper\",\n\t\t\t\t\t\t\tkind: \"stepper\",\n\t\t\t\t\t\t\tlayout: { x: 2, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t\tprops: { binding: \"grid.colCount\", step: 1, min: 1 },\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},\n\t},\n\tplugins: [TextPlugin, StepperPlugin],\n};\n\n/**\n * グリッド設定 compound widget。\n *\n * @remarks\n * カスタムシェル構築専用。\n *\n * gridRowCountWidget(行数)と gridColCountWidget(列数)を横並びにした\n *\n * 1 行 × 6 列構成。\n *\n * 列構成:\n * - 列 0 (1fr): 行数ラベル\n * - 列 1 (1fr): 行数 numberInput → `grid.rowCount`\n * - 列 2 (8mm): 行数 stepper → `grid.rowCount`\n * - 列 3 (1fr): 列数ラベル\n * - 列 4 (1fr): 列数 numberInput → `grid.colCount`\n * - 列 5 (8mm): 列数 stepper → `grid.colCount`\n */\nexport const gridSettingsWidget: WidgetDef = {\n\tprops: {\n\t\tbook: {\n\t\t\tpaper: ATOM_PAPER,\n\t\t\tpages: [\n\t\t\t\t{\n\t\t\t\t\tgrid: {\n\t\t\t\t\t\tcolCount: 6,\n\t\t\t\t\t\trowCount: 1,\n\t\t\t\t\t\tcols: {\n\t\t\t\t\t\t\t2: { value: 8, unit: \"mm\" },\n\t\t\t\t\t\t\t5: { value: 8, unit: \"mm\" },\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tblocks: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"grid-row-count-label\",\n\t\t\t\t\t\t\tkind: \"text\",\n\t\t\t\t\t\t\tlayout: { x: 0, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t\tinitValue: \"行数\",\n\t\t\t\t\t\t\tbehavior: { readOnly: true },\n\t\t\t\t\t\t\tprops: { horizontal: \"center\", vertical: \"center\" },\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t...numberInputBlock(\"grid-row-count-value\", \"grid.rowCount\"),\n\t\t\t\t\t\t\tlayout: { x: 1, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"grid-row-count-stepper\",\n\t\t\t\t\t\t\tkind: \"stepper\",\n\t\t\t\t\t\t\tlayout: { x: 2, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t\tprops: { binding: \"grid.rowCount\", step: 1, min: 1 },\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"grid-col-count-label\",\n\t\t\t\t\t\t\tkind: \"text\",\n\t\t\t\t\t\t\tlayout: { x: 3, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t\tinitValue: \"列数\",\n\t\t\t\t\t\t\tbehavior: { readOnly: true },\n\t\t\t\t\t\t\tprops: { horizontal: \"center\", vertical: \"center\" },\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t...numberInputBlock(\"grid-col-count-value\", \"grid.colCount\"),\n\t\t\t\t\t\t\tlayout: { x: 4, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"grid-col-count-stepper\",\n\t\t\t\t\t\t\tkind: \"stepper\",\n\t\t\t\t\t\t\tlayout: { x: 5, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t\tprops: { binding: \"grid.colCount\", step: 1, min: 1 },\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},\n\t},\n\tplugins: [TextPlugin, StepperPlugin],\n};\n","import {\n\tforwardRef,\n\tuseContext,\n\tuseEffect,\n\tuseImperativeHandle,\n\tuseMemo,\n\tuseRef,\n} from \"react\";\n\nimport { Note } from \"../../../note/Note\";\nimport { PluginRegistryContext } from \"../../../plugin/context\";\nimport { NoteMode } from \"../../../types/mode\";\nimport { DEFAULT_DPI, toPx } from \"../../../utils/convert\";\n\nimport type { NoteContext } from \"../../../contexts/useNoteContext\";\nimport type { BlockRef, RendererProps } from \"../../../plugin/types\";\nimport type {\n\tActionContext,\n\tBindingContext,\n\tEditorState,\n} from \"../../../types/context\";\nimport type { NoteBlockProps, NoteBlockValue } from \"./types\";\n\n/** @internal バインディング機能なしのデフォルト BindingContext(`bindingContext` 未指定時のフォールバック用) */\nconst NOOP_BINDING_CONTEXT: BindingContext = {\n\tget: () => null,\n\tset: () => {},\n};\n\n/** @internal アクション機能なしのデフォルト ActionContext(`actionContext` 未指定時のフォールバック用) */\nconst NOOP_ACTION_CONTEXT: ActionContext = {\n\texecute: () => {},\n\tisEnabled: () => false,\n};\n\n/** @internal 選択・ページ管理なしのデフォルト EditorState(スタンドアロン表示時のフォールバック用) */\nconst NOOP_EDITOR_STATE: EditorState = {\n\tselectedBlockIds: [],\n\tpageIdx: 0,\n};\n\n/**\n * ノートブロックのレンダラーコンポーネント。\n *\n * Book を内包し、ブロックのサイズに合わせてスケールしてグリッドをレンダリングする。\n *\n * @remarks\n * **Canvas** — `NoteBlockPlugin` と組み合わせて使用する実装コンポーネント。\n */\nexport const NoteBlockRenderer = forwardRef<\n\tBlockRef,\n\tRendererProps<NoteBlockProps, NoteBlockValue>\n>(\n\t(\n\t\t{\n\t\t\tprops,\n\t\t\tdimensions,\n\t\t\tbindingContext,\n\t\t\tactionContext,\n\t\t\tonMeasureHeight,\n\t\t\tonMeasureWidth,\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst pluginRegistry = useContext(PluginRegistryContext);\n\t\tuseImperativeHandle(ref, () => ({ focus: () => {} }), []);\n\n\t\tconst containerRef = useRef<HTMLDivElement | null>(null);\n\n\t\tconst { naturalWidth, naturalHeight, scale } = useMemo(() => {\n\t\t\tconst nw = toPx.fromDim(props.book.paper.size.width, DEFAULT_DPI);\n\t\t\tconst nh = toPx.fromDim(props.book.paper.size.height, DEFAULT_DPI);\n\t\t\tconst s =\n\t\t\t\tdimensions && nw > 0 && nh > 0\n\t\t\t\t\t? Math.min(\n\t\t\t\t\t\t\tdimensions.widthPx / nw,\n\t\t\t\t\t\t\tdimensions.heightPx / nh < 1 && nh - dimensions.heightPx < 1\n\t\t\t\t\t\t\t\t? 1\n\t\t\t\t\t\t\t\t: dimensions.heightPx / nh,\n\t\t\t\t\t\t)\n\t\t\t\t\t: 1;\n\t\t\treturn { naturalWidth: nw, naturalHeight: nh, scale: s };\n\t\t}, [props.book.paper, dimensions]);\n\n\t\tuseEffect(() => {\n\t\t\tonMeasureHeight?.(naturalHeight * scale);\n\t\t}, [onMeasureHeight, naturalHeight, scale]);\n\n\t\tuseEffect(() => {\n\t\t\tonMeasureWidth?.(naturalWidth * scale);\n\t\t}, [onMeasureWidth, naturalWidth, scale]);\n\n\t\tconst noteContext = useMemo<NoteContext | null>(() => {\n\t\t\tif (!pluginRegistry) return null;\n\t\t\treturn {\n\t\t\t\tbook: props.book,\n\t\t\t\tonBookChange: () => {},\n\t\t\t\tpluginRegistry,\n\t\t\t\tcontainerRef,\n\t\t\t\tbindingContext: bindingContext ?? NOOP_BINDING_CONTEXT,\n\t\t\t\tactionContext: actionContext ?? NOOP_ACTION_CONTEXT,\n\t\t\t\teditorState: NOOP_EDITOR_STATE,\n\t\t\t\tvalues: {},\n\t\t\t};\n\t\t}, [props.book, pluginRegistry, bindingContext, actionContext]);\n\n\t\tif (!noteContext) return null;\n\n\t\treturn (\n\t\t\t<div style={{ width: \"100%\", height: \"100%\", overflow: \"hidden\" }}>\n\t\t\t\t<Note\n\t\t\t\t\tmode={NoteMode.EDIT}\n\t\t\t\t\tcontext={noteContext}\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\twidth: naturalWidth,\n\t\t\t\t\t\theight: naturalHeight,\n\t\t\t\t\t\ttransform: `scale(${scale})`,\n\t\t\t\t\t\ttransformOrigin: \"top left\",\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t);\n\t},\n);\n\nNoteBlockRenderer.displayName = \"NoteBlockRenderer\";\n","import { DEFAULT_BOOK } from \"../../../types/schema\";\nimport { NoteBlockRenderer } from \"./renderer\";\n\nimport type { BlockPlugin } from \"../../../plugin/types\";\nimport type { NoteBlockProps, NoteBlockValue } from \"./types\";\n\n/**\n * ノートブロックのプラグイン定義。\n *\n * `kind: \"note\"` で登録され、Book を内包して別のグリッドをブロック内にレンダリングする。\n *\n * @remarks\n * **Canvas** — 入れ子グリッドユースケース向けのプラグイン。\n *\n * 標準フォーム構築では `createPluginRegistry` に渡すだけで使用できる。\n */\nexport const NoteBlockPlugin: BlockPlugin<NoteBlockProps, NoteBlockValue> = {\n\tkind: \"note\",\n\tmeta: {\n\t\tdisplayName: \"ノートブロック\",\n\t\tdescription: \"ブロックとして振る舞う Note(入れ子グリッド)\",\n\t\tdefaultSize: { w: 6, h: 4 },\n\t},\n\tRenderer: NoteBlockRenderer,\n\tproperties: [],\n\tvalidateProps: (props: unknown): NoteBlockProps => {\n\t\tif (\n\t\t\ttypeof props === \"object\" &&\n\t\t\tprops !== null &&\n\t\t\t\"book\" in props &&\n\t\t\ttypeof (props as { book: unknown }).book === \"object\" &&\n\t\t\t(props as { book: unknown }).book !== null\n\t\t) {\n\t\t\treturn props as NoteBlockProps;\n\t\t}\n\t\treturn { book: DEFAULT_BOOK };\n\t},\n\tvalidateValue: (): NoteBlockValue => null,\n};\n","import { PaperSizePreset } from \"../../../types/paper\";\nimport { CheckboxPlugin } from \"../../blocks/checkbox\";\nimport { NoteBlockPlugin } from \"../../blocks/note\";\nimport { SelectPlugin } from \"../../blocks/select\";\nimport { StepperPlugin } from \"../../blocks/stepper\";\nimport { TextPlugin } from \"../../blocks/text\";\nimport { numberInputBlock } from \"../primitives/numberInputBlock\";\nimport { unitSelectBlock } from \"../primitives/unitSelectBlock\";\n\nimport type { Block } from \"../../../types/block\";\nimport type { Value } from \"../../../types/value\";\nimport type { NoteBlockProps } from \"../../blocks/note\";\nimport type { WidgetDef } from \"../types\";\n\n// NoteBlockProps はランタイムには JSON 互換だが、TS が再帰型の静的証明をできないため\n// このヘルパー経由で単一箇所にキャストを限定する。\nfunction notePropsAsRecord(props: NoteBlockProps): Record<string, Value> {\n\t// NoteBlockProps は JSON 互換だが TS が再帰型の静的証明をできないため as unknown as が必要\n\treturn props as unknown as Record<string, Value>;\n}\n\n// Custom 選択時のみ行 2 を表示するための hiddenBinding。\n// `paper.size.preset` が \"Custom\" でない(neq)ときに非表示。\nconst HIDDEN_WHEN_NOT_CUSTOM = {\n\tpath: \"paper.size.preset\",\n\tneq: PaperSizePreset.CUSTOM,\n} as const;\n\n// 行 widget 共通のペーパー設定\nconst ROW_PAPER = {\n\tsize: {\n\t\tpreset: PaperSizePreset.CUSTOM,\n\t\twidth: { value: 160, unit: \"mm\" as const },\n\t\theight: { value: 10, unit: \"mm\" as const },\n\t},\n\tmargin: {\n\t\ttop: { value: 0, unit: \"mm\" as const },\n\t\tright: { value: 0, unit: \"mm\" as const },\n\t\tbottom: { value: 0, unit: \"mm\" as const },\n\t\tleft: { value: 0, unit: \"mm\" as const },\n\t},\n\tautoHeight: true,\n\tautoWidth: true,\n};\n\n// 行 0: プリセット選択 + 向き checkbox の 1 行 widget(内部用)\n// 8 列 × 1 行。col 7 のみ 15mm 固定(checkbox 用)。\n// [用紙サイズ ×2][preset select ×3][横向き ×2][checkbox ×1]\nconst PRESET_ORIENTATION_ROW: NoteBlockProps = {\n\tbook: {\n\t\tpaper: ROW_PAPER,\n\t\tpages: [\n\t\t\t{\n\t\t\t\tgrid: {\n\t\t\t\t\tcolCount: 8,\n\t\t\t\t\trowCount: 1,\n\t\t\t\t\tcols: { 7: { value: 15, unit: \"mm\" } },\n\t\t\t\t},\n\t\t\t\tblocks: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"paper-size-label\",\n\t\t\t\t\t\tkind: \"text\",\n\t\t\t\t\t\tlayout: { x: 0, y: 0, w: 2, h: 1 },\n\t\t\t\t\t\tinitValue: \"用紙サイズ\",\n\t\t\t\t\t\tbehavior: { readOnly: true },\n\t\t\t\t\t\tprops: { horizontal: \"center\", vertical: \"center\" },\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"paper-preset\",\n\t\t\t\t\t\tkind: \"select\",\n\t\t\t\t\t\tlayout: { x: 2, y: 0, w: 3, h: 1 },\n\t\t\t\t\t\tinitValue: PaperSizePreset.A4,\n\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\tbinding: \"paper.size.preset\",\n\t\t\t\t\t\t\trequired: true,\n\t\t\t\t\t\t\tleft: { value: 2, unit: \"px\" },\n\t\t\t\t\t\t\tselectConfig: {\n\t\t\t\t\t\t\t\toptions: [\n\t\t\t\t\t\t\t\t\t{ label: \"A4 (210×297mm)\", value: PaperSizePreset.A4 },\n\t\t\t\t\t\t\t\t\t{ label: \"A3 (297×420mm)\", value: PaperSizePreset.A3 },\n\t\t\t\t\t\t\t\t\t{ label: \"B5 (182×257mm)\", value: PaperSizePreset.B5 },\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tlabel: \"Letter (8.5×11inch)\",\n\t\t\t\t\t\t\t\t\t\tvalue: PaperSizePreset.LETTER,\n\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\tlabel: \"Legal (8.5×14inch)\",\n\t\t\t\t\t\t\t\t\t\tvalue: PaperSizePreset.LEGAL,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t{ label: \"カスタム\", value: PaperSizePreset.CUSTOM },\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\t{\n\t\t\t\t\t\tid: \"paper-orientation-label\",\n\t\t\t\t\t\tkind: \"text\",\n\t\t\t\t\t\tlayout: { x: 5, y: 0, w: 2, h: 1 },\n\t\t\t\t\t\tinitValue: \"横向き\",\n\t\t\t\t\t\tbehavior: { readOnly: true },\n\t\t\t\t\t\tprops: { horizontal: \"center\", vertical: \"center\" },\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"paper-orientation\",\n\t\t\t\t\t\tkind: \"checkbox\",\n\t\t\t\t\t\tlayout: { x: 7, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\tprops: { binding: \"paper.orientation\" },\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t},\n};\n\n// 行 1: 幅自動・高さ自動 checkbox の 1 行 widget(内部用)\n// 8 列 × 1 行。列 3・列 7 のみ 15mm 固定(checkbox 用)。\n// [幅自動 ×3][checkbox ×1][高さ自動 ×3][checkbox ×1]\nconst AUTO_RESIZE_ROW: NoteBlockProps = {\n\tbook: {\n\t\tpaper: ROW_PAPER,\n\t\tpages: [\n\t\t\t{\n\t\t\t\tgrid: {\n\t\t\t\t\tcolCount: 8,\n\t\t\t\t\trowCount: 1,\n\t\t\t\t\tcols: {\n\t\t\t\t\t\t3: { value: 15, unit: \"mm\" },\n\t\t\t\t\t\t7: { value: 15, unit: \"mm\" },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tblocks: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"paper-width-auto-label\",\n\t\t\t\t\t\tkind: \"text\",\n\t\t\t\t\t\tlayout: { x: 0, y: 0, w: 3, h: 1 },\n\t\t\t\t\t\tinitValue: \"幅自動\",\n\t\t\t\t\t\tbehavior: { readOnly: true },\n\t\t\t\t\t\tprops: { horizontal: \"center\", vertical: \"center\" },\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"paper-width-auto\",\n\t\t\t\t\t\tkind: \"checkbox\",\n\t\t\t\t\t\tlayout: { x: 3, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\tprops: { binding: \"paper.autoWidth\" },\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"paper-height-auto-label\",\n\t\t\t\t\t\tkind: \"text\",\n\t\t\t\t\t\tlayout: { x: 4, y: 0, w: 3, h: 1 },\n\t\t\t\t\t\tinitValue: \"高さ自動\",\n\t\t\t\t\t\tbehavior: { readOnly: true },\n\t\t\t\t\t\tprops: { horizontal: \"center\", vertical: \"center\" },\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"paper-height-auto\",\n\t\t\t\t\t\tkind: \"checkbox\",\n\t\t\t\t\t\tlayout: { x: 7, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\tprops: { binding: \"paper.autoHeight\" },\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t},\n};\n\n// 行 2(末尾): カスタム幅・高さ入力の 1 行 widget(内部用)\n// 8 列 × 1 行。stepper/unit 列は固定幅。\n// [幅/最低幅 ×1][幅数値 ×1][幅stepper(8mm)][幅単位(15mm)][高さ/最低高さ ×1][高さ数値 ×1][高さstepper(8mm)][高さ単位(15mm)]\n// 幅自動 ON 時はラベルが「幅」→「最低幅」に切り替わる(hiddenBinding 2 ブロック)。\nconst DIMENSION_ROW: NoteBlockProps = {\n\tbook: {\n\t\tpaper: ROW_PAPER,\n\t\tpages: [\n\t\t\t{\n\t\t\t\tgrid: {\n\t\t\t\t\tcolCount: 8,\n\t\t\t\t\trowCount: 1,\n\t\t\t\t\tcols: {\n\t\t\t\t\t\t2: { value: 8, unit: \"mm\" },\n\t\t\t\t\t\t3: { value: 15, unit: \"mm\" },\n\t\t\t\t\t\t6: { value: 8, unit: \"mm\" },\n\t\t\t\t\t\t7: { value: 15, unit: \"mm\" },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tblocks: [\n\t\t\t\t\t// 幅ラベル(幅自動 OFF のとき表示)\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"paper-width-label\",\n\t\t\t\t\t\tkind: \"text\",\n\t\t\t\t\t\tlayout: { x: 0, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\tinitValue: \"幅\",\n\t\t\t\t\t\tbehavior: { readOnly: true },\n\t\t\t\t\t\tprops: { horizontal: \"center\", vertical: \"center\" },\n\t\t\t\t\t\thiddenBinding: \"paper.autoWidth\",\n\t\t\t\t\t},\n\t\t\t\t\t// 最低幅ラベル(幅自動 ON のとき表示)\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"paper-width-label-min\",\n\t\t\t\t\t\tkind: \"text\",\n\t\t\t\t\t\tlayout: { x: 0, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\tinitValue: \"最低幅\",\n\t\t\t\t\t\tbehavior: { readOnly: true },\n\t\t\t\t\t\tprops: { horizontal: \"center\", vertical: \"center\" },\n\t\t\t\t\t\thiddenBinding: { path: \"paper.autoWidth\", neq: true },\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t...numberInputBlock(\"paper-width-value\", \"paper.size.width.value\"),\n\t\t\t\t\t\tlayout: { x: 1, y: 0, w: 1, h: 1 },\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"paper-width-stepper\",\n\t\t\t\t\t\tkind: \"stepper\",\n\t\t\t\t\t\tlayout: { x: 2, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\tprops: { binding: \"paper.size.width.value\", step: 1, min: 0 },\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t...unitSelectBlock(\"paper-width-unit\", \"paper.size.width.unit\"),\n\t\t\t\t\t\tlayout: { x: 3, y: 0, w: 1, h: 1 },\n\t\t\t\t\t},\n\t\t\t\t\t// 高さラベル(高さ自動 OFF のとき表示)\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"paper-height-label\",\n\t\t\t\t\t\tkind: \"text\",\n\t\t\t\t\t\tlayout: { x: 4, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\tinitValue: \"高さ\",\n\t\t\t\t\t\tbehavior: { readOnly: true },\n\t\t\t\t\t\tprops: { horizontal: \"center\", vertical: \"center\" },\n\t\t\t\t\t\thiddenBinding: \"paper.autoHeight\",\n\t\t\t\t\t},\n\t\t\t\t\t// 最低高さラベル(高さ自動 ON のとき表示)\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"paper-height-label-min\",\n\t\t\t\t\t\tkind: \"text\",\n\t\t\t\t\t\tlayout: { x: 4, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\tinitValue: \"最低高さ\",\n\t\t\t\t\t\tbehavior: { readOnly: true },\n\t\t\t\t\t\tprops: { horizontal: \"center\", vertical: \"center\" },\n\t\t\t\t\t\thiddenBinding: { path: \"paper.autoHeight\", neq: true },\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t...numberInputBlock(\n\t\t\t\t\t\t\t\"paper-height-value\",\n\t\t\t\t\t\t\t\"paper.size.height.value\",\n\t\t\t\t\t\t),\n\t\t\t\t\t\tlayout: { x: 5, y: 0, w: 1, h: 1 },\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"paper-height-stepper\",\n\t\t\t\t\t\tkind: \"stepper\",\n\t\t\t\t\t\tlayout: { x: 6, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\tprops: { binding: \"paper.size.height.value\", step: 1, min: 0 },\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t...unitSelectBlock(\"paper-height-unit\", \"paper.size.height.unit\"),\n\t\t\t\t\t\tlayout: { x: 7, y: 0, w: 1, h: 1 },\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t},\n};\n\n/**\n * 用紙設定 compound widget。\n * @remarks\n * カスタムシェル構築専用。\n *\n * * 3 つの行 widget を NoteBlock として縦に並べた外偵コンテナ。\n *\n * - 行 0(常に表示): PRESET_ORIENTATION_ROW\n * - 行 1(常に表示): AUTO_RESIZE_ROW\n * - 行 2(Custom 選択時のみ): DIMENSION_ROW ← 末尾・hiddenBinding で縮小\n *\n * binding:\n * - `paper.size.preset` / `paper.orientation`\n * - `paper.autoWidth` / `paper.autoHeight`\n * - `paper.size.width.value` / `.unit` / `paper.size.height.value` / `.unit`\n */\nexport const paperSettingsWidget: WidgetDef = {\n\tprops: {\n\t\tbook: {\n\t\t\tpaper: {\n\t\t\t\tsize: {\n\t\t\t\t\tpreset: PaperSizePreset.CUSTOM,\n\t\t\t\t\twidth: { value: 160, unit: \"mm\" },\n\t\t\t\t\theight: { value: 30, unit: \"mm\" },\n\t\t\t\t},\n\t\t\t\tmargin: {\n\t\t\t\t\ttop: { value: 0, unit: \"mm\" },\n\t\t\t\t\tright: { value: 0, unit: \"mm\" },\n\t\t\t\t\tbottom: { value: 0, unit: \"mm\" },\n\t\t\t\t\tleft: { value: 0, unit: \"mm\" },\n\t\t\t\t},\n\t\t\t\tautoHeight: true,\n\t\t\t\tautoWidth: true,\n\t\t\t},\n\t\t\tpages: [\n\t\t\t\t{\n\t\t\t\t\tgrid: {\n\t\t\t\t\t\tcolCount: 1,\n\t\t\t\t\t\trowCount: 3,\n\t\t\t\t\t\trows: {\n\t\t\t\t\t\t\t0: { value: 10, unit: \"mm\" },\n\t\t\t\t\t\t\t1: { value: 10, unit: \"mm\" },\n\t\t\t\t\t\t\t2: { value: 10, unit: \"mm\" },\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tblocks: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"row-preset-orientation\",\n\t\t\t\t\t\t\tkind: \"note\",\n\t\t\t\t\t\t\tlayout: { x: 0, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t\tbehavior: { heightFit: true },\n\t\t\t\t\t\t\tprops: notePropsAsRecord(PRESET_ORIENTATION_ROW),\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"row-auto-resize\",\n\t\t\t\t\t\t\tkind: \"note\",\n\t\t\t\t\t\t\tlayout: { x: 0, y: 1, w: 1, h: 1 },\n\t\t\t\t\t\t\tbehavior: { heightFit: true },\n\t\t\t\t\t\t\tprops: notePropsAsRecord(AUTO_RESIZE_ROW),\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"row-dimension\",\n\t\t\t\t\t\t\tkind: \"note\",\n\t\t\t\t\t\t\tlayout: { x: 0, y: 2, w: 1, h: 1 },\n\t\t\t\t\t\t\tbehavior: { heightFit: true },\n\t\t\t\t\t\t\tprops: notePropsAsRecord(DIMENSION_ROW),\n\t\t\t\t\t\t\thiddenBinding: HIDDEN_WHEN_NOT_CUSTOM,\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},\n\t},\n\tplugins: [\n\t\tCheckboxPlugin,\n\t\tNoteBlockPlugin,\n\t\tSelectPlugin,\n\t\tStepperPlugin,\n\t\tTextPlugin,\n\t],\n};\n\n// ============================================================================\n// Atom / 部品 widget\n// ============================================================================\n\n/**\n * 横向き checkbox atom widget。\n *\n * @remarks\n * **Canvas** — カスタムシェル構築専用。\n *\n * binding: `paper.orientation`(true = landscape, false = portrait)\n */\nexport const paperOrientationWidget: WidgetDef = {\n\tprops: {\n\t\tbook: {\n\t\t\tpaper: {\n\t\t\t\tsize: {\n\t\t\t\t\tpreset: PaperSizePreset.CUSTOM,\n\t\t\t\t\twidth: { value: 20, unit: \"mm\" },\n\t\t\t\t\theight: { value: 15, unit: \"mm\" },\n\t\t\t\t},\n\t\t\t\tmargin: {\n\t\t\t\t\ttop: { value: 0, unit: \"mm\" },\n\t\t\t\t\tright: { value: 0, unit: \"mm\" },\n\t\t\t\t\tbottom: { value: 0, unit: \"mm\" },\n\t\t\t\t\tleft: { value: 0, unit: \"mm\" },\n\t\t\t\t},\n\t\t\t\tautoHeight: true,\n\t\t\t\tautoWidth: true,\n\t\t\t},\n\t\t\tpages: [\n\t\t\t\t{\n\t\t\t\t\tgrid: { colCount: 1, rowCount: 1 },\n\t\t\t\t\tblocks: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"paper-orientation\",\n\t\t\t\t\t\t\tkind: \"checkbox\",\n\t\t\t\t\t\t\tlayout: { x: 0, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t\tprops: { binding: \"paper.orientation\" },\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},\n\t},\n\tplugins: [CheckboxPlugin],\n};\n\n/**\n * 用紙プリセット選択 atom widget。\n *\n * @remarks\n * **Canvas** — カスタムシェル構築専用。\n *\n * binding: `paper.size.preset`\n */\nexport const paperPresetSelectWidget: WidgetDef = {\n\tprops: {\n\t\tbook: {\n\t\t\tpaper: {\n\t\t\t\tsize: {\n\t\t\t\t\tpreset: PaperSizePreset.CUSTOM,\n\t\t\t\t\twidth: { value: 60, unit: \"mm\" },\n\t\t\t\t\theight: { value: 10, unit: \"mm\" },\n\t\t\t\t},\n\t\t\t\tmargin: {\n\t\t\t\t\ttop: { value: 0, unit: \"mm\" },\n\t\t\t\t\tright: { value: 0, unit: \"mm\" },\n\t\t\t\t\tbottom: { value: 0, unit: \"mm\" },\n\t\t\t\t\tleft: { value: 0, unit: \"mm\" },\n\t\t\t\t},\n\t\t\t\tautoHeight: true,\n\t\t\t\tautoWidth: true,\n\t\t\t},\n\t\t\tpages: [\n\t\t\t\t{\n\t\t\t\t\tgrid: { colCount: 1, rowCount: 1 },\n\t\t\t\t\tblocks: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"paper-preset\",\n\t\t\t\t\t\t\tkind: \"select\",\n\t\t\t\t\t\t\tlayout: { x: 0, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\t\tbinding: \"paper.size.preset\",\n\t\t\t\t\t\t\t\tselectConfig: {\n\t\t\t\t\t\t\t\t\toptions: [\n\t\t\t\t\t\t\t\t\t\t{ label: \"A4 (210×297mm)\", value: PaperSizePreset.A4 },\n\t\t\t\t\t\t\t\t\t\t{ label: \"A3 (297×420mm)\", value: PaperSizePreset.A3 },\n\t\t\t\t\t\t\t\t\t\t{ label: \"B5 (182×257mm)\", value: PaperSizePreset.B5 },\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tlabel: \"Letter (8.5×11inch)\",\n\t\t\t\t\t\t\t\t\t\t\tvalue: PaperSizePreset.LETTER,\n\t\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\t\tlabel: \"Legal (8.5×14inch)\",\n\t\t\t\t\t\t\t\t\t\t\tvalue: PaperSizePreset.LEGAL,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{ label: \"カスタム\", value: PaperSizePreset.CUSTOM },\n\t\t\t\t\t\t\t\t\t],\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},\n\t},\n\tplugins: [SelectPlugin],\n};\n\n/**\n * `paperSizeWidget` 内のブロック定義(再利用可能)。\n *\n * @remarks\n * **Canvas** — カスタムシェル構築専用。\n *\n * 4列×2行グリッド想定:\n * - 行 0: プリセット select(colspan: 4)\n * - 行 1: 幅value / 幅unit / 高さvalue / 高さunit(Custom 選択時のみ)\n */\nexport const PAPER_SIZE_BLOCKS: Block[] = [\n\t// 行 0: プリセット選択\n\t{\n\t\tid: \"paper-preset\",\n\t\tkind: \"select\",\n\t\tlayout: { x: 0, y: 0, w: 4, h: 1 },\n\t\tprops: {\n\t\t\tbinding: \"paper.size.preset\",\n\t\t\tselectConfig: {\n\t\t\t\toptions: [\n\t\t\t\t\t{ label: \"A4 (210×297mm)\", value: PaperSizePreset.A4 },\n\t\t\t\t\t{ label: \"A3 (297×420mm)\", value: PaperSizePreset.A3 },\n\t\t\t\t\t{ label: \"B5 (182×257mm)\", value: PaperSizePreset.B5 },\n\t\t\t\t\t{ label: \"Letter (8.5×11inch)\", value: PaperSizePreset.LETTER },\n\t\t\t\t\t{ label: \"Legal (8.5×14inch)\", value: PaperSizePreset.LEGAL },\n\t\t\t\t\t{ label: \"カスタム\", value: PaperSizePreset.CUSTOM },\n\t\t\t\t],\n\t\t\t},\n\t\t},\n\t},\n\t// 行 1: 幅・高さ dimension 入力(Custom 選択時のみ表示)\n\t{\n\t\t...numberInputBlock(\"paper-width-value\", \"paper.size.width.value\"),\n\t\tlayout: { x: 0, y: 1, w: 1, h: 1 },\n\t\thiddenBinding: HIDDEN_WHEN_NOT_CUSTOM,\n\t},\n\t{\n\t\t...unitSelectBlock(\"paper-width-unit\", \"paper.size.width.unit\"),\n\t\tlayout: { x: 1, y: 1, w: 1, h: 1 },\n\t\thiddenBinding: HIDDEN_WHEN_NOT_CUSTOM,\n\t},\n\t{\n\t\t...numberInputBlock(\"paper-height-value\", \"paper.size.height.value\"),\n\t\tlayout: { x: 2, y: 1, w: 1, h: 1 },\n\t\thiddenBinding: HIDDEN_WHEN_NOT_CUSTOM,\n\t},\n\t{\n\t\t...unitSelectBlock(\"paper-height-unit\", \"paper.size.height.unit\"),\n\t\tlayout: { x: 3, y: 1, w: 1, h: 1 },\n\t\thiddenBinding: HIDDEN_WHEN_NOT_CUSTOM,\n\t},\n];\n\n/**\n * 用紙サイズ設定 compound widget。\n *\n * @remarks\n * **Canvas** — カスタムシェル構築専用。\n *\n * グリッド: 4列×2行\n * - 列 1 (15mm): 幅単位 select\n * - 列 3 (15mm): 高さ単位 select\n * - その他: 1fr\n *\n * 行 0: プリセット select(常に表示)\n *\n * 行 1: 幅・高さ dimension 入力(Custom 選択時のみ表示)\n */\nexport const paperSizeWidget: WidgetDef = {\n\tprops: {\n\t\tbook: {\n\t\t\tpaper: {\n\t\t\t\tsize: {\n\t\t\t\t\tpreset: PaperSizePreset.CUSTOM,\n\t\t\t\t\twidth: { value: 80, unit: \"mm\" },\n\t\t\t\t\theight: { value: 30, unit: \"mm\" },\n\t\t\t\t},\n\t\t\t\tmargin: {\n\t\t\t\t\ttop: { value: 0, unit: \"mm\" },\n\t\t\t\t\tright: { value: 0, unit: \"mm\" },\n\t\t\t\t\tbottom: { value: 0, unit: \"mm\" },\n\t\t\t\t\tleft: { value: 0, unit: \"mm\" },\n\t\t\t\t},\n\t\t\t\tautoHeight: true,\n\t\t\t\tautoWidth: true,\n\t\t\t},\n\t\t\tpages: [\n\t\t\t\t{\n\t\t\t\t\tgrid: {\n\t\t\t\t\t\tcolCount: 4,\n\t\t\t\t\t\trowCount: 2,\n\t\t\t\t\t\tcols: {\n\t\t\t\t\t\t\t1: { value: 15, unit: \"mm\" },\n\t\t\t\t\t\t\t3: { value: 15, unit: \"mm\" },\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tblocks: PAPER_SIZE_BLOCKS,\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t},\n\tplugins: [NoteBlockPlugin, SelectPlugin, StepperPlugin, TextPlugin],\n};\n"],"names":["fontStyleProp","paddingProp","placeholderProp","requiredProp","ValidationSeverity","isSafePattern","pattern","hasValidationRule","props","p","evaluateValidation","schema","value","errors","v","evaluateCheckboxValidation","createBlockId","kind","evalHiddenBinding","hidden","bindingContext","cur","DEFAULT_PAGE","DEFAULT_GRID","DEFAULT_BOOK","DEFAULT_PAPER","getBlockZIndex","index","zIndex","Z_INDEX","getSubZIndex","baseZIndex","subIndex","clampedOffset","getMaxBlockCount","validateBook","book","seen","duplicates","maxBlockCount","pageIndex","page","block","id","toNonEmptyPages","pages","addPage","emptyPage","ensurePageIds","removePage","_","i","movePage","from","to","moved","setPage","pageIdx","insertPage","afterIdx","newPages","cleanValues","values","existingIds","b","k","getPaperSize","preset","orientation","size","DEFAULT_PAPER_SIZES","w","toMm","h","resolveEffectivePaper","printSettings","buildPageCss","paper","margin","isLandscape","marginCss","H_ALIGN_CSS","HorizontalAlign","V_ALIGN_CSS","VerticalAlign","CheckboxRenderer","forwardRef","onChange","readOnly","ariaLabel","ref","divRef","useRef","useImperativeHandle","_a","isChecked","containerStyle","useMemo","css","padAll","padTop","padRight","padBottom","padLeft","dimensionToString","sizePx","toPx","handleClick","jsxs","e","jsx","ClassicCheckboxVisual","checkboxAlignmentProp","alignmentProp","CheckboxPlugin","checkboxStyleProp","selectConfigProp","isValidCssColor","color","H_ALIGN_TEXT","SelectRenderer","mode","blockBackgroundColor","selectRef","isDisabled","NoteMode","selectedOption","o","selectedColor","bgColor","selectStyle","dec","arrowStyle","handleChange","newValue","handleContainerClick","_b","handleContainerKeyDown","label","viewStyle","resolveOptionBackground","inner","Fragment","_c","opt","optBg","SelectPlugin","rawCfg","_ignored","rest","TextRenderer","onBlur","onMeasureHeight","onMeasureWidth","inputRef","containerRef","ghostRef","widthSpanRef","textareaHeight","setTextareaHeight","useState","lastReportedHeight","lastReportedWidth","safeValue","useLayoutEffect","ghost","container","displayValue","cs","paddingTop","paddingBottom","paddingLeft","paddingRight","availableWidth","contentHeight","neededHeight","span","isEditable","inputStyle","widthSpanStyle","ghostStyle","noWrap","handleBlur","charFilterRegex","m","resolvedInputMode","handleBeforeInput","useCallback","nativeEvent","char","handleCompositionEnd","el","filtered","c","placeholder","textareaStyle","TextPlugin","textBehaviorProp","textValidationProp","patched","key","useBookActionContext","handlers","handlersRef","execute","actionId","payload","handler","isEnabled","setNested","obj","keys","head","tail","current","setPath","path","resolvePath","useBookBindingContext","onBookChange","options","bookRef","pageIdxRef","extraRef","get","extra","set","all","bindingKey","subKey","newMargin","pi","newGrid","MERGE_WINDOW_MS","histReducer","state","action","last","newEntries","trimmed","DEFAULT_MAX_HISTORY","useBookHistory","initialBook","maxHistory","resolvedMaxHistory","dispatch","useReducer","handleBookChange","newBook","undo","redo","getLineDasharray","type","lineWidth","LineType","lineAttrs","style","dpi","BlockBorder","memo","blockSizePx","borderStyle","blockZIndex","subZIndex","BLOCK_SUB_INDEX","visible","DEFAULT_DPI","top","right","bottom","left","BlockCanvas","backgroundColor","toDashArray","strokeWidth","DEFAULT_GUIDE_BORDER","BlockGuideBorder","BlockRendererInner","resolvedPlugin","actionContext","innerRef","rendererProps","Renderer","BlockRenderer","resolveBlockProps","blockDefaults","kindDefaults","ValidationOverlay","hovered","setHovered","BORDER_WIDTH","stripe","edgeStyle","side","BlockContainer","blockRectPx","onValueChange","showGuides","showBorder","defaultGuideBorder","pointerEvents","showValidation","validationErrors","focusedBlockId","localHeight","setLocalHeight","localWidth","setLocalWidth","handleContentHeight","heightPx","handleContentWidth","widthPx","effectiveHeight","effectiveWidth","effectiveBlockSizePx","resolvedProps","validatedProps","validatedValue","hasErrors","errorDescId","isFocused","_d","_e","prev","next","NOOP_MEASURE_HEIGHT","_id","_h","NOOP_MEASURE_WIDTH","_w","BlockLayer","blocks","pluginRegistry","selectedBlockIds","getBlockRectPx","blockRefs","binding","handleValueChange","val","blockMeasureHeight","blockMeasureWidth","r","getStrokeDasharray","lineStyle","BorderOverlay","contentPx","marginLeftPx","marginTopPx","GridCanvas","canvasPx","boxShadow","SUPPORTED_UNITS","convertPxToUnit","pxSize","targetUnit","_exhaustive","GridUnitEditor","direction","dimension","currentPxSize","position","onCancel","setValue","unit","setUnit","editorStyle","useEffect","handleClickOutside","event","handleSubmit","numValue","handleKeyDown","handleUnitChange","newUnit","styles","u","originalValue","originalPxSize","GridDimensionLabel","isNearCursor","resizingPxSize","onDimensionChange","isEditing","setIsEditing","labelStyle","displayText","dim","newDim","getGridPathD","colPxs","rowPxs","width","height","d","x","y","GridOverlay","gridPosPx","pathData","GridResizeHandle","onResizeStart","onResize","onResizeEnd","isDragging","setIsDragging","HANDLE_SIZE","HANDLE_OFFSET","handleStyle","handlePointerDown","initialPos","handlePointerMove","moveEvent","currentPos","handlePointerUp","upEvent","MarginOverlay","paperPx","marginColor","GridLayer","gridDimensions","gridLineStyle","marginFillColor","showGridLines","showMargins","showResizeHandles","showDimensionLabels","onGridResize","className","ghostLine","setGhostLine","draggingHandle","setDraggingHandle","mousePos","setMousePos","handleMouseMove","rect","handleMouseLeave","shouldShowDimensionLabels","resizingPreviewSizes","gridLines","prevStart","nextEnd","clampDelta","delta","originalPos","prevLinePos","nextLinePos","clamped","handleResizeStart","handleResize","handleResizeEnd","colPos","rowPos","startPos","endPos","isDraggingAdjacent","useInteractionState","initialState","InteractionMode","ResizeHandle","DragType","getInteractionMode","calculateResizedLayout","layout","handle","deltaCol","deltaRow","gridCols","gridRows","newLayout","maxW","maxShrink","validDCol","maxH","validDRow","clampMultipleBlocks","maxX","maxY","minX","minY","maxBoundX","maxBoundY","boundW","boundH","clampedMinX","clampedMinY","actualDeltaCol","actualDeltaRow","createBlock","plugin","GHOST_GUIDE_BORDER","GhostBlock","opacity","ghostZIndex","DragLayer","gridLength","draggingState","wrapper","DT","dragTargets","clampedPositions","ghostRect","isOutside","currentMousePx","origRect","clampedPos","ghostBlock","blockId","pluginKind","defaultSize","currentGrid","tempBlock","tempRect","blockWithSize","displayBlock","EditingBlockInner","EditingBlock","SELECTION_LINE","SELECTION_STYLE","HANDLES","InteractionBlock","showHandles","activeHandle","selectionStyle","selectBorderZIndex","blockHandlesZIndex","cursor","isActive","SelectionLayer","uniqueIds","clampBlockToGrid","calcDuplicatePosition","newX","newY","findBlockAtPoint","point","InteractionLayer","getColIndex","getRowIndex","onStateChange","onSelectionChange","onPageChange","scale","layerRef","editingBlockRef","focusTimerRef","arrowSessionRef","arrowSessionCounterRef","resizeSessionRef","resizeSessionCounterRef","stateRef","onStateChangeRef","handleWindowPointerUp","layer","blockIds","validIds","sf","px","targetId","gridCol","gridRow","isSelected","canvasW","canvasH","rawX","rawY","clampedX","clampedY","currentCol","currentRow","deletedIds","pos","resolved","newBlock","handleDoubleClick","handlePointerLeave","newBlocks","sorted","a","selectedId","curIdx","first","resizeDelta","sortedResizeIds","prevResize","resizeSession","keyboardResizeKey","nx","ny","sortedIds","session","sessionId","arrowMoveKey","startCol","startRow","editingContent","editingBlock","initValueKey","PluginRegistryContext","createContext","pxValue","resizeFrAndFixed","dimensions","deltaPx","fixedSide","totalContentPx","totalFr","totalFixedPx","availableForFrPx","currentFrToPx","nextPx","newNextPx","newAvailableForFrPx","newCurrentPx","newCurrentFr","currentPx","newNextFr","resizeFixedPair","resizeFrPair","sum","frToPx","calcGridResize","newDimensions","useNoteLayout","useGridCalc","isFit","isWidthFit","measuredHeights","setMeasuredHeights","measuredWidths","setMeasuredWidths","handleMeasureHeight","handleMeasureWidth","measuredContentBottomPx","maxBottom","blockH","measuredContentRightPx","maxRight","blockW","canvasHeightPx","canvasWidthPx","gridTotalWidth","fitWidth","effectivePaperPx","result","raw","strVal","NoteEdit","context","onValuesChange","setFocusedBlockId","sortedBlocks","handleFocusCapture","blockEl","handleBlurCapture","STACKING_ISOLATION_STYLE","NoteForm","newPage","interactionState","ids","paperRef","expandedCols","expandedRows","useExpandedGrid","handleDragEnter","getBlockDragKind","col","row","handleDragOver","BLOCK_DRAG_MIME","handleDragLeave","handleDrop","data","getBlockDragData","getAdjustedBlockRectPx","handleInitValueChange","nextBlocks","target","isSidebar","SIDEBAR_PORTAL_SELECTOR","isActionBar","handleGridResize","dimensionIndex","newCols","colsToSparse","newRows","rowsToSparse","handleDimensionChange","visibleValues","NoteView","Note","executeButtonAction","isButtonActionEnabled","getButtonActionActive","buttonContentProp","buttonActionProp","ButtonRenderer","buttonRef","pressed","setPressed","isActionEnabled","ButtonPlugin","numberInputBlock","UNIT_OPTIONS","unitSelectBlock","stepperBehaviorProp","stepperStyleProp","clampStep","min","max","UP_PATH","DOWN_PATH","buttonOverlayStyle","disabled","StepperRenderer","pressedUp","setPressedUp","pressedDown","setPressedDown","step","arrowColor","arrowWidth","arrowHeight","arrowGap","arrowLeft","apply","handleUp","handleDown","svgFeedback","StepperPlugin","ATOM_PAPER","PaperSizePreset","ATOM_GRID","gridRowCountWidget","gridColCountWidget","gridSettingsWidget","NOOP_BINDING_CONTEXT","NOOP_ACTION_CONTEXT","NOOP_EDITOR_STATE","NoteBlockRenderer","useContext","naturalWidth","naturalHeight","nw","nh","s","noteContext","NoteBlockPlugin","HIDDEN_WHEN_NOT_CUSTOM","ROW_PAPER","PRESET_ORIENTATION_ROW","AUTO_RESIZE_ROW","DIMENSION_ROW","paperSettingsWidget","paperOrientationWidget","paperPresetSelectWidget","PAPER_SIZE_BLOCKS","paperSizeWidget"],"mappings":"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"}
|