@tatamicks/core 1.0.2 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/dist/PalettePanel-BTB1LkgU.cjs +9 -0
  2. package/dist/PalettePanel-BTB1LkgU.cjs.map +1 -0
  3. package/dist/{PalettePanel-Cigl9i1N.js → PalettePanel-CrA2BGLq.js} +961 -959
  4. package/dist/PalettePanel-CrA2BGLq.js.map +1 -0
  5. package/dist/PalettePanel.css +1 -1
  6. package/dist/canvas.cjs +1 -1
  7. package/dist/canvas.mjs +4 -4
  8. package/dist/index.cjs +2 -2
  9. package/dist/index.cjs.map +1 -1
  10. package/dist/index.css +1 -1
  11. package/dist/index.mjs +352 -343
  12. package/dist/index.mjs.map +1 -1
  13. package/dist/{paperSettingsWidget-DvtghSA5.js → paperSettingsWidget-CAIw_Ofm.js} +1582 -1535
  14. package/dist/paperSettingsWidget-CAIw_Ofm.js.map +1 -0
  15. package/dist/paperSettingsWidget-CIRKgnz4.cjs +2 -0
  16. package/dist/paperSettingsWidget-CIRKgnz4.cjs.map +1 -0
  17. package/dist/shell.cjs +1 -1
  18. package/dist/shell.mjs +2 -2
  19. package/dist/sidebarPortal-Bigm11qq.js +880 -0
  20. package/dist/sidebarPortal-Bigm11qq.js.map +1 -0
  21. package/dist/sidebarPortal-Dit8f3sD.cjs +3 -0
  22. package/dist/sidebarPortal-Dit8f3sD.cjs.map +1 -0
  23. package/dist/src/canvas.d.ts +4 -0
  24. package/dist/src/index.d.ts +5 -3
  25. package/dist/src/shell.d.ts +3 -1
  26. package/package.json +1 -1
  27. package/dist/PalettePanel-BMZ6dfI3.cjs +0 -9
  28. package/dist/PalettePanel-BMZ6dfI3.cjs.map +0 -1
  29. package/dist/PalettePanel-Cigl9i1N.js.map +0 -1
  30. package/dist/paperSettingsWidget-7766a5Fe.cjs +0 -2
  31. package/dist/paperSettingsWidget-7766a5Fe.cjs.map +0 -1
  32. package/dist/paperSettingsWidget-DvtghSA5.js.map +0 -1
  33. package/dist/sidebarPortal-BN6FVwaF.js +0 -870
  34. package/dist/sidebarPortal-BN6FVwaF.js.map +0 -1
  35. package/dist/sidebarPortal-Cr-dLvA_.cjs +0 -3
  36. package/dist/sidebarPortal-Cr-dLvA_.cjs.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"sidebarPortal-BN6FVwaF.js","sources":["../src/plugin/properties/alignment.ts","../src/canvas/blocks/checkbox/props.ts","../src/utils/blockDrag/index.ts","../src/types/grid.ts","../src/types/paper.ts","../src/utils/zIndex/constants.ts","../src/utils/convert/index.ts","../src/utils/migration/index.ts","../src/utils/values/index.ts","../src/utils/schema/index.ts","../src/canvas/blocks/checkbox/visual.tsx","../src/types/line.ts","../src/types/mode.ts","../src/types/unit.ts","../src/canvas/blocks/text/props.ts","../src/contexts/history/mergeKeys.ts","../src/utils/grid/sparseGrid.ts","../src/canvas/layers/GridLayer/hooks/useExpandedGrid.ts","../src/canvas/layers/GridLayer/utils/distributeRemainder.ts","../src/canvas/layers/GridLayer/utils/findGridIndex.ts","../src/canvas/layers/GridLayer/utils/gridCalc.ts","../src/canvas/layers/GridLayer/hooks/useGridCalc.ts","../src/shell/bars/Sidebar/sidebarPortal.ts"],"sourcesContent":["import type { PropDef } from \"../types\";\n\n/**\n * ブロック内の水平配置。\n */\nexport enum HorizontalAlign {\n\tleft = \"left\",\n\tcenter = \"center\",\n\tright = \"right\",\n}\n\n/**\n * ブロック内の垂直配置。\n */\nexport enum VerticalAlign {\n\ttop = \"top\",\n\tcenter = \"center\",\n\tbottom = \"bottom\",\n}\n\n/**\n * ブロック内の水平・垂直配置を保持する Props。\n */\nexport interface AlignmentProps {\n\t/** 水平配置 */\n\thorizontal?: HorizontalAlign;\n\n\t/** 垂直配置 */\n\tvertical?: VerticalAlign;\n}\n\n/**\n * 配置プロパティの `PropDef`。\n *\n * @remarks\n * **Canvas** — ブロックプラグイン実装時に `plugin.props` へ追加する。\n */\nexport const alignmentProp = {\n\tkind: \"alignment\",\n\tdefaultProps: {\n\t\thorizontal: HorizontalAlign.left,\n\t\tvertical: VerticalAlign.center,\n\t},\n} satisfies PropDef;\n","import type { PropDef } from \"../../../plugin\";\nimport type { Dimension } from \"../../../types\";\n\n/**\n * チェックボックスの外観カスタマイズ設定。\n */\nexport interface CheckboxStyleConfig {\n\t/** チェックボックス全体のサイズ。 */\n\tcheckboxSize?: Dimension;\n\n\t/** 枠の太さ。 */\n\tborderWidth?: Dimension;\n\n\t/** 枠の色。 */\n\tborderColor?: string;\n\n\t/** チェックマークの線の太さ。 */\n\tcheckWidth?: Dimension;\n\n\t/** チェックマークの色。 */\n\tcheckColor?: string;\n\n\t/** 未チェック時の背景色。 */\n\tbackgroundColor?: string;\n\n\t/** チェック時の背景色。 */\n\tcheckedBackgroundColor?: string;\n}\n\n/**\n * チェックボックスの外観カスタマイズ props。\n */\nexport interface CheckboxStyleProps {\n\t/** 外観カスタマイズ設定。 */\n\tstyleConfig?: CheckboxStyleConfig;\n}\n\n/**\n * `checkboxStyle` prop 定義。チェックボックスの外観デフォルト値を含む。\n */\nexport const checkboxStyleProp = {\n\tkind: \"checkboxStyle\",\n\tdefaultProps: {\n\t\tstyleConfig: {\n\t\t\tcheckboxSize: { value: 16, unit: \"px\" },\n\t\t\tborderWidth: { value: 1, unit: \"px\" },\n\t\t\tborderColor: \"#000000\",\n\t\t\tcheckWidth: { value: 3.5, unit: \"px\" },\n\t\t\tcheckColor: \"#000000\",\n\t\t\tbackgroundColor: \"#ffffff\",\n\t\t\tcheckedBackgroundColor: \"#ffffff\",\n\t\t},\n\t},\n} satisfies PropDef;\n","import type React from \"react\";\n\n/**\n * ブロック挿入 DnD に使う MIME 型。\n *\n * `drop` イベントでのデータ取得に使う。\n *\n * `dragenter` 中は {@link getBlockDragKind} で kind を取得すること。\n */\nexport const BLOCK_DRAG_MIME = \"application/x-tatamicks-block\";\n\n/**\n * `dragenter` 中でも kind を解決できるよう、MIME 型名自体に kind を埋め込むためのプレフィックス。\n *\n * Chrome / Safari では `dragenter` 中に `dataTransfer.getData()` が空文字を返す(セキュリティ制約)。\n *\n * `dataTransfer.types` は読み取れるため、型名に kind を埋め込んで回避する。\n */\nexport const BLOCK_DRAG_KIND_PREFIX = \"application/x-tatamicks-block-kind-\";\n\n/**\n * ブロック挿入 DnD で `dataTransfer` に格納するデータ。\n */\nexport interface BlockDragData {\n\t/** 挿入するブロックの種別 ID。 */\n\tkind: string;\n\n\t/** デフォルトサイズ(グリッドセル数)。 */\n\tdefaultSize?: { w: number; h: number };\n}\n\n/**\n * ブロック挿入 DnD を開始する。\n *\n * `dragstart` イベントハンドラ内で呼ぶ。\n *\n * ドロップ先は自動的に `NoteForm` がハンドルする。\n *\n * @example\n * ```tsx\n * <div\n * draggable\n * onDragStart={(e) => startBlockDrag(e, plugin.kind, plugin.meta.defaultSize)}\n * >\n * {plugin.meta.displayName}\n * </div>\n * ```\n */\nexport function startBlockDrag(\n\te: React.DragEvent | DragEvent,\n\tkind: string,\n\tdefaultSize?: { w: number; h: number },\n): void {\n\tif (!e.dataTransfer) return;\n\tconst data: BlockDragData = { kind, defaultSize };\n\te.dataTransfer.setData(BLOCK_DRAG_MIME, JSON.stringify(data));\n\t// dragenter 中も kind を解決できるよう MIME 型名に埋め込む\n\te.dataTransfer.setData(`${BLOCK_DRAG_KIND_PREFIX}${kind}`, \"\");\n\te.dataTransfer.effectAllowed = \"copy\";\n}\n\n/**\n * `drop` イベントからブロック挿入データを取り出す。\n *\n * ブロック DnD でない場合は `null` を返す。\n *\n * `dragenter` / `dragover` 内では {@link getBlockDragKind} を使うこと。\n */\nexport function getBlockDragData(\n\te: React.DragEvent | DragEvent,\n): BlockDragData | null {\n\tif (!e.dataTransfer) return null;\n\tconst raw = e.dataTransfer.getData(BLOCK_DRAG_MIME);\n\tif (!raw) return null;\n\ttry {\n\t\treturn JSON.parse(raw) as BlockDragData;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * `dragenter` / `dragover` イベントから挿入先ブロックの kind を取得する。\n *\n * Chrome / Safari では `dragenter` 中の `getData()` がセキュリティ制約で空文字を返すため、\n * MIME 型名に埋め込まれた kind を `types` 配列から解決する。\n *\n * ブロック DnD でない場合は `null` を返す。\n */\nexport function getBlockDragKind(\n\te: React.DragEvent | DragEvent,\n): string | null {\n\tif (!e.dataTransfer) return null;\n\tconst kindType = Array.from(e.dataTransfer.types).find((t) =>\n\t\tt.startsWith(BLOCK_DRAG_KIND_PREFIX),\n\t);\n\treturn kindType ? kindType.slice(BLOCK_DRAG_KIND_PREFIX.length) : null;\n}\n","import type { Dimension, GridUnit } from \"./unit\";\n\n/**\n * ページのグリッド定義。\n *\n * @remarks\n * `cols` / `rows` を省略した列/行は全て 1fr 等分割として扱われる。\n */\nexport interface Grid {\n\t/** 列数 */\n\tcolCount: number;\n\n\t/** 行数 */\n\trowCount: number;\n\n\t/** 列のサイズ定義マップ(インデックス → Dimension)。省略時は全列 1fr。 */\n\tcols?: Record<number, Dimension<GridUnit>>;\n\n\t/** 行のサイズ定義マップ(インデックス → Dimension)。省略時は全行 1fr。 */\n\trows?: Record<number, Dimension<GridUnit>>;\n}\n\n/**\n * デフォルトグリッド。A4 縦置き時にセルがほぼ正方形になるよう、\n * 列数 20・行数 28 に設定。\n */\nexport const DEFAULT_GRID: Grid = {\n\tcolCount: 20,\n\trowCount: 28,\n};\n","import type { Dimension, PaperUnit } from \"./unit\";\n\n/**\n * 用紙サイズのプリセット種別。`CUSTOM` 選択時は `PaperSize.width` / `height` が有効になる。\n */\nexport enum PaperSizePreset {\n\tA4 = \"A4\",\n\tB5 = \"B5\",\n\tA3 = \"A3\",\n\tLETTER = \"Letter\",\n\tLEGAL = \"Legal\",\n\tCUSTOM = \"Custom\",\n}\n\n/**\n * 用紙サイズ設定。\n *\n * @remarks\n * `preset` が `CUSTOM` 以外の場合も `width` / `height` には実寸が格納される。\n */\nexport interface PaperSize {\n\t/** 選択中のプリセット */\n\tpreset: PaperSizePreset;\n\n\t/** 幅(物理単位)。`CUSTOM` 時はユーザー指定値。 */\n\twidth: Dimension<PaperUnit>;\n\n\t/** 高さ(物理単位)。`CUSTOM` 時はユーザー指定値。 */\n\theight: Dimension<PaperUnit>;\n}\n\n/**\n * 各プリセットのデフォルト寸法定義。\n */\nexport const DEFAULT_PAPER_SIZES: Record<PaperSizePreset, PaperSize> = {\n\t[PaperSizePreset.A4]: {\n\t\tpreset: PaperSizePreset.A4,\n\t\twidth: { value: 210, unit: \"mm\" },\n\t\theight: { value: 297, unit: \"mm\" },\n\t},\n\t[PaperSizePreset.A3]: {\n\t\tpreset: PaperSizePreset.A3,\n\t\twidth: { value: 297, unit: \"mm\" },\n\t\theight: { value: 420, unit: \"mm\" },\n\t},\n\t[PaperSizePreset.B5]: {\n\t\tpreset: PaperSizePreset.B5,\n\t\twidth: { value: 182, unit: \"mm\" },\n\t\theight: { value: 257, unit: \"mm\" },\n\t},\n\t[PaperSizePreset.LETTER]: {\n\t\tpreset: PaperSizePreset.LETTER,\n\t\twidth: { value: 8.5, unit: \"inch\" },\n\t\theight: { value: 11, unit: \"inch\" },\n\t},\n\t[PaperSizePreset.LEGAL]: {\n\t\tpreset: PaperSizePreset.LEGAL,\n\t\twidth: { value: 8.5, unit: \"inch\" },\n\t\theight: { value: 14, unit: \"inch\" },\n\t},\n\t[PaperSizePreset.CUSTOM]: {\n\t\tpreset: PaperSizePreset.CUSTOM,\n\t\twidth: { value: 210, unit: \"mm\" },\n\t\theight: { value: 297, unit: \"mm\" },\n\t},\n};\n\n/**\n * 用紙四辺のマージン設定。\n */\nexport interface PaperMargin {\n\ttop: Dimension<PaperUnit>;\n\tright: Dimension<PaperUnit>;\n\tbottom: Dimension<PaperUnit>;\n\tleft: Dimension<PaperUnit>;\n\n\t/**\n\t * 一括編集フラグ。`true` のとき、`all` フィールドが四辺の共通値として使われる。\n\t *\n\t * Book に保存されるため、通常の binding パス `margin.bulk` で読み書きできる。\n\t */\n\tbulk?: boolean;\n\n\t/**\n\t * 一括モード時の四辺共通マージン値。`bulk` が `true` のときのみ描画・印刷に使用される。\n\t *\n\t * binding パス `margin.all.value` / `margin.all.unit` で読み書きできる。\n\t */\n\tall?: Dimension<PaperUnit>;\n}\n\n/**\n * デフォルトマージン。四辺すべて 10 mm。\n */\nexport const DEFAULT_PAPER_MARGIN: PaperMargin = {\n\ttop: { value: 10, unit: \"mm\" },\n\tright: { value: 10, unit: \"mm\" },\n\tbottom: { value: 10, unit: \"mm\" },\n\tleft: { value: 10, unit: \"mm\" },\n};\n\n/**\n * ページに適用する用紙設定(サイズ・マージン・向き)。\n */\nexport interface Paper {\n\t/** 用紙サイズ */\n\tsize: PaperSize;\n\n\t/** 用紙マージン */\n\tmargin: PaperMargin;\n\n\t/** 用紙の向き。true = 横向き (landscape)、省略/false = 縦向き (portrait) */\n\torientation?: boolean;\n\n\t/**\n\t * 幅自動リサイズ。\n\t *\n\t * `true` のとき、`widthFit` ブロックの実測幅に合わせてキャンバス幅を広げる。\n\t */\n\tautoWidth?: boolean;\n\n\t/**\n\t * 高さ自動リサイズ。\n\t *\n\t * `true` のとき、`heightFit` ブロックの実測高さに合わせてキャンバス高さを広げる。\n\t */\n\tautoHeight?: boolean;\n}\n\n/**\n * デフォルト用紙設定(A4 縦置き、マージン四辺 10 mm)。\n */\nexport const DEFAULT_PAPER: Paper = {\n\tsize: DEFAULT_PAPER_SIZES[PaperSizePreset.A4],\n\tmargin: DEFAULT_PAPER_MARGIN,\n};\n","/**\n * アプリケーション全体の z-index 層構成定義。\n *\n * GridLayer (10–90)、BlockLayer (100–999,999)、ErrorLayer (1,000,000–)、\n * InteractionLayer (2,000,000–)、Application UI (3,000,000–)の層に分かれている。\n */\nexport const Z_INDEX = {\n\t// ==================== GridLayer (10-90) ====================\n\tGRID_CANVAS: 10,\n\tMARGIN_OVERLAY: 20,\n\tGRID_OVERLAY: 30,\n\tBORDER_OVERLAY: 40,\n\n\t// ==================== BlockLayer (100-999,999) ====================\n\tBLOCK_LAYER_MIN: 100,\n\tBLOCK_LAYER_MAX: 999999,\n\tBLOCK_LAYER_STEP: 100,\n\n\t// ==================== ErrorLayer (1,000,000-1,999,999) ====================\n\tERROR_BORDER: 1100000,\n\tERROR_TOOLTIP: 1200000,\n\tERROR_HIGHLIGHT: 1300000,\n\n\t// ==================== InteractionLayer (2,000,000+) ====================\n\tSELECT_BLOCK: 2000000,\n\tINTERACTION_LAYER_BASE: 2100000,\n\tBLOCK_GHOST: 2200000,\n\tHOVER_OUTLINE: 2300000,\n\tEDIT_BLOCK: 2400000,\n\tBLOCK_SELECT_BORDER: 2500000,\n\tBLOCK_HANDLES: 2600000,\n\tSELECTION_ACTION_BAR: 2650000,\n\tGRID_GHOST: 2700000,\n\tGRID_HANDLES: 2800000,\n\tRUBBER_BAND: 2900000,\n\n\t// ==================== Application UI (3,000,000+) ====================\n\tPROPERTY_PANEL: 3100000,\n\tPALETTE: 3200000,\n\tTOOLTIP: 3300000,\n\tDROPDOWN: 3400000,\n\tCONTEXT_MENU: 3500000,\n\tMODAL: 3600000,\n\n\t// ==================== Debug (10,000,000) ====================\n\tDEBUG: 10000000,\n} as const;\n\n/**\n * 各ブロック内のサブインデックス定義。\n *\n * `getBlockZIndex` が返すベース値に加算し、ブロック内の要素(背景・コンテンツ・ボーダー等)の重ね履き順序を制御する。\n */\nexport const BLOCK_SUB_INDEX = {\n\tBG: 10,\n\tCONTENT: 50,\n\tGUIDE: 70,\n\tBORDER: 80,\n\tVALIDATION: 90,\n} as const;\n\n/** {@link Z_INDEX} の各層値を表す型。 */\nexport type ZIndexValue = (typeof Z_INDEX)[keyof typeof Z_INDEX];\n\n/** {@link BLOCK_SUB_INDEX} の各値を表す型。 */\nexport type BlockSubIndexValue =\n\t(typeof BLOCK_SUB_INDEX)[keyof typeof BLOCK_SUB_INDEX];\n","import type { Dimension, Unit } from \"../../types\";\n\n/**\n * 寸法文字列(例: `\"210mm\"`)を {@link Dimension} オブジェクトに変換する。\n *\n * @throws {@link Error} 文字列が `<数値><単位>` の形式でない場合、または単位が `allowedUnits` 外の場合\n */\nexport function stringToDimension<U extends Unit>(\n\tstr: string,\n\tallowedUnits: readonly U[],\n): Dimension<U> {\n\tconst match = str.match(/^(\\d+(?:\\.\\d+)?)([a-zA-Z%]+)$/);\n\tif (!match) {\n\t\tthrow new Error(`Invalid dimension string: ${str}`);\n\t}\n\n\tconst value = Number(match[1]);\n\tconst unit = match[2] as U;\n\n\tif (!allowedUnits.includes(unit)) {\n\t\tthrow new Error(`Invalid unit: ${unit}`);\n\t}\n\n\treturn { value, unit };\n}\n\n/**\n * {@link Dimension} オブジェクトを寸法文字列(例: `\"210mm\"`)に変換する。\n */\nexport function dimensionToString<U extends Unit>(dim: Dimension<U>): string {\n\treturn `${dim.value}${dim.unit}`;\n}\n\n/**\n * デフォルトの DPI 値。\n *\n * CSS の基準解像度である 96dpi を採用している。\n */\nexport const DEFAULT_DPI = 96;\n\n// mm単位変換の定数\nconst CM_TO_MM = 10;\nconst INCH_TO_MM = 25.4;\nconst PT_TO_MM = 0.352778;\nconst PX_TO_MM = INCH_TO_MM / DEFAULT_DPI; // 25.4 / 96 ≈ 0.264583(DPI=96固定)\n\n/**\n * 各種単位の値を mm に変換するユーティリティオブジェクト。\n *\n * `fr` と `%` のような相対単位は物理長に変換できないため、`fromDim` でこれらを指定すると `Error` をスローする。\n */\nexport const toMm = {\n\tfromCm: (cm: number): number => cm * CM_TO_MM,\n\tfromInch: (inch: number): number => inch * INCH_TO_MM,\n\tfromPt: (pt: number): number => pt * PT_TO_MM,\n\tfromPx: (px: number): number => px * PX_TO_MM,\n\tfromDim<U extends Unit>(dim: Dimension<U>): number {\n\t\tswitch (dim.unit) {\n\t\t\tcase \"mm\":\n\t\t\t\treturn dim.value;\n\t\t\tcase \"cm\":\n\t\t\t\treturn toMm.fromCm(dim.value);\n\t\t\tcase \"inch\":\n\t\t\t\treturn toMm.fromInch(dim.value);\n\t\t\tcase \"pt\":\n\t\t\t\treturn toMm.fromPt(dim.value);\n\t\t\tcase \"px\":\n\t\t\t\treturn toMm.fromPx(dim.value);\n\t\t\tcase \"fr\":\n\t\t\tcase \"%\":\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Cannot convert ${dim.unit} to mm. Use physical units only.`,\n\t\t\t\t);\n\t\t\tdefault: {\n\t\t\t\tconst _exhaustive: never = dim.unit;\n\t\t\t\tthrow new Error(`Unsupported unit: ${_exhaustive}`);\n\t\t\t}\n\t\t}\n\t},\n};\n\n// inch単位変換の定数\nconst MM_PER_INCH = 25.4;\nconst CM_PER_INCH = 2.54;\nconst PT_PER_INCH = 72;\n\n/**\n * 各種単位の値を px に変換するユーティリティオブジェクト。\n *\n * `%` を変換する際は `fromDim` の `baseSizePx` が必要。`fr` の変換はサポートしていないため `Error` をスローする。\n */\nexport const toPx = {\n\tfromMm: (mm: number, dpi: number = DEFAULT_DPI): number =>\n\t\t(mm * dpi) / MM_PER_INCH,\n\tfromCm: (cm: number, dpi: number = DEFAULT_DPI): number =>\n\t\t(cm * dpi) / CM_PER_INCH,\n\tfromInch: (inch: number, dpi: number = DEFAULT_DPI): number => inch * dpi,\n\tfromPt: (pt: number, dpi: number = DEFAULT_DPI): number =>\n\t\t(pt * dpi) / PT_PER_INCH,\n\t// CSS px(96dpi 基準)を指定 DPI のスクリーン物理 px に変換\n\tfromPx: (px: number, dpi: number = DEFAULT_DPI): number =>\n\t\t(px * dpi) / DEFAULT_DPI,\n\tfromDim<U extends Unit>(\n\t\tdim: Dimension<U>,\n\t\tdpi: number = DEFAULT_DPI,\n\t\tbaseSizePx?: number,\n\t): number {\n\t\tswitch (dim.unit) {\n\t\t\tcase \"mm\":\n\t\t\t\treturn toPx.fromMm(dim.value, dpi);\n\t\t\tcase \"cm\":\n\t\t\t\treturn toPx.fromCm(dim.value, dpi);\n\t\t\tcase \"inch\":\n\t\t\t\treturn toPx.fromInch(dim.value, dpi);\n\t\t\tcase \"pt\":\n\t\t\t\treturn toPx.fromPt(dim.value, dpi);\n\t\t\tcase \"px\":\n\t\t\t\treturn toPx.fromPx(dim.value, dpi);\n\t\t\tcase \"%\":\n\t\t\t\tif (baseSizePx === undefined) {\n\t\t\t\t\tthrow new Error(`Base size must be defined for percentage values.`);\n\t\t\t\t}\n\t\t\t\treturn (dim.value / 100) * baseSizePx;\n\t\t\tcase \"fr\":\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Cannot convert ${dim.unit} to px. Use physical units only.`,\n\t\t\t\t);\n\t\t\tdefault: {\n\t\t\t\tconst _exhaustive: never = dim.unit;\n\t\t\t\tthrow new Error(`Unsupported unit: ${_exhaustive}`);\n\t\t\t}\n\t\t}\n\t},\n};\n","import type { Block } from \"../../types/block\";\nimport type { Grid } from \"../../types/grid\";\nimport type { Paper } from \"../../types/paper\";\nimport type { BlockDefaults, Book, Page } from \"../../types/schema\";\nimport type { Dimension, GridUnit } from \"../../types/unit\";\nimport type { Value } from \"../../types/value\";\n\n// ---------------------------------------------------------------------------\n// プラグインレジストリの最小型\n// ---------------------------------------------------------------------------\n\n/**\n * マイグレーション用のプラグインレジストリ型。\n *\n * 各プラグインは `migrateProps` を任意に実装でき、旧プロパティ形式を現形式に変換する契約を持つ。\n */\nexport type MigrationPluginRegistry = Record<\n\tstring,\n\t{ migrateProps?: (props: unknown) => Record<string, unknown> }\n>;\n\n// ---------------------------------------------------------------------------\n// Alignment 変換マップ\n// ---------------------------------------------------------------------------\n\nconst H_ALIGN_MAP: Record<string, string> = {\n\t\"flex-start\": \"left\",\n\tcenter: \"center\",\n\t\"flex-end\": \"right\",\n};\n\nconst V_ALIGN_MAP: Record<string, string> = {\n\t\"flex-start\": \"top\",\n\tcenter: \"center\",\n\t\"flex-end\": \"bottom\",\n};\n\n// ---------------------------------------------------------------------------\n// 内部ヘルパー\n// ---------------------------------------------------------------------------\n\n// ディメンションがデフォルト値(1fr)かどうかを判定する\nfunction isDefaultDim(d: unknown): boolean {\n\treturn (\n\t\ttypeof d === \"object\" &&\n\t\td !== null &&\n\t\t(d as Dimension<GridUnit>).value === 1 &&\n\t\t(d as Dimension<GridUnit>).unit === \"fr\"\n\t);\n}\n\n// ディメンション配列をスパースインデックス形式に変換する\nfunction arrayToSparse(\n\tdims: Dimension<GridUnit>[],\n): Record<number, Dimension<GridUnit>> {\n\tconst sparse: Record<number, Dimension<GridUnit>> = {};\n\tfor (let i = 0; i < dims.length; i++) {\n\t\tconst dim = dims[i];\n\t\tif (dim !== undefined && !isDefaultDim(dim)) {\n\t\t\tsparse[i] = dim;\n\t\t}\n\t}\n\treturn sparse;\n}\n\n// 旧配列形式の grid をスパース形式(Grid 型)に移行する\nfunction migrateGrid(grid: unknown): Grid {\n\tif (typeof grid !== \"object\" || grid === null) {\n\t\tthrow new Error(\"grid must be an object\");\n\t}\n\tconst g = grid as Record<string, unknown>;\n\n\t// 旧配列形式: { cols: [...], rows: [...] }\n\tif (Array.isArray(g.cols) && Array.isArray(g.rows)) {\n\t\tconst colsArr = g.cols as Dimension<GridUnit>[];\n\t\tconst rowsArr = g.rows as Dimension<GridUnit>[];\n\n\t\tconst result: Grid = {\n\t\t\tcolCount: colsArr.length,\n\t\t\trowCount: rowsArr.length,\n\t\t};\n\n\t\tconst sparseCols = arrayToSparse(colsArr);\n\t\tif (Object.keys(sparseCols).length > 0) {\n\t\t\tresult.cols = sparseCols;\n\t\t}\n\n\t\tconst sparseRows = arrayToSparse(rowsArr);\n\t\tif (Object.keys(sparseRows).length > 0) {\n\t\t\tresult.rows = sparseRows;\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t// 新形式(Grid): そのまま返す\n\treturn grid as Grid;\n}\n\n// 旧形式(all / isIndividual)の padding プロパティを現形式(top / right / bottom / left)に変換する\nfunction migratePadding(\n\tprops: Record<string, unknown>,\n): Record<string, unknown> {\n\t// `isIndividual` キーが存在する場合のみ旧形式とみなす\n\t// 新形式は `bulk` キーを使用するため、`all` のみ存在する場合は変換しない\n\tif (!(\"isIndividual\" in props)) {\n\t\treturn props;\n\t}\n\n\tconst result = { ...props };\n\tconst isIndividual = result.isIndividual ?? true;\n\tconst allVal = result.all;\n\tdelete result.isIndividual;\n\tdelete result.all;\n\n\tif (!isIndividual && allVal !== undefined) {\n\t\tif (!(\"top\" in result)) result.top = allVal;\n\t\tif (!(\"right\" in result)) result.right = allVal;\n\t\tif (!(\"bottom\" in result)) result.bottom = allVal;\n\t\tif (!(\"left\" in result)) result.left = allVal;\n\t}\n\n\treturn result;\n}\n\n// 旧形式(justifyContent / alignItems)の配置プロパティを現形式(horizontal / vertical)に変換する\nfunction migrateAlignment(\n\tprops: Record<string, unknown>,\n): Record<string, unknown> {\n\tconst result = { ...props };\n\n\tif (\"justifyContent\" in result) {\n\t\tconst oldVal = result.justifyContent as string;\n\t\tresult.horizontal = H_ALIGN_MAP[oldVal] ?? oldVal;\n\t\tdelete result.justifyContent;\n\t}\n\n\tif (\"alignItems\" in result) {\n\t\tconst oldVal = result.alignItems as string;\n\t\tresult.vertical = V_ALIGN_MAP[oldVal] ?? oldVal;\n\t\tdelete result.alignItems;\n\t}\n\n\treturn result;\n}\n\n// 1ブロックの props に padding ・ alignment の移行を適用する\nfunction migrateBlockProps(props: unknown): Record<string, unknown> {\n\tif (typeof props !== \"object\" || props === null) {\n\t\treturn props as Record<string, unknown>;\n\t}\n\tlet result = { ...(props as Record<string, unknown>) };\n\tresult = migratePadding(result);\n\tresult = migrateAlignment(result);\n\treturn result;\n}\n\n// 1ページ分のデータにグリッド・ブロックの移行を適用し、Page 型として返す\nexport function migratePage(\n\tpage: unknown,\n\tregistry?: MigrationPluginRegistry,\n): Page {\n\tif (typeof page !== \"object\" || page === null) {\n\t\tthrow new Error(\"page must be an object\");\n\t}\n\tconst p = { ...(page as Record<string, unknown>) };\n\n\tif (\"grid\" in p) {\n\t\tp.grid = migrateGrid(p.grid);\n\t}\n\n\tif (Array.isArray(p.blocks)) {\n\t\tp.blocks = p.blocks.map((block: unknown) => {\n\t\t\tif (typeof block === \"object\" && block !== null) {\n\t\t\t\tconst b = { ...(block as Record<string, unknown>) };\n\t\t\t\tif (\"props\" in b) {\n\t\t\t\t\tb.props = migrateBlockProps(b.props);\n\t\t\t\t}\n\t\t\t\tconst kind = typeof b.kind === \"string\" ? b.kind : undefined;\n\t\t\t\tif (kind && registry) {\n\t\t\t\t\tconst plugin = registry[kind];\n\t\t\t\t\tif (plugin?.migrateProps) {\n\t\t\t\t\t\tb.props = plugin.migrateProps(b.props);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn b;\n\t\t\t}\n\t\t\treturn block;\n\t\t});\n\t}\n\n\treturn {\n\t\tgrid: p.grid as Grid,\n\t\tblocks: p.blocks as Block[],\n\t\t...(p.blockDefaults !== undefined\n\t\t\t? { blockDefaults: p.blockDefaults as BlockDefaults }\n\t\t\t: {}),\n\t\t...(p.metaData !== undefined\n\t\t\t? { metaData: p.metaData as Record<string, Value> }\n\t\t\t: {}),\n\t};\n}\n\n// ---------------------------------------------------------------------------\n// 公開関数\n// ---------------------------------------------------------------------------\n\n/**\n * 旧 FormSchema 形式かどうかを判定する(`grid` + `blocks` がトップレベル、`pages` なし)。\n */\nexport function isLegacyFormSchema(data: unknown): boolean {\n\treturn (\n\t\ttypeof data === \"object\" &&\n\t\tdata !== null &&\n\t\t!(\"pages\" in data) &&\n\t\t\"grid\" in data &&\n\t\t\"blocks\" in data\n\t);\n}\n\n/**\n * Book 形式かどうかを判定する(`pages` がトップレベル)。\n */\nexport function isBook(data: unknown): boolean {\n\treturn typeof data === \"object\" && data !== null && \"pages\" in data;\n}\n\n/**\n * Book の全ページをデータ移行する(形式 B)。\n *\n * @throws {@link Error} `notebook` がオブジェクトでない場合\n */\nexport function migrateBook(\n\tnotebook: unknown,\n\tregistry?: MigrationPluginRegistry,\n): Book {\n\tif (typeof notebook !== \"object\" || notebook === null) {\n\t\tthrow new Error(\"Book must be a JSON object\");\n\t}\n\tconst nb = { ...(notebook as Record<string, unknown>) };\n\n\tif (Array.isArray(nb.pages)) {\n\t\tnb.pages = nb.pages.map((page) => migratePage(page, registry));\n\t}\n\n\treturn {\n\t\tpaper: nb.paper as Paper,\n\t\tpages: nb.pages as [Page, ...Page[]],\n\t\t...(nb.metaData !== undefined\n\t\t\t? { metaData: nb.metaData as Record<string, Value> }\n\t\t\t: {}),\n\t};\n}\n\n/**\n * 旧 FormSchema を Book 形式に構造変換する(形式 A)。\n *\n * @throws {@link Error} `schema` がオブジェクトでない場合\n */\nexport function migrateFormSchemaToBook(\n\tschema: unknown,\n\tregistry?: MigrationPluginRegistry,\n): Book {\n\tif (typeof schema !== \"object\" || schema === null) {\n\t\tthrow new Error(\"Schema must be a JSON object\");\n\t}\n\tconst source = { ...(schema as Record<string, unknown>) };\n\tconst page: Record<string, unknown> = {};\n\n\tif (\"grid\" in source) {\n\t\tpage.grid = migrateGrid(source.grid);\n\t\tdelete source.grid;\n\t}\n\n\tif (\"blocks\" in source) {\n\t\tconst blocks = source.blocks;\n\t\tif (Array.isArray(blocks)) {\n\t\t\tpage.blocks = blocks.map((block: unknown) => {\n\t\t\t\tif (typeof block === \"object\" && block !== null) {\n\t\t\t\t\tconst b = { ...(block as Record<string, unknown>) };\n\t\t\t\t\tif (\"props\" in b) {\n\t\t\t\t\t\tb.props = migrateBlockProps(b.props);\n\t\t\t\t\t}\n\t\t\t\t\tconst kind = typeof b.kind === \"string\" ? b.kind : undefined;\n\t\t\t\t\tif (kind && registry) {\n\t\t\t\t\t\tconst plugin = registry[kind];\n\t\t\t\t\t\tif (plugin?.migrateProps) {\n\t\t\t\t\t\t\tb.props = plugin.migrateProps(b.props);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn b;\n\t\t\t\t}\n\t\t\t\treturn block;\n\t\t\t});\n\t\t}\n\t\tdelete source.blocks;\n\t}\n\n\tif (\"metaData\" in source) {\n\t\tpage.metaData = source.metaData;\n\t\tdelete source.metaData;\n\t}\n\n\tconst notebook: Record<string, unknown> = {};\n\tif (\"paper\" in source) {\n\t\tnotebook.paper = source.paper;\n\t\tdelete source.paper;\n\t}\n\n\tconst migratedPage: Page = {\n\t\tgrid: page.grid as Grid,\n\t\tblocks: (page.blocks ?? []) as Block[],\n\t\t...(page.metaData !== undefined\n\t\t\t? { metaData: page.metaData as Record<string, Value> }\n\t\t\t: {}),\n\t};\n\n\treturn {\n\t\tpaper: notebook.paper as Paper,\n\t\tpages: [migratedPage],\n\t};\n}\n\n/**\n * 入力データの形式を自動判定し、適切な移行を実行する。\n *\n * - 旧 FormSchema(`grid` + `blocks` がトップレベル) → Book へ構造変換\n * - Book(`pages` がトップレベル) → 各ページのデータを移行\n *\n * @throws {@link Error} 入力データがいずれの形式にも該当しない場合\n */\nexport function migrate(\n\tdata: unknown,\n\tregistry?: MigrationPluginRegistry,\n): Book {\n\tif (isLegacyFormSchema(data)) {\n\t\treturn migrateFormSchemaToBook(data, registry);\n\t}\n\tif (isBook(data)) {\n\t\treturn migrateBook(data, registry);\n\t}\n\tthrow new Error(\n\t\t\"入力データの形式を判別できません。\\n\" +\n\t\t\t\" 形式 A(旧 FormSchema): トップレベルに 'grid' と 'blocks' が必要\\n\" +\n\t\t\t\" 形式 B(Book): トップレベルに 'pages' が必要\",\n\t);\n}\n","import type { Value } from \"../../types\";\n\n/**\n * 値が {@link Value} 型かどうかを判定する型ガード。\n *\n * `null`・プリミティブ(文字列・数値・ブールアン)・プレインオブジェクト・配列を再帰的に認め、\n * それ以外は `false` を返す。\n */\nexport function isValue(v: unknown): v is Value {\n\tif (v === null) return true;\n\tswitch (typeof v) {\n\t\tcase \"string\":\n\t\tcase \"number\":\n\t\tcase \"boolean\":\n\t\t\treturn true;\n\t\tcase \"object\":\n\t\t\tif (Array.isArray(v)) return v.every(isValue);\n\t\t\tif (Object.getPrototypeOf(v) === Object.prototype)\n\t\t\t\treturn Object.values(v as Record<string, unknown>).every(isValue);\n\t\t\treturn false;\n\t\tdefault:\n\t\t\treturn false;\n\t}\n}\n\n/**\n * 未検証の値を `Record<string, Value>` として検証する。\n *\n * @throws {@link Error} 値がプレインオブジェクトでない場合、またはいずれかのプロパティが無効な {@link Value} の場合\n */\nexport function validateValues(data: unknown): Record<string, Value> {\n\tif (\n\t\tdata === null ||\n\t\ttypeof data !== \"object\" ||\n\t\tArray.isArray(data) ||\n\t\tObject.getPrototypeOf(data) !== Object.prototype\n\t) {\n\t\tthrow new Error(\"values must be a plain object\");\n\t}\n\tconst obj = data as Record<string, unknown>;\n\tfor (const [key, val] of Object.entries(obj)) {\n\t\tif (!isValue(val)) {\n\t\t\tthrow new Error(`values[\"${key}\"] contains an invalid value`);\n\t\t}\n\t}\n\treturn obj as Record<string, Value>;\n}\n\n/**\n * JSON 文字列をパース・検証して `Record<string, Value>` を返す。\n *\n * @throws {@link SyntaxError} JSON が無効な場合\n * @throws {@link Error} 値が無効な {@link Value} を含む場合\n */\nexport function deserializeValues(json: string): Record<string, Value> {\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(json);\n\t} catch {\n\t\tthrow new SyntaxError(\"invalid JSON for values\");\n\t}\n\treturn validateValues(parsed);\n}\n","import { migrate } from \"../migration\";\nimport { isValue, validateValues } from \"../values\";\n\nimport type { Block } from \"../../types/block\";\nimport type { Grid } from \"../../types/grid\";\nimport type { Book, Page } from \"../../types/schema\";\n\n// Grid 型の形式チェック\nfunction isGrid(value: unknown): value is Grid {\n\tif (typeof value !== \"object\" || value === null) return false;\n\tconst obj = value as Record<string, unknown>;\n\tif (typeof obj.colCount !== \"number\" || obj.colCount < 1) return false;\n\tif (typeof obj.rowCount !== \"number\" || obj.rowCount < 1) return false;\n\treturn true;\n}\n\n// HiddenBinding 型の形式チェック\nfunction isHiddenBinding(value: unknown): boolean {\n\tif (typeof value === \"string\") return true;\n\tif (typeof value !== \"object\" || value === null) return false;\n\tconst obj = value as Record<string, unknown>;\n\tif (typeof obj.path !== \"string\") return false;\n\tconst hasPrimitive = (v: unknown) =>\n\t\tv === null ||\n\t\ttypeof v === \"string\" ||\n\t\ttypeof v === \"number\" ||\n\t\ttypeof v === \"boolean\";\n\tif (\"eq\" in obj) return hasPrimitive(obj.eq);\n\tif (\"neq\" in obj) return hasPrimitive(obj.neq);\n\treturn false;\n}\n\n// Block 型の形式チェック\nfunction isBlock(value: unknown): value is Block {\n\tif (typeof value !== \"object\" || value === null) return false;\n\tconst obj = value as Record<string, unknown>;\n\tif (typeof obj.id !== \"string\") return false;\n\tif (typeof obj.kind !== \"string\") return false;\n\tif (typeof obj.layout !== \"object\" || obj.layout === null) return false;\n\tconst layout = obj.layout as Record<string, unknown>;\n\tif (\n\t\ttypeof layout.x !== \"number\" ||\n\t\ttypeof layout.y !== \"number\" ||\n\t\ttypeof layout.w !== \"number\" ||\n\t\ttypeof layout.h !== \"number\"\n\t) {\n\t\treturn false;\n\t}\n\tif (\n\t\ttypeof obj.props !== \"object\" ||\n\t\tobj.props === null ||\n\t\tArray.isArray(obj.props)\n\t)\n\t\treturn false;\n\t// props の各値が Value 型(JSON serializable)か確認\n\ttry {\n\t\tvalidateValues(obj.props);\n\t} catch {\n\t\treturn false;\n\t}\n\t// initValue が指定されている場合は Value 型か確認\n\tif (\"initValue\" in obj && !isValue(obj.initValue)) return false;\n\t// hiddenBinding が指定されている場合は形式確認\n\tif (\"hiddenBinding\" in obj && !isHiddenBinding(obj.hiddenBinding))\n\t\treturn false;\n\treturn true;\n}\n\n/**\n * 未検証の値を {@link Page} として検証する。\n *\n * @throws {@link Error} ページの構造(`grid` / `blocks` / `metaData`)が不正な場合\n */\nexport function validatePage(value: unknown): Page {\n\tif (typeof value !== \"object\" || value === null) {\n\t\tthrow new Error(\"Page must be an object\");\n\t}\n\tconst obj = value as Record<string, unknown>;\n\n\tif (obj.id !== undefined && typeof obj.id !== \"string\") {\n\t\tthrow new Error(\"Page.id must be a string if provided\");\n\t}\n\n\tif (!isGrid(obj.grid)) {\n\t\tthrow new Error(\"Invalid grid definition\");\n\t}\n\n\tif (!Array.isArray(obj.blocks)) {\n\t\tthrow new Error(\"blocks must be an array\");\n\t}\n\tif (!obj.blocks.every(isBlock)) {\n\t\tthrow new Error(\"Invalid block definition in blocks array\");\n\t}\n\n\tif (obj.metaData !== undefined) {\n\t\tif (typeof obj.metaData !== \"object\" || obj.metaData === null) {\n\t\t\tthrow new Error(\"metaData must be an object if provided\");\n\t\t}\n\t\ttry {\n\t\t\tvalidateValues(obj.metaData);\n\t\t} catch (e) {\n\t\t\tthrow new Error(\n\t\t\t\t`Invalid metaData: ${e instanceof Error ? e.message : String(e)}`,\n\t\t\t);\n\t\t}\n\t}\n\n\tif (obj.blockDefaults !== undefined) {\n\t\tif (\n\t\t\ttypeof obj.blockDefaults !== \"object\" ||\n\t\t\tobj.blockDefaults === null ||\n\t\t\tArray.isArray(obj.blockDefaults)\n\t\t) {\n\t\t\tthrow new Error(\"blockDefaults must be a plain object if provided\");\n\t\t}\n\t\tconst bd = obj.blockDefaults as Record<string, unknown>;\n\t\tfor (const [kind, defaults] of Object.entries(bd)) {\n\t\t\ttry {\n\t\t\t\tvalidateValues(defaults);\n\t\t\t} catch (e) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Invalid blockDefaults[\"${kind}\"]: ${e instanceof Error ? e.message : String(e)}`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn value as Page;\n}\n\n/**\n * 未検証の値を {@link Book} として検証する。\n *\n * @throws {@link Error} `pages` が存在しないまたは空、各ページの構造が不正、`paper` が存在しない場合\n */\nexport function parseBook(value: unknown): Book {\n\tif (typeof value !== \"object\" || value === null) {\n\t\tthrow new Error(\"Book must be an object\");\n\t}\n\tconst obj = value as Record<string, unknown>;\n\n\tif (!Array.isArray(obj.pages) || obj.pages.length === 0) {\n\t\tthrow new Error(\"Book must have at least one page in pages\");\n\t}\n\tobj.pages.forEach((page: unknown, i: number) => {\n\t\ttry {\n\t\t\tvalidatePage(page);\n\t\t} catch (e) {\n\t\t\tthrow new Error(\n\t\t\t\t`Invalid Page at pages[${i}]: ${e instanceof Error ? e.message : String(e)}`,\n\t\t\t);\n\t\t}\n\t});\n\n\tif (!obj.paper || typeof obj.paper !== \"object\") {\n\t\tthrow new Error(\"Book.paper is required and must be an object\");\n\t}\n\n\treturn value as Book;\n}\n\n/**\n * {@link Page} を JSON 文字列にシリアライズする。\n */\nexport function serializePage(page: Page): string {\n\treturn JSON.stringify(page);\n}\n\n/**\n * {@link Book} を JSON 文字列にシリアライズする。\n */\nexport function serializeBook(book: Book): string {\n\treturn JSON.stringify(book);\n}\n\n/**\n * JSON 文字列をパース・検証して {@link Page} を返す。\n *\n * @throws {@link SyntaxError} JSON が無効な場合\n * @throws {@link Error} ページの構造が不正な場合\n */\nexport function deserializePage(json: string): Page {\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(json);\n\t} catch {\n\t\tthrow new SyntaxError(\"invalid JSON for Page\");\n\t}\n\treturn validatePage(parsed);\n}\n\n/**\n * JSON 文字列をパース・検証して {@link Book} を返す。\n *\n * @throws {@link SyntaxError} JSON が無効な場合\n * @throws {@link Error} Book の構造が不正な場合\n */\nexport function deserializeBook(json: string): Book {\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(json);\n\t} catch {\n\t\tthrow new SyntaxError(\"invalid JSON for Book\");\n\t}\n\treturn parseBook(migrate(parsed));\n}\n","import { toPx } from \"../../../utils\";\n\nimport type { CheckboxStyleConfig } from \"./props\";\n\n// ClassicCheckboxVisualProps: ClassicCheckboxVisual 内部 props\ninterface ClassicCheckboxVisualProps {\n\tchecked: boolean;\n\tstyleConfig?: CheckboxStyleConfig;\n}\n\n/**\n * チェックボックスの SVG ビジュアルコンポーネント(クラシックスタイル)。\n *\n * `styleConfig` の各フィールドが未指定の場合はデフォルト値で描画する。\n */\nexport function ClassicCheckboxVisual({\n\tchecked,\n\tstyleConfig,\n}: ClassicCheckboxVisualProps) {\n\tconst borderColor = styleConfig?.borderColor ?? \"#000000\";\n\tconst checkColor = styleConfig?.checkColor ?? \"#000000\";\n\tconst bg = checked\n\t\t? (styleConfig?.checkedBackgroundColor ?? \"#ffffff\")\n\t\t: (styleConfig?.backgroundColor ?? \"#ffffff\");\n\tconst borderWidth = styleConfig?.borderWidth\n\t\t? toPx.fromDim(styleConfig.borderWidth)\n\t\t: 1;\n\tconst checkWidth = styleConfig?.checkWidth\n\t\t? toPx.fromDim(styleConfig.checkWidth)\n\t\t: 3.5;\n\n\treturn (\n\t\t<svg\n\t\t\tviewBox=\"0 0 20 20\"\n\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\tstyle={{ width: \"100%\", height: \"100%\", display: \"block\" }}\n\t\t\taria-hidden=\"true\"\n\t\t>\n\t\t\t<rect\n\t\t\t\tx=\"2\"\n\t\t\t\ty=\"2\"\n\t\t\t\twidth=\"16\"\n\t\t\t\theight=\"16\"\n\t\t\t\trx=\"2\"\n\t\t\t\try=\"2\"\n\t\t\t\tfill={bg}\n\t\t\t\tstroke={borderColor}\n\t\t\t\tstrokeWidth={borderWidth}\n\t\t\t/>\n\t\t\t{checked && (\n\t\t\t\t<path\n\t\t\t\t\td=\"M3 11l4 4L17 4\"\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t\tstroke={checkColor}\n\t\t\t\t\tstrokeWidth={checkWidth}\n\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t/>\n\t\t\t)}\n\t\t</svg>\n\t);\n}\n","import type { BorderUnit, Dimension } from \"./unit\";\n\n/**\n * 枠線・区切り線に適用するスタイル種別。\n */\nexport enum LineType {\n\t/** 実線 */\n\tSOLID = \"solid\",\n\n\t/** 破線 */\n\tDASHED = \"dashed\",\n\n\t/** 点線 */\n\tDOTTED = \"dotted\",\n}\n\n/**\n * 線のスタイル定義(色・幅・種別)。\n */\nexport interface LineStyle {\n\t/** CSS カラー値 */\n\tcolor: string;\n\n\t/** 線の幅 */\n\twidth: Dimension<BorderUnit>;\n\n\t/** 線の種別 */\n\ttype: LineType;\n}\n\n/**\n * 四辺それぞれの枠線スタイル定義。省略した辺は枠線なし。\n *\n * `all` を指定した場合、各辺に個別指定がなければ `all` の値が全辺に適用される。\n */\nexport interface BorderStyle {\n\ttop?: LineStyle;\n\tright?: LineStyle;\n\tbottom?: LineStyle;\n\tleft?: LineStyle;\n\n\t/** 全辺共通スタイル。各辺に個別指定がない場合のフォールバック */\n\tall?: LineStyle;\n}\n","/**\n * Note の表示・編集モード。\n */\nexport enum NoteMode {\n\t/**\n\t * ブロックの配置・サイズ変更、グリッド設定、`initValue`(初期値)の設定が可能。\n\t *\n\t * 入力コントロールは動作するが、値はセッション内のみ保持される(永続化されない)。\n\t */\n\tFORM = \"Form\",\n\n\t/**\n\t * ブロックの値を入力・編集できる。\n\t *\n\t * レイアウトや `initValue` は変更不可。\n\t */\n\tEDIT = \"Edit\",\n\n\t/**\n\t * すべて読み取り専用。入力コントロールは無効。\n\t *\n\t * `showValidation` によるバリデーション結果の表示が有効。\n\t */\n\tVIEW = \"View\",\n}\n","/**\n * このパッケージで扱う全単位の列挙。\n */\nexport const Units = {\n\tMM: \"mm\",\n\tCM: \"cm\",\n\tFR: \"fr\",\n\tINCH: \"inch\",\n\tPT: \"pt\",\n\tPX: \"px\",\n\tPERCENT: \"%\",\n} as const;\n\n/**\n * 全単位の配列。\n */\nexport const ALL_UNITS = [\n\tUnits.MM,\n\tUnits.CM,\n\tUnits.FR,\n\tUnits.INCH,\n\tUnits.PT,\n\tUnits.PX,\n\tUnits.PERCENT,\n] as const;\n\n/**\n * 物理的な実寸を表す単位の配列(`fr` / `%` を除く)。\n */\nexport const ACTUAL_UNITS = [\n\tUnits.MM,\n\tUnits.CM,\n\tUnits.INCH,\n\tUnits.PT,\n\tUnits.PX,\n] as const;\n\n/**\n * 用紙サイズに使用できる単位の配列。\n */\nexport const PAPER_UNITS = [Units.MM, Units.CM, Units.INCH] as const;\n\n/**\n * グリッドの列・行サイズに使用できる単位の配列。\n */\nexport const GRID_UNITS = [\n\tUnits.MM,\n\tUnits.CM,\n\tUnits.FR,\n\tUnits.INCH,\n\tUnits.PT,\n\tUnits.PX,\n] as const;\n\n/**\n * 枠線の幅に使用できる単位の配列。\n */\nexport const BORDER_UNITS = [Units.PX, Units.PT, Units.MM] as const;\n\n/**\n * フォントサイズに使用できる単位の配列。\n */\nexport const FONT_UNITS = [Units.PT, Units.PX, Units.MM] as const;\n\n/**\n * パディングに使用できる単位の配列。\n */\nexport const PADDING_UNITS = [\n\tUnits.MM,\n\tUnits.PT,\n\tUnits.PX,\n\tUnits.PERCENT,\n] as const;\n\n/**\n * ブロックの幅・高さに使用できる単位の配列。\n */\nexport const SIZE_UNITS = [\n\tUnits.MM,\n\tUnits.CM,\n\tUnits.INCH,\n\tUnits.PT,\n\tUnits.PX,\n\tUnits.PERCENT,\n] as const;\n\n/**\n * このパッケージで使用できる全単位。\n */\nexport type Unit = (typeof ALL_UNITS)[number];\n\n/**\n * 物理的な実寸を表す単位(`fr` / `%` を除く)。\n */\nexport type ActualUnit = (typeof ACTUAL_UNITS)[number];\n\n/**\n * 用紙サイズに使用できる単位。\n */\nexport type PaperUnit = (typeof PAPER_UNITS)[number];\n\n/**\n * グリッドの列・行サイズに使用できる単位(`fr` を含む)。\n */\nexport type GridUnit = (typeof GRID_UNITS)[number];\n\n/**\n * 枠線の幅に使用できる単位。\n */\nexport type BorderUnit = (typeof BORDER_UNITS)[number];\n\n/**\n * フォントサイズに使用できる単位。\n */\nexport type FontUnit = (typeof FONT_UNITS)[number];\n\n/**\n * パディングに使用できる単位(`%` を含む)。\n */\nexport type PaddingUnit = (typeof PADDING_UNITS)[number];\n\n/**\n * ブロックの幅・高さに使用できる単位(`%` を含む)。\n */\nexport type SizeUnit = (typeof SIZE_UNITS)[number];\n\n/**\n * 数値と単位の組み合わせ。\n */\nexport interface Dimension<U extends Unit = Unit> {\n\t/** 数値 */\n\tvalue: number;\n\n\t/** 単位 */\n\tunit: U;\n}\n","// textブロック用のプロパティ定義と型定義\n\nimport type { PropDef } from \"../../../plugin\";\n\n/**\n * テキストの折り返し・改行插入の振る舞い。\n */\nexport enum WordWrap {\n\tnormal = \"normal\",\n\tbreakWord = \"break-word\",\n\tbreakAll = \"break-all\",\n}\n\n/**\n * テキストの改行・スペースのレンダリング模式(CSS `white-space` 相当)。\n */\nexport enum WhiteSpace {\n\tnormal = \"normal\",\n\tnowrap = \"nowrap\",\n\tpre = \"pre\",\n\tpreWrap = \"pre-wrap\",\n\tpreLine = \"pre-line\",\n}\n\n/**\n * テキスト入力の HTML `input[type]` 属性値。バリデーション・キーボードの振る舞いに影響する。\n */\nexport enum InputType {\n\ttext = \"text\",\n\tnumber = \"number\",\n\temail = \"email\",\n\ttel = \"tel\",\n\turl = \"url\",\n\tdate = \"date\",\n\tpassword = \"password\",\n}\n\n/**\n * テキスト入力の改行・折り返し・行間隔などのレイアウト挙動 props。\n */\nexport interface TextBehaviorProps {\n\t/** 行間隔(CSS `line-height` 相当)。デフォルト: 1.2。 */\n\tlineHeight?: number;\n\n\t/** `true` のとき複数行入力を許可する。デフォルト: true。 */\n\tmultiline?: boolean;\n\n\t/** 折り返しの振る舞い(CSS `overflow-wrap` 相当)。 */\n\twordWrap?: WordWrap;\n\n\t/** スペース・改行のレンダリング模式(CSS `white-space` 相当)。 */\n\twhiteSpace?: WhiteSpace;\n}\n\n/**\n * `textBehavior` prop 定義。テキストブロックのレイアウト挙動のデフォルト値を含む。\n */\nexport const textBehaviorProp = {\n\tkind: \"textBehavior\",\n\tdefaultProps: {\n\t\tlineHeight: 1.2,\n\t\tmultiline: true,\n\t\twordWrap: WordWrap.normal,\n\t\twhiteSpace: WhiteSpace.normal,\n\t},\n} satisfies PropDef;\n\n/**\n * テキスト入力の入力タイプ・数値範囲・文字数・パターンなどのバリデーション props。\n */\nexport interface TextValidationProps {\n\t/** 入力タイプ(`<input type>` 属性)。デフォルト: `text`。 */\n\tinputType?: InputType;\n\n\t/** 数値入力の最小値。 */\n\tmin?: number;\n\n\t/** 数値入力の最大値。 */\n\tmax?: number;\n\n\t/** 数値入力のステップ幅。 */\n\tstep?: number;\n\n\t/** 最小文字数。 */\n\tminLength?: number;\n\n\t/** 最大文字数。 */\n\tmaxLength?: number;\n\n\t/** 入力値を検証する正規表現パターン。 */\n\tpattern?: string;\n}\n\n/**\n * `textValidation` prop 定義。テキスト入力のバリデーションルールのデフォルト値を含む。\n */\nexport const textValidationProp = {\n\tkind: \"textValidation\",\n\tdefaultProps: {\n\t\tinputType: InputType.text,\n\t},\n} satisfies PropDef;\n","/**\n * 履歴マージキーの定義。\n *\n * @remarks\n * `useBookHistory` は同一 `mergeKey` を持つ連続エントリを1つにマージする。\n *\n * どの操作がどのキーでマージされるかをこのファイルで一元管理する。\n *\n * ## マージ戦略\n *\n * ### セッション型(方向・対象が変わるまで無制限にマージ)\n * - **矢印キー移動** (`arrowMoveKey`): 同一方向 + 同一ブロック選択の間は 1 セッション。\n * 方向変更・ブロック変更・キーアップで新セッションに切り替わる。\n * - **キーボードリサイズ** (`keyboardResizeKey`): Shift+矢印によるリサイズ。管理ルールは `arrowMoveKey` と同じ。\n *\n * ### ウィンドウ型(MERGE_WINDOW_MS 以内の変更をマージ)\n * - **レイアウトパネル入力** (`layoutPanelKey`): 同一軸の入力連打。\n * - **バインディング変更** (`bindingKey`): 同一パスへの連続 set 操作。\n * - **initValue 変更** (`initValueKey`): ダブルクリック編集・FORM モードの値変更連打。\n * - **グリッドサイズ入力** (`gridSizeKey`): 同一ページの列数・行数入力連打。\n */\n\n/**\n * 矢印キー移動セッションの mergeKey。\n *\n * セッション ID はキーダウン時に生成され、方向またはブロック選択が変わったときのみ切り替わる。\n *\n * keyUp はセッションをリセットしない。`noTimeWindow: true` と組み合わせて使用する。\n */\nexport function arrowMoveKey(sessionId: string): string {\n\treturn `move-arrow-session-${sessionId}`;\n}\n\n/**\n * レイアウトパネル(X/Y/W/H 入力)の連続変更の mergeKey。\n *\n * 同一軸・同一ブロック選択の間の連打をまとめる。\n */\nexport function layoutPanelKey(\n\taxis: \"x\" | \"y\" | \"w\" | \"h\",\n\tblockIds: string[],\n): string {\n\treturn `layout-${axis}-${[...blockIds].sort().join(\",\")}`;\n}\n\n/**\n * バインディング(パス指定の値変更)の連続変更の mergeKey。\n *\n * 同一パスへの連続 set 操作をまとめる。\n */\nexport function bindingKey(path: string): string {\n\treturn `binding-${path}`;\n}\n\n/**\n * ブロックの `initValue`(プラグイン初期値)の連続変更の mergeKey。\n *\n * ダブルクリック編集中のキー入力や、FORM モードでの値変更連打をまとめる。\n */\nexport function initValueKey(blockId: string): string {\n\treturn `initValue-${blockId}`;\n}\n\n/**\n * グリッド列数・行数入力の連続変更の mergeKey。\n *\n * 同一ページの数値入力連打をまとめる。\n */\nexport function gridSizeKey(pageIdx: number): string {\n\treturn `grid-size-${pageIdx}`;\n}\n\n/**\n * Shift+矢印キーによるブロックリサイズセッションの mergeKey。\n *\n * セッション ID の管理ルールは {@link arrowMoveKey} と同じ。\n *\n * 方向・ブロック選択変更でのみ新セッションに切り替わる(keyUp では切り替わらない)。\n */\nexport function keyboardResizeKey(sessionId: string): string {\n\treturn `resize-arrow-session-${sessionId}`;\n}\n","import type { Dimension, Grid, GridUnit } from \"../../types\";\n\n// デフォルトのグリッドセル寸法(1fr)\nconst DEFAULT_GRID_DIMENSION: Dimension<GridUnit> = { value: 1, unit: \"fr\" };\n\n/**\n * グリッドのスパース列定義を全列のサイズ配列に展開する。\n *\n * `grid.cols` に定義がないインデックスはデフォルト値(`1fr`)で補完される。\n */\nexport function expandSparseCols(grid: Grid): Dimension<GridUnit>[] {\n\treturn Array.from(\n\t\t{ length: grid.colCount },\n\t\t(_, i) => grid.cols?.[i] ?? DEFAULT_GRID_DIMENSION,\n\t);\n}\n\n/**\n * グリッドのスパース行定義を全行のサイズ配列に展開する。\n *\n * `grid.rows` に定義がないインデックスはデフォルト値(`1fr`)で補完される。\n */\nexport function expandSparseRows(grid: Grid): Dimension<GridUnit>[] {\n\treturn Array.from(\n\t\t{ length: grid.rowCount },\n\t\t(_, i) => grid.rows?.[i] ?? DEFAULT_GRID_DIMENSION,\n\t);\n}\n\n/**\n * 列サイズ配列をスパース形式に変換する。\n *\n * デフォルト値(`1fr`)と一致するエントリは省略され、異なるものだけが `cols` に格納される。\n *\n * 全エントリがデフォルト値の場合、`cols` は `undefined` になる。\n */\nexport function colsToSparse(\n\tcols: Dimension<GridUnit>[],\n): Pick<Grid, \"colCount\" | \"cols\"> {\n\tconst result: Record<number, Dimension<GridUnit>> = {};\n\tfor (let i = 0; i < cols.length; i++) {\n\t\tconst d = cols[i];\n\t\tif (d !== undefined && !(d.value === 1 && d.unit === \"fr\")) {\n\t\t\tresult[i] = d;\n\t\t}\n\t}\n\treturn {\n\t\tcolCount: cols.length,\n\t\tcols: Object.keys(result).length > 0 ? result : undefined,\n\t};\n}\n\n/**\n * 行サイズ配列をスパース形式に変換する。\n *\n * デフォルト値(`1fr`)と一致するエントリは省略され、異なるものだけが `rows` に格納される。\n *\n * 全エントリがデフォルト値の場合、`rows` は `undefined` になる。\n */\nexport function rowsToSparse(\n\trows: Dimension<GridUnit>[],\n): Pick<Grid, \"rowCount\" | \"rows\"> {\n\tconst result: Record<number, Dimension<GridUnit>> = {};\n\tfor (let i = 0; i < rows.length; i++) {\n\t\tconst d = rows[i];\n\t\tif (d !== undefined && !(d.value === 1 && d.unit === \"fr\")) {\n\t\t\tresult[i] = d;\n\t\t}\n\t}\n\treturn {\n\t\trowCount: rows.length,\n\t\trows: Object.keys(result).length > 0 ? result : undefined,\n\t};\n}\n","import { useMemo } from \"react\";\n\nimport { expandSparseCols, expandSparseRows } from \"../../../../utils/grid\";\n\nimport type { Dimension, Grid, GridUnit } from \"../../../../types\";\n\n/**\n * `Grid` の sparse 形式を展開した列・行の寸法配列を保持するフックの返り値。\n */\nexport interface UseExpandedGridResult {\n\t/** 展開後の列寸法配列。 */\n\texpandedCols: Dimension<GridUnit>[];\n\n\t/** 展開後の行寸法配列。 */\n\texpandedRows: Dimension<GridUnit>[];\n}\n\n/**\n * `Grid` の sparse 形式(繰り返し指定あり)を展開して寸法配列を返す React フック。\n * @param grid - グリッド。\n * @returns 展開済み列・行寸法配列。\n */\nexport function useExpandedGrid(grid: Grid): UseExpandedGridResult {\n\tconst expandedCols = useMemo(() => expandSparseCols(grid), [grid]);\n\tconst expandedRows = useMemo(() => expandSparseRows(grid), [grid]);\n\treturn { expandedCols, expandedRows };\n}\n","/**\n * 浮動小数点のピクセル配列を整数ピクセル配列に変換します。\n *\n * Bresenhamアルゴリズムに基づく累積誤差補正により、\n * 境界位置(prefix sum)のズレを最小化します。\n */\nexport function distributeRemainder(floatPixels: number[]): number[] {\n\tif (floatPixels.length === 0) return [];\n\n\tconst result: number[] = [];\n\tlet accumulatedError = 0;\n\n\tfor (const px of floatPixels) {\n\t\tconst target = px + accumulatedError;\n\t\tconst rounded = Math.round(target);\n\t\tresult.push(rounded);\n\t\taccumulatedError = target - rounded;\n\t}\n\n\treturn result;\n}\n","// finger search のステップ数の下限・上限\nconst MIN_STEP = 8;\nconst MAX_STEP = 32;\n\n// 二分探索へ切り替わる窓サイズ(px)の下限・上限\nconst MIN_WINDOW_PX = 64;\nconst MAX_WINDOW_PX = 512;\n\n// 数値を [lo, hi] にクランプするユーティリティ関数\nconst _clamp = (x: number, lo: number, hi: number): number =>\n\tMath.min(Math.max(x, lo), hi);\n\n/**\n * finger search から二分探索に切り替えるステップ数と窓サイズを返します。\n *\n * useMemo でキャッシュして使うことを想定。\n */\nexport function getMaxStep(starts: number[]): {\n\treadonly step: number;\n\treadonly windowPx: number;\n} {\n\tconst count = starts.length - 1;\n\tconst total = count >= 1 ? (starts[count] ?? 0) : 0;\n\tconst avg = starts.length >= 1 ? total / count : 0;\n\n\tconst step = _clamp(Math.ceil(Math.log2(count + 1)), MIN_STEP, MAX_STEP);\n\tconst windowPx = _clamp(avg * 2, MIN_WINDOW_PX, MAX_WINDOW_PX);\n\n\treturn { step, windowPx };\n}\n\n// 境界座標の昇順配列から num が属するセルインデックスを二分探索で返す\nfunction binarySearch(num: number, arr: readonly number[]): number {\n\t// arr は境界座標の昇順配列。要素数 - 1 がセル数\n\tconst cnt = arr.length - 1;\n\t// セルが存在しない場合は範囲外\n\tif (cnt <= 0) return -1;\n\tif (arr[0] === undefined || num < arr[0]) return -1;\n\tif (arr[cnt] === undefined) return -1;\n\t// 末尾境界以上なら最終セルに含まれる\n\tif (num >= arr[cnt]) return cnt - 1;\n\n\tlet lo = 1;\n\tlet hi = cnt;\n\twhile (lo <= hi) {\n\t\t// >>> 1 は符号なし右シフト。整数オーバーフロー回避のための慣用句\n\t\tconst mid = (lo + hi) >>> 1;\n\t\tconst midValue = arr[mid];\n\t\tif (midValue === undefined) {\n\t\t\thi = mid - 1;\n\t\t\tcontinue;\n\t\t}\n\t\tif (midValue <= num) {\n\t\t\tlo = mid + 1;\n\t\t} else {\n\t\t\thi = mid - 1;\n\t\t}\n\t}\n\t// ループ終了時 lo は num より大きい最初の境界位置 → lo - 1 が該当セルインデックス\n\treturn lo - 1;\n}\n\n/**\n * finger search + 二分探索によるグリッドインデックス探索関数を返します。\n * @param starts - グリッド境界の累積px配列(0始まり)\n * @param maxStep - finger search の最大ステップ数\n * @param windowPx - 二分探索に切り替える窓サイズ(px)\n */\nexport function findGridIndex(\n\tstarts: readonly number[],\n\tmaxStep: number,\n\twindowPx: number,\n): (px: number) => number {\n\tconst cnt = starts.length - 1;\n\tlet last = 0;\n\n\treturn (px: number) => {\n\t\tif (cnt <= 0) return -1;\n\t\tif (starts[0] === undefined || px < starts[0]) return -1;\n\t\tif (starts[cnt] === undefined) return -1;\n\t\tif (px >= starts[cnt]) return cnt - 1;\n\n\t\tconst startValue = starts[last];\n\t\tconst nextValue = starts[last + 1];\n\t\tif (startValue === undefined || nextValue === undefined) return -1;\n\t\tif (startValue <= px && px < nextValue) return last;\n\n\t\tconst leftPx = startValue - windowPx;\n\t\tconst rightPx = nextValue + windowPx;\n\t\tif (px < leftPx || px >= rightPx) {\n\t\t\tlast = binarySearch(px, starts);\n\t\t\treturn last;\n\t\t}\n\n\t\tlet steps = 0;\n\t\tconst nextStart = starts[last + 1];\n\t\tif (nextStart !== undefined && px >= nextStart) {\n\t\t\twhile (last + 1 < cnt) {\n\t\t\t\tconst next = starts[last + 1];\n\t\t\t\tif (next === undefined || px < next) break;\n\t\t\t\tlast++;\n\t\t\t\tif (++steps > maxStep) {\n\t\t\t\t\tlast = binarySearch(px, starts);\n\t\t\t\t\treturn last;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\twhile (last > 0) {\n\t\t\t\tconst current = starts[last];\n\t\t\t\tif (current === undefined || px >= current) break;\n\t\t\t\tlast--;\n\t\t\t\tif (++steps > maxStep) {\n\t\t\t\t\tlast = binarySearch(px, starts);\n\t\t\t\t\treturn last;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn last;\n\t};\n}\n","import { DEFAULT_DPI, toMm, toPx } from \"../../../../utils/convert\";\nimport { distributeRemainder } from \"./distributeRemainder\";\n\nimport type { Dimension, GridUnit } from \"../../../../types/unit\";\n\n/**\n * 複数の単位が混在するグリッド寸法配列をmm配列に変換します。\n */\nexport function gridToMms(\n\tdims: Dimension<GridUnit>[],\n\tcontentSizeMm: number,\n): number[] {\n\tif (dims.length === 0) return [];\n\n\tlet totalFr = 0;\n\tlet fixedTotalMm = 0;\n\n\tconst mmsWithoutFr: (number | null)[] = dims.map((dim) => {\n\t\tif (dim.unit === \"fr\") {\n\t\t\ttotalFr += dim.value;\n\t\t\treturn null;\n\t\t}\n\t\tconst mm = toMm.fromDim(dim);\n\t\tfixedTotalMm += mm;\n\t\treturn mm;\n\t});\n\n\tif (totalFr === 0) {\n\t\treturn mmsWithoutFr as number[];\n\t}\n\n\tconst remainingMm = Math.max(0, contentSizeMm - fixedTotalMm);\n\tconst mmPerFr = remainingMm / totalFr;\n\n\treturn mmsWithoutFr.map((val, i) => {\n\t\tif (val !== null && val !== undefined) return val;\n\t\tconst dim = dims[i];\n\t\tif (!dim) throw new Error(`dims[${i}] is undefined`);\n\t\treturn dim.value * mmPerFr;\n\t});\n}\n\n/**\n * mm単位の数字配列をpx単位の整数配列に変換します(剰余配布あり)。\n */\nexport function mmsToPxs(mms: number[], dpi: number = DEFAULT_DPI): number[] {\n\tconst gridPxsFloat = mms.map((mm) => toPx.fromMm(mm, dpi));\n\treturn distributeRemainder(gridPxsFloat);\n}\n","import { useCallback, useMemo } from \"react\";\n\nimport { DEFAULT_DPI, toMm, toPx } from \"../../../../utils/convert\";\nimport { findGridIndex, getMaxStep, gridToMms, mmsToPxs } from \"../utils\";\nimport { useExpandedGrid } from \"./useExpandedGrid\";\n\nimport type { Block } from \"../../../../types/block\";\nimport type { Grid } from \"../../../../types/grid\";\nimport type { Paper } from \"../../../../types/paper\";\nimport type { BlockRectPx } from \"../../types\";\nimport type {\n\tGridPosPx,\n\tPaperCanvasPx,\n\tPaperMarginPx,\n\tPaperPx,\n} from \"../types\";\n\n/**\n * `Paper` と `Grid` の定義からキャンバス・グリッドの px 座標を計算して返す React フック。\n * @param paper - 用紙設定(サイズ・向き・マージン)。\n * @param grid - グリッド定義。\n * @param dpi - DPI 値(既定値: `DEFAULT_DPI`)。\n */\nexport function useGridCalc(\n\tpaper: Paper,\n\tgrid: Grid,\n\tdpi: number = DEFAULT_DPI,\n) {\n\tconst { expandedCols, expandedRows } = useExpandedGrid(grid);\n\n\t// paper 依存の mm 値を一括計算(paper 変更時のみ再計算)\n\tconst paperMm = useMemo(() => {\n\t\tconst effectiveSizeWidth = paper.orientation\n\t\t\t? paper.size.height\n\t\t\t: paper.size.width;\n\t\tconst effectiveSizeHeight = paper.orientation\n\t\t\t? paper.size.width\n\t\t\t: paper.size.height;\n\t\tconst canvasWidthMm = toMm.fromDim(effectiveSizeWidth);\n\t\tconst canvasHeightMm = toMm.fromDim(effectiveSizeHeight);\n\t\t// bulk モード時は all フィールドを四辺共通値として使用する\n\t\t// all?.unit を確認することで unit が未設定の中間状態を除外する\n\t\tconst bulkMm =\n\t\t\tpaper.margin.bulk && paper.margin.all?.unit\n\t\t\t\t? toMm.fromDim(paper.margin.all)\n\t\t\t\t: undefined;\n\t\tconst marginTopMm = bulkMm ?? toMm.fromDim(paper.margin.top);\n\t\tconst marginBottomMm = bulkMm ?? toMm.fromDim(paper.margin.bottom);\n\t\tconst marginLeftMm = bulkMm ?? toMm.fromDim(paper.margin.left);\n\t\tconst marginRightMm = bulkMm ?? toMm.fromDim(paper.margin.right);\n\t\treturn {\n\t\t\tcanvasWidthMm,\n\t\t\tcanvasHeightMm,\n\t\t\tmarginTopMm,\n\t\t\tmarginBottomMm,\n\t\t\tmarginLeftMm,\n\t\t\tmarginRightMm,\n\t\t\tcontentWidthMm: Math.max(0, canvasWidthMm - marginLeftMm - marginRightMm),\n\t\t\tcontentHeightMm: Math.max(\n\t\t\t\t0,\n\t\t\t\tcanvasHeightMm - marginTopMm - marginBottomMm,\n\t\t\t),\n\t\t};\n\t}, [paper]);\n\n\t// 用紙サイズ・マージン・コンテンツ領域を px 単位で一括計算\n\tconst paperPx = useMemo((): PaperPx => {\n\t\tconst {\n\t\t\tcanvasWidthMm,\n\t\t\tcanvasHeightMm,\n\t\t\tmarginTopMm,\n\t\t\tmarginBottomMm,\n\t\t\tmarginLeftMm,\n\t\t\tmarginRightMm,\n\t\t\tcontentWidthMm,\n\t\t\tcontentHeightMm,\n\t\t} = paperMm;\n\t\treturn {\n\t\t\tcanvas: {\n\t\t\t\twidth: toPx.fromMm(canvasWidthMm, dpi),\n\t\t\t\theight: toPx.fromMm(canvasHeightMm, dpi),\n\t\t\t} as PaperCanvasPx,\n\t\t\tmargin: {\n\t\t\t\ttop: toPx.fromMm(marginTopMm, dpi),\n\t\t\t\tbottom: toPx.fromMm(marginBottomMm, dpi),\n\t\t\t\tleft: toPx.fromMm(marginLeftMm, dpi),\n\t\t\t\tright: toPx.fromMm(marginRightMm, dpi),\n\t\t\t} as PaperMarginPx,\n\t\t\tcontent: {\n\t\t\t\twidth: toPx.fromMm(contentWidthMm, dpi),\n\t\t\t\theight: toPx.fromMm(contentHeightMm, dpi),\n\t\t\t},\n\t\t};\n\t}, [paperMm, dpi]);\n\n\t// グリッド列・行の累積 px 位置配列とインデクサー関数を一括計算\n\tconst { gridPosPx, colIndexer, rowIndexer } = useMemo(() => {\n\t\tconst { contentWidthMm, contentHeightMm } = paperMm;\n\n\t\tconst colPxs = mmsToPxs(gridToMms(expandedCols, contentWidthMm), dpi);\n\t\tconst rowPxs = mmsToPxs(gridToMms(expandedRows, contentHeightMm), dpi);\n\n\t\tconst colPosPxs: number[] = [0];\n\t\tfor (const w of colPxs) {\n\t\t\tcolPosPxs.push((colPosPxs[colPosPxs.length - 1] ?? 0) + w);\n\t\t}\n\t\tconst rowPosPxs: number[] = [0];\n\t\tfor (const h of rowPxs) {\n\t\t\trowPosPxs.push((rowPosPxs[rowPosPxs.length - 1] ?? 0) + h);\n\t\t}\n\n\t\tconst { step: colMaxStep, windowPx: colWindowPx } = getMaxStep(colPosPxs);\n\t\tconst { step: rowMaxStep, windowPx: rowWindowPx } = getMaxStep(rowPosPxs);\n\n\t\treturn {\n\t\t\tgridPosPx: { cols: colPosPxs, rows: rowPosPxs } as GridPosPx,\n\t\t\tcolIndexer: findGridIndex(colPosPxs, colMaxStep, colWindowPx),\n\t\t\trowIndexer: findGridIndex(rowPosPxs, rowMaxStep, rowWindowPx),\n\t\t};\n\t}, [paperMm, expandedCols, expandedRows, dpi]);\n\n\tconst getColIndex = useCallback(\n\t\t(px: number) => colIndexer(px - paperPx.margin.left),\n\t\t[colIndexer, paperPx],\n\t);\n\tconst getRowIndex = useCallback(\n\t\t(px: number) => rowIndexer(px - paperPx.margin.top),\n\t\t[rowIndexer, paperPx],\n\t);\n\n\tconst getBlockRectPx = useCallback(\n\t\t(block: Block): BlockRectPx => {\n\t\t\tconst { x, y, w, h } = block.layout;\n\t\t\tconst colLines = gridPosPx.cols;\n\t\t\tconst rowLines = gridPosPx.rows;\n\n\t\t\tif (!colLines.length || !rowLines.length) {\n\t\t\t\treturn { left: 0, top: 0, width: 0, height: 0 };\n\t\t\t}\n\n\t\t\tconst x1 = Math.min(Math.max(0, x), colLines.length - 1);\n\t\t\tconst x2 = Math.min(Math.max(0, x + w), colLines.length - 1);\n\t\t\tconst y1 = Math.min(Math.max(0, y), rowLines.length - 1);\n\t\t\tconst y2 = Math.min(Math.max(0, y + h), rowLines.length - 1);\n\n\t\t\tconst left = (colLines[x1] ?? 0) + paperPx.margin.left;\n\t\t\tconst top = (rowLines[y1] ?? 0) + paperPx.margin.top;\n\t\t\tconst width = (colLines[x2] ?? 0) - (colLines[x1] ?? 0);\n\t\t\tconst height = (rowLines[y2] ?? 0) - (rowLines[y1] ?? 0);\n\n\t\t\treturn { left, top, width, height };\n\t\t},\n\t\t[gridPosPx, paperPx],\n\t);\n\n\treturn {\n\t\tpaperPx,\n\t\tgridPosPx,\n\t\tgetColIndex,\n\t\tgetRowIndex,\n\t\tgetBlockRectPx,\n\t};\n}\n","/**\n * NoteForm がサイドバー領域を判定するためのセレクタ。\n *\n * @remarks\n * **Shell** — カスタムサイドバー実装時にルート要素へ付与する `data-sidebar=\"true\"` を選択する。\n */\nexport const SIDEBAR_PORTAL_SELECTOR = '[data-sidebar=\"true\"]';\n\n/**\n * サイドバー/フローティングウィジェットのルート要素に付与する props。\n *\n * @remarks\n * **Shell** — スプレッドすることで `NoteForm` の選択解除ロジックの対象外になる。\n */\nexport const SIDEBAR_PORTAL_PROPS = { \"data-sidebar\": \"true\" } as const;\n"],"names":["HorizontalAlign","VerticalAlign","alignmentProp","checkboxStyleProp","BLOCK_DRAG_MIME","BLOCK_DRAG_KIND_PREFIX","startBlockDrag","e","kind","defaultSize","data","getBlockDragData","raw","getBlockDragKind","kindType","t","DEFAULT_GRID","PaperSizePreset","DEFAULT_PAPER_SIZES","DEFAULT_PAPER_MARGIN","DEFAULT_PAPER","Z_INDEX","BLOCK_SUB_INDEX","stringToDimension","str","allowedUnits","match","value","unit","dimensionToString","dim","DEFAULT_DPI","CM_TO_MM","INCH_TO_MM","PT_TO_MM","PX_TO_MM","toMm","cm","inch","pt","px","_exhaustive","MM_PER_INCH","CM_PER_INCH","PT_PER_INCH","toPx","mm","dpi","baseSizePx","H_ALIGN_MAP","V_ALIGN_MAP","isDefaultDim","d","arrayToSparse","dims","sparse","i","migrateGrid","grid","g","colsArr","rowsArr","result","sparseCols","sparseRows","migratePadding","props","isIndividual","allVal","migrateAlignment","oldVal","migrateBlockProps","migratePage","page","registry","p","block","b","plugin","isLegacyFormSchema","isBook","migrateBook","notebook","nb","migrateFormSchemaToBook","schema","source","blocks","migratedPage","migrate","isValue","v","validateValues","obj","key","val","deserializeValues","json","parsed","isGrid","isHiddenBinding","hasPrimitive","isBlock","layout","validatePage","bd","defaults","parseBook","serializePage","serializeBook","book","deserializePage","deserializeBook","ClassicCheckboxVisual","checked","styleConfig","borderColor","checkColor","bg","borderWidth","checkWidth","jsxs","jsx","LineType","NoteMode","Units","ALL_UNITS","ACTUAL_UNITS","PAPER_UNITS","GRID_UNITS","BORDER_UNITS","FONT_UNITS","PADDING_UNITS","SIZE_UNITS","WordWrap","WhiteSpace","InputType","textBehaviorProp","textValidationProp","arrowMoveKey","sessionId","layoutPanelKey","axis","blockIds","bindingKey","path","initValueKey","blockId","gridSizeKey","pageIdx","keyboardResizeKey","DEFAULT_GRID_DIMENSION","expandSparseCols","_","_a","expandSparseRows","colsToSparse","cols","rowsToSparse","rows","useExpandedGrid","expandedCols","useMemo","expandedRows","distributeRemainder","floatPixels","accumulatedError","target","rounded","MIN_STEP","MAX_STEP","MIN_WINDOW_PX","MAX_WINDOW_PX","_clamp","x","lo","hi","getMaxStep","starts","count","total","avg","step","windowPx","binarySearch","num","arr","cnt","mid","midValue","findGridIndex","maxStep","last","startValue","nextValue","leftPx","rightPx","steps","nextStart","next","current","gridToMms","contentSizeMm","totalFr","fixedTotalMm","mmsWithoutFr","mmPerFr","mmsToPxs","mms","gridPxsFloat","useGridCalc","paper","paperMm","effectiveSizeWidth","effectiveSizeHeight","canvasWidthMm","canvasHeightMm","bulkMm","marginTopMm","marginBottomMm","marginLeftMm","marginRightMm","paperPx","contentWidthMm","contentHeightMm","gridPosPx","colIndexer","rowIndexer","colPxs","rowPxs","colPosPxs","w","rowPosPxs","h","colMaxStep","colWindowPx","rowMaxStep","rowWindowPx","getColIndex","useCallback","getRowIndex","getBlockRectPx","y","colLines","rowLines","x1","x2","y1","y2","left","top","width","height","SIDEBAR_PORTAL_SELECTOR","SIDEBAR_PORTAL_PROPS"],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- "use strict";const x=require("react/jsx-runtime"),k=require("react");var F=(t=>(t.left="left",t.center="center",t.right="right",t))(F||{}),K=(t=>(t.top="top",t.center="center",t.bottom="bottom",t))(K||{});const pt={kind:"alignment",defaultProps:{horizontal:"left",vertical:"center"}},bt={kind:"checkboxStyle",defaultProps:{styleConfig:{checkboxSize:{value:16,unit:"px"},borderWidth:{value:1,unit:"px"},borderColor:"#000000",checkWidth:{value:3.5,unit:"px"},checkColor:"#000000",backgroundColor:"#ffffff",checkedBackgroundColor:"#ffffff"}}},N="application/x-tatamicks-block",O="application/x-tatamicks-block-kind-";function wt(t,e,r){if(!t.dataTransfer)return;const n={kind:e,defaultSize:r};t.dataTransfer.setData(N,JSON.stringify(n)),t.dataTransfer.setData(`${O}${e}`,""),t.dataTransfer.effectAllowed="copy"}function Et(t){if(!t.dataTransfer)return null;const e=t.dataTransfer.getData(N);if(!e)return null;try{return JSON.parse(e)}catch{return null}}function Pt(t){if(!t.dataTransfer)return null;const e=Array.from(t.dataTransfer.types).find(r=>r.startsWith(O));return e?e.slice(O.length):null}const Mt={colCount:20,rowCount:28};var $=(t=>(t.A4="A4",t.B5="B5",t.A3="A3",t.LETTER="Letter",t.LEGAL="Legal",t.CUSTOM="Custom",t))($||{});const W={A4:{preset:"A4",width:{value:210,unit:"mm"},height:{value:297,unit:"mm"}},A3:{preset:"A3",width:{value:297,unit:"mm"},height:{value:420,unit:"mm"}},B5:{preset:"B5",width:{value:182,unit:"mm"},height:{value:257,unit:"mm"}},Letter:{preset:"Letter",width:{value:8.5,unit:"inch"},height:{value:11,unit:"inch"}},Legal:{preset:"Legal",width:{value:8.5,unit:"inch"},height:{value:14,unit:"inch"}},Custom:{preset:"Custom",width:{value:210,unit:"mm"},height:{value:297,unit:"mm"}}},H={top:{value:10,unit:"mm"},right:{value:10,unit:"mm"},bottom:{value:10,unit:"mm"},left:{value:10,unit:"mm"}},Dt={size:W.A4,margin:H},kt={GRID_CANVAS:10,MARGIN_OVERLAY:20,GRID_OVERLAY:30,BORDER_OVERLAY:40,BLOCK_LAYER_MIN:100,BLOCK_LAYER_MAX:999999,BLOCK_LAYER_STEP:100,SELECT_BLOCK:2e6,INTERACTION_LAYER_BASE:21e5,BLOCK_GHOST:22e5,HOVER_OUTLINE:23e5,EDIT_BLOCK:24e5,BLOCK_SELECT_BORDER:25e5,BLOCK_HANDLES:26e5,SELECTION_ACTION_BAR:265e4,GRID_GHOST:27e5,DROPDOWN:34e5},vt={BG:10,CONTENT:50,GUIDE:70,BORDER:80,VALIDATION:90};function At(t,e){const r=t.match(/^(\d+(?:\.\d+)?)([a-zA-Z%]+)$/);if(!r)throw new Error(`Invalid dimension string: ${t}`);const n=Number(r[1]),o=r[2];if(!e.includes(o))throw new Error(`Invalid unit: ${o}`);return{value:n,unit:o}}function _t(t){return`${t.value}${t.unit}`}const p=96,yt=10,z=25.4,It=.352778,Tt=z/p,h={fromCm:t=>t*yt,fromInch:t=>t*z,fromPt:t=>t*It,fromPx:t=>t*Tt,fromDim(t){switch(t.unit){case"mm":return t.value;case"cm":return h.fromCm(t.value);case"inch":return h.fromInch(t.value);case"pt":return h.fromPt(t.value);case"px":return h.fromPx(t.value);case"fr":case"%":throw new Error(`Cannot convert ${t.unit} to mm. Use physical units only.`);default:{const e=t.unit;throw new Error(`Unsupported unit: ${e}`)}}}},St=25.4,xt=2.54,Rt=72,f={fromMm:(t,e=p)=>t*e/St,fromCm:(t,e=p)=>t*e/xt,fromInch:(t,e=p)=>t*e,fromPt:(t,e=p)=>t*e/Rt,fromPx:(t,e=p)=>t*e/p,fromDim(t,e=p,r){switch(t.unit){case"mm":return f.fromMm(t.value,e);case"cm":return f.fromCm(t.value,e);case"inch":return f.fromInch(t.value,e);case"pt":return f.fromPt(t.value,e);case"px":return f.fromPx(t.value,e);case"%":if(r===void 0)throw new Error("Base size must be defined for percentage values.");return t.value/100*r;case"fr":throw new Error(`Cannot convert ${t.unit} to px. Use physical units only.`);default:{const n=t.unit;throw new Error(`Unsupported unit: ${n}`)}}}},Ot={"flex-start":"left",center:"center","flex-end":"right"},Nt={"flex-start":"top",center:"center","flex-end":"bottom"};function Bt(t){return typeof t=="object"&&t!==null&&t.value===1&&t.unit==="fr"}function L(t){const e={};for(let r=0;r<t.length;r++){const n=t[r];n!==void 0&&!Bt(n)&&(e[r]=n)}return e}function X(t){if(typeof t!="object"||t===null)throw new Error("grid must be an object");const e=t;if(Array.isArray(e.cols)&&Array.isArray(e.rows)){const r=e.cols,n=e.rows,o={colCount:r.length,rowCount:n.length},i=L(r);Object.keys(i).length>0&&(o.cols=i);const s=L(n);return Object.keys(s).length>0&&(o.rows=s),o}return t}function Lt(t){if(!("isIndividual"in t))return t;const e={...t},r=e.isIndividual??!0,n=e.all;return delete e.isIndividual,delete e.all,!r&&n!==void 0&&("top"in e||(e.top=n),"right"in e||(e.right=n),"bottom"in e||(e.bottom=n),"left"in e||(e.left=n)),e}function Ct(t){const e={...t};if("justifyContent"in e){const r=e.justifyContent;e.horizontal=Ot[r]??r,delete e.justifyContent}if("alignItems"in e){const r=e.alignItems;e.vertical=Nt[r]??r,delete e.alignItems}return e}function J(t){if(typeof t!="object"||t===null)return t;let e={...t};return e=Lt(e),e=Ct(e),e}function q(t,e){if(typeof t!="object"||t===null)throw new Error("page must be an object");const r={...t};return"grid"in r&&(r.grid=X(r.grid)),Array.isArray(r.blocks)&&(r.blocks=r.blocks.map(n=>{if(typeof n=="object"&&n!==null){const o={...n};"props"in o&&(o.props=J(o.props));const i=typeof o.kind=="string"?o.kind:void 0;if(i&&e){const s=e[i];s!=null&&s.migrateProps&&(o.props=s.migrateProps(o.props))}return o}return n})),{grid:r.grid,blocks:r.blocks,...r.blockDefaults!==void 0?{blockDefaults:r.blockDefaults}:{},...r.metaData!==void 0?{metaData:r.metaData}:{}}}function Y(t){return typeof t=="object"&&t!==null&&!("pages"in t)&&"grid"in t&&"blocks"in t}function Z(t){return typeof t=="object"&&t!==null&&"pages"in t}function Q(t,e){if(typeof t!="object"||t===null)throw new Error("Book must be a JSON object");const r={...t};return Array.isArray(r.pages)&&(r.pages=r.pages.map(n=>q(n,e))),{paper:r.paper,pages:r.pages,...r.metaData!==void 0?{metaData:r.metaData}:{}}}function tt(t,e){if(typeof t!="object"||t===null)throw new Error("Schema must be a JSON object");const r={...t},n={};if("grid"in r&&(n.grid=X(r.grid),delete r.grid),"blocks"in r){const s=r.blocks;Array.isArray(s)&&(n.blocks=s.map(c=>{if(typeof c=="object"&&c!==null){const u={...c};"props"in u&&(u.props=J(u.props));const b=typeof u.kind=="string"?u.kind:void 0;if(b&&e){const w=e[b];w!=null&&w.migrateProps&&(u.props=w.migrateProps(u.props))}return u}return c})),delete r.blocks}"metaData"in r&&(n.metaData=r.metaData,delete r.metaData);const o={};"paper"in r&&(o.paper=r.paper,delete r.paper);const i={grid:n.grid,blocks:n.blocks??[],...n.metaData!==void 0?{metaData:n.metaData}:{}};return{paper:o.paper,pages:[i]}}function et(t,e){if(Y(t))return tt(t,e);if(Z(t))return Q(t,e);throw new Error(`入力データの形式を判別できません。
2
- 形式 A(旧 FormSchema): トップレベルに 'grid' と 'blocks' が必要
3
- 形式 B(Book): トップレベルに 'pages' が必要`)}function I(t){if(t===null)return!0;switch(typeof t){case"string":case"number":case"boolean":return!0;case"object":return Array.isArray(t)?t.every(I):Object.getPrototypeOf(t)===Object.prototype?Object.values(t).every(I):!1;default:return!1}}function T(t){if(t===null||typeof t!="object"||Array.isArray(t)||Object.getPrototypeOf(t)!==Object.prototype)throw new Error("values must be a plain object");const e=t;for(const[r,n]of Object.entries(e))if(!I(n))throw new Error(`values["${r}"] contains an invalid value`);return e}function jt(t){let e;try{e=JSON.parse(t)}catch{throw new SyntaxError("invalid JSON for values")}return T(e)}function Ut(t){if(typeof t!="object"||t===null)return!1;const e=t;return!(typeof e.colCount!="number"||e.colCount<1||typeof e.rowCount!="number"||e.rowCount<1)}function Gt(t){if(typeof t=="string")return!0;if(typeof t!="object"||t===null)return!1;const e=t;if(typeof e.path!="string")return!1;const r=n=>n===null||typeof n=="string"||typeof n=="number"||typeof n=="boolean";return"eq"in e?r(e.eq):"neq"in e?r(e.neq):!1}function Vt(t){if(typeof t!="object"||t===null)return!1;const e=t;if(typeof e.id!="string"||typeof e.kind!="string"||typeof e.layout!="object"||e.layout===null)return!1;const r=e.layout;if(typeof r.x!="number"||typeof r.y!="number"||typeof r.w!="number"||typeof r.h!="number"||typeof e.props!="object"||e.props===null||Array.isArray(e.props))return!1;try{T(e.props)}catch{return!1}return!("initValue"in e&&!I(e.initValue)||"hiddenBinding"in e&&!Gt(e.hiddenBinding))}function B(t){if(typeof t!="object"||t===null)throw new Error("Page must be an object");const e=t;if(e.id!==void 0&&typeof e.id!="string")throw new Error("Page.id must be a string if provided");if(!Ut(e.grid))throw new Error("Invalid grid definition");if(!Array.isArray(e.blocks))throw new Error("blocks must be an array");if(!e.blocks.every(Vt))throw new Error("Invalid block definition in blocks array");if(e.metaData!==void 0){if(typeof e.metaData!="object"||e.metaData===null)throw new Error("metaData must be an object if provided");try{T(e.metaData)}catch(r){throw new Error(`Invalid metaData: ${r instanceof Error?r.message:String(r)}`)}}if(e.blockDefaults!==void 0){if(typeof e.blockDefaults!="object"||e.blockDefaults===null||Array.isArray(e.blockDefaults))throw new Error("blockDefaults must be a plain object if provided");const r=e.blockDefaults;for(const[n,o]of Object.entries(r))try{T(o)}catch(i){throw new Error(`Invalid blockDefaults["${n}"]: ${i instanceof Error?i.message:String(i)}`)}}return t}function rt(t){if(typeof t!="object"||t===null)throw new Error("Book must be an object");const e=t;if(!Array.isArray(e.pages)||e.pages.length===0)throw new Error("Book must have at least one page in pages");if(e.pages.forEach((r,n)=>{try{B(r)}catch(o){throw new Error(`Invalid Page at pages[${n}]: ${o instanceof Error?o.message:String(o)}`)}}),!e.paper||typeof e.paper!="object")throw new Error("Book.paper is required and must be an object");return t}function Ft(t){return JSON.stringify(t)}function Kt(t){return JSON.stringify(t)}function $t(t){let e;try{e=JSON.parse(t)}catch{throw new SyntaxError("invalid JSON for Page")}return B(e)}function Wt(t){let e;try{e=JSON.parse(t)}catch{throw new SyntaxError("invalid JSON for Book")}return rt(et(e))}function Ht({checked:t,styleConfig:e}){const r=(e==null?void 0:e.borderColor)??"#000000",n=(e==null?void 0:e.checkColor)??"#000000",o=t?(e==null?void 0:e.checkedBackgroundColor)??"#ffffff":(e==null?void 0:e.backgroundColor)??"#ffffff",i=e!=null&&e.borderWidth?f.fromDim(e.borderWidth):1,s=e!=null&&e.checkWidth?f.fromDim(e.checkWidth):3.5;return x.jsxs("svg",{viewBox:"0 0 20 20",xmlns:"http://www.w3.org/2000/svg",style:{width:"100%",height:"100%",display:"block"},"aria-hidden":"true",children:[x.jsx("rect",{x:"2",y:"2",width:"16",height:"16",rx:"2",ry:"2",fill:o,stroke:r,strokeWidth:i}),t&&x.jsx("path",{d:"M3 11l4 4L17 4",fill:"none",stroke:n,strokeWidth:s,strokeLinecap:"round",strokeLinejoin:"round"})]})}var nt=(t=>(t.SOLID="solid",t.DASHED="dashed",t.DOTTED="dotted",t))(nt||{}),ot=(t=>(t.FORM="Form",t.EDIT="Edit",t.VIEW="View",t))(ot||{});const a={MM:"mm",CM:"cm",FR:"fr",INCH:"inch",PT:"pt",PX:"px",PERCENT:"%"},zt=[a.MM,a.CM,a.FR,a.INCH,a.PT,a.PX,a.PERCENT],Xt=[a.MM,a.CM,a.INCH,a.PT,a.PX],Jt=[a.MM,a.CM,a.INCH],qt=[a.MM,a.CM,a.FR,a.INCH,a.PT,a.PX],Yt=[a.PX,a.PT,a.MM],Zt=[a.PT,a.PX,a.MM],Qt=[a.MM,a.PT,a.PX,a.PERCENT],te=[a.MM,a.CM,a.INCH,a.PT,a.PX,a.PERCENT];var it=(t=>(t.normal="normal",t.breakWord="break-word",t.breakAll="break-all",t))(it||{}),at=(t=>(t.normal="normal",t.nowrap="nowrap",t.pre="pre",t.preWrap="pre-wrap",t.preLine="pre-line",t))(at||{}),st=(t=>(t.text="text",t.number="number",t.email="email",t.tel="tel",t.url="url",t.date="date",t.password="password",t))(st||{});const ee={kind:"textBehavior",defaultProps:{lineHeight:1.2,multiline:!0,wordWrap:"normal",whiteSpace:"normal"}},re={kind:"textValidation",defaultProps:{inputType:"text"}};function ne(t){return`move-arrow-session-${t}`}function oe(t,e){return`layout-${t}-${[...e].sort().join(",")}`}function ie(t){return`binding-${t}`}function ae(t){return`initValue-${t}`}function se(t){return`grid-size-${t}`}function ce(t){return`resize-arrow-session-${t}`}const ct={value:1,unit:"fr"};function ut(t){return Array.from({length:t.colCount},(e,r)=>{var n;return((n=t.cols)==null?void 0:n[r])??ct})}function lt(t){return Array.from({length:t.rowCount},(e,r)=>{var n;return((n=t.rows)==null?void 0:n[r])??ct})}function ue(t){const e={};for(let r=0;r<t.length;r++){const n=t[r];n!==void 0&&!(n.value===1&&n.unit==="fr")&&(e[r]=n)}return{colCount:t.length,cols:Object.keys(e).length>0?e:void 0}}function le(t){const e={};for(let r=0;r<t.length;r++){const n=t[r];n!==void 0&&!(n.value===1&&n.unit==="fr")&&(e[r]=n)}return{rowCount:t.length,rows:Object.keys(e).length>0?e:void 0}}function ft(t){const e=k.useMemo(()=>ut(t),[t]),r=k.useMemo(()=>lt(t),[t]);return{expandedCols:e,expandedRows:r}}function fe(t){if(t.length===0)return[];const e=[];let r=0;for(const n of t){const o=n+r,i=Math.round(o);e.push(i),r=o-i}return e}const me=8,de=32,he=64,ge=512,C=(t,e,r)=>Math.min(Math.max(t,e),r);function j(t){const e=t.length-1,r=e>=1?t[e]??0:0,n=t.length>=1?r/e:0,o=C(Math.ceil(Math.log2(e+1)),me,de),i=C(n*2,he,ge);return{step:o,windowPx:i}}function R(t,e){const r=e.length-1;if(r<=0||e[0]===void 0||t<e[0]||e[r]===void 0)return-1;if(t>=e[r])return r-1;let n=1,o=r;for(;n<=o;){const i=n+o>>>1,s=e[i];if(s===void 0){o=i-1;continue}s<=t?n=i+1:o=i-1}return n-1}function U(t,e,r){const n=t.length-1;let o=0;return i=>{if(n<=0||t[0]===void 0||i<t[0]||t[n]===void 0)return-1;if(i>=t[n])return n-1;const s=t[o],c=t[o+1];if(s===void 0||c===void 0)return-1;if(s<=i&&i<c)return o;const u=s-r,b=c+r;if(i<u||i>=b)return o=R(i,t),o;let w=0;const S=t[o+1];if(S!==void 0&&i>=S)for(;o+1<n;){const v=t[o+1];if(v===void 0||i<v)break;if(o++,++w>e)return o=R(i,t),o}else for(;o>0;){const v=t[o];if(v===void 0||i>=v)break;if(o--,++w>e)return o=R(i,t),o}return o}}function G(t,e){if(t.length===0)return[];let r=0,n=0;const o=t.map(c=>{if(c.unit==="fr")return r+=c.value,null;const u=h.fromDim(c);return n+=u,u});if(r===0)return o;const s=Math.max(0,e-n)/r;return o.map((c,u)=>{if(c!=null)return c;const b=t[u];if(!b)throw new Error(`dims[${u}] is undefined`);return b.value*s})}function V(t,e=p){const r=t.map(n=>f.fromMm(n,e));return fe(r)}function pe(t,e,r=p){const{expandedCols:n,expandedRows:o}=ft(e),i=k.useMemo(()=>{var A;const g=t.orientation?t.size.height:t.size.width,M=t.orientation?t.size.width:t.size.height,E=h.fromDim(g),D=h.fromDim(M),m=t.margin.bulk&&((A=t.margin.all)!=null&&A.unit)?h.fromDim(t.margin.all):void 0,l=m??h.fromDim(t.margin.top),d=m??h.fromDim(t.margin.bottom),P=m??h.fromDim(t.margin.left),_=m??h.fromDim(t.margin.right);return{canvasWidthMm:E,canvasHeightMm:D,marginTopMm:l,marginBottomMm:d,marginLeftMm:P,marginRightMm:_,contentWidthMm:Math.max(0,E-P-_),contentHeightMm:Math.max(0,D-l-d)}},[t]),s=k.useMemo(()=>{const{canvasWidthMm:g,canvasHeightMm:M,marginTopMm:E,marginBottomMm:D,marginLeftMm:m,marginRightMm:l,contentWidthMm:d,contentHeightMm:P}=i;return{canvas:{width:f.fromMm(g,r),height:f.fromMm(M,r)},margin:{top:f.fromMm(E,r),bottom:f.fromMm(D,r),left:f.fromMm(m,r),right:f.fromMm(l,r)},content:{width:f.fromMm(d,r),height:f.fromMm(P,r)}}},[i,r]),{gridPosPx:c,colIndexer:u,rowIndexer:b}=k.useMemo(()=>{const{contentWidthMm:g,contentHeightMm:M}=i,E=V(G(n,g),r),D=V(G(o,M),r),m=[0];for(const y of E)m.push((m[m.length-1]??0)+y);const l=[0];for(const y of D)l.push((l[l.length-1]??0)+y);const{step:d,windowPx:P}=j(m),{step:_,windowPx:A}=j(l);return{gridPosPx:{cols:m,rows:l},colIndexer:U(m,d,P),rowIndexer:U(l,_,A)}},[i,n,o,r]),w=k.useCallback(g=>u(g-s.margin.left),[u,s]),S=k.useCallback(g=>b(g-s.margin.top),[b,s]),v=k.useCallback(g=>{const{x:M,y:E,w:D,h:m}=g.layout,l=c.cols,d=c.rows;if(!l.length||!d.length)return{left:0,top:0,width:0,height:0};const P=Math.min(Math.max(0,M),l.length-1),_=Math.min(Math.max(0,M+D),l.length-1),A=Math.min(Math.max(0,E),d.length-1),y=Math.min(Math.max(0,E+m),d.length-1),mt=(l[P]??0)+s.margin.left,dt=(d[A]??0)+s.margin.top,ht=(l[_]??0)-(l[P]??0),gt=(d[y]??0)-(d[A]??0);return{left:mt,top:dt,width:ht,height:gt}},[c,s]);return{paperPx:s,gridPosPx:c,getColIndex:w,getRowIndex:S,getBlockRectPx:v}}const be='[data-sidebar="true"]',we={"data-sidebar":"true"};exports.ACTUAL_UNITS=Xt;exports.ALL_UNITS=zt;exports.BLOCK_DRAG_MIME=N;exports.BLOCK_SUB_INDEX=vt;exports.BORDER_UNITS=Yt;exports.ClassicCheckboxVisual=Ht;exports.DEFAULT_DPI=p;exports.DEFAULT_GRID=Mt;exports.DEFAULT_PAPER=Dt;exports.DEFAULT_PAPER_MARGIN=H;exports.DEFAULT_PAPER_SIZES=W;exports.FONT_UNITS=Zt;exports.GRID_UNITS=qt;exports.HorizontalAlign=F;exports.InputType=st;exports.LineType=nt;exports.NoteMode=ot;exports.PADDING_UNITS=Qt;exports.PAPER_UNITS=Jt;exports.PaperSizePreset=$;exports.SIDEBAR_PORTAL_PROPS=we;exports.SIDEBAR_PORTAL_SELECTOR=be;exports.SIZE_UNITS=te;exports.Units=a;exports.VerticalAlign=K;exports.WhiteSpace=at;exports.WordWrap=it;exports.Z_INDEX=kt;exports.alignmentProp=pt;exports.arrowMoveKey=ne;exports.bindingKey=ie;exports.checkboxStyleProp=bt;exports.colsToSparse=ue;exports.deserializeBook=Wt;exports.deserializePage=$t;exports.deserializeValues=jt;exports.dimensionToString=_t;exports.expandSparseCols=ut;exports.expandSparseRows=lt;exports.getBlockDragData=Et;exports.getBlockDragKind=Pt;exports.gridSizeKey=se;exports.initValueKey=ae;exports.isBook=Z;exports.isLegacyFormSchema=Y;exports.isValue=I;exports.keyboardResizeKey=ce;exports.layoutPanelKey=oe;exports.migrate=et;exports.migrateBook=Q;exports.migrateFormSchemaToBook=tt;exports.migratePage=q;exports.parseBook=rt;exports.rowsToSparse=le;exports.serializeBook=Kt;exports.serializePage=Ft;exports.startBlockDrag=wt;exports.stringToDimension=At;exports.textBehaviorProp=ee;exports.textValidationProp=re;exports.toMm=h;exports.toPx=f;exports.useExpandedGrid=ft;exports.useGridCalc=pe;exports.validatePage=B;exports.validateValues=T;
@@ -1 +0,0 @@
1
- {"version":3,"file":"sidebarPortal-Cr-dLvA_.cjs","sources":["../src/plugin/properties/alignment.ts","../src/canvas/blocks/checkbox/props.ts","../src/utils/blockDrag/index.ts","../src/types/grid.ts","../src/types/paper.ts","../src/utils/zIndex/constants.ts","../src/utils/convert/index.ts","../src/utils/migration/index.ts","../src/utils/values/index.ts","../src/utils/schema/index.ts","../src/canvas/blocks/checkbox/visual.tsx","../src/types/line.ts","../src/types/mode.ts","../src/types/unit.ts","../src/canvas/blocks/text/props.ts","../src/contexts/history/mergeKeys.ts","../src/utils/grid/sparseGrid.ts","../src/canvas/layers/GridLayer/hooks/useExpandedGrid.ts","../src/canvas/layers/GridLayer/utils/distributeRemainder.ts","../src/canvas/layers/GridLayer/utils/findGridIndex.ts","../src/canvas/layers/GridLayer/utils/gridCalc.ts","../src/canvas/layers/GridLayer/hooks/useGridCalc.ts","../src/shell/bars/Sidebar/sidebarPortal.ts"],"sourcesContent":["import type { PropDef } from \"../types\";\n\n/**\n * ブロック内の水平配置。\n */\nexport enum HorizontalAlign {\n\tleft = \"left\",\n\tcenter = \"center\",\n\tright = \"right\",\n}\n\n/**\n * ブロック内の垂直配置。\n */\nexport enum VerticalAlign {\n\ttop = \"top\",\n\tcenter = \"center\",\n\tbottom = \"bottom\",\n}\n\n/**\n * ブロック内の水平・垂直配置を保持する Props。\n */\nexport interface AlignmentProps {\n\t/** 水平配置 */\n\thorizontal?: HorizontalAlign;\n\n\t/** 垂直配置 */\n\tvertical?: VerticalAlign;\n}\n\n/**\n * 配置プロパティの `PropDef`。\n *\n * @remarks\n * **Canvas** — ブロックプラグイン実装時に `plugin.props` へ追加する。\n */\nexport const alignmentProp = {\n\tkind: \"alignment\",\n\tdefaultProps: {\n\t\thorizontal: HorizontalAlign.left,\n\t\tvertical: VerticalAlign.center,\n\t},\n} satisfies PropDef;\n","import type { PropDef } from \"../../../plugin\";\nimport type { Dimension } from \"../../../types\";\n\n/**\n * チェックボックスの外観カスタマイズ設定。\n */\nexport interface CheckboxStyleConfig {\n\t/** チェックボックス全体のサイズ。 */\n\tcheckboxSize?: Dimension;\n\n\t/** 枠の太さ。 */\n\tborderWidth?: Dimension;\n\n\t/** 枠の色。 */\n\tborderColor?: string;\n\n\t/** チェックマークの線の太さ。 */\n\tcheckWidth?: Dimension;\n\n\t/** チェックマークの色。 */\n\tcheckColor?: string;\n\n\t/** 未チェック時の背景色。 */\n\tbackgroundColor?: string;\n\n\t/** チェック時の背景色。 */\n\tcheckedBackgroundColor?: string;\n}\n\n/**\n * チェックボックスの外観カスタマイズ props。\n */\nexport interface CheckboxStyleProps {\n\t/** 外観カスタマイズ設定。 */\n\tstyleConfig?: CheckboxStyleConfig;\n}\n\n/**\n * `checkboxStyle` prop 定義。チェックボックスの外観デフォルト値を含む。\n */\nexport const checkboxStyleProp = {\n\tkind: \"checkboxStyle\",\n\tdefaultProps: {\n\t\tstyleConfig: {\n\t\t\tcheckboxSize: { value: 16, unit: \"px\" },\n\t\t\tborderWidth: { value: 1, unit: \"px\" },\n\t\t\tborderColor: \"#000000\",\n\t\t\tcheckWidth: { value: 3.5, unit: \"px\" },\n\t\t\tcheckColor: \"#000000\",\n\t\t\tbackgroundColor: \"#ffffff\",\n\t\t\tcheckedBackgroundColor: \"#ffffff\",\n\t\t},\n\t},\n} satisfies PropDef;\n","import type React from \"react\";\n\n/**\n * ブロック挿入 DnD に使う MIME 型。\n *\n * `drop` イベントでのデータ取得に使う。\n *\n * `dragenter` 中は {@link getBlockDragKind} で kind を取得すること。\n */\nexport const BLOCK_DRAG_MIME = \"application/x-tatamicks-block\";\n\n/**\n * `dragenter` 中でも kind を解決できるよう、MIME 型名自体に kind を埋め込むためのプレフィックス。\n *\n * Chrome / Safari では `dragenter` 中に `dataTransfer.getData()` が空文字を返す(セキュリティ制約)。\n *\n * `dataTransfer.types` は読み取れるため、型名に kind を埋め込んで回避する。\n */\nexport const BLOCK_DRAG_KIND_PREFIX = \"application/x-tatamicks-block-kind-\";\n\n/**\n * ブロック挿入 DnD で `dataTransfer` に格納するデータ。\n */\nexport interface BlockDragData {\n\t/** 挿入するブロックの種別 ID。 */\n\tkind: string;\n\n\t/** デフォルトサイズ(グリッドセル数)。 */\n\tdefaultSize?: { w: number; h: number };\n}\n\n/**\n * ブロック挿入 DnD を開始する。\n *\n * `dragstart` イベントハンドラ内で呼ぶ。\n *\n * ドロップ先は自動的に `NoteForm` がハンドルする。\n *\n * @example\n * ```tsx\n * <div\n * draggable\n * onDragStart={(e) => startBlockDrag(e, plugin.kind, plugin.meta.defaultSize)}\n * >\n * {plugin.meta.displayName}\n * </div>\n * ```\n */\nexport function startBlockDrag(\n\te: React.DragEvent | DragEvent,\n\tkind: string,\n\tdefaultSize?: { w: number; h: number },\n): void {\n\tif (!e.dataTransfer) return;\n\tconst data: BlockDragData = { kind, defaultSize };\n\te.dataTransfer.setData(BLOCK_DRAG_MIME, JSON.stringify(data));\n\t// dragenter 中も kind を解決できるよう MIME 型名に埋め込む\n\te.dataTransfer.setData(`${BLOCK_DRAG_KIND_PREFIX}${kind}`, \"\");\n\te.dataTransfer.effectAllowed = \"copy\";\n}\n\n/**\n * `drop` イベントからブロック挿入データを取り出す。\n *\n * ブロック DnD でない場合は `null` を返す。\n *\n * `dragenter` / `dragover` 内では {@link getBlockDragKind} を使うこと。\n */\nexport function getBlockDragData(\n\te: React.DragEvent | DragEvent,\n): BlockDragData | null {\n\tif (!e.dataTransfer) return null;\n\tconst raw = e.dataTransfer.getData(BLOCK_DRAG_MIME);\n\tif (!raw) return null;\n\ttry {\n\t\treturn JSON.parse(raw) as BlockDragData;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * `dragenter` / `dragover` イベントから挿入先ブロックの kind を取得する。\n *\n * Chrome / Safari では `dragenter` 中の `getData()` がセキュリティ制約で空文字を返すため、\n * MIME 型名に埋め込まれた kind を `types` 配列から解決する。\n *\n * ブロック DnD でない場合は `null` を返す。\n */\nexport function getBlockDragKind(\n\te: React.DragEvent | DragEvent,\n): string | null {\n\tif (!e.dataTransfer) return null;\n\tconst kindType = Array.from(e.dataTransfer.types).find((t) =>\n\t\tt.startsWith(BLOCK_DRAG_KIND_PREFIX),\n\t);\n\treturn kindType ? kindType.slice(BLOCK_DRAG_KIND_PREFIX.length) : null;\n}\n","import type { Dimension, GridUnit } from \"./unit\";\n\n/**\n * ページのグリッド定義。\n *\n * @remarks\n * `cols` / `rows` を省略した列/行は全て 1fr 等分割として扱われる。\n */\nexport interface Grid {\n\t/** 列数 */\n\tcolCount: number;\n\n\t/** 行数 */\n\trowCount: number;\n\n\t/** 列のサイズ定義マップ(インデックス → Dimension)。省略時は全列 1fr。 */\n\tcols?: Record<number, Dimension<GridUnit>>;\n\n\t/** 行のサイズ定義マップ(インデックス → Dimension)。省略時は全行 1fr。 */\n\trows?: Record<number, Dimension<GridUnit>>;\n}\n\n/**\n * デフォルトグリッド。A4 縦置き時にセルがほぼ正方形になるよう、\n * 列数 20・行数 28 に設定。\n */\nexport const DEFAULT_GRID: Grid = {\n\tcolCount: 20,\n\trowCount: 28,\n};\n","import type { Dimension, PaperUnit } from \"./unit\";\n\n/**\n * 用紙サイズのプリセット種別。`CUSTOM` 選択時は `PaperSize.width` / `height` が有効になる。\n */\nexport enum PaperSizePreset {\n\tA4 = \"A4\",\n\tB5 = \"B5\",\n\tA3 = \"A3\",\n\tLETTER = \"Letter\",\n\tLEGAL = \"Legal\",\n\tCUSTOM = \"Custom\",\n}\n\n/**\n * 用紙サイズ設定。\n *\n * @remarks\n * `preset` が `CUSTOM` 以外の場合も `width` / `height` には実寸が格納される。\n */\nexport interface PaperSize {\n\t/** 選択中のプリセット */\n\tpreset: PaperSizePreset;\n\n\t/** 幅(物理単位)。`CUSTOM` 時はユーザー指定値。 */\n\twidth: Dimension<PaperUnit>;\n\n\t/** 高さ(物理単位)。`CUSTOM` 時はユーザー指定値。 */\n\theight: Dimension<PaperUnit>;\n}\n\n/**\n * 各プリセットのデフォルト寸法定義。\n */\nexport const DEFAULT_PAPER_SIZES: Record<PaperSizePreset, PaperSize> = {\n\t[PaperSizePreset.A4]: {\n\t\tpreset: PaperSizePreset.A4,\n\t\twidth: { value: 210, unit: \"mm\" },\n\t\theight: { value: 297, unit: \"mm\" },\n\t},\n\t[PaperSizePreset.A3]: {\n\t\tpreset: PaperSizePreset.A3,\n\t\twidth: { value: 297, unit: \"mm\" },\n\t\theight: { value: 420, unit: \"mm\" },\n\t},\n\t[PaperSizePreset.B5]: {\n\t\tpreset: PaperSizePreset.B5,\n\t\twidth: { value: 182, unit: \"mm\" },\n\t\theight: { value: 257, unit: \"mm\" },\n\t},\n\t[PaperSizePreset.LETTER]: {\n\t\tpreset: PaperSizePreset.LETTER,\n\t\twidth: { value: 8.5, unit: \"inch\" },\n\t\theight: { value: 11, unit: \"inch\" },\n\t},\n\t[PaperSizePreset.LEGAL]: {\n\t\tpreset: PaperSizePreset.LEGAL,\n\t\twidth: { value: 8.5, unit: \"inch\" },\n\t\theight: { value: 14, unit: \"inch\" },\n\t},\n\t[PaperSizePreset.CUSTOM]: {\n\t\tpreset: PaperSizePreset.CUSTOM,\n\t\twidth: { value: 210, unit: \"mm\" },\n\t\theight: { value: 297, unit: \"mm\" },\n\t},\n};\n\n/**\n * 用紙四辺のマージン設定。\n */\nexport interface PaperMargin {\n\ttop: Dimension<PaperUnit>;\n\tright: Dimension<PaperUnit>;\n\tbottom: Dimension<PaperUnit>;\n\tleft: Dimension<PaperUnit>;\n\n\t/**\n\t * 一括編集フラグ。`true` のとき、`all` フィールドが四辺の共通値として使われる。\n\t *\n\t * Book に保存されるため、通常の binding パス `margin.bulk` で読み書きできる。\n\t */\n\tbulk?: boolean;\n\n\t/**\n\t * 一括モード時の四辺共通マージン値。`bulk` が `true` のときのみ描画・印刷に使用される。\n\t *\n\t * binding パス `margin.all.value` / `margin.all.unit` で読み書きできる。\n\t */\n\tall?: Dimension<PaperUnit>;\n}\n\n/**\n * デフォルトマージン。四辺すべて 10 mm。\n */\nexport const DEFAULT_PAPER_MARGIN: PaperMargin = {\n\ttop: { value: 10, unit: \"mm\" },\n\tright: { value: 10, unit: \"mm\" },\n\tbottom: { value: 10, unit: \"mm\" },\n\tleft: { value: 10, unit: \"mm\" },\n};\n\n/**\n * ページに適用する用紙設定(サイズ・マージン・向き)。\n */\nexport interface Paper {\n\t/** 用紙サイズ */\n\tsize: PaperSize;\n\n\t/** 用紙マージン */\n\tmargin: PaperMargin;\n\n\t/** 用紙の向き。true = 横向き (landscape)、省略/false = 縦向き (portrait) */\n\torientation?: boolean;\n\n\t/**\n\t * 幅自動リサイズ。\n\t *\n\t * `true` のとき、`widthFit` ブロックの実測幅に合わせてキャンバス幅を広げる。\n\t */\n\tautoWidth?: boolean;\n\n\t/**\n\t * 高さ自動リサイズ。\n\t *\n\t * `true` のとき、`heightFit` ブロックの実測高さに合わせてキャンバス高さを広げる。\n\t */\n\tautoHeight?: boolean;\n}\n\n/**\n * デフォルト用紙設定(A4 縦置き、マージン四辺 10 mm)。\n */\nexport const DEFAULT_PAPER: Paper = {\n\tsize: DEFAULT_PAPER_SIZES[PaperSizePreset.A4],\n\tmargin: DEFAULT_PAPER_MARGIN,\n};\n","/**\n * アプリケーション全体の z-index 層構成定義。\n *\n * GridLayer (10–90)、BlockLayer (100–999,999)、ErrorLayer (1,000,000–)、\n * InteractionLayer (2,000,000–)、Application UI (3,000,000–)の層に分かれている。\n */\nexport const Z_INDEX = {\n\t// ==================== GridLayer (10-90) ====================\n\tGRID_CANVAS: 10,\n\tMARGIN_OVERLAY: 20,\n\tGRID_OVERLAY: 30,\n\tBORDER_OVERLAY: 40,\n\n\t// ==================== BlockLayer (100-999,999) ====================\n\tBLOCK_LAYER_MIN: 100,\n\tBLOCK_LAYER_MAX: 999999,\n\tBLOCK_LAYER_STEP: 100,\n\n\t// ==================== ErrorLayer (1,000,000-1,999,999) ====================\n\tERROR_BORDER: 1100000,\n\tERROR_TOOLTIP: 1200000,\n\tERROR_HIGHLIGHT: 1300000,\n\n\t// ==================== InteractionLayer (2,000,000+) ====================\n\tSELECT_BLOCK: 2000000,\n\tINTERACTION_LAYER_BASE: 2100000,\n\tBLOCK_GHOST: 2200000,\n\tHOVER_OUTLINE: 2300000,\n\tEDIT_BLOCK: 2400000,\n\tBLOCK_SELECT_BORDER: 2500000,\n\tBLOCK_HANDLES: 2600000,\n\tSELECTION_ACTION_BAR: 2650000,\n\tGRID_GHOST: 2700000,\n\tGRID_HANDLES: 2800000,\n\tRUBBER_BAND: 2900000,\n\n\t// ==================== Application UI (3,000,000+) ====================\n\tPROPERTY_PANEL: 3100000,\n\tPALETTE: 3200000,\n\tTOOLTIP: 3300000,\n\tDROPDOWN: 3400000,\n\tCONTEXT_MENU: 3500000,\n\tMODAL: 3600000,\n\n\t// ==================== Debug (10,000,000) ====================\n\tDEBUG: 10000000,\n} as const;\n\n/**\n * 各ブロック内のサブインデックス定義。\n *\n * `getBlockZIndex` が返すベース値に加算し、ブロック内の要素(背景・コンテンツ・ボーダー等)の重ね履き順序を制御する。\n */\nexport const BLOCK_SUB_INDEX = {\n\tBG: 10,\n\tCONTENT: 50,\n\tGUIDE: 70,\n\tBORDER: 80,\n\tVALIDATION: 90,\n} as const;\n\n/** {@link Z_INDEX} の各層値を表す型。 */\nexport type ZIndexValue = (typeof Z_INDEX)[keyof typeof Z_INDEX];\n\n/** {@link BLOCK_SUB_INDEX} の各値を表す型。 */\nexport type BlockSubIndexValue =\n\t(typeof BLOCK_SUB_INDEX)[keyof typeof BLOCK_SUB_INDEX];\n","import type { Dimension, Unit } from \"../../types\";\n\n/**\n * 寸法文字列(例: `\"210mm\"`)を {@link Dimension} オブジェクトに変換する。\n *\n * @throws {@link Error} 文字列が `<数値><単位>` の形式でない場合、または単位が `allowedUnits` 外の場合\n */\nexport function stringToDimension<U extends Unit>(\n\tstr: string,\n\tallowedUnits: readonly U[],\n): Dimension<U> {\n\tconst match = str.match(/^(\\d+(?:\\.\\d+)?)([a-zA-Z%]+)$/);\n\tif (!match) {\n\t\tthrow new Error(`Invalid dimension string: ${str}`);\n\t}\n\n\tconst value = Number(match[1]);\n\tconst unit = match[2] as U;\n\n\tif (!allowedUnits.includes(unit)) {\n\t\tthrow new Error(`Invalid unit: ${unit}`);\n\t}\n\n\treturn { value, unit };\n}\n\n/**\n * {@link Dimension} オブジェクトを寸法文字列(例: `\"210mm\"`)に変換する。\n */\nexport function dimensionToString<U extends Unit>(dim: Dimension<U>): string {\n\treturn `${dim.value}${dim.unit}`;\n}\n\n/**\n * デフォルトの DPI 値。\n *\n * CSS の基準解像度である 96dpi を採用している。\n */\nexport const DEFAULT_DPI = 96;\n\n// mm単位変換の定数\nconst CM_TO_MM = 10;\nconst INCH_TO_MM = 25.4;\nconst PT_TO_MM = 0.352778;\nconst PX_TO_MM = INCH_TO_MM / DEFAULT_DPI; // 25.4 / 96 ≈ 0.264583(DPI=96固定)\n\n/**\n * 各種単位の値を mm に変換するユーティリティオブジェクト。\n *\n * `fr` と `%` のような相対単位は物理長に変換できないため、`fromDim` でこれらを指定すると `Error` をスローする。\n */\nexport const toMm = {\n\tfromCm: (cm: number): number => cm * CM_TO_MM,\n\tfromInch: (inch: number): number => inch * INCH_TO_MM,\n\tfromPt: (pt: number): number => pt * PT_TO_MM,\n\tfromPx: (px: number): number => px * PX_TO_MM,\n\tfromDim<U extends Unit>(dim: Dimension<U>): number {\n\t\tswitch (dim.unit) {\n\t\t\tcase \"mm\":\n\t\t\t\treturn dim.value;\n\t\t\tcase \"cm\":\n\t\t\t\treturn toMm.fromCm(dim.value);\n\t\t\tcase \"inch\":\n\t\t\t\treturn toMm.fromInch(dim.value);\n\t\t\tcase \"pt\":\n\t\t\t\treturn toMm.fromPt(dim.value);\n\t\t\tcase \"px\":\n\t\t\t\treturn toMm.fromPx(dim.value);\n\t\t\tcase \"fr\":\n\t\t\tcase \"%\":\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Cannot convert ${dim.unit} to mm. Use physical units only.`,\n\t\t\t\t);\n\t\t\tdefault: {\n\t\t\t\tconst _exhaustive: never = dim.unit;\n\t\t\t\tthrow new Error(`Unsupported unit: ${_exhaustive}`);\n\t\t\t}\n\t\t}\n\t},\n};\n\n// inch単位変換の定数\nconst MM_PER_INCH = 25.4;\nconst CM_PER_INCH = 2.54;\nconst PT_PER_INCH = 72;\n\n/**\n * 各種単位の値を px に変換するユーティリティオブジェクト。\n *\n * `%` を変換する際は `fromDim` の `baseSizePx` が必要。`fr` の変換はサポートしていないため `Error` をスローする。\n */\nexport const toPx = {\n\tfromMm: (mm: number, dpi: number = DEFAULT_DPI): number =>\n\t\t(mm * dpi) / MM_PER_INCH,\n\tfromCm: (cm: number, dpi: number = DEFAULT_DPI): number =>\n\t\t(cm * dpi) / CM_PER_INCH,\n\tfromInch: (inch: number, dpi: number = DEFAULT_DPI): number => inch * dpi,\n\tfromPt: (pt: number, dpi: number = DEFAULT_DPI): number =>\n\t\t(pt * dpi) / PT_PER_INCH,\n\t// CSS px(96dpi 基準)を指定 DPI のスクリーン物理 px に変換\n\tfromPx: (px: number, dpi: number = DEFAULT_DPI): number =>\n\t\t(px * dpi) / DEFAULT_DPI,\n\tfromDim<U extends Unit>(\n\t\tdim: Dimension<U>,\n\t\tdpi: number = DEFAULT_DPI,\n\t\tbaseSizePx?: number,\n\t): number {\n\t\tswitch (dim.unit) {\n\t\t\tcase \"mm\":\n\t\t\t\treturn toPx.fromMm(dim.value, dpi);\n\t\t\tcase \"cm\":\n\t\t\t\treturn toPx.fromCm(dim.value, dpi);\n\t\t\tcase \"inch\":\n\t\t\t\treturn toPx.fromInch(dim.value, dpi);\n\t\t\tcase \"pt\":\n\t\t\t\treturn toPx.fromPt(dim.value, dpi);\n\t\t\tcase \"px\":\n\t\t\t\treturn toPx.fromPx(dim.value, dpi);\n\t\t\tcase \"%\":\n\t\t\t\tif (baseSizePx === undefined) {\n\t\t\t\t\tthrow new Error(`Base size must be defined for percentage values.`);\n\t\t\t\t}\n\t\t\t\treturn (dim.value / 100) * baseSizePx;\n\t\t\tcase \"fr\":\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Cannot convert ${dim.unit} to px. Use physical units only.`,\n\t\t\t\t);\n\t\t\tdefault: {\n\t\t\t\tconst _exhaustive: never = dim.unit;\n\t\t\t\tthrow new Error(`Unsupported unit: ${_exhaustive}`);\n\t\t\t}\n\t\t}\n\t},\n};\n","import type { Block } from \"../../types/block\";\nimport type { Grid } from \"../../types/grid\";\nimport type { Paper } from \"../../types/paper\";\nimport type { BlockDefaults, Book, Page } from \"../../types/schema\";\nimport type { Dimension, GridUnit } from \"../../types/unit\";\nimport type { Value } from \"../../types/value\";\n\n// ---------------------------------------------------------------------------\n// プラグインレジストリの最小型\n// ---------------------------------------------------------------------------\n\n/**\n * マイグレーション用のプラグインレジストリ型。\n *\n * 各プラグインは `migrateProps` を任意に実装でき、旧プロパティ形式を現形式に変換する契約を持つ。\n */\nexport type MigrationPluginRegistry = Record<\n\tstring,\n\t{ migrateProps?: (props: unknown) => Record<string, unknown> }\n>;\n\n// ---------------------------------------------------------------------------\n// Alignment 変換マップ\n// ---------------------------------------------------------------------------\n\nconst H_ALIGN_MAP: Record<string, string> = {\n\t\"flex-start\": \"left\",\n\tcenter: \"center\",\n\t\"flex-end\": \"right\",\n};\n\nconst V_ALIGN_MAP: Record<string, string> = {\n\t\"flex-start\": \"top\",\n\tcenter: \"center\",\n\t\"flex-end\": \"bottom\",\n};\n\n// ---------------------------------------------------------------------------\n// 内部ヘルパー\n// ---------------------------------------------------------------------------\n\n// ディメンションがデフォルト値(1fr)かどうかを判定する\nfunction isDefaultDim(d: unknown): boolean {\n\treturn (\n\t\ttypeof d === \"object\" &&\n\t\td !== null &&\n\t\t(d as Dimension<GridUnit>).value === 1 &&\n\t\t(d as Dimension<GridUnit>).unit === \"fr\"\n\t);\n}\n\n// ディメンション配列をスパースインデックス形式に変換する\nfunction arrayToSparse(\n\tdims: Dimension<GridUnit>[],\n): Record<number, Dimension<GridUnit>> {\n\tconst sparse: Record<number, Dimension<GridUnit>> = {};\n\tfor (let i = 0; i < dims.length; i++) {\n\t\tconst dim = dims[i];\n\t\tif (dim !== undefined && !isDefaultDim(dim)) {\n\t\t\tsparse[i] = dim;\n\t\t}\n\t}\n\treturn sparse;\n}\n\n// 旧配列形式の grid をスパース形式(Grid 型)に移行する\nfunction migrateGrid(grid: unknown): Grid {\n\tif (typeof grid !== \"object\" || grid === null) {\n\t\tthrow new Error(\"grid must be an object\");\n\t}\n\tconst g = grid as Record<string, unknown>;\n\n\t// 旧配列形式: { cols: [...], rows: [...] }\n\tif (Array.isArray(g.cols) && Array.isArray(g.rows)) {\n\t\tconst colsArr = g.cols as Dimension<GridUnit>[];\n\t\tconst rowsArr = g.rows as Dimension<GridUnit>[];\n\n\t\tconst result: Grid = {\n\t\t\tcolCount: colsArr.length,\n\t\t\trowCount: rowsArr.length,\n\t\t};\n\n\t\tconst sparseCols = arrayToSparse(colsArr);\n\t\tif (Object.keys(sparseCols).length > 0) {\n\t\t\tresult.cols = sparseCols;\n\t\t}\n\n\t\tconst sparseRows = arrayToSparse(rowsArr);\n\t\tif (Object.keys(sparseRows).length > 0) {\n\t\t\tresult.rows = sparseRows;\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t// 新形式(Grid): そのまま返す\n\treturn grid as Grid;\n}\n\n// 旧形式(all / isIndividual)の padding プロパティを現形式(top / right / bottom / left)に変換する\nfunction migratePadding(\n\tprops: Record<string, unknown>,\n): Record<string, unknown> {\n\t// `isIndividual` キーが存在する場合のみ旧形式とみなす\n\t// 新形式は `bulk` キーを使用するため、`all` のみ存在する場合は変換しない\n\tif (!(\"isIndividual\" in props)) {\n\t\treturn props;\n\t}\n\n\tconst result = { ...props };\n\tconst isIndividual = result.isIndividual ?? true;\n\tconst allVal = result.all;\n\tdelete result.isIndividual;\n\tdelete result.all;\n\n\tif (!isIndividual && allVal !== undefined) {\n\t\tif (!(\"top\" in result)) result.top = allVal;\n\t\tif (!(\"right\" in result)) result.right = allVal;\n\t\tif (!(\"bottom\" in result)) result.bottom = allVal;\n\t\tif (!(\"left\" in result)) result.left = allVal;\n\t}\n\n\treturn result;\n}\n\n// 旧形式(justifyContent / alignItems)の配置プロパティを現形式(horizontal / vertical)に変換する\nfunction migrateAlignment(\n\tprops: Record<string, unknown>,\n): Record<string, unknown> {\n\tconst result = { ...props };\n\n\tif (\"justifyContent\" in result) {\n\t\tconst oldVal = result.justifyContent as string;\n\t\tresult.horizontal = H_ALIGN_MAP[oldVal] ?? oldVal;\n\t\tdelete result.justifyContent;\n\t}\n\n\tif (\"alignItems\" in result) {\n\t\tconst oldVal = result.alignItems as string;\n\t\tresult.vertical = V_ALIGN_MAP[oldVal] ?? oldVal;\n\t\tdelete result.alignItems;\n\t}\n\n\treturn result;\n}\n\n// 1ブロックの props に padding ・ alignment の移行を適用する\nfunction migrateBlockProps(props: unknown): Record<string, unknown> {\n\tif (typeof props !== \"object\" || props === null) {\n\t\treturn props as Record<string, unknown>;\n\t}\n\tlet result = { ...(props as Record<string, unknown>) };\n\tresult = migratePadding(result);\n\tresult = migrateAlignment(result);\n\treturn result;\n}\n\n// 1ページ分のデータにグリッド・ブロックの移行を適用し、Page 型として返す\nexport function migratePage(\n\tpage: unknown,\n\tregistry?: MigrationPluginRegistry,\n): Page {\n\tif (typeof page !== \"object\" || page === null) {\n\t\tthrow new Error(\"page must be an object\");\n\t}\n\tconst p = { ...(page as Record<string, unknown>) };\n\n\tif (\"grid\" in p) {\n\t\tp.grid = migrateGrid(p.grid);\n\t}\n\n\tif (Array.isArray(p.blocks)) {\n\t\tp.blocks = p.blocks.map((block: unknown) => {\n\t\t\tif (typeof block === \"object\" && block !== null) {\n\t\t\t\tconst b = { ...(block as Record<string, unknown>) };\n\t\t\t\tif (\"props\" in b) {\n\t\t\t\t\tb.props = migrateBlockProps(b.props);\n\t\t\t\t}\n\t\t\t\tconst kind = typeof b.kind === \"string\" ? b.kind : undefined;\n\t\t\t\tif (kind && registry) {\n\t\t\t\t\tconst plugin = registry[kind];\n\t\t\t\t\tif (plugin?.migrateProps) {\n\t\t\t\t\t\tb.props = plugin.migrateProps(b.props);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn b;\n\t\t\t}\n\t\t\treturn block;\n\t\t});\n\t}\n\n\treturn {\n\t\tgrid: p.grid as Grid,\n\t\tblocks: p.blocks as Block[],\n\t\t...(p.blockDefaults !== undefined\n\t\t\t? { blockDefaults: p.blockDefaults as BlockDefaults }\n\t\t\t: {}),\n\t\t...(p.metaData !== undefined\n\t\t\t? { metaData: p.metaData as Record<string, Value> }\n\t\t\t: {}),\n\t};\n}\n\n// ---------------------------------------------------------------------------\n// 公開関数\n// ---------------------------------------------------------------------------\n\n/**\n * 旧 FormSchema 形式かどうかを判定する(`grid` + `blocks` がトップレベル、`pages` なし)。\n */\nexport function isLegacyFormSchema(data: unknown): boolean {\n\treturn (\n\t\ttypeof data === \"object\" &&\n\t\tdata !== null &&\n\t\t!(\"pages\" in data) &&\n\t\t\"grid\" in data &&\n\t\t\"blocks\" in data\n\t);\n}\n\n/**\n * Book 形式かどうかを判定する(`pages` がトップレベル)。\n */\nexport function isBook(data: unknown): boolean {\n\treturn typeof data === \"object\" && data !== null && \"pages\" in data;\n}\n\n/**\n * Book の全ページをデータ移行する(形式 B)。\n *\n * @throws {@link Error} `notebook` がオブジェクトでない場合\n */\nexport function migrateBook(\n\tnotebook: unknown,\n\tregistry?: MigrationPluginRegistry,\n): Book {\n\tif (typeof notebook !== \"object\" || notebook === null) {\n\t\tthrow new Error(\"Book must be a JSON object\");\n\t}\n\tconst nb = { ...(notebook as Record<string, unknown>) };\n\n\tif (Array.isArray(nb.pages)) {\n\t\tnb.pages = nb.pages.map((page) => migratePage(page, registry));\n\t}\n\n\treturn {\n\t\tpaper: nb.paper as Paper,\n\t\tpages: nb.pages as [Page, ...Page[]],\n\t\t...(nb.metaData !== undefined\n\t\t\t? { metaData: nb.metaData as Record<string, Value> }\n\t\t\t: {}),\n\t};\n}\n\n/**\n * 旧 FormSchema を Book 形式に構造変換する(形式 A)。\n *\n * @throws {@link Error} `schema` がオブジェクトでない場合\n */\nexport function migrateFormSchemaToBook(\n\tschema: unknown,\n\tregistry?: MigrationPluginRegistry,\n): Book {\n\tif (typeof schema !== \"object\" || schema === null) {\n\t\tthrow new Error(\"Schema must be a JSON object\");\n\t}\n\tconst source = { ...(schema as Record<string, unknown>) };\n\tconst page: Record<string, unknown> = {};\n\n\tif (\"grid\" in source) {\n\t\tpage.grid = migrateGrid(source.grid);\n\t\tdelete source.grid;\n\t}\n\n\tif (\"blocks\" in source) {\n\t\tconst blocks = source.blocks;\n\t\tif (Array.isArray(blocks)) {\n\t\t\tpage.blocks = blocks.map((block: unknown) => {\n\t\t\t\tif (typeof block === \"object\" && block !== null) {\n\t\t\t\t\tconst b = { ...(block as Record<string, unknown>) };\n\t\t\t\t\tif (\"props\" in b) {\n\t\t\t\t\t\tb.props = migrateBlockProps(b.props);\n\t\t\t\t\t}\n\t\t\t\t\tconst kind = typeof b.kind === \"string\" ? b.kind : undefined;\n\t\t\t\t\tif (kind && registry) {\n\t\t\t\t\t\tconst plugin = registry[kind];\n\t\t\t\t\t\tif (plugin?.migrateProps) {\n\t\t\t\t\t\t\tb.props = plugin.migrateProps(b.props);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn b;\n\t\t\t\t}\n\t\t\t\treturn block;\n\t\t\t});\n\t\t}\n\t\tdelete source.blocks;\n\t}\n\n\tif (\"metaData\" in source) {\n\t\tpage.metaData = source.metaData;\n\t\tdelete source.metaData;\n\t}\n\n\tconst notebook: Record<string, unknown> = {};\n\tif (\"paper\" in source) {\n\t\tnotebook.paper = source.paper;\n\t\tdelete source.paper;\n\t}\n\n\tconst migratedPage: Page = {\n\t\tgrid: page.grid as Grid,\n\t\tblocks: (page.blocks ?? []) as Block[],\n\t\t...(page.metaData !== undefined\n\t\t\t? { metaData: page.metaData as Record<string, Value> }\n\t\t\t: {}),\n\t};\n\n\treturn {\n\t\tpaper: notebook.paper as Paper,\n\t\tpages: [migratedPage],\n\t};\n}\n\n/**\n * 入力データの形式を自動判定し、適切な移行を実行する。\n *\n * - 旧 FormSchema(`grid` + `blocks` がトップレベル) → Book へ構造変換\n * - Book(`pages` がトップレベル) → 各ページのデータを移行\n *\n * @throws {@link Error} 入力データがいずれの形式にも該当しない場合\n */\nexport function migrate(\n\tdata: unknown,\n\tregistry?: MigrationPluginRegistry,\n): Book {\n\tif (isLegacyFormSchema(data)) {\n\t\treturn migrateFormSchemaToBook(data, registry);\n\t}\n\tif (isBook(data)) {\n\t\treturn migrateBook(data, registry);\n\t}\n\tthrow new Error(\n\t\t\"入力データの形式を判別できません。\\n\" +\n\t\t\t\" 形式 A(旧 FormSchema): トップレベルに 'grid' と 'blocks' が必要\\n\" +\n\t\t\t\" 形式 B(Book): トップレベルに 'pages' が必要\",\n\t);\n}\n","import type { Value } from \"../../types\";\n\n/**\n * 値が {@link Value} 型かどうかを判定する型ガード。\n *\n * `null`・プリミティブ(文字列・数値・ブールアン)・プレインオブジェクト・配列を再帰的に認め、\n * それ以外は `false` を返す。\n */\nexport function isValue(v: unknown): v is Value {\n\tif (v === null) return true;\n\tswitch (typeof v) {\n\t\tcase \"string\":\n\t\tcase \"number\":\n\t\tcase \"boolean\":\n\t\t\treturn true;\n\t\tcase \"object\":\n\t\t\tif (Array.isArray(v)) return v.every(isValue);\n\t\t\tif (Object.getPrototypeOf(v) === Object.prototype)\n\t\t\t\treturn Object.values(v as Record<string, unknown>).every(isValue);\n\t\t\treturn false;\n\t\tdefault:\n\t\t\treturn false;\n\t}\n}\n\n/**\n * 未検証の値を `Record<string, Value>` として検証する。\n *\n * @throws {@link Error} 値がプレインオブジェクトでない場合、またはいずれかのプロパティが無効な {@link Value} の場合\n */\nexport function validateValues(data: unknown): Record<string, Value> {\n\tif (\n\t\tdata === null ||\n\t\ttypeof data !== \"object\" ||\n\t\tArray.isArray(data) ||\n\t\tObject.getPrototypeOf(data) !== Object.prototype\n\t) {\n\t\tthrow new Error(\"values must be a plain object\");\n\t}\n\tconst obj = data as Record<string, unknown>;\n\tfor (const [key, val] of Object.entries(obj)) {\n\t\tif (!isValue(val)) {\n\t\t\tthrow new Error(`values[\"${key}\"] contains an invalid value`);\n\t\t}\n\t}\n\treturn obj as Record<string, Value>;\n}\n\n/**\n * JSON 文字列をパース・検証して `Record<string, Value>` を返す。\n *\n * @throws {@link SyntaxError} JSON が無効な場合\n * @throws {@link Error} 値が無効な {@link Value} を含む場合\n */\nexport function deserializeValues(json: string): Record<string, Value> {\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(json);\n\t} catch {\n\t\tthrow new SyntaxError(\"invalid JSON for values\");\n\t}\n\treturn validateValues(parsed);\n}\n","import { migrate } from \"../migration\";\nimport { isValue, validateValues } from \"../values\";\n\nimport type { Block } from \"../../types/block\";\nimport type { Grid } from \"../../types/grid\";\nimport type { Book, Page } from \"../../types/schema\";\n\n// Grid 型の形式チェック\nfunction isGrid(value: unknown): value is Grid {\n\tif (typeof value !== \"object\" || value === null) return false;\n\tconst obj = value as Record<string, unknown>;\n\tif (typeof obj.colCount !== \"number\" || obj.colCount < 1) return false;\n\tif (typeof obj.rowCount !== \"number\" || obj.rowCount < 1) return false;\n\treturn true;\n}\n\n// HiddenBinding 型の形式チェック\nfunction isHiddenBinding(value: unknown): boolean {\n\tif (typeof value === \"string\") return true;\n\tif (typeof value !== \"object\" || value === null) return false;\n\tconst obj = value as Record<string, unknown>;\n\tif (typeof obj.path !== \"string\") return false;\n\tconst hasPrimitive = (v: unknown) =>\n\t\tv === null ||\n\t\ttypeof v === \"string\" ||\n\t\ttypeof v === \"number\" ||\n\t\ttypeof v === \"boolean\";\n\tif (\"eq\" in obj) return hasPrimitive(obj.eq);\n\tif (\"neq\" in obj) return hasPrimitive(obj.neq);\n\treturn false;\n}\n\n// Block 型の形式チェック\nfunction isBlock(value: unknown): value is Block {\n\tif (typeof value !== \"object\" || value === null) return false;\n\tconst obj = value as Record<string, unknown>;\n\tif (typeof obj.id !== \"string\") return false;\n\tif (typeof obj.kind !== \"string\") return false;\n\tif (typeof obj.layout !== \"object\" || obj.layout === null) return false;\n\tconst layout = obj.layout as Record<string, unknown>;\n\tif (\n\t\ttypeof layout.x !== \"number\" ||\n\t\ttypeof layout.y !== \"number\" ||\n\t\ttypeof layout.w !== \"number\" ||\n\t\ttypeof layout.h !== \"number\"\n\t) {\n\t\treturn false;\n\t}\n\tif (\n\t\ttypeof obj.props !== \"object\" ||\n\t\tobj.props === null ||\n\t\tArray.isArray(obj.props)\n\t)\n\t\treturn false;\n\t// props の各値が Value 型(JSON serializable)か確認\n\ttry {\n\t\tvalidateValues(obj.props);\n\t} catch {\n\t\treturn false;\n\t}\n\t// initValue が指定されている場合は Value 型か確認\n\tif (\"initValue\" in obj && !isValue(obj.initValue)) return false;\n\t// hiddenBinding が指定されている場合は形式確認\n\tif (\"hiddenBinding\" in obj && !isHiddenBinding(obj.hiddenBinding))\n\t\treturn false;\n\treturn true;\n}\n\n/**\n * 未検証の値を {@link Page} として検証する。\n *\n * @throws {@link Error} ページの構造(`grid` / `blocks` / `metaData`)が不正な場合\n */\nexport function validatePage(value: unknown): Page {\n\tif (typeof value !== \"object\" || value === null) {\n\t\tthrow new Error(\"Page must be an object\");\n\t}\n\tconst obj = value as Record<string, unknown>;\n\n\tif (obj.id !== undefined && typeof obj.id !== \"string\") {\n\t\tthrow new Error(\"Page.id must be a string if provided\");\n\t}\n\n\tif (!isGrid(obj.grid)) {\n\t\tthrow new Error(\"Invalid grid definition\");\n\t}\n\n\tif (!Array.isArray(obj.blocks)) {\n\t\tthrow new Error(\"blocks must be an array\");\n\t}\n\tif (!obj.blocks.every(isBlock)) {\n\t\tthrow new Error(\"Invalid block definition in blocks array\");\n\t}\n\n\tif (obj.metaData !== undefined) {\n\t\tif (typeof obj.metaData !== \"object\" || obj.metaData === null) {\n\t\t\tthrow new Error(\"metaData must be an object if provided\");\n\t\t}\n\t\ttry {\n\t\t\tvalidateValues(obj.metaData);\n\t\t} catch (e) {\n\t\t\tthrow new Error(\n\t\t\t\t`Invalid metaData: ${e instanceof Error ? e.message : String(e)}`,\n\t\t\t);\n\t\t}\n\t}\n\n\tif (obj.blockDefaults !== undefined) {\n\t\tif (\n\t\t\ttypeof obj.blockDefaults !== \"object\" ||\n\t\t\tobj.blockDefaults === null ||\n\t\t\tArray.isArray(obj.blockDefaults)\n\t\t) {\n\t\t\tthrow new Error(\"blockDefaults must be a plain object if provided\");\n\t\t}\n\t\tconst bd = obj.blockDefaults as Record<string, unknown>;\n\t\tfor (const [kind, defaults] of Object.entries(bd)) {\n\t\t\ttry {\n\t\t\t\tvalidateValues(defaults);\n\t\t\t} catch (e) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Invalid blockDefaults[\"${kind}\"]: ${e instanceof Error ? e.message : String(e)}`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn value as Page;\n}\n\n/**\n * 未検証の値を {@link Book} として検証する。\n *\n * @throws {@link Error} `pages` が存在しないまたは空、各ページの構造が不正、`paper` が存在しない場合\n */\nexport function parseBook(value: unknown): Book {\n\tif (typeof value !== \"object\" || value === null) {\n\t\tthrow new Error(\"Book must be an object\");\n\t}\n\tconst obj = value as Record<string, unknown>;\n\n\tif (!Array.isArray(obj.pages) || obj.pages.length === 0) {\n\t\tthrow new Error(\"Book must have at least one page in pages\");\n\t}\n\tobj.pages.forEach((page: unknown, i: number) => {\n\t\ttry {\n\t\t\tvalidatePage(page);\n\t\t} catch (e) {\n\t\t\tthrow new Error(\n\t\t\t\t`Invalid Page at pages[${i}]: ${e instanceof Error ? e.message : String(e)}`,\n\t\t\t);\n\t\t}\n\t});\n\n\tif (!obj.paper || typeof obj.paper !== \"object\") {\n\t\tthrow new Error(\"Book.paper is required and must be an object\");\n\t}\n\n\treturn value as Book;\n}\n\n/**\n * {@link Page} を JSON 文字列にシリアライズする。\n */\nexport function serializePage(page: Page): string {\n\treturn JSON.stringify(page);\n}\n\n/**\n * {@link Book} を JSON 文字列にシリアライズする。\n */\nexport function serializeBook(book: Book): string {\n\treturn JSON.stringify(book);\n}\n\n/**\n * JSON 文字列をパース・検証して {@link Page} を返す。\n *\n * @throws {@link SyntaxError} JSON が無効な場合\n * @throws {@link Error} ページの構造が不正な場合\n */\nexport function deserializePage(json: string): Page {\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(json);\n\t} catch {\n\t\tthrow new SyntaxError(\"invalid JSON for Page\");\n\t}\n\treturn validatePage(parsed);\n}\n\n/**\n * JSON 文字列をパース・検証して {@link Book} を返す。\n *\n * @throws {@link SyntaxError} JSON が無効な場合\n * @throws {@link Error} Book の構造が不正な場合\n */\nexport function deserializeBook(json: string): Book {\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(json);\n\t} catch {\n\t\tthrow new SyntaxError(\"invalid JSON for Book\");\n\t}\n\treturn parseBook(migrate(parsed));\n}\n","import { toPx } from \"../../../utils\";\n\nimport type { CheckboxStyleConfig } from \"./props\";\n\n// ClassicCheckboxVisualProps: ClassicCheckboxVisual 内部 props\ninterface ClassicCheckboxVisualProps {\n\tchecked: boolean;\n\tstyleConfig?: CheckboxStyleConfig;\n}\n\n/**\n * チェックボックスの SVG ビジュアルコンポーネント(クラシックスタイル)。\n *\n * `styleConfig` の各フィールドが未指定の場合はデフォルト値で描画する。\n */\nexport function ClassicCheckboxVisual({\n\tchecked,\n\tstyleConfig,\n}: ClassicCheckboxVisualProps) {\n\tconst borderColor = styleConfig?.borderColor ?? \"#000000\";\n\tconst checkColor = styleConfig?.checkColor ?? \"#000000\";\n\tconst bg = checked\n\t\t? (styleConfig?.checkedBackgroundColor ?? \"#ffffff\")\n\t\t: (styleConfig?.backgroundColor ?? \"#ffffff\");\n\tconst borderWidth = styleConfig?.borderWidth\n\t\t? toPx.fromDim(styleConfig.borderWidth)\n\t\t: 1;\n\tconst checkWidth = styleConfig?.checkWidth\n\t\t? toPx.fromDim(styleConfig.checkWidth)\n\t\t: 3.5;\n\n\treturn (\n\t\t<svg\n\t\t\tviewBox=\"0 0 20 20\"\n\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\tstyle={{ width: \"100%\", height: \"100%\", display: \"block\" }}\n\t\t\taria-hidden=\"true\"\n\t\t>\n\t\t\t<rect\n\t\t\t\tx=\"2\"\n\t\t\t\ty=\"2\"\n\t\t\t\twidth=\"16\"\n\t\t\t\theight=\"16\"\n\t\t\t\trx=\"2\"\n\t\t\t\try=\"2\"\n\t\t\t\tfill={bg}\n\t\t\t\tstroke={borderColor}\n\t\t\t\tstrokeWidth={borderWidth}\n\t\t\t/>\n\t\t\t{checked && (\n\t\t\t\t<path\n\t\t\t\t\td=\"M3 11l4 4L17 4\"\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t\tstroke={checkColor}\n\t\t\t\t\tstrokeWidth={checkWidth}\n\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t/>\n\t\t\t)}\n\t\t</svg>\n\t);\n}\n","import type { BorderUnit, Dimension } from \"./unit\";\n\n/**\n * 枠線・区切り線に適用するスタイル種別。\n */\nexport enum LineType {\n\t/** 実線 */\n\tSOLID = \"solid\",\n\n\t/** 破線 */\n\tDASHED = \"dashed\",\n\n\t/** 点線 */\n\tDOTTED = \"dotted\",\n}\n\n/**\n * 線のスタイル定義(色・幅・種別)。\n */\nexport interface LineStyle {\n\t/** CSS カラー値 */\n\tcolor: string;\n\n\t/** 線の幅 */\n\twidth: Dimension<BorderUnit>;\n\n\t/** 線の種別 */\n\ttype: LineType;\n}\n\n/**\n * 四辺それぞれの枠線スタイル定義。省略した辺は枠線なし。\n *\n * `all` を指定した場合、各辺に個別指定がなければ `all` の値が全辺に適用される。\n */\nexport interface BorderStyle {\n\ttop?: LineStyle;\n\tright?: LineStyle;\n\tbottom?: LineStyle;\n\tleft?: LineStyle;\n\n\t/** 全辺共通スタイル。各辺に個別指定がない場合のフォールバック */\n\tall?: LineStyle;\n}\n","/**\n * Note の表示・編集モード。\n */\nexport enum NoteMode {\n\t/**\n\t * ブロックの配置・サイズ変更、グリッド設定、`initValue`(初期値)の設定が可能。\n\t *\n\t * 入力コントロールは動作するが、値はセッション内のみ保持される(永続化されない)。\n\t */\n\tFORM = \"Form\",\n\n\t/**\n\t * ブロックの値を入力・編集できる。\n\t *\n\t * レイアウトや `initValue` は変更不可。\n\t */\n\tEDIT = \"Edit\",\n\n\t/**\n\t * すべて読み取り専用。入力コントロールは無効。\n\t *\n\t * `showValidation` によるバリデーション結果の表示が有効。\n\t */\n\tVIEW = \"View\",\n}\n","/**\n * このパッケージで扱う全単位の列挙。\n */\nexport const Units = {\n\tMM: \"mm\",\n\tCM: \"cm\",\n\tFR: \"fr\",\n\tINCH: \"inch\",\n\tPT: \"pt\",\n\tPX: \"px\",\n\tPERCENT: \"%\",\n} as const;\n\n/**\n * 全単位の配列。\n */\nexport const ALL_UNITS = [\n\tUnits.MM,\n\tUnits.CM,\n\tUnits.FR,\n\tUnits.INCH,\n\tUnits.PT,\n\tUnits.PX,\n\tUnits.PERCENT,\n] as const;\n\n/**\n * 物理的な実寸を表す単位の配列(`fr` / `%` を除く)。\n */\nexport const ACTUAL_UNITS = [\n\tUnits.MM,\n\tUnits.CM,\n\tUnits.INCH,\n\tUnits.PT,\n\tUnits.PX,\n] as const;\n\n/**\n * 用紙サイズに使用できる単位の配列。\n */\nexport const PAPER_UNITS = [Units.MM, Units.CM, Units.INCH] as const;\n\n/**\n * グリッドの列・行サイズに使用できる単位の配列。\n */\nexport const GRID_UNITS = [\n\tUnits.MM,\n\tUnits.CM,\n\tUnits.FR,\n\tUnits.INCH,\n\tUnits.PT,\n\tUnits.PX,\n] as const;\n\n/**\n * 枠線の幅に使用できる単位の配列。\n */\nexport const BORDER_UNITS = [Units.PX, Units.PT, Units.MM] as const;\n\n/**\n * フォントサイズに使用できる単位の配列。\n */\nexport const FONT_UNITS = [Units.PT, Units.PX, Units.MM] as const;\n\n/**\n * パディングに使用できる単位の配列。\n */\nexport const PADDING_UNITS = [\n\tUnits.MM,\n\tUnits.PT,\n\tUnits.PX,\n\tUnits.PERCENT,\n] as const;\n\n/**\n * ブロックの幅・高さに使用できる単位の配列。\n */\nexport const SIZE_UNITS = [\n\tUnits.MM,\n\tUnits.CM,\n\tUnits.INCH,\n\tUnits.PT,\n\tUnits.PX,\n\tUnits.PERCENT,\n] as const;\n\n/**\n * このパッケージで使用できる全単位。\n */\nexport type Unit = (typeof ALL_UNITS)[number];\n\n/**\n * 物理的な実寸を表す単位(`fr` / `%` を除く)。\n */\nexport type ActualUnit = (typeof ACTUAL_UNITS)[number];\n\n/**\n * 用紙サイズに使用できる単位。\n */\nexport type PaperUnit = (typeof PAPER_UNITS)[number];\n\n/**\n * グリッドの列・行サイズに使用できる単位(`fr` を含む)。\n */\nexport type GridUnit = (typeof GRID_UNITS)[number];\n\n/**\n * 枠線の幅に使用できる単位。\n */\nexport type BorderUnit = (typeof BORDER_UNITS)[number];\n\n/**\n * フォントサイズに使用できる単位。\n */\nexport type FontUnit = (typeof FONT_UNITS)[number];\n\n/**\n * パディングに使用できる単位(`%` を含む)。\n */\nexport type PaddingUnit = (typeof PADDING_UNITS)[number];\n\n/**\n * ブロックの幅・高さに使用できる単位(`%` を含む)。\n */\nexport type SizeUnit = (typeof SIZE_UNITS)[number];\n\n/**\n * 数値と単位の組み合わせ。\n */\nexport interface Dimension<U extends Unit = Unit> {\n\t/** 数値 */\n\tvalue: number;\n\n\t/** 単位 */\n\tunit: U;\n}\n","// textブロック用のプロパティ定義と型定義\n\nimport type { PropDef } from \"../../../plugin\";\n\n/**\n * テキストの折り返し・改行插入の振る舞い。\n */\nexport enum WordWrap {\n\tnormal = \"normal\",\n\tbreakWord = \"break-word\",\n\tbreakAll = \"break-all\",\n}\n\n/**\n * テキストの改行・スペースのレンダリング模式(CSS `white-space` 相当)。\n */\nexport enum WhiteSpace {\n\tnormal = \"normal\",\n\tnowrap = \"nowrap\",\n\tpre = \"pre\",\n\tpreWrap = \"pre-wrap\",\n\tpreLine = \"pre-line\",\n}\n\n/**\n * テキスト入力の HTML `input[type]` 属性値。バリデーション・キーボードの振る舞いに影響する。\n */\nexport enum InputType {\n\ttext = \"text\",\n\tnumber = \"number\",\n\temail = \"email\",\n\ttel = \"tel\",\n\turl = \"url\",\n\tdate = \"date\",\n\tpassword = \"password\",\n}\n\n/**\n * テキスト入力の改行・折り返し・行間隔などのレイアウト挙動 props。\n */\nexport interface TextBehaviorProps {\n\t/** 行間隔(CSS `line-height` 相当)。デフォルト: 1.2。 */\n\tlineHeight?: number;\n\n\t/** `true` のとき複数行入力を許可する。デフォルト: true。 */\n\tmultiline?: boolean;\n\n\t/** 折り返しの振る舞い(CSS `overflow-wrap` 相当)。 */\n\twordWrap?: WordWrap;\n\n\t/** スペース・改行のレンダリング模式(CSS `white-space` 相当)。 */\n\twhiteSpace?: WhiteSpace;\n}\n\n/**\n * `textBehavior` prop 定義。テキストブロックのレイアウト挙動のデフォルト値を含む。\n */\nexport const textBehaviorProp = {\n\tkind: \"textBehavior\",\n\tdefaultProps: {\n\t\tlineHeight: 1.2,\n\t\tmultiline: true,\n\t\twordWrap: WordWrap.normal,\n\t\twhiteSpace: WhiteSpace.normal,\n\t},\n} satisfies PropDef;\n\n/**\n * テキスト入力の入力タイプ・数値範囲・文字数・パターンなどのバリデーション props。\n */\nexport interface TextValidationProps {\n\t/** 入力タイプ(`<input type>` 属性)。デフォルト: `text`。 */\n\tinputType?: InputType;\n\n\t/** 数値入力の最小値。 */\n\tmin?: number;\n\n\t/** 数値入力の最大値。 */\n\tmax?: number;\n\n\t/** 数値入力のステップ幅。 */\n\tstep?: number;\n\n\t/** 最小文字数。 */\n\tminLength?: number;\n\n\t/** 最大文字数。 */\n\tmaxLength?: number;\n\n\t/** 入力値を検証する正規表現パターン。 */\n\tpattern?: string;\n}\n\n/**\n * `textValidation` prop 定義。テキスト入力のバリデーションルールのデフォルト値を含む。\n */\nexport const textValidationProp = {\n\tkind: \"textValidation\",\n\tdefaultProps: {\n\t\tinputType: InputType.text,\n\t},\n} satisfies PropDef;\n","/**\n * 履歴マージキーの定義。\n *\n * @remarks\n * `useBookHistory` は同一 `mergeKey` を持つ連続エントリを1つにマージする。\n *\n * どの操作がどのキーでマージされるかをこのファイルで一元管理する。\n *\n * ## マージ戦略\n *\n * ### セッション型(方向・対象が変わるまで無制限にマージ)\n * - **矢印キー移動** (`arrowMoveKey`): 同一方向 + 同一ブロック選択の間は 1 セッション。\n * 方向変更・ブロック変更・キーアップで新セッションに切り替わる。\n * - **キーボードリサイズ** (`keyboardResizeKey`): Shift+矢印によるリサイズ。管理ルールは `arrowMoveKey` と同じ。\n *\n * ### ウィンドウ型(MERGE_WINDOW_MS 以内の変更をマージ)\n * - **レイアウトパネル入力** (`layoutPanelKey`): 同一軸の入力連打。\n * - **バインディング変更** (`bindingKey`): 同一パスへの連続 set 操作。\n * - **initValue 変更** (`initValueKey`): ダブルクリック編集・FORM モードの値変更連打。\n * - **グリッドサイズ入力** (`gridSizeKey`): 同一ページの列数・行数入力連打。\n */\n\n/**\n * 矢印キー移動セッションの mergeKey。\n *\n * セッション ID はキーダウン時に生成され、方向またはブロック選択が変わったときのみ切り替わる。\n *\n * keyUp はセッションをリセットしない。`noTimeWindow: true` と組み合わせて使用する。\n */\nexport function arrowMoveKey(sessionId: string): string {\n\treturn `move-arrow-session-${sessionId}`;\n}\n\n/**\n * レイアウトパネル(X/Y/W/H 入力)の連続変更の mergeKey。\n *\n * 同一軸・同一ブロック選択の間の連打をまとめる。\n */\nexport function layoutPanelKey(\n\taxis: \"x\" | \"y\" | \"w\" | \"h\",\n\tblockIds: string[],\n): string {\n\treturn `layout-${axis}-${[...blockIds].sort().join(\",\")}`;\n}\n\n/**\n * バインディング(パス指定の値変更)の連続変更の mergeKey。\n *\n * 同一パスへの連続 set 操作をまとめる。\n */\nexport function bindingKey(path: string): string {\n\treturn `binding-${path}`;\n}\n\n/**\n * ブロックの `initValue`(プラグイン初期値)の連続変更の mergeKey。\n *\n * ダブルクリック編集中のキー入力や、FORM モードでの値変更連打をまとめる。\n */\nexport function initValueKey(blockId: string): string {\n\treturn `initValue-${blockId}`;\n}\n\n/**\n * グリッド列数・行数入力の連続変更の mergeKey。\n *\n * 同一ページの数値入力連打をまとめる。\n */\nexport function gridSizeKey(pageIdx: number): string {\n\treturn `grid-size-${pageIdx}`;\n}\n\n/**\n * Shift+矢印キーによるブロックリサイズセッションの mergeKey。\n *\n * セッション ID の管理ルールは {@link arrowMoveKey} と同じ。\n *\n * 方向・ブロック選択変更でのみ新セッションに切り替わる(keyUp では切り替わらない)。\n */\nexport function keyboardResizeKey(sessionId: string): string {\n\treturn `resize-arrow-session-${sessionId}`;\n}\n","import type { Dimension, Grid, GridUnit } from \"../../types\";\n\n// デフォルトのグリッドセル寸法(1fr)\nconst DEFAULT_GRID_DIMENSION: Dimension<GridUnit> = { value: 1, unit: \"fr\" };\n\n/**\n * グリッドのスパース列定義を全列のサイズ配列に展開する。\n *\n * `grid.cols` に定義がないインデックスはデフォルト値(`1fr`)で補完される。\n */\nexport function expandSparseCols(grid: Grid): Dimension<GridUnit>[] {\n\treturn Array.from(\n\t\t{ length: grid.colCount },\n\t\t(_, i) => grid.cols?.[i] ?? DEFAULT_GRID_DIMENSION,\n\t);\n}\n\n/**\n * グリッドのスパース行定義を全行のサイズ配列に展開する。\n *\n * `grid.rows` に定義がないインデックスはデフォルト値(`1fr`)で補完される。\n */\nexport function expandSparseRows(grid: Grid): Dimension<GridUnit>[] {\n\treturn Array.from(\n\t\t{ length: grid.rowCount },\n\t\t(_, i) => grid.rows?.[i] ?? DEFAULT_GRID_DIMENSION,\n\t);\n}\n\n/**\n * 列サイズ配列をスパース形式に変換する。\n *\n * デフォルト値(`1fr`)と一致するエントリは省略され、異なるものだけが `cols` に格納される。\n *\n * 全エントリがデフォルト値の場合、`cols` は `undefined` になる。\n */\nexport function colsToSparse(\n\tcols: Dimension<GridUnit>[],\n): Pick<Grid, \"colCount\" | \"cols\"> {\n\tconst result: Record<number, Dimension<GridUnit>> = {};\n\tfor (let i = 0; i < cols.length; i++) {\n\t\tconst d = cols[i];\n\t\tif (d !== undefined && !(d.value === 1 && d.unit === \"fr\")) {\n\t\t\tresult[i] = d;\n\t\t}\n\t}\n\treturn {\n\t\tcolCount: cols.length,\n\t\tcols: Object.keys(result).length > 0 ? result : undefined,\n\t};\n}\n\n/**\n * 行サイズ配列をスパース形式に変換する。\n *\n * デフォルト値(`1fr`)と一致するエントリは省略され、異なるものだけが `rows` に格納される。\n *\n * 全エントリがデフォルト値の場合、`rows` は `undefined` になる。\n */\nexport function rowsToSparse(\n\trows: Dimension<GridUnit>[],\n): Pick<Grid, \"rowCount\" | \"rows\"> {\n\tconst result: Record<number, Dimension<GridUnit>> = {};\n\tfor (let i = 0; i < rows.length; i++) {\n\t\tconst d = rows[i];\n\t\tif (d !== undefined && !(d.value === 1 && d.unit === \"fr\")) {\n\t\t\tresult[i] = d;\n\t\t}\n\t}\n\treturn {\n\t\trowCount: rows.length,\n\t\trows: Object.keys(result).length > 0 ? result : undefined,\n\t};\n}\n","import { useMemo } from \"react\";\n\nimport { expandSparseCols, expandSparseRows } from \"../../../../utils/grid\";\n\nimport type { Dimension, Grid, GridUnit } from \"../../../../types\";\n\n/**\n * `Grid` の sparse 形式を展開した列・行の寸法配列を保持するフックの返り値。\n */\nexport interface UseExpandedGridResult {\n\t/** 展開後の列寸法配列。 */\n\texpandedCols: Dimension<GridUnit>[];\n\n\t/** 展開後の行寸法配列。 */\n\texpandedRows: Dimension<GridUnit>[];\n}\n\n/**\n * `Grid` の sparse 形式(繰り返し指定あり)を展開して寸法配列を返す React フック。\n * @param grid - グリッド。\n * @returns 展開済み列・行寸法配列。\n */\nexport function useExpandedGrid(grid: Grid): UseExpandedGridResult {\n\tconst expandedCols = useMemo(() => expandSparseCols(grid), [grid]);\n\tconst expandedRows = useMemo(() => expandSparseRows(grid), [grid]);\n\treturn { expandedCols, expandedRows };\n}\n","/**\n * 浮動小数点のピクセル配列を整数ピクセル配列に変換します。\n *\n * Bresenhamアルゴリズムに基づく累積誤差補正により、\n * 境界位置(prefix sum)のズレを最小化します。\n */\nexport function distributeRemainder(floatPixels: number[]): number[] {\n\tif (floatPixels.length === 0) return [];\n\n\tconst result: number[] = [];\n\tlet accumulatedError = 0;\n\n\tfor (const px of floatPixels) {\n\t\tconst target = px + accumulatedError;\n\t\tconst rounded = Math.round(target);\n\t\tresult.push(rounded);\n\t\taccumulatedError = target - rounded;\n\t}\n\n\treturn result;\n}\n","// finger search のステップ数の下限・上限\nconst MIN_STEP = 8;\nconst MAX_STEP = 32;\n\n// 二分探索へ切り替わる窓サイズ(px)の下限・上限\nconst MIN_WINDOW_PX = 64;\nconst MAX_WINDOW_PX = 512;\n\n// 数値を [lo, hi] にクランプするユーティリティ関数\nconst _clamp = (x: number, lo: number, hi: number): number =>\n\tMath.min(Math.max(x, lo), hi);\n\n/**\n * finger search から二分探索に切り替えるステップ数と窓サイズを返します。\n *\n * useMemo でキャッシュして使うことを想定。\n */\nexport function getMaxStep(starts: number[]): {\n\treadonly step: number;\n\treadonly windowPx: number;\n} {\n\tconst count = starts.length - 1;\n\tconst total = count >= 1 ? (starts[count] ?? 0) : 0;\n\tconst avg = starts.length >= 1 ? total / count : 0;\n\n\tconst step = _clamp(Math.ceil(Math.log2(count + 1)), MIN_STEP, MAX_STEP);\n\tconst windowPx = _clamp(avg * 2, MIN_WINDOW_PX, MAX_WINDOW_PX);\n\n\treturn { step, windowPx };\n}\n\n// 境界座標の昇順配列から num が属するセルインデックスを二分探索で返す\nfunction binarySearch(num: number, arr: readonly number[]): number {\n\t// arr は境界座標の昇順配列。要素数 - 1 がセル数\n\tconst cnt = arr.length - 1;\n\t// セルが存在しない場合は範囲外\n\tif (cnt <= 0) return -1;\n\tif (arr[0] === undefined || num < arr[0]) return -1;\n\tif (arr[cnt] === undefined) return -1;\n\t// 末尾境界以上なら最終セルに含まれる\n\tif (num >= arr[cnt]) return cnt - 1;\n\n\tlet lo = 1;\n\tlet hi = cnt;\n\twhile (lo <= hi) {\n\t\t// >>> 1 は符号なし右シフト。整数オーバーフロー回避のための慣用句\n\t\tconst mid = (lo + hi) >>> 1;\n\t\tconst midValue = arr[mid];\n\t\tif (midValue === undefined) {\n\t\t\thi = mid - 1;\n\t\t\tcontinue;\n\t\t}\n\t\tif (midValue <= num) {\n\t\t\tlo = mid + 1;\n\t\t} else {\n\t\t\thi = mid - 1;\n\t\t}\n\t}\n\t// ループ終了時 lo は num より大きい最初の境界位置 → lo - 1 が該当セルインデックス\n\treturn lo - 1;\n}\n\n/**\n * finger search + 二分探索によるグリッドインデックス探索関数を返します。\n * @param starts - グリッド境界の累積px配列(0始まり)\n * @param maxStep - finger search の最大ステップ数\n * @param windowPx - 二分探索に切り替える窓サイズ(px)\n */\nexport function findGridIndex(\n\tstarts: readonly number[],\n\tmaxStep: number,\n\twindowPx: number,\n): (px: number) => number {\n\tconst cnt = starts.length - 1;\n\tlet last = 0;\n\n\treturn (px: number) => {\n\t\tif (cnt <= 0) return -1;\n\t\tif (starts[0] === undefined || px < starts[0]) return -1;\n\t\tif (starts[cnt] === undefined) return -1;\n\t\tif (px >= starts[cnt]) return cnt - 1;\n\n\t\tconst startValue = starts[last];\n\t\tconst nextValue = starts[last + 1];\n\t\tif (startValue === undefined || nextValue === undefined) return -1;\n\t\tif (startValue <= px && px < nextValue) return last;\n\n\t\tconst leftPx = startValue - windowPx;\n\t\tconst rightPx = nextValue + windowPx;\n\t\tif (px < leftPx || px >= rightPx) {\n\t\t\tlast = binarySearch(px, starts);\n\t\t\treturn last;\n\t\t}\n\n\t\tlet steps = 0;\n\t\tconst nextStart = starts[last + 1];\n\t\tif (nextStart !== undefined && px >= nextStart) {\n\t\t\twhile (last + 1 < cnt) {\n\t\t\t\tconst next = starts[last + 1];\n\t\t\t\tif (next === undefined || px < next) break;\n\t\t\t\tlast++;\n\t\t\t\tif (++steps > maxStep) {\n\t\t\t\t\tlast = binarySearch(px, starts);\n\t\t\t\t\treturn last;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\twhile (last > 0) {\n\t\t\t\tconst current = starts[last];\n\t\t\t\tif (current === undefined || px >= current) break;\n\t\t\t\tlast--;\n\t\t\t\tif (++steps > maxStep) {\n\t\t\t\t\tlast = binarySearch(px, starts);\n\t\t\t\t\treturn last;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn last;\n\t};\n}\n","import { DEFAULT_DPI, toMm, toPx } from \"../../../../utils/convert\";\nimport { distributeRemainder } from \"./distributeRemainder\";\n\nimport type { Dimension, GridUnit } from \"../../../../types/unit\";\n\n/**\n * 複数の単位が混在するグリッド寸法配列をmm配列に変換します。\n */\nexport function gridToMms(\n\tdims: Dimension<GridUnit>[],\n\tcontentSizeMm: number,\n): number[] {\n\tif (dims.length === 0) return [];\n\n\tlet totalFr = 0;\n\tlet fixedTotalMm = 0;\n\n\tconst mmsWithoutFr: (number | null)[] = dims.map((dim) => {\n\t\tif (dim.unit === \"fr\") {\n\t\t\ttotalFr += dim.value;\n\t\t\treturn null;\n\t\t}\n\t\tconst mm = toMm.fromDim(dim);\n\t\tfixedTotalMm += mm;\n\t\treturn mm;\n\t});\n\n\tif (totalFr === 0) {\n\t\treturn mmsWithoutFr as number[];\n\t}\n\n\tconst remainingMm = Math.max(0, contentSizeMm - fixedTotalMm);\n\tconst mmPerFr = remainingMm / totalFr;\n\n\treturn mmsWithoutFr.map((val, i) => {\n\t\tif (val !== null && val !== undefined) return val;\n\t\tconst dim = dims[i];\n\t\tif (!dim) throw new Error(`dims[${i}] is undefined`);\n\t\treturn dim.value * mmPerFr;\n\t});\n}\n\n/**\n * mm単位の数字配列をpx単位の整数配列に変換します(剰余配布あり)。\n */\nexport function mmsToPxs(mms: number[], dpi: number = DEFAULT_DPI): number[] {\n\tconst gridPxsFloat = mms.map((mm) => toPx.fromMm(mm, dpi));\n\treturn distributeRemainder(gridPxsFloat);\n}\n","import { useCallback, useMemo } from \"react\";\n\nimport { DEFAULT_DPI, toMm, toPx } from \"../../../../utils/convert\";\nimport { findGridIndex, getMaxStep, gridToMms, mmsToPxs } from \"../utils\";\nimport { useExpandedGrid } from \"./useExpandedGrid\";\n\nimport type { Block } from \"../../../../types/block\";\nimport type { Grid } from \"../../../../types/grid\";\nimport type { Paper } from \"../../../../types/paper\";\nimport type { BlockRectPx } from \"../../types\";\nimport type {\n\tGridPosPx,\n\tPaperCanvasPx,\n\tPaperMarginPx,\n\tPaperPx,\n} from \"../types\";\n\n/**\n * `Paper` と `Grid` の定義からキャンバス・グリッドの px 座標を計算して返す React フック。\n * @param paper - 用紙設定(サイズ・向き・マージン)。\n * @param grid - グリッド定義。\n * @param dpi - DPI 値(既定値: `DEFAULT_DPI`)。\n */\nexport function useGridCalc(\n\tpaper: Paper,\n\tgrid: Grid,\n\tdpi: number = DEFAULT_DPI,\n) {\n\tconst { expandedCols, expandedRows } = useExpandedGrid(grid);\n\n\t// paper 依存の mm 値を一括計算(paper 変更時のみ再計算)\n\tconst paperMm = useMemo(() => {\n\t\tconst effectiveSizeWidth = paper.orientation\n\t\t\t? paper.size.height\n\t\t\t: paper.size.width;\n\t\tconst effectiveSizeHeight = paper.orientation\n\t\t\t? paper.size.width\n\t\t\t: paper.size.height;\n\t\tconst canvasWidthMm = toMm.fromDim(effectiveSizeWidth);\n\t\tconst canvasHeightMm = toMm.fromDim(effectiveSizeHeight);\n\t\t// bulk モード時は all フィールドを四辺共通値として使用する\n\t\t// all?.unit を確認することで unit が未設定の中間状態を除外する\n\t\tconst bulkMm =\n\t\t\tpaper.margin.bulk && paper.margin.all?.unit\n\t\t\t\t? toMm.fromDim(paper.margin.all)\n\t\t\t\t: undefined;\n\t\tconst marginTopMm = bulkMm ?? toMm.fromDim(paper.margin.top);\n\t\tconst marginBottomMm = bulkMm ?? toMm.fromDim(paper.margin.bottom);\n\t\tconst marginLeftMm = bulkMm ?? toMm.fromDim(paper.margin.left);\n\t\tconst marginRightMm = bulkMm ?? toMm.fromDim(paper.margin.right);\n\t\treturn {\n\t\t\tcanvasWidthMm,\n\t\t\tcanvasHeightMm,\n\t\t\tmarginTopMm,\n\t\t\tmarginBottomMm,\n\t\t\tmarginLeftMm,\n\t\t\tmarginRightMm,\n\t\t\tcontentWidthMm: Math.max(0, canvasWidthMm - marginLeftMm - marginRightMm),\n\t\t\tcontentHeightMm: Math.max(\n\t\t\t\t0,\n\t\t\t\tcanvasHeightMm - marginTopMm - marginBottomMm,\n\t\t\t),\n\t\t};\n\t}, [paper]);\n\n\t// 用紙サイズ・マージン・コンテンツ領域を px 単位で一括計算\n\tconst paperPx = useMemo((): PaperPx => {\n\t\tconst {\n\t\t\tcanvasWidthMm,\n\t\t\tcanvasHeightMm,\n\t\t\tmarginTopMm,\n\t\t\tmarginBottomMm,\n\t\t\tmarginLeftMm,\n\t\t\tmarginRightMm,\n\t\t\tcontentWidthMm,\n\t\t\tcontentHeightMm,\n\t\t} = paperMm;\n\t\treturn {\n\t\t\tcanvas: {\n\t\t\t\twidth: toPx.fromMm(canvasWidthMm, dpi),\n\t\t\t\theight: toPx.fromMm(canvasHeightMm, dpi),\n\t\t\t} as PaperCanvasPx,\n\t\t\tmargin: {\n\t\t\t\ttop: toPx.fromMm(marginTopMm, dpi),\n\t\t\t\tbottom: toPx.fromMm(marginBottomMm, dpi),\n\t\t\t\tleft: toPx.fromMm(marginLeftMm, dpi),\n\t\t\t\tright: toPx.fromMm(marginRightMm, dpi),\n\t\t\t} as PaperMarginPx,\n\t\t\tcontent: {\n\t\t\t\twidth: toPx.fromMm(contentWidthMm, dpi),\n\t\t\t\theight: toPx.fromMm(contentHeightMm, dpi),\n\t\t\t},\n\t\t};\n\t}, [paperMm, dpi]);\n\n\t// グリッド列・行の累積 px 位置配列とインデクサー関数を一括計算\n\tconst { gridPosPx, colIndexer, rowIndexer } = useMemo(() => {\n\t\tconst { contentWidthMm, contentHeightMm } = paperMm;\n\n\t\tconst colPxs = mmsToPxs(gridToMms(expandedCols, contentWidthMm), dpi);\n\t\tconst rowPxs = mmsToPxs(gridToMms(expandedRows, contentHeightMm), dpi);\n\n\t\tconst colPosPxs: number[] = [0];\n\t\tfor (const w of colPxs) {\n\t\t\tcolPosPxs.push((colPosPxs[colPosPxs.length - 1] ?? 0) + w);\n\t\t}\n\t\tconst rowPosPxs: number[] = [0];\n\t\tfor (const h of rowPxs) {\n\t\t\trowPosPxs.push((rowPosPxs[rowPosPxs.length - 1] ?? 0) + h);\n\t\t}\n\n\t\tconst { step: colMaxStep, windowPx: colWindowPx } = getMaxStep(colPosPxs);\n\t\tconst { step: rowMaxStep, windowPx: rowWindowPx } = getMaxStep(rowPosPxs);\n\n\t\treturn {\n\t\t\tgridPosPx: { cols: colPosPxs, rows: rowPosPxs } as GridPosPx,\n\t\t\tcolIndexer: findGridIndex(colPosPxs, colMaxStep, colWindowPx),\n\t\t\trowIndexer: findGridIndex(rowPosPxs, rowMaxStep, rowWindowPx),\n\t\t};\n\t}, [paperMm, expandedCols, expandedRows, dpi]);\n\n\tconst getColIndex = useCallback(\n\t\t(px: number) => colIndexer(px - paperPx.margin.left),\n\t\t[colIndexer, paperPx],\n\t);\n\tconst getRowIndex = useCallback(\n\t\t(px: number) => rowIndexer(px - paperPx.margin.top),\n\t\t[rowIndexer, paperPx],\n\t);\n\n\tconst getBlockRectPx = useCallback(\n\t\t(block: Block): BlockRectPx => {\n\t\t\tconst { x, y, w, h } = block.layout;\n\t\t\tconst colLines = gridPosPx.cols;\n\t\t\tconst rowLines = gridPosPx.rows;\n\n\t\t\tif (!colLines.length || !rowLines.length) {\n\t\t\t\treturn { left: 0, top: 0, width: 0, height: 0 };\n\t\t\t}\n\n\t\t\tconst x1 = Math.min(Math.max(0, x), colLines.length - 1);\n\t\t\tconst x2 = Math.min(Math.max(0, x + w), colLines.length - 1);\n\t\t\tconst y1 = Math.min(Math.max(0, y), rowLines.length - 1);\n\t\t\tconst y2 = Math.min(Math.max(0, y + h), rowLines.length - 1);\n\n\t\t\tconst left = (colLines[x1] ?? 0) + paperPx.margin.left;\n\t\t\tconst top = (rowLines[y1] ?? 0) + paperPx.margin.top;\n\t\t\tconst width = (colLines[x2] ?? 0) - (colLines[x1] ?? 0);\n\t\t\tconst height = (rowLines[y2] ?? 0) - (rowLines[y1] ?? 0);\n\n\t\t\treturn { left, top, width, height };\n\t\t},\n\t\t[gridPosPx, paperPx],\n\t);\n\n\treturn {\n\t\tpaperPx,\n\t\tgridPosPx,\n\t\tgetColIndex,\n\t\tgetRowIndex,\n\t\tgetBlockRectPx,\n\t};\n}\n","/**\n * NoteForm がサイドバー領域を判定するためのセレクタ。\n *\n * @remarks\n * **Shell** — カスタムサイドバー実装時にルート要素へ付与する `data-sidebar=\"true\"` を選択する。\n */\nexport const SIDEBAR_PORTAL_SELECTOR = '[data-sidebar=\"true\"]';\n\n/**\n * サイドバー/フローティングウィジェットのルート要素に付与する props。\n *\n * @remarks\n * **Shell** — スプレッドすることで `NoteForm` の選択解除ロジックの対象外になる。\n */\nexport const SIDEBAR_PORTAL_PROPS = { \"data-sidebar\": \"true\" } as const;\n"],"names":["HorizontalAlign","VerticalAlign","alignmentProp","checkboxStyleProp","BLOCK_DRAG_MIME","BLOCK_DRAG_KIND_PREFIX","startBlockDrag","e","kind","defaultSize","data","getBlockDragData","raw","getBlockDragKind","kindType","t","DEFAULT_GRID","PaperSizePreset","DEFAULT_PAPER_SIZES","DEFAULT_PAPER_MARGIN","DEFAULT_PAPER","Z_INDEX","BLOCK_SUB_INDEX","stringToDimension","str","allowedUnits","match","value","unit","dimensionToString","dim","DEFAULT_DPI","CM_TO_MM","INCH_TO_MM","PT_TO_MM","PX_TO_MM","toMm","cm","inch","pt","px","_exhaustive","MM_PER_INCH","CM_PER_INCH","PT_PER_INCH","toPx","mm","dpi","baseSizePx","H_ALIGN_MAP","V_ALIGN_MAP","isDefaultDim","d","arrayToSparse","dims","sparse","i","migrateGrid","grid","g","colsArr","rowsArr","result","sparseCols","sparseRows","migratePadding","props","isIndividual","allVal","migrateAlignment","oldVal","migrateBlockProps","migratePage","page","registry","p","block","b","plugin","isLegacyFormSchema","isBook","migrateBook","notebook","nb","migrateFormSchemaToBook","schema","source","blocks","migratedPage","migrate","isValue","v","validateValues","obj","key","val","deserializeValues","json","parsed","isGrid","isHiddenBinding","hasPrimitive","isBlock","layout","validatePage","bd","defaults","parseBook","serializePage","serializeBook","book","deserializePage","deserializeBook","ClassicCheckboxVisual","checked","styleConfig","borderColor","checkColor","bg","borderWidth","checkWidth","jsxs","jsx","LineType","NoteMode","Units","ALL_UNITS","ACTUAL_UNITS","PAPER_UNITS","GRID_UNITS","BORDER_UNITS","FONT_UNITS","PADDING_UNITS","SIZE_UNITS","WordWrap","WhiteSpace","InputType","textBehaviorProp","textValidationProp","arrowMoveKey","sessionId","layoutPanelKey","axis","blockIds","bindingKey","path","initValueKey","blockId","gridSizeKey","pageIdx","keyboardResizeKey","DEFAULT_GRID_DIMENSION","expandSparseCols","_","_a","expandSparseRows","colsToSparse","cols","rowsToSparse","rows","useExpandedGrid","expandedCols","useMemo","expandedRows","distributeRemainder","floatPixels","accumulatedError","target","rounded","MIN_STEP","MAX_STEP","MIN_WINDOW_PX","MAX_WINDOW_PX","_clamp","x","lo","hi","getMaxStep","starts","count","total","avg","step","windowPx","binarySearch","num","arr","cnt","mid","midValue","findGridIndex","maxStep","last","startValue","nextValue","leftPx","rightPx","steps","nextStart","next","current","gridToMms","contentSizeMm","totalFr","fixedTotalMm","mmsWithoutFr","mmPerFr","mmsToPxs","mms","gridPxsFloat","useGridCalc","paper","paperMm","effectiveSizeWidth","effectiveSizeHeight","canvasWidthMm","canvasHeightMm","bulkMm","marginTopMm","marginBottomMm","marginLeftMm","marginRightMm","paperPx","contentWidthMm","contentHeightMm","gridPosPx","colIndexer","rowIndexer","colPxs","rowPxs","colPosPxs","w","rowPosPxs","h","colMaxStep","colWindowPx","rowMaxStep","rowWindowPx","getColIndex","useCallback","getRowIndex","getBlockRectPx","y","colLines","rowLines","x1","x2","y1","y2","left","top","width","height","SIDEBAR_PORTAL_SELECTOR","SIDEBAR_PORTAL_PROPS"],"mappings":"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"}