@tatamicks/core 1.0.2 → 1.0.3

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.
@@ -1 +1 @@
1
- {"version":3,"file":"paperSettingsWidget-DvtghSA5.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>(({ id, props, value, onChange, readOnly, mode, ariaLabel }, ref) => {\n\tconst selectRef = useRef<HTMLSelectElement>(null);\n\tuseImperativeHandle(\n\t\tref,\n\t\t() => ({ focus: () => selectRef.current?.focus() }),\n\t\t[],\n\t);\n\n\tconst isDisabled = readOnly || mode === NoteMode.VIEW;\n\n\tconst containerStyle = useMemo((): CSSProperties => {\n\t\tconst css: CSSProperties = {\n\t\t\twidth: \"100%\",\n\t\t\theight: \"100%\",\n\t\t\tposition: \"relative\",\n\t\t\tdisplay: \"flex\",\n\t\t\talignItems: V_ALIGN_CSS[props.vertical ?? VerticalAlign.center],\n\t\t\tboxSizing: \"border-box\",\n\t\t\toverflow: \"hidden\",\n\t\t};\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\t\treturn css;\n\t}, [props]);\n\n\tconst selectedOption = (props.selectConfig?.options ?? []).find(\n\t\t(o) => o.value === value,\n\t);\n\tconst selectedColor = selectedOption?.color;\n\tconst bgColor =\n\t\tselectedColor && isValidCssColor(selectedColor) ? selectedColor : undefined;\n\n\tconst selectStyle = useMemo((): CSSProperties => {\n\t\tconst css: CSSProperties = {\n\t\t\tappearance: \"none\",\n\t\t\tWebkitAppearance: \"none\",\n\t\t\tbackground: bgColor ?? \"transparent\",\n\t\t\tborder: \"none\",\n\t\t\toutline: \"none\",\n\t\t\twidth: \"100%\",\n\t\t\theight: \"auto\",\n\t\t\tpadding: \"0 20px 0 4px\",\n\t\t\tboxSizing: \"border-box\",\n\t\t\tcursor: isDisabled ? \"default\" : \"pointer\",\n\t\t\ttextAlign: H_ALIGN_TEXT[props.horizontal ?? HorizontalAlign.left],\n\t\t};\n\t\tif (props.fontFamily) css.fontFamily = props.fontFamily;\n\t\tif (props.fontSize) css.fontSize = `${toPx.fromDim(props.fontSize)}px`;\n\t\tif (props.color) css.color = props.color;\n\t\tcss.fontWeight = props.fontWeight ? \"bold\" : \"normal\";\n\t\tcss.fontStyle = props.italic ? \"italic\" : \"normal\";\n\t\tconst dec: string[] = [];\n\t\tif (props.underline) dec.push(\"underline\");\n\t\tif (props.lineThrough) dec.push(\"line-through\");\n\t\tif (dec.length > 0) css.textDecoration = dec.join(\" \");\n\t\treturn css;\n\t}, [props, bgColor, isDisabled]);\n\n\tconst arrowStyle: CSSProperties = {\n\t\tposition: \"absolute\",\n\t\tright: 6,\n\t\ttop: \"50%\",\n\t\ttransform: \"translateY(-50%)\",\n\t\twidth: 0,\n\t\theight: 0,\n\t\tborderLeft: \"5px solid transparent\",\n\t\tborderRight: \"5px solid transparent\",\n\t\tborderTop: `5px solid ${isDisabled ? \"#aaa\" : \"#555\"}`,\n\t\tpointerEvents: \"none\",\n\t};\n\n\tconst handleChange = (e: React.ChangeEvent<HTMLSelectElement>) => {\n\t\tconst newValue = e.target.value === \"\" ? null : e.target.value;\n\t\tonChange(newValue);\n\t};\n\n\t// パディング領域などのコンテナ空白部分をクリックしたときもドロップダウンを開く\n\tconst handleContainerClick = (e: React.MouseEvent<HTMLDivElement>) => {\n\t\tif (!isDisabled && e.target !== selectRef.current) {\n\t\t\tselectRef.current?.showPicker?.();\n\t\t}\n\t};\n\n\tconst handleContainerKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n\t\tif (!isDisabled && (e.key === \"Enter\" || e.key === \" \")) {\n\t\t\te.preventDefault();\n\t\t\tselectRef.current?.showPicker?.();\n\t\t}\n\t};\n\n\tif (mode === NoteMode.VIEW) {\n\t\tconst label =\n\t\t\tselectedOption?.label ??\n\t\t\t(value != null ? String(value) : (props.placeholder ?? \"\"));\n\t\tconst viewStyle: CSSProperties = {\n\t\t\t...selectStyle,\n\t\t\theight: \"auto\",\n\t\t\tpadding: \"0 4px\",\n\t\t};\n\t\treturn (\n\t\t\t<div style={containerStyle}>\n\t\t\t\t<div style={viewStyle}>{label}</div>\n\t\t\t</div>\n\t\t);\n\t}\n\n\t// <label> ラッパーは使わず、コンテナ onClick + showPicker でパディング領域のクリックも対応する\n\tconst inner = (\n\t\t<>\n\t\t\t<select\n\t\t\t\tref={selectRef}\n\t\t\t\tid={id}\n\t\t\t\tvalue={value ?? \"\"}\n\t\t\t\tonChange={handleChange}\n\t\t\t\tdisabled={isDisabled}\n\t\t\t\tstyle={selectStyle}\n\t\t\t\taria-label={ariaLabel}\n\t\t\t>\n\t\t\t\t{props.placeholder !== undefined &&\n\t\t\t\t\t!props.required &&\n\t\t\t\t\tprops.selectConfig?.allowEmpty !== false && (\n\t\t\t\t\t\t<option value=\"\">{props.placeholder}</option>\n\t\t\t\t\t)}\n\t\t\t\t{(props.selectConfig?.options ?? []).map((opt) => {\n\t\t\t\t\tconst optBg =\n\t\t\t\t\t\topt.color && isValidCssColor(opt.color) ? opt.color : undefined;\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<option\n\t\t\t\t\t\t\tkey={opt.value}\n\t\t\t\t\t\t\tvalue={opt.value}\n\t\t\t\t\t\t\tstyle={optBg ? { backgroundColor: optBg } : undefined}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{opt.label}\n\t\t\t\t\t\t</option>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</select>\n\t\t\t<div style={arrowStyle} aria-hidden=\"true\" />\n\t\t</>\n\t);\n\n\tif (isDisabled) {\n\t\treturn <div style={containerStyle}>{inner}</div>;\n\t}\n\treturn (\n\t\t<div\n\t\t\tstyle={containerStyle}\n\t\t\trole=\"none\"\n\t\t\tonClick={handleContainerClick}\n\t\t\tonKeyDown={handleContainerKeyDown}\n\t\t>\n\t\t\t{inner}\n\t\t</div>\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\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}: 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};\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/>\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 { 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}}\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\";\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}}\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 { 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}}\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 { 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 style={style} className={className}>\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 style={style} className={className}>\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 style={style} className={className}>\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","selectRef","isDisabled","NoteMode","selectedOption","o","selectedColor","bgColor","selectStyle","dec","arrowStyle","handleChange","newValue","handleContainerClick","_b","handleContainerKeyDown","label","viewStyle","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","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","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":";;;AAmCO,MAAMA,KAAgB;AAAA,EAC5B,MAAM;AAAA,EACN,cAAc;AAAA,IACb,YAAY;AAAA,IACZ,UAAU,EAAE,OAAO,IAAI,MAAM,KAAA;AAAA,IAC7B,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,aAAa;AAAA,EAAA;AAEf,GCrBaC,KAAc;AAAA,EAC1B,MAAM;AAAA,EACN,cAAc;AAAA,IACb,KAAK,EAAE,OAAO,GAAG,MAAM,KAAA;AAAA,IACvB,OAAO,EAAE,OAAO,GAAG,MAAM,KAAA;AAAA,IACzB,QAAQ,EAAE,OAAO,GAAG,MAAM,KAAA;AAAA,IAC1B,MAAM,EAAE,OAAO,GAAG,MAAM,KAAA;AAAA,EAAK;AAE/B,GCjBaC,KAAkB;AAAA,EAC9B,MAAM;AAAA,EACN,cAAc;AAAA,IACb,aAAa;AAAA,EAAA;AAEf,GCLaC,KAAe;AAAA,EAC3B,MAAM;AAAA,EACN,cAAc;AAAA,IACb,UAAU;AAAA,EAAA;AAEZ;AChBO,IAAKC,uBAAAA,OAEXA,EAAA,QAAQ,SAGRA,EAAA,UAAU,WAGVA,EAAA,OAAO,QARIA,IAAAA,MAAA,CAAA,CAAA;ACsBZ,SAASC,GAAcC,GAA0B;AAEhD,SADI,EAAAA,EAAQ,SAAS,OACjB,sDAAsD,KAAKA,CAAO;AAGvE;AAKO,SAASC,GAAkBC,GAA2C;AAC5E,MAAI,OAAOA,KAAU,YAAYA,MAAU,KAAM,QAAO;AACxD,QAAMC,IAAID;AACV,SACCC,EAAE,aAAa,UACfA,EAAE,cAAc,UAChBA,EAAE,cAAc,UAChBA,EAAE,YAAY;AAEhB;AAOO,SAASC,GACfC,GACAC,GACoB;AACpB,QAAMC,IAA4B,CAAA,GAC5BC,IAAIF,KAAS;AA0BnB,MAxBID,EAAO,YAAYG,EAAE,WAAW,KACnCD,EAAO,KAAK;AAAA,IACX,MAAM;AAAA,IACN,SAAS;AAAA,IACT,UAAUT,GAAmB;AAAA,EAAA,CAC7B,GAGEO,EAAO,cAAc,UAAaG,EAAE,SAASH,EAAO,aACvDE,EAAO,KAAK;AAAA,IACX,MAAM;AAAA,IACN,SAAS,GAAGF,EAAO,SAAS;AAAA,IAC5B,UAAUP,GAAmB;AAAA,EAAA,CAC7B,GAGEO,EAAO,cAAc,UAAaG,EAAE,SAASH,EAAO,aACvDE,EAAO,KAAK;AAAA,IACX,MAAM;AAAA,IACN,SAAS,GAAGF,EAAO,SAAS;AAAA,IAC5B,UAAUP,GAAmB;AAAA,EAAA,CAC7B,GAGEO,EAAO,WACNN,GAAcM,EAAO,OAAO;AAC/B,QAAI;AAEH,MADW,IAAI,OAAOA,EAAO,OAAO,EAC5B,KAAKG,CAAC,KACbD,EAAO,KAAK;AAAA,QACX,MAAM;AAAA,QACN,SAAS;AAAA,QACT,UAAUT,GAAmB;AAAA,MAAA,CAC7B;AAAA,IAEH,QAAQ;AAAA,IAER;AAIF,SAAOS;AACR;AAOO,SAASE,GACfJ,GACAC,GACoB;AACpB,SAAID,EAAO,YAAYC,MAAU,KACzB;AAAA,IACN;AAAA,MACC,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAUR,GAAmB;AAAA,IAAA;AAAA,EAC9B,IAGK,CAAA;AACR;ACnHO,SAASY,GAAcC,GAAsB;AACnD,SAAO,GAAGA,CAAI,IAAI,OAAO,YAAY;AACtC;AAUO,SAASC,GACfC,GACAC,GACU;AACV,MAAID,KAAU,QAAQC,KAAkB,KAAM,QAAO;AACrD,MAAI,OAAOD,KAAW,SAAU,QAAO,EAAQC,EAAe,IAAID,CAAM;AACxE,QAAME,IAAMD,EAAe,IAAID,EAAO,IAAI;AAC1C,SAAI,QAAQA,IAAeE,MAAQF,EAAO,KACnCE,MAAQF,EAAO;AACvB;ACkBO,MAAMG,KAAqB;AAAA,EACjC,MAAMC;AAAA,EACN,QAAQ,CAAA;AACT,GAyBaC,KAAqB;AAAA,EACjC,OAAOC;AAAA,EACP,OAAO,CAACH,EAAY;AACrB;ACvEO,SAASI,GAAeC,GAAuB;AACrD,QAAMC,IAASC,GAAQ,kBAAkBF,IAAQE,GAAQ;AACzD,SAAID,KAAUC,GAAQ,kBACdA,GAAQ,kBAETD;AACR;AAOO,SAASE,GAAaC,GAAoBC,GAA0B;AAC1E,QAAMC,IAAgB,KAAK;AAAA,IAC1B,KAAK,IAAI,GAAGD,CAAQ;AAAA,IACpBH,GAAQ,mBAAmB;AAAA,EAAA;AAE5B,SAAOE,IAAaE;AACrB;AAKO,SAASC,KAA2B;AAC1C,SAAO,KAAK;AAAA,KACVL,GAAQ,kBAAkBA,GAAQ,mBAClCA,GAAQ;AAAA,EAAA;AAEX;ACvBO,SAASM,GAAaC,GAA+B;AAC3D,QAAMvB,IAA4B,CAAA,GAC5BwB,wBAAW,IAAA,GACXC,wBAAiB,IAAA,GACjBC,IAAgBL,GAAA;AAEtB,aAAW,CAACM,GAAWC,CAAI,KAAKL,EAAK,MAAM,WAAW;AACrD,eAAWM,KAASD,EAAK;AACxB,MAAIJ,EAAK,IAAIK,EAAM,EAAE,IACpBJ,EAAW,IAAII,EAAM,EAAE,IAEvBL,EAAK,IAAIK,EAAM,EAAE;AAGnB,IAAID,EAAK,OAAO,SAASF,KACxB1B,EAAO,KAAK;AAAA,MACX,SAAS,OAAO2B,IAAY,CAAC,YAAYC,EAAK,OAAO,MAAM,UAAUF,CAAa;AAAA,MAClF,MAAM;AAAA,MACN,OAAOE,EAAK,MAAM,QAAQD,CAAS;AAAA,MACnC,UAAUpC,GAAmB;AAAA,IAAA,CAC7B;AAAA,EAEH;AAEA,aAAWuC,KAAML;AAChB,IAAAzB,EAAO,KAAK;AAAA,MACX,SAAS,YAAY8B,CAAE;AAAA,MACvB,MAAM;AAAA,MACN,OAAOA;AAAA,MACP,UAAUvC,GAAmB;AAAA,IAAA,CAC7B;AAGF,SAAOS;AACR;AAEA,SAAS+B,GAAgBC,GAA8B;AACtD,MAAIA,EAAM,WAAW,EAAG,OAAM,IAAI,MAAM,yBAAyB;AACjE,SAAOA;AACR;AAKO,SAASC,GAAQV,GAAkB;AACzC,QAAMW,IAAkB,EAAE,GAAGzB,IAAc,IAAI,OAAO,aAAW;AACjE,SAAO;AAAA,IACN,GAAGc;AAAA,IACH,OAAOQ,GAAgB,CAAC,GAAGR,EAAK,OAAOW,CAAS,CAAC;AAAA,EAAA;AAEnD;AAOO,SAASC,GAAcZ,GAAkB;AAC/C,QAAMS,IAAQD;AAAA,IACbR,EAAK,MAAM;AAAA,MAAI,CAACK,MACfA,EAAK,OAAO,SAAYA,IAAO,EAAE,GAAGA,GAAM,IAAI,OAAO,WAAA,EAAW;AAAA,IAAE;AAAA,EACnE;AAED,SAAO,EAAE,GAAGL,GAAM,OAAAS,EAAA;AACnB;AAOO,SAASI,GAAWb,GAAYT,GAAqB;AAC3D,MAAIS,EAAK,MAAM,UAAU,EAAG,QAAOA;AACnC,QAAMS,IAAQT,EAAK,MAAM,OAAO,CAACc,GAAGC,MAAMA,MAAMxB,CAAK;AACrD,SAAO,EAAE,GAAGS,GAAM,OAAOQ,GAAgBC,CAAK,EAAA;AAC/C;AAOO,SAASO,GAAShB,GAAYiB,GAAcC,GAAkB;AACpE,MAAID,MAASC,EAAI,QAAOlB;AACxB,QAAMS,IAAQ,CAAC,GAAGT,EAAK,KAAK,GACtBmB,IAAQV,EAAM,OAAOQ,GAAM,CAAC,EAAE,CAAC;AACrC,SAAKE,KACLV,EAAM,OAAOS,GAAI,GAAGC,CAAK,GAClB,EAAE,GAAGnB,GAAM,OAAOQ,GAAgBC,CAAK,EAAA,KAF3BT;AAGpB;AAKO,SAASoB,GAAQpB,GAAYqB,GAAiBhB,GAAkB;AACtE,SAAO;AAAA,IACN,GAAGL;AAAA,IACH,OAAOQ;AAAA,MACNR,EAAK,MAAM,IAAI,CAAC3B,GAAG0C,MAAOA,MAAMM,IAAUhB,IAAOhC,CAAE;AAAA,IAAA;AAAA,EACpD;AAEF;AAKO,SAASiD,GAAWtB,GAAYuB,GAAkBlB,GAAkB;AAC1E,QAAMmB,IAAW;AAAA,IAChB,GAAGxB,EAAK,MAAM,MAAM,GAAGuB,IAAW,CAAC;AAAA,IACnClB;AAAA,IACA,GAAGL,EAAK,MAAM,MAAMuB,IAAW,CAAC;AAAA,EAAA;AAEjC,SAAO,EAAE,GAAGvB,GAAM,OAAOQ,GAAgBgB,CAAQ,EAAA;AAClD;AAKO,SAASC,GACfzB,GACA0B,GACwB;AACxB,QAAMC,IAAc,IAAI;AAAA,IACvB3B,EAAK,MAAM,QAAQ,CAACK,MAASA,EAAK,OAAO,IAAI,CAACuB,MAAMA,EAAE,EAAE,CAAC;AAAA,EAAA;AAE1D,SAAO,OAAO;AAAA,IACb,OAAO,QAAQF,CAAM,EAAE,OAAO,CAAC,CAACG,CAAC,MAAMF,EAAY,IAAIE,CAAC,CAAC;AAAA,EAAA;AAE3D;AC9HO,SAASC,GACfC,GACAC,GACoC;AACpC,QAAMC,IAAOC,GAAoBH,CAAM,GACjCI,IAAIC,GAAK,QAAQH,EAAK,KAAK,GAC3BI,IAAID,GAAK,QAAQH,EAAK,MAAM;AAClC,SAAOD,IAAc,EAAE,OAAOK,GAAG,QAAQF,EAAA,IAAM,EAAE,OAAOA,GAAG,QAAQE,EAAA;AACpE;AAOO,SAASC,GACftC,GACAuC,GACQ;AACR,SAAO;AAAA,IACN,GAAGvC,EAAK;AAAA,IACR,OACCuC,KAAA,gBAAAA,EAAe,cAAa,OACxBL,GAAoBK,EAAc,SAAS,KAAKvC,EAAK,MAAM,OAC5DA,EAAK,MAAM;AAAA,IACf,cAAauC,KAAA,gBAAAA,EAAe,gBAAevC,EAAK,MAAM;AAAA,EAAA;AAExD;AAOO,SAASwC,GAAaC,GAAcC,GAA8B;AACxE,QAAMC,IAAcF,EAAM,gBAAgB,IACpCN,IAAI,KAAK;AAAA,IACdC,GAAK,QAAQO,IAAcF,EAAM,KAAK,SAASA,EAAM,KAAK,KAAK;AAAA,EAAA,GAE1DJ,IAAI,KAAK;AAAA,IACdD,GAAK,QAAQO,IAAcF,EAAM,KAAK,QAAQA,EAAM,KAAK,MAAM;AAAA,EAAA,GAE1DG,IAAYF,IACf,cAAcA,EAAO,OAAO,GAAG,iBAAiBA,EAAO,SAAS,GAAG,kBAAkBA,EAAO,UAAU,GAAG,gBAAgBA,EAAO,QAAQ,GAAG,MAC3I;AACH,SAAO,iBAAiBP,CAAC,MAAME,CAAC,OAAOO,CAAS;AACjD;AC1CA,MAAMC,KAAwE;AAAA,EAC7E,CAACC,GAAgB,IAAI,GAAG;AAAA,EACxB,CAACA,GAAgB,MAAM,GAAG;AAAA,EAC1B,CAACA,GAAgB,KAAK,GAAG;AAC1B,GAGMC,KAAkE;AAAA,EACvE,CAACC,GAAc,GAAG,GAAG;AAAA,EACrB,CAACA,GAAc,MAAM,GAAG;AAAA,EACxB,CAACA,GAAc,MAAM,GAAG;AACzB,GAOaC,KAAmBC,GAG9B,CAAC,EAAE,IAAA3C,GAAI,OAAAnC,GAAO,OAAAI,GAAO,UAAA2E,GAAU,UAAAC,GAAU,WAAAC,EAAA,GAAaC,MAAQ;;AAC/D,QAAMC,IAASC,EAAuB,IAAI;AAC1C,EAAAC;AAAA,IACCH;AAAA,IACA,OAAO,EAAE,OAAO,MAAA;;AAAM,cAAAI,IAAAH,EAAO,YAAP,gBAAAG,EAAgB;AAAA,MAAM;AAAA,IAC5C,CAAA;AAAA,EAAC;AAGF,QAAMC,IAAYnF,KAAS,IAErBoF,IAAiBC,EAAQ,MAAqB;AACnD,UAAMC,IAAqB;AAAA,MAC1B,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,WAAW;AAAA,MACX,UAAU;AAAA,MACV,QAAQV,IAAW,YAAY;AAAA,IAAA;AAGhC,IAAAU,EAAI,iBACHjB,GAAYzE,EAAM,cAAc0E,GAAgB,MAAM,GACvDgB,EAAI,aAAaf,GAAY3E,EAAM,YAAY4E,GAAc,MAAM;AAEnE,UAAMe,IAAS3F,EAAM,OAAOA,EAAM,MAAM,QAClC4F,IAASD,KAAU3F,EAAM,KACzB6F,IAAWF,KAAU3F,EAAM,OAC3B8F,IAAYH,KAAU3F,EAAM,QAC5B+F,IAAUJ,KAAU3F,EAAM;AAChC,WAAI4F,MAAQF,EAAI,aAAaM,GAAkBJ,CAAM,IACjDC,MAAUH,EAAI,eAAeM,GAAkBH,CAAQ,IACvDC,MAAWJ,EAAI,gBAAgBM,GAAkBF,CAAS,IAC1DC,MAASL,EAAI,cAAcM,GAAkBD,CAAO,IAEjDL;AAAA,EACR,GAAG,CAAC1F,GAAOgF,CAAQ,CAAC,GAEdiB,KAASX,IAAAtF,EAAM,gBAAN,QAAAsF,EAAmB,eAC/BY,GAAK,QAAQlG,EAAM,YAAY,YAAY,IAC3C,IAEGmG,IAAc,MAAM;AACzB,IAAInB,KACJD,EAAS,CAACQ,CAAS;AAAA,EACpB;AAEA,SACC,gBAAAa;AAAA,IAAC;AAAA,IAAA;AAAA,MACA,KAAKjB;AAAA,MACL,OAAOK;AAAA,MACP,MAAK;AAAA,MACL,gBAAcD;AAAA,MACd,cAAYN;AAAA,MACZ,UAAUD,IAAW,KAAK;AAAA,MAC1B,SAASmB;AAAA,MACT,WAAW,CAACE,MAAM;AACjB,SAAIA,EAAE,QAAQ,OAAOA,EAAE,QAAQ,aAC9BA,EAAE,eAAA,GACFF,EAAA;AAAA,MAEF;AAAA,MAEA,UAAA;AAAA,QAAA,gBAAAG;AAAA,UAAC;AAAA,UAAA;AAAA,YACA,IAAAnE;AAAA,YACA,MAAK;AAAA,YACL,SAASoD;AAAA,YACT,UAAU,MAAM;AAAA,YAAC;AAAA,YACjB,OAAO,EAAE,SAAS,OAAA;AAAA,YAClB,UAAU;AAAA,YACV,UAAQ;AAAA,UAAA;AAAA,QAAA;AAAA,QAET,gBAAAe;AAAA,UAAC;AAAA,UAAA;AAAA,YACA,OAAO;AAAA,cACN,OAAOL;AAAA,cACP,QAAQA;AAAA,cACR,YAAY;AAAA,cACZ,eAAe;AAAA,YAAA;AAAA,YAGhB,UAAA,gBAAAK;AAAA,cAACC;AAAA,cAAA;AAAA,gBACA,SAAShB;AAAA,gBACT,aAAavF,EAAM;AAAA,cAAA;AAAA,YAAA;AAAA,UACpB;AAAA,QAAA;AAAA,MACD;AAAA,IAAA;AAAA,EAAA;AAGH,CAAC;AAED6E,GAAiB,cAAc;ACvH/B,MAAM2B,KAAwB;AAAA,EAC7B,GAAGC;AAAA,EACH,cAAc;AAAA,IACb,GAAGA,GAAc;AAAA,IACjB,YAAY/B,GAAgB;AAAA,EAAA;AAE9B,GAOagC,KAGT;AAAA,EACH,MAAM;AAAA,EAEN,MAAM;AAAA,IACL,aAAa;AAAA,IACb,aAAa;AAAA,IACb,aAAa,EAAE,GAAG,GAAG,GAAG,EAAA;AAAA,EAAE;AAAA,EAG3B,UAAU7B;AAAA,EAEV,YAAY;AAAA,IACX2B;AAAA,IACA/G;AAAA,IACAE;AAAA,IACAgH;AAAA,EAAA;AAAA,EAGD,eAAe,CAAC3G,OAIR,EAAE,GAFR,OAAOA,KAAU,YAAYA,MAAU,OAAOA,IAAQ,CAAA,EAE3C;AAAA,EAGb,eAAe,CAACI,MACX,OAAOA,KAAU,YAAkBA,IAChC;AAET,GChBawG,KAAmB;AAAA,EAC/B,MAAM;AAAA,EACN,cAAc;AAAA,IACb,cAAc;AAAA,MACb,SAAS;AAAA,QACR,EAAE,OAAO,WAAW,OAAO,UAAA;AAAA,QAC3B,EAAE,OAAO,WAAW,OAAO,UAAA;AAAA,MAAU;AAAA,IACtC;AAAA,EACD;AAEF;AC7BA,SAASC,GAAgBC,GAAwB;AAChD,SAAO,sBAAsB,KAAKA,CAAK;AACxC;AAGA,MAAMC,KAAoE;AAAA,EACzE,CAACrC,GAAgB,IAAI,GAAG;AAAA,EACxB,CAACA,GAAgB,MAAM,GAAG;AAAA,EAC1B,CAACA,GAAgB,KAAK,GAAG;AAC1B,GAGMC,KAAkE;AAAA,EACvE,CAACC,GAAc,GAAG,GAAG;AAAA,EACrB,CAACA,GAAc,MAAM,GAAG;AAAA,EACxB,CAACA,GAAc,MAAM,GAAG;AACzB,GASaoC,KAAiBlC,GAG5B,CAAC,EAAE,IAAA3C,GAAI,OAAAnC,GAAO,OAAAI,GAAO,UAAA2E,GAAU,UAAAC,GAAU,MAAAiC,GAAM,WAAAhC,EAAA,GAAaC,MAAQ;;AACrE,QAAMgC,IAAY9B,EAA0B,IAAI;AAChD,EAAAC;AAAA,IACCH;AAAA,IACA,OAAO,EAAE,OAAO,MAAA;;AAAM,cAAAI,IAAA4B,EAAU,YAAV,gBAAA5B,EAAmB;AAAA,MAAM;AAAA,IAC/C,CAAA;AAAA,EAAC;AAGF,QAAM6B,IAAanC,KAAYiC,MAASG,GAAS,MAE3C5B,IAAiBC,EAAQ,MAAqB;AACnD,UAAMC,IAAqB;AAAA,MAC1B,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,SAAS;AAAA,MACT,YAAYf,GAAY3E,EAAM,YAAY4E,GAAc,MAAM;AAAA,MAC9D,WAAW;AAAA,MACX,UAAU;AAAA,IAAA,GAELe,IAAS3F,EAAM,OAAOA,EAAM,MAAM,QAClC4F,IAASD,KAAU3F,EAAM,KACzB6F,IAAWF,KAAU3F,EAAM,OAC3B8F,IAAYH,KAAU3F,EAAM,QAC5B+F,KAAUJ,KAAU3F,EAAM;AAChC,WAAI4F,MAAQF,EAAI,aAAaM,GAAkBJ,CAAM,IACjDC,MAAUH,EAAI,eAAeM,GAAkBH,CAAQ,IACvDC,MAAWJ,EAAI,gBAAgBM,GAAkBF,CAAS,IAC1DC,OAASL,EAAI,cAAcM,GAAkBD,EAAO,IACjDL;AAAA,EACR,GAAG,CAAC1F,CAAK,CAAC,GAEJqH,OAAkB/B,IAAAtF,EAAM,iBAAN,gBAAAsF,EAAoB,YAAW,CAAA,GAAI;AAAA,IAC1D,CAACgC,MAAMA,EAAE,UAAUlH;AAAA,EAAA,GAEdmH,IAAgBF,KAAA,gBAAAA,EAAgB,OAChCG,IACLD,KAAiBV,GAAgBU,CAAa,IAAIA,IAAgB,QAE7DE,IAAchC,EAAQ,MAAqB;AAChD,UAAMC,IAAqB;AAAA,MAC1B,YAAY;AAAA,MACZ,kBAAkB;AAAA,MAClB,YAAY8B,KAAW;AAAA,MACvB,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,WAAW;AAAA,MACX,QAAQL,IAAa,YAAY;AAAA,MACjC,WAAWJ,GAAa/G,EAAM,cAAc0E,GAAgB,IAAI;AAAA,IAAA;AAEjE,IAAI1E,EAAM,eAAY0F,EAAI,aAAa1F,EAAM,aACzCA,EAAM,aAAU0F,EAAI,WAAW,GAAGQ,GAAK,QAAQlG,EAAM,QAAQ,CAAC,OAC9DA,EAAM,UAAO0F,EAAI,QAAQ1F,EAAM,QACnC0F,EAAI,aAAa1F,EAAM,aAAa,SAAS,UAC7C0F,EAAI,YAAY1F,EAAM,SAAS,WAAW;AAC1C,UAAM0H,IAAgB,CAAA;AACtB,WAAI1H,EAAM,aAAW0H,EAAI,KAAK,WAAW,GACrC1H,EAAM,eAAa0H,EAAI,KAAK,cAAc,GAC1CA,EAAI,SAAS,QAAO,iBAAiBA,EAAI,KAAK,GAAG,IAC9ChC;AAAA,EACR,GAAG,CAAC1F,GAAOwH,GAASL,CAAU,CAAC,GAEzBQ,IAA4B;AAAA,IACjC,UAAU;AAAA,IACV,OAAO;AAAA,IACP,KAAK;AAAA,IACL,WAAW;AAAA,IACX,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,WAAW,aAAaR,IAAa,SAAS,MAAM;AAAA,IACpD,eAAe;AAAA,EAAA,GAGVS,IAAe,CAACvB,MAA4C;AACjE,UAAMwB,IAAWxB,EAAE,OAAO,UAAU,KAAK,OAAOA,EAAE,OAAO;AACzD,IAAAtB,EAAS8C,CAAQ;AAAA,EAClB,GAGMC,IAAuB,CAACzB,MAAwC;;AACrE,IAAI,CAACc,KAAcd,EAAE,WAAWa,EAAU,aACzCa,KAAAzC,IAAA4B,EAAU,YAAV,gBAAA5B,EAAmB,eAAnB,QAAAyC,EAAA,KAAAzC;AAAA,EAEF,GAEM0C,IAAyB,CAAC3B,MAA2C;;AAC1E,IAAI,CAACc,MAAed,EAAE,QAAQ,WAAWA,EAAE,QAAQ,SAClDA,EAAE,eAAA,IACF0B,KAAAzC,IAAA4B,EAAU,YAAV,gBAAA5B,EAAmB,eAAnB,QAAAyC,EAAA,KAAAzC;AAAA,EAEF;AAEA,MAAI2B,MAASG,GAAS,MAAM;AAC3B,UAAMa,KACLZ,KAAA,gBAAAA,EAAgB,WACfjH,KAAS,OAAO,OAAOA,CAAK,IAAKJ,EAAM,eAAe,KAClDkI,IAA2B;AAAA,MAChC,GAAGT;AAAA,MACH,QAAQ;AAAA,MACR,SAAS;AAAA,IAAA;AAEV,WACC,gBAAAnB,EAAC,SAAI,OAAOd,GACX,4BAAC,OAAA,EAAI,OAAO0C,GAAY,UAAAD,EAAA,CAAM,EAAA,CAC/B;AAAA,EAEF;AAGA,QAAME,IACL,gBAAA/B,EAAAgC,IAAA,EACC,UAAA;AAAA,IAAA,gBAAAhC;AAAA,MAAC;AAAA,MAAA;AAAA,QACA,KAAKc;AAAA,QACL,IAAA/E;AAAA,QACA,OAAO/B,KAAS;AAAA,QAChB,UAAUwH;AAAA,QACV,UAAUT;AAAA,QACV,OAAOM;AAAA,QACP,cAAYxC;AAAA,QAEX,UAAA;AAAA,UAAAjF,EAAM,gBAAgB,UACtB,CAACA,EAAM,cACP+H,IAAA/H,EAAM,iBAAN,gBAAA+H,EAAoB,gBAAe,MAClC,gBAAAzB,EAAC,UAAA,EAAO,OAAM,IAAI,YAAM,aAAY;AAAA,aAEpC+B,IAAArI,EAAM,iBAAN,gBAAAqI,EAAoB,YAAW,CAAA,GAAI,IAAI,CAACC,MAAQ;AACjD,kBAAMC,IACLD,EAAI,SAASzB,GAAgByB,EAAI,KAAK,IAAIA,EAAI,QAAQ;AACvD,mBACC,gBAAAhC;AAAA,cAAC;AAAA,cAAA;AAAA,gBAEA,OAAOgC,EAAI;AAAA,gBACX,OAAOC,IAAQ,EAAE,iBAAiBA,MAAU;AAAA,gBAE3C,UAAAD,EAAI;AAAA,cAAA;AAAA,cAJAA,EAAI;AAAA,YAAA;AAAA,UAOZ,CAAC;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAEF,gBAAAhC,EAAC,OAAA,EAAI,OAAOqB,GAAY,eAAY,OAAA,CAAO;AAAA,EAAA,GAC5C;AAGD,SAAIR,IACI,gBAAAb,EAAC,OAAA,EAAI,OAAOd,GAAiB,UAAA2C,GAAM,IAG1C,gBAAA7B;AAAA,IAAC;AAAA,IAAA;AAAA,MACA,OAAOd;AAAA,MACP,MAAK;AAAA,MACL,SAASsC;AAAA,MACT,WAAWE;AAAA,MAEV,UAAAG;AAAA,IAAA;AAAA,EAAA;AAGJ,CAAC;AAEDnB,GAAe,cAAc;AC/LtB,MAAMwB,KAAgE;AAAA,EAC5E,MAAM;AAAA,EAEN,MAAM;AAAA,IACL,aAAa;AAAA,IACb,aAAa;AAAA,IACb,aAAa,EAAE,GAAG,GAAG,GAAG,EAAA;AAAA,EAAE;AAAA,EAG3B,UAAUxB;AAAA,EAEV,YAAY;AAAA,IACXP;AAAA,IACAhH;AAAA,IACAD;AAAA,IACAE;AAAA,IACAC;AAAA,IACAiH;AAAA,EAAA;AAAA,EAGD,eAAe,CAAC5G,MAAqC;AACpD,QAAI,OAAOA,KAAU,YAAYA,MAAU;AAC1C,aAAO,CAAA;AAGR,UAAMC,IAAID,GAGJyI,IAASxI,EAAE;AAajB,QAXC,OAAOwI,KAAW,YAClBA,MAAW,QACX,MAAM,QAASA,EAAmC,OAAO,KACvDA,EAAmC,QAAsB;AAAA,MAC1D,CAACH,MACA,OAAOA,KAAQ,YACfA,MAAQ,QACR,OAAQA,EAAgC,SAAU,YAClD,OAAQA,EAAgC,SAAU;AAAA,IAAA;AAIpD,aAAO;AAAA,QACN,GAAGrI;AAAA,QACH,cAAcwI;AAAA,MAAA;AAIhB,UAAM,EAAE,cAAcC,GAAU,GAAGC,MAAS1I;AAC5C,WAAO,EAAE,GAAG0I,GAAM,cAAc,EAAE,SAAS,CAAA,IAAG;AAAA,EAC/C;AAAA,EAEA,eAAe,CAACvI,MACX,OAAOA,KAAU,WAAiBA,IAC/B;AAET,GCrDMqE,KAAwE;AAAA,EAC7E,CAACC,GAAgB,IAAI,GAAG;AAAA,EACxB,CAACA,GAAgB,MAAM,GAAG;AAAA,EAC1B,CAACA,GAAgB,KAAK,GAAG;AAC1B,GAGMC,KAAkE;AAAA,EACvE,CAACC,GAAc,GAAG,GAAG;AAAA,EACrB,CAACA,GAAc,MAAM,GAAG;AAAA,EACxB,CAACA,GAAc,MAAM,GAAG;AACzB,GASagE,KAAe9D;AAAA,EAI3B,CACC;AAAA,IACC,OAAA9E;AAAA,IACA,OAAAI;AAAA,IACA,UAAA2E;AAAA,IACA,QAAA8D;AAAA,IACA,UAAA7D;AAAA,IACA,MAAAiC;AAAA,IACA,iBAAA6B;AAAA,IACA,gBAAAC;AAAA,IACA,WAAA9D;AAAA,EAAA,GAEDC,MACI;AACJ,UAAM8D,IAAW5D,EAA+C,IAAI,GAC9D6D,IAAe7D,EAAuB,IAAI,GAC1C8D,IAAW9D,EAAuB,IAAI,GACtC+D,IAAe/D,EAAwB,IAAI,GAE3C,CAACgE,GAAgBC,CAAiB,IAAIC,GAAwB,IAAI,GAClEC,IAAqBnE,EAAsB,IAAI,GAC/CoE,IAAoBpE,EAAsB,IAAI,GAG9CqE,IAAYrJ,KAAS,OAAO,OAAOA,CAAK,IAAI;AAIlD,IAAAsJ,GAAgB,MAAM;AACrB,UAAI,CAAC1J,EAAM,UAAW;AAEtB,YAAM2J,IAAQT,EAAS,SACjBU,IAAYX,EAAa;AAC/B,UAAI,CAACU,KAAS,CAACC,EAAW;AAG1B,YAAMC,IAAeJ,KAAaA,EAAU,SAAS;AAAA,CAAI,IAAI,MAAM;AACnE,MAAAE,EAAM,cAAcE,KAAgB;AAEpC,YAAMC,IAAK,OAAO,iBAAiBF,CAAS,GACtCG,IAAa,OAAO,WAAWD,EAAG,UAAU,GAC5CE,IAAgB,OAAO,WAAWF,EAAG,aAAa,GAClDG,IAAc,OAAO,WAAWH,EAAG,WAAW,GAC9CI,IAAe,OAAO,WAAWJ,EAAG,YAAY,GAEhDK,IAAiBP,EAAU,cAAcK,IAAcC;AAE7D,MAAAP,EAAM,MAAM,QAAQ,GAAGQ,CAAc,MACrCR,EAAM,MAAM,aAAa,OACzBA,EAAM,MAAM,gBAAgB;AAE5B,YAAMS,IAAgBT,EAAM;AAI5B,UAFAN,EAAkBe,CAAa,GAE3BtB,GAAiB;AACpB,cAAMuB,IAAeD,IAAgBL,IAAaC;AAClD,QAAIK,MAAiBd,EAAmB,YACvCA,EAAmB,UAAUc,GAC7BvB,EAAgBuB,CAAY;AAAA,MAE9B;AAAA,IACD,GAAG,CAACrK,GAAOyJ,GAAWX,CAAe,CAAC,GAGtCY,GAAgB,MAAM;AACrB,UAAI,CAACX,EAAgB;AACrB,YAAMuB,IAAOnB,EAAa;AAC1B,UAAI,CAACmB,EAAM;AACX,MAAAA,EAAK,cAAcb;AACnB,YAAM1F,IAAIuG,EAAK,cAAc;AAC7B,MAAIvG,MAAMyF,EAAkB,YAC3BA,EAAkB,UAAUzF,GAC5BgF,EAAehF,CAAC;AAAA,IAElB,GAAG,CAAC0F,GAAWV,CAAc,CAAC,GAE9B1D;AAAA,MACCH;AAAA,MACA,OAAO,EAAE,OAAO,MAAA;;AAAM,gBAAAI,IAAA0D,EAAS,YAAT,gBAAA1D,EAAkB;AAAA,QAAM;AAAA,MAC9C,CAAA;AAAA,IAAC;AAGF,UAAMiF,IAAa,CAACvF,GAEdQ,IAAiBC,EAAQ,MAAqB;AACnD,YAAMC,IAAqB;AAAA,QAC1B,UAAU;AAAA,QACV,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,WAAW;AAAA,QACX,UAAU;AAAA,QACV,QAAQ6E,IAAa,SAAS;AAAA,MAAA;AAE/B,MAAA7E,EAAI,iBACHjB,GAAYzE,EAAM,cAAc0E,GAAgB,IAAI,GACrDgB,EAAI,aAAaf,GAAY3E,EAAM,YAAY4E,GAAc,MAAM;AACnE,YAAMe,IAAS3F,EAAM,OAAOA,EAAM,MAAM,QAClC4F,IAASD,KAAU3F,EAAM,KACzB6F,IAAWF,KAAU3F,EAAM,OAC3B8F,IAAYH,KAAU3F,EAAM,QAC5B+F,IAAUJ,KAAU3F,EAAM;AAChC,aAAI4F,MAAQF,EAAI,aAAaM,GAAkBJ,CAAM,IACjDC,MAAUH,EAAI,eAAeM,GAAkBH,CAAQ,IACvDC,MAAWJ,EAAI,gBAAgBM,GAAkBF,CAAS,IAC1DC,MAASL,EAAI,cAAcM,GAAkBD,CAAO,IACjDL;AAAA,IACR,GAAG,CAAC1F,GAAOuK,CAAU,CAAC,GAEhBC,IAAa/E,EAAQ,MAAqB;AAC/C,YAAMC,IAAqB;AAAA,QAC1B,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,YAAYqD,IACT/I,EAAM,YACL,QACA,WACD;AAAA,QACH,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,OAAO;AAAA,MAAA;AAER,MAAIA,EAAM,aAAU0F,EAAI,WAAW,GAAGQ,GAAK,QAAQlG,EAAM,QAAQ,CAAC,OAC9DA,EAAM,eAAY0F,EAAI,aAAa1F,EAAM,aACzCA,EAAM,UAAO0F,EAAI,QAAQ1F,EAAM,QACnC0F,EAAI,aAAa1F,EAAM,aAAa,SAAS,UAC7C0F,EAAI,YAAY1F,EAAM,SAAS,WAAW;AAC1C,YAAM0H,IAAgB,CAAA;AAKtB,cAJI1H,EAAM,aAAW0H,EAAI,KAAK,WAAW,GACrC1H,EAAM,eAAa0H,EAAI,KAAK,cAAc,GAC9ChC,EAAI,iBAAiBgC,EAAI,SAAS,IAAIA,EAAI,KAAK,GAAG,IAAI,QAClD1H,EAAM,eAAY0F,EAAI,aAAa1F,EAAM,aACrCA,EAAM,YAAA;AAAA,QACb,KAAK0E,GAAgB;AACpB,UAAAgB,EAAI,YAAY;AAChB;AAAA,QACD,KAAKhB,GAAgB;AACpB,UAAAgB,EAAI,YAAY;AAChB;AAAA,QACD;AACC,UAAAA,EAAI,YAAY;AAAA,MAAA;AAElB,aAAOA;AAAA,IACR,GAAG,CAAC1F,GAAO+I,CAAc,CAAC,GAEpB0B,IAAiBhF;AAAA,MACtB,OAAsB;AAAA,QACrB,GAAG+E;AAAA,QACH,UAAU;AAAA,QACV,KAAK;AAAA,QACL,MAAM;AAAA,QACN,YAAY;AAAA,QACZ,eAAe;AAAA,QACf,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,UAAU;AAAA,MAAA;AAAA,MAEX,CAACA,CAAU;AAAA,IAAA,GAGNE,IAAajF,EAAQ,MAAqB;AAC/C,YAAMkF,IAAS,CAAC,CAAC5B;AACjB,aAAO;AAAA,QACN,GAAGyB;AAAA,QACH,UAAU;AAAA,QACV,KAAK;AAAA,QACL,MAAM;AAAA,QACN,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,eAAe;AAAA,QACf,UAAU;AAAA,QACV,YAAYG,IAAS,QAAQ;AAAA,QAC7B,UAAUA,IAAS,WAAW;AAAA,QAC9B,cAAcA,IAAS,WAAW;AAAA,QAClC,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,WAAW;AAAA,MAAA;AAAA,IAEb,GAAG,CAACH,GAAYzB,CAAc,CAAC,GAEzBnB,IAAe,CACpBvB,MACI;AACJ,MAAAtB,EAASsB,EAAE,OAAO,KAAK;AAAA,IACxB,GAEMuE,IAAa,MAAM;AACxB,MAAA/B,KAAA,QAAAA,EAASzI;AAAA,IACV,GAKMyK,IAAkBpF,EAAQ,MAAqB;AACpD,UAAI,CAACzF,EAAM,QAAS,QAAO;AAC3B,YAAM8K,IAAI9K,EAAM,QAAQ,MAAM,eAAe;AAC7C,UAAI,CAAC8K,EAAG,QAAO;AACf,UAAI;AACH,eAAO,IAAI,OAAO,IAAIA,EAAE,CAAC,CAAC,GAAG;AAAA,MAC9B,QAAQ;AACP,eAAO;AAAA,MACR;AAAA,IACD,GAAG,CAAC9K,EAAM,OAAO,CAAC,GAGZ+K,IAAoBtF,EAAQ,MAC7BzF,EAAM,cAAc,WAAiB,YACrCA,EAAM,cAAc,QAAc,QAClCA,EAAM,cAAc,UAAgB,UACpCA,EAAM,cAAc,QAAc,QAClCA,EAAM,YAAY,WAAiB,YAChC,QACL,CAACA,EAAM,WAAWA,EAAM,OAAO,CAAC,GAG7BgL,KAAoBC;AAAA,MACzB,CAAC5E,MAA+D;AAC/D,YAAI,CAACwE,EAAiB;AACtB,cAAMK,IAAc7E,EAAE;AACtB,YAAI6E,EAAY;AACf,qBAAWC,KAAQD,EAAY;AAC9B,gBAAI,CAACL,EAAgB,KAAKM,CAAI,GAAG;AAChC,cAAA9E,EAAE,eAAA;AACF;AAAA,YACD;AAAA;AAAA,MAGH;AAAA,MACA,CAACwE,CAAe;AAAA,IAAA,GAIXO,KAAuBH;AAAA,MAC5B,CAAC5E,MAAsE;AACtE,YAAI,CAACwE,EAAiB;AACtB,cAAMQ,IAAKhF,EAAE,eACPiF,IAAW,CAAC,GAAGD,EAAG,KAAK,EAC3B,OAAO,CAACE,MAAMV,EAAgB,KAAKU,CAAC,CAAC,EACrC,KAAK,EAAE;AACT,QAAID,MAAaD,EAAG,SACnBtG,EAASuG,CAAQ;AAAA,MAEnB;AAAA,MACA,CAACT,GAAiB9F,CAAQ;AAAA,IAAA,GAKrByG,IADLvE,MAASG,GAAS,QAAQH,MAASG,GAAS,OACDpH,EAAM,cAAc,QAE1D8H,IAAuB,CAACzB,MAAwC;;AAErE,MAAIkE,KAAclE,EAAE,WAAWA,EAAE,mBAChCf,IAAA0D,EAAS,YAAT,QAAA1D,EAAkB;AAAA,IAEpB;AAEA,QAAItF,EAAM,WAAW;AACpB,YAAMyL,IAA+B;AAAA,QACpC,GAAGjB;AAAA,QACH,QAAQ;AAAA,QACR,UAAUzB,KAEP9B,MAASG,GAAS,OADlB,WAGC;AAAA;AAAA;AAAA,QAGJ,QAAQgC,MAAmB,OAAO,GAAGA,CAAc,OAAO;AAAA,MAAA;AAO3D,aACC,gBAAAhD;AAAA,QAAC;AAAA,QAAA;AAAA,UACA,KAAK6C;AAAA,UACL,OAAOzD;AAAA,UACP,MAAK;AAAA,UACL,SAASsC;AAAA,UACT,WAAW,CAACzB,MAAM;;AACjB,YAAIkE,MAAelE,EAAE,QAAQ,WAAWA,EAAE,QAAQ,UACjDf,IAAA0D,EAAS,YAAT,QAAA1D,EAAkB;AAAA,UACpB;AAAA,UAEA,UAAA;AAAA,YAAA,gBAAAgB,EAAC,SAAI,KAAK4C,GAAU,OAAOwB,GAAY,eAAY,QAAO;AAAA,YAC1D,gBAAApE;AAAA,cAAC;AAAA,cAAA;AAAA,gBACA,KAjBqB,CAAC+E,MAAmC;AAC3D,kBAAArC,EAAS,UAAUqC;AAAA,gBACpB;AAAA,gBAgBG,OAAO5B;AAAA,gBACP,UAAU7B;AAAA,gBACV,QAAQgD;AAAA,gBACR,eAAeI;AAAA,gBACf,kBAAkBI;AAAA,gBAClB,WAAWL;AAAA,gBACX,OAAOU;AAAA,gBACP,aAAAD;AAAA,gBACA,UAAU,CAACjB;AAAA,gBACX,UAAUA,IAAa,IAAI;AAAA,gBAC3B,cAAYtF;AAAA,cAAA;AAAA,YAAA;AAAA,YAEZ8D,KACA,gBAAAzC;AAAA,cAAC;AAAA,cAAA;AAAA,gBACA,KAAK6C;AAAA,gBACL,eAAY;AAAA,gBACZ,OAAOsB;AAAA,cAAA;AAAA,YAAA;AAAA,UACR;AAAA,QAAA;AAAA,MAAA;AAAA,IAIJ;AAEA,WACC,gBAAArE;AAAA,MAAC;AAAA,MAAA;AAAA,QACA,OAAOZ;AAAA,QACP,MAAK;AAAA,QACL,SAASsC;AAAA,QACT,WAAW,CAACzB,MAAM;;AACjB,UAAIkE,MAAelE,EAAE,QAAQ,WAAWA,EAAE,QAAQ,UACjDf,IAAA0D,EAAS,YAAT,QAAA1D,EAAkB;AAAA,QACpB;AAAA,QAEA,UAAA;AAAA,UAAA,gBAAAgB;AAAA,YAAC;AAAA,YAAA;AAAA,cACA,KAAK0C;AAAA,cACL,MAAMhJ,EAAM,aAAa;AAAA,cACzB,OAAOyJ;AAAA,cACP,UAAU7B;AAAA,cACV,QAAQgD;AAAA,cACR,eAAeI;AAAA,cACf,kBAAkBI;AAAA,cAClB,WAAWL;AAAA,cACX,OAAOP;AAAA,cACP,aAAAgB;AAAA,cACA,UAAU,CAACjB;AAAA,cACX,UAAUA,IAAa,IAAI;AAAA,cAC3B,cAAYtF;AAAA,cACZ,KAAKjF,EAAM;AAAA,cACX,KAAKA,EAAM;AAAA,cACX,MAAMA,EAAM;AAAA,YAAA;AAAA,UAAA;AAAA,UAEZ+I,uBACC,QAAA,EAAK,KAAKI,GAAc,eAAY,QAAO,OAAOsB,EAAA,CAAgB;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAIvE;AACD;AAEA7B,GAAa,cAAc;AChYpB,MAAM8C,KAA0D;AAAA,EACtE,MAAM;AAAA,EAEN,MAAM;AAAA,IACL,aAAa;AAAA,IACb,aAAa;AAAA,IACb,aAAa,EAAE,GAAG,GAAG,GAAG,EAAA;AAAA,EAAE;AAAA,EAG3B,UAAU9C;AAAA,EAEV,YAAY;AAAA,IACXnC;AAAA,IACAhH;AAAA,IACAD;AAAA,IACAE;AAAA,IACAC;AAAA,IACAgM;AAAA,IACAC;AAAA,EAAA;AAAA,EAGD,eAAe,CAAC5L,MAAmC;AAIlD,UAAM6L,IAAmC,EAAE,GAF1C,OAAO7L,KAAU,YAAYA,MAAU,OAAOA,IAAQ,CAAA,EAET;AAC9C,IAAI,OAAO6L,EAAQ,aAAc,eAAkB,YAAY,SAC3D,OAAOA,EAAQ,aAAc,eAAkB,YAAY,SAC3D,OAAOA,EAAQ,WAAY,eAAkB,UAAU,SACnC;AAAA,MACvB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA,EAEoB,SAASA,EAAQ,SAAmB,MACxDA,EAAQ,YAAY;AAErB,eAAWC,KAAO,CAAC,OAAO,OAAO,MAAM;AACtC,MAAIA,KAAOD,KAAW,OAAOA,EAAQC,CAAG,KAAM,aAC7CD,EAAQC,CAAG,IAAI;AAGjB,WAAOD;AAAA,EACR;AAAA,EAEA,eAAe,CAACzL,MAA+C;AAC9D,QAAI,OAAOA,KAAU,SAAU,QAAOA;AACtC,QAAI,OAAOA,KAAU,SAAU,QAAO,OAAOA,CAAK;AAAA,EAEnD;AACD;ACtCO,SAAS2L,GAAqBC,GAAyC;AAC7E,QAAMC,IAAc7G,EAAO4G,CAAQ;AACnC,EAAAC,EAAY,UAAUD;AAEtB,QAAME,IAAUjB,EAAY,CAACkB,GAAkBC,MAA4B;AAC1E,UAAMC,IAAUJ,EAAY,QAAQE,CAAQ;AAC5C,IAAKE,MAEJD,MAAY,UACZC,EAAQ,oBAAoB,UAC5B,CAACA,EAAQ,gBAAgBD,CAAO,KAIjCC,EAAQ,QAAQD,CAAO;AAAA,EACxB,GAAG,CAAA,CAAE,GAECE,IAAYrB,EAAY,CAACkB,MAA8B;;AAC5D,aAAO7G,IAAA2G,EAAY,QAAQE,CAAQ,MAA5B,gBAAA7G,EAA+B,gBAAe;AAAA,EACtD,GAAG,CAAA,CAAE;AAEL,SAAOG,EAAQ,OAAO,EAAE,SAAAyG,GAAS,WAAAI,MAAc,CAACJ,GAASI,CAAS,CAAC;AACpE;AC1CO,SAASC,GAAUC,GAAcC,GAAgBrM,GAAuB;AAC9E,MAAIqM,EAAK,WAAW,EAAG,QAAOrM;AAC9B,QAAM,CAACsM,GAAM,GAAGC,CAAI,IAAIF,GAClBG,IACL,OAAOJ,KAAQ,YAAYA,MAAQ,OAAOA,IAAM,CAAA;AAEjD,SAAO;AAAA,IACN,GAAGI;AAAA,IACH,CAACF,CAAI,GAAGH,GAAUK,EAAQF,CAAI,GAAGC,GAAMvM,CAAK;AAAA,EAAA;AAE9C;AAKO,SAASyM,GAAQL,GAAWM,GAAc1M,GAAoB;AACpE,QAAMqM,IAAOK,EAAK,MAAM,GAAG;AAC3B,SAAOP,GAAUC,GAAKC,GAAMrM,CAAK;AAClC;AAOO,SAAS2M,GAAYP,GAAcM,GAAqB;AAC9D,QAAML,IAAOK,EAAK,MAAM,GAAG;AAC3B,MAAIF,IAAmBJ;AACvB,aAAWV,KAAOW,GAAM;AACvB,QAAIG,MAAY,QAAQ,OAAOA,KAAY,SAAU,QAAO;AAC5D,IAAAA,IAAWA,EAAoCd,CAAG;AAAA,EACnD;AACA,SAAQc,KAAqB;AAC9B;AA0CO,SAASI,GACfpL,GACAqL,GACAC,GACiB;AACjB,QAAMC,IAAU/H,EAAOxD,CAAI;AAC3B,EAAAuL,EAAQ,UAAUvL;AAClB,QAAMwL,IAAahI,GAAO8H,KAAA,gBAAAA,EAAS,YAAW,CAAC;AAC/C,EAAAE,EAAW,WAAUF,KAAA,gBAAAA,EAAS,YAAW;AACzC,QAAMG,IAAWjI,EAAO8H,KAAA,gBAAAA,EAAS,KAAK;AACtC,EAAAG,EAAS,UAAUH,KAAA,gBAAAA,EAAS;AAC5B,QAAMI,IAAMrC,EAAY,CAAC6B,MAAwB;;AAEhD,UAAMS,IAAQF,EAAS;AACvB,QAAIE,GAAO;AACV,YAAMjN,IAAIiN,EAAM,IAAIT,CAAI;AACxB,UAAIxM,MAAM,OAAW,QAAOA;AAAA,IAC7B;AAEA,UAAMkD,IAAI2J,EAAQ;AAGlB,WAAIL,EAAK,WAAW,SAAS,IACrBC,GAAYvJ,EAAE,MAAM,QAAQsJ,EAAK,MAAM,CAAC,CAAC,IAI7CA,EAAK,WAAW,OAAO,IACnBC,IAAYzH,IAAA9B,EAAE,MAAM4J,EAAW,OAAO,MAA1B,gBAAA9H,EAA6B,MAAMwH,EAAK,MAAM,CAAC,CAAC,IAI7DC,GAAYvJ,GAAGsJ,CAAI;AAAA,EAC3B,GAAG,CAAA,CAAE,GAECU,IAAMvC;AAAA,IACX,CAAC6B,GAAc1M,MAAuB;;AAErC,YAAMmN,IAAQF,EAAS;AACvB,UAAIE,KACOA,EAAM,IAAIT,CAAI,MACd,QAAW;AACpB,QAAAS,EAAM,IAAIT,GAAM1M,CAAK;AACrB;AAAA,MACD;AAGD,YAAMoD,IAAI2J,EAAQ;AAGlB,UAAIL,EAAK,WAAW,SAAS,GAAG;AAG/B,YAAIA,MAAS,iBAAiB1M,MAAU,IAAM;AAC7C,gBAAMkE,IAASd,EAAE,MAAM,QACjBiK,KAAMnI,IAAAhB,EAAO,QAAP,QAAAgB,EAAY,OAAOhB,EAAO,MAAMA,EAAO;AACnD,UAAA2I;AAAA,YACC;AAAA,cACC,GAAGzJ;AAAA,cACH,OAAO,EAAE,GAAGA,EAAE,OAAO,QAAQ,EAAE,GAAGc,GAAQ,MAAM,IAAM,KAAAmJ,EAAA,EAAI;AAAA,YAAE;AAAA,YAE7D,EAAE,UAAUC,GAAWZ,CAAI,EAAA;AAAA,UAAE;AAE9B;AAAA,QACD;AACA,cAAMa,IAASb,EAAK,MAAM,CAAC,GACrBc,IAAYrB;AAAA,UACjB/I,EAAE,MAAM;AAAA,UACRmK,EAAO,MAAM,GAAG;AAAA,UAChBvN;AAAA,QAAA;AAED,QAAA6M;AAAA,UACC,EAAE,GAAGzJ,GAAG,OAAO,EAAE,GAAGA,EAAE,OAAO,QAAQoK,IAAU;AAAA,UAC/C,EAAE,UAAUF,GAAWZ,CAAI,EAAA;AAAA,QAAE;AAE9B;AAAA,MACD;AAGA,UAAIA,EAAK,WAAW,OAAO,GAAG;AAC7B,cAAMe,IAAKT,EAAW,SAChBnL,IAAOuB,EAAE,MAAMqK,CAAE;AACvB,YAAI,CAAC5L,EAAM;AACX,cAAM6L,IAAUvB,GAAUtK,EAAK,MAAM6K,EAAK,MAAM,CAAC,EAAE,MAAM,GAAG,GAAG1M,CAAK,GAC9DgD,IAAWI,EAAE,MAAM;AAAA,UAAI,CAACvD,GAAG0C,MAChCA,MAAMkL,IAAK,EAAE,GAAG5N,GAAG,MAAM6N,MAAY7N;AAAA,QAAA;AAEtC,QAAAgN;AAAA,UACC,EAAE,GAAGzJ,GAAG,OAAOJ,EAAA;AAAA,UACf,EAAE,UAAUsK,GAAWZ,CAAI,EAAA;AAAA,QAAE;AAE9B;AAAA,MACD;AAGA,MAAAG,EAAaJ,GAAQrJ,GAAGsJ,GAAM1M,CAAK,GAAG,EAAE,UAAUsN,GAAWZ,CAAI,GAAG;AAAA,IACrE;AAAA,IACA,CAACG,CAAY;AAAA,EAAA;AAGd,SAAOxH,EAAQ,OAAO,EAAE,KAAA6H,GAAK,KAAAE,MAAQ,CAACF,GAAKE,CAAG,CAAC;AAChD;ACzLA,MAAMO,KAAkB;AA8BxB,SAASC,GAAYC,GAAkBC,GAA+B;AACrE,UAAQA,EAAO,MAAA;AAAA,IACd,KAAK,QAAQ;AACZ,YAAMC,IAAOF,EAAM,QAAQA,EAAM,GAAG;AAOpC,UALCC,EAAO,aAAa,WACpBC,KAAA,gBAAAA,EAAM,cAAaD,EAAO,aACzBA,EAAO,iBAAiB,MACxBA,EAAO,cAAaC,KAAA,gBAAAA,EAAM,cAAa,KAAKJ;AAG7C,eAAO;AAAA,UACN,SAAS;AAAA,YACR,GAAGE,EAAM,QAAQ,MAAM,GAAGA,EAAM,GAAG;AAAA,YACnC;AAAA,cACC,MAAMC,EAAO;AAAA,cACb,UAAUA,EAAO;AAAA,cACjB,WAAWA,EAAO;AAAA,YAAA;AAAA,UACnB;AAAA,UAED,KAAKD,EAAM;AAAA,QAAA;AAGb,YAAMG,IAAa;AAAA,QAClB,GAAGH,EAAM,QAAQ,MAAM,GAAGA,EAAM,MAAM,CAAC;AAAA,QACvC;AAAA,UACC,MAAMC,EAAO;AAAA,UACb,UAAUA,EAAO;AAAA,UACjB,WAAWA,EAAO;AAAA,QAAA;AAAA,MACnB,GAEKG,IACLD,EAAW,SAASF,EAAO,aACxBE,EAAW,MAAMA,EAAW,SAASF,EAAO,UAAU,IACtDE;AACJ,aAAO;AAAA,QACN,SAASC;AAAA,QACT,KAAKA,EAAQ,SAAS;AAAA,MAAA;AAAA,IAExB;AAAA,IACA,KAAK;AACJ,aAAO,EAAE,GAAGJ,GAAO,KAAK,KAAK,IAAI,GAAGA,EAAM,MAAM,CAAC,EAAA;AAAA,IAClD,KAAK;AACJ,aAAO;AAAA,QACN,GAAGA;AAAA,QACH,KAAK,KAAK,IAAIA,EAAM,QAAQ,SAAS,GAAGA,EAAM,MAAM,CAAC;AAAA,MAAA;AAAA,EACtD;AAEH;AAEA,MAAMK,KAAsB;AAwDrB,SAASC,GAAe;AAAA,EAC9B,aAAAC;AAAA,EACA,YAAAC,IAAaH;AACd,GAAgD;;AAC/C,QAAMI,IAAqBD,KAAcH,IAEnC,CAACL,GAAOU,CAAQ,IAAIC,GAAWZ,IAAa,QAAW,OAAO;AAAA,IACnE,SAAS,CAAC,EAAE,MAAMQ,GAAa,WAAW,KAAK,IAAA,GAAO;AAAA,IACtD,KAAK;AAAA,EAAA,EACJ,GAEI5M,MAAO0D,IAAA2I,EAAM,QAAQA,EAAM,GAAG,MAAvB,gBAAA3I,EAA0B,SAAQkJ,GAEzCK,IAAmB5D;AAAA,IACxB,CACC6D,GACA5B,MACI;AACJ,MAAAyB,EAAS;AAAA,QACR,MAAM;AAAA,QACN,MAAMG;AAAA,QACN,UAAU5B,KAAA,gBAAAA,EAAS;AAAA,QACnB,cAAcA,KAAA,gBAAAA,EAAS;AAAA,QACvB,WAAW,KAAK,IAAA;AAAA,QAChB,YAAYwB;AAAA,MAAA,CACZ;AAAA,IACF;AAAA,IACA,CAACA,CAAkB;AAAA,EAAA,GAGdK,IAAO9D,EAAY,MAAM0D,EAAS,EAAE,MAAM,OAAA,CAAQ,GAAG,EAAE,GACvDK,IAAO/D,EAAY,MAAM0D,EAAS,EAAE,MAAM,OAAA,CAAQ,GAAG,EAAE;AAE7D,SAAO;AAAA,IACN,MAAA/M;AAAA,IACA,kBAAAiN;AAAA,IACA,SAASZ,EAAM,MAAM;AAAA,IACrB,SAASA,EAAM,MAAMA,EAAM,QAAQ,SAAS;AAAA,IAC5C,MAAAc;AAAA,IACA,MAAAC;AAAA,IACA,uBAAuB;AAAA,MACtB,MAAM,EAAE,SAASD,GAAM,WAAW,MAAMd,EAAM,MAAM,EAAA;AAAA,MACpD,MAAM;AAAA,QACL,SAASe;AAAA,QACT,WAAW,MAAMf,EAAM,MAAMA,EAAM,QAAQ,SAAS;AAAA,MAAA;AAAA,IACrD;AAAA,EACD;AAEF;AChLO,SAASgB,GACfC,GACAC,GACqB;AACrB,MAAID,MAASE,GAAS,OAAQ,QAAO,GAAGD,IAAY,CAAC,IAAIA,IAAY,CAAC;AACtE,MAAID,MAASE,GAAS,OAAQ,QAAO,GAAGD,IAAY,CAAC,IAAIA,IAAY,CAAC;AAEvE;AAOO,SAASE,GAAUC,GAAkBC,GAAa;AACxD,SAAO;AAAA,IACN,QAAQD,EAAM;AAAA,IACd,aAAapJ,GAAK,QAAQoJ,EAAM,OAAOC,CAAG;AAAA,IAC1C,iBAAiBN,GAAiBK,EAAM,MAAMA,EAAM,MAAM,KAAK;AAAA,EAAA;AAEjE;ACOO,MAAME,KAAoCC;AAAA,EAChD,CAAC;AAAA,IACA,aAAAC;AAAA,IACA,aAAAC;AAAA,IACA,aAAAC;AAAA,IACA,WAAAC,IAAYC,GAAgB;AAAA,IAC5B,SAAAC,IAAU;AAAA,IACV,KAAAR,IAAMS;AAAA,EAAA,MACD;AACL,QAAI,CAACD,KAAW,CAACJ,EAAa,QAAO;AACrC,UAAM,EAAE,KAAAM,GAAK,OAAAC,GAAO,QAAAC,GAAQ,MAAAC,MAAST;AACrC,QAAI,CAACM,KAAO,CAACC,KAAS,CAACC,KAAU,CAACC,EAAM,QAAO;AAE/C,UAAM,EAAE,OAAOrM,GAAG,QAAQE,MAAMyL,GAC1BtO,IAASE,GAAasO,GAAaC,CAAS;AAElD,WACC,gBAAAzJ;AAAA,MAAC;AAAA,MAAA;AAAA,QACA,MAAK;AAAA,QACL,eAAY;AAAA,QACZ,OAAO;AAAA,UACN,UAAU;AAAA,UACV,OAAO;AAAA,UACP,OAAO,GAAGrC,CAAC;AAAA,UACX,QAAQ,GAAGE,CAAC;AAAA,UACZ,eAAe;AAAA,UACf,UAAU;AAAA,UACV,QAAA7C;AAAA,QAAA;AAAA,QAED,OAAO2C;AAAA,QACP,QAAQE;AAAA,QACR,eAAY;AAAA,QAEX,UAAA;AAAA,UAAAgM,KAAO,gBAAA3J,EAAC,QAAA,EAAK,IAAI,GAAG,IAAI,GAAG,IAAIvC,GAAG,IAAI,GAAI,GAAGsL,GAAUY,GAAKV,CAAG,GAAG;AAAA,UAClEW,KACA,gBAAA5J,EAAC,QAAA,EAAK,IAAIvC,GAAG,IAAI,GAAG,IAAIA,GAAG,IAAIE,GAAI,GAAGoL,GAAUa,GAAOX,CAAG,GAAG;AAAA,UAE7DY,KACA,gBAAA7J,EAAC,QAAA,EAAK,IAAI,GAAG,IAAIrC,GAAG,IAAIF,GAAG,IAAIE,GAAI,GAAGoL,GAAUc,GAAQZ,CAAG,GAAG;AAAA,UAE9Da,KAAQ,gBAAA9J,EAAC,QAAA,EAAK,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAIrC,GAAI,GAAGoL,GAAUe,GAAMb,CAAG,EAAA,CAAG;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAGxE;AACD;AAEAC,GAAY,cAAc;ACzDnB,MAAMa,KAAoCZ;AAAA,EAChD,CAAC;AAAA,IACA,aAAAC;AAAA,IACA,aAAAE;AAAA,IACA,WAAAC,IAAYC,GAAgB;AAAA,IAC5B,iBAAAQ,IAAkB;AAAA,EAAA,MACb;AACL,UAAMlP,IAASE,GAAasO,GAAaC,CAAS,GAE5CP,IAAuB;AAAA,MAC5B,UAAU;AAAA,MACV,OAAO;AAAA,MACP,OAAO,GAAGI,EAAY,KAAK;AAAA,MAC3B,QAAQ,GAAGA,EAAY,MAAM;AAAA,MAC7B,iBAAAY;AAAA,MACA,eAAe;AAAA,MACf,QAAAlP;AAAA,IAAA;AAGD,WACC,gBAAAkF;AAAA,MAAC;AAAA,MAAA;AAAA,QACA,OAAAgJ;AAAA,QACA,MAAK;AAAA,QACL,eAAY;AAAA,QACZ,eAAY;AAAA,MAAA;AAAA,IAAA;AAAA,EAGf;AACD;AAEAe,GAAY,cAAc;AClD1B,SAASE,GAAYrB,GAAgBsB,GAAyC;AAC7E,MAAItB,MAASE,GAAS,OAAQ,QAAO,GAAGoB,IAAc,CAAC,IAAIA,IAAc,CAAC;AAC1E,MAAItB,MAASE,GAAS,OAAQ,QAAO,GAAGoB,CAAW,IAAIA,IAAc,CAAC;AAEvE;AAQO,MAAMC,KAAoC;AAAA,EAChD,KAAK;AAAA,IACJ,OAAO;AAAA,IACP,OAAO,EAAE,OAAO,GAAG,MAAM,KAAA;AAAA,IACzB,MAAMrB,GAAS;AAAA,EAAA;AAAA,EAEhB,OAAO;AAAA,IACN,OAAO;AAAA,IACP,OAAO,EAAE,OAAO,GAAG,MAAM,KAAA;AAAA,IACzB,MAAMA,GAAS;AAAA,EAAA;AAAA,EAEhB,QAAQ;AAAA,IACP,OAAO;AAAA,IACP,OAAO,EAAE,OAAO,GAAG,MAAM,KAAA;AAAA,IACzB,MAAMA,GAAS;AAAA,EAAA;AAAA,EAEhB,MAAM;AAAA,IACL,OAAO;AAAA,IACP,OAAO,EAAE,OAAO,GAAG,MAAM,KAAA;AAAA,IACzB,MAAMA,GAAS;AAAA,EAAA;AAEjB,GA8BasB,KAA8CjB;AAAA,EAC1D,CAAC;AAAA,IACA,aAAAC;AAAA,IACA,aAAAE;AAAA,IACA,WAAAC,IAAYC,GAAgB;AAAA,IAC5B,aAAAH,IAAcc;AAAA,IACd,SAAAV,IAAU;AAAA,EAAA,MACL;AACL,QAAI,CAACA,KAAW,CAACJ,EAAa,QAAO;AACrC,UAAM,EAAE,KAAAM,GAAK,OAAAC,GAAO,QAAAC,GAAQ,MAAAC,MAAST;AACrC,QAAI,CAACM,KAAO,CAACC,KAAS,CAACC,KAAU,CAACC,EAAM,QAAO;AAE/C,UAAM,EAAE,OAAOrM,GAAG,QAAQE,MAAMyL,GAC1BtO,IAASE,GAAasO,GAAaC,CAAS;AAGlD,WACC,gBAAAzJ;AAAA,MAAC;AAAA,MAAA;AAAA,QACA,MAAK;AAAA,QACL,eAAY;AAAA,QACZ,OAAO;AAAA,UACN,UAAU;AAAA,UACV,OAAO;AAAA,UACP,OAAO,GAAGrC,CAAC;AAAA,UACX,QAAQ,GAAGE,CAAC;AAAA,UACZ,eAAe;AAAA,UACf,UAAU;AAAA,UACV,QAAA7C;AAAA,QAAA;AAAA,QAED,OAAO2C;AAAA,QACP,QAAQE;AAAA,QACR,eAAY;AAAA,QAEX,UAAA;AAAA,UAAAgM,KACA,gBAAA3J;AAAA,YAAC;AAAA,YAAA;AAAA,cACA,IAAI;AAAA,cACJ,IAAI;AAAA,cACJ,IAAIvC;AAAA,cACJ,IAAI;AAAA,cACJ,QAAQkM,EAAI;AAAA,cACZ,aAAaA,EAAI,MAAM;AAAA,cACvB,iBAAiBM,GAAYN,EAAI,MAAMA,EAAI,MAAM,KAAK;AAAA,YAAA;AAAA,UAAA;AAAA,UAGvDC,KACA,gBAAA5J;AAAA,YAAC;AAAA,YAAA;AAAA,cACA,IAAIvC;AAAA,cACJ,IAAI;AAAA,cACJ,IAAIA;AAAA,cACJ,IAAIE;AAAA,cACJ,QAAQiM,EAAM;AAAA,cACd,aAAaA,EAAM,MAAM;AAAA,cACzB,iBAAiBK,GAAYL,EAAM,MAAMA,EAAM,MAAM,KAAK;AAAA,YAAA;AAAA,UAAA;AAAA,UAG3DC,KACA,gBAAA7J;AAAA,YAAC;AAAA,YAAA;AAAA,cACA,IAAI;AAAA,cACJ,IAAIrC;AAAA,cACJ,IAAIF;AAAA,cACJ,IAAIE;AAAA,cACJ,QAAQkM,EAAO;AAAA,cACf,aAAaA,EAAO,MAAM;AAAA,cAC1B,iBAAiBI,GAAYJ,EAAO,MAAMA,EAAO,MAAM,KAAK;AAAA,YAAA;AAAA,UAAA;AAAA,UAG7DC,KACA,gBAAA9J;AAAA,YAAC;AAAA,YAAA;AAAA,cACA,IAAI;AAAA,cACJ,IAAI;AAAA,cACJ,IAAI;AAAA,cACJ,IAAIrC;AAAA,cACJ,QAAQmM,EAAK;AAAA,cACb,aAAaA,EAAK,MAAM;AAAA,cACxB,iBAAiBG,GAAYH,EAAK,MAAMA,EAAK,MAAM,KAAK;AAAA,YAAA;AAAA,UAAA;AAAA,QACzD;AAAA,MAAA;AAAA,IAAA;AAAA,EAIJ;AACD;AAEAM,GAAiB,cAAc;ACrF/B,MAAMC,KAAqB,CAC1B;AAAA,EACC,IAAAxO;AAAA,EACA,gBAAAyO;AAAA,EACA,OAAA5Q;AAAA,EACA,OAAAI;AAAA,EACA,UAAA2E;AAAA,EACA,QAAA8D;AAAA,EACA,UAAA7D;AAAA,EACA,MAAAiC;AAAA,EACA,aAAAyI;AAAA,EACA,aAAAE;AAAA,EACA,WAAAC,IAAYC,GAAgB;AAAA,EAC5B,iBAAAhH;AAAA,EACA,gBAAAC;AAAA,EACA,gBAAAnI;AAAA,EACA,eAAAiQ;AACD,GACA3L,MACI;AACJ,QAAM4L,IAAW1L,EAAiB,IAAI;AAEtC,EAAAC;AAAA,IACCH;AAAA,IACA,OAAO,EAAE,OAAO,MAAA;;AAAM,cAAAI,IAAAwL,EAAS,YAAT,gBAAAxL,EAAkB;AAAA,MAAM;AAAA,IAC9C,CAAA;AAAA,EAAC;AAGF,QAAMlE,IAASE,GAAasO,GAAaC,CAAS,GAE5CrK,IAAgC;AAAA,IACrC,UAAU;AAAA,IACV,OAAO;AAAA,IACP,OAAO,GAAGkK,EAAY,KAAK;AAAA,IAC3B,QAAQ,GAAGA,EAAY,MAAM;AAAA,IAC7B,QAAAtO;AAAA,IACA,eAAe;AAAA,EAAA,GAGV2P,IAA6D;AAAA,IAClE,IAAA5O;AAAA,IACA,OAAAnC;AAAA,IACA,OAAAI;AAAA,IACA,UAAU2E,MAAa,MAAM;AAAA,IAAC;AAAA,IAC9B,QAAA8D;AAAA,IACA,UAAA7D;AAAA,IACA,MAAAiC;AAAA,IACA,YAAY,EAAE,SAASyI,EAAY,OAAO,UAAUA,EAAY,OAAA;AAAA,IAChE,iBAAA5G;AAAA,IACA,gBAAAC;AAAA,IACA,WAAW6H,EAAe,KAAK;AAAA,IAC/B,gBAAAhQ;AAAA,IACA,eAAAiQ;AAAA,EAAA,GAGK,EAAE,UAAAG,MAAaJ;AAErB,SACC,gBAAAtK;AAAA,IAAC;AAAA,IAAA;AAAA,MACA,OAAOd;AAAA,MACP,eAAY;AAAA,MACZ,iBAAerD;AAAA,MACf,oBAAkByO,EAAe;AAAA,MAEjC,UAAA,gBAAAtK,EAAC0K,GAAA,EAAS,KAAKF,GAAW,GAAGC,EAAA,CAAe;AAAA,IAAA;AAAA,EAAA;AAG/C,GAUaE,KAAgBxB;AAAA,EAC5B3K,GAAyC6L,EAAkB;AAC5D;AAEAM,GAAc,cAAc;AC1IrB,SAASC,GACfhP,GACA0O,GACAO,GACwB;AACxB,QAAMC,KAAeD,KAAA,gBAAAA,EAAgBjP,EAAM,UAAS,CAAA;AACpD,SAAO;AAAA,IACN,GAAG0O,EAAe;AAAA,IAClB,GAAGQ;AAAA,IACH,GAAGlP,EAAM;AAAA,EAAA;AAEX;ACQO,MAAMmP,KAAgD5B;AAAA,EAC5D,CAAC,EAAE,aAAAC,GAAa,aAAAE,GAAa,QAAAvP,QAAa;AACzC,UAAM,CAACiR,GAASC,CAAU,IAAIjI,GAAS,EAAK;AAE5C,QAAIjJ,EAAO,WAAW,EAAG,QAAO;AAEhC,UAAMe,IAASE,GAAasO,GAAaE,GAAgB,UAAU,GAC7D0B,IAAe,GACfC,IACL,wFAEKjM,IAAgC;AAAA,MACrC,UAAU;AAAA,MACV,KAAK,CAACgM;AAAA,MACN,MAAM,CAACA;AAAA,MACP,OAAO,GAAG9B,EAAY,QAAQ8B,IAAe,CAAC;AAAA,MAC9C,QAAQ,GAAG9B,EAAY,SAAS8B,IAAe,CAAC;AAAA,MAChD,QAAApQ;AAAA,MACA,eAAe;AAAA,IAAA,GAGVsQ,IAAY,CAACC,OAAwC;AAAA,MAC1D,UAAU;AAAA,MACV,YAAYF;AAAA,MACZ,GAAGE;AAAA,IAAA;AAGJ,WACC,gBAAAvL,EAAC,OAAA,EAAI,OAAOZ,GAAgB,eAAY,sBACvC,UAAA;AAAA,MAAA,gBAAAc;AAAA,QAAC;AAAA,QAAA;AAAA,UACA,OAAOoL,EAAU;AAAA,YAChB,KAAK;AAAA,YACL,MAAM;AAAA,YACN,OAAO;AAAA,YACP,QAAQF;AAAA,UAAA,CACR;AAAA,QAAA;AAAA,MAAA;AAAA,MAEF,gBAAAlL;AAAA,QAAC;AAAA,QAAA;AAAA,UACA,OAAOoL,EAAU;AAAA,YAChB,QAAQ;AAAA,YACR,MAAM;AAAA,YACN,OAAO;AAAA,YACP,QAAQF;AAAA,UAAA,CACR;AAAA,QAAA;AAAA,MAAA;AAAA,MAEF,gBAAAlL;AAAA,QAAC;AAAA,QAAA;AAAA,UACA,OAAOoL,EAAU;AAAA,YAChB,KAAK;AAAA,YACL,MAAM;AAAA,YACN,OAAOF;AAAA,YACP,QAAQ;AAAA,UAAA,CACR;AAAA,QAAA;AAAA,MAAA;AAAA,MAEF,gBAAAlL;AAAA,QAAC;AAAA,QAAA;AAAA,UACA,OAAOoL,EAAU;AAAA,YAChB,KAAK;AAAA,YACL,OAAO;AAAA,YACP,OAAOF;AAAA,YACP,QAAQ;AAAA,UAAA,CACR;AAAA,QAAA;AAAA,MAAA;AAAA,MAEF,gBAAApL;AAAA,QAAC;AAAA,QAAA;AAAA,UACA,MAAK;AAAA,UACL,OAAO;AAAA,YACN,UAAU;AAAA,YACV,KAAK;AAAA,YACL,OAAO;AAAA,YACP,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,YAAY;AAAA,YACZ,gBAAgB;AAAA,YAChB,UAAU;AAAA,YACV,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,eAAe;AAAA,YACf,YAAY;AAAA,YACZ,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,SAAS;AAAA,UAAA;AAAA,UAEV,cAAc,MAAMmL,EAAW,EAAI;AAAA,UACnC,cAAc,MAAMA,EAAW,EAAK;AAAA,UACpC,cAAYlR,EAAO,IAAI,CAACgG,MAAMA,EAAE,OAAO,EAAE,KAAK,KAAK;AAAA,UACnD,UAAA;AAAA,YAAA;AAAA,YAECiL,KACA,gBAAAhL;AAAA,cAAC;AAAA,cAAA;AAAA,gBACA,OAAO;AAAA,kBACN,UAAU;AAAA,kBACV,KAAK;AAAA,kBACL,OAAO;AAAA,kBACP,UAAU;AAAA,kBACV,UAAU;AAAA,kBACV,iBAAiB;AAAA,kBACjB,OAAO;AAAA,kBACP,UAAU;AAAA,kBACV,YAAY;AAAA,kBACZ,SAAS;AAAA,kBACT,cAAc;AAAA,kBACd,WAAW;AAAA,kBACX,eAAe;AAAA,kBACf,YAAY;AAAA,kBACZ,WAAW;AAAA,kBACX,QAAQlF,IAAS;AAAA,gBAAA;AAAA,gBAGjB,UAAAf,EAAO,IAAI,CAACgG,MACZ,gBAAAC,EAAC,SAAkB,UAAAD,EAAE,WAAXA,EAAE,IAAiB,CAC7B;AAAA,cAAA;AAAA,YAAA;AAAA,UACF;AAAA,QAAA;AAAA,MAAA;AAAA,MAGF,gBAAAC,EAAC,WAAO,UAAA,oFAAA,CAAoF;AAAA,IAAA,GAC7F;AAAA,EAEF;AACD;AAEA+K,GAAkB,cAAc;AC7CzB,MAAMO,KAAiBnC;AAAA,EAC7B3K;AAAA,IACC,CACC;AAAA,MACC,OAAA5C;AAAA,MACA,gBAAA0O;AAAA,MACA,aAAAiB;AAAA,MACA,aAAAjC;AAAA,MACA,MAAA3I;AAAA,MACA,OAAA7G;AAAA,MACA,eAAA+Q;AAAA,MACA,eAAAW;AAAA,MACA,QAAAjJ;AAAA,MACA,YAAAkJ,IAAa;AAAA,MACb,YAAAC,IAAa;AAAA,MACb,oBAAAC,IAAqBxB;AAAA,MACrB,KAAAlB,IAAMS;AAAA,MACN,eAAAkC,IAAgB;AAAA,MAChB,gBAAAC,IAAiB;AAAA,MACjB,kBAAAC;AAAA,MACA,iBAAAtJ;AAAA,MACA,gBAAAC;AAAA,MACA,gBAAAsJ;AAAA,MACA,gBAAAzR;AAAA,MACA,eAAAiQ;AAAA,IAAA,GAED3L,MACI;;AACJ,YAAM,CAACoN,GAAaC,CAAc,IAAIjJ,GAAwB,IAAI,GAC5D,CAACkJ,GAAYC,CAAa,IAAInJ,GAAwB,IAAI,GAE1DoJ,IAAsBzH;AAAA,QAC3B,CAAC0H,MAAqB;AACrB,UAAAJ,EAAeI,CAAQ,GACvB7J,KAAA,QAAAA,EAAkB5G,EAAM,IAAIyQ;AAAA,QAC7B;AAAA,QACA,CAACzQ,EAAM,IAAI4G,CAAe;AAAA,MAAA,GAGrB8J,IAAqB3H;AAAA,QAC1B,CAAC4H,MAAoB;AACpB,UAAAJ,EAAcI,CAAO,GACrB9J,KAAA,QAAAA,EAAiB7G,EAAM,IAAI2Q;AAAA,QAC5B;AAAA,QACA,CAAC3Q,EAAM,IAAI6G,CAAc;AAAA,MAAA,GAGpB+J,KAAkBhK,IACrB,KAAK,IAAI+I,EAAY,QAAQS,KAAe,CAAC,IAC7CT,EAAY,QAETkB,KAAiBhK,IACpB,KAAK,IAAI8I,EAAY,OAAOW,KAAc,CAAC,IAC3CX,EAAY,OAETrM,KAAgC;AAAA,QACrC,UAAU;AAAA,QACV,MAAM,GAAGqM,EAAY,IAAI;AAAA,QACzB,KAAK,GAAGA,EAAY,GAAG;AAAA,QACvB,OAAO,GAAGkB,EAAc;AAAA,QACxB,QAAQ,GAAGD,EAAe;AAAA,QAC1B,QAAQlD;AAAA,QACR,eAAAsC;AAAA,QACA,WAAW;AAAA,MAAA,GAGNc,IAAoCvN;AAAA,QACzC,OAAO,EAAE,OAAOsN,IAAgB,QAAQD,GAAA;AAAA,QACxC,CAACC,IAAgBD,EAAe;AAAA,MAAA,GAG3BG,IAAgB/B;AAAA,QACrBhP;AAAA,QACA0O;AAAA,QACAO;AAAA,MAAA,GAEK+B,IAAiBtC,EAAe,gBACnCA,EAAe,cAAcqC,CAAa,IAC1CA,GACGE,IAAiBvC,EAAe,gBAClCA,EAAe,cAAcxQ,GAAO8S,CAAc,KACpDhR,EAAM,aACN9B,IACCA,GAEGgT,IAAYhB,KAAoBA,EAAiB,SAAS,GAC1DiB,IAAcD,IAAY,SAASlR,EAAM,EAAE,KAAK,QAChDoR,IAAYjB,MAAmBnQ,EAAM;AAE3C,aACC,gBAAAkE;AAAA,QAAC;AAAA,QAAA;AAAA,UACA,cAAYwK,EAAe,KAAK;AAAA,UAChC,gBAAcwC,KAAa;AAAA,UAC3B,oBAAkBC;AAAA,UAClB,OAAO7N;AAAA,UACP,eAAa,SAAStD,EAAM,EAAE;AAAA,UAC9B,iBAAeA,EAAM;AAAA,UAGrB,UAAA;AAAA,YAAA,gBAAAoE;AAAA,cAAC+J;AAAA,cAAA;AAAA,gBACA,aAAa2C;AAAA,gBACb,aAAApD;AAAA,gBACA,kBAAiBtK,IAAApD,EAAM,UAAN,gBAAAoD,EAAa;AAAA,gBAC9B,WAAWwK,GAAgB;AAAA,cAAA;AAAA,YAAA;AAAA,YAG3BiC,KAAc,GAAChK,IAAA7F,EAAM,UAAN,QAAA6F,EAAa,WAC5B,gBAAAzB;AAAA,cAACoK;AAAA,cAAA;AAAA,gBACA,aAAasC;AAAA,gBACb,aAAApD;AAAA,gBACA,WAAWE,GAAgB;AAAA,gBAC3B,aAAamC;AAAA,cAAA;AAAA,YAAA;AAAA,YAIf,gBAAA3L;AAAA,cAAC2K;AAAA,cAAA;AAAA,gBACA,KAAA/L;AAAA,gBACA,IAAIhD,EAAM;AAAA,gBACV,gBAAA0O;AAAA,gBACA,OAAOsC;AAAA,gBACP,OAAOC;AAAA,gBACP,UAAUrB;AAAA,gBACV,QAAAjJ;AAAA,gBACA,UACC5B,MAASG,GAAS,SACdiB,IAAAnG,EAAM,aAAN,gBAAAmG,EAAgB,aAAY,KAC7B;AAAA,gBAEJ,MAAApB;AAAA,gBACA,aAAa+L;AAAA,gBACb,aAAApD;AAAA,gBACA,WAAWE,GAAgB;AAAA,gBAC3B,iBAAiBhH,IAAkB4J,IAAsB;AAAA,gBACzD,gBAAgB3J,IAAiB6J,IAAqB;AAAA,gBACtD,gBAAAhS;AAAA,gBACA,eAAAiQ;AAAA,cAAA;AAAA,YAAA;AAAA,YAGD,gBAAAvK;AAAA,cAACkJ;AAAA,cAAA;AAAA,gBACA,aAAawD;AAAA,gBACb,aAAApD;AAAA,gBACA,cAAa2D,IAAArR,EAAM,UAAN,gBAAAqR,EAAa;AAAA,gBAC1B,WAAWzD,GAAgB;AAAA,gBAC3B,SAASkC;AAAA,gBACT,KAAAzC;AAAA,cAAA;AAAA,YAAA;AAAA,YAGA4C,KAAkBiB,KAClB,gBAAA9M;AAAA,cAAC+K;AAAA,cAAA;AAAA,gBACA,aAAa2B;AAAA,gBACb,aAAApD;AAAA,gBACA,QAAQwC;AAAA,cAAA;AAAA,YAAA;AAAA,YAITgB,KACA,gBAAA9M;AAAA,cAAC;AAAA,cAAA;AAAA,gBACA,IAAI+M;AAAA,gBACJ,OAAO;AAAA,kBACN,UAAU;AAAA,kBACV,OAAO;AAAA,kBACP,QAAQ;AAAA,kBACR,SAAS;AAAA,kBACT,QAAQ;AAAA,kBACR,UAAU;AAAA,kBACV,MAAM;AAAA,kBACN,YAAY;AAAA,kBACZ,QAAQ;AAAA,gBAAA;AAAA,gBAGR,UAAAjB,EAAiB,IAAI,CAAC/L,MAAMA,EAAE,OAAO,EAAE,KAAK,IAAI;AAAA,cAAA;AAAA,YAAA;AAAA,YAIlDiN,KACA,gBAAAhN;AAAA,cAAC;AAAA,cAAA;AAAA,gBACA,eAAY;AAAA,gBACZ,OAAO;AAAA,kBACN,UAAU;AAAA,kBACV,OAAO;AAAA,kBACP,WAAW;AAAA,kBACX,eAAe;AAAA,kBACf,QAAQjF,GAAQ;AAAA,kBAChB,WAAW;AAAA,gBAAA;AAAA,cACZ;AAAA,YAAA;AAAA,UACD;AAAA,QAAA;AAAA,MAAA;AAAA,IAIJ;AAAA,EAAA;AAAA;AAAA,EAGD,CAACmS,GAAMC,MACND,EAAK,UAAUC,EAAK,SACpBD,EAAK,mBAAmBC,EAAK,kBAC7BD,EAAK,YAAY,SAASC,EAAK,YAAY,QAC3CD,EAAK,YAAY,QAAQC,EAAK,YAAY,OAC1CD,EAAK,YAAY,UAAUC,EAAK,YAAY,SAC5CD,EAAK,YAAY,WAAWC,EAAK,YAAY,UAC7CD,EAAK,gBAAgBC,EAAK,eAC1BD,EAAK,SAASC,EAAK,QACnBD,EAAK,UAAUC,EAAK,SACpBD,EAAK,kBAAkBC,EAAK;AAAA;AAAA;AAAA,EAI5BD,EAAK,eAAeC,EAAK,cACzBD,EAAK,eAAeC,EAAK,cACzBD,EAAK,uBAAuBC,EAAK,sBACjCD,EAAK,QAAQC,EAAK,OAClBD,EAAK,kBAAkBC,EAAK,iBAC5BD,EAAK,mBAAmBC,EAAK,kBAC7BD,EAAK,qBAAqBC,EAAK,oBAC/BD,EAAK,oBAAoBC,EAAK,mBAC9BD,EAAK,mBAAmBC,EAAK,kBAC7BD,EAAK,mBAAmBC,EAAK,kBAC7BD,EAAK,mBAAmBC,EAAK,kBAC7BD,EAAK,kBAAkBC,EAAK;AAC9B;AAEA7B,GAAe,cAAc;ACjT7B,MAAM8B,KAAsB,CAACC,GAAaC,MAAe;AAAC,GACpDC,KAAqB,CAACF,GAAaG,MAAe;AAAC,GA2E5CC,KAAatE;AAAA,EACzB,CAAC;AAAA,IACA,QAAAuE;AAAA,IACA,gBAAAC;AAAA,IACA,MAAAhN;AAAA,IACA,QAAA3D;AAAA,IACA,eAAA6N;AAAA,IACA,kBAAA+C,IAAmB,CAAA;AAAA,IACnB,gBAAAC;AAAA,IACA,eAAArC;AAAA,IACA,QAAAjJ;AAAA,IACA,YAAAkJ,IAAa;AAAA,IACb,YAAAC,IAAa;AAAA,IACb,oBAAAC,IAAqBxB;AAAA,IACrB,KAAAlB,IAAMS;AAAA,IACN,gBAAAmC,IAAiB;AAAA,IACjB,kBAAAC;AAAA,IACA,iBAAAtJ;AAAA,IACA,gBAAAC;AAAA,IACA,gBAAAsJ;AAAA,IACA,gBAAAzR;AAAA,IACA,eAAAiQ;AAAA,EAAA,MACsB;AACtB,UAAMuD,IAAYhP,EAA8B,oBAAI,KAAK;AAQzD,WACC,gBAAAkB,EAAC,OAAA,EAAI,OAP4B;AAAA,MACjC,UAAU;AAAA,MACV,OAAO;AAAA,MACP,eAAe;AAAA,IAAA,GAIS,eAAY,eAClC,UAAA0N,EAAO,IAAI,CAAC9R,GAAOf,MAAU;;AAC7B,YAAMyP,IAAiBqD,EAAe/R,EAAM,IAAI;AAChD,UAAI,CAAC0O;AACJ,uBAAQ;AAAA,UACP,2BAA2B1O,EAAM,IAAI;AAAA,QAAA,GAE/B;AAMR,UAJiBxB;AAAA,QAChBwB,EAAM;AAAA,QACNtB;AAAA,MAAA,EAEa,QAAO;AAErB,YAAMiR,IAAcsC,EAAejS,CAAK,GAElC0N,KADasE,EAAiB,SAAShS,EAAM,EAAE,IAElDb,GAAQ,eACRH,GAAeC,CAAK,GAGjBkT,KACLnS,EAAM,UAAU,QAChB,OAAOA,EAAM,SAAU,YACvB,aAAaA,EAAM,QACfA,EAAM,MAA+B,UACtC,QAEE9B,KACLiU,MAAWzT,IACPA,EAAe,IAAIyT,EAAO,KAAK,OAChCnS,EAAM,MAAMoB,IACXA,EAAOpB,EAAM,EAAE,IACdA,EAAM,aAAa,MAEnBoS,IACLD,MAAWzT,IACR,CAAC2T,MAAQ3T,EAAe,IAAIyT,IAASE,CAAG,IACxCzC,IACC,CAACyC,MAAQzC,EAAc5P,EAAM,IAAIqS,CAAG,IACpC,QAECC,KAAqBlP,IAAApD,EAAM,aAAN,QAAAoD,EAAgB,YACvCwD,KAAmB4K,KACpB,QACGe,KAAoB1M,IAAA7F,EAAM,aAAN,QAAA6F,EAAgB,WACtCgB,KAAkB8K,KACnB;AAEH,+BACEzL,IAAA,EACA,UAAA,gBAAA9B;AAAA,QAACsL;AAAA,QAAA;AAAA,UACA,KAAK,CAAC8C,MAAM;AACX,YAAIA,IAAGN,EAAU,QAAQ,IAAIlS,EAAM,IAAIwS,CAAC,IACnCN,EAAU,QAAQ,OAAOlS,EAAM,EAAE;AAAA,UACvC;AAAA,UACA,OAAAA;AAAA,UACA,gBAAA0O;AAAA,UACA,aAAAiB;AAAA,UACA,aAAAjC;AAAA,UACA,MAAA3I;AAAA,UACA,OAAO7G,MAAS;AAAA,UAChB,eAAA+Q;AAAA,UACA,eAAemD;AAAA,UACf,QAAQzL,IAAS,CAAC0L,MAAQ1L,EAAO3G,EAAM,IAAIqS,CAAG,IAAI;AAAA,UAClD,YAAAxC;AAAA,UACA,YAAAC;AAAA,UACA,oBAAAC;AAAA,UACA,KAAA1C;AAAA,UACA,eAAc;AAAA,UACd,gBAAA4C;AAAA,UACA,kBAAkBC,KAAA,gBAAAA,EAAmBlQ,EAAM;AAAA,UAC3C,iBAAiBsS;AAAA,UACjB,gBAAgBC;AAAA,UAChB,gBAAApC;AAAA,UACA,gBAAAzR;AAAA,UACA,eAAAiQ;AAAA,QAAA;AAAA,MAAA,EACD,GA3Bc3O,EAAM,EA4BrB;AAAA,IAEF,CAAC,EAAA,CACF;AAAA,EAEF;AACD;AAEA6R,GAAW,cAAc;AC/MlB,SAASY,GAAmBC,GAA2C;AAC7E,MAAI,EAACA,KAAA,QAAAA,EAAW,UAAS,EAACA,KAAA,QAAAA,EAAW,MAAM;AAC3C,QAAM7Q,IAAI6Q,EAAU,MAAM;AAC1B,MAAI7Q,MAAM,GACV;AAAA,QAAI6Q,EAAU,SAASxF,GAAS,OAAQ,QAAO,GAAGrL,IAAI,CAAC,IAAIA,IAAI,CAAC;AAChE,QAAI6Q,EAAU,SAASxF,GAAS,OAAQ,QAAO,GAAGrL,IAAI,CAAC,IAAIA,IAAI,CAAC;AAAA;AAEjE;ACkBA,SAASsL,GAAUC,GAAkBC,GAAa;AACjD,SAAO;AAAA,IACN,QAAQD,EAAM;AAAA,IACd,aAAapJ,GAAK,QAAQoJ,EAAM,OAAOC,CAAG;AAAA,IAC1C,iBAAiBoF,GAAmBrF,CAAK;AAAA,EAAA;AAE3C;AAKO,MAAMuF,KAA8CpF;AAAA,EAC1D,CAAC;AAAA,IACA,WAAAqF;AAAA,IACA,cAAAC;AAAA,IACA,aAAAC;AAAA,IACA,aAAArF;AAAA,IACA,KAAAJ,IAAMS;AAAA,IACN,QAAA5O,IAASC,GAAQ;AAAA,EAAA,MACZ;AACL,QAAI,CAACsO,EAAa,QAAO;AAEzB,UAAM,EAAE,KAAAM,GAAK,OAAAC,GAAO,QAAAC,GAAQ,MAAAC,MAAST;AACrC,QAAI,CAACM,KAAO,CAACC,KAAS,CAACC,KAAU,CAACC,EAAM,QAAO;AAE/C,UAAMrM,IAAI+Q,EAAU,OACd7Q,IAAI6Q,EAAU;AAEpB,WACC,gBAAA1O;AAAA,MAAC;AAAA,MAAA;AAAA,QACA,MAAK;AAAA,QACL,eAAY;AAAA,QACZ,OAAO;AAAA,UACN,UAAU;AAAA,UACV,MAAM,GAAG2O,CAAY;AAAA,UACrB,KAAK,GAAGC,CAAW;AAAA,UACnB,eAAe;AAAA,UACf,UAAU;AAAA,UACV,QAAA5T;AAAA,QAAA;AAAA,QAED,OAAO2C;AAAA,QACP,QAAQE;AAAA,QACR,eAAY;AAAA,QAEX,UAAA;AAAA,UAAAgM,KAAO,gBAAA3J,EAAC,QAAA,EAAK,IAAI,GAAG,IAAI,GAAG,IAAIvC,GAAG,IAAI,GAAI,GAAGsL,GAAUY,GAAKV,CAAG,GAAG;AAAA,UAClEW,KACA,gBAAA5J,EAAC,QAAA,EAAK,IAAIvC,GAAG,IAAI,GAAG,IAAIA,GAAG,IAAIE,GAAI,GAAGoL,GAAUa,GAAOX,CAAG,GAAG;AAAA,UAE7DY,KACA,gBAAA7J,EAAC,QAAA,EAAK,IAAI,GAAG,IAAIrC,GAAG,IAAIF,GAAG,IAAIE,GAAI,GAAGoL,GAAUc,GAAQZ,CAAG,GAAG;AAAA,UAE9Da,KAAQ,gBAAA9J,EAAC,QAAA,EAAK,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAIrC,GAAI,GAAGoL,GAAUe,GAAMb,CAAG,EAAA,CAAG;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAGxE;AACD;AAEAsF,GAAc,cAAc;AChErB,MAAMI,KAAwCxF;AAAA,EACpD,CAAC;AAAA,IACA,UAAAyF;AAAA,IACA,iBAAA5E,IAAkB;AAAA,IAClB,WAAA6E,IAAY;AAAA,IACZ,QAAA/T,IAASC,GAAQ;AAAA,EAAA,MAEjB,gBAAAiF;AAAA,IAAC;AAAA,IAAA;AAAA,MACA,MAAK;AAAA,MACL,cAAW;AAAA,MACX,eAAY;AAAA,MACZ,OAAO;AAAA,QACN,UAAU;AAAA,QACV,OAAO;AAAA,QACP,OAAO,GAAG4O,EAAS,KAAK;AAAA,QACxB,QAAQ,GAAGA,EAAS,MAAM;AAAA,QAC1B,iBAAA5E;AAAA,QACA,WAAA6E;AAAA,QACA,eAAe;AAAA,QACf,QAAA/T;AAAA,MAAA;AAAA,IACD;AAAA,EAAA;AAGH;AAEA6T,GAAW,cAAc;;;;;;;;GCdnBG,KAA8B,CAAC,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM;AAGzE,SAASC,GAAgBC,GAAgBC,GAA8B;AACtE,MAAIA,MAAe,KAAM,QAAO;AAChC,UAAQA,GAAA;AAAA,IACP,KAAK;AACJ,aAAOD;AAAA,IACR,KAAK;AACJ,aAAO,KAAK,MAAMtR,GAAK,OAAOsR,CAAM,IAAI,EAAE,IAAI;AAAA,IAC/C,KAAK;AACJ,aAAO,KAAK,MAAOtR,GAAK,OAAOsR,CAAM,IAAI,KAAM,GAAG,IAAI;AAAA,IACvD,KAAK;AACJ,aAAO,KAAK,MAAOtR,GAAK,OAAOsR,CAAM,IAAI,OAAQ,GAAG,IAAI;AAAA,IACzD,KAAK;AACJ,aAAO,KAAK,MAAOtR,GAAK,OAAOsR,CAAM,IAAI,OAAQ,KAAK,EAAE,IAAI;AAAA,IAC7D,SAAS;AACR,YAAME,IAAqBD;AAC3B,YAAM,IAAI,MAAM,qBAAqBC,CAAW,EAAE;AAAA,IACnD;AAAA,EAAA;AAEF;AAOO,MAAMC,KAAiBhG;AAAA,EAC7B,CAAC;AAAA,IACA,WAAAiG;AAAA,IACA,WAAAC;AAAA,IACA,eAAAC;AAAA,IACA,UAAAC;AAAA,IACA,cAAAd;AAAA,IACA,aAAAC;AAAA,IACA,UAAAjQ;AAAA,IACA,UAAA+Q;AAAA,EAAA,MAC0B;AAC1B,UAAM,CAAC1V,GAAO2V,CAAQ,IAAIzM,GAASqM,EAAU,MAAM,UAAU,GACvD,CAACK,GAAMC,CAAO,IAAI3M,GAAmBqM,EAAU,IAAgB,GAC/D3M,IAAW5D,EAAyB,IAAI,GACxC6D,IAAe7D,EAAuB,IAAI,GAE1C8Q,IACLR,MAAc,WACX;AAAA,MACA,MAAM,GAAGX,IAAec,CAAQ;AAAA,MAChC,KAAK,GAAGb,IAAc,EAAE;AAAA,MACxB,WAAW;AAAA,IAAA,IAEX;AAAA,MACA,MAAM,GAAGD,IAAe,EAAE;AAAA,MAC1B,KAAK,GAAGC,IAAca,CAAQ;AAAA,MAC9B,WAAW;AAAA,IAAA;AAGf,IAAAM,GAAU,MAAM;;AACf,OAAA7Q,IAAA0D,EAAS,YAAT,QAAA1D,EAAkB,UAClByC,IAAAiB,EAAS,YAAT,QAAAjB,EAAkB;AAAA,IACnB,GAAG,CAAA,CAAE,GAELoO,GAAU,MAAM;AACf,YAAMC,IAAqB,CAACC,MAAsB;AACjD,QACCpN,EAAa,WACb,CAACA,EAAa,QAAQ,SAASoN,EAAM,MAAc,KAEnDP,EAAA;AAAA,MAEF;AACA,sBAAS,iBAAiB,aAAaM,CAAkB,GAClD,MACN,SAAS,oBAAoB,aAAaA,CAAkB;AAAA,IAC9D,GAAG,CAACN,CAAQ,CAAC;AAEb,UAAMQ,IAAe,MAAM;AAC1B,YAAMC,IAAW,OAAO,WAAWnW,CAAK;AACxC,MAAI,CAAC,OAAO,MAAMmW,CAAQ,KAAKA,KAAY,MAC1CxR,EAAS,EAAE,MAAAiR,GAAM,OAAOO,EAAA,CAAU,IAElCT,EAAA;AAAA,IAEF,GAEMU,IAAgB,CAACnQ,MAA2B;AACjD,MAAIA,EAAE,QAAQ,WACbA,EAAE,eAAA,GACFiQ,EAAA,KACUjQ,EAAE,QAAQ,aACpBA,EAAE,eAAA,GACFyP,EAAA;AAAA,IAEF,GAEMW,IAAmB,CAACpQ,MAA4C;AACrE,YAAMqQ,IAAUrQ,EAAE,OAAO;AACzB,MAAA4P,EAAQS,CAAO,GACfX,EAASV,GAAgBO,GAAec,CAAO,EAAE,UAAU;AAAA,IAC5D;AAEA,WACC,gBAAAtQ;AAAA,MAAC;AAAA,MAAA;AAAA,QACA,KAAK6C;AAAA,QACL,WAAW0N,GAAO;AAAA,QAClB,OAAOT;AAAA,QACP,eAAa,oBAAoBR,CAAS;AAAA,QAE1C,UAAA;AAAA,UAAA,gBAAApP;AAAA,YAAC;AAAA,YAAA;AAAA,cACA,KAAK0C;AAAA,cACL,MAAK;AAAA,cACL,WAAW2N,GAAO;AAAA,cAClB,OAAAvW;AAAA,cACA,UAAU,CAACiG,MAAM0P,EAAS1P,EAAE,OAAO,KAAK;AAAA,cACxC,WAAWmQ;AAAA,cACX,KAAI;AAAA,cACJ,MAAMR,MAAS,OAAO,QAAQ;AAAA,YAAA;AAAA,UAAA;AAAA,UAE/B,gBAAA1P;AAAA,YAAC;AAAA,YAAA;AAAA,cACA,WAAWqQ,GAAO;AAAA,cAClB,OAAOX;AAAA,cACP,UAAUS;AAAA,cAET,UAAArB,GAAgB,IAAI,CAACwB,MACrB,gBAAAtQ,EAAC,YAAe,OAAOsQ,GACrB,UAAAA,EAAA,GADWA,CAEb,CACA;AAAA,YAAA;AAAA,UAAA;AAAA,UAEF,gBAAAtQ;AAAA,YAAC;AAAA,YAAA;AAAA,cACA,MAAK;AAAA,cACL,WAAWqQ,GAAO;AAAA,cAClB,SAASL;AAAA,cACT,OAAM;AAAA,cACN,UAAA;AAAA,YAAA;AAAA,UAAA;AAAA,QAED;AAAA,MAAA;AAAA,IAAA;AAAA,EAGH;AACD;AAEAb,GAAe,cAAc;ACnI7B,SAASJ,GACRC,GACAC,GACAsB,GACAC,GACS;AACT,MAAIvB,MAAe;AAClB,WACCsB,MAAkB,UAClBC,MAAmB,UACnBA,IAAiB,IAEV,KAAK,MAAMD,KAAiBvB,IAASwB,KAAkB,GAAG,IAAI,MAE/D;AAER,UAAQvB,GAAA;AAAA,IACP,KAAK;AACJ,aAAO,KAAK,MAAMD,CAAM;AAAA,IACzB,KAAK;AACJ,aAAO,KAAK,MAAMtR,GAAK,OAAOsR,CAAM,IAAI,EAAE,IAAI;AAAA,IAC/C,KAAK;AACJ,aAAO,KAAK,MAAOtR,GAAK,OAAOsR,CAAM,IAAI,KAAM,GAAG,IAAI;AAAA,IACvD,KAAK;AACJ,aAAO,KAAK,MAAOtR,GAAK,OAAOsR,CAAM,IAAI,OAAQ,GAAG,IAAI;AAAA,IACzD,KAAK;AACJ,aAAO,KAAK,MAAOtR,GAAK,OAAOsR,CAAM,IAAI,OAAQ,KAAK,EAAE,IAAI;AAAA,IAC7D,SAAS;AACR,YAAME,IAAqBD;AAC3B,YAAM,IAAI,MAAM,qBAAqBC,CAAW,EAAE;AAAA,IACnD;AAAA,EAAA;AAEF;AAKO,MAAMuB,KAAqBtH;AAAA,EACjC,CAAC;AAAA,IACA,WAAAiG;AAAA,IACA,OAAAvU;AAAA,IACA,WAAAwU;AAAA,IACA,UAAAE;AAAA,IACA,eAAAD;AAAA,IACA,cAAAb;AAAA,IACA,aAAAC;AAAA,IACA,cAAAgC;AAAA,IACA,gBAAAC;AAAA,IACA,mBAAAC;AAAA,EAAA,MAC8B;AAC9B,UAAM,CAACC,GAAWC,CAAY,IAAI9N,GAAS,EAAK;AAEhD,QAAI,CAAC0N,KAAgB,CAACG,EAAW,QAAO;AAExC,UAAME,IACL3B,MAAc,WACX;AAAA,MACA,MAAM,GAAGX,IAAec,CAAQ;AAAA,MAChC,KAAK,GAAGb,IAAc,EAAE;AAAA,MACxB,WAAW;AAAA,IAAA,IAEX;AAAA,MACA,MAAM,GAAGD,IAAe,EAAE;AAAA,MAC1B,KAAK,GAAGC,IAAca,CAAQ;AAAA,MAC9B,WAAW;AAAA,MACX,aAAa;AAAA,IAAA,GAMXyB,IAAcL,KAChB,MAAM;AACP,YAAM3W,IAAI+U;AAAAA,QACT4B;AAAA,QACAtB,EAAU;AAAA,QACVA,EAAU;AAAA,QACVC;AAAA,MAAA;AAED,aAAOD,EAAU,SAAS,OAAO,GAAGrV,CAAC,OAAO,GAAGA,CAAC,GAAGqV,EAAU,IAAI;AAAA,IAClE,GAAA,KAZsB,CAAC4B,MACxBA,EAAI,SAAS,OAAO,GAAGA,EAAI,KAAK,OAAO,GAAGA,EAAI,KAAK,GAAGA,EAAI,IAAI,IAY5C5B,CAAS;AAE5B,WACC,gBAAAvP,EAAAgC,IAAA,EACC,UAAA;AAAA,MAAA,gBAAA9B;AAAA,QAAC;AAAA,QAAA;AAAA,UACA,MAAK;AAAA,UACL,WAAWqQ,GAAO;AAAA,UAClB,OAAOU;AAAA,UACP,eAAe,MAAMD,EAAa,EAAI;AAAA,UACtC,eAAa,kBAAkB1B,CAAS,IAAIvU,CAAK;AAAA,UACjD,cAAY,WAAWmW,CAAW;AAAA,UAEjC,UAAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAEDH,KACA,gBAAA7Q;AAAA,QAACmP;AAAA,QAAA;AAAA,UACA,WAAAC;AAAA,UACA,WAAAC;AAAA,UACA,eAAAC;AAAA,UACA,UAAAC;AAAA,UACA,cAAAd;AAAA,UACA,aAAAC;AAAA,UACA,UAAU,CAACwC,MAAW;AACrB,YAAAN,KAAA,QAAAA,EAAoBxB,GAAWvU,GAAOqW,IACtCJ,EAAa,EAAK;AAAA,UACnB;AAAA,UACA,UAAU,MAAMA,EAAa,EAAK;AAAA,QAAA;AAAA,MAAA;AAAA,IACnC,GAEF;AAAA,EAEF;AACD;AAEAL,GAAmB,cAAc;AC3J1B,SAASU,GACfC,GACAC,GACAC,GACAC,GACS;AACT,MAAIC,IAAI;AACR,aAAWC,KAAKL,EAAQ,CAAAI,KAAK,KAAKC,CAAC,QAAQA,CAAC,IAAIF,CAAM;AACtD,aAAWG,KAAKL,EAAQ,CAAAG,KAAK,OAAOE,CAAC,MAAMJ,CAAK,IAAII,CAAC;AACrD,SAAOF;AACR;ACuBO,MAAMG,KAAoCxI;AAAA,EAChD,CAAC;AAAA,IACA,WAAAyI;AAAA,IACA,WAAApD;AAAA,IACA,cAAAC;AAAA,IACA,aAAAC;AAAA,IACA,WAAAJ;AAAA,IACA,QAAAxT,IAASC,GAAQ;AAAA,IACjB,KAAAkO,IAAMS;AAAA,EAAA,MACD;AACL,UAAMmI,IAAW1S;AAAA,MAChB,MACCgS;AAAA,QACCS,EAAU,KAAK,MAAM,GAAG,EAAE;AAAA,QAC1BA,EAAU,KAAK,MAAM,GAAG,EAAE;AAAA,QAC1BpD,EAAU;AAAA,QACVA,EAAU;AAAA,MAAA;AAAA,MAEZ,CAACoD,GAAWpD,CAAS;AAAA,IAAA;AAGtB,WAAKF,IAGJ,gBAAAtO;AAAA,MAAC;AAAA,MAAA;AAAA,QACA,OAAO;AAAA,UACN,UAAU;AAAA,UACV,MAAM,GAAGyO,CAAY;AAAA,UACrB,KAAK,GAAGC,CAAW;AAAA,UACnB,eAAe;AAAA,UACf,QAAA5T;AAAA,QAAA;AAAA,QAED,OAAO0T,EAAU;AAAA,QACjB,QAAQA,EAAU;AAAA,QAClB,MAAK;AAAA,QACL,cAAW;AAAA,QAEX,UAAA,gBAAAxO;AAAA,UAAC;AAAA,UAAA;AAAA,YACA,GAAG6R;AAAA,YACH,QAAQvD,EAAU;AAAA,YAClB,aAAa1O,GAAK,QAAQ0O,EAAU,OAAOrF,CAAG;AAAA,YAC9C,iBAAiBoF,GAAmBC,CAAS;AAAA,YAC7C,MAAK;AAAA,UAAA;AAAA,QAAA;AAAA,MACN;AAAA,IAAA,IAtBqB;AAAA,EAyBxB;AACD;AAEAqD,GAAY,cAAc;;;;GC5CbG,KAAmB3I;AAAA,EAC/B,CAAC;AAAA,IACA,WAAAiG;AAAA,IACA,OAAAvU;AAAA,IACA,UAAA0U;AAAA,IACA,cAAAd;AAAA,IACA,aAAAC;AAAA,IACA,eAAAqD;AAAA,IACA,UAAAC;AAAA,IACA,aAAAC;AAAA,EAAA,MAC4B;AAC5B,UAAM,CAACC,GAAYC,CAAa,IAAInP,GAAS,EAAK,GAE5CoP,IAAc,IACdC,IAAgBD,IAAc,GAE9BE,IACLlD,MAAc,WACX;AAAA,MACA,MAAM,GAAGX,IAAec,IAAW8C,CAAa;AAAA,MAChD,KAAK,GAAG3D,IAAc2D,CAAa;AAAA,MACnC,OAAO,GAAGD,CAAW;AAAA,MACrB,QAAQ,GAAGA,CAAW;AAAA,MACtB,QAAQ;AAAA,IAAA,IAER;AAAA,MACA,MAAM,GAAG3D,IAAe4D,CAAa;AAAA,MACrC,KAAK,GAAG3D,IAAca,IAAW8C,CAAa;AAAA,MAC9C,OAAO,GAAGD,CAAW;AAAA,MACrB,QAAQ,GAAGA,CAAW;AAAA,MACtB,QAAQ;AAAA,IAAA,GAGNG,IAAoB5N;AAAA,MACzB,CAAC5E,MAA0B;AAC1B,QAAAA,EAAE,gBAAA,GACFA,EAAE,eAAA;AAEF,cAAMyS,IAAapD,MAAc,WAAWrP,EAAE,UAAUA,EAAE;AAC1D,QAAAoS,EAAc,EAAI,GAClBJ,KAAA,QAAAA,EAAgB3C,GAAWvU;AAE3B,cAAM4X,IAAoB,CAACC,MAA4B;AACtD,gBAAMC,IACLvD,MAAc,WAAWsD,EAAU,UAAUA,EAAU;AACxD,UAAAV,KAAA,QAAAA,EAAW5C,GAAWvU,GAAO8X,IAAaH;AAAA,QAC3C,GAEMI,IAAkB,CAACC,MAA0B;AAClD,gBAAMF,IACLvD,MAAc,WAAWyD,EAAQ,UAAUA,EAAQ;AACpD,UAAAV,EAAc,EAAK,GACnBF,KAAA,QAAAA,EAAc7C,GAAWvU,GAAO8X,IAAaH,IAC7C,OAAO,oBAAoB,eAAeC,CAAiB,GAC3D,OAAO,oBAAoB,aAAaG,CAAe;AAAA,QACxD;AAEA,eAAO,iBAAiB,eAAeH,CAAiB,GACxD,OAAO,iBAAiB,aAAaG,CAAe;AAAA,MACrD;AAAA,MACA,CAACxD,GAAWvU,GAAOkX,GAAeC,GAAUC,CAAW;AAAA,IAAA;AAGxD,WACC,gBAAAjS;AAAA,MAAC;AAAA,MAAA;AAAA,QACA,WAAW,GAAGqQ,GAAO,MAAM,IAAI6B,IAAa7B,GAAO,WAAW,EAAE;AAAA,QAChE,OAAOiC;AAAA,QACP,eAAeC;AAAA,QACf,eAAa,sBAAsBnD,CAAS,IAAIvU,CAAK;AAAA,MAAA;AAAA,IAAA;AAAA,EAGxD;AACD;AAEAiX,GAAiB,cAAc;ACjGxB,MAAMgB,KAAwC3J;AAAA,EACpD,CAAC;AAAA,IACA,SAAA4J;AAAA,IACA,aAAAC,IAAc;AAAA,IACd,QAAAlY,IAASC,GAAQ;AAAA,EAAA,MACZ;AACL,UAAMsQ,IAAsB;AAAA,MAC3B,UAAU;AAAA,MACV,iBAAiB2H;AAAA,MACjB,eAAe;AAAA,IAAA;AAGhB,WACC,gBAAAlT;AAAA,MAAC;AAAA,MAAA;AAAA,QACA,MAAK;AAAA,QACL,cAAW;AAAA,QACX,eAAY;AAAA,QACZ,OAAO;AAAA,UACN,UAAU;AAAA,UACV,OAAO;AAAA,UACP,eAAe;AAAA,UACf,OAAO,GAAGiT,EAAQ,OAAO,KAAK;AAAA,UAC9B,QAAQ,GAAGA,EAAQ,OAAO,MAAM;AAAA,UAChC,QAAAjY;AAAA,QAAA;AAAA,QAGA,UAAA;AAAA,UAAAiY,EAAQ,OAAO,MAAM,KACrB,gBAAA/S;AAAA,YAAC;AAAA,YAAA;AAAA,cACA,eAAY;AAAA,cACZ,OAAO;AAAA,gBACN,GAAGqL;AAAA,gBACH,KAAK;AAAA,gBACL,MAAM;AAAA,gBACN,OAAO;AAAA,gBACP,QAAQ,GAAG0H,EAAQ,OAAO,GAAG;AAAA,cAAA;AAAA,YAC9B;AAAA,UAAA;AAAA,UAGDA,EAAQ,OAAO,SAAS,KACxB,gBAAA/S;AAAA,YAAC;AAAA,YAAA;AAAA,cACA,eAAY;AAAA,cACZ,OAAO;AAAA,gBACN,GAAGqL;AAAA,gBACH,QAAQ;AAAA,gBACR,MAAM;AAAA,gBACN,OAAO;AAAA,gBACP,QAAQ,GAAG0H,EAAQ,OAAO,MAAM;AAAA,cAAA;AAAA,YACjC;AAAA,UAAA;AAAA,UAGDA,EAAQ,OAAO,OAAO,KACtB,gBAAA/S;AAAA,YAAC;AAAA,YAAA;AAAA,cACA,eAAY;AAAA,cACZ,OAAO;AAAA,gBACN,GAAGqL;AAAA,gBACH,MAAM;AAAA,gBACN,KAAK,GAAG0H,EAAQ,OAAO,GAAG;AAAA,gBAC1B,QAAQ,GAAGA,EAAQ,QAAQ,MAAM;AAAA,gBACjC,OAAO,GAAGA,EAAQ,OAAO,IAAI;AAAA,cAAA;AAAA,YAC9B;AAAA,UAAA;AAAA,UAGDA,EAAQ,OAAO,QAAQ,KACvB,gBAAA/S;AAAA,YAAC;AAAA,YAAA;AAAA,cACA,eAAY;AAAA,cACZ,OAAO;AAAA,gBACN,GAAGqL;AAAA,gBACH,OAAO;AAAA,gBACP,KAAK,GAAG0H,EAAQ,OAAO,GAAG;AAAA,gBAC1B,QAAQ,GAAGA,EAAQ,QAAQ,MAAM;AAAA,gBACjC,OAAO,GAAGA,EAAQ,OAAO,KAAK;AAAA,cAAA;AAAA,YAC/B;AAAA,UAAA;AAAA,QACD;AAAA,MAAA;AAAA,IAAA;AAAA,EAIJ;AACD;AAEAD,GAAc,cAAc;ACHrB,MAAMG,KAAsC9J;AAAA,EAClD,CAAC;AAAA,IACA,SAAA4J;AAAA,IACA,WAAAnB;AAAA,IACA,gBAAAsB;AAAA,IACA,eAAAC;AAAA,IACA,aAAA9J;AAAA,IACA,iBAAAW,IAAkB;AAAA,IAClB,WAAA6E,IAAY;AAAA,IACZ,iBAAAuE;AAAA,IACA,eAAAC,IAAgB;AAAA,IAChB,aAAAC,IAAc;AAAA,IACd,YAAA5H,IAAa;AAAA,IACb,mBAAA6H,IAAoB;AAAA,IACpB,qBAAAC,IAAsB;AAAA,IACtB,KAAAvK,IAAMS;AAAA,IACN,cAAA+J;AAAA,IACA,mBAAA7C;AAAA,IACA,WAAA8C,IAAY;AAAA,IACZ,QAAA5Y,IAAS,CAAA;AAAA,EAAC,MACL;AACL,UAAM,CAAC6Y,GAAWC,CAAY,IAAI5Q,GAGxB,IAAI,GACR,CAAC6Q,GAAgBC,CAAiB,IAAI9Q,GAGlC,IAAI,GACR,CAAC+Q,GAAUC,CAAW,IAAIhR;AAAA,MAC/B;AAAA,IAAA,GAEKL,IAAe7D,EAAuB,IAAI;AAEhD,IAAA+Q,GAAU,MAAM;AACf,YAAMoE,IAAkB,CAAClU,MAAkB;AAC1C,YAAI,CAAC4C,EAAa,QAAS;AAC3B,cAAMuR,IAAOvR,EAAa,QAAQ,sBAAA;AAClC,QAAAqR,EAAY,EAAE,GAAGjU,EAAE,UAAUmU,EAAK,MAAM,GAAGnU,EAAE,UAAUmU,EAAK,IAAA,CAAK;AAAA,MAClE,GACMC,IAAmB,CAACpU,MAAkB;AAC3C,YAAI,CAAC4C,EAAa,QAAS;AAC3B,cAAMuR,IAAOvR,EAAa,QAAQ,sBAAA;AAClC,SACC5C,EAAE,UAAUmU,EAAK,QACjBnU,EAAE,UAAUmU,EAAK,SACjBnU,EAAE,UAAUmU,EAAK,OACjBnU,EAAE,UAAUmU,EAAK,WAEjBF,EAAY,IAAI;AAAA,MAElB;AACA,oBAAO,iBAAiB,aAAaC,CAAe,GACpD,OAAO,iBAAiB,cAAcE,CAAgB,GAC/C,MAAM;AACZ,eAAO,oBAAoB,aAAaF,CAAe,GACvD,OAAO,oBAAoB,cAAcE,CAAgB;AAAA,MAC1D;AAAA,IACD,GAAG,CAAA,CAAE;AAEL,UAAMC,IAA4BjV,EAAQ,MACpC4U,IAME,EAJNA,EAAS,KAAKhB,EAAQ,OAAO,QAC7BgB,EAAS,KAAKhB,EAAQ,OAAO,OAAOA,EAAQ,QAAQ,SACpDgB,EAAS,KAAKhB,EAAQ,OAAO,OAC7BgB,EAAS,KAAKhB,EAAQ,OAAO,MAAMA,EAAQ,QAAQ,UAL9B,IAOpB,CAACgB,GAAUhB,CAAO,CAAC,GAEhBsB,IAAuBlV,EAAQ,MAAM;AAC1C,UAAI,CAACwU,KAAa,CAACE,EAAgB,QAAO;AAC1C,YAAMS,IACLT,EAAe,cAAc,WAAWjC,EAAU,OAAOA,EAAU,MAC9D/W,IAAQgZ,EAAe,OACvBU,IAAYD,EAAUzZ,IAAQ,CAAC,GAC/B2Z,IAAUF,EAAUzZ,IAAQ,CAAC;AACnC,aAAO;AAAA,QACN,WAAWgZ,EAAe;AAAA,QAC1B,WAAWhZ,IAAQ;AAAA,QACnB,UAAU0Z,MAAc,SAAYZ,EAAU,WAAWY,IAAY;AAAA,QACrE,WAAW1Z;AAAA,QACX,UAAU2Z,MAAY,SAAYA,IAAUb,EAAU,WAAW;AAAA,MAAA;AAAA,IAEnE,GAAG,CAACA,GAAWE,GAAgBjC,CAAS,CAAC,GAEnC6C,IAAa9P;AAAA,MAClB,CAACyK,GAA6BvU,GAAe6Z,MAA0B;AAEtE,cAAMJ,IACLlF,MAAc,WAAWwC,EAAU,OAAOA,EAAU,MAC/C+C,IAAcL,EAAUzZ,CAAK;AACnC,YAAI8Z,MAAgB,OAAW,QAAOD;AACtC,cAAME,IAAcN,EAAUzZ,IAAQ,CAAC,GACjCga,IAAcP,EAAUzZ,IAAQ,CAAC;AACvC,YAAIia,IAAUJ;AACd,eAAIE,MAAgB,WACnBE,IAAU,KAAK,IAAIA,GAASF,IAAc,KAAUD,CAAW,IAC5DE,MAAgB,WACnBC,IAAU,KAAK,IAAIA,GAASD,IAAc,KAAUF,CAAW,IACzDG;AAAA,MACR;AAAA,MACA,CAAClD,CAAS;AAAA,IAAA,GAGLmD,KAAoBpQ;AAAA,MACzB,CAACyK,GAA6BvU,MAAkB;AAC/C,QAAAiZ,EAAkB,EAAE,WAAA1E,GAAW,OAAAvU,GAAO;AAAA,MACvC;AAAA,MACA,CAAA;AAAA,IAAC,GAGIma,KAAerQ;AAAA,MACpB,CAACyK,GAA6BvU,GAAe6Z,MAAkB;AAG9D,cAAMC,KADLvF,MAAc,WAAWwC,EAAU,OAAOA,EAAU,MACvB/W,CAAK;AACnC,QAAI8Z,MAAgB,UACpBf,EAAa;AAAA,UACZ,WAAAxE;AAAA,UACA,UAAUuF,IAAcF,EAAWrF,GAAWvU,GAAO6Z,CAAK;AAAA,QAAA,CAC1D;AAAA,MACF;AAAA,MACA,CAAC9C,GAAW6C,CAAU;AAAA,IAAA,GAGjBQ,KAAkBtQ;AAAA,MACvB,CAACyK,GAA6BvU,GAAe6Z,MAAkB;AAC9D,QAAAd,EAAa,IAAI,GACjBE,EAAkB,IAAI,GACtBL,KAAA,QAAAA,EAAerE,GAAWvU,GAAO4Z,EAAWrF,GAAWvU,GAAO6Z,CAAK;AAAA,MACpE;AAAA,MACA,CAACD,GAAYhB,CAAY;AAAA,IAAA;AAG1B,WACC,gBAAA3T;AAAA,MAAC;AAAA,MAAA;AAAA,QACA,KAAK6C;AAAA,QACL,WAAA+Q;AAAA,QACA,OAAO,EAAE,UAAU,YAAY,OAAO,QAAQ,QAAQ,OAAA;AAAA,QAEtD,UAAA;AAAA,UAAA,gBAAA1T;AAAA,YAAC2O;AAAA,YAAA;AAAA,cACA,UAAUoE,EAAQ;AAAA,cAClB,iBAAA/I;AAAA,cACA,WAAA6E;AAAA,cACA,QAAQ/T,EAAO,UAAUC,GAAQ;AAAA,YAAA;AAAA,UAAA;AAAA,UAGjCuY,KACA,gBAAAtT;AAAA,YAAC8S;AAAA,YAAA;AAAA,cACA,SAAAC;AAAA,cACA,aAAaK;AAAA,cACb,QAAQtY,EAAO,UAAUC,GAAQ;AAAA,YAAA;AAAA,UAAA;AAAA,UAIlCsY,KACA,gBAAArT;AAAA,YAAC2R;AAAA,YAAA;AAAA,cACA,WAAAC;AAAA,cACA,WAAWmB,EAAQ;AAAA,cACnB,cAAcA,EAAQ,OAAO;AAAA,cAC7B,aAAaA,EAAQ,OAAO;AAAA,cAC5B,WAAWI;AAAA,cACX,KAAAlK;AAAA,cACA,QAAQnO,EAAO,QAAQC,GAAQ;AAAA,YAAA;AAAA,UAAA;AAAA,UAIhC2Q,KACA,gBAAA1L;AAAA,YAACuO;AAAA,YAAA;AAAA,cACA,WAAWwE,EAAQ;AAAA,cACnB,cAAcA,EAAQ,OAAO;AAAA,cAC7B,aAAaA,EAAQ,OAAO;AAAA,cAC5B,aAAA1J;AAAA,cACA,KAAAJ;AAAA,cACA,QAAQnO,EAAO,UAAUC,GAAQ;AAAA,YAAA;AAAA,UAAA;AAAA,UAIlCwY,KAAqBE,KACrB,gBAAA3T,EAAAgC,IAAA,EACE,UAAA;AAAA,YAAA8P,EAAU,KAAK,IAAI,CAACsD,GAAQra,MACxBA,MAAU,KAAKA,MAAU+W,EAAU,KAAK,SAAS,IAC7C,OAEP,gBAAA5R;AAAA,cAAC8R;AAAA,cAAA;AAAA,gBAEA,WAAU;AAAA,gBACV,OAAAjX;AAAA,gBACA,UAAUqa;AAAA,gBACV,cAAcnC,EAAQ,OAAO;AAAA,gBAC7B,aAAaA,EAAQ,OAAO;AAAA,gBAC5B,eAAegC;AAAA,gBACf,UAAUC;AAAA,gBACV,aAAaC;AAAA,cAAA;AAAA,cARR,OAAOC,CAAM;AAAA,YAAA,CAWpB;AAAA,YACAtD,EAAU,KAAK,IAAI,CAACuD,GAAQta,MACxBA,MAAU,KAAKA,MAAU+W,EAAU,KAAK,SAAS,IAC7C,OAEP,gBAAA5R;AAAA,cAAC8R;AAAA,cAAA;AAAA,gBAEA,WAAU;AAAA,gBACV,OAAAjX;AAAA,gBACA,UAAUsa;AAAA,gBACV,cAAcpC,EAAQ,OAAO;AAAA,gBAC7B,aAAaA,EAAQ,OAAO;AAAA,gBAC5B,eAAegC;AAAA,gBACf,UAAUC;AAAA,gBACV,aAAaC;AAAA,cAAA;AAAA,cARR,OAAOE,CAAM;AAAA,YAAA,CAWpB;AAAA,UAAA,GACF;AAAA,UAGA3B,KAAuBN,KACvB,gBAAApT,EAAAgC,IAAA,EACE,UAAA;AAAA,YAAAoR,EAAe,KAAK,IAAI,CAAC7D,GAAWxU,MAAU;AAC9C,oBAAMua,IAAWxD,EAAU,KAAK/W,CAAK,GAC/Bwa,IAASzD,EAAU,KAAK/W,IAAQ,CAAC;AACvC,kBAAIua,MAAa,UAAaC,MAAW,OAAW,QAAO;AAC3D,oBAAMC,KACLzB,KAAA,gBAAAA,EAAgB,eAAc,aAC7BA,EAAe,UAAUhZ,KACzBgZ,EAAe,UAAUhZ,IAAQ;AACnC,kBAAI8V;AACJ,sBAAI0D,KAAA,gBAAAA,EAAsB,eAAc,aACnCA,EAAqB,cAAcxZ,IACtC8V,IAAiB0D,EAAqB,WAC9BA,EAAqB,cAAcxZ,MAC3C8V,IAAiB0D,EAAqB,YAGvC,gBAAArU;AAAA,gBAACyQ;AAAA,gBAAA;AAAA,kBAEA,WAAU;AAAA,kBACV,OAAA5V;AAAA,kBACA,WAAAwU;AAAA,kBACA,WAAW+F,IAAWC,KAAU;AAAA,kBAChC,eAAeA,IAASD;AAAA,kBACxB,cAAcrC,EAAQ,OAAO;AAAA,kBAC7B,aAAaA,EAAQ,OAAO;AAAA,kBAC5B,cAAcqB,KAA6BkB;AAAA,kBAC3C,gBAAA3E;AAAA,kBACA,mBAAAC;AAAA,gBAAA;AAAA,gBAVK,WAAWwE,CAAQ;AAAA,cAAA;AAAA,YAa3B,CAAC;AAAA,YACAlC,EAAe,KAAK,IAAI,CAAC7D,GAAWxU,MAAU;AAC9C,oBAAMua,IAAWxD,EAAU,KAAK/W,CAAK,GAC/Bwa,IAASzD,EAAU,KAAK/W,IAAQ,CAAC;AACvC,kBAAIua,MAAa,UAAaC,MAAW,OAAW,QAAO;AAC3D,oBAAMC,KACLzB,KAAA,gBAAAA,EAAgB,eAAc,UAC7BA,EAAe,UAAUhZ,KACzBgZ,EAAe,UAAUhZ,IAAQ;AACnC,kBAAI8V;AACJ,sBAAI0D,KAAA,gBAAAA,EAAsB,eAAc,UACnCA,EAAqB,cAAcxZ,IACtC8V,IAAiB0D,EAAqB,WAC9BA,EAAqB,cAAcxZ,MAC3C8V,IAAiB0D,EAAqB,YAGvC,gBAAArU;AAAA,gBAACyQ;AAAA,gBAAA;AAAA,kBAEA,WAAU;AAAA,kBACV,OAAA5V;AAAA,kBACA,WAAAwU;AAAA,kBACA,WAAW+F,IAAWC,KAAU;AAAA,kBAChC,eAAeA,IAASD;AAAA,kBACxB,cAAcrC,EAAQ,OAAO;AAAA,kBAC7B,aAAaA,EAAQ,OAAO;AAAA,kBAC5B,cAAcqB,KAA6BkB;AAAA,kBAC3C,gBAAA3E;AAAA,kBACA,mBAAAC;AAAA,gBAAA;AAAA,gBAVK,WAAWwE,CAAQ;AAAA,cAAA;AAAA,YAa3B,CAAC;AAAA,UAAA,GACF;AAAA,UAGAzB,KACA,gBAAA3T;AAAA,YAAC;AAAA,YAAA;AAAA,cACA,OAAO;AAAA,gBACN,UAAU;AAAA,gBACV,MACC2T,EAAU,cAAc,WACrBZ,EAAQ,OAAO,OAAOY,EAAU,WAChCZ,EAAQ,OAAO;AAAA,gBACnB,KACCY,EAAU,cAAc,QACrBZ,EAAQ,OAAO,MAAMY,EAAU,WAC/BZ,EAAQ,OAAO;AAAA,gBACnB,OACCY,EAAU,cAAc,WACrB,QACAZ,EAAQ,QAAQ;AAAA,gBACpB,QACCY,EAAU,cAAc,QAAQ,QAAQZ,EAAQ,QAAQ;AAAA,gBACzD,iBAAiB;AAAA,gBACjB,SAAS;AAAA,gBACT,eAAe;AAAA,gBACf,QAAQhY,GAAQ;AAAA,cAAA;AAAA,YACjB;AAAA,UAAA;AAAA,QACD;AAAA,MAAA;AAAA,IAAA;AAAA,EAIJ;AACD;AAEAkY,GAAU,cAAc;AC9YjB,SAASsC,GAAoBC,GAA0C;AAC7E,SAAOxS,GAA2B;AAAA,IACjC,gBAAgB;AAAA,IAChB,GAAGwS;AAAA,EAAA,CACH;AACF;ACfO,IAAKC,uBAAAA,OACXA,EAAA,OAAO,QACPA,EAAA,WAAW,YACXA,EAAA,WAAW,YACXA,EAAA,SAAS,UACTA,EAAA,UAAU,WALCA,IAAAA,MAAA,CAAA,CAAA,GAcAC,sBAAAA,OACXA,EAAA,IAAI,KACJA,EAAA,KAAK,MACLA,EAAA,IAAI,KACJA,EAAA,KAAK,MACLA,EAAA,IAAI,KACJA,EAAA,KAAK,MACLA,EAAA,IAAI,KACJA,EAAA,KAAK,MARMA,IAAAA,KAAA,CAAA,CAAA,GAiBAC,uBAAAA,OACXA,EAAA,OAAO,QACPA,EAAA,SAAS,UACTA,EAAA,SAAS,UAHEA,IAAAA,MAAA,CAAA,CAAA;AAmDL,SAASC,GAAmBjO,GAA0C;AAC5E,SAAIA,EAAM,mBAAmB,OAAa,YACtCA,EAAM,WACLA,EAAM,SAAS,SAAS,WAAwB,WAChDA,EAAM,SAAS,SAAS,YAG3BA,EAAM,SAAS,YAAY,QAAQA,EAAM,SAAS,UAAU,OAC5DA,EAAM,SAAS,YAAY,QAAQA,EAAM,SAAS,UAAU,MAHrD,aAIwC,aAE1C;AACR;ACrDO,SAASkO,GAAuB;AAAA,EACtC,QAAAC;AAAA,EACA,QAAAC;AAAA,EACA,UAAAC;AAAA,EACA,UAAAC;AAAA,EACA,UAAAC;AAAA,EACA,UAAAC;AACD,GAA8B;AAC7B,QAAMC,IAAY,EAAE,GAAGN,EAAA;AAGvB,MACCC,MAAWL,EAAa,KACxBK,MAAWL,EAAa,MACxBK,MAAWL,EAAa,IACvB;AACD,UAAMW,IAAOH,IAAWJ,EAAO;AAC/B,IAAAM,EAAU,IAAI,KAAK,IAAI,GAAG,KAAK,IAAIN,EAAO,IAAIE,GAAUK,CAAI,CAAC;AAAA,EAC9D,WACCN,MAAWL,EAAa,KACxBK,MAAWL,EAAa,MACxBK,MAAWL,EAAa,IACvB;AACD,UAAMY,IAAYR,EAAO,IAAI,GACvBS,IAAYP,IAAW,IAAI,KAAK,IAAIA,GAAUM,CAAS,IAAIN;AACjE,IAAIF,EAAO,IAAIS,KAAa,KAC3BH,EAAU,IAAIN,EAAO,IAAIS,GACzBH,EAAU,IAAIN,EAAO,IAAIS,MAEzBH,EAAU,IAAI,GACdA,EAAU,IAAIN,EAAO,IAAIA,EAAO;AAAA,EAElC;AAGA,MACCC,MAAWL,EAAa,KACxBK,MAAWL,EAAa,MACxBK,MAAWL,EAAa,IACvB;AACD,UAAMc,IAAOL,IAAWL,EAAO;AAC/B,IAAAM,EAAU,IAAI,KAAK,IAAI,GAAG,KAAK,IAAIN,EAAO,IAAIG,GAAUO,CAAI,CAAC;AAAA,EAC9D,WACCT,MAAWL,EAAa,KACxBK,MAAWL,EAAa,MACxBK,MAAWL,EAAa,IACvB;AACD,UAAMY,IAAYR,EAAO,IAAI,GACvBW,IAAYR,IAAW,IAAI,KAAK,IAAIA,GAAUK,CAAS,IAAIL;AACjE,IAAIH,EAAO,IAAIW,KAAa,KAC3BL,EAAU,IAAIN,EAAO,IAAIW,GACzBL,EAAU,IAAIN,EAAO,IAAIW,MAEzBL,EAAU,IAAI,GACdA,EAAU,IAAIN,EAAO,IAAIA,EAAO;AAAA,EAElC;AAEA,SAAOM;AACR;ACrFO,SAASM,GACfhJ,GACAsI,GACAC,GACAC,GACAC,GACyB;AACzB,MAAIzI,EAAO,WAAW,EAAG,QAAO,CAAA;AAEhC,MAAIA,EAAO,WAAW,GAAG;AACxB,UAAM9R,IAAQ8R,EAAO,CAAC;AACtB,QAAI,CAAC9R,EAAO,QAAO,CAAA;AACnB,UAAM+a,IAAOT,IAAWta,EAAM,OAAO,GAC/Bgb,IAAOT,IAAWva,EAAM,OAAO;AACrC,WAAO;AAAA,MACN;AAAA,QACC,SAASA,EAAM;AAAA,QACf,GAAG,KAAK,IAAI,GAAG,KAAK,IAAIA,EAAM,OAAO,IAAIoa,GAAUW,CAAI,CAAC;AAAA,QACxD,GAAG,KAAK,IAAI,GAAG,KAAK,IAAI/a,EAAM,OAAO,IAAIqa,GAAUW,CAAI,CAAC;AAAA,MAAA;AAAA,IACzD;AAAA,EAEF;AAGA,QAAMC,IAAO,KAAK,IAAI,GAAGnJ,EAAO,IAAI,CAACxQ,MAAMA,EAAE,OAAO,CAAC,CAAC,GAChD4Z,IAAO,KAAK,IAAI,GAAGpJ,EAAO,IAAI,CAACxQ,MAAMA,EAAE,OAAO,CAAC,CAAC,GAChD6Z,IAAY,KAAK,IAAI,GAAGrJ,EAAO,IAAI,CAACxQ,MAAMA,EAAE,OAAO,IAAIA,EAAE,OAAO,CAAC,CAAC,GAClE8Z,IAAY,KAAK,IAAI,GAAGtJ,EAAO,IAAI,CAACxQ,MAAMA,EAAE,OAAO,IAAIA,EAAE,OAAO,CAAC,CAAC,GAElE+Z,IAASF,IAAYF,GACrBK,IAASF,IAAYF,GAErBK,IAAc,KAAK,IAAI,GAAG,KAAK,IAAIN,IAAOb,GAAUE,IAAWe,CAAM,CAAC,GACtEG,IAAc,KAAK,IAAI,GAAG,KAAK,IAAIN,IAAOb,GAAUE,IAAWe,CAAM,CAAC,GAEtEG,IAAiBF,IAAcN,GAC/BS,IAAiBF,IAAcN;AAErC,SAAOpJ,EAAO,IAAI,CAAC9R,OAAW;AAAA,IAC7B,SAASA,EAAM;AAAA,IACf,GAAGA,EAAM,OAAO,IAAIyb;AAAA,IACpB,GAAGzb,EAAM,OAAO,IAAI0b;AAAA,EAAA,EACnB;AACH;AC9CO,SAASC,GACfC,GACAjI,GACQ;;AACR,SAAO;AAAA,IACN,IAAIrV,GAAcsd,EAAO,IAAI;AAAA,IAC7B,MAAMA,EAAO;AAAA,IACb,QAAQ;AAAA,MACP,GAAGjI,EAAS;AAAA,MACZ,GAAGA,EAAS;AAAA,MACZ,KAAGvQ,IAAAwY,EAAO,KAAK,gBAAZ,gBAAAxY,EAAyB,MAAK;AAAA,MACjC,KAAGyC,IAAA+V,EAAO,KAAK,gBAAZ,gBAAA/V,EAAyB,MAAK;AAAA,IAAA;AAAA,IAElC,OAAO,CAAA;AAAA,EAAC;AAEV;ACTA,MAAMgW,KAAkC;AAAA,EACvC,KAAK;AAAA,IACJ,OAAO;AAAA,IACP,OAAO,EAAE,OAAO,GAAG,MAAM,KAAA;AAAA,IACzB,MAAM3O,GAAS;AAAA,EAAA;AAAA,EAEhB,OAAO;AAAA,IACN,OAAO;AAAA,IACP,OAAO,EAAE,OAAO,GAAG,MAAM,KAAA;AAAA,IACzB,MAAMA,GAAS;AAAA,EAAA;AAAA,EAEhB,QAAQ;AAAA,IACP,OAAO;AAAA,IACP,OAAO,EAAE,OAAO,GAAG,MAAM,KAAA;AAAA,IACzB,MAAMA,GAAS;AAAA,EAAA;AAAA,EAEhB,MAAM;AAAA,IACL,OAAO;AAAA,IACP,OAAO,EAAE,OAAO,GAAG,MAAM,KAAA;AAAA,IACzB,MAAMA,GAAS;AAAA,EAAA;AAEjB,GAsCM4O,KAAavO;AAAA,EAClB,CAAC;AAAA,IACA,OAAAvN;AAAA,IACA,gBAAA0O;AAAA,IACA,eAAAO;AAAA,IACA,MAAAqJ;AAAA,IACA,SAAAyD;AAAA,IACA,aAAAC;AAAA,EAAA,MAQK;;AACL,UAAMle,IAAQkR,GAAkBhP,GAAO0O,GAAgBO,CAAa,GAC9DlL,IAAS,EAAE,OAAOuU,EAAK,OAAO,QAAQA,EAAK,OAAA;AAEjD,WACC,gBAAApU;AAAA,MAAC;AAAA,MAAA;AAAA,QACA,OAAO;AAAA,UACN,UAAU;AAAA,UACV,MAAM,GAAGoU,EAAK,IAAI;AAAA,UAClB,KAAK,GAAGA,EAAK,GAAG;AAAA,UAChB,OAAO,GAAGA,EAAK,KAAK;AAAA,UACpB,QAAQ,GAAGA,EAAK,MAAM;AAAA,UACtB,SAAAyD;AAAA,UACA,QAAQC;AAAA,UACR,eAAe;AAAA,QAAA;AAAA,QAGhB,UAAA;AAAA,UAAA,gBAAA5X;AAAA,YAAC+J;AAAA,YAAA;AAAA,cACA,aAAapK;AAAA,cACb,aAAa;AAAA,cACb,WAAW6J,GAAgB;AAAA,cAC3B,kBAAiBxK,IAAApD,EAAM,UAAN,gBAAAoD,EAAa;AAAA,YAAA;AAAA,UAAA;AAAA,UAE/B,gBAAAgB;AAAA,YAAC2K;AAAA,YAAA;AAAA,cACA,IAAI/O,EAAM;AAAA,cACV,gBAAA0O;AAAA,cACA,OAAA5Q;AAAA,cACA,OAAOkC,EAAM,aAAa;AAAA,cAC1B,UAAU;AAAA,cACV,MAAMkF,GAAS;AAAA,cACf,aAAanB;AAAA,cACb,aAAa;AAAA,cACb,WAAW6J,GAAgB;AAAA,YAAA;AAAA,UAAA;AAAA,UAG3B,GAAC/H,IAAA7F,EAAM,UAAN,QAAA6F,EAAa,WACd,gBAAAzB;AAAA,YAACoK;AAAA,YAAA;AAAA,cACA,aAAazK;AAAA,cACb,aAAa;AAAA,cACb,WAAW6J,GAAgB;AAAA,cAC3B,aAAaiO;AAAA,YAAA;AAAA,UAAA;AAAA,UAGf,gBAAAzX;AAAA,YAACkJ;AAAA,YAAA;AAAA,cACA,aAAavJ;AAAA,cACb,cAAaoC,IAAAnG,EAAM,UAAN,gBAAAmG,EAAa;AAAA,cAC1B,aAAa;AAAA,cACb,WAAWyH,GAAgB;AAAA,cAC3B,KAAKE;AAAA,YAAA;AAAA,UAAA;AAAA,QACN;AAAA,MAAA;AAAA,IAAA;AAAA,EAGH;AACD;AACAgO,GAAW,cAAc;AAOlB,MAAMG,KAAY1O;AAAA,EACxB,CAAC;AAAA,IACA,QAAAuE;AAAA,IACA,gBAAAC;AAAA,IACA,YAAAmK;AAAA,IACA,eAAAC;AAAA,IACA,gBAAAlK;AAAA,IACA,eAAAhD;AAAA,IACA,aAAA+M,IAAc7c,GAAQ;AAAA,EAAA,MACD;AACrB,QAAI,CAACgd,EAAe,QAAO;AAE3B,UAAM/B,IACL+B,EAAc,YAAY,MAAMA,EAAc,UAAU,KACnD9B,IACL8B,EAAc,YAAY,MAAMA,EAAc,UAAU,KAEnDC,IAAyB;AAAA,MAC9B,UAAU;AAAA,MACV,OAAO;AAAA,MACP,eAAe;AAAA,IAAA;AAIhB,QAAID,EAAc,SAASE,GAAG,MAAM;AACnC,YAAMC,IAAcH,EAAc,SAChC,IAAI,CAAClc,MAAO6R,EAAO,KAAK,CAACxQ,MAAMA,EAAE,OAAOrB,CAAE,CAAC,EAC3C,OAAO,OAAO,GAEVsc,IAAmBzB;AAAA,QACxBwB;AAAA,QACAlC;AAAA,QACAC;AAAA,QACA6B,EAAW;AAAA,QACXA,EAAW;AAAA,MAAA;AAGZ,aACC,gBAAA9X,EAAC,SAAI,OAAOgY,GAAS,eAAY,mBAC/B,UAAAE,EAAY,IAAI,CAACtc,MAAU;AAC3B,cAAM0O,IAAiBqD,EAAe/R,EAAM,IAAI;AAChD,YAAI,CAAC0O,EAAgB,QAAO;AAE5B,YAAI8N;AACJ,cAAMC,IAAYN,EAAc,aAAa,IACvCO,IAAiBP,EAAc;AAErC,YAAIM,KAAaC,GAAgB;AAChC,gBAAMC,IAAW1K,EAAejS,CAAK;AACrC,UAAAwc,IAAY;AAAA,YACX,MAAME,EAAe,IAAIC,EAAS,QAAQ;AAAA,YAC1C,KAAKD,EAAe,IAAIC,EAAS,SAAS;AAAA,YAC1C,OAAOA,EAAS;AAAA,YAChB,QAAQA,EAAS;AAAA,UAAA;AAAA,QAEnB,OAAO;AACN,gBAAMC,IAAaL,EAAiB;AAAA,YACnC,CAACxe,MAAMA,EAAE,YAAYiC,EAAM;AAAA,UAAA;AAE5B,cAAI,CAAC4c,EAAY,QAAO;AACxB,gBAAMC,IAAoB;AAAA,YACzB,GAAG7c;AAAA,YACH,QAAQ;AAAA,cACP,GAAGA,EAAM;AAAA,cACT,GAAG4c,EAAW;AAAA,cACd,GAAGA,EAAW;AAAA,YAAA;AAAA,UACf;AAED,UAAAJ,IAAYvK,EAAe4K,CAAU;AAAA,QACtC;AAEA,eACC,gBAAAzY;AAAA,UAAC0X;AAAA,UAAA;AAAA,YAEA,OAAA9b;AAAA,YACA,gBAAA0O;AAAA,YACA,eAAAO;AAAA,YACA,MAAMuN;AAAA,YACN,SAASC,IAAY,MAAM;AAAA,YAC3B,aAAAT;AAAA,UAAA;AAAA,UANKhc,EAAM;AAAA,QAAA;AAAA,MASd,CAAC,EAAA,CACF;AAAA,IAEF;AAGA,QAAImc,EAAc,SAASE,GAAG,QAAQ;AACrC,YAAMS,IAAUX,EAAc,SAAS,CAAC,GAClChC,IAASgC,EAAc;AAC7B,UAAI,CAACW,KAAW,CAAC3C,EAAQ,QAAO;AAEhC,YAAMna,IAAQ8R,EAAO,KAAK,CAACxQ,MAAMA,EAAE,OAAOwb,CAAO,GAC3CpO,IAAiB1O,IAAQ+R,EAAe/R,EAAM,IAAI,IAAI;AAC5D,UAAI,CAACA,KAAS,CAAC0O,EAAgB,QAAO;AAEtC,YAAM8L,IAAYP,GAAuB;AAAA,QACxC,QAAQja,EAAM;AAAA,QACd,QAAAma;AAAA,QACA,UAAAC;AAAA,QACA,UAAAC;AAAA,QACA,UAAU6B,EAAW;AAAA,QACrB,UAAUA,EAAW;AAAA,MAAA,CACrB,GAEKW,IAAoB,EAAE,GAAG7c,GAAO,QAAQwa,EAAA,GACxCgC,IAAYvK,EAAe4K,CAAU;AAE3C,aACC,gBAAAzY,EAAC,OAAA,EAAI,OAAOgY,GAAS,eAAY,qBAChC,UAAA,gBAAAhY;AAAA,QAAC0X;AAAA,QAAA;AAAA,UACA,OAAA9b;AAAA,UACA,gBAAA0O;AAAA,UACA,eAAAO;AAAA,UACA,MAAMuN;AAAA,UACN,SAASL,EAAc,YAAY,MAAM;AAAA,UACzC,aAAAH;AAAA,QAAA;AAAA,MAAA,GAEF;AAAA,IAEF;AAGA,QAAIG,EAAc,SAASE,GAAG,QAAQ;AACrC,YAAM,EAAE,YAAAU,GAAY,aAAAC,GAAa,aAAAC,GAAa,gBAAAP,MAC7CP;AACD,UAAI,CAACY,KAAc,CAACC,EAAa,QAAO;AAExC,YAAMtO,IAAiBqD,EAAegL,CAAU;AAChD,UAAI,CAACrO,EAAgB,QAAO;AAE5B,YAAM+N,IAAYN,EAAc,aAAa;AAE7C,UAAIK;AAEJ,UAAIC,KAAaC,GAAgB;AAEhC,cAAMQ,IAAYvB,GAAYjN,GAAgB,EAAE,GAAG,GAAG,GAAG,GAAG,GACtDyO,IAAWlL,EAAe;AAAA,UAC/B,GAAGiL;AAAA,UACH,QAAQ,EAAE,GAAGA,EAAU,QAAQ,GAAGF,EAAY,GAAG,GAAGA,EAAY,EAAA;AAAA,QAAE,CAClE;AACD,QAAAR,IAAY;AAAA,UACX,MAAME,EAAe,IAAIS,EAAS,QAAQ;AAAA,UAC1C,KAAKT,EAAe,IAAIS,EAAS,SAAS;AAAA,UAC1C,OAAOA,EAAS;AAAA,UAChB,QAAQA,EAAS;AAAA,QAAA;AAAA,MAEnB,OAAO;AACN,cAAMpC,IAAOmB,EAAW,OAAOc,EAAY,GACrChC,IAAOkB,EAAW,OAAOc,EAAY,GACrCnH,IAAI,KAAK,IAAI,GAAG,KAAK,IAAIoH,EAAY,KAAKlC,CAAI,CAAC,GAC/CjF,IAAI,KAAK,IAAI,GAAG,KAAK,IAAImH,EAAY,KAAKjC,CAAI,CAAC,GAC/C6B,IAAalB,GAAYjN,GAAgB,EAAE,GAAAmH,GAAG,GAAAC,GAAG,GACjDsH,IAAuB;AAAA,UAC5B,GAAGP;AAAA,UACH,QAAQ,EAAE,GAAGA,EAAW,QAAQ,GAAGG,EAAY,GAAG,GAAGA,EAAY,EAAA;AAAA,QAAE;AAEpE,QAAAR,IAAYvK,EAAemL,CAAa;AAAA,MACzC;AAEA,YAAMC,IAAsB;AAAA,QAC3B,GAAG1B,GAAYjN,GAAgB,EAAE,GAAG,GAAG,GAAG,GAAG;AAAA,QAC7C,QAAQ;AAAA,UACP,GAAG;AAAA,UACH,GAAG;AAAA,UACH,GAAGsO,EAAY;AAAA,UACf,GAAGA,EAAY;AAAA,QAAA;AAAA,MAChB;AAGD,aACC,gBAAA5Y,EAAC,OAAA,EAAI,OAAOgY,GAAS,eAAY,qBAChC,UAAA,gBAAAhY;AAAA,QAAC0X;AAAA,QAAA;AAAA,UACA,OAAOuB;AAAA,UACP,gBAAA3O;AAAA,UACA,eAAAO;AAAA,UACA,MAAMuN;AAAA,UACN,SAASC,IAAY,MAAM;AAAA,UAC3B,aAAAT;AAAA,QAAA;AAAA,MAAA,GAEF;AAAA,IAEF;AAEA,WAAO;AAAA,EACR;AACD;AAEAC,GAAU,cAAc;ACnSxB,MAAMqB,KAAoB,CACzB;AAAA,EACC,IAAArd;AAAA,EACA,gBAAAyO;AAAA,EACA,OAAA5Q;AAAA,EACA,OAAAI;AAAA,EACA,UAAA2E;AAAA,EACA,aAAA8M;AAAA,EACA,OAAA3P;AAAA,EACA,QAAAd,IAASC,GAAQ;AAAA,EACjB,gBAAAT;AAAA,EACA,eAAAiQ;AACD,GACA3L,MACI;;AACJ,QAAM4L,IAAW1L,EAAiB,IAAI;AAEtC,EAAAC;AAAA,IACCH;AAAA,IACA,OAAO,EAAE,OAAO,MAAA;;AAAM,cAAAI,IAAAwL,EAAS,YAAT,gBAAAxL,EAAkB;AAAA,MAAM;AAAA,IAC9C,CAAA;AAAA,EAAC;AAGF,QAAMW,IAAS,EAAE,OAAO4L,EAAY,OAAO,QAAQA,EAAY,OAAA;AAE/D,SACC,gBAAAzL;AAAA,IAAC;AAAA,IAAA;AAAA,MACA,OAAO;AAAA,QACN,UAAU;AAAA,QACV,MAAM,GAAGyL,EAAY,IAAI;AAAA,QACzB,KAAK,GAAGA,EAAY,GAAG;AAAA,QACvB,OAAO,GAAG5L,EAAO,KAAK;AAAA,QACtB,QAAQ,GAAGA,EAAO,MAAM;AAAA,QACxB,QAAA7E;AAAA,QACA,eAAe;AAAA,MAAA;AAAA,MAEhB,eAAY;AAAA,MAEZ,UAAA;AAAA,QAAA,gBAAAkF;AAAA,UAAC+J;AAAA,UAAA;AAAA,YACA,aAAapK;AAAA,YACb,aAAa;AAAA,YACb,WAAW6J,GAAgB;AAAA,YAC3B,kBAAiBxK,IAAApD,EAAM,UAAN,gBAAAoD,EAAa;AAAA,UAAA;AAAA,QAAA;AAAA,QAE/B,gBAAAgB;AAAA,UAAC2K;AAAA,UAAA;AAAA,YACA,KAAKH;AAAA,YACL,IAAA3O;AAAA,YACA,gBAAAyO;AAAA,YACA,OAAA5Q;AAAA,YACA,OAAAI;AAAA,YACA,UAAA2E;AAAA,YACA,UAAU;AAAA,YACV,MAAMqC,GAAS;AAAA,YACf,aAAanB;AAAA,YACb,aAAa;AAAA,YACb,WAAW6J,GAAgB;AAAA,YAC3B,gBAAAlP;AAAA,YACA,eAAAiQ;AAAA,UAAA;AAAA,QAAA;AAAA,QAED,gBAAAvK;AAAA,UAACkJ;AAAA,UAAA;AAAA,YACA,aAAavJ;AAAA,YACb,cAAa8B,IAAA7F,EAAM,UAAN,gBAAA6F,EAAa;AAAA,YAC1B,aAAa;AAAA,YACb,WAAW+H,GAAgB;AAAA,YAC3B,KAAKE;AAAA,UAAA;AAAA,QAAA;AAAA,MACN;AAAA,IAAA;AAAA,EAAA;AAGH,GAOayP,KAAehQ,GAAK3K,GAAW0a,EAAiB,CAAC;AAC9DC,GAAa,cAAc;ACzH3B,MAAMC,KAAiB;AAAA,EACtB,OAAO;AAAA,EACP,OAAO,EAAE,OAAO,GAAG,MAAM,KAAA;AAAA,EACzB,MAAMtQ,GAAS;AAChB,GAKauQ,KAA+B;AAAA,EAC3C,KAAKD;AAAA,EACL,OAAOA;AAAA,EACP,QAAQA;AAAA,EACR,MAAMA;AACP,GAGMhH,KAAc,IAEdC,KAAgBD,KAAc,GAG9BkH,KAAU;AAAA,EACf,EAAE,IAAI5D,EAAa,IAAI,QAAQ,eAAe,GAAG,GAAG,GAAG,EAAA;AAAA,EACvD,EAAE,IAAIA,EAAa,GAAG,QAAQ,aAAa,GAAG,IAAI,GAAG,EAAA;AAAA,EACrD,EAAE,IAAIA,EAAa,IAAI,QAAQ,eAAe,GAAG,KAAK,GAAG,EAAA;AAAA,EACzD,EAAE,IAAIA,EAAa,GAAG,QAAQ,aAAa,GAAG,GAAG,GAAG,GAAA;AAAA,EACpD,EAAE,IAAIA,EAAa,GAAG,QAAQ,aAAa,GAAG,KAAK,GAAG,GAAA;AAAA,EACtD,EAAE,IAAIA,EAAa,IAAI,QAAQ,eAAe,GAAG,GAAG,GAAG,IAAA;AAAA,EACvD,EAAE,IAAIA,EAAa,GAAG,QAAQ,aAAa,GAAG,IAAI,GAAG,IAAA;AAAA,EACrD,EAAE,IAAIA,EAAa,IAAI,QAAQ,eAAe,GAAG,KAAK,GAAG,IAAA;AAC1D,GAkCa6D,KAAmBpQ;AAAA,EAC/B,CAAC;AAAA,IACA,OAAAvN;AAAA,IACA,MAAAsY;AAAA,IACA,aAAAsF,IAAc;AAAA,IACd,eAAAzH;AAAA,IACA,cAAA0H;AAAA,IACA,gBAAAC,IAAiBL;AAAA,IACjB,oBAAAM,IAAqB5e,GAAQ;AAAA,IAC7B,oBAAA6e,IAAqB7e,GAAQ;AAAA,EAAA,MACD;AAC5B,UAAMmE,IAAgC;AAAA,MACrC,UAAU;AAAA,MACV,MAAM,GAAGgV,EAAK,IAAI;AAAA,MAClB,KAAK,GAAGA,EAAK,GAAG;AAAA,MAChB,OAAO,GAAGA,EAAK,KAAK;AAAA,MACpB,QAAQ,GAAGA,EAAK,MAAM;AAAA,MACtB,eAAe;AAAA,IAAA;AAGhB,WACC,gBAAApU;AAAA,MAAC;AAAA,MAAA;AAAA,QACA,OAAOZ;AAAA,QACP,eAAY;AAAA,QACZ,iBAAetD,EAAM;AAAA,QAGrB,UAAA;AAAA,UAAA,gBAAAoE;AAAA,YAACkJ;AAAA,YAAA;AAAA,cACA,aAAa,EAAE,OAAOgL,EAAK,OAAO,QAAQA,EAAK,OAAA;AAAA,cAC/C,aAAawF;AAAA,cACb,aAAaC;AAAA,cACb,WAAW;AAAA,cACX,KAAKjQ;AAAA,YAAA;AAAA,UAAA;AAAA,UAIL8P,KACAzH,KACAuH,GAAQ,IAAI,CAAC,EAAE,IAAAzd,GAAI,QAAAge,GAAQ,GAAApI,GAAG,GAAAC,QAAQ;AACrC,kBAAM5H,IACL2H,MAAM,KACH,cAAcY,EAAa,QAC3BZ,MAAM,MACL,eAAeY,EAAa,QAC5B,IAAIA,EAAa,MAChB1I,IACL+H,MAAM,KACH,cAAcW,EAAa,QAC3BX,MAAM,MACL,eAAeW,EAAa,QAC5B,IAAIA,EAAa,MAEhByH,IAAWL,MAAiB5d;AAElC,mBACC,gBAAAmE;AAAA,cAAC;AAAA,cAAA;AAAA,gBAEA,eAAe,CAACD,MAAM;AACrB,kBAAAA,EAAE,gBAAA,GACFgS,EAAchS,GAAGlE,CAAE;AAAA,gBACpB;AAAA,gBACA,OAAO;AAAA,kBACN,UAAU;AAAA,kBACV,MAAAiO;AAAA,kBACA,KAAAH;AAAA,kBACA,OAAO,GAAGyI,EAAW;AAAA,kBACrB,QAAQ,GAAGA,EAAW;AAAA,kBACtB,iBAAiB0H,IAAW,YAAY;AAAA,kBACxC,QAAQ;AAAA,kBACR,cAAc;AAAA,kBACd,QAAAD;AAAA,kBACA,QAAQD;AAAA,kBACR,eAAe;AAAA,kBACf,WAAW;AAAA,kBACX,WAAWE,IAAW,eAAe;AAAA,gBAAA;AAAA,gBAEtC,eAAa,iBAAiBje,CAAE;AAAA,cAAA;AAAA,cApB3BA;AAAA,YAAA;AAAA,UAuBR,CAAC;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAGL;AACD;AAEA0d,GAAiB,cAAc;AChHxB,MAAMQ,KAAiB5Q;AAAA,EAC7B,CAAC;AAAA,IACA,QAAAuE;AAAA,IACA,kBAAAE;AAAA,IACA,YAAAsE;AAAA,IACA,eAAA6F;AAAA,IACA,gBAAAlK;AAAA,IACA,eAAAkE;AAAA,IACA,gBAAA2H,IAAiBL;AAAA,IACjB,oBAAAM;AAAA,IACA,oBAAAC;AAAA,EAAA,MAC0B;AAG1B,QADiB1H,MAAc6F,KAAA,gBAAAA,EAAe,UAASpC,GAAS,OAClD,QAAO;AAErB,UAAMqE,IAAY,MAAM,KAAK,IAAI,IAAIpM,CAAgB,CAAC;AAEtD,WACC,gBAAA5N,EAAC,OAAA,EAAI,OAAO,EAAE,UAAU,YAAY,OAAO,GAAG,eAAe,OAAA,GAC3D,UAAAga,EAAU,IAAI,CAACne,MAAO;AACtB,YAAMD,IAAQ8R,EAAO,KAAK,CAACxQ,MAAMA,EAAE,OAAOrB,CAAE;AAC5C,UAAI,CAACD,EAAO,QAAO;AAKnB,YAAM6d,KAFL1B,KAAA,gBAAAA,EAAe,UAASpC,GAAS,UACjCoC,EAAc,SAAS,SAASlc,CAAE,IACDkc,KAAA,gBAAAA,EAAe,SAAS;AAE1D,aACC,gBAAA/X;AAAA,QAACuZ;AAAA,QAAA;AAAA,UAEA,OAAA3d;AAAA,UACA,MAAMiS,EAAejS,CAAK;AAAA,UAC1B,aAAa;AAAA,UACb,eAAe,CAACmE,GAAGgW,MAAWhE,EAAchS,GAAGgW,GAAQla,CAAE;AAAA,UACzD,cAAc4d,KAAgB;AAAA,UAC9B,gBAAAC;AAAA,UACA,oBAAAC;AAAA,UACA,oBAAAC;AAAA,QAAA;AAAA,QARKhe,EAAM;AAAA,MAAA;AAAA,IAWd,CAAC,EAAA,CACF;AAAA,EAEF;AACD;AAEAme,GAAe,cAAc;AC7FtB,SAASE,GACf1K,GACAhS,GACA2Y,GACAC,GAC2B;AAC3B,QAAMQ,IAAOT,IAAW3Y,EAAK,GACvBqZ,IAAOT,IAAW5Y,EAAK;AAC7B,SAAO;AAAA,IACN,GAAG,KAAK,IAAI,GAAG,KAAK,IAAIgS,EAAS,GAAGoH,CAAI,CAAC;AAAA,IACzC,GAAG,KAAK,IAAI,GAAG,KAAK,IAAIpH,EAAS,GAAGqH,CAAI,CAAC;AAAA,EAAA;AAE3C;ACVO,SAASsD,GACfpE,GACAI,GACAC,GAC2B;AAC3B,QAAMgE,IACLrE,EAAO,IAAIA,EAAO,IAAII,IAAWJ,EAAO,IAAI,IAAI,KAAK,IAAI,GAAGA,EAAO,IAAI,CAAC,GACnEsE,IACLtE,EAAO,IAAIA,EAAO,IAAIK,IAAWL,EAAO,IAAI,IAAI,KAAK,IAAI,GAAGA,EAAO,IAAI,CAAC;AACzE,SAAO,EAAE,GAAGqE,GAAM,GAAGC,EAAA;AACtB;ACVO,SAASC,GACfC,GACA5M,GACAG,GACgB;AAChB,QAAM,EAAE,GAAA4D,GAAG,GAAAC,EAAA,IAAM4I;AACjB,WAASje,IAAIqR,EAAO,SAAS,GAAGrR,KAAK,GAAGA,KAAK;AAC5C,UAAMT,IAAQ8R,EAAOrR,CAAC;AACtB,QAAI,CAACT,EAAO;AACZ,UAAMsY,IAAOrG,EAAejS,CAAK;AACjC,QACC6V,KAAKyC,EAAK,QACVzC,KAAKyC,EAAK,OAAOA,EAAK,SACtBxC,KAAKwC,EAAK,OACVxC,KAAKwC,EAAK,MAAMA,EAAK;AAErB,aAAOtY,EAAM;AAAA,EAEf;AACA,SAAO;AACR;AC2EO,MAAM2e,KAAmBpR;AAAA,EAC/B,CAAC;AAAA,IACA,MAAAxN;AAAA,IACA,gBAAAgS;AAAA,IACA,YAAAmK;AAAA,IACA,eAAAjN;AAAA,IACA,gBAAAgD;AAAA,IACA,aAAA2M;AAAA,IACA,aAAAC;AAAA,IACA,OAAA9S;AAAA,IACA,eAAA+S;AAAA,IACA,kBAAA9M;AAAA,IACA,mBAAA+M;AAAA,IACA,cAAAC;AAAA,IACA,eAAArQ;AAAA,IACA,gBAAAjQ;AAAA,IACA,OAAAugB,IAAQ;AAAA,IACR,WAAAnH,IAAY;AAAA,IACZ,gBAAAgG;AAAA,EAAA,MAC4B;AAC5B,UAAMhM,IAAS/R,EAAK,QACdmf,IAAWhc,EAAuB,IAAI,GACtCic,IAAkBjc,EAAiB,IAAI,GACvCkc,IAAgBlc,EAA6C,IAAI;AAGvE,IAAA+Q,GAAU,MACF,MAAM;AACZ,MAAImL,EAAc,YAAY,QAC7B,aAAaA,EAAc,OAAO;AAAA,IAEpC,GACE,CAAA,CAAE;AAEL,UAAMra,IAAOiV,GAAmBjO,CAAK,GAG/BsT,IAAkBnc,EAId,IAAI,GACRoc,IAAyBpc,EAAO,CAAC,GAGjCqc,IAAmBrc,EAIf,IAAI,GACRsc,IAA0Btc,EAAO,CAAC,GAGlCuc,IAAWvc,EAAO6I,CAAK;AAC7B,IAAA0T,EAAS,UAAU1T;AACnB,UAAM2T,IAAmBxc,EAAO4b,CAAa;AAC7C,IAAAY,EAAiB,UAAUZ,GAC3B7K,GAAU,MAAM;AACf,UAAIlP,MAAS8U,GAAgB,OAAQ;AACrC,YAAM8F,IAAwB,CAACxb,MAAoB;AAClD,cAAMyb,IAAQV,EAAS;AACvB,QAAIU,MAAUzb,EAAE,WAAWyb,KAASA,EAAM,SAASzb,EAAE,MAAc,MAKnEub,EAAiB,QAAQ,EAAE,GAAGD,EAAS,SAAS,UAAU,QAAW;AAAA,MACtE;AACA,oBAAO,iBAAiB,aAAaE,CAAqB,GACnD,MACN,OAAO,oBAAoB,aAAaA,CAAqB;AAAA,IAC/D,GAAG,CAAC5a,CAAI,CAAC,GAGTkP,GAAU,MAAM;AACf,UAAIlP,MAAS8U,GAAgB,WAAW9N,EAAM,gBAAgB;AAC7D,cAAM9L,IAAK,WAAW,MAAM;;AAC3B,WAAAmD,IAAA+b,EAAgB,YAAhB,QAAA/b,EAAyB;AAAA,QAC1B,GAAG,CAAC;AACJ,eAAO,MAAM,aAAanD,CAAE;AAAA,MAC7B;AAAA,IAED,GAAG,CAAC8E,GAAMgH,EAAM,cAAc,CAAC,GAG/BkI,GAAU,MAAM;AACf,YAAM4L,IAAW,IAAI,IAAI/N,EAAO,IAAI,CAACxQ,MAAMA,EAAE,EAAE,CAAC,GAC1Cwe,IAAW9N,EAAiB,OAAO,CAAC/R,MAAO4f,EAAS,IAAI5f,CAAE,CAAC;AACjE,MAAI6f,EAAS,WAAW9N,EAAiB,UACxC+M,EAAkBe,CAAQ;AAAA,IAE5B,GAAG,CAAChO,GAAQE,GAAkB+M,CAAiB,CAAC;AAGhD,UAAMpI,KAAoB5N;AAAA,MACzB,CAAC5E,MAA0B;;AAC1B,YAAIA,EAAE,WAAW,EAAG;AAEpB,cAAMmU,KAAOlV,IAAA8b,EAAS,YAAT,gBAAA9b,EAAkB;AAC/B,YAAI,CAACkV,EAAM;AACX,cAAMyH,IAAKd,GACLe,IAAK;AAAA,UACV,IAAI7b,EAAE,UAAUmU,EAAK,QAAQyH;AAAA,UAC7B,IAAI5b,EAAE,UAAUmU,EAAK,OAAOyH;AAAA,QAAA,GAGvBE,IAAWxB,GAAiBuB,GAAIlO,GAAQG,CAAc;AAG5D,YAAIlN,MAAS8U,GAAgB,SAAS;AACrC,UAAIoG,MAAalU,EAAM,mBACtB+S,EAAc,EAAE,GAAG/S,GAAO,gBAAgB,MAAM,GAC3CkU,KAAUlB,EAAkB,EAAE;AAEpC;AAAA,QACD;AAEA,cAAMmB,IAAUtB,EAAYoB,EAAG,CAAC,GAC1BG,IAAUtB,EAAYmB,EAAG,CAAC;AAEhC,YAAIC,GAAU;AACb,UAAA9b,EAAE,gBAAA;AACF,gBAAMic,IAAapO,EAAiB,SAASiO,CAAQ;AAErD,cAAIG,KAAcjc,EAAE,UAAU;AAC7B,YAAA4a,EAAkB/M,EAAiB,OAAO,CAAC/R,MAAOA,MAAOggB,CAAQ,CAAC;AAClE;AAAA,UACD;AAEC,UAAA9b,EAAE,cAA0B,kBAAkBA,EAAE,SAAS,GAEtDic,IACHtB,EAAc;AAAA,YACb,GAAG/S;AAAA,YACH,UAAU;AAAA,cACT,MAAMgO,GAAS;AAAA,cACf,UAAU/H;AAAA,cACV,WAAW,EAAE,KAAKkO,GAAS,KAAKC,EAAA;AAAA,cAChC,aAAa,EAAE,KAAKD,GAAS,KAAKC,EAAA;AAAA,cAClC,WAAW;AAAA,YAAA;AAAA,UACZ,CACA,IAEGhc,EAAE,WACL4a,EAAkB,CAAC,GAAG/M,GAAkBiO,CAAQ,CAAC,KAEjDlB,EAAkB,CAACkB,CAAQ,CAAC,GAC5BnB,EAAc;AAAA,YACb,GAAG/S;AAAA,YACH,UAAU;AAAA,cACT,MAAMgO,GAAS;AAAA,cACf,UAAU,CAACkG,CAAQ;AAAA,cACnB,WAAW,EAAE,KAAKC,GAAS,KAAKC,EAAA;AAAA,cAChC,aAAa,EAAE,KAAKD,GAAS,KAAKC,EAAA;AAAA,cAClC,WAAW;AAAA,YAAA;AAAA,UACZ,CACA;AAAA,QAGJ;AACC,UAAAhc,EAAE,gBAAA,GACF4a,EAAkB,CAAA,CAAE;AAAA,MAEtB;AAAA,MACA;AAAA,QACCjN;AAAA,QACAG;AAAA,QACA2M;AAAA,QACAC;AAAA,QACA9Z;AAAA,QACAiN;AAAA,QACA+M;AAAA,QACAD;AAAA,QACAG;AAAA,QACAlT;AAAA,MAAA;AAAA,IACD,GAIK8K,KAAoB9N;AAAA,MACzB,CAAC5E,MAA0B;;AAO1B,YALCY,MAAS8U,GAAgB,YACzB9U,MAAS8U,GAAgB,YACzB9U,MAAS8U,GAAgB,UAGtB,CAAC9N,EAAM,SAAU;AAErB,cAAMuM,KAAOlV,IAAA8b,EAAS,YAAT,gBAAA9b,EAAkB;AAC/B,YAAI,CAACkV,EAAM;AACX,cAAMyH,IAAKd,GACLoB,IAAU/H,EAAK,QAAQyH,GACvBO,IAAUhI,EAAK,SAASyH,GACxBQ,KAAQpc,EAAE,UAAUmU,EAAK,QAAQyH,GACjCS,KAAQrc,EAAE,UAAUmU,EAAK,OAAOyH,GAEhCtD,IACL1Q,EAAM,SAAS,SAASgO,GAAS,WAChCwG,IAAO,KAAKA,IAAOF,KAAWG,IAAO,KAAKA,IAAOF,IAE7CG,IAAW,KAAK,IAAI,GAAG,KAAK,IAAIF,GAAMF,CAAO,CAAC,GAC9CK,IAAW,KAAK,IAAI,GAAG,KAAK,IAAIF,GAAMF,CAAO,CAAC;AAEpD,YAAIK,IAAa/B,EAAY6B,CAAQ,GACjCG,IAAa/B,EAAY6B,CAAQ;AAGrC,YAAI3U,EAAM,SAAS,SAASgO,GAAS,UAAUhO,EAAM,SAAS,QAAQ;AACrE,gBAAMhK,IAAIgK,EAAM,SAAS;AACzB,WACChK,MAAM+X,EAAa,KACnB/X,MAAM+X,EAAa,MACnB/X,MAAM+X,EAAa,QAEnB6G,IAAa/B,EAAY6B,CAAQ,IAAI,KAGrC1e,MAAM+X,EAAa,KACnB/X,MAAM+X,EAAa,MACnB/X,MAAM+X,EAAa,QAEnB8G,IAAa/B,EAAY6B,CAAQ,IAAI;AAAA,QAEvC;AAEA,QAAA5B,EAAc;AAAA,UACb,GAAG/S;AAAA,UACH,UAAU;AAAA,YACT,GAAGA,EAAM;AAAA,YACT,aAAa,EAAE,KAAK4U,GAAY,KAAKC,EAAA;AAAA,YACrC,gBAAgB,EAAE,GAAGL,GAAM,GAAGC,EAAA;AAAA,YAC9B,WAAA/D;AAAA,UAAA;AAAA,QACD,CACA;AAAA,MACF;AAAA,MACA,CAAC1X,GAAMgH,GAAO6S,GAAaC,GAAaC,GAAeG,CAAK;AAAA,IAAA,GAIvDjI,KAAkBjO;AAAA,MACvB,CAAC5E,MAA0B;AAC1B,aACEY,MAAS8U,GAAgB,YACzB9U,MAAS8U,GAAgB,WAC1B9N,EAAM,UACL;AAED,cAAIA,EAAM,SAAS,WAAW;AAC7B,gBAAIA,EAAM,SAAS,SAASgO,GAAS,MAAM;AAC1C,oBAAM8G,IAAa,IAAI,IAAI9U,EAAM,SAAS,QAAQ;AAClD,cAAAiT,EAAa;AAAA,gBACZ,GAAGjf;AAAA,gBACH,QAAQ+R,EAAO,OAAO,CAACxQ,MAAM,CAACuf,EAAW,IAAIvf,EAAE,EAAE,CAAC;AAAA,cAAA,CAClD,GACDyd,EAAkB,CAAA,CAAE;AAAA,YACrB;AACA,YAAAD,EAAc,EAAE,GAAG/S,GAAO,UAAU,QAAW,GAC9C5H,EAAE,cAA0B,sBAAsBA,EAAE,SAAS;AAC9D;AAAA,UACD;AAEA,gBAAMiW,IACLrO,EAAM,SAAS,YAAY,MAAMA,EAAM,SAAS,UAAU,KACrDsO,IACLtO,EAAM,SAAS,YAAY,MAAMA,EAAM,SAAS,UAAU;AAG3D,cACCA,EAAM,SAAS,SAASgO,GAAS,SAChCK,MAAa,KAAKC,MAAa,IAC/B;AACD,kBAAMiC,IAAcvQ,EAAM,SAAS,SACjC,IAAI,CAAC9L,MAAO6R,EAAO,KAAK,CAAC,MAAM,EAAE,OAAO7R,CAAE,CAAC,EAC3C,OAAO,OAAO;AAEhB,gBAAIqc,EAAY,SAAS,GAAG;AAC3B,oBAAMC,IAAmBzB;AAAA,gBACxBwB;AAAA,gBACAlC;AAAA,gBACAC;AAAA,gBACA6B,EAAW;AAAA,gBACXA,EAAW;AAAA,cAAA;AAGZ,cAAA8C,EAAa;AAAA,gBACZ,GAAGjf;AAAA,gBACH,QAAQ+R,EAAO,IAAI,CAAC,MAAM;AACzB,wBAAMgP,IAAMvE,EAAiB,KAAK,CAACxe,MAAMA,EAAE,YAAY,EAAE,EAAE;AAC3D,yBAAK+iB,IACE,EAAE,GAAG,GAAG,QAAQ,EAAE,GAAG,EAAE,QAAQ,GAAGA,EAAI,GAAG,GAAGA,EAAI,IAAE,IADxC;AAAA,gBAElB,CAAC;AAAA,cAAA,CACD;AAAA,YACF;AAAA,UACD,WAES/U,EAAM,SAAS,SAASgO,GAAS,QAAQ;AACjD,kBAAM,EAAE,YAAAgD,GAAY,aAAAE,GAAa,aAAAD,EAAA,IAAgBjR,EAAM;AACvD,gBAAIgR,KAAcC,GAAa;AAC9B,oBAAM+D,IAAWhP,EAAegL,CAAU;AAC1C,kBAAIgE,GAAU;AACb,sBAAM,EAAE,GAAAlL,GAAG,GAAAC,EAAA,IAAMuI;AAAA,kBAChB,EAAE,GAAGpB,EAAY,KAAK,GAAGA,EAAY,IAAA;AAAA,kBACrC,EAAE,GAAGD,EAAY,GAAG,GAAGA,EAAY,EAAA;AAAA,kBACnCd,EAAW;AAAA,kBACXA,EAAW;AAAA,gBAAA,GAEN8E,IAAkB;AAAA,kBACvB,GAAGrF,GAAYoF,GAAU,EAAE,GAAAlL,GAAG,GAAAC,GAAG;AAAA,kBACjC,QAAQ;AAAA,oBACP,GAAAD;AAAA,oBACA,GAAAC;AAAA,oBACA,GAAGkH,EAAY;AAAA,oBACf,GAAGA,EAAY;AAAA,kBAAA;AAAA,gBAChB;AAED,gBAAAgC,EAAa,EAAE,GAAGjf,GAAM,QAAQ,CAAC,GAAG+R,GAAQkP,CAAQ,GAAG,GACvDjC,EAAkB,CAACiC,EAAS,EAAE,CAAC;AAAA,cAChC;AAAA,YACD;AAAA,UACD,WAESjV,EAAM,SAAS,SAASgO,GAAS,QAAQ;AACjD,kBAAMkG,IAAWlU,EAAM,SAAS,SAAS,CAAC,GACpC/L,IAAQ8R,EAAO,KAAK,CAACxQ,MAAMA,EAAE,OAAO2e,CAAQ,GAC5C9F,IAASpO,EAAM,SAAS;AAE9B,gBAAI/L,KAASma,MAAWC,MAAa,KAAKC,MAAa,IAAI;AAC1D,oBAAMG,IAAYP,GAAuB;AAAA,gBACxC,QAAQja,EAAM;AAAA,gBACd,QAAAma;AAAA,gBACA,UAAAC;AAAA,gBACA,UAAAC;AAAA,gBACA,UAAU6B,EAAW;AAAA,gBACrB,UAAUA,EAAW;AAAA,cAAA,CACrB;AAED,eACC1B,EAAU,MAAMxa,EAAM,OAAO,KAC7Bwa,EAAU,MAAMxa,EAAM,OAAO,KAC7Bwa,EAAU,MAAMxa,EAAM,OAAO,KAC7Bwa,EAAU,MAAMxa,EAAM,OAAO,MAE7Bgf,EAAa;AAAA,gBACZ,GAAGjf;AAAA,gBACH,QAAQ+R,EAAO;AAAA,kBAAI,CAACxQ,MACnBA,EAAE,OAAOtB,EAAM,KAAK,EAAE,GAAGsB,GAAG,QAAQkZ,MAAclZ;AAAA,gBAAA;AAAA,cACnD,CACA;AAAA,YAEH;AAAA,UACD;AAEA,UAAAwd,EAAc,EAAE,GAAG/S,GAAO,UAAU,QAAW;AAAA,QAChD,WAAWhH,MAAS8U,GAAgB,YAAY9N,EAAM,UAAU;AAC/D,cACCA,EAAM,SAAS,aACfA,EAAM,SAAS,SAASgO,GAAS,MAChC;AACD,kBAAM8G,IAAa,IAAI,IAAI9U,EAAM,SAAS,QAAQ;AAClD,YAAAiT,EAAa;AAAA,cACZ,GAAGjf;AAAA,cACH,QAAQ+R,EAAO,OAAO,CAACxQ,MAAM,CAACuf,EAAW,IAAIvf,EAAE,EAAE,CAAC;AAAA,YAAA,CAClD,GACDyd,EAAkB,CAAA,CAAE;AAAA,UACrB;AACA,UAAAD,EAAc,EAAE,GAAG/S,GAAO,UAAU,QAAW;AAAA,QAChD;AAEC,QAAA5H,EAAE,cAA0B,sBAAsBA,EAAE,SAAS;AAAA,MAC/D;AAAA,MACA;AAAA,QACCY;AAAA,QACAgH;AAAA,QACA+F;AAAA,QACA/R;AAAA,QACAmc;AAAA,QACAnK;AAAA,QACAiN;AAAA,QACAF;AAAA,QACAC;AAAA,MAAA;AAAA,IACD,GAIKkC,IAAoBlY;AAAA,MACzB,CAAC5E,MAAwB;;AACxB,cAAMmU,KAAOlV,IAAA8b,EAAS,YAAT,gBAAA9b,EAAkB;AAC/B,YAAI,CAACkV,EAAM;AACX,cAAMyH,IAAKd,GACLe,IAAK;AAAA,UACV,IAAI7b,EAAE,UAAUmU,EAAK,QAAQyH;AAAA,UAC7B,IAAI5b,EAAE,UAAUmU,EAAK,OAAOyH;AAAA,QAAA,GAEvBE,IAAWxB,GAAiBuB,GAAIlO,GAAQG,CAAc;AAC5D,QAAIgO,MACEjO,EAAiB,SAASiO,CAAQ,KACtClB,EAAkB,CAACkB,CAAQ,CAAC,GAE7BnB,EAAc,EAAE,GAAG/S,GAAO,gBAAgBkU,GAAU;AAAA,MAEtD;AAAA,MACA;AAAA,QACCnO;AAAA,QACAG;AAAA,QACA8M;AAAA,QACAD;AAAA,QACAG;AAAA,QACAjN;AAAA,QACAjG;AAAA,MAAA;AAAA,IACD,GAIKmV,IAAqBnY;AAAA,MAC1B,CAAC5E,MAA0B;;AAC1B,aACEY,MAAS8U,GAAgB,YACzB9U,MAAS8U,GAAgB,YACzB9U,MAAS8U,GAAgB,WAC1B9N,EAAM,UACL;AACD,gBAAMuM,KAAOlV,IAAA8b,EAAS,YAAT,gBAAA9b,EAAkB;AAC/B,cAAI,CAACkV,EAAM;AACX,gBAAMyH,IAAKd,GACLsB,KAAQpc,EAAE,UAAUmU,EAAK,QAAQyH,GACjCS,KAAQrc,EAAE,UAAUmU,EAAK,OAAOyH,GAChCM,IAAU/H,EAAK,QAAQyH,GACvBO,IAAUhI,EAAK,SAASyH,GACxBU,IAAW,KAAK,IAAI,GAAG,KAAK,IAAIF,GAAMF,CAAO,CAAC,GAC9CK,IAAW,KAAK,IAAI,GAAG,KAAK,IAAIF,GAAMF,CAAO,CAAC;AAEpD,UAAAxB,EAAc;AAAA,YACb,GAAG/S;AAAA,YACH,UAAU;AAAA,cACT,GAAGA,EAAM;AAAA,cACT,aAAa;AAAA,gBACZ,KAAK6S,EAAY6B,CAAQ;AAAA,gBACzB,KAAK5B,EAAY6B,CAAQ;AAAA,cAAA;AAAA,cAE1B,gBAAgB,EAAE,GAAGH,GAAM,GAAGC,EAAA;AAAA,cAC9B,WAAW;AAAA,YAAA;AAAA,UACZ,CACA;AAAA,QACF;AAAA,MACD;AAAA,MACA,CAACzb,GAAMgH,GAAOkT,GAAOL,GAAaC,GAAaC,CAAa;AAAA,IAAA,GAIvDxK,IAAgBvL;AAAA,MACrB,CAAC5E,MAA2B;AAC3B,cAAM8Q,IAAYlQ,MAAS8U,GAAgB;AAG3C,YAAI1V,EAAE,QAAQ,UAAU;AACvB,UAAI8Q,KACH9Q,EAAE,eAAA,GACF2a,EAAc,EAAE,GAAG/S,GAAO,gBAAgB,MAAM,GAChDqT,EAAc,UAAU;AAAA,YACvB;;AAAM,sBAAAhc,IAAA8b,EAAS,YAAT,gBAAA9b,EAAkB;AAAA;AAAA,YACxB;AAAA,UAAA,KAES4O,EAAiB,SAAS,MACpC7N,EAAE,eAAA,GACF4a,EAAkB,CAAA,CAAE;AAErB;AAAA,QACD;AAEA,YAAI9J,EAAW;AAGf,YACC9Q,EAAE,IAAI,YAAA,MAAkB,QACvBA,EAAE,WAAWA,EAAE,YAChB,CAACA,EAAE,UACF;AACD,UAAAA,EAAE,eAAA,GACFwK,KAAA,QAAAA,EAAe,QAAQ;AACvB;AAAA,QACD;AAGA,YACExK,EAAE,IAAI,kBAAkB,QAAQA,EAAE,WAAWA,EAAE,YAC/CA,EAAE,IAAI,YAAA,MAAkB,QACvBA,EAAE,WAAWA,EAAE,YAChBA,EAAE,UACF;AACD,UAAAA,EAAE,eAAA,GACFwK,KAAA,QAAAA,EAAe,QAAQ;AACvB;AAAA,QACD;AAGA,YACCxK,EAAE,QAAQ,QACTA,EAAE,WAAWA,EAAE,YAChB6N,EAAiB,SAAS,GACzB;AACD,UAAA7N,EAAE,eAAA,GACFwK,EAAc,QAAQ,MAAM;AAC5B;AAAA,QACD;AAGA,YACCxK,EAAE,QAAQ,QACTA,EAAE,WAAWA,EAAE,YAChB6N,EAAiB,SAAS,GACzB;AACD,UAAA7N,EAAE,eAAA,GACFwK,EAAc,QAAQ,MAAM;AAC5B,gBAAMkS,IAAa,IAAI,IAAI7O,CAAgB;AAC3C,UAAAgN,EAAa;AAAA,YACZ,GAAGjf;AAAA,YACH,QAAQ+R,EAAO,OAAO,CAACxQ,MAAM,CAACuf,EAAW,IAAIvf,EAAE,EAAE,CAAC;AAAA,UAAA,CAClD,GACDyd,EAAkB,CAAA,CAAE;AACpB;AAAA,QACD;AAGA,YAAI5a,EAAE,QAAQ,QAAQA,EAAE,WAAWA,EAAE,UAAU;AAC9C,UAAIwK,EAAc,UAAU,OAAO,MAClCxK,EAAE,eAAA,GACFwK,EAAc,QAAQ,OAAO;AAE9B;AAAA,QACD;AAGA,YACCxK,EAAE,QAAQ,QACTA,EAAE,WAAWA,EAAE,YAChB6N,EAAiB,SAAS,GACzB;AACD,UAAA7N,EAAE,eAAA;AAIF,gBAAMgd,IAHWrP,EAAO;AAAA,YAAO,CAACxQ,MAC/B0Q,EAAiB,SAAS1Q,EAAE,EAAE;AAAA,UAAA,EAEJ,IAAI,CAACA,MAAM;AACrC,kBAAM,EAAE,GAAAuU,GAAG,GAAAC,GAAA,IAAMwI;AAAA,cAChBhd,EAAE;AAAA,cACF4a,EAAW;AAAA,cACXA,EAAW;AAAA,YAAA;AAEZ,mBAAO;AAAA,cACN,GAAG5a;AAAA,cACH,IAAIhD,GAAcgD,EAAE,IAAI;AAAA,cACxB,QAAQ,EAAE,GAAGA,EAAE,QAAQ,GAAAuU,GAAG,GAAAC,GAAA;AAAA,YAAE;AAAA,UAE9B,CAAC;AACD,UAAAkJ,EAAa,EAAE,GAAGjf,GAAM,QAAQ,CAAC,GAAG+R,GAAQ,GAAGqP,CAAS,GAAG,GAC3DpC,EAAkBoC,EAAU,IAAI,CAAC7f,MAAMA,EAAE,EAAE,CAAC;AAC5C;AAAA,QACD;AAGA,aACE6C,EAAE,QAAQ,YAAYA,EAAE,QAAQ,gBACjC6N,EAAiB,SAAS,GACzB;AACD,UAAA7N,EAAE,eAAA;AACF,gBAAM0c,IAAa,IAAI,IAAI7O,CAAgB;AAC3C,UAAAgN,EAAa;AAAA,YACZ,GAAGjf;AAAA,YACH,QAAQ+R,EAAO,OAAO,CAACxQ,MAAM,CAACuf,EAAW,IAAIvf,EAAE,EAAE,CAAC;AAAA,UAAA,CAClD,GACDyd,EAAkB,CAAA,CAAE;AACpB;AAAA,QACD;AAGA,YAAI5a,EAAE,QAAQ,QAAQA,EAAE,WAAWA,EAAE,UAAU;AAC9C,cAAI2N,EAAO,WAAW,EAAG;AACzB,UAAA3N,EAAE,eAAA,GACF4a,EAAkBjN,EAAO,IAAI,CAACxQ,MAAMA,EAAE,EAAE,CAAC;AACzC;AAAA,QACD;AAGA,YAAI6C,EAAE,QAAQ,OAAO;AACpB,cAAI2N,EAAO,WAAW,EAAG;AACzB,gBAAMsP,IAAS,CAAC,GAAGtP,CAAM,EAAE;AAAA,YAAK,CAACuP,GAAG/f,OACnC+f,EAAE,OAAO,MAAM/f,GAAE,OAAO,IACrB+f,EAAE,OAAO,IAAI/f,GAAE,OAAO,IACtB+f,EAAE,OAAO,IAAI/f,GAAE,OAAO;AAAA,UAAA,GAEpBggB,IACLtP,EAAiB,WAAW,IAAIA,EAAiB,CAAC,IAAI,MACjDuP,IACLD,MAAe,OACZF,EAAO,UAAU,CAAC9f,MAAMA,EAAE,OAAOggB,CAAU,IAC3C;AAEJ,cAAInd,EAAE,UAAU;AACf,gBAAIod,KAAU,GAAG;AAChB,cAAAxC,EAAkB,CAAA,CAAE;AACpB;AAAA,YACD;AACA,kBAAMzN,IAAO8P,EAAOG,IAAS,CAAC;AAC9B,gBAAI,CAACjQ,EAAM;AACX,YAAAnN,EAAE,eAAA,GACF4a,EAAkB,CAACzN,EAAK,EAAE,CAAC;AAAA,UAC5B,WACKiQ,MAAW,IAAI;AAClB,kBAAMC,IAAQJ,EAAO,CAAC;AACtB,gBAAI,CAACI,EAAO;AACZ,YAAArd,EAAE,eAAA,GACF4a,EAAkB,CAACyC,EAAM,EAAE,CAAC;AAAA,UAC7B,WAAWD,KAAUH,EAAO,SAAS,GAAG;AACvC,YAAArC,EAAkB,CAAA,CAAE;AACpB;AAAA,UACD,OAAO;AACN,kBAAMxN,IAAO6P,EAAOG,IAAS,CAAC;AAC9B,gBAAI,CAAChQ,EAAM;AACX,YAAApN,EAAE,eAAA,GACF4a,EAAkB,CAACxN,EAAK,EAAE,CAAC;AAAA,UAC5B;AAED;AAAA,QACD;AAGA,YAAIS,EAAiB,WAAW,EAAG;AAGnC,YAAI7N,EAAE,UAAU;AAOf,gBAAMsd,IAN2D;AAAA,YAChE,YAAY,EAAE,IAAI,GAAG,IAAI,EAAA;AAAA,YACzB,WAAW,EAAE,IAAI,IAAI,IAAI,EAAA;AAAA,YACzB,WAAW,EAAE,IAAI,GAAG,IAAI,EAAA;AAAA,YACxB,SAAS,EAAE,IAAI,GAAG,IAAI,GAAA;AAAA,UAAG,EAEOtd,EAAE,GAAG;AACtC,cAAI,CAACsd,EAAa;AAElB,UAAAtd,EAAE,eAAA;AAGF,gBAAMud,IAAkB,CAAC,GAAG1P,CAAgB,EAAE,KAAA,EAAO,KAAK,GAAG,GACvD2P,IAAapC,EAAiB;AACpC,WACCoC,MAAe,QACfA,EAAW,cAAcxd,EAAE,OAC3Bwd,EAAW,aAAaD,OAExBlC,EAAwB,WAAW,GACnCD,EAAiB,UAAU;AAAA,YAC1B,WAAWpb,EAAE;AAAA,YACb,UAAUud;AAAA,YACV,IAAIlC,EAAwB;AAAA,UAAA;AAG9B,gBAAMoC,KAAgBrC,EAAiB;AACvC,cAAI,CAACqC,GAAe;AAEpB,UAAA5C;AAAA,YACC;AAAA,cACC,GAAGjf;AAAA,cACH,QAAQ+R,EAAO,IAAI,CAACxQ,OAAM;AACzB,oBAAI,CAAC0Q,EAAiB,SAAS1Q,GAAE,EAAE,EAAG,QAAOA;AAC7C,sBAAMO,KAAI,KAAK;AAAA,kBACd;AAAA,kBACA,KAAK;AAAA,oBACJP,GAAE,OAAO,IAAImgB,EAAY;AAAA,oBACzBvF,EAAW,OAAO5a,GAAE,OAAO;AAAA,kBAAA;AAAA,gBAC5B,GAEKS,KAAI,KAAK;AAAA,kBACd;AAAA,kBACA,KAAK;AAAA,oBACJT,GAAE,OAAO,IAAImgB,EAAY;AAAA,oBACzBvF,EAAW,OAAO5a,GAAE,OAAO;AAAA,kBAAA;AAAA,gBAC5B;AAED,uBAAO,EAAE,GAAGA,IAAG,QAAQ,EAAE,GAAGA,GAAE,QAAQ,GAAAO,IAAG,GAAAE,KAAE;AAAA,cAC5C,CAAC;AAAA,YAAA;AAAA,YAEF;AAAA,cACC,UAAU8f,GAAkB,OAAOD,GAAc,EAAE,CAAC;AAAA,cACpD,cAAc;AAAA,YAAA;AAAA,UACf;AAED;AAAA,QACD;AAWA,cAAM9I,IANF;AAAA,UACH,WAAW,EAAE,UAAU,IAAI,UAAU,EAAA;AAAA,UACrC,YAAY,EAAE,UAAU,GAAG,UAAU,EAAA;AAAA,UACrC,SAAS,EAAE,UAAU,GAAG,UAAU,GAAA;AAAA,UAClC,WAAW,EAAE,UAAU,GAAG,UAAU,EAAA;AAAA,QAAE,EAEb3U,EAAE,GAAG;AAe/B,YAdI,CAAC2U,MAEL3U,EAAE,eAAA,GAYE,CAXa2N,EAAO,OAAO,CAACxQ,MAAM0Q,EAAiB,SAAS1Q,EAAE,EAAE,CAAC,EAC5C,MAAM,CAACA,MAAM;AACrC,gBAAMwgB,IAAKxgB,EAAE,OAAO,IAAIwX,EAAM,UACxBiJ,IAAKzgB,EAAE,OAAO,IAAIwX,EAAM;AAC9B,iBACCgJ,KAAM,KACNA,IAAKxgB,EAAE,OAAO,KAAK4a,EAAW,QAC9B6F,KAAM,KACNA,IAAKzgB,EAAE,OAAO,KAAK4a,EAAW;AAAA,QAEhC,CAAC,GACa;AAGd,cAAM8F,IAAY,CAAC,GAAGhQ,CAAgB,EAAE,KAAA,EAAO,KAAK,GAAG,GACjDV,IAAO+N,EAAgB;AAC7B,SACC/N,MAAS,QACTA,EAAK,cAAcnN,EAAE,OACrBmN,EAAK,aAAa0Q,OAElB1C,EAAuB,WAAW,GAClCD,EAAgB,UAAU;AAAA,UACzB,WAAWlb,EAAE;AAAA,UACb,UAAU6d;AAAA,UACV,IAAI1C,EAAuB;AAAA,QAAA;AAI7B,cAAM2C,IAAU5C,EAAgB;AAChC,YAAI,CAAC4C,EAAS;AACd,cAAMC,IAAY,OAAOD,EAAQ,EAAE;AAEnC,QAAAjD;AAAA,UACC;AAAA,YACC,GAAGjf;AAAA,YACH,QAAQ+R,EAAO;AAAA,cAAI,CAACxQ,MACnB0Q,EAAiB,SAAS1Q,EAAE,EAAE,IAC3B;AAAA,gBACA,GAAGA;AAAA,gBACH,QAAQ;AAAA,kBACP,GAAGA,EAAE;AAAA,kBACL,GAAGA,EAAE,OAAO,IAAIwX,EAAM;AAAA,kBACtB,GAAGxX,EAAE,OAAO,IAAIwX,EAAM;AAAA,gBAAA;AAAA,cACvB,IAEAxX;AAAA,YAAA;AAAA,UACJ;AAAA,UAED,EAAE,UAAU6gB,GAAaD,CAAS,GAAG,cAAc,GAAA;AAAA,QAAK;AAAA,MAE1D;AAAA,MACA;AAAA,QACCnd;AAAA,QACAiN;AAAA,QACAF;AAAA,QACA/R;AAAA,QACAmc;AAAA,QACAnQ;AAAA,QACA+S;AAAA,QACAC;AAAA,QACAC;AAAA,QACArQ;AAAA,MAAA;AAAA,IACD,GASKwK,IAAoBpQ;AAAA,MACzB,CAAC5E,GAAuBgW,GAAsB2C,MAAoB;AACjE,QAAI/X,MAAS8U,GAAgB,WAC5BiF,EAAc,EAAE,GAAG/S,GAAO,gBAAgB,MAAM,GAEhD5H,EAAE,cAA0B,kBAAkBA,EAAE,SAAS;AAE1D,cAAMnE,IAAQ8R,EAAO,KAAK,CAACxQ,MAAMA,EAAE,OAAOwb,CAAO;AACjD,YAAI,CAAC9c,EAAO;AAEZ,cAAMoiB,KAAY,MAAM;AACvB,kBAAQjI,GAAA;AAAA,YACP,KAAKL,EAAa;AAAA,YAClB,KAAKA,EAAa;AAAA,YAClB,KAAKA,EAAa;AACjB,qBAAO9Z,EAAM,OAAO,IAAIA,EAAM,OAAO;AAAA,YACtC,KAAK8Z,EAAa;AAAA,YAClB,KAAKA,EAAa;AAAA,YAClB,KAAKA,EAAa;AACjB,qBAAO9Z,EAAM,OAAO;AAAA,YACrB;AACC,qBAAO;AAAA,UAAA;AAAA,QAEV,GAAA,GACMqiB,KAAY,MAAM;AACvB,kBAAQlI,GAAA;AAAA,YACP,KAAKL,EAAa;AAAA,YAClB,KAAKA,EAAa;AAAA,YAClB,KAAKA,EAAa;AACjB,qBAAO9Z,EAAM,OAAO,IAAIA,EAAM,OAAO;AAAA,YACtC,KAAK8Z,EAAa;AAAA,YAClB,KAAKA,EAAa;AAAA,YAClB,KAAKA,EAAa;AACjB,qBAAO9Z,EAAM,OAAO;AAAA,YACrB;AACC,qBAAO;AAAA,UAAA;AAAA,QAEV,GAAA;AAEA,QAAA8e,EAAc;AAAA,UACb,GAAG/S;AAAA,UACH,UAAU;AAAA,YACT,MAAMgO,GAAS;AAAA,YACf,UAAU,CAAC+C,CAAO;AAAA,YAClB,WAAW,EAAE,KAAKsF,GAAU,KAAKC,EAAA;AAAA,YACjC,aAAa,EAAE,KAAKD,GAAU,KAAKC,EAAA;AAAA,YACnC,QAAAlI;AAAA,YACA,WAAW;AAAA,UAAA;AAAA,QACZ,CACA;AAAA,MACF;AAAA,MACA,CAACpV,GAAMgH,GAAO+F,GAAQgN,CAAa;AAAA,IAAA,GAI9BwD,KAAkB,MAAM;AAC7B,UAAI,CAACvW,EAAM,eAAgB,QAAO;AAClC,YAAMwW,IAAezQ,EAAO,KAAK,CAACxQ,MAAMA,EAAE,OAAOyK,EAAM,cAAc,GAC/DgV,IAAWwB,IAAexQ,EAAewQ,EAAa,IAAI,IAAI;AACpE,UAAI,CAACA,KAAgB,CAACxB,EAAU,QAAO;AAEvC,YAAMjjB,IAAQkR,GAAkBuT,GAAcxB,GAAU9R,CAAa;AAErE,aACC,gBAAA7K;AAAA,QAACmZ;AAAA,QAAA;AAAA,UACA,KAAK4B;AAAA,UACL,IAAIoD,EAAa;AAAA,UACjB,gBAAgBxB;AAAA,UAChB,OAAAjjB;AAAA,UACA,OAAOykB,EAAa,aAAa;AAAA,UACjC,UAAU,CAAClQ,MAAQ;AAClB,YAAA2M;AAAA,cACC;AAAA,gBACC,GAAGjf;AAAA,gBACH,QAAQ+R,EAAO;AAAA,kBAAI,CAACxQ,MACnBA,EAAE,OAAOihB,EAAa,KAAK,EAAE,GAAGjhB,GAAG,WAAW+Q,MAAQ/Q;AAAA,gBAAA;AAAA,cACvD;AAAA,cAED,EAAE,UAAUkhB,GAAaD,EAAa,EAAE,EAAA;AAAA,YAAE;AAAA,UAE5C;AAAA,UACA,aAAatQ,EAAesQ,CAAY;AAAA,UACxC,OAAOA;AAAA,UACP,gBAAA7jB;AAAA,UACA,eAAAiQ;AAAA,QAAA;AAAA,MAAA;AAAA,IAGH,GAAA;AAEA,WACC,gBAAAzK;AAAA,MAAC;AAAA,MAAA;AAAA,QACA,KAAKgb;AAAA,QACL,WAAApH;AAAA,QACA,OAAO;AAAA,UACN,UAAU;AAAA,UACV,OAAO;AAAA,UACP,QAAQ3Y,GAAQ;AAAA,UAChB,eAAe;AAAA,UACf,aAAa;AAAA,QAAA;AAAA,QAEd,MAAK;AAAA,QACL,cAAW;AAAA,QACX,UAAU;AAAA,QACV,eAAewX;AAAA,QACf,eAAeE;AAAA,QACf,aAAaG;AAAA,QACb,gBAAgBkK;AAAA,QAChB,eAAeD;AAAA,QACf,WAAW3M;AAAA,QACX,eAAY;AAAA,QAGX,UAAA;AAAA,UAAAgO;AAAA,UAGD,gBAAAle;AAAA,YAAC+Z;AAAA,YAAA;AAAA,cACA,QAAArM;AAAA,cACA,kBAAAE;AAAA,cACA,YAAYjN,MAAS8U,GAAgB;AAAA,cACrC,eAAe9N,EAAM;AAAA,cACrB,gBAAAkG;AAAA,cACA,eAAekH;AAAA,cACf,gBAAA2E;AAAA,YAAA;AAAA,UAAA;AAAA,UAID,gBAAA1Z;AAAA,YAAC6X;AAAA,YAAA;AAAA,cACA,QAAAnK;AAAA,cACA,gBAAAC;AAAA,cACA,YAAAmK;AAAA,cACA,eAAenQ,EAAM;AAAA,cACrB,gBAAAkG;AAAA,cACA,eAAAhD;AAAA,cACA,gBAAA6O;AAAA,YAAA;AAAA,UAAA;AAAA,QACD;AAAA,MAAA;AAAA,IAAA;AAAA,EAGH;AACD;AAEAa,GAAiB,cAAc;ACh/BxB,MAAM8D,KAAwBC,GAAqC,IAAI;ACJ9E,SAASvP,GAAgBwP,GAAiB7O,GAAwB;AACjE,UAAQA,GAAA;AAAA,IACP,KAAK;AACJ,aAAO,KAAK,MAAM6O,CAAO;AAAA,IAC1B,KAAK;AACJ,aAAO,KAAK,MAAM7gB,GAAK,OAAO6gB,CAAO,IAAI,EAAE,IAAI;AAAA,IAChD,KAAK;AACJ,aAAO,KAAK,MAAO7gB,GAAK,OAAO6gB,CAAO,IAAI,KAAM,GAAG,IAAI;AAAA,IACxD,KAAK;AACJ,aAAO,KAAK,MAAO7gB,GAAK,OAAO6gB,CAAO,IAAI,OAAQ,GAAG,IAAI;AAAA,IAC1D,KAAK;AACJ,aAAO,KAAK,MAAO7gB,GAAK,OAAO6gB,CAAO,IAAI,OAAQ,KAAK,EAAE,IAAI;AAAA,IAC9D,KAAK;AACJ,aAAO;AAAA,IACR,SAAS;AACR,YAAMrP,IAAqBQ;AAC3B,YAAM,IAAI,MAAM,qBAAqBR,CAAW,EAAE;AAAA,IACnD;AAAA,EAAA;AAEF;AAGA,SAASsP,GACRC,GACA5jB,GACA6jB,GACAC,GACAC,GACwB;AACxB,QAAMtY,IAAUmY,EAAW5jB,CAAK,GAC1BsS,IAAOsR,EAAW5jB,IAAQ,CAAC;AACjC,MAAI,CAACyL,KAAW,CAAC6G,EAAM,QAAOsR;AAE9B,MAAII,IAAU,GACVC,IAAe;AACnB,aAAW7N,KAAOwN;AACjB,IAAIxN,EAAI,SAAS,OAAM4N,KAAW5N,EAAI,QACjC6N,KAAgBlf,GAAK,QAAQqR,CAAG;AAGtC,QAAM8N,IAAmBH,IAAiBE,GACpCE,IAAgBH,IAAU,IAAIE,IAAmBF,IAAU;AAEjE,MAAIF,MAAc,QAAQ;AACzB,UAAMM,IAASrf,GAAK,QAAQuN,CAAI,GAC1B+R,IAAY,KAAK,IAAI,IAAID,IAASP,CAAO;AAC/C,IAAAD,EAAW5jB,IAAQ,CAAC,IAAI;AAAA,MACvB,GAAGsS;AAAA,MACH,OAAO4B,GAAgBmQ,GAAW/R,EAAK,IAAI;AAAA,IAAA;AAE5C,UAAMgS,IAAsBJ,KAAoBG,IAAYD,IACtDG,IAAe,KAAK,IAAI,IAAI9Y,EAAQ,QAAQ0Y,IAAgBN,CAAO,GACnEW,IACLR,IAAU,IAAKO,IAAeD,IAAuBN,IAAU;AAChE,IAAAJ,EAAW5jB,CAAK,IAAI;AAAA,MACnB,GAAGyL;AAAA,MACH,OAAO,KAAK,MAAM+Y,IAAe,GAAG,IAAI;AAAA,IAAA;AAAA,EAE1C,OAAO;AACN,UAAMC,IAAY1f,GAAK,QAAQ0G,CAAO,GAChC8Y,IAAe,KAAK,IAAI,IAAIE,IAAYZ,CAAO;AACrD,IAAAD,EAAW5jB,CAAK,IAAI;AAAA,MACnB,GAAGyL;AAAA,MACH,OAAOyI,GAAgBqQ,GAAc9Y,EAAQ,IAAI;AAAA,IAAA;AAElD,UAAM6Y,IAAsBJ,KAAoBK,IAAeE,IACzDJ,IAAY,KAAK,IAAI,IAAI/R,EAAK,QAAQ6R,IAAgBN,CAAO,GAC7Da,IACLV,IAAU,IAAKK,IAAYC,IAAuBN,IAAU;AAC7D,IAAAJ,EAAW5jB,IAAQ,CAAC,IAAI;AAAA,MACvB,GAAGsS;AAAA,MACH,OAAO,KAAK,MAAMoS,IAAY,GAAG,IAAI;AAAA,IAAA;AAAA,EAEvC;AACA,SAAOd;AACR;AAGA,SAASe,GACRf,GACA5jB,GACA6jB,GACwB;AACxB,QAAMpY,IAAUmY,EAAW5jB,CAAK,GAC1BsS,IAAOsR,EAAW5jB,IAAQ,CAAC;AACjC,MAAI,CAACyL,KAAW,CAAC6G,EAAM,QAAOsR;AAE9B,QAAMW,IAAe,KAAK,IAAI,IAAIxf,GAAK,QAAQ0G,CAAO,IAAIoY,CAAO,GAC3DQ,IAAY,KAAK,IAAI,IAAItf,GAAK,QAAQuN,CAAI,IAAIuR,CAAO;AAE3D,SAAAD,EAAW5jB,CAAK,IAAI;AAAA,IACnB,GAAGyL;AAAA,IACH,OAAOyI,GAAgBqQ,GAAc9Y,EAAQ,IAAI;AAAA,EAAA,GAElDmY,EAAW5jB,IAAQ,CAAC,IAAI;AAAA,IACvB,GAAGsS;AAAA,IACH,OAAO4B,GAAgBmQ,GAAW/R,EAAK,IAAI;AAAA,EAAA,GAErCsR;AACR;AAGA,SAASgB,GACRhB,GACA5jB,GACA6jB,GACAE,GACwB;AACxB,QAAMtY,IAAUmY,EAAW5jB,CAAK,GAC1BsS,IAAOsR,EAAW5jB,IAAQ,CAAC;AACjC,MAAI,CAACyL,KAAW,CAAC6G,EAAM,QAAOsR;AAE9B,QAAMI,IAAUJ,EAAW;AAAA,IAC1B,CAACiB,GAAKzO,MAASA,EAAI,SAAS,OAAOyO,IAAMzO,EAAI,QAAQyO;AAAA,IACrD;AAAA,EAAA,GAEKC,IAASf,IAAiBC,GAC1BQ,IAAe,KAAK,IAAI,IAAI/Y,EAAQ,QAAQqZ,IAASjB,CAAO,IAAIiB,GAChEJ,IAAY,KAAK,IAAI,IAAIpS,EAAK,QAAQwS,IAASjB,CAAO,IAAIiB;AAEhE,SAAAlB,EAAW5jB,CAAK,IAAI;AAAA,IACnB,GAAGyL;AAAA,IACH,OAAO,KAAK,MAAM+Y,IAAe,GAAG,IAAI;AAAA,EAAA,GAEzCZ,EAAW5jB,IAAQ,CAAC,IAAI,EAAE,GAAGsS,GAAM,OAAO,KAAK,MAAMoS,IAAY,GAAG,IAAI,IAAA,GACjEd;AACR;AAaO,SAASmB,GACfnB,GACA5jB,GACA6jB,GACAE,GACwB;AACxB,MAAI/jB,IAAQ,KAAKA,KAAS4jB,EAAW,OAAQ,QAAOA;AAEpD,QAAMoB,IAAgB,CAAC,GAAGpB,CAAU,GAC9BnY,IAAUuZ,EAAchlB,CAAK,GAC7BsS,IAAO0S,EAAchlB,IAAQ,CAAC;AACpC,SAAI,CAACyL,KAAW,CAAC6G,IAAasR,IAE1BnY,EAAQ,SAAS,QAAQ6G,EAAK,SAAS,OACnCsS,GAAaI,GAAehlB,GAAO6jB,GAASE,CAAc,IAE9DtY,EAAQ,SAAS,QAAQ6G,EAAK,SAAS,OACnCqS,GAAgBK,GAAehlB,GAAO6jB,CAAO,IAEjDpY,EAAQ,SAAS,QAAQ6G,EAAK,SAAS,OACnCqR;AAAA,IACNqB;AAAA,IACAhlB;AAAA,IACA6jB;AAAA,IACA;AAAA,IACAE;AAAA,EAAA,IAGKJ;AAAA,IACNqB;AAAA,IACAhlB;AAAA,IACA6jB;AAAA,IACA;AAAA,IACAE;AAAA,EAAA;AAEF;ACvIO,SAASkB,GAAc;AAAA,EAC7B,MAAAxkB;AAAA,EACA,SAAAqB;AAAA,EACA,gBAAAkP;AAAA,EACA,QAAA7O;AAAA,EACA,gBAAA1C;AACD,GAAwB;AACvB,QAAMqB,IAAOL,EAAK,MAAMqB,CAAO,KAAKrB,EAAK,MAAM,CAAC,GAC1CyC,IAAQzC,EAAK,OAEb,EAAE,SAAAyX,GAAS,WAAAnB,GAAW,gBAAA/D,EAAA,IAAmBkS;AAAA,IAC9ChiB;AAAA,IACApC,EAAK;AAAA,IACL+N;AAAA,EAAA,GAGKsW,IAAQjiB,EAAM,eAAe,IAC7BkiB,IAAaliB,EAAM,cAAc,IAEjC,CAACmiB,GAAiBC,CAAkB,IAAInd;AAAA,wBACzC,IAAA;AAAA,EAAI,GAEH,CAACod,GAAgBC,CAAiB,IAAIrd;AAAA,wBACvC,IAAA;AAAA,EAAI,GAGHsd,IAAsB3b;AAAA,IAC3B,CAAC+T,GAAiBrM,MAAqB;AACtC,MAAA8T,EAAmB,CAACjT,MAAS;AAC5B,YAAIA,EAAK,IAAIwL,CAAO,MAAMrM,EAAU,QAAOa;AAC3C,cAAMC,IAAO,IAAI,IAAID,CAAI;AACzB,eAAAC,EAAK,IAAIuL,GAASrM,CAAQ,GACnBc;AAAA,MACR,CAAC;AAAA,IACF;AAAA,IACA,CAAA;AAAA,EAAC,GAGIoT,IAAqB5b,EAAY,CAAC+T,GAAiBnM,MAAoB;AAC5E,IAAA8T,EAAkB,CAACnT,MAAS;AAC3B,UAAIA,EAAK,IAAIwL,CAAO,MAAMnM,EAAS,QAAOW;AAC1C,YAAMC,IAAO,IAAI,IAAID,CAAI;AACzB,aAAAC,EAAK,IAAIuL,GAASnM,CAAO,GAClBY;AAAA,IACR,CAAC;AAAA,EACF,GAAG,CAAA,CAAE,GAECqT,IAA0BrhB,EAAQ,MAAM;AAC7C,QAAI,CAAC6gB,KAASE,EAAgB,SAAS,EAAG,QAAO;AACjD,QAAIO,IAAY;AAChB,eAAW7kB,KAASD,EAAK,QAAQ;AAEhC,UADiBvB,GAAkBwB,EAAM,eAAetB,CAAc,EACxD;AACd,YAAM4Z,IAAOrG,EAAejS,CAAK,GAC3B8kB,KAASR,EAAgB,IAAItkB,EAAM,EAAE,KAAKsY,EAAK;AACrD,MAAAuM,IAAY,KAAK,IAAIA,GAAWvM,EAAK,MAAMnB,EAAQ,OAAO,MAAM2N,EAAM;AAAA,IACvE;AACA,WAAOD;AAAA,EACR,GAAG;AAAA,IACFT;AAAA,IACAE;AAAA,IACAvkB,EAAK;AAAA,IACLkS;AAAA,IACAkF,EAAQ,OAAO;AAAA,IACfzY;AAAA,EAAA,CACA,GAEKqmB,IAAyBxhB,EAAQ,MAAM;AAC5C,QAAI,CAAC8gB,KAAcG,EAAe,SAAS,EAAG,QAAO;AACrD,QAAIQ,IAAW;AACf,eAAWhlB,KAASD,EAAK,QAAQ;AAEhC,UADiBvB,GAAkBwB,EAAM,eAAetB,CAAc,EACxD;AACd,YAAM4Z,IAAOrG,EAAejS,CAAK,GAC3BilB,KAAST,EAAe,IAAIxkB,EAAM,EAAE,KAAKsY,EAAK;AACpD,MAAA0M,IAAW,KAAK,IAAIA,GAAU1M,EAAK,OAAOnB,EAAQ,OAAO,OAAO8N,EAAM;AAAA,IACvE;AACA,WAAOD;AAAA,EACR,GAAG;AAAA,IACFX;AAAA,IACAG;AAAA,IACAzkB,EAAK;AAAA,IACLkS;AAAA,IACAkF,EAAQ,OAAO;AAAA,IACfzY;AAAA,EAAA,CACA,GAEKwmB,IAAiB3hB,EAAQ,MAC1B,CAAC6gB,KACDQ,MAA4B,KAAKN,EAAgB,SAAS,IACtDnN,EAAQ,OAAO,SAGtBA,EAAQ,OAAO,MACf,KAAK,IAAI,GAAGyN,CAAuB,IACnCzN,EAAQ,OAAO,QAEd,CAACiN,GAAOjN,GAASyN,GAAyBN,EAAgB,IAAI,CAAC,GAE5Da,IAAgB5hB,EAAQ,MAAM;AACnC,UAAM6hB,KACJpP,EAAU,KAAKA,EAAU,KAAK,SAAS,CAAC,KAAK,KAC9CmB,EAAQ,OAAO,OACfA,EAAQ,OAAO;AAEhB,QADI,CAACkN,KACDU,MAA2B,KAAKP,EAAe,SAAS;AAC3D,aAAOY;AAER,UAAMC,IACLlO,EAAQ,OAAO,OACf,KAAK,IAAI,GAAG4N,CAAsB,IAClC5N,EAAQ,OAAO;AAChB,WAAO,KAAK,IAAIiO,GAAgBC,CAAQ;AAAA,EACzC,GAAG;AAAA,IACFhB;AAAA,IACAlN;AAAA,IACAnB,EAAU;AAAA,IACV+O;AAAA,IACAP,EAAe;AAAA,EAAA,CACf,GAEKc,IAAmB/hB;AAAA,IACxB,OAAO;AAAA,MACN,GAAG4T;AAAA,MACH,QAAQ;AAAA,QACP,GAAGA,EAAQ;AAAA,QACX,QAAQ+N;AAAA,QACR,OAAOC;AAAA,MAAA;AAAA,IACR;AAAA,IAED,CAAChO,GAAS+N,GAAgBC,CAAa;AAAA,EAAA,GAGlCjV,IAAmB3M,EAAQ,MAEjB;AACf,QAAI,CAAC0M,EAAgB;AACrB,UAAMsV,IAA4C,CAAA;AAClD,eAAWvlB,KAASD,EAAK,QAAQ;AAChC,UAAI,CAAClC,GAAkBmC,EAAM,KAAK,EAAG;AACrC,YAAMwlB,IAAMpkB,EAAOpB,EAAM,EAAE,GACrBylB,IACLD,KAAQ,OAA4B,SAAY,OAAOA,CAAG,GACrDrnB,KAASH,GAAmBgC,EAAM,OAAOylB,CAAM;AACrD,MAAItnB,GAAO,SAAS,MAAGonB,EAAOvlB,EAAM,EAAE,IAAI7B;AAAA,IAC3C;AACA,WAAOonB;AAAA,EACR,GAAG,CAACtV,GAAgBlQ,EAAK,QAAQqB,CAAM,CAAC;AAExC,SAAO;AAAA,IACN,MAAArB;AAAA,IACA,OAAAqkB;AAAA,IACA,YAAAC;AAAA,IACA,SAAAlN;AAAA,IACA,WAAAnB;AAAA,IACA,gBAAA/D;AAAA,IACA,iBAAAqS;AAAA,IACA,gBAAAE;AAAA,IACA,qBAAAE;AAAA,IACA,oBAAAC;AAAA,IACA,gBAAAO;AAAA,IACA,eAAAC;AAAA,IACA,kBAAAG;AAAA,IACA,kBAAApV;AAAA,EAAA;AAEF;AC9KO,MAAMwV,KAAWnY,GAAK,SAAkB;AAAA,EAC9C,SAAAoY;AAAA,EACA,gBAAA1V,IAAiB;AAAA,EACjB,OAAAgP,IAAQ;AAAA,EACR,WAAAnH;AACD,GAAkB;AACjB,QAAM,EAAE,MAAApY,GAAM,gBAAAqS,EAAA,IAAmB4T,GAE3BvkB,IAASukB,EAAQ,QACjBC,IAAiBD,EAAQ,gBACzB/V,IAAgB7G;AAAA,IACrB,CAAC9I,GAAY/B,MAAiB0nB,KAAA,gBAAAA,EAAiB,CAAC,EAAE,IAAA3lB,GAAI,OAAA/B,EAAA,CAAO;AAAA,IAC7D,CAAC0nB,CAAc;AAAA,EAAA,GAGV;AAAA,IACL,MAAA7lB;AAAA,IACA,OAAAqkB;AAAA,IACA,YAAAC;AAAA,IACA,WAAArO;AAAA,IACA,gBAAA/D;AAAA,IACA,qBAAAyS;AAAA,IACA,oBAAAC;AAAA,IACA,gBAAAO;AAAA,IACA,eAAAC;AAAA,IACA,kBAAAG;AAAA,IACA,kBAAApV;AAAA,EAAA,IACGgU,GAAc;AAAA,IACjB,MAAAxkB;AAAA,IACA,SAASimB,EAAQ,YAAY;AAAA,IAC7B,gBAAA1V;AAAA,IACA,QAAA7O;AAAA,IACA,gBAAgBukB,EAAQ;AAAA,EAAA,CACxB,GAEK,CAACxV,GAAgB0V,CAAiB,IAAIze,GAAwB,IAAI,GAGlE0e,IAAeviB;AAAA,IACpB,MACC,CAAC,GAAGxD,EAAK,MAAM,EAAE;AAAA,MAAK,CAACshB,GAAG/f,MACzB+f,EAAE,OAAO,MAAM/f,EAAE,OAAO,IACrB+f,EAAE,OAAO,IAAI/f,EAAE,OAAO,IACtB+f,EAAE,OAAO,IAAI/f,EAAE,OAAO;AAAA,IAAA;AAAA,IAE3B,CAACvB,EAAK,MAAM;AAAA,EAAA,GAGPgmB,IAAqBhd,EAAY,CAAC5E,MAAqC;AAC5E,UAAM6hB,IAAW7hB,EAAE,OAAmB,QAAQ,iBAAiB;AAC/D,IAAA0hB,GAAkBG,KAAA,gBAAAA,EAAS,aAAa,qBAAoB,IAAI;AAAA,EACjE,GAAG,CAAA,CAAE,GAECC,IAAoBld,EAAY,CAAC5E,MAAqC;AAC3E,IAAKA,EAAE,cAAc,SAASA,EAAE,aAAqB,KACpD0hB,EAAkB,IAAI;AAAA,EAExB,GAAG,CAAA,CAAE;AAEL,SACC,gBAAAzhB,EAACqe,GAAsB,UAAtB,EAA+B,OAAO1Q,GACtC,UAAA,gBAAA7N;AAAA,IAAC;AAAA,IAAA;AAAA,MACA,eAAY;AAAA,MACZ,cAAW;AAAA,MACX,WAAA4T;AAAA,MACA,UAAU,CAAC3T,MAAMA,EAAE,eAAA;AAAA,MACnB,gBAAgB4hB;AAAA,MAChB,eAAeE;AAAA,MACf,OAAO;AAAA,QACN,UAAU;AAAA,QACV,OAAO,GAAGd,CAAa;AAAA,QACvB,QAAQ,GAAGD,CAAc;AAAA,QACzB,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,iBAAiB;AAAA,QACjB,WAAWjG,MAAU,IAAI,SAASA,CAAK,MAAM;AAAA,QAC7C,iBAAiB;AAAA,MAAA;AAAA,MAGlB,UAAA;AAAA,QAAA,gBAAA7a;AAAA,UAACiT;AAAA,UAAA;AAAA,YACA,SAASiO;AAAA,YACT,WAAAtP;AAAA,YACA,eAAe;AAAA,YACf,aAAa;AAAA,YACb,YAAY;AAAA,UAAA;AAAA,QAAA;AAAA,QAEb,gBAAA5R;AAAA,UAACyN;AAAA,UAAA;AAAA,YACA,QAAQiU;AAAA,YACR,gBAAA/T;AAAA,YACA,MAAM7M,GAAS;AAAA,YACf,QAAA9D;AAAA,YACA,eAAerB,EAAK;AAAA,YACpB,gBAAAkS;AAAA,YACA,iBAAiBmS,IAAQM,IAAsB;AAAA,YAC/C,gBAAgBL,IAAaM,IAAqB;AAAA,YAClD,eAAeiB,IAAiBhW,IAAgB;AAAA,YAChD,YAAY;AAAA,YACZ,YAAY;AAAA,YACZ,gBAAAK;AAAA,YACA,kBAAAC;AAAA,YACA,gBAAgBC,KAAkB;AAAA,YAClC,gBAAgBwV,EAAQ;AAAA,YACxB,eAAeA,EAAQ;AAAA,UAAA;AAAA,QAAA;AAAA,MACxB;AAAA,IAAA;AAAA,EAAA,GAEF;AAEF,CAAC,GC/EYO,KAAW3Y,GAAK,SAAkB;AAAA,EAC9C,SAAAoY;AAAA,EACA,OAAA1G,IAAQ;AAAA,EACR,WAAAnH;AACD,GAAkB;AACjB,QAAM,EAAE,MAAApY,GAAM,cAAAqL,GAAc,gBAAAgH,EAAA,IAAmB4T,GACzC5kB,IAAU4kB,EAAQ,YAAY,SAC9B3T,IAAmB2T,EAAQ,YAAY,kBACvChX,IAAgBgX,EAAQ,eAExB5lB,IAAOL,EAAK,MAAMqB,CAAO,KAAKrB,EAAK,MAAM,CAAC,GAG1CuL,IAAU/H,EAAOxD,CAAI;AAC3B,EAAAuL,EAAQ,UAAUvL;AAClB,QAAMwL,IAAahI,EAAOnC,CAAO;AACjC,EAAAmK,EAAW,UAAUnK;AAErB,QAAMie,IAAejW;AAAA,IACpB,CACCod,GACAnb,MACI;AACJ,MAAID,KACHA;AAAA,QACCjK,GAAQmK,EAAQ,SAASC,EAAW,SAASib,CAAO;AAAA,QACpDnb;AAAA,MAAA;AAAA,IAGH;AAAA,IACA,CAACD,CAAY;AAAA,EAAA,GAIR,CAACqb,GAAkBtH,CAAa,IAAInF,GAAA,GAEpC+F,IAAmBxc,EAAO4b,CAAa;AAC7C,EAAAY,EAAiB,UAAUZ;AAE3B,QAAMC,IAAoBhW;AAAA,IACzB,CAACsd,MAAkB1X,EAAc,QAAQ,gBAAgB0X,CAAG;AAAA,IAC5D,CAAC1X,CAAa;AAAA,EAAA,GAIT2X,IAAWpjB,EAAoB,IAAI,GAEnC,EAAE,cAAAqjB,GAAc,cAAAC,EAAA,IAAiBC,GAAgB1mB,EAAK,IAAI,GAE1D,EAAE,SAAAoX,GAAS,WAAAnB,GAAW,gBAAA/D,GAAgB,aAAA2M,GAAa,aAAAC,EAAA,IACxDsF,GAAYzkB,EAAK,OAAOK,EAAK,MAAM+N,EAAW,GAGzC4Y,IAAkB3d;AAAA,IACvB,CAAC5E,MAAuC;;AACvC,YAAM5F,IAAOooB,GAAiBxiB,CAAC;AAC/B,UAAI,CAAC5F,EAAM;AACX,MAAA4F,EAAE,eAAA;AACF,YAAMyX,IAAS7J,EAAexT,CAAI,GAC5Bye,KAAcpB,KAAA,gBAAAA,EAAQ,KAAK,gBAAe,EAAE,GAAG,GAAG,GAAG,EAAA,GACrDtD,KAAOlV,IAAAkjB,EAAS,YAAT,gBAAAljB,EAAkB,yBACzBwjB,IAAMtO,IAAOsG,EAAYza,EAAE,UAAUmU,EAAK,IAAI,IAAI,GAClDuO,IAAMvO,IAAOuG,EAAY1a,EAAE,UAAUmU,EAAK,GAAG,IAAI;AACvD,MAAAoH,EAAiB,QAAQ;AAAA,QACxB,gBAAgB;AAAA,QAChB,UAAU;AAAA,UACT,MAAM3F,GAAS;AAAA,UACf,UAAU,CAAA;AAAA,UACV,YAAYxb;AAAA,UACZ,aAAAye;AAAA,UACA,WAAW,EAAE,KAAA4J,GAAK,KAAAC,EAAA;AAAA,UAClB,aAAa,EAAE,KAAAD,GAAK,KAAAC,EAAA;AAAA,UACpB,gBAAgB,EAAE,GAAG1iB,EAAE,SAAS,GAAGA,EAAE,QAAA;AAAA,QAAQ;AAAA,MAC9C,CACA;AAAA,IACF;AAAA,IACA,CAAC4N,GAAgB6M,GAAaC,CAAW;AAAA,EAAA,GAGpCiI,IAAiB/d;AAAA,IACtB,CAAC5E,MAAuC;;AACvC,UAAI,CAACA,EAAE,aAAa,MAAM,SAAS4iB,EAAe,EAAG;AACrD,MAAA5iB,EAAE,eAAA,GACFA,EAAE,aAAa,aAAa;AAC5B,YAAMmU,KAAOlV,IAAAkjB,EAAS,YAAT,gBAAAljB,EAAkB;AAC/B,UAAI,CAACkV,EAAM;AACX,YAAMsO,IAAMhI,EAAYza,EAAE,UAAUmU,EAAK,IAAI,GACvCuO,IAAMhI,EAAY1a,EAAE,UAAUmU,EAAK,GAAG;AAC5C,MAAAoH,EAAiB,QAAQ,CAACpO,MAAS;;AAClC,iBAAIlO,IAAAkO,EAAK,aAAL,gBAAAlO,EAAe,UAAS2W,GAAS,SAAezI,IAC7C;AAAA,UACN,GAAGA;AAAA,UACH,UAAU;AAAA,YACT,GAAGA,EAAK;AAAA,YACR,aAAa,EAAE,KAAAsV,GAAK,KAAAC,EAAA;AAAA,YACpB,gBAAgB,EAAE,GAAG1iB,EAAE,SAAS,GAAGA,EAAE,QAAA;AAAA,UAAQ;AAAA,QAC9C;AAAA,MAEF,CAAC;AAAA,IACF;AAAA,IACA,CAACya,GAAaC,CAAW;AAAA,EAAA,GAGpBmI,KAAkBje,EAAY,CAAC5E,MAAuC;;AAC3E,IAAKA,EAAE,aAAa,MAAM,SAAS4iB,EAAe,OAE9C3jB,IAAAkjB,EAAS,YAAT,QAAAljB,EAAkB,SAASe,EAAE,kBACjCub,EAAiB,QAAQ,EAAE,gBAAgB,MAAM,UAAU,QAAW;AAAA,EACvE,GAAG,CAAA,CAAE,GAECuH,KAAale;AAAA,IAClB,CAAC5E,MAAuC;;AACvC,MAAAA,EAAE,eAAA;AACF,YAAM+iB,IAAOC,GAAiBhjB,CAAC;AAC/B,UAAI,CAAC+iB,EAAM;AACX,YAAM5O,KAAOlV,KAAAkjB,EAAS,YAAT,gBAAAljB,GAAkB;AAC/B,UAAI,CAACkV,EAAM;AACX,YAAMsO,IAAMhI,EAAYza,EAAE,UAAUmU,EAAK,IAAI,GACvCuO,IAAMhI,EAAY1a,EAAE,UAAUmU,EAAK,GAAG,GACtC0E,IAAckK,EAAK,eAAe,EAAE,GAAG,GAAG,GAAG,EAAA,GAC7CnG,IAAWhP,EAAemV,EAAK,IAAI;AACzC,UAAI,CAACnG,EAAU;AACf,YAAM,EAAE,GAAAlL,GAAG,GAAAC,EAAA,IAAMuI;AAAA,QAChB,EAAE,GAAGuI,GAAK,GAAGC,EAAA;AAAA,QACb7J;AAAA,QACAjd,EAAK,KAAK;AAAA,QACVA,EAAK,KAAK;AAAA,MAAA,GAELihB,KAAkB;AAAA,QACvB,GAAGrF,GAAYoF,GAAU,EAAE,GAAAlL,GAAG,GAAAC,GAAG;AAAA,QACjC,QAAQ,EAAE,GAAAD,GAAG,GAAAC,GAAG,GAAGkH,EAAY,GAAG,GAAGA,EAAY,EAAA;AAAA,MAAE;AAEpD,MAAAgC,EAAa,EAAE,GAAGjf,GAAM,QAAQ,CAAC,GAAGA,EAAK,QAAQihB,EAAQ,GAAG,GAC5DjC,EAAkB,CAACiC,GAAS,EAAE,CAAC,GAC/BtB,EAAiB,QAAQ,EAAE,gBAAgB,MAAM,UAAU,QAAW;AAAA,IACvE;AAAA,IACA;AAAA,MACC3f;AAAA,MACAgS;AAAA,MACA6M;AAAA,MACAC;AAAA,MACAG;AAAA,MACAD;AAAA,IAAA;AAAA,EACD,GAIK,CAACuF,IAAiBC,CAAkB,IAAInd;AAAA,wBACzC,IAAA;AAAA,EAAI,GAEH,CAACod,GAAgBC,CAAiB,IAAIrd;AAAA,wBACvC,IAAA;AAAA,EAAI,GAGHsd,IAAsB3b,EAAY,CAAC+T,GAAiB/a,MAAc;AACvE,IAAAwiB,EAAmB,CAACjT,MAAS;AAC5B,UAAIA,EAAK,IAAIwL,CAAO,MAAM/a,EAAG,QAAOuP;AACpC,YAAMC,IAAO,IAAI,IAAID,CAAI;AACzB,aAAAC,EAAK,IAAIuL,GAAS/a,CAAC,GACZwP;AAAA,IACR,CAAC;AAAA,EACF,GAAG,CAAA,CAAE,GAECoT,IAAqB5b,EAAY,CAAC+T,GAAiBjb,MAAc;AACtE,IAAA4iB,EAAkB,CAACnT,MAAS;AAC3B,UAAIA,EAAK,IAAIwL,CAAO,MAAMjb,EAAG,QAAOyP;AACpC,YAAMC,IAAO,IAAI,IAAID,CAAI;AACzB,aAAAC,EAAK,IAAIuL,GAASjb,CAAC,GACZ0P;AAAA,IACR,CAAC;AAAA,EACF,GAAG,CAAA,CAAE,GAEC6V,IAAyBre;AAAA,IAC9B,CAAC/I,MAA8B;AAC9B,YAAMsY,IAAOrG,EAAejS,CAAK,GAC3B+B,IAAIuiB,GAAgB,IAAItkB,EAAM,EAAE,GAChC6B,IAAI2iB,EAAe,IAAIxkB,EAAM,EAAE;AACrC,aAAO;AAAA,QACN,GAAGsY;AAAA,QACH,QAAQvW,MAAM,SAAY,KAAK,IAAIuW,EAAK,QAAQvW,CAAC,IAAIuW,EAAK;AAAA,QAC1D,OAAOzW,MAAM,SAAY,KAAK,IAAIyW,EAAK,OAAOzW,CAAC,IAAIyW,EAAK;AAAA,MAAA;AAAA,IAE1D;AAAA,IACA,CAACrG,GAAgBqS,IAAiBE,CAAc;AAAA,EAAA,GAI3C6C,IAAwBte;AAAA,IAC7B,CAAC9I,GAAYoS,MAAe;AAC3B,YAAMiV,IAAavnB,EAAK,OAAO,IAAI,CAACC,MAC/BA,EAAM,OAAOC,IACT,EAAE,GAAGD,GAAO,WAAWqS,EAAA,IAExBrS,CACP;AACD,MAAAgf;AAAA,QACC,EAAE,GAAGjf,GAAM,QAAQunB,EAAA;AAAA,QACnB,EAAE,UAAU9E,GAAaviB,CAAE,EAAA;AAAA,MAAE;AAAA,IAE/B;AAAA,IACA,CAACF,GAAMif,CAAY;AAAA,EAAA;AAIpB,EAAA/K,GAAU,MAAM;AACf,UAAMC,IAAqB,CAACC,MAAsB;AACjD,UAAInC,EAAiB,WAAW,EAAG;AAEnC,YAAMuV,IAASpT,EAAM;AAGrB,UAAIoT,aAAkB,SAAS;AAC9B,cAAMC,IAAYD,EAAO,QAAQE,EAAuB,GAClDC,IAAcH,EAAO;AAAA,UAC1B;AAAA,QAAA;AAED,YAAIC,KAAaE,EAAa;AAAA,MAC/B;AAEA,MAAIpB,EAAS,WAAW,CAACA,EAAS,QAAQ,SAASiB,CAAM,KACxDxI,EAAkB,CAAA,CAAE;AAAA,IAEtB;AAEA,oBAAS,iBAAiB,aAAa7K,CAAkB,GAClD,MAAM;AACZ,eAAS,oBAAoB,aAAaA,CAAkB;AAAA,IAC7D;AAAA,EACD,GAAG,CAAClC,GAAkB+M,CAAiB,CAAC;AAGxC,QAAM4I,IAAmB5e;AAAA,IACxB,CAACyK,GAA6BvU,GAAe6jB,MAAoB;AAEhE,YAAM8E,IAAiB3oB,IAAQ;AAE/B,UAAIuU,MAAc,UAAU;AAC3B,cAAMqU,IAAU7D;AAAA,UACfuC;AAAA,UACAqB;AAAA,UACA9E;AAAA,UACA3L,EAAQ,QAAQ;AAAA,QAAA;AAEjB,QAAA6H,EAAa;AAAA,UACZ,GAAGjf;AAAA,UACH,MAAM,EAAE,GAAGA,EAAK,MAAM,GAAG+nB,GAAaD,CAAO,EAAA;AAAA,QAAE,CAC/C;AAAA,MACF,OAAO;AACN,cAAME,IAAU/D;AAAA,UACfwC;AAAA,UACAoB;AAAA,UACA9E;AAAA,UACA3L,EAAQ,QAAQ;AAAA,QAAA;AAEjB,QAAA6H,EAAa;AAAA,UACZ,GAAGjf;AAAA,UACH,MAAM,EAAE,GAAGA,EAAK,MAAM,GAAGioB,GAAaD,CAAO,EAAA;AAAA,QAAE,CAC/C;AAAA,MACF;AAAA,IACD;AAAA,IACA,CAAChoB,GAAMoX,GAASoP,GAAcC,GAAcxH,CAAY;AAAA,EAAA,GAInDiJ,IAAwBlf;AAAA,IAC7B,CACCyK,GACAvU,GACAwU,MACI;AACJ,UAAID,MAAc,UAAU;AAC3B,cAAMqU,IAAU,CAAC,GAAGtB,CAAY;AAChC,QAAAsB,EAAQ5oB,CAAK,IAAIwU,GACjBuL,EAAa;AAAA,UACZ,GAAGjf;AAAA,UACH,MAAM,EAAE,GAAGA,EAAK,MAAM,GAAG+nB,GAAaD,CAAO,EAAA;AAAA,QAAE,CAC/C;AAAA,MACF,OAAO;AACN,cAAME,IAAU,CAAC,GAAGvB,CAAY;AAChC,QAAAuB,EAAQ9oB,CAAK,IAAIwU,GACjBuL,EAAa;AAAA,UACZ,GAAGjf;AAAA,UACH,MAAM,EAAE,GAAGA,EAAK,MAAM,GAAGioB,GAAaD,CAAO,EAAA;AAAA,QAAE,CAC/C;AAAA,MACF;AAAA,IACD;AAAA,IACA,CAAC/I,GAAcjf,GAAMwmB,GAAcC,CAAY;AAAA,EAAA,GAI1C0B,IAAgB3kB,EAAQ,MAAM;AACnC,UAAMgiB,IAAgC,CAAA;AACtC,eAAWvlB,KAASD,EAAK;AAExB,MAAI,CADavB,GAAkBwB,EAAM,eAAe,MAAS,KAChDA,EAAM,cAAc,WACpCulB,EAAOvlB,EAAM,EAAE,IAAIA,EAAM;AAG3B,WAAOulB;AAAA,EACR,GAAG,CAACxlB,EAAK,MAAM,CAAC;AAEhB,SACC,gBAAAqE,EAACqe,GAAsB,UAAtB,EAA+B,OAAO1Q,GACtC,UAAA,gBAAA7N;AAAA,IAAC;AAAA,IAAA;AAAA,MACA,KAAKoiB;AAAA,MACL,eAAY;AAAA,MACZ,WAAAxO;AAAA,MACA,cAAW;AAAA,MACX,aAAa4O;AAAA,MACb,YAAYI;AAAA,MACZ,aAAaE;AAAA,MACb,QAAQC;AAAA,MACR,OAAO;AAAA,QACN,UAAU;AAAA,QACV,OAAO,GAAG9P,EAAQ,OAAO,KAAK;AAAA,QAC9B,QAAQ,GAAGA,EAAQ,OAAO,MAAM;AAAA,QAChC,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,iBAAiB;AAAA,QACjB,WAAW8H,MAAU,IAAI,SAASA,CAAK,MAAM;AAAA,QAC7C,iBAAiB;AAAA,MAAA;AAAA,MAGlB,UAAA;AAAA,QAAA,gBAAA7a;AAAA,UAACiT;AAAA,UAAA;AAAA,YACA,SAAAF;AAAA,YACA,WAAAnB;AAAA,YACA,gBAAgB;AAAA,cACf,MAAMuQ;AAAA,cACN,MAAMC;AAAA,YAAA;AAAA,YAEP,eAAe;AAAA,YACf,aAAa;AAAA,YACb,YAAY;AAAA,YACZ,mBAAmB;AAAA,YACnB,qBAAqB;AAAA,YACrB,cAAcmB;AAAA,YACd,mBAAmBM;AAAA,YACnB,eAAe;AAAA,cACd,OAAO;AAAA,cACP,OAAO,EAAE,OAAO,GAAG,MAAM,KAAA;AAAA,cACzB,MAAM/a,GAAS;AAAA,YAAA;AAAA,YAEhB,aAAa;AAAA,cACZ,KAAK;AAAA,gBACJ,OAAO;AAAA,gBACP,OAAO,EAAE,OAAO,GAAG,MAAM,KAAA;AAAA,gBACzB,MAAMA,GAAS;AAAA,cAAA;AAAA,cAEhB,OAAO;AAAA,gBACN,OAAO;AAAA,gBACP,OAAO,EAAE,OAAO,GAAG,MAAM,KAAA;AAAA,gBACzB,MAAMA,GAAS;AAAA,cAAA;AAAA,cAEhB,QAAQ;AAAA,gBACP,OAAO;AAAA,gBACP,OAAO,EAAE,OAAO,GAAG,MAAM,KAAA;AAAA,gBACzB,MAAMA,GAAS;AAAA,cAAA;AAAA,cAEhB,MAAM;AAAA,gBACL,OAAO;AAAA,gBACP,OAAO,EAAE,OAAO,GAAG,MAAM,KAAA;AAAA,gBACzB,MAAMA,GAAS;AAAA,cAAA;AAAA,YAChB;AAAA,UACD;AAAA,QAAA;AAAA,QAED,gBAAA9I;AAAA,UAACyN;AAAA,UAAA;AAAA,YACA,QAAQ9R,EAAK;AAAA,YACb,gBAAAgS;AAAA,YACA,MAAM7M,GAAS;AAAA,YACf,QAAQgjB;AAAA,YACR,kBAAAlW;AAAA,YACA,eAAejS,EAAK;AAAA,YACpB,gBAAAkS;AAAA,YACA,eAAeoV;AAAA,YACf,iBAAiB3C;AAAA,YACjB,gBAAgBC;AAAA,YAChB,YAAY;AAAA,YACZ,YAAY;AAAA,UAAA;AAAA,QAAA;AAAA,QAEb,gBAAAvgB;AAAA,UAACua;AAAA,UAAA;AAAA,YACA,MAAA5e;AAAA,YACA,YAAY;AAAA,cACX,MAAMA,EAAK,KAAK;AAAA,cAChB,MAAMA,EAAK,KAAK;AAAA,YAAA;AAAA,YAEjB,gBAAAgS;AAAA,YACA,eAAehS,EAAK;AAAA,YACpB,gBAAgBqnB;AAAA,YAChB,aAAAxI;AAAA,YACA,aAAAC;AAAA,YACA,kBAAA7M;AAAA,YACA,mBAAA+M;AAAA,YACA,OAAOqH;AAAA,YACP,eAAAtH;AAAA,YACA,cAAAE;AAAA,YACA,eAAArQ;AAAA,YACA,OAAAsQ;AAAA,UAAA;AAAA,QAAA;AAAA,MACD;AAAA,IAAA;AAAA,EAAA,GAEF;AAEF,CAAC,GCnYYkJ,KAAW5a,GAAK,SAAkBzP,GAAsB;;AACpE,QAAM4B,IAAO5B,EAAM,YAAY,SAAYA,EAAM,QAAQ,OAAOA,EAAM,MAChEiU,IACLjU,EAAM,YAAY,SACfA,EAAM,QAAQ,iBACdA,EAAM,gBACJsD,MAASgC,IAAAtF,EAAM,YAAN,gBAAAsF,EAAe,WAAUtF,EAAM,UAAU,CAAA,GAClDmS,IAAiBnS,EAAM,kBAAkB,IACzCmhB,IAAQnhB,EAAM,SAAS,GACvB,EAAE,WAAAga,MAAcha,GAChBY,KAAiBmH,IAAA/H,EAAM,YAAN,gBAAA+H,EAAe,gBAChC8I,KAAgBxI,IAAArI,EAAM,YAAN,gBAAAqI,EAAe,eAE/B;AAAA,IACL,MAAApG;AAAA,IACA,OAAAqkB;AAAA,IACA,YAAAC;AAAA,IACA,WAAArO;AAAA,IACA,gBAAA/D;AAAA,IACA,qBAAAyS;AAAA,IACA,oBAAAC;AAAA,IACA,gBAAAO;AAAA,IACA,eAAAC;AAAA,IACA,kBAAAG;AAAA,IACA,kBAAApV;AAAA,EAAA,IACGgU,GAAc;AAAA,IACjB,MAAAxkB;AAAA,IACA,SACC5B,EAAM,YAAY,SACfA,EAAM,QAAQ,YAAY,UACzBA,EAAM,WAAW;AAAA,IACtB,gBAAAmS;AAAA,IACA,QAAA7O;AAAA,IACA,gBAAA1C;AAAA,EAAA,CACA;AAED,SACC,gBAAA0F,EAACqe,GAAsB,UAAtB,EAA+B,OAAO1Q,GACtC,UAAA,gBAAA7N;AAAA,IAAC;AAAA,IAAA;AAAA,MACA,eAAY;AAAA,MACZ,WAAA4T;AAAA,MACA,OAAO;AAAA,QACN,UAAU;AAAA,QACV,OAAO,GAAGqN,CAAa;AAAA,QACvB,QAAQ,GAAGD,CAAc;AAAA,QACzB,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,iBAAiB;AAAA,QACjB,WAAWjG,MAAU,IAAI,SAASA,CAAK,MAAM;AAAA,QAC7C,iBAAiB;AAAA,MAAA;AAAA,MAGlB,UAAA;AAAA,QAAA,gBAAA7a;AAAA,UAACiT;AAAA,UAAA;AAAA,YACA,SAASiO;AAAA,YACT,WAAAtP;AAAA,YACA,eAAe;AAAA,YACf,aAAa;AAAA,YACb,YAAY;AAAA,UAAA;AAAA,QAAA;AAAA,QAEb,gBAAA5R;AAAA,UAACyN;AAAA,UAAA;AAAA,YACA,QAAQ9R,EAAK;AAAA,YACb,gBAAAgS;AAAA,YACA,MAAM7M,GAAS;AAAA,YACf,QAAA9D;AAAA,YACA,eAAerB,EAAK;AAAA,YACpB,gBAAAkS;AAAA,YACA,iBAAiBmS,IAAQM,IAAsB;AAAA,YAC/C,gBAAgBL,IAAaM,IAAqB;AAAA,YAClD,YAAY;AAAA,YACZ,YAAY;AAAA,YACZ,gBAAA1U;AAAA,YACA,kBAAAC;AAAA,YACA,gBAAAxR;AAAA,YACA,eAAAiQ;AAAA,UAAA;AAAA,QAAA;AAAA,MACD;AAAA,IAAA;AAAA,EAAA,GAEF;AAEF,CAAC;AC9IM,SAASyZ,GAAK;AAAA,EACpB,SAAAzC;AAAA,EACA,MAAA5gB;AAAA,EACA,WAAA+S;AAAA,EACA,OAAA1K;AAAA,EACA,gBAAA6C;AAAA,EACA,OAAAgP;AACD,GAAc;AACb,SAAIla,MAASG,GAAS,OAEpB,gBAAAd,EAAC,SAAI,OAAAgJ,GAAc,WAAA0K,GAClB,4BAACoO,IAAA,EAAS,OAAAjH,GAAc,SAAA0G,GAAkB,EAAA,CAC3C,IAIE5gB,MAASG,GAAS,OAEpB,gBAAAd,EAAC,OAAA,EAAI,OAAAgJ,GAAc,WAAA0K,GAClB,UAAA,gBAAA1T;AAAA,IAAC+jB;AAAA,IAAA;AAAA,MACA,gBAAAlY;AAAA,MACA,OAAAgP;AAAA,MACA,SAAA0G;AAAA,IAAA;AAAA,EAAA,GAEF,IAMD,gBAAAvhB,EAAC,OAAA,EAAI,OAAAgJ,GAAc,WAAA0K,GAClB,UAAA,gBAAA1T;AAAA,IAACshB;AAAA,IAAA;AAAA,MACA,gBAAAzV;AAAA,MACA,OAAAgP;AAAA,MACA,SAAA0G;AAAA,IAAA;AAAA,EAAA,GAEF;AAEF;ACtBO,SAAS0C,GACfrc,GACA,EAAE,eAAA2C,GAAe,gBAAAjQ,GAAgB,UAAAmE,KAC1B;AACP,MAAI,OAAOmJ,KAAW,UAAU;AAC/B,IAAIA,KAAU2C,IACbA,EAAc,QAAQ3C,CAAM,IAE5BnJ,EAAS,IAAI;AAEd;AAAA,EACD;AACA,MAAImJ,KAAU,QAAQtN,KAAkB,MAAM;AAC7C,IAAAA,EAAe,IAAIsN,EAAO,MAAMA,EAAO,KAAK;AAC5C;AAAA,EACD;AACA,EAAAnJ,EAAS,IAAI;AACd;AAQO,SAASylB,GACftc,GACA2C,GACU;AAEV,SADI,OAAO3C,KAAW,YAClB,CAACA,KAAU,CAAC2C,IAAsB,KAC/BA,EAAc,UAAU3C,CAAM;AACtC;AAUO,SAASuc,GACfvc,GACAtN,GACU;AACV,SAAIsN,KAAU,QAAQ,OAAOA,KAAW,YAAYtN,KAAkB,OAC9D,KAEDA,EAAe,IAAIsN,EAAO,IAAI,MAAMA,EAAO;AACnD;ACrDO,MAAMwc,KAAoB;AAAA,EAChC,MAAM;AAAA,EACN,cAAc;AAAA,IACb,OAAO;AAAA,IACP,MAAM;AAAA,IACN,UAAU;AAAA,IACV,OAAO;AAAA,EAAA;AAET,GAgBaC,KAAmB;AAAA,EAC/B,MAAM;AAAA,EACN,cAAc;AAAA,IACb,QAAQ;AAAA,EAAA;AAEV,GC3BMlmB,KAAwE;AAAA,EAC7E,CAACC,GAAgB,IAAI,GAAG;AAAA,EACxB,CAACA,GAAgB,MAAM,GAAG;AAAA,EAC1B,CAACA,GAAgB,KAAK,GAAG;AAC1B,GAMMC,KAAkE;AAAA,EACvE,CAACC,GAAc,GAAG,GAAG;AAAA,EACrB,CAACA,GAAc,MAAM,GAAG;AAAA,EACxB,CAACA,GAAc,MAAM,GAAG;AACzB,GAUagmB,KAAiB9lB;AAAA,EAI7B,CACC,EAAE,OAAA9E,GAAO,UAAAgF,GAAU,UAAAD,GAAU,WAAAE,GAAW,eAAA4L,GAAe,gBAAAjQ,EAAA,GACvDsE,MACI;AACJ,UAAM2lB,IAAYzlB,EAA0B,IAAI,GAC1C,CAAC0lB,GAASC,CAAU,IAAIzhB,GAAS,EAAK;AAE5C,IAAAjE;AAAA,MACCH;AAAA,MACA,OAAO,EAAE,OAAO,MAAA;;AAAM,gBAAAI,IAAAulB,EAAU,YAAV,gBAAAvlB,EAAmB;AAAA,QAAM;AAAA,MAC/C,CAAA;AAAA,IAAC;AAGF,UAAM0lB,IAAkBR,GAAsBxqB,EAAM,QAAQ6Q,CAAa,GACnE1J,IAAanC,KAAY,CAACgmB,GAC1B5K,IAAWqK,GAAsBzqB,EAAM,QAAQY,CAAc,GAE7DuF,IAAc8E,EAAY,MAAM;AACrC,MAAI9D,KACJojB,GAAoBvqB,EAAM,QAAQ;AAAA,QACjC,eAAA6Q;AAAA,QACA,gBAAAjQ;AAAA,QACA,UAAAmE;AAAA,MAAA,CACA;AAAA,IACF,GAAG,CAACoC,GAAYnH,EAAM,QAAQ6Q,GAAejQ,GAAgBmE,CAAQ,CAAC,GAEhE8T,IAAoB5N,EAAY,MAAM;AAC3C,MAAK9D,KAAY4jB,EAAW,EAAI;AAAA,IACjC,GAAG,CAAC5jB,CAAU,CAAC,GAET+R,IAAkBjO,EAAY,MAAM8f,EAAW,EAAK,GAAG,CAAA,CAAE,GAEzDvlB,IAAiBC,EAAQ,MAAqB;AACnD,YAAMC,IAAqB;AAAA,QAC1B,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,UAAU;AAAA,QACV,QAAQyB,IAAa,YAAY;AAAA,QACjC,YAAY;AAAA,QACZ,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,SAASA,IAAa,MAAM2jB,IAAU,MAAM1K,IAAW,OAAO;AAAA,QAC9D,WAAW0K,IAAU,gBAAgB;AAAA,QACrC,YAAYA,IACT,SACA;AAAA,MAAA;AAGJ,MAAI9qB,EAAM,YACT0F,EAAI,UAAU,QACdA,EAAI,aAAaf,GAAY3E,EAAM,YAAY4E,GAAc,MAAM,GACnEc,EAAI,iBACHjB,GAAYzE,EAAM,cAAc0E,GAAgB,MAAM,GACvDgB,EAAI,gBAAgB,QACpBA,EAAI,QAAQ,aACF1F,EAAM,QAAQ,CAACA,EAAM,SAC/B0F,EAAI,UAAU,QACdA,EAAI,aAAaf,GAAY3E,EAAM,YAAY4E,GAAc,MAAM,GACnEc,EAAI,iBACHjB,GAAYzE,EAAM,cAAc0E,GAAgB,MAAM,GACvDgB,EAAI,gBAAgB,QACpBA,EAAI,aAAa,WACjBA,EAAI,QAAQ,cAEZA,EAAI,UAAU,QACdA,EAAI,aAAaf,GAAY3E,EAAM,YAAY4E,GAAc,MAAM,GACnEc,EAAI,iBACHjB,GAAYzE,EAAM,cAAc0E,GAAgB,MAAM,GACvDgB,EAAI,MAAM,OACVA,EAAI,aAAa,WACjBA,EAAI,WAAW,WACfA,EAAI,QAAQ;AAGb,YAAMC,IAAS3F,EAAM,OAAOA,EAAM,MAAM,QAClC4F,IAASD,KAAU3F,EAAM,KACzB6F,IAAWF,KAAU3F,EAAM,OAC3B8F,IAAYH,KAAU3F,EAAM,QAC5B+F,IAAUJ,KAAU3F,EAAM;AAChC,aAAI4F,MAAQF,EAAI,aAAaM,GAAkBJ,CAAM,IACjDC,MAAUH,EAAI,eAAeM,GAAkBH,CAAQ,IACvDC,MAAWJ,EAAI,gBAAgBM,GAAkBF,CAAS,IAC1DC,MAASL,EAAI,cAAcM,GAAkBD,CAAO,IAEjDL;AAAA,IACR,GAAG,CAAC1F,GAAOmH,GAAY2jB,GAAS1K,CAAQ,CAAC;AAEzC,WACC,gBAAAha;AAAA,MAAC;AAAA,MAAA;AAAA,QACA,KAAKykB;AAAA,QACL,MAAK;AAAA,QACL,UAAU1jB;AAAA,QACV,gBAAciZ,IAAW,KAAO;AAAA,QAChC,cAAYnb,KAAajF,EAAM,SAAS;AAAA,QACxC,OAAOA,EAAM;AAAA,QACb,OAAOwF;AAAA,QACP,SAASW;AAAA,QACT,eAAe0S;AAAA,QACf,aAAaK;AAAA,QACb,gBAAgBA;AAAA,QAChB,WAAW,CAAC7S,MAAM;AACjB,WAAIA,EAAE,QAAQ,WAAWA,EAAE,QAAQ,SAClCA,EAAE,eAAA,GACFF,EAAA;AAAA,QAEF;AAAA,QAEC,UAAA;AAAA,UAAAnG,EAAM,WACN,gBAAAsG;AAAA,YAAC;AAAA,YAAA;AAAA,cACA,SAAQ;AAAA,cACR,eAAY;AAAA,cACZ,OAAO;AAAA,gBACN,SAAS;AAAA,gBACT,QAAQ;AAAA,gBACR,OAAO;AAAA,gBACP,QAAQ;AAAA,cAAA;AAAA,cAGT,4BAAC,QAAA,EAAK,GAAGtG,EAAM,UAAU,MAAK,eAAA,CAAe;AAAA,YAAA;AAAA,UAAA,IAE3CA,EAAM,OACT,gBAAAsG;AAAA,YAAC;AAAA,YAAA;AAAA,cACA,eAAY;AAAA,cACZ,OACEtG,EAAM,QAQJ,SAPA;AAAA,gBACA,SAAS;AAAA,gBACT,OAAO;AAAA,gBACP,WAAW;AAAA,gBACX,UAAU;AAAA,gBACV,YAAY;AAAA,cAAA;AAAA,cAKf,UAAAA,EAAM;AAAA,YAAA;AAAA,UAAA,IAEL;AAAA,UACH,CAACA,EAAM,aAAaA,EAAM,SAAS,CAACA,EAAM,SAC1C,gBAAAsG,EAAC,QAAA,EAAM,UAAAtG,EAAM,SAAS,MAAA,CAAM;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAIhC;AACD;AAEA4qB,GAAe,cAAc;AC3LtB,MAAMK,KAAgE;AAAA,EAC5E,MAAM;AAAA,EACN,MAAM;AAAA,IACL,aAAa;AAAA,IACb,aAAa;AAAA,IACb,aAAa,EAAE,GAAG,GAAG,GAAG,EAAA;AAAA,EAAE;AAAA,EAE3B,UAAUL;AAAA,EACV,YAAY,CAACnkB,IAAehH,IAAairB,IAAmBC,EAAgB;AAAA,EAC5E,eAAe,CAAC3qB,MACX,OAAOA,KAAU,YAAYA,MAAU,OACnC,CAAA,IACDA;AAAA,EAER,eAAe,MAAwB;AACxC;ACZO,SAASkrB,GAAiB/oB,GAAYkS,GAAwB;AACpE,SAAO;AAAA,IACN,IAAAlS;AAAA,IACA,MAAM;AAAA,IACN,QAAQ,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAA;AAAA,IAC/B,OAAO;AAAA,MACN,SAAAkS;AAAA,MACA,aAAa;AAAA;AAAA,MAEb,SAAS;AAAA,MACT,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,KAAK,EAAE,OAAO,GAAG,MAAM,KAAA;AAAA,MACvB,OAAO,EAAE,OAAO,GAAG,MAAM,KAAA;AAAA,IAAK;AAAA,EAC/B;AAEF;ACnCA,MAAM8W,KAAe;AAAA,EACpB,EAAE,OAAO,MAAM,OAAO,KAAA;AAAA,EACtB,EAAE,OAAO,MAAM,OAAO,KAAA;AAAA,EACtB,EAAE,OAAO,QAAQ,OAAO,OAAA;AACzB;AAqBO,SAASC,GAAgBjpB,GAAYkS,GAAwB;AACnE,SAAO;AAAA,IACN,IAAAlS;AAAA,IACA,MAAM;AAAA,IACN,QAAQ,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAA;AAAA,IAC/B,OAAO;AAAA,MACN,SAAAkS;AAAA,MACA,cAAc;AAAA,QACb,SAAS8W;AAAA,QACT,YAAY;AAAA,QACZ,cAAc;AAAA,MAAA;AAAA,MAEf,YAAY;AAAA,MACZ,MAAM,EAAE,OAAO,GAAG,MAAM,KAAA;AAAA,IAAK;AAAA,EAC9B;AAEF;ACCO,MAAME,KAAsB;AAAA,EAClC,MAAM;AAAA,EACN,cAAc;AAAA,IACb,MAAM;AAAA,EAAA;AAER,GAmBaC,KAAmB;AAAA,EAC/B,MAAM;AAAA,EACN,cAAc;AAAA,IACb,aAAa;AAAA,MACZ,YAAY;AAAA,MACZ,aAAa;AAAA,MACb,YAAY;AAAA,MACZ,UAAU;AAAA,IAAA;AAAA,EACX;AAEF;ACvEO,SAASC,GACf3e,GACAoO,GACAwQ,GACAC,GACS;AACT,MAAIhY,IAAO7G,IAAUoO;AACrB,SAAIyQ,MAAQ,WAAWhY,IAAO,KAAK,IAAIgY,GAAKhY,CAAI,IAC5C+X,MAAQ,WAAW/X,IAAO,KAAK,IAAI+X,GAAK/X,CAAI,IACzCA;AACR;ACHA,MAAMiY,KAAU,2BAEVC,KAAY,0BAGZC,KAAqB,CAACC,OAAsC;AAAA,EACjE,UAAU;AAAA,EACV,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,QAAQA,IAAW,YAAY;AAAA,EAC/B,WAAW;AACZ,IAUaC,KAAkBhnB,GAG7B,CAAC,EAAE,OAAA9E,GAAO,OAAAI,GAAO,UAAA2E,GAAU,UAAAC,EAAA,GAAYE,MAAQ;;AAChD,QAAMC,IAASC,EAAuB,IAAI,GACpC,CAAC2mB,GAAWC,CAAY,IAAI1iB,GAAS,EAAK,GAC1C,CAAC2iB,GAAaC,CAAc,IAAI5iB,GAAS,EAAK,GAE9CnC,IAAanC,GACbmnB,IAAOnsB,EAAM,QAAQ,GACrBosB,MAAa9mB,IAAAtF,EAAM,gBAAN,gBAAAsF,EAAmB,eAAc,gBAC9C+mB,MAAatkB,IAAA/H,EAAM,gBAAN,gBAAA+H,EAAmB,eAAc,IAC9CukB,MAAcjkB,IAAArI,EAAM,gBAAN,gBAAAqI,EAAmB,gBAAe,IAChDkkB,MAAWhZ,IAAAvT,EAAM,gBAAN,gBAAAuT,EAAmB,aAAY,IAC1CiZ,KAAa,MAAMH,KAAc;AAEvC,EAAAhnB;AAAA,IACCH;AAAA,IACA,OAAO;AAAA,MACN,OAAO,MAAA;;AAAM,gBAAA6C,KAAAzC,IAAAH,EAAO,YAAP,gBAAAG,EAAgB,cAAc,cAA9B,gBAAAyC,EAAyC;AAAA;AAAA,IAAM;AAAA,IAE7D,CAAA;AAAA,EAAC;AAGF,QAAM0kB,IAAQxhB;AAAA,IACb,CAAC+P,MAAkB;AAClB,UAAI7T,EAAY;AAChB,YAAMtG,IAAM,OAAOT,KAAS,CAAC,GACvBqT,IAAO8X,GAAU1qB,GAAKma,GAAOhb,EAAM,KAAKA,EAAM,GAAG;AACvD,MAAA+E,EAAS0O,CAAI;AAAA,IACd;AAAA,IACA,CAACtM,GAAY/G,GAAO2E,GAAU/E,EAAM,KAAKA,EAAM,GAAG;AAAA,EAAA,GAG7C0sB,IAAWzhB,EAAY,MAAMwhB,EAAMN,CAAI,GAAG,CAACM,GAAON,CAAI,CAAC,GACvDQ,IAAa1hB,EAAY,MAAMwhB,EAAM,CAACN,CAAI,GAAG,CAACM,GAAON,CAAI,CAAC,GAE1DS,IAAc,CAAC9B,OAAqC;AAAA,IACzD,SAAS3jB,IAAa,MAAM2jB,IAAU,MAAM;AAAA,IAC5C,WAAWA,IAAU,eAAe;AAAA,IACpC,YAAYA,IAAU,SAAS;AAAA,EAAA;AAGhC,SACC,gBAAA1kB;AAAA,IAAC;AAAA,IAAA;AAAA,MACA,KAAKjB;AAAA,MACL,OAAO;AAAA,QACN,UAAU;AAAA,QACV,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,OAAOinB;AAAA,MAAA;AAAA,MAGR,UAAA;AAAA,QAAA,gBAAA9lB;AAAA,UAAC;AAAA,UAAA;AAAA,YACA,MAAK;AAAA,YACL,UAAUa;AAAA,YACV,cAAW;AAAA,YACX,OAAO,EAAE,GAAGykB,GAAmBzkB,CAAU,GAAG,KAAK,EAAA;AAAA,YACjD,SAASulB;AAAA,YACT,eAAe,MAAM;AACpB,cAAKvlB,KAAY6kB,EAAa,EAAI;AAAA,YACnC;AAAA,YACA,aAAa,MAAMA,EAAa,EAAK;AAAA,YACrC,gBAAgB,MAAMA,EAAa,EAAK;AAAA,UAAA;AAAA,QAAA;AAAA,QAEzC,gBAAA1lB;AAAA,UAAC;AAAA,UAAA;AAAA,YACA,MAAK;AAAA,YACL,UAAUa;AAAA,YACV,cAAW;AAAA,YACX,OAAO,EAAE,GAAGykB,GAAmBzkB,CAAU,GAAG,QAAQ,EAAA;AAAA,YACpD,SAASwlB;AAAA,YACT,eAAe,MAAM;AACpB,cAAKxlB,KAAY+kB,EAAe,EAAI;AAAA,YACrC;AAAA,YACA,aAAa,MAAMA,EAAe,EAAK;AAAA,YACvC,gBAAgB,MAAMA,EAAe,EAAK;AAAA,UAAA;AAAA,QAAA;AAAA,QAE3C,gBAAA5lB;AAAA,UAAC;AAAA,UAAA;AAAA,YACA,SAAQ;AAAA,YACR,qBAAoB;AAAA,YACpB,eAAY;AAAA,YACZ,OAAO;AAAA,cACN,UAAU;AAAA,cACV,MAAM,GAAGkmB,CAAS;AAAA,cAClB,QAAQ,cAAcD,IAAW,CAAC;AAAA,cAClC,OAAO,GAAGF,CAAU;AAAA,cACpB,QAAQ,GAAGC,CAAW;AAAA,cACtB,eAAe;AAAA,cACf,iBAAiB;AAAA,cACjB,GAAGM,EAAYb,CAAS;AAAA,YAAA;AAAA,YAGzB,UAAA,gBAAAzlB,EAAC,QAAA,EAAK,GAAGolB,IAAS,MAAK,eAAA,CAAe;AAAA,UAAA;AAAA,QAAA;AAAA,QAEvC,gBAAAplB;AAAA,UAAC;AAAA,UAAA;AAAA,YACA,SAAQ;AAAA,YACR,qBAAoB;AAAA,YACpB,eAAY;AAAA,YACZ,OAAO;AAAA,cACN,UAAU;AAAA,cACV,MAAM,GAAGkmB,CAAS;AAAA,cAClB,KAAK,cAAcD,IAAW,CAAC;AAAA,cAC/B,OAAO,GAAGF,CAAU;AAAA,cACpB,QAAQ,GAAGC,CAAW;AAAA,cACtB,eAAe;AAAA,cACf,iBAAiB;AAAA,cACjB,GAAGM,EAAYX,CAAW;AAAA,YAAA;AAAA,YAG3B,UAAA,gBAAA3lB,EAAC,QAAA,EAAK,GAAGqlB,IAAW,MAAK,eAAA,CAAe;AAAA,UAAA;AAAA,QAAA;AAAA,MACzC;AAAA,IAAA;AAAA,EAAA;AAGH,CAAC;AAEDG,GAAgB,cAAc;AC1IvB,MAAMe,KACZ;AAAA,EACC,MAAM;AAAA,EACN,MAAM;AAAA,IACL,aAAa;AAAA,IACb,aAAa;AAAA,IACb,aAAa,EAAE,GAAG,GAAG,GAAG,EAAA;AAAA,EAAE;AAAA,EAE3B,UAAUf;AAAA,EACV,YAAY,CAACrlB,IAAe4kB,IAAqBC,EAAgB;AAAA,EACjE,eAAe,CAACtrB,MAAsC;AACrD,QAAI,OAAOA,KAAU,YAAYA,MAAU;AAC1C,aAAO,CAAA;AACR,UAAMC,IAAID;AACV,WACC,iBAAiBC,MAChB,OAAOA,EAAE,eAAgB,YAAYA,EAAE,gBAAgB,QAEjD,EAAE,GAAGA,GAAG,aAAa,GAAC,IAEvBD;AAAA,EACR;AAAA,EACA,eAAe,CAACI,MACf,OAAOA,KAAU,WAAWA,IAAQ;AACtC,GCnCK0sB,KAAa;AAAA,EAClB,MAAM;AAAA,IACL,QAAQC,EAAgB;AAAA,IACxB,OAAO,EAAE,OAAO,KAAK,MAAM,KAAA;AAAA,IAC3B,QAAQ,EAAE,OAAO,GAAG,MAAM,KAAA;AAAA,EAAc;AAAA,EAEzC,QAAQ;AAAA,IACP,KAAK,EAAE,OAAO,GAAG,MAAM,KAAA;AAAA,IACvB,OAAO,EAAE,OAAO,GAAG,MAAM,KAAA;AAAA,IACzB,QAAQ,EAAE,OAAO,GAAG,MAAM,KAAA;AAAA,IAC1B,MAAM,EAAE,OAAO,GAAG,MAAM,KAAA;AAAA,EAAc;AAAA,EAEvC,YAAY;AAAA,EACZ,WAAW;AACZ,GAMMC,KAAY;AAAA,EACjB,UAAU;AAAA,EACV,UAAU;AAAA,EACV,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,MAAM,OAAc;AAC5C,GAYaC,KAAgC;AAAA,EAC5C,OAAO;AAAA,IACN,MAAM;AAAA,MACL,OAAOH;AAAA,MACP,OAAO;AAAA,QACN;AAAA,UACC,MAAME;AAAA,UACN,QAAQ;AAAA,YACP;AAAA,cACC,IAAI;AAAA,cACJ,MAAM;AAAA,cACN,QAAQ,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAA;AAAA,cAC/B,WAAW;AAAA,cACX,UAAU,EAAE,UAAU,GAAA;AAAA,cACtB,OAAO,EAAE,YAAY,UAAU,UAAU,SAAA;AAAA,YAAS;AAAA,YAEnD;AAAA,cACC,GAAG9B,GAAiB,wBAAwB,eAAe;AAAA,cAC3D,QAAQ,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAA;AAAA,YAAE;AAAA,YAElC;AAAA,cACC,IAAI;AAAA,cACJ,MAAM;AAAA,cACN,QAAQ,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAA;AAAA,cAC/B,OAAO,EAAE,SAAS,iBAAiB,MAAM,GAAG,KAAK,EAAA;AAAA,YAAE;AAAA,UACpD;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAAA,EAED,SAAS,CAACxf,IAAYmhB,EAAa;AACpC,GAYaK,KAAgC;AAAA,EAC5C,OAAO;AAAA,IACN,MAAM;AAAA,MACL,OAAOJ;AAAA,MACP,OAAO;AAAA,QACN;AAAA,UACC,MAAME;AAAA,UACN,QAAQ;AAAA,YACP;AAAA,cACC,IAAI;AAAA,cACJ,MAAM;AAAA,cACN,QAAQ,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAA;AAAA,cAC/B,WAAW;AAAA,cACX,UAAU,EAAE,UAAU,GAAA;AAAA,cACtB,OAAO,EAAE,YAAY,UAAU,UAAU,SAAA;AAAA,YAAS;AAAA,YAEnD;AAAA,cACC,GAAG9B,GAAiB,wBAAwB,eAAe;AAAA,cAC3D,QAAQ,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAA;AAAA,YAAE;AAAA,YAElC;AAAA,cACC,IAAI;AAAA,cACJ,MAAM;AAAA,cACN,QAAQ,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAA;AAAA,cAC/B,OAAO,EAAE,SAAS,iBAAiB,MAAM,GAAG,KAAK,EAAA;AAAA,YAAE;AAAA,UACpD;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAAA,EAED,SAAS,CAACxf,IAAYmhB,EAAa;AACpC,GAoBaM,KAAgC;AAAA,EAC5C,OAAO;AAAA,IACN,MAAM;AAAA,MACL,OAAOL;AAAA,MACP,OAAO;AAAA,QACN;AAAA,UACC,MAAM;AAAA,YACL,UAAU;AAAA,YACV,UAAU;AAAA,YACV,MAAM;AAAA,cACL,GAAG,EAAE,OAAO,GAAG,MAAM,KAAA;AAAA,cACrB,GAAG,EAAE,OAAO,GAAG,MAAM,KAAA;AAAA,YAAK;AAAA,UAC3B;AAAA,UAED,QAAQ;AAAA,YACP;AAAA,cACC,IAAI;AAAA,cACJ,MAAM;AAAA,cACN,QAAQ,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAA;AAAA,cAC/B,WAAW;AAAA,cACX,UAAU,EAAE,UAAU,GAAA;AAAA,cACtB,OAAO,EAAE,YAAY,UAAU,UAAU,SAAA;AAAA,YAAS;AAAA,YAEnD;AAAA,cACC,GAAG5B,GAAiB,wBAAwB,eAAe;AAAA,cAC3D,QAAQ,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAA;AAAA,YAAE;AAAA,YAElC;AAAA,cACC,IAAI;AAAA,cACJ,MAAM;AAAA,cACN,QAAQ,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAA;AAAA,cAC/B,OAAO,EAAE,SAAS,iBAAiB,MAAM,GAAG,KAAK,EAAA;AAAA,YAAE;AAAA,YAEpD;AAAA,cACC,IAAI;AAAA,cACJ,MAAM;AAAA,cACN,QAAQ,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAA;AAAA,cAC/B,WAAW;AAAA,cACX,UAAU,EAAE,UAAU,GAAA;AAAA,cACtB,OAAO,EAAE,YAAY,UAAU,UAAU,SAAA;AAAA,YAAS;AAAA,YAEnD;AAAA,cACC,GAAGA,GAAiB,wBAAwB,eAAe;AAAA,cAC3D,QAAQ,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAA;AAAA,YAAE;AAAA,YAElC;AAAA,cACC,IAAI;AAAA,cACJ,MAAM;AAAA,cACN,QAAQ,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAA;AAAA,cAC/B,OAAO,EAAE,SAAS,iBAAiB,MAAM,GAAG,KAAK,EAAA;AAAA,YAAE;AAAA,UACpD;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAAA,EAED,SAAS,CAACxf,IAAYmhB,EAAa;AACpC,GC7KMO,KAAuC;AAAA,EAC5C,KAAK,MAAM;AAAA,EACX,KAAK,MAAM;AAAA,EAAC;AACb,GAGMC,KAAqC;AAAA,EAC1C,SAAS,MAAM;AAAA,EAAC;AAAA,EAChB,WAAW,MAAM;AAClB,GAGMC,KAAiC;AAAA,EACtC,kBAAkB,CAAA;AAAA,EAClB,SAAS;AACV,GAUaC,KAAoBzoB;AAAA,EAIhC,CACC;AAAA,IACC,OAAA9E;AAAA,IACA,YAAA+kB;AAAA,IACA,gBAAAnkB;AAAA,IACA,eAAAiQ;AAAA,IACA,iBAAA/H;AAAA,IACA,gBAAAC;AAAA,EAAA,GAED7D,MACI;AACJ,UAAM+O,IAAiBuZ,GAAW7I,EAAqB;AACvD,IAAAtf,GAAoBH,GAAK,OAAO,EAAE,OAAO,MAAM;AAAA,IAAC,EAAA,IAAM,EAAE;AAExD,UAAM+D,IAAe7D,EAA8B,IAAI,GAEjD,EAAE,cAAAqoB,GAAc,eAAAC,GAAe,OAAAvM,EAAA,IAAU1b,EAAQ,MAAM;AAC5D,YAAMkoB,IAAKznB,GAAK,QAAQlG,EAAM,KAAK,MAAM,KAAK,OAAOgQ,EAAW,GAC1D4d,IAAK1nB,GAAK,QAAQlG,EAAM,KAAK,MAAM,KAAK,QAAQgQ,EAAW,GAC3D6d,IACL9I,KAAc4I,IAAK,KAAKC,IAAK,IAC1B,KAAK;AAAA,QACL7I,EAAW,UAAU4I;AAAA,QACrB5I,EAAW,WAAW6I,IAAK,KAAKA,IAAK7I,EAAW,WAAW,IACxD,IACAA,EAAW,WAAW6I;AAAA,MAAA,IAEzB;AACJ,aAAO,EAAE,cAAcD,GAAI,eAAeC,GAAI,OAAOC,EAAA;AAAA,IACtD,GAAG,CAAC7tB,EAAM,KAAK,OAAO+kB,CAAU,CAAC;AAEjC,IAAA5O,GAAU,MAAM;AACf,MAAArN,KAAA,QAAAA,EAAkB4kB,IAAgBvM;AAAA,IACnC,GAAG,CAACrY,GAAiB4kB,GAAevM,CAAK,CAAC,GAE1ChL,GAAU,MAAM;AACf,MAAApN,KAAA,QAAAA,EAAiB0kB,IAAetM;AAAA,IACjC,GAAG,CAACpY,GAAgB0kB,GAActM,CAAK,CAAC;AAExC,UAAM2M,IAAcroB,EAA4B,MAC1CwO,IACE;AAAA,MACN,MAAMjU,EAAM;AAAA,MACZ,cAAc,MAAM;AAAA,MAAC;AAAA,MACrB,gBAAAiU;AAAA,MACA,cAAAhL;AAAA,MACA,gBAAgBrI,KAAkBwsB;AAAA,MAClC,eAAevc,KAAiBwc;AAAA,MAChC,aAAaC;AAAA,MACb,QAAQ,CAAA;AAAA,IAAC,IATkB,MAW1B,CAACttB,EAAM,MAAMiU,GAAgBrT,GAAgBiQ,CAAa,CAAC;AAE9D,WAAKid,IAGJ,gBAAAxnB,EAAC,OAAA,EAAI,OAAO,EAAE,OAAO,QAAQ,QAAQ,QAAQ,UAAU,SAAA,GACtD,UAAA,gBAAAA;AAAA,MAACgkB;AAAA,MAAA;AAAA,QACA,MAAMljB,GAAS;AAAA,QACf,SAAS0mB;AAAA,QACT,OAAO;AAAA,UACN,OAAOL;AAAA,UACP,QAAQC;AAAA,UACR,WAAW,SAASvM,CAAK;AAAA,UACzB,iBAAiB;AAAA,QAAA;AAAA,MAClB;AAAA,IAAA,GAEF,IAdwB;AAAA,EAgB1B;AACD;AAEAoM,GAAkB,cAAc;AC7GzB,MAAMQ,KAA+D;AAAA,EAC3E,MAAM;AAAA,EACN,MAAM;AAAA,IACL,aAAa;AAAA,IACb,aAAa;AAAA,IACb,aAAa,EAAE,GAAG,GAAG,GAAG,EAAA;AAAA,EAAE;AAAA,EAE3B,UAAUR;AAAA,EACV,YAAY,CAAA;AAAA,EACZ,eAAe,CAACvtB,MAEd,OAAOA,KAAU,YACjBA,MAAU,QACV,UAAUA,KACV,OAAQA,EAA4B,QAAS,YAC5CA,EAA4B,SAAS,OAE/BA,IAED,EAAE,MAAMgB,GAAA;AAAA,EAEhB,eAAe,MAAsB;AACtC;ACfA,MAAMgtB,KAAyB;AAAA,EAC9B,MAAM;AAAA,EACN,KAAKjB,EAAgB;AACtB,GAGMkB,KAAY;AAAA,EACjB,MAAM;AAAA,IACL,QAAQlB,EAAgB;AAAA,IACxB,OAAO,EAAE,OAAO,KAAK,MAAM,KAAA;AAAA,IAC3B,QAAQ,EAAE,OAAO,IAAI,MAAM,KAAA;AAAA,EAAc;AAAA,EAE1C,QAAQ;AAAA,IACP,KAAK,EAAE,OAAO,GAAG,MAAM,KAAA;AAAA,IACvB,OAAO,EAAE,OAAO,GAAG,MAAM,KAAA;AAAA,IACzB,QAAQ,EAAE,OAAO,GAAG,MAAM,KAAA;AAAA,IAC1B,MAAM,EAAE,OAAO,GAAG,MAAM,KAAA;AAAA,EAAc;AAAA,EAEvC,YAAY;AAAA,EACZ,WAAW;AACZ,GAKMmB,KAAyC;AAAA,EAC9C,MAAM;AAAA,IACL,OAAOD;AAAA,IACP,OAAO;AAAA,MACN;AAAA,QACC,MAAM;AAAA,UACL,UAAU;AAAA,UACV,UAAU;AAAA,UACV,MAAM,EAAE,GAAG,EAAE,OAAO,IAAI,MAAM,OAAK;AAAA,QAAE;AAAA,QAEtC,QAAQ;AAAA,UACP;AAAA,YACC,IAAI;AAAA,YACJ,MAAM;AAAA,YACN,QAAQ,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAA;AAAA,YAC/B,WAAW;AAAA,YACX,UAAU,EAAE,UAAU,GAAA;AAAA,YACtB,OAAO,EAAE,YAAY,UAAU,UAAU,SAAA;AAAA,UAAS;AAAA,UAEnD;AAAA,YACC,IAAI;AAAA,YACJ,MAAM;AAAA,YACN,QAAQ,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAA;AAAA,YAC/B,WAAWlB,EAAgB;AAAA,YAC3B,OAAO;AAAA,cACN,SAAS;AAAA,cACT,UAAU;AAAA,cACV,MAAM,EAAE,OAAO,GAAG,MAAM,KAAA;AAAA,cACxB,cAAc;AAAA,gBACb,SAAS;AAAA,kBACR,EAAE,OAAO,kBAAkB,OAAOA,EAAgB,GAAA;AAAA,kBAClD,EAAE,OAAO,kBAAkB,OAAOA,EAAgB,GAAA;AAAA,kBAClD,EAAE,OAAO,kBAAkB,OAAOA,EAAgB,GAAA;AAAA,kBAClD;AAAA,oBACC,OAAO;AAAA,oBACP,OAAOA,EAAgB;AAAA,kBAAA;AAAA,kBAExB;AAAA,oBACC,OAAO;AAAA,oBACP,OAAOA,EAAgB;AAAA,kBAAA;AAAA,kBAExB,EAAE,OAAO,QAAQ,OAAOA,EAAgB,OAAA;AAAA,gBAAO;AAAA,cAChD;AAAA,YACD;AAAA,UACD;AAAA,UAED;AAAA,YACC,IAAI;AAAA,YACJ,MAAM;AAAA,YACN,QAAQ,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAA;AAAA,YAC/B,WAAW;AAAA,YACX,UAAU,EAAE,UAAU,GAAA;AAAA,YACtB,OAAO,EAAE,YAAY,UAAU,UAAU,SAAA;AAAA,UAAS;AAAA,UAEnD;AAAA,YACC,IAAI;AAAA,YACJ,MAAM;AAAA,YACN,QAAQ,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAA;AAAA,YAC/B,OAAO,EAAE,SAAS,oBAAA;AAAA,UAAoB;AAAA,QACvC;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAEF,GAKMoB,KAAkC;AAAA,EACvC,MAAM;AAAA,IACL,OAAOF;AAAA,IACP,OAAO;AAAA,MACN;AAAA,QACC,MAAM;AAAA,UACL,UAAU;AAAA,UACV,UAAU;AAAA,UACV,MAAM;AAAA,YACL,GAAG,EAAE,OAAO,IAAI,MAAM,KAAA;AAAA,YACtB,GAAG,EAAE,OAAO,IAAI,MAAM,KAAA;AAAA,UAAK;AAAA,QAC5B;AAAA,QAED,QAAQ;AAAA,UACP;AAAA,YACC,IAAI;AAAA,YACJ,MAAM;AAAA,YACN,QAAQ,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAA;AAAA,YAC/B,WAAW;AAAA,YACX,UAAU,EAAE,UAAU,GAAA;AAAA,YACtB,OAAO,EAAE,YAAY,UAAU,UAAU,SAAA;AAAA,UAAS;AAAA,UAEnD;AAAA,YACC,IAAI;AAAA,YACJ,MAAM;AAAA,YACN,QAAQ,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAA;AAAA,YAC/B,OAAO,EAAE,SAAS,kBAAA;AAAA,UAAkB;AAAA,UAErC;AAAA,YACC,IAAI;AAAA,YACJ,MAAM;AAAA,YACN,QAAQ,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAA;AAAA,YAC/B,WAAW;AAAA,YACX,UAAU,EAAE,UAAU,GAAA;AAAA,YACtB,OAAO,EAAE,YAAY,UAAU,UAAU,SAAA;AAAA,UAAS;AAAA,UAEnD;AAAA,YACC,IAAI;AAAA,YACJ,MAAM;AAAA,YACN,QAAQ,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAA;AAAA,YAC/B,OAAO,EAAE,SAAS,mBAAA;AAAA,UAAmB;AAAA,QACtC;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAEF,GAMMG,KAAgC;AAAA,EACrC,MAAM;AAAA,IACL,OAAOH;AAAA,IACP,OAAO;AAAA,MACN;AAAA,QACC,MAAM;AAAA,UACL,UAAU;AAAA,UACV,UAAU;AAAA,UACV,MAAM;AAAA,YACL,GAAG,EAAE,OAAO,GAAG,MAAM,KAAA;AAAA,YACrB,GAAG,EAAE,OAAO,IAAI,MAAM,KAAA;AAAA,YACtB,GAAG,EAAE,OAAO,GAAG,MAAM,KAAA;AAAA,YACrB,GAAG,EAAE,OAAO,IAAI,MAAM,KAAA;AAAA,UAAK;AAAA,QAC5B;AAAA,QAED,QAAQ;AAAA;AAAA,UAEP;AAAA,YACC,IAAI;AAAA,YACJ,MAAM;AAAA,YACN,QAAQ,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAA;AAAA,YAC/B,WAAW;AAAA,YACX,UAAU,EAAE,UAAU,GAAA;AAAA,YACtB,OAAO,EAAE,YAAY,UAAU,UAAU,SAAA;AAAA,YACzC,eAAe;AAAA,UAAA;AAAA;AAAA,UAGhB;AAAA,YACC,IAAI;AAAA,YACJ,MAAM;AAAA,YACN,QAAQ,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAA;AAAA,YAC/B,WAAW;AAAA,YACX,UAAU,EAAE,UAAU,GAAA;AAAA,YACtB,OAAO,EAAE,YAAY,UAAU,UAAU,SAAA;AAAA,YACzC,eAAe,EAAE,MAAM,mBAAmB,KAAK,GAAA;AAAA,UAAK;AAAA,UAErD;AAAA,YACC,GAAG/C,GAAiB,qBAAqB,wBAAwB;AAAA,YACjE,QAAQ,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAA;AAAA,UAAE;AAAA,UAElC;AAAA,YACC,IAAI;AAAA,YACJ,MAAM;AAAA,YACN,QAAQ,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAA;AAAA,YAC/B,OAAO,EAAE,SAAS,0BAA0B,MAAM,GAAG,KAAK,EAAA;AAAA,UAAE;AAAA,UAE7D;AAAA,YACC,GAAGE,GAAgB,oBAAoB,uBAAuB;AAAA,YAC9D,QAAQ,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAA;AAAA,UAAE;AAAA;AAAA,UAGlC;AAAA,YACC,IAAI;AAAA,YACJ,MAAM;AAAA,YACN,QAAQ,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAA;AAAA,YAC/B,WAAW;AAAA,YACX,UAAU,EAAE,UAAU,GAAA;AAAA,YACtB,OAAO,EAAE,YAAY,UAAU,UAAU,SAAA;AAAA,YACzC,eAAe;AAAA,UAAA;AAAA;AAAA,UAGhB;AAAA,YACC,IAAI;AAAA,YACJ,MAAM;AAAA,YACN,QAAQ,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAA;AAAA,YAC/B,WAAW;AAAA,YACX,UAAU,EAAE,UAAU,GAAA;AAAA,YACtB,OAAO,EAAE,YAAY,UAAU,UAAU,SAAA;AAAA,YACzC,eAAe,EAAE,MAAM,oBAAoB,KAAK,GAAA;AAAA,UAAK;AAAA,UAEtD;AAAA,YACC,GAAGF;AAAA,cACF;AAAA,cACA;AAAA,YAAA;AAAA,YAED,QAAQ,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAA;AAAA,UAAE;AAAA,UAElC;AAAA,YACC,IAAI;AAAA,YACJ,MAAM;AAAA,YACN,QAAQ,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAA;AAAA,YAC/B,OAAO,EAAE,SAAS,2BAA2B,MAAM,GAAG,KAAK,EAAA;AAAA,UAAE;AAAA,UAE9D;AAAA,YACC,GAAGE,GAAgB,qBAAqB,wBAAwB;AAAA,YAChE,QAAQ,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAA;AAAA,UAAE;AAAA,QAClC;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAEF,GAkBaiD,KAAiC;AAAA,EAC7C,OAAO;AAAA,IACN,MAAM;AAAA,MACL,OAAO;AAAA,QACN,MAAM;AAAA,UACL,QAAQtB,EAAgB;AAAA,UACxB,OAAO,EAAE,OAAO,KAAK,MAAM,KAAA;AAAA,UAC3B,QAAQ,EAAE,OAAO,IAAI,MAAM,KAAA;AAAA,QAAK;AAAA,QAEjC,QAAQ;AAAA,UACP,KAAK,EAAE,OAAO,GAAG,MAAM,KAAA;AAAA,UACvB,OAAO,EAAE,OAAO,GAAG,MAAM,KAAA;AAAA,UACzB,QAAQ,EAAE,OAAO,GAAG,MAAM,KAAA;AAAA,UAC1B,MAAM,EAAE,OAAO,GAAG,MAAM,KAAA;AAAA,QAAK;AAAA,QAE9B,YAAY;AAAA,QACZ,WAAW;AAAA,MAAA;AAAA,MAEZ,OAAO;AAAA,QACN;AAAA,UACC,MAAM;AAAA,YACL,UAAU;AAAA,YACV,UAAU;AAAA,YACV,MAAM;AAAA,cACL,GAAG,EAAE,OAAO,IAAI,MAAM,KAAA;AAAA,cACtB,GAAG,EAAE,OAAO,IAAI,MAAM,KAAA;AAAA,cACtB,GAAG,EAAE,OAAO,IAAI,MAAM,KAAA;AAAA,YAAK;AAAA,UAC5B;AAAA,UAED,QAAQ;AAAA,YACP;AAAA,cACC,IAAI;AAAA,cACJ,MAAM;AAAA,cACN,QAAQ,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAA;AAAA,cAC/B,UAAU,EAAE,WAAW,GAAA;AAAA,cACvB,OAAyBmB;AAAA,YAAsB;AAAA,YAEhD;AAAA,cACC,IAAI;AAAA,cACJ,MAAM;AAAA,cACN,QAAQ,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAA;AAAA,cAC/B,UAAU,EAAE,WAAW,GAAA;AAAA,cACvB,OAAyBC;AAAA,YAAe;AAAA,YAEzC;AAAA,cACC,IAAI;AAAA,cACJ,MAAM;AAAA,cACN,QAAQ,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAA;AAAA,cAC/B,UAAU,EAAE,WAAW,GAAA;AAAA,cACvB,OAAyBC;AAAA,cACzB,eAAeJ;AAAA,YAAA;AAAA,UAChB;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAAA,EAED,SAAS;AAAA,IACRtnB;AAAA,IACAqnB;AAAA,IACAvlB;AAAA,IACAqkB;AAAA,IACAnhB;AAAA,EAAA;AAEF,GAca4iB,KAAoC;AAAA,EAChD,OAAO;AAAA,IACN,MAAM;AAAA,MACL,OAAO;AAAA,QACN,MAAM;AAAA,UACL,QAAQvB,EAAgB;AAAA,UACxB,OAAO,EAAE,OAAO,IAAI,MAAM,KAAA;AAAA,UAC1B,QAAQ,EAAE,OAAO,IAAI,MAAM,KAAA;AAAA,QAAK;AAAA,QAEjC,QAAQ;AAAA,UACP,KAAK,EAAE,OAAO,GAAG,MAAM,KAAA;AAAA,UACvB,OAAO,EAAE,OAAO,GAAG,MAAM,KAAA;AAAA,UACzB,QAAQ,EAAE,OAAO,GAAG,MAAM,KAAA;AAAA,UAC1B,MAAM,EAAE,OAAO,GAAG,MAAM,KAAA;AAAA,QAAK;AAAA,QAE9B,YAAY;AAAA,QACZ,WAAW;AAAA,MAAA;AAAA,MAEZ,OAAO;AAAA,QACN;AAAA,UACC,MAAM,EAAE,UAAU,GAAG,UAAU,EAAA;AAAA,UAC/B,QAAQ;AAAA,YACP;AAAA,cACC,IAAI;AAAA,cACJ,MAAM;AAAA,cACN,QAAQ,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAA;AAAA,cAC/B,OAAO,EAAE,SAAS,oBAAA;AAAA,YAAoB;AAAA,UACvC;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAAA,EAED,SAAS,CAACrmB,EAAc;AACzB,GAUa6nB,KAAqC;AAAA,EACjD,OAAO;AAAA,IACN,MAAM;AAAA,MACL,OAAO;AAAA,QACN,MAAM;AAAA,UACL,QAAQxB,EAAgB;AAAA,UACxB,OAAO,EAAE,OAAO,IAAI,MAAM,KAAA;AAAA,UAC1B,QAAQ,EAAE,OAAO,IAAI,MAAM,KAAA;AAAA,QAAK;AAAA,QAEjC,QAAQ;AAAA,UACP,KAAK,EAAE,OAAO,GAAG,MAAM,KAAA;AAAA,UACvB,OAAO,EAAE,OAAO,GAAG,MAAM,KAAA;AAAA,UACzB,QAAQ,EAAE,OAAO,GAAG,MAAM,KAAA;AAAA,UAC1B,MAAM,EAAE,OAAO,GAAG,MAAM,KAAA;AAAA,QAAK;AAAA,QAE9B,YAAY;AAAA,QACZ,WAAW;AAAA,MAAA;AAAA,MAEZ,OAAO;AAAA,QACN;AAAA,UACC,MAAM,EAAE,UAAU,GAAG,UAAU,EAAA;AAAA,UAC/B,QAAQ;AAAA,YACP;AAAA,cACC,IAAI;AAAA,cACJ,MAAM;AAAA,cACN,QAAQ,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAA;AAAA,cAC/B,OAAO;AAAA,gBACN,SAAS;AAAA,gBACT,cAAc;AAAA,kBACb,SAAS;AAAA,oBACR,EAAE,OAAO,kBAAkB,OAAOA,EAAgB,GAAA;AAAA,oBAClD,EAAE,OAAO,kBAAkB,OAAOA,EAAgB,GAAA;AAAA,oBAClD,EAAE,OAAO,kBAAkB,OAAOA,EAAgB,GAAA;AAAA,oBAClD;AAAA,sBACC,OAAO;AAAA,sBACP,OAAOA,EAAgB;AAAA,oBAAA;AAAA,oBAExB;AAAA,sBACC,OAAO;AAAA,sBACP,OAAOA,EAAgB;AAAA,oBAAA;AAAA,oBAExB,EAAE,OAAO,QAAQ,OAAOA,EAAgB,OAAA;AAAA,kBAAO;AAAA,gBAChD;AAAA,cACD;AAAA,YACD;AAAA,UACD;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAAA,EAED,SAAS,CAACvkB,EAAY;AACvB,GAYagmB,KAA6B;AAAA;AAAA,EAEzC;AAAA,IACC,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,QAAQ,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAA;AAAA,IAC/B,OAAO;AAAA,MACN,SAAS;AAAA,MACT,cAAc;AAAA,QACb,SAAS;AAAA,UACR,EAAE,OAAO,kBAAkB,OAAOzB,EAAgB,GAAA;AAAA,UAClD,EAAE,OAAO,kBAAkB,OAAOA,EAAgB,GAAA;AAAA,UAClD,EAAE,OAAO,kBAAkB,OAAOA,EAAgB,GAAA;AAAA,UAClD,EAAE,OAAO,uBAAuB,OAAOA,EAAgB,OAAA;AAAA,UACvD,EAAE,OAAO,sBAAsB,OAAOA,EAAgB,MAAA;AAAA,UACtD,EAAE,OAAO,QAAQ,OAAOA,EAAgB,OAAA;AAAA,QAAO;AAAA,MAChD;AAAA,IACD;AAAA,EACD;AAAA;AAAA,EAGD;AAAA,IACC,GAAG7B,GAAiB,qBAAqB,wBAAwB;AAAA,IACjE,QAAQ,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAA;AAAA,IAC/B,eAAe8C;AAAA,EAAA;AAAA,EAEhB;AAAA,IACC,GAAG5C,GAAgB,oBAAoB,uBAAuB;AAAA,IAC9D,QAAQ,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAA;AAAA,IAC/B,eAAe4C;AAAA,EAAA;AAAA,EAEhB;AAAA,IACC,GAAG9C,GAAiB,sBAAsB,yBAAyB;AAAA,IACnE,QAAQ,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAA;AAAA,IAC/B,eAAe8C;AAAA,EAAA;AAAA,EAEhB;AAAA,IACC,GAAG5C,GAAgB,qBAAqB,wBAAwB;AAAA,IAChE,QAAQ,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAA;AAAA,IAC/B,eAAe4C;AAAA,EAAA;AAEjB,GAiBaS,KAA6B;AAAA,EACzC,OAAO;AAAA,IACN,MAAM;AAAA,MACL,OAAO;AAAA,QACN,MAAM;AAAA,UACL,QAAQ1B,EAAgB;AAAA,UACxB,OAAO,EAAE,OAAO,IAAI,MAAM,KAAA;AAAA,UAC1B,QAAQ,EAAE,OAAO,IAAI,MAAM,KAAA;AAAA,QAAK;AAAA,QAEjC,QAAQ;AAAA,UACP,KAAK,EAAE,OAAO,GAAG,MAAM,KAAA;AAAA,UACvB,OAAO,EAAE,OAAO,GAAG,MAAM,KAAA;AAAA,UACzB,QAAQ,EAAE,OAAO,GAAG,MAAM,KAAA;AAAA,UAC1B,MAAM,EAAE,OAAO,GAAG,MAAM,KAAA;AAAA,QAAK;AAAA,QAE9B,YAAY;AAAA,QACZ,WAAW;AAAA,MAAA;AAAA,MAEZ,OAAO;AAAA,QACN;AAAA,UACC,MAAM;AAAA,YACL,UAAU;AAAA,YACV,UAAU;AAAA,YACV,MAAM;AAAA,cACL,GAAG,EAAE,OAAO,IAAI,MAAM,KAAA;AAAA,cACtB,GAAG,EAAE,OAAO,IAAI,MAAM,KAAA;AAAA,YAAK;AAAA,UAC5B;AAAA,UAED,QAAQyB;AAAA,QAAA;AAAA,MACT;AAAA,IACD;AAAA,EACD;AAAA,EAED,SAAS,CAACT,IAAiBvlB,IAAcqkB,IAAenhB,EAAU;AACnE;"}
1
+ {"version":3,"file":"paperSettingsWidget-d93s3Gsr.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>(({ id, props, value, onChange, readOnly, mode, ariaLabel }, ref) => {\n\tconst selectRef = useRef<HTMLSelectElement>(null);\n\tuseImperativeHandle(\n\t\tref,\n\t\t() => ({ focus: () => selectRef.current?.focus() }),\n\t\t[],\n\t);\n\n\tconst isDisabled = readOnly || mode === NoteMode.VIEW;\n\n\tconst containerStyle = useMemo((): CSSProperties => {\n\t\tconst css: CSSProperties = {\n\t\t\twidth: \"100%\",\n\t\t\theight: \"100%\",\n\t\t\tposition: \"relative\",\n\t\t\tdisplay: \"flex\",\n\t\t\talignItems: V_ALIGN_CSS[props.vertical ?? VerticalAlign.center],\n\t\t\tboxSizing: \"border-box\",\n\t\t\toverflow: \"hidden\",\n\t\t};\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\t\treturn css;\n\t}, [props]);\n\n\tconst selectedOption = (props.selectConfig?.options ?? []).find(\n\t\t(o) => o.value === value,\n\t);\n\tconst selectedColor = selectedOption?.color;\n\tconst bgColor =\n\t\tselectedColor && isValidCssColor(selectedColor) ? selectedColor : undefined;\n\n\tconst selectStyle = useMemo((): CSSProperties => {\n\t\tconst css: CSSProperties = {\n\t\t\tappearance: \"none\",\n\t\t\tWebkitAppearance: \"none\",\n\t\t\tbackground: bgColor ?? \"transparent\",\n\t\t\tborder: \"none\",\n\t\t\toutline: \"none\",\n\t\t\twidth: \"100%\",\n\t\t\theight: \"auto\",\n\t\t\tpadding: \"0 20px 0 4px\",\n\t\t\tboxSizing: \"border-box\",\n\t\t\tcursor: isDisabled ? \"default\" : \"pointer\",\n\t\t\ttextAlign: H_ALIGN_TEXT[props.horizontal ?? HorizontalAlign.left],\n\t\t};\n\t\tif (props.fontFamily) css.fontFamily = props.fontFamily;\n\t\tif (props.fontSize) css.fontSize = `${toPx.fromDim(props.fontSize)}px`;\n\t\tif (props.color) css.color = props.color;\n\t\tcss.fontWeight = props.fontWeight ? \"bold\" : \"normal\";\n\t\tcss.fontStyle = props.italic ? \"italic\" : \"normal\";\n\t\tconst dec: string[] = [];\n\t\tif (props.underline) dec.push(\"underline\");\n\t\tif (props.lineThrough) dec.push(\"line-through\");\n\t\tif (dec.length > 0) css.textDecoration = dec.join(\" \");\n\t\treturn css;\n\t}, [props, bgColor, isDisabled]);\n\n\tconst arrowStyle: CSSProperties = {\n\t\tposition: \"absolute\",\n\t\tright: 6,\n\t\ttop: \"50%\",\n\t\ttransform: \"translateY(-50%)\",\n\t\twidth: 0,\n\t\theight: 0,\n\t\tborderLeft: \"5px solid transparent\",\n\t\tborderRight: \"5px solid transparent\",\n\t\tborderTop: `5px solid ${isDisabled ? \"#aaa\" : \"#555\"}`,\n\t\tpointerEvents: \"none\",\n\t};\n\n\tconst handleChange = (e: React.ChangeEvent<HTMLSelectElement>) => {\n\t\tconst newValue = e.target.value === \"\" ? null : e.target.value;\n\t\tonChange(newValue);\n\t};\n\n\t// パディング領域などのコンテナ空白部分をクリックしたときもドロップダウンを開く\n\tconst handleContainerClick = (e: React.MouseEvent<HTMLDivElement>) => {\n\t\tif (!isDisabled && e.target !== selectRef.current) {\n\t\t\tselectRef.current?.showPicker?.();\n\t\t}\n\t};\n\n\tconst handleContainerKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n\t\tif (!isDisabled && (e.key === \"Enter\" || e.key === \" \")) {\n\t\t\te.preventDefault();\n\t\t\tselectRef.current?.showPicker?.();\n\t\t}\n\t};\n\n\tif (mode === NoteMode.VIEW) {\n\t\tconst label =\n\t\t\tselectedOption?.label ??\n\t\t\t(value != null ? String(value) : (props.placeholder ?? \"\"));\n\t\tconst viewStyle: CSSProperties = {\n\t\t\t...selectStyle,\n\t\t\theight: \"auto\",\n\t\t\tpadding: \"0 4px\",\n\t\t};\n\t\treturn (\n\t\t\t<div style={containerStyle}>\n\t\t\t\t<div style={viewStyle}>{label}</div>\n\t\t\t</div>\n\t\t);\n\t}\n\n\t// <label> ラッパーは使わず、コンテナ onClick + showPicker でパディング領域のクリックも対応する\n\tconst inner = (\n\t\t<>\n\t\t\t<select\n\t\t\t\tref={selectRef}\n\t\t\t\tid={id}\n\t\t\t\tvalue={value ?? \"\"}\n\t\t\t\tonChange={handleChange}\n\t\t\t\tdisabled={isDisabled}\n\t\t\t\tstyle={selectStyle}\n\t\t\t\taria-label={ariaLabel}\n\t\t\t>\n\t\t\t\t{props.placeholder !== undefined &&\n\t\t\t\t\t!props.required &&\n\t\t\t\t\tprops.selectConfig?.allowEmpty !== false && (\n\t\t\t\t\t\t<option value=\"\">{props.placeholder}</option>\n\t\t\t\t\t)}\n\t\t\t\t{(props.selectConfig?.options ?? []).map((opt) => {\n\t\t\t\t\tconst optBg =\n\t\t\t\t\t\topt.color && isValidCssColor(opt.color) ? opt.color : undefined;\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<option\n\t\t\t\t\t\t\tkey={opt.value}\n\t\t\t\t\t\t\tvalue={opt.value}\n\t\t\t\t\t\t\tstyle={optBg ? { backgroundColor: optBg } : undefined}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{opt.label}\n\t\t\t\t\t\t</option>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</select>\n\t\t\t<div style={arrowStyle} aria-hidden=\"true\" />\n\t\t</>\n\t);\n\n\tif (isDisabled) {\n\t\treturn <div style={containerStyle}>{inner}</div>;\n\t}\n\treturn (\n\t\t<div\n\t\t\tstyle={containerStyle}\n\t\t\trole=\"none\"\n\t\t\tonClick={handleContainerClick}\n\t\t\tonKeyDown={handleContainerKeyDown}\n\t\t>\n\t\t\t{inner}\n\t\t</div>\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\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}: 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};\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/>\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 { 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}}\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\";\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}}\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 { 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}}\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 { 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 style={style} className={className}>\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 style={style} className={className}>\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 style={style} className={className}>\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","selectRef","isDisabled","NoteMode","selectedOption","o","selectedColor","bgColor","selectStyle","dec","arrowStyle","handleChange","newValue","handleContainerClick","_b","handleContainerKeyDown","label","viewStyle","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","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","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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"}