@tatamicks/core 1.0.1 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{PalettePanel-Dipvtj7D.cjs → PalettePanel-BMZ6dfI3.cjs} +2 -2
- package/dist/{PalettePanel-Dipvtj7D.cjs.map → PalettePanel-BMZ6dfI3.cjs.map} +1 -1
- package/dist/{PalettePanel-CtXsH6Cb.js → PalettePanel-Cigl9i1N.js} +360 -355
- package/dist/{PalettePanel-CtXsH6Cb.js.map → PalettePanel-Cigl9i1N.js.map} +1 -1
- package/dist/canvas.cjs +1 -1
- package/dist/canvas.mjs +13 -13
- package/dist/index.cjs +3 -5
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +430 -571
- package/dist/index.mjs.map +1 -1
- package/dist/{paperSettingsWidget-sLJsIUxS.cjs → paperSettingsWidget-7766a5Fe.cjs} +1 -1
- package/dist/{paperSettingsWidget-sLJsIUxS.cjs.map → paperSettingsWidget-7766a5Fe.cjs.map} +1 -1
- package/dist/{paperSettingsWidget-DgDoBA0P.js → paperSettingsWidget-DvtghSA5.js} +1 -1
- package/dist/{paperSettingsWidget-DgDoBA0P.js.map → paperSettingsWidget-DvtghSA5.js.map} +1 -1
- package/dist/shell.cjs +1 -1
- package/dist/shell.mjs +2 -2
- package/dist/sidebarPortal-BN6FVwaF.js +870 -0
- package/dist/sidebarPortal-BN6FVwaF.js.map +1 -0
- package/dist/sidebarPortal-Cr-dLvA_.cjs +3 -0
- package/dist/sidebarPortal-Cr-dLvA_.cjs.map +1 -0
- package/dist/src/index.d.ts +2 -0
- package/package.json +1 -1
- package/dist/sidebarPortal-C06y4JSP.js +0 -723
- package/dist/sidebarPortal-C06y4JSP.js.map +0 -1
- package/dist/sidebarPortal-C3HszQyp.cjs +0 -1
- package/dist/sidebarPortal-C3HszQyp.cjs.map +0 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../src/plugin/registry.ts","../src/utils/migration/index.ts","../src/canvas/blocks/basePlugins.ts","../src/contexts/editor/useEditorState.ts","../src/contexts/useNoteContext.ts","../src/canvas/blocks/button/iconPaths.ts","../src/canvas/widgets/common/btn.ts","../src/canvas/widgets/canvasActions/canvasActionsWidget.ts","../src/canvas/widgets/clipboard/clipboardWidget.ts","../src/canvas/widgets/history/historyWidget.ts","../src/canvas/widgets/layout/layoutSettingsWidget.ts","../src/canvas/widgets/pageNavigation/pageNavigationWidget.ts","../src/canvas/widgets/selectionDelete/selectionDeleteWidget.ts","../src/shell/bars/ActionBar/ActionBar.tsx","../src/note/NotePrint/NotePrint.tsx","../src/utils/print/printElement.ts","../src/utils/print/printNote.ts","../src/shell/bars/ActionBar/PageNavigationSection.tsx","../src/shell/bars/ActionBar/getDefaultActionBarSections.tsx","../src/shell/bars/SelectionActionBar/DefaultSelectionActionBarOverlay.tsx","../src/shell/bars/Sidebar/getDefaultSidebarTabs.tsx","../src/shell/bars/Sidebar/Sidebar.tsx","../src/shell/floating/FloatingWidget.tsx"],"sourcesContent":["import type { ForwardRefExoticComponent, RefAttributes } from \"react\";\nimport type { Value } from \"../types\";\nimport type {\n\tBlockPlugin,\n\tBlockPluginMeta,\n\tBlockRef,\n\tPropDef,\n\tRendererProps,\n} from \"./types\";\n\n/**\n * createPluginRegistry が受け付けるプラグイン入力型。\n *\n * @remarks\n * BlockPlugin<P, V> は Renderer / validateValue の引数型が P・V に依存するため、異なるプラグインをそのまま BlockPlugin[] として受け取ることはできない。\n *\n * レジストリ入口では共通メタ情報だけを型付きで受け取り、variance の影響を受けるフィールドは unknown として受けてから ResolvedPlugin 側で型消去する。\n *\n * public export はせず、ユーザーには BlockPlugin と createPluginRegistry だけを見せる。\n *\n * @internal\n */\ntype PluginRegistryInput = Pick<BlockPlugin, \"kind\" | \"meta\" | \"properties\"> & {\n\tRenderer: unknown;\n\tmigrateProps?: unknown;\n\tvalidateProps?: unknown;\n\tvalidateValue?: unknown;\n};\n\n// 各 PropDef の defaultProps を合成してプラグイン全体のデフォルト props オブジェクトを生成する\nfunction resolveDefaultProps(\n\tplugin: Pick<PluginRegistryInput, \"properties\">,\n): Record<string, Value> {\n\tconst result: Record<string, Value> = {};\n\tfor (const prop of plugin.properties) {\n\t\tObject.assign(result, prop.defaultProps);\n\t}\n\treturn result;\n}\n\n// BlockPlugin<P,V>.Renderer を ResolvedPlugin に格納するためにジェネリクスを消去したベース型\ntype BaseRenderer = ForwardRefExoticComponent<\n\tRendererProps<Record<string, Value>, Value> & RefAttributes<BlockRef>\n>;\n\n/**\n * レジストリに登録された解決済みプラグイン。\n *\n * @remarks\n * BlockPlugin<P,V> のジェネリクスを型消去し、Shell/Canvas 層が any なしで扱えるフラットな構造にまとめたもの。\n *\n * Renderer の P/V variance 問題は BaseRenderer 型への単一キャストで解決。\n */\nexport interface ResolvedPlugin {\n\t/** `block.kind` と対応するプラグインの一意識別子 */\n\tkind: string;\n\n\t/** UI 表示・アイコン・デフォルトサイズ等のメタ情報 */\n\tmeta: BlockPluginMeta;\n\n\t/** プロパティパネルに表示するプロパティ定義一覧 */\n\tproperties: PropDef[];\n\n\t/** プラグインの全 `PropDef.defaultProps` を合成した、このブロック種別のデフォルト props */\n\tdefaultProps: Record<string, Value>;\n\n\t/**\n\t * ブロックを描画する Renderer コンポーネント。\n\t *\n\t * BlockPlugin<P,V>.Renderer を格納する際、P/V の variance 問題を回避するためベース型にキャストしている。\n\t *\n\t * 実行時には block.props(解決済み)と value が渡されるため安全。\n\t */\n\tRenderer: BaseRenderer;\n\n\t/** 旧バージョンの props を現バージョンに変換する。`validateProps` の前に呼ばれる */\n\tmigrateProps?: (props: unknown) => Record<string, unknown>;\n\n\t/**\n\t * ストレージから読み込んだ生の `block.props` をサニタイズして型安全な Props に変換する。\n\t *\n\t * 省略時は raw オブジェクトをそのまま使用する。\n\t */\n\tvalidateProps?: (props: unknown) => Record<string, Value>;\n\n\t/**\n\t * 外部 state から読み込んだ生の値をサニタイズする。\n\t *\n\t * `undefined` を返した場合は `block.initValue`、それもなければ raw 値にフォールバックする。\n\t *\n\t * フォールバックを指示する場合にのみ `undefined` を使い、`null` は正当な値として返せる。\n\t *\n\t * 省略時は raw 値をそのまま使用する。\n\t */\n\tvalidateValue?: (\n\t\tvalue: unknown,\n\t\tprops: Record<string, Value>,\n\t) => Value | undefined;\n}\n\n/**\n * `createPluginRegistry` が返す、`block.kind` をキーにしたプラグインレジストリ。\n *\n * 未登録の `kind` は `undefined` になるため、アクセス前に存在確認が必要。\n */\nexport type PluginRegistry = Record<string, ResolvedPlugin | undefined>;\n\n/**\n * プラグインの配列から `kind` をキーとしたレジストリを生成する。\n *\n * 各プラグインの `properties` から `defaultProps` を合成し、`Renderer` をベース型に正規化した `ResolvedPlugin` を返す。\n *\n * @example\n * ```ts\n * const registry = createPluginRegistry([TextPlugin, CheckboxPlugin]);\n * ```\n */\nexport function createPluginRegistry(\n\tplugins: readonly (Pick<BlockPlugin, \"kind\" | \"meta\" | \"properties\"> & {\n\t\t/**\n\t\t * `forwardRef()` で生成した React コンポーネント。\n\t\t *\n\t\t * `ForwardRefExoticComponent<never>` は P=never(⊥型)を使うことでどの P でも代入可。\n\t\t *\n\t\t * 非コンポーネント値(数値等)は型エラーになる。\n\t\t */\n\t\tRenderer: ForwardRefExoticComponent<never>;\n\t\t/**\n\t\t * `never[]` rest 型により、任意の引数型の関数が代入可。\n\t\t *\n\t\t * 非関数値は型エラーになる。\n\t\t */\n\t\tmigrateProps?: (...args: never[]) => unknown;\n\t\t/**\n\t\t * `never[]` rest 型により、任意の引数型の関数が代入可。\n\t\t *\n\t\t * 非関数値は型エラーになる。\n\t\t */\n\t\tvalidateProps?: (...args: never[]) => unknown;\n\t\t/**\n\t\t * `never[]` rest 型により、任意の引数型の関数が代入可。\n\t\t *\n\t\t * 非関数値は型エラーになる。\n\t\t */\n\t\tvalidateValue?: (...args: never[]) => unknown;\n\t})[],\n): PluginRegistry;\nexport function createPluginRegistry(\n\tplugins: readonly PluginRegistryInput[],\n): PluginRegistry {\n\tconst seen = new Set<string>();\n\tfor (const plugin of plugins) {\n\t\tif (seen.has(plugin.kind)) {\n\t\t\tthrow new Error(\n\t\t\t\t`[createPluginRegistry] duplicate plugin kind: \"${plugin.kind}\". Each kind must be registered only once.`,\n\t\t\t);\n\t\t}\n\t\tseen.add(plugin.kind);\n\t}\n\treturn Object.fromEntries(\n\t\tplugins.map((plugin) => {\n\t\t\t// Renderer の P/V variance 問題はここで一度だけ型消去して解決する。\n\t\t\tif (!plugin.Renderer) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`[createPluginRegistry] plugin \"${plugin.kind}\" is missing a Renderer. Ensure you are passing a full BlockPlugin.`,\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn [\n\t\t\t\tplugin.kind,\n\t\t\t\t{\n\t\t\t\t\tkind: plugin.kind,\n\t\t\t\t\tmeta: plugin.meta,\n\t\t\t\t\tproperties: plugin.properties,\n\t\t\t\t\tdefaultProps: resolveDefaultProps(plugin),\n\t\t\t\t\tRenderer: plugin.Renderer as BaseRenderer,\n\t\t\t\t\t...(typeof plugin.migrateProps === \"function\"\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tmigrateProps:\n\t\t\t\t\t\t\t\t\tplugin.migrateProps as ResolvedPlugin[\"migrateProps\"],\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: {}),\n\t\t\t\t\t...(typeof plugin.validateProps === \"function\"\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tvalidateProps:\n\t\t\t\t\t\t\t\t\tplugin.validateProps as ResolvedPlugin[\"validateProps\"],\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: {}),\n\t\t\t\t\t...(typeof plugin.validateValue === \"function\"\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tvalidateValue:\n\t\t\t\t\t\t\t\t\tplugin.validateValue as ResolvedPlugin[\"validateValue\"],\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: {}),\n\t\t\t\t} satisfies ResolvedPlugin,\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 型として返す\nfunction migratePage(page: unknown, registry?: MigrationPluginRegistry): 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 { CheckboxPlugin } from \"./checkbox/plugin\";\nimport { SelectPlugin } from \"./select/plugin\";\nimport { TextPlugin } from \"./text/plugin\";\n\n/**\n * フォーム構築に最低限必要な標準プラグインのリスト。\n *\n * `CheckboxPlugin` / `SelectPlugin` / `TextPlugin` の3つを含む。\n *\n * `createPluginRegistry` にそのまま渡して使用する。\n *\n * @example\n * ```ts\n * import { BASE_PLUGINS, createPluginRegistry } from \"@tatamicks/core\";\n *\n * const pluginRegistry = createPluginRegistry(BASE_PLUGINS);\n * ```\n */\nexport const BASE_PLUGINS = [CheckboxPlugin, SelectPlugin, TextPlugin] as const;\n","import { useCallback, useMemo, useReducer, useRef } from \"react\";\n\nimport { createBlockId } from \"../../utils/block\";\nimport { insertPage, removePage, setPage } from \"../../utils/book\";\n\nimport type { Block } from \"../../types/block\";\nimport type { OnBookChange } from \"../../types/callbacks\";\nimport type { EditorState } from \"../../types/context\";\nimport type { Book } from \"../../types/schema\";\nimport type { ActionHandlers } from \"../action/useBookActionContext\";\n\ntype EditorInternalState = {\n\tselectedBlockIds: string[];\n\tpageIdx: number;\n\tclipboard: Block[];\n};\n\ntype EditorInternalAction =\n\t| { type: \"setSelectedBlockIds\"; ids: string[] }\n\t| { type: \"setPageIdx\"; idx: number }\n\t| { type: \"setClipboard\"; blocks: Block[] };\n\nfunction editorInternalReducer(\n\tstate: EditorInternalState,\n\taction: EditorInternalAction,\n): EditorInternalState {\n\tswitch (action.type) {\n\t\tcase \"setSelectedBlockIds\":\n\t\t\treturn { ...state, selectedBlockIds: action.ids };\n\t\tcase \"setPageIdx\":\n\t\t\treturn { ...state, pageIdx: action.idx };\n\t\tcase \"setClipboard\":\n\t\t\treturn { ...state, clipboard: action.blocks };\n\t}\n}\n\nconst initialEditorInternalState: EditorInternalState = {\n\tselectedBlockIds: [],\n\tpageIdx: 0,\n\tclipboard: [],\n};\n\n/**\n * {@link useEditorState} の入力オプション。\n */\nexport interface UseEditorStateOptions {\n\t/** 編集対象の Book。 */\n\tbook: Book;\n\n\t/** Book 変更時のコールバック。 */\n\thandleBookChange: OnBookChange;\n}\n\n/**\n * {@link useEditorState} の戻り値。\n */\nexport interface UseEditorStateResult {\n\t/** 選択・ページ・クリップボードなど UI 状態をまとめたコンテキスト。 */\n\teditorState: EditorState;\n\n\t/** 選択・ページ更新・コピー等のアクションハンドラー集合。 */\n\tactionHandlers: ActionHandlers;\n\n\t/** 現在選択中のブロック ID 一覧。 */\n\tselectedBlockIds: string[];\n}\n\n/**\n * フルエディター用 UI 状態管理フック。\n *\n * 選択状態・ページ・クリップボードを管理し、\n * 配線済みの `editorState` / `actionHandlers` を返す。\n *\n * @remarks\n * {@link useNoteContext} に渡す中間レイヤー。\n *\n * 外部から直接呼ぶのは、独自のエディター状態層を構築する場合のみとすること。\n */\nexport function useEditorState({\n\tbook,\n\thandleBookChange,\n}: UseEditorStateOptions): UseEditorStateResult {\n\t// ---- UI 状態 -------------------------------------------------------------\n\tconst [state, dispatch] = useReducer(\n\t\teditorInternalReducer,\n\t\tinitialEditorInternalState,\n\t);\n\tconst { selectedBlockIds, pageIdx } = state;\n\n\t// ---- stale closure 回避 ref ---------------------------------------------\n\tconst bookRef = useRef(book);\n\tbookRef.current = book;\n\tconst stateRef = useRef(state);\n\tstateRef.current = state;\n\n\t// ---- ブロック操作ハンドラー -------------------------------------------------\n\tconst handleUpdateBlocks = useCallback(\n\t\t(\n\t\t\tupdates: Record<string, Partial<Block>>,\n\t\t\toptions?: { mergeKey?: string },\n\t\t) => {\n\t\t\tconst b = bookRef.current;\n\t\t\tconst pi = stateRef.current.pageIdx;\n\t\t\tconst currentPage = b.pages[pi];\n\t\t\tif (!currentPage) return;\n\t\t\tconst updatedBlocks = currentPage.blocks.map((blk) => {\n\t\t\t\tconst update = updates[blk.id];\n\t\t\t\treturn update ? { ...blk, ...update } : blk;\n\t\t\t});\n\t\t\thandleBookChange(\n\t\t\t\tsetPage(b, pi, { ...currentPage, blocks: updatedBlocks }),\n\t\t\t\toptions,\n\t\t\t);\n\t\t\t// ブロック ID が変更された場合、selectedBlockIds を新しい ID に追従させる\n\t\t\tconst selectedIds = stateRef.current.selectedBlockIds;\n\t\t\tconst newSelectedIds = selectedIds.map((id) => {\n\t\t\t\tconst newId = updates[id]?.id;\n\t\t\t\treturn typeof newId === \"string\" ? newId : id;\n\t\t\t});\n\t\t\tif (newSelectedIds.some((id, i) => id !== selectedIds[i])) {\n\t\t\t\tdispatch({ type: \"setSelectedBlockIds\", ids: newSelectedIds });\n\t\t\t}\n\t\t},\n\t\t[handleBookChange],\n\t);\n\n\tconst handleDeleteSelected = useCallback(\n\t\t(ids: string[]) => {\n\t\t\tconst b = bookRef.current;\n\t\t\tconst pi = stateRef.current.pageIdx;\n\t\t\tconst currentPage = b.pages[pi];\n\t\t\tif (!currentPage) return;\n\t\t\tconst deletedIds = new Set(ids);\n\t\t\tconst newBlocks = currentPage.blocks.filter(\n\t\t\t\t(blk) => !deletedIds.has(blk.id),\n\t\t\t);\n\t\t\thandleBookChange(setPage(b, pi, { ...currentPage, blocks: newBlocks }));\n\t\t\tdispatch({ type: \"setSelectedBlockIds\", ids: [] });\n\t\t},\n\t\t[handleBookChange],\n\t);\n\n\tconst handleCopySelected = useCallback((ids: string[]) => {\n\t\tconst b = bookRef.current;\n\t\tconst pi = stateRef.current.pageIdx;\n\t\tconst currentPage = b.pages[pi];\n\t\tif (!currentPage) return;\n\t\tconst copied = currentPage.blocks.filter((blk) => ids.includes(blk.id));\n\t\tdispatch({ type: \"setClipboard\", blocks: copied });\n\t}, []);\n\n\tconst handleDuplicateSelected = useCallback(\n\t\t(ids: string[]) => {\n\t\t\tconst b = bookRef.current;\n\t\t\tconst pi = stateRef.current.pageIdx;\n\t\t\tconst currentPage = b.pages[pi];\n\t\t\tif (!currentPage) return;\n\t\t\tconst selected = currentPage.blocks.filter((blk) => ids.includes(blk.id));\n\t\t\tconst grid = currentPage.grid;\n\t\t\tconst newBlocks = selected.map((blk) => ({\n\t\t\t\t...blk,\n\t\t\t\tid: createBlockId(blk.kind),\n\t\t\t\tlayout: {\n\t\t\t\t\t...blk.layout,\n\t\t\t\t\tx: Math.min(blk.layout.x + 1, grid.colCount - blk.layout.w),\n\t\t\t\t\ty: Math.min(blk.layout.y + 1, grid.rowCount - blk.layout.h),\n\t\t\t\t},\n\t\t\t}));\n\t\t\thandleBookChange(\n\t\t\t\tsetPage(b, pi, {\n\t\t\t\t\t...currentPage,\n\t\t\t\t\tblocks: [...currentPage.blocks, ...newBlocks],\n\t\t\t\t}),\n\t\t\t);\n\t\t\tdispatch({\n\t\t\t\ttype: \"setSelectedBlockIds\",\n\t\t\t\tids: newBlocks.map((blk) => blk.id),\n\t\t\t});\n\t\t},\n\t\t[handleBookChange],\n\t);\n\n\tconst handlePaste = useCallback(() => {\n\t\tconst cb = stateRef.current.clipboard;\n\t\tif (cb.length === 0) return;\n\t\tconst b = bookRef.current;\n\t\tconst pi = stateRef.current.pageIdx;\n\t\tconst currentPage = b.pages[pi];\n\t\tif (!currentPage) return;\n\t\tconst grid = currentPage.grid;\n\t\tconst newBlocks = cb.map((blk) => ({\n\t\t\t...blk,\n\t\t\tid: createBlockId(blk.kind),\n\t\t\tlayout: {\n\t\t\t\t...blk.layout,\n\t\t\t\tx: Math.min(blk.layout.x + 1, grid.colCount - blk.layout.w),\n\t\t\t\ty: Math.min(blk.layout.y + 1, grid.rowCount - blk.layout.h),\n\t\t\t},\n\t\t}));\n\t\thandleBookChange(\n\t\t\tsetPage(b, pi, {\n\t\t\t\t...currentPage,\n\t\t\t\tblocks: [...currentPage.blocks, ...newBlocks],\n\t\t\t}),\n\t\t);\n\t\tdispatch({\n\t\t\ttype: \"setSelectedBlockIds\",\n\t\t\tids: newBlocks.map((blk) => blk.id),\n\t\t});\n\t}, [handleBookChange]);\n\n\tconst handleAddPage = useCallback(() => {\n\t\tconst b = bookRef.current;\n\t\tconst pi = stateRef.current.pageIdx;\n\t\tconst currentPage = b.pages[pi];\n\t\tconst newPage = {\n\t\t\tgrid: currentPage\n\t\t\t\t? currentPage.grid\n\t\t\t\t: (b.pages[0]?.grid ?? { colCount: 12, rowCount: 24 }),\n\t\t\tblocks: [],\n\t\t};\n\t\thandleBookChange(insertPage(b, pi, newPage));\n\t\tdispatch({ type: \"setPageIdx\", idx: pi + 1 });\n\t}, [handleBookChange]);\n\n\tconst handleDeletePage = useCallback(() => {\n\t\tconst b = bookRef.current;\n\t\tconst pi = stateRef.current.pageIdx;\n\t\tif (b.pages.length <= 1) return;\n\t\tconst newBook = removePage(b, pi);\n\t\thandleBookChange(newBook);\n\t\tdispatch({\n\t\t\ttype: \"setPageIdx\",\n\t\t\tidx: Math.min(pi, newBook.pages.length - 1),\n\t\t});\n\t}, [handleBookChange]);\n\n\t// ---- actionHandlers(useBookActionContext に渡す)------------------------\n\tconst actionHandlers = useMemo<ActionHandlers>(\n\t\t() => ({\n\t\t\tpaste: {\n\t\t\t\texecute: handlePaste,\n\t\t\t\tisEnabled: () => stateRef.current.clipboard.length > 0,\n\t\t\t},\n\t\t\tdelete: {\n\t\t\t\texecute: () => handleDeleteSelected(stateRef.current.selectedBlockIds),\n\t\t\t\tisEnabled: () => stateRef.current.selectedBlockIds.length > 0,\n\t\t\t},\n\t\t\tcopy: {\n\t\t\t\texecute: () => handleCopySelected(stateRef.current.selectedBlockIds),\n\t\t\t\tisEnabled: () => stateRef.current.selectedBlockIds.length > 0,\n\t\t\t},\n\t\t\tduplicate: {\n\t\t\t\texecute: () =>\n\t\t\t\t\thandleDuplicateSelected(stateRef.current.selectedBlockIds),\n\t\t\t\tisEnabled: () => stateRef.current.selectedBlockIds.length > 0,\n\t\t\t},\n\t\t\taddPage: {\n\t\t\t\texecute: handleAddPage,\n\t\t\t\tisEnabled: () => true,\n\t\t\t},\n\t\t\tdeletePage: {\n\t\t\t\texecute: handleDeletePage,\n\t\t\t\tisEnabled: () => bookRef.current.pages.length > 1,\n\t\t\t},\n\t\t\tselectBlocks: {\n\t\t\t\texecute: (p) =>\n\t\t\t\t\tdispatch({ type: \"setSelectedBlockIds\", ids: p as string[] }),\n\t\t\t\tisEnabled: () => true,\n\t\t\t\tvalidatePayload: (p) =>\n\t\t\t\t\tArray.isArray(p) && p.every((v) => typeof v === \"string\"),\n\t\t\t},\n\t\t\tgoToPage: {\n\t\t\t\texecute: (p) => dispatch({ type: \"setPageIdx\", idx: p as number }),\n\t\t\t\tisEnabled: () => true,\n\t\t\t\tvalidatePayload: (p) => typeof p === \"number\",\n\t\t\t},\n\t\t\tupdateBlocks: {\n\t\t\t\texecute: (p) => {\n\t\t\t\t\tconst { updates, options } = p as {\n\t\t\t\t\t\tupdates: Record<string, Partial<Block>>;\n\t\t\t\t\t\toptions?: { mergeKey?: string };\n\t\t\t\t\t};\n\t\t\t\t\thandleUpdateBlocks(updates, options);\n\t\t\t\t},\n\t\t\t\tisEnabled: () => true,\n\t\t\t\tvalidatePayload: (p) =>\n\t\t\t\t\ttypeof p === \"object\" &&\n\t\t\t\t\tp !== null &&\n\t\t\t\t\t\"updates\" in p &&\n\t\t\t\t\ttypeof (p as Record<string, unknown>).updates === \"object\",\n\t\t\t},\n\t\t}),\n\t\t[\n\t\t\thandlePaste,\n\t\t\thandleDeleteSelected,\n\t\t\thandleCopySelected,\n\t\t\thandleDuplicateSelected,\n\t\t\thandleAddPage,\n\t\t\thandleDeletePage,\n\t\t\thandleUpdateBlocks,\n\t\t],\n\t);\n\n\t// ---- editorState --------------------------------------------------------\n\tconst editorState = useMemo<EditorState>(\n\t\t() => ({\n\t\t\tselectedBlockIds,\n\t\t\tpageIdx,\n\t\t}),\n\t\t[selectedBlockIds, pageIdx],\n\t);\n\n\treturn {\n\t\teditorState,\n\t\tactionHandlers,\n\t\tselectedBlockIds,\n\t};\n}\n","import { useCallback, useMemo, useRef, useState } from \"react\";\n\nimport { useBookActionContext } from \"./action/useBookActionContext\";\nimport {\n\ttype BookBindingContextOptions,\n\tuseBookBindingContext,\n} from \"./binding/useBookBindingContext\";\nimport { useEditorState } from \"./editor/useEditorState\";\nimport { useBookHistory } from \"./history/useBookHistory\";\n\nimport type { RefObject } from \"react\";\nimport type { PluginRegistry } from \"../plugin/registry\";\nimport type {\n\tOnBookChange,\n\tOnValuesChange,\n\tValueChange,\n} from \"../types/callbacks\";\nimport type {\n\tActionContext,\n\tBindingContext,\n\tEditorState,\n} from \"../types/context\";\nimport type { Book } from \"../types/schema\";\nimport type { Value } from \"../types/value\";\n\n/**\n * `useNoteContext` が組み立てるコンテキストオブジェクト。\n *\n * Note / ActionBar / Sidebar / DefaultSelectionActionBarOverlay にそのまま渡して使用する。\n */\nexport interface NoteContext {\n\t/** Book(用紙設定・ページを含む) */\n\tbook: Book;\n\n\t/** Book 変更コールバック */\n\tonBookChange: OnBookChange;\n\n\t/** ブロックプラグインのレジストリ(`createPluginRegistry` で生成) */\n\tpluginRegistry: PluginRegistry;\n\n\t/** Note を包む `position: relative` なコンテナの ref */\n\tcontainerRef: RefObject<HTMLDivElement | null>;\n\n\t/** バインディングパス対応の値読み書きコンテキスト */\n\tbindingContext: BindingContext;\n\n\t/** ブロック挿入・移動・削除などのアクションハンドラコンテキスト */\n\tactionContext: ActionContext;\n\n\t/** 各ブロックの現在の入力値 */\n\tvalues: Record<string, Value>;\n\n\t/** 入力値が変更されたときのコールバック */\n\tonValuesChange?: OnValuesChange;\n\n\t/**\n\t * フルエディター用の UI 状態。\n\t * DefaultSelectionActionBarOverlay / getDefaultActionBarSections / getDefaultSidebarTabs\n\t * はこのフィールドを参照する。\n\t */\n\teditorState: EditorState;\n}\n\n/**\n * {@link useNoteContext} のオプション。\n */\nexport interface UseNoteContextOptions {\n\t/**\n\t * 初期ブックデータ。\n\t *\n\t * **マウント時のみ参照される**(React の `useState` 初期値と同じ挙動)。\n\t * マウント後に値を変えても内部状態には反映されない。\n\t *\n\t * そのため、非同期ロード後にデータを渡す場合は、\n\t * **ロード完了後にコンポーネントをマウントする**こと。\n\t *\n\t * @example\n\t * ```tsx\n\t * // ✅ ロード完了後にマウント\n\t * if (!templateData) return <Loading />;\n\t * return <MyEditor initialBook={templateData} />;\n\t *\n\t * // ✅ ドキュメント切り替え時は key でリマウント\n\t * return <MyEditor key={documentId} initialBook={loadedBook} />;\n\t * ```\n\t */\n\tinitialBook: Book;\n\n\t/** ブロックプラグインのレジストリ(`createPluginRegistry` で生成) */\n\tpluginRegistry: PluginRegistry;\n\n\t/**\n\t * 各ブロックの初期入力値(省略可)。\n\t *\n\t * **マウント時のみ参照される**(React の `useState` 初期値と同じ挙動)。\n\t * マウント後に値が変わっても内部状態には反映されない。\n\t *\n\t * そのため、非同期ロード後にデータを渡す場合は、\n\t * **ロード完了後にコンポーネントをマウントする**こと。\n\t *\n\t * @example\n\t * ```tsx\n\t * // ❌ ダメな例 — フェッチ中は undefined、完了後に変わっても無視される\n\t * const { data: savedValues } = useFetch(\"/api/answers\");\n\t * const { context } = useNoteContext({ initialBook, pluginRegistry, defaultValues: savedValues });\n\t *\n\t * // ✅ ロード完了後にマウント\n\t * const { data: savedValues } = useFetch(\"/api/answers\");\n\t * if (!savedValues) return <Loading />;\n\t * return <MyEditor defaultValues={savedValues} />;\n\t * ```\n\t */\n\tdefaultValues?: Record<string, Value>;\n\n\t/**\n\t * ユーザー定義の追加 BindingContext。\n\t * 組み込みパスより優先して参照される。\n\t * 詳細は {@link BookBindingContextOptions.extra} を参照。\n\t */\n\textra?: BindingContext;\n}\n\n/**\n * {@link useNoteContext} の戻り値。\n */\nexport interface UseNoteContextResult {\n\t/** Note / ActionBar / Sidebar / DefaultSelectionActionBarOverlay に渡す context */\n\tcontext: NoteContext;\n}\n\n/**\n * フルエディター(ActionBar + Note + SelectionActionBarOverlay + Sidebar)向けの Context 統合フック。\n *\n * `useBookHistory` / `useEditorState` / `useBookBindingContext` / `useBookActionContext`\n * を組み合わせ、配線済みの `NoteContext` を返す。\n *\n * @example\n * ```tsx\n * const { context } = useNoteContext({ initialBook, pluginRegistry });\n * const [mode, setMode] = useState<NoteMode>(NoteMode.FORM);\n *\n * <ActionBar sections={getDefaultActionBarSections({ context })} />\n * <div ref={context.containerRef} style={{ position: \"relative\" }}>\n * <Note mode={mode} context={context} />\n * <DefaultSelectionActionBarOverlay context={context} />\n * </div>\n * <Sidebar tabs={getDefaultSidebarTabs({ context })} />\n * ```\n */\nexport function useNoteContext({\n\tinitialBook,\n\tpluginRegistry,\n\tdefaultValues,\n\textra,\n}: UseNoteContextOptions): UseNoteContextResult {\n\tconst containerRef = useRef<HTMLDivElement>(null);\n\n\tconst { book, handleBookChange, historyActionHandlers } = useBookHistory({\n\t\tinitialBook,\n\t});\n\n\tconst [values, setValues] = useState<Record<string, Value>>(\n\t\tdefaultValues ?? {},\n\t);\n\tconst handleValuesChange = useCallback((changes: ValueChange[]) => {\n\t\tif (changes.length === 0) return;\n\t\tsetValues((prev) => {\n\t\t\tconst hasChange = changes.some(({ id, value }) =>\n\t\t\t\tvalue === undefined ? id in prev : prev[id] !== value,\n\t\t\t);\n\t\t\tif (!hasChange) return prev;\n\t\t\tconst next = { ...prev };\n\t\t\tfor (const { id, value } of changes) {\n\t\t\t\tif (value === undefined) delete next[id];\n\t\t\t\telse next[id] = value;\n\t\t\t}\n\t\t\treturn next;\n\t\t});\n\t}, []);\n\n\tconst { editorState, actionHandlers } = useEditorState({\n\t\tbook,\n\t\thandleBookChange,\n\t});\n\n\tconst bindingContextOptions: BookBindingContextOptions = {\n\t\tpageIdx: editorState.pageIdx,\n\t\t...(extra ? { extra } : {}),\n\t};\n\tconst bindingContext = useBookBindingContext(\n\t\tbook,\n\t\thandleBookChange,\n\t\tbindingContextOptions,\n\t);\n\tconst actionContext = useBookActionContext({\n\t\t...historyActionHandlers,\n\t\t...actionHandlers,\n\t});\n\n\tconst context = useMemo<NoteContext>(\n\t\t() => ({\n\t\t\tbook,\n\t\t\tonBookChange: handleBookChange,\n\t\t\tpluginRegistry,\n\t\t\tcontainerRef,\n\t\t\tbindingContext,\n\t\t\tactionContext,\n\t\t\tvalues,\n\t\t\tonValuesChange: handleValuesChange,\n\t\t\teditorState,\n\t\t}),\n\t\t[\n\t\t\tbook,\n\t\t\thandleBookChange,\n\t\t\tpluginRegistry,\n\t\t\tbindingContext,\n\t\t\tactionContext,\n\t\t\tvalues,\n\t\t\thandleValuesChange,\n\t\t\teditorState,\n\t\t],\n\t);\n\n\treturn { context };\n}\n","/**\n * ButtonBlock 用 SVG アイコンパス定数\n *\n * Material Design アイコンの 24×24 viewBox 用パスデータ。\n *\n * Unicode 絵文字・OS フォントに依存せず、あらゆる環境で確実に表示できる。\n *\n * ButtonProps.iconPath に渡して使用する。\n *\n * レンダラーは `<svg viewBox=\"0 0 24 24\"><path d={iconPath} fill=\"currentColor\"/>` で描画する。\n */\nexport const BUTTON_ICON_PATHS = {\n\t/** チェック済みチェックボックス (check_box) */\n\tselectAll:\n\t\t\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-9 14l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z\",\n\n\t/** 空チェックボックス (check_box_outline_blank) */\n\tdeselectAll:\n\t\t\"M19 5v14H5V5h14m0-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z\",\n\n\t/** ゴミ箱 (delete) */\n\tdelete:\n\t\t\"M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z\",\n\n\t/** 二重矩形・コピー (content_copy) */\n\tcopy: \"M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z\",\n\n\t/** クリップボード・ペースト (content_paste) */\n\tpaste:\n\t\t\"M19 2h-4.18C14.4.84 13.3 0 12 0c-1.3 0-2.4.84-2.82 2H5c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-7 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm7 18H5V4h2v3h10V4h2v16z\",\n\n\t/** ページ+プラス・複製 (library_add) */\n\tduplicate:\n\t\t\"M4 6H2v14c0 1.1.9 2 2 2h14v-2H4V6zm16-4H8c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-1 9h-4v4h-2v-4H9V9h4V5h2v4h4v2z\",\n\n\t/** 左向き弧矢印・元に戻す (undo) */\n\tundo: \"M12.5 8c-2.65 0-5.05.99-6.9 2.6L2 7v9h9l-3.62-3.62c1.39-1.16 3.16-1.88 5.12-1.88 3.54 0 6.55 2.31 7.6 5.5l2.37-.78C21.08 11.03 17.15 8 12.5 8z\",\n\n\t/** 右向き弧矢印・やり直し (redo) */\n\tredo: \"M18.4 10.6C16.55 8.99 14.15 8 11.5 8c-4.65 0-8.58 3.03-9.96 7.22L3.9 16c1.05-3.19 4.05-5.5 7.6-5.5 1.95 0 3.73.72 5.12 1.88L13 16h9V7l-3.6 3.6z\",\n\n\t/** 左向き山括弧・前のページ (navigate_before / chevron_left) */\n\tprevPage: \"M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z\",\n\n\t/** 右向き山括弧・次のページ (navigate_next / chevron_right) */\n\tnextPage: \"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\",\n\n\t/** プラス・ページ追加 (add) */\n\taddPage: \"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\",\n\n\t/** マイナス・ページ削除 (remove) */\n\tdeletePage: \"M19 13H5v-2h14v2z\",\n} as const;\n","import type { Value } from \"../../../types\";\n\n/**\n * ウィジェットボタン共通の内側パディング。\n *\n * @remarks カスタムシェル構築専用。\n */\nexport const BTN_PADDING = { value: 2, unit: \"mm\" as const };\n\n/**\n * ウィジェット用ボタン props ヘルパー。\n *\n * @remarks\n * カスタムシェル構築専用。\n *\n * `iconPath`・`action`・オプショナルなトールチップに基づき、`ButtonBlock` 用の props オブジェクトを返す。\n */\nexport function btn(\n\ticonPath: string,\n\taction: string,\n\ttitle?: string,\n): Record<string, Value> {\n\treturn {\n\t\ticonPath,\n\t\tlabel: \"\",\n\t\taction,\n\t\t...(title ? { title } : {}),\n\t\ttop: BTN_PADDING,\n\t\tright: BTN_PADDING,\n\t\tbottom: BTN_PADDING,\n\t\tleft: BTN_PADDING,\n\t};\n}\n","import { PaperSizePreset } from \"../../../types/paper\";\nimport { ButtonPlugin } from \"../../blocks/button\";\nimport { BUTTON_ICON_PATHS } from \"../../blocks/button/iconPaths\";\nimport { btn } from \"../common/btn\";\n\nimport type { WidgetDef } from \"../types\";\n\n/**\n * キャンバス操作ボタン widget を生成するファクトリ関数。\n *\n * @remarks\n * カスタムシェル構築専用。\n *\n * 8 列 × 1 行: [全選択][解除][削除][コピー][貼付][複製][元に戻す][やり直し]\n *\n * `idPrefix` でブロック ID プレフィックスを変更できる。\n */\nexport function createCanvasActionsWidget(\n\tidPrefix = \"canvas-actions\",\n): WidgetDef {\n\treturn {\n\t\tprops: {\n\t\t\tbook: {\n\t\t\t\tpaper: {\n\t\t\t\t\tsize: {\n\t\t\t\t\t\tpreset: PaperSizePreset.CUSTOM,\n\t\t\t\t\t\twidth: { value: 160, unit: \"mm\" },\n\t\t\t\t\t\theight: { value: 20, unit: \"mm\" },\n\t\t\t\t\t},\n\t\t\t\t\tmargin: {\n\t\t\t\t\t\ttop: { value: 0, unit: \"mm\" },\n\t\t\t\t\t\tright: { value: 0, unit: \"mm\" },\n\t\t\t\t\t\tbottom: { value: 0, unit: \"mm\" },\n\t\t\t\t\t\tleft: { value: 0, unit: \"mm\" },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tpages: [\n\t\t\t\t\t{\n\t\t\t\t\t\tgrid: { colCount: 8, rowCount: 1 },\n\t\t\t\t\t\tblocks: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: `${idPrefix}-select-all`,\n\t\t\t\t\t\t\t\tkind: \"button\",\n\t\t\t\t\t\t\t\tlayout: { x: 0, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t\t\tprops: btn(\n\t\t\t\t\t\t\t\t\tBUTTON_ICON_PATHS.selectAll,\n\t\t\t\t\t\t\t\t\t\"select_all\",\n\t\t\t\t\t\t\t\t\t\"すべて選択\",\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: `${idPrefix}-deselect-all`,\n\t\t\t\t\t\t\t\tkind: \"button\",\n\t\t\t\t\t\t\t\tlayout: { x: 1, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t\t\tprops: btn(\n\t\t\t\t\t\t\t\t\tBUTTON_ICON_PATHS.deselectAll,\n\t\t\t\t\t\t\t\t\t\"deselect_all\",\n\t\t\t\t\t\t\t\t\t\"選択を解除\",\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: `${idPrefix}-delete`,\n\t\t\t\t\t\t\t\tkind: \"button\",\n\t\t\t\t\t\t\t\tlayout: { x: 2, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t\t\tprops: btn(\n\t\t\t\t\t\t\t\t\tBUTTON_ICON_PATHS.delete,\n\t\t\t\t\t\t\t\t\t\"delete\",\n\t\t\t\t\t\t\t\t\t\"削除 (Delete / Backspace)\",\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: `${idPrefix}-copy`,\n\t\t\t\t\t\t\t\tkind: \"button\",\n\t\t\t\t\t\t\t\tlayout: { x: 3, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t\t\tprops: btn(\n\t\t\t\t\t\t\t\t\tBUTTON_ICON_PATHS.copy,\n\t\t\t\t\t\t\t\t\t\"copy\",\n\t\t\t\t\t\t\t\t\t\"コピー (Ctrl+C / Cmd+C)\",\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: `${idPrefix}-paste`,\n\t\t\t\t\t\t\t\tkind: \"button\",\n\t\t\t\t\t\t\t\tlayout: { x: 4, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t\t\tprops: btn(\n\t\t\t\t\t\t\t\t\tBUTTON_ICON_PATHS.paste,\n\t\t\t\t\t\t\t\t\t\"paste\",\n\t\t\t\t\t\t\t\t\t\"貼り付け (Ctrl+V / Cmd+V)\",\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: `${idPrefix}-duplicate`,\n\t\t\t\t\t\t\t\tkind: \"button\",\n\t\t\t\t\t\t\t\tlayout: { x: 5, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t\t\tprops: btn(\n\t\t\t\t\t\t\t\t\tBUTTON_ICON_PATHS.duplicate,\n\t\t\t\t\t\t\t\t\t\"duplicate\",\n\t\t\t\t\t\t\t\t\t\"複製 (Ctrl+D / Cmd+D)\",\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: `${idPrefix}-undo`,\n\t\t\t\t\t\t\t\tkind: \"button\",\n\t\t\t\t\t\t\t\tlayout: { x: 6, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t\t\tprops: btn(\n\t\t\t\t\t\t\t\t\tBUTTON_ICON_PATHS.undo,\n\t\t\t\t\t\t\t\t\t\"undo\",\n\t\t\t\t\t\t\t\t\t\"元に戻す (Ctrl+Z / Cmd+Z)\",\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: `${idPrefix}-redo`,\n\t\t\t\t\t\t\t\tkind: \"button\",\n\t\t\t\t\t\t\t\tlayout: { x: 7, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t\t\tprops: btn(\n\t\t\t\t\t\t\t\t\tBUTTON_ICON_PATHS.redo,\n\t\t\t\t\t\t\t\t\t\"redo\",\n\t\t\t\t\t\t\t\t\t\"やり直し (Ctrl+Y / Cmd+Y)\",\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t},\n\t\tplugins: [ButtonPlugin],\n\t};\n}\n\n/**\n * デフォルトのキャンバス操作ボタン widget。\n *\n * @remarks\n * カスタムシェル構築専用。\n *\n * `createCanvasActionsWidget()` と等価。\n */\nexport const canvasActionsWidget: WidgetDef = createCanvasActionsWidget();\n","import { PaperSizePreset } from \"../../../types/paper\";\nimport { ButtonPlugin } from \"../../blocks/button\";\nimport { BUTTON_ICON_PATHS } from \"../../blocks/button/iconPaths\";\nimport { btn } from \"../common/btn\";\n\nimport type { WidgetDef } from \"../types\";\n\n/**\n * クリップボード操作ボタン widget を生成するファクトリ関数。\n *\n * @remarks\n * カスタムシェル構築専用。\n *\n * 3 列 × 1 行: [コピー][貼付][複製]\n *\n * `idPrefix` でブロック ID プレフィックスを変更できる。\n */\nexport function createClipboardWidget(idPrefix = \"clipboard\"): WidgetDef {\n\treturn {\n\t\tprops: {\n\t\t\tbook: {\n\t\t\t\tpaper: {\n\t\t\t\t\tsize: {\n\t\t\t\t\t\tpreset: PaperSizePreset.CUSTOM,\n\t\t\t\t\t\twidth: { value: 60, unit: \"mm\" },\n\t\t\t\t\t\theight: { value: 20, unit: \"mm\" },\n\t\t\t\t\t},\n\t\t\t\t\tmargin: {\n\t\t\t\t\t\ttop: { value: 0, unit: \"mm\" },\n\t\t\t\t\t\tright: { value: 0, unit: \"mm\" },\n\t\t\t\t\t\tbottom: { value: 0, unit: \"mm\" },\n\t\t\t\t\t\tleft: { value: 0, unit: \"mm\" },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tpages: [\n\t\t\t\t\t{\n\t\t\t\t\t\tgrid: { colCount: 3, rowCount: 1 },\n\t\t\t\t\t\tblocks: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: `${idPrefix}-copy`,\n\t\t\t\t\t\t\t\tkind: \"button\",\n\t\t\t\t\t\t\t\tlayout: { x: 0, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t\t\tprops: btn(BUTTON_ICON_PATHS.copy, \"copy\"),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: `${idPrefix}-paste`,\n\t\t\t\t\t\t\t\tkind: \"button\",\n\t\t\t\t\t\t\t\tlayout: { x: 1, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t\t\tprops: btn(BUTTON_ICON_PATHS.paste, \"paste\"),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: `${idPrefix}-duplicate`,\n\t\t\t\t\t\t\t\tkind: \"button\",\n\t\t\t\t\t\t\t\tlayout: { x: 2, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t\t\tprops: btn(BUTTON_ICON_PATHS.duplicate, \"duplicate\"),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t},\n\t\tplugins: [ButtonPlugin],\n\t};\n}\n\n/**\n * デフォルトのクリップボード操作ボタン widget。\n *\n * @remarks\n * カスタムシェル構築専用。\n *\n * `createClipboardWidget()` と等価。\n */\nexport const clipboardWidget: WidgetDef = createClipboardWidget();\n","import { PaperSizePreset } from \"../../../types/paper\";\nimport { ButtonPlugin } from \"../../blocks/button\";\nimport { BUTTON_ICON_PATHS } from \"../../blocks/button/iconPaths\";\nimport { btn } from \"../common/btn\";\n\nimport type { WidgetDef } from \"../types\";\n\n/**\n * 操作履歴(アンドゥ・リドゥ)ボタン widget を生成するファクトリ関数。\n *\n * @remarks\n * カスタムシェル構築専用。\n *\n * 2 列 × 1 行: [元に戻す][やり直し]\n *\n * `idPrefix` でブロック ID プレフィックスを変更できる。\n */\nexport function createHistoryWidget(idPrefix = \"history\"): WidgetDef {\n\treturn {\n\t\tprops: {\n\t\t\tbook: {\n\t\t\t\tpaper: {\n\t\t\t\t\tsize: {\n\t\t\t\t\t\tpreset: PaperSizePreset.CUSTOM,\n\t\t\t\t\t\twidth: { value: 40, unit: \"mm\" },\n\t\t\t\t\t\theight: { value: 20, unit: \"mm\" },\n\t\t\t\t\t},\n\t\t\t\t\tmargin: {\n\t\t\t\t\t\ttop: { value: 0, unit: \"mm\" },\n\t\t\t\t\t\tright: { value: 0, unit: \"mm\" },\n\t\t\t\t\t\tbottom: { value: 0, unit: \"mm\" },\n\t\t\t\t\t\tleft: { value: 0, unit: \"mm\" },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tpages: [\n\t\t\t\t\t{\n\t\t\t\t\t\tgrid: { colCount: 2, rowCount: 1 },\n\t\t\t\t\t\tblocks: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: `${idPrefix}-undo`,\n\t\t\t\t\t\t\t\tkind: \"button\",\n\t\t\t\t\t\t\t\tlayout: { x: 0, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t\t\tprops: btn(BUTTON_ICON_PATHS.undo, \"undo\"),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: `${idPrefix}-redo`,\n\t\t\t\t\t\t\t\tkind: \"button\",\n\t\t\t\t\t\t\t\tlayout: { x: 1, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t\t\tprops: btn(BUTTON_ICON_PATHS.redo, \"redo\"),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t},\n\t\tplugins: [ButtonPlugin],\n\t};\n}\n\n/**\n * デフォルトの履歴操作ボタン widget。\n *\n * @remarks\n * カスタムシェル構築専用。\n *\n * `createHistoryWidget()` と等価。\n */\nexport const historyWidget: WidgetDef = createHistoryWidget();\n","import { PaperSizePreset } from \"../../../types/paper\";\nimport { StepperPlugin } from \"../../blocks/stepper\";\nimport { TextPlugin } from \"../../blocks/text\";\nimport { numberInputBlock } from \"../primitives/numberInputBlock\";\n\nimport type { WidgetDef } from \"../types\";\n\n// blockLayoutWidget のペーパー設定共通値\nconst ATOM_PAPER = {\n\tsize: {\n\t\tpreset: PaperSizePreset.CUSTOM,\n\t\twidth: { value: 60, unit: \"mm\" as const },\n\t\theight: { value: 8, unit: \"mm\" as const },\n\t},\n\tmargin: {\n\t\ttop: { value: 0, unit: \"mm\" as const },\n\t\tright: { value: 0, unit: \"mm\" as const },\n\t\tbottom: { value: 0, unit: \"mm\" as const },\n\t\tleft: { value: 0, unit: \"mm\" as const },\n\t},\n\tautoHeight: true,\n\tautoWidth: true,\n};\n\n// compound widget 用ペーパー共通設定(余白・高さ・ autoFit を ATOM_PAPER と共有)\nconst COMPOUND_PAPER_BASE = {\n\tmargin: ATOM_PAPER.margin,\n\tautoHeight: ATOM_PAPER.autoHeight,\n\tautoWidth: ATOM_PAPER.autoWidth,\n};\n\n/**\n * ブロックレイアウト設定 compound widget。\n *\n * @remarks\n * カスタムシェル構築専用。\n *\n * X / Y / W / H の 4 入力を 1 行フラット構成で横並びにする。\n *\n * 12 列 × 1 行グリッド。\n *\n * 列構成:\n *\n * 0(label X) 1(input X) 2(stepper X・8mm)\n *\n * 3(label Y) 4(input Y) 5(stepper Y・8mm)\n *\n * 6(label W) 7(input W) 8(stepper W・8mm)\n *\n * 9(label H) 10(input H) 11(stepper H・8mm)\n */\nexport const blockLayoutWidget: WidgetDef = {\n\tprops: {\n\t\tbook: {\n\t\t\tpaper: {\n\t\t\t\t...COMPOUND_PAPER_BASE,\n\t\t\t\tsize: {\n\t\t\t\t\tpreset: PaperSizePreset.CUSTOM,\n\t\t\t\t\twidth: { value: 160, unit: \"mm\" as const },\n\t\t\t\t\theight: { value: 8, unit: \"mm\" as const },\n\t\t\t\t},\n\t\t\t},\n\t\t\tpages: [\n\t\t\t\t{\n\t\t\t\t\tgrid: {\n\t\t\t\t\t\tcolCount: 12,\n\t\t\t\t\t\trowCount: 1,\n\t\t\t\t\t\tcols: {\n\t\t\t\t\t\t\t2: { value: 8, unit: \"mm\" as const },\n\t\t\t\t\t\t\t5: { value: 8, unit: \"mm\" as const },\n\t\t\t\t\t\t\t8: { value: 8, unit: \"mm\" as const },\n\t\t\t\t\t\t\t11: { value: 8, unit: \"mm\" as const },\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tblocks: [\n\t\t\t\t\t\t// X\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"layout-x-label\",\n\t\t\t\t\t\t\tkind: \"text\",\n\t\t\t\t\t\t\tlayout: { x: 0, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t\tinitValue: \"X\",\n\t\t\t\t\t\t\tbehavior: { readOnly: true },\n\t\t\t\t\t\t\tprops: { horizontal: \"center\", vertical: \"center\" },\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t...numberInputBlock(\"layout-x-value\", \"layout.x\"),\n\t\t\t\t\t\t\tlayout: { x: 1, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"layout-x-stepper\",\n\t\t\t\t\t\t\tkind: \"stepper\",\n\t\t\t\t\t\t\tlayout: { x: 2, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t\tprops: { binding: \"layout.x\", step: 1, min: 0 },\n\t\t\t\t\t\t},\n\t\t\t\t\t\t// Y\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"layout-y-label\",\n\t\t\t\t\t\t\tkind: \"text\",\n\t\t\t\t\t\t\tlayout: { x: 3, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t\tinitValue: \"Y\",\n\t\t\t\t\t\t\tbehavior: { readOnly: true },\n\t\t\t\t\t\t\tprops: { horizontal: \"center\", vertical: \"center\" },\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t...numberInputBlock(\"layout-y-value\", \"layout.y\"),\n\t\t\t\t\t\t\tlayout: { x: 4, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"layout-y-stepper\",\n\t\t\t\t\t\t\tkind: \"stepper\",\n\t\t\t\t\t\t\tlayout: { x: 5, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t\tprops: { binding: \"layout.y\", step: 1, min: 0 },\n\t\t\t\t\t\t},\n\t\t\t\t\t\t// W\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"layout-w-label\",\n\t\t\t\t\t\t\tkind: \"text\",\n\t\t\t\t\t\t\tlayout: { x: 6, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t\tinitValue: \"W\",\n\t\t\t\t\t\t\tbehavior: { readOnly: true },\n\t\t\t\t\t\t\tprops: { horizontal: \"center\", vertical: \"center\" },\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t...numberInputBlock(\"layout-w-value\", \"layout.w\"),\n\t\t\t\t\t\t\tlayout: { x: 7, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"layout-w-stepper\",\n\t\t\t\t\t\t\tkind: \"stepper\",\n\t\t\t\t\t\t\tlayout: { x: 8, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t\tprops: { binding: \"layout.w\", step: 1, min: 1 },\n\t\t\t\t\t\t},\n\t\t\t\t\t\t// H\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"layout-h-label\",\n\t\t\t\t\t\t\tkind: \"text\",\n\t\t\t\t\t\t\tlayout: { x: 9, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t\tinitValue: \"H\",\n\t\t\t\t\t\t\tbehavior: { readOnly: true },\n\t\t\t\t\t\t\tprops: { horizontal: \"center\", vertical: \"center\" },\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t...numberInputBlock(\"layout-h-value\", \"layout.h\"),\n\t\t\t\t\t\t\tlayout: { x: 10, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"layout-h-stepper\",\n\t\t\t\t\t\t\tkind: \"stepper\",\n\t\t\t\t\t\t\tlayout: { x: 11, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t\tprops: { binding: \"layout.h\", step: 1, min: 1 },\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t},\n\tplugins: [TextPlugin, StepperPlugin],\n};\n","import { PaperSizePreset } from \"../../../types/paper\";\nimport { ButtonPlugin } from \"../../blocks/button\";\nimport { BUTTON_ICON_PATHS } from \"../../blocks/button/iconPaths\";\nimport { TextPlugin } from \"../../blocks/text\";\n\nimport type { WidgetDef } from \"../types\";\n\n/**\n * ページナビゲーション widget を生成するファクトリ関数。\n *\n * @remarks\n * カスタムシェル構築専用。\n *\n * 7 列 × 1 行の NoteBlock プリセット:\n *\n * [prev][current][separator][total][next][add][delete]\n *\n * `pageIdx` と `pageCount` を渡すとインジケーター表示が動的になる。\n *\n * 省略時は「—」が表示される。\n */\nexport function createPageNavigationWidget(options: {\n\tpageIdx?: number;\n\tpageCount?: number;\n}): WidgetDef {\n\tconst { pageIdx, pageCount } = options;\n\tconst currentLabel = pageIdx !== undefined ? String(pageIdx + 1) : \"\\u2014\";\n\tconst totalLabel = pageCount !== undefined ? String(pageCount) : \"\\u2014\";\n\n\treturn {\n\t\tprops: {\n\t\t\tbook: {\n\t\t\t\tpaper: {\n\t\t\t\t\tsize: {\n\t\t\t\t\t\tpreset: PaperSizePreset.CUSTOM,\n\t\t\t\t\t\twidth: { value: 130, unit: \"mm\" },\n\t\t\t\t\t\theight: { value: 20, unit: \"mm\" },\n\t\t\t\t\t},\n\t\t\t\t\tmargin: {\n\t\t\t\t\t\ttop: { value: 0, unit: \"mm\" },\n\t\t\t\t\t\tright: { value: 0, unit: \"mm\" },\n\t\t\t\t\t\tbottom: { value: 0, unit: \"mm\" },\n\t\t\t\t\t\tleft: { value: 0, unit: \"mm\" },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tpages: [\n\t\t\t\t\t{\n\t\t\t\t\t\tgrid: {\n\t\t\t\t\t\t\tcolCount: 7,\n\t\t\t\t\t\t\trowCount: 1,\n\t\t\t\t\t\t\tcols: {\n\t\t\t\t\t\t\t\t2: { value: 10, unit: \"mm\" },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tblocks: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: \"prev-page\",\n\t\t\t\t\t\t\t\tkind: \"button\",\n\t\t\t\t\t\t\t\tlayout: { x: 0, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\t\t\ticonPath: BUTTON_ICON_PATHS.prevPage,\n\t\t\t\t\t\t\t\t\tlabel: \"\",\n\t\t\t\t\t\t\t\t\taction: \"prev_page\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: \"page-current\",\n\t\t\t\t\t\t\t\tkind: \"text\",\n\t\t\t\t\t\t\t\tlayout: { x: 1, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t\t\tbehavior: { readOnly: true },\n\t\t\t\t\t\t\t\tinitValue: currentLabel,\n\t\t\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\t\t\thorizontal: \"right\",\n\t\t\t\t\t\t\t\t\tvertical: \"center\",\n\t\t\t\t\t\t\t\t\tfontSize: { value: 25, unit: \"pt\" as const },\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: \"page-separator\",\n\t\t\t\t\t\t\t\tkind: \"text\",\n\t\t\t\t\t\t\t\tlayout: { x: 2, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t\t\tbehavior: { readOnly: true },\n\t\t\t\t\t\t\t\tinitValue: \"/\",\n\t\t\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\t\t\thorizontal: \"center\",\n\t\t\t\t\t\t\t\t\tvertical: \"center\",\n\t\t\t\t\t\t\t\t\tfontSize: { value: 25, unit: \"pt\" as const },\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: \"page-total\",\n\t\t\t\t\t\t\t\tkind: \"text\",\n\t\t\t\t\t\t\t\tlayout: { x: 3, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t\t\tbehavior: { readOnly: true },\n\t\t\t\t\t\t\t\tinitValue: totalLabel,\n\t\t\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\t\t\thorizontal: \"left\",\n\t\t\t\t\t\t\t\t\tvertical: \"center\",\n\t\t\t\t\t\t\t\t\tfontSize: { value: 25, unit: \"pt\" as const },\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: \"next-page\",\n\t\t\t\t\t\t\t\tkind: \"button\",\n\t\t\t\t\t\t\t\tlayout: { x: 4, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\t\t\ticonPath: BUTTON_ICON_PATHS.nextPage,\n\t\t\t\t\t\t\t\t\tlabel: \"\",\n\t\t\t\t\t\t\t\t\taction: \"next_page\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: \"add-page\",\n\t\t\t\t\t\t\t\tkind: \"button\",\n\t\t\t\t\t\t\t\tlayout: { x: 5, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\t\t\ticonPath: BUTTON_ICON_PATHS.addPage,\n\t\t\t\t\t\t\t\t\tlabel: \"\",\n\t\t\t\t\t\t\t\t\taction: \"add_page\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: \"delete-page\",\n\t\t\t\t\t\t\t\tkind: \"button\",\n\t\t\t\t\t\t\t\tlayout: { x: 6, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\t\t\ticonPath: BUTTON_ICON_PATHS.deletePage,\n\t\t\t\t\t\t\t\t\tlabel: \"\",\n\t\t\t\t\t\t\t\t\taction: \"delete_page\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t},\n\t\tplugins: [ButtonPlugin, TextPlugin],\n\t};\n}\n\n/**\n * デフォルトのページナビゲーション widget(ページ数不明の初期状態)。\n *\n * @remarks\n * カスタムシェル構築専用。\n *\n * `createPageNavigationWidget({})` と等価。\n */\nexport const pageNavigationWidget: WidgetDef = createPageNavigationWidget({});\n","import { PaperSizePreset } from \"../../../types/paper\";\nimport { ButtonPlugin } from \"../../blocks/button\";\nimport { BUTTON_ICON_PATHS } from \"../../blocks/button/iconPaths\";\nimport { btn } from \"../common/btn\";\n\nimport type { WidgetDef } from \"../types\";\n\n/**\n * 選択操作・削除ボタン widget を生成するファクトリ関数。\n *\n * @remarks\n * カスタムシェル構築専用。\n *\n * 3 列 × 1 行: [全選択][選択解除][削除]\n *\n * `idPrefix` でブロック ID プレフィックスを変更できる。\n */\nexport function createSelectionDeleteWidget(idPrefix = \"selection\"): WidgetDef {\n\treturn {\n\t\tprops: {\n\t\t\tbook: {\n\t\t\t\tpaper: {\n\t\t\t\t\tsize: {\n\t\t\t\t\t\tpreset: PaperSizePreset.CUSTOM,\n\t\t\t\t\t\twidth: { value: 60, unit: \"mm\" },\n\t\t\t\t\t\theight: { value: 20, unit: \"mm\" },\n\t\t\t\t\t},\n\t\t\t\t\tmargin: {\n\t\t\t\t\t\ttop: { value: 0, unit: \"mm\" },\n\t\t\t\t\t\tright: { value: 0, unit: \"mm\" },\n\t\t\t\t\t\tbottom: { value: 0, unit: \"mm\" },\n\t\t\t\t\t\tleft: { value: 0, unit: \"mm\" },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tpages: [\n\t\t\t\t\t{\n\t\t\t\t\t\tgrid: { colCount: 3, rowCount: 1 },\n\t\t\t\t\t\tblocks: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: `${idPrefix}-select-all`,\n\t\t\t\t\t\t\t\tkind: \"button\",\n\t\t\t\t\t\t\t\tlayout: { x: 0, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t\t\tprops: btn(BUTTON_ICON_PATHS.selectAll, \"select_all\"),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: `${idPrefix}-deselect-all`,\n\t\t\t\t\t\t\t\tkind: \"button\",\n\t\t\t\t\t\t\t\tlayout: { x: 1, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t\t\tprops: btn(BUTTON_ICON_PATHS.deselectAll, \"deselect_all\"),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: `${idPrefix}-delete`,\n\t\t\t\t\t\t\t\tkind: \"button\",\n\t\t\t\t\t\t\t\tlayout: { x: 2, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t\t\tprops: btn(BUTTON_ICON_PATHS.delete, \"delete\"),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t},\n\t\tplugins: [ButtonPlugin],\n\t};\n}\n\n/**\n * デフォルトの選択操作・削除ボタン widget。\n *\n * @remarks\n * カスタムシェル構築専用。\n *\n * `createSelectionDeleteWidget()` と等価。\n */\nexport const selectionDeleteWidget: WidgetDef = createSelectionDeleteWidget();\n","import { Fragment, isValidElement } from \"react\";\n\nimport styles from \"./ActionBar.module.css\";\nimport { ActionBarDivider } from \"./ActionBarDivider\";\n\nimport type React from \"react\";\nimport type { ReactNode } from \"react\";\n\n/**\n * アクションバーコンポーネントへの props。\n */\nexport interface ActionBarProps {\n\t/**\n\t * バーに表示するセクションの配列。\n\t *\n\t * 隣接するセクション間には区切り線が自動挿入される。\n\t *\n\t * デフォルト値は `getDefaultActionBarSections()` で取得できる。\n\t */\n\tsections?: ReactNode[];\n\n\t/** カスタムクラス名 */\n\tclassName?: string;\n\n\t/** インラインスタイル */\n\tstyle?: React.CSSProperties;\n}\n\n/**\n * アクションバーコンポーネント。\n *\n * @remarks\n * **Shell** — `sections` 配列でセクションを渡すと区切り線を自動挿入して横並びにレンダリングする。\n *\n * デフォルトの `sections` は `getDefaultActionBarSections()` で取得できる。\n */\nexport const ActionBar = ({\n\tsections = [],\n\tclassName,\n\tstyle,\n}: ActionBarProps) => {\n\treturn (\n\t\t<div\n\t\t\tclassName={`${styles.container}${className ? ` ${className}` : \"\"}`}\n\t\t\tstyle={style}\n\t\t\tdata-testid=\"action-bar\"\n\t\t>\n\t\t\t{sections.map((section, sectionIndex) => {\n\t\t\t\tconst key =\n\t\t\t\t\tisValidElement(section) && section.key != null\n\t\t\t\t\t\t? section.key\n\t\t\t\t\t\t: `section-${sectionIndex}`;\n\t\t\t\treturn (\n\t\t\t\t\t<Fragment key={key}>\n\t\t\t\t\t\t{sectionIndex > 0 && <ActionBarDivider />}\n\t\t\t\t\t\t<div className={styles.section}>{section}</div>\n\t\t\t\t\t</Fragment>\n\t\t\t\t);\n\t\t\t})}\n\t\t</div>\n\t);\n};\n\nActionBar.displayName = \"ActionBar\";\n","import { forwardRef, memo, useEffect } from \"react\";\n\nimport { BlockLayer } from \"../../canvas/layers\";\nimport { useGridCalc } from \"../../canvas/layers/GridLayer/hooks\";\nimport { NoteMode } from \"../../types/mode\";\nimport { evalHiddenBinding } from \"../../utils/block\";\nimport { DEFAULT_DPI } from \"../../utils/convert\";\nimport { buildPageCss, resolveEffectivePaper } from \"../../utils/print\";\nimport styles from \"./NotePrint.module.css\";\n\nimport type { PluginRegistry } from \"../../plugin/registry\";\nimport type { BindingContext } from \"../../types/context\";\nimport type { Paper } from \"../../types/paper\";\nimport type { PrintSettings } from \"../../types/print\";\nimport type { Book, Page } from \"../../types/schema\";\nimport type { Value } from \"../../types/value\";\n\n/**\n * {@link NotePrint} の props。\n */\nexport interface NotePrintProps {\n\t/** 印刷対象の Book(全ページ縦並べで出力される)。 */\n\tbook: Book;\n\n\t/** 入力コントロールの値マップ(全ページ共通・フラット)。 */\n\tvalues?: Record<string, Value>;\n\n\t/** ブロックプラグインのレジストリ(`createPluginRegistry` で生成)。 */\n\tpluginRegistry: PluginRegistry;\n\n\t/** 印刷時に適用する設定。省略時は `book.paper` の設定をそのまま使用する。 */\n\tprintSettings?: PrintSettings;\n\n\t/** ルート要素に追加する className。 */\n\tclassName?: string;\n\n\t/** ルート要素に適用する style。 */\n\tstyle?: React.CSSProperties;\n}\n\n// ----- 1ページ分の印刷レンダリング -----\n\n// PrintPage コンポーネントへの props(1ページ分の紙・グリッド情報)\ninterface PrintPageProps {\n\tpage: Page;\n\tpaper: Paper;\n\tvalues?: Record<string, Value>;\n\tpluginRegistry: PluginRegistry;\n}\n\nconst PrintPage = memo(\n\t({ page, paper, values, pluginRegistry }: PrintPageProps) => {\n\t\tconst { paperPx, getBlockRectPx } = useGridCalc(\n\t\t\tpaper,\n\t\t\tpage.grid,\n\t\t\tDEFAULT_DPI,\n\t\t);\n\n\t\tconst bindingContext: BindingContext | undefined = values\n\t\t\t? { get: (path) => values[path] ?? null, set: () => {} }\n\t\t\t: undefined;\n\n\t\tconst visibleBlocks = page.blocks.filter(\n\t\t\t(block) => !evalHiddenBinding(block.hiddenBinding, bindingContext),\n\t\t);\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tstyle={{\n\t\t\t\t\tposition: \"relative\",\n\t\t\t\t\twidth: `${paperPx.canvas.width}px`,\n\t\t\t\t\theight: `${paperPx.canvas.height}px`,\n\t\t\t\t\tbackgroundColor: \"#fff\",\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<BlockLayer\n\t\t\t\t\tblocks={visibleBlocks}\n\t\t\t\t\tpluginRegistry={pluginRegistry}\n\t\t\t\t\tmode={NoteMode.VIEW}\n\t\t\t\t\tvalues={values ?? {}}\n\t\t\t\t\tblockDefaults={page.blockDefaults}\n\t\t\t\t\tgetBlockRectPx={getBlockRectPx}\n\t\t\t\t\tshowGuides={false}\n\t\t\t\t\tshowBorder={true}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t);\n\t},\n);\n\nPrintPage.displayName = \"PrintPage\";\n\n// ----- NotePrint 本体 -----\n\nconst NotePrintBase = forwardRef<HTMLDivElement, NotePrintProps>(\n\t({ book, values, pluginRegistry, printSettings, className, style }, ref) => {\n\t\t// printSettings によるオーバーライドを反映した実効用紙設定\n\t\tconst effectivePaper = resolveEffectivePaper(book, printSettings);\n\n\t\t// @page CSS を文字列として事前計算することで、useEffect の deps を string 比較にする。\n\t\t// オブジェクト参照(effectivePaper)を deps に含めると resolveEffectivePaper が\n\t\t// 毎 render で新規オブジェクトを返すため、values 変更だけで DOM 操作が走ってしまう。\n\t\tconst pageStyleContent = buildPageCss(\n\t\t\teffectivePaper,\n\t\t\tprintSettings?.margin,\n\t\t);\n\n\t\t// ブック全体の用紙サイズで @page を設定\n\t\tuseEffect(() => {\n\t\t\tdocument.getElementById(\"printable-note-page-style\")?.remove();\n\t\t\tdocument.getElementById(\"tatamicks-book-page-style\")?.remove();\n\n\t\t\tconst pageStyle = document.createElement(\"style\");\n\t\t\tpageStyle.id = \"printable-note-page-style\";\n\t\t\tpageStyle.textContent = pageStyleContent;\n\t\t\tdocument.head.appendChild(pageStyle);\n\n\t\t\tconst pageStyleLegacy = document.createElement(\"style\");\n\t\t\tpageStyleLegacy.id = \"tatamicks-book-page-style\";\n\t\t\tpageStyleLegacy.textContent = pageStyleContent;\n\t\t\tdocument.head.appendChild(pageStyleLegacy);\n\n\t\t\treturn () => {\n\t\t\t\tdocument.getElementById(\"printable-note-page-style\")?.remove();\n\t\t\t\tdocument.getElementById(\"tatamicks-book-page-style\")?.remove();\n\t\t\t};\n\t\t}, [pageStyleContent]);\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\tclassName={[styles.printContainer, className].filter(Boolean).join(\" \")}\n\t\t\t\tstyle={style}\n\t\t\t>\n\t\t\t\t{book.pages.map((page, index) => {\n\t\t\t\t\tconst pageKey =\n\t\t\t\t\t\tpage.id ??\n\t\t\t\t\t\t(page.blocks.map((b) => b.id).join(\"_\") || `page-${index}`);\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tkey={pageKey}\n\t\t\t\t\t\t\tclassName={\n\t\t\t\t\t\t\t\tindex < book.pages.length - 1 ? styles.pageBreak : undefined\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<PrintPage\n\t\t\t\t\t\t\t\tpage={page}\n\t\t\t\t\t\t\t\tpaper={effectivePaper}\n\t\t\t\t\t\t\t\tvalues={values}\n\t\t\t\t\t\t\t\tpluginRegistry={pluginRegistry}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</div>\n\t\t);\n\t},\n);\n\nNotePrintBase.displayName = \"NotePrint\";\n\n/**\n * Book の全ページを縦並べで印刷するコンポーネント。\n *\n * `page-break-after: always` によりブラウザ印刷時に改ページされる。\n * 単一ページ印刷が必要な場合は 1 ページのみの Book を渡すことで対応できる。\n *\n * @remarks\n * 直接使用するのは独自の印刷 UI を構築する場合のみとすること。\n *\n * 通常は {@link printNote} 関数を使用すること。\n */\nexport const NotePrint = memo(NotePrintBase) as React.ForwardRefExoticComponent<\n\tNotePrintProps & React.RefAttributes<HTMLDivElement>\n>;\n","// iframe に書き出す HTML 内で XSS が発生しないよう特殊文字をエスケープする\nfunction escapeHtml(str: string): string {\n\treturn str\n\t\t.replace(/&/g, \"&\")\n\t\t.replace(/</g, \"<\")\n\t\t.replace(/>/g, \">\")\n\t\t.replace(/\"/g, \""\");\n}\n\n/**\n * 特定の要素だけを印刷する。\n *\n * 対象要素の HTML と現在ページのすべてのスタイルを隠し iframe にコピーし、\n * iframe.contentWindow.print() を呼ぶことで、ページ外の UI(サイドバー等)を\n * 完全に除外した印刷を実現する。window.print() は使用しない。\n */\nexport function printElement(\n\telement: HTMLElement,\n\toptions?: {\n\t\ttitle?: string;\n\t\tonBeforePrint?: () => void;\n\t\tonAfterPrint?: () => void;\n\t},\n): void {\n\tconst title = options?.title ?? document.title;\n\n\t// 隠し iframe を作成(visibility:hidden で表示しつつ画面上は見えない状態)\n\tconst iframe = document.createElement(\"iframe\");\n\tiframe.style.cssText =\n\t\t\"position:fixed;top:0;left:0;width:100%;height:100%;visibility:hidden;z-index:-9999;border:none;\";\n\tdocument.body.appendChild(iframe);\n\n\tconst iframeWin = iframe.contentWindow;\n\tconst iframeDoc = iframe.contentDocument ?? iframeWin?.document;\n\tif (!iframeDoc || !iframeWin) {\n\t\tdocument.body.removeChild(iframe);\n\t\treturn;\n\t}\n\n\t// 現在ページの全 <style> タグを収集(CSS Modules の生成スタイル・@page ルールを含む)\n\tconst styleHTML = Array.from(document.querySelectorAll(\"style\"))\n\t\t.map((s) => s.outerHTML)\n\t\t.join(\"\\n\");\n\n\t// <link rel=\"stylesheet\"> も収集(本番ビルド時の外部 CSS ファイル)\n\tconst linkHTML = Array.from(\n\t\tdocument.querySelectorAll('link[rel=\"stylesheet\"]'),\n\t)\n\t\t.map((l) => l.outerHTML)\n\t\t.join(\"\\n\");\n\n\t// element の中身(innerHTML)を使い、printOnly ラッパー(display:none)を除外する\n\tconst contentHTML = element.innerHTML;\n\n\tiframeDoc.open();\n\tiframeDoc.write(\n\t\t`<!DOCTYPE html><html><head><meta charset=\"utf-8\" /><title>${escapeHtml(title)}</title>${linkHTML}${styleHTML}<style>*{-webkit-print-color-adjust:exact!important;print-color-adjust:exact!important;}</style></head><body>${contentHTML}</body></html>`,\n\t);\n\tiframeDoc.close();\n\n\tconst cleanup = () => {\n\t\tif (document.body.contains(iframe)) {\n\t\t\tdocument.body.removeChild(iframe);\n\t\t}\n\t};\n\n\tiframeWin.addEventListener(\"afterprint\", () => {\n\t\toptions?.onAfterPrint?.();\n\t\tcleanup();\n\t});\n\n\toptions?.onBeforePrint?.();\n\n\t// スタイルの適用を待ってから印刷ダイアログを開く\n\tsetTimeout(() => {\n\t\tiframeWin.focus();\n\t\tiframeWin.print();\n\t}, 0);\n}\n","import { createElement } from \"react\";\nimport { flushSync } from \"react-dom\";\nimport { createRoot } from \"react-dom/client\";\n\nimport { NotePrint } from \"../../note/NotePrint\";\nimport { printElement } from \"./printElement\";\n\nimport type { NoteContext } from \"../../contexts/useNoteContext\";\nimport type { PluginRegistry } from \"../../plugin/registry\";\nimport type { PrintSettings } from \"../../types/print\";\nimport type { Book } from \"../../types/schema\";\nimport type { Value } from \"../../types/value\";\n\n/**\n * ブックの内容を印刷する内部実装。\n *\n * `NoteView` のスタンドアロン利用(context なし)向けに値解決済みの引数を受け取る。\n */\nexport function printNoteRaw(\n\tbook: Book,\n\tvalues: Record<string, Value>,\n\tpluginRegistry: PluginRegistry,\n\tprintSettings?: PrintSettings,\n): void {\n\tconst container = document.createElement(\"div\");\n\tcontainer.style.cssText = \"position:absolute;top:-9999px;left:-9999px;\";\n\tdocument.body.appendChild(container);\n\tconst root = createRoot(container);\n\tflushSync(() => {\n\t\troot.render(\n\t\t\tcreateElement(NotePrint, { book, values, pluginRegistry, printSettings }),\n\t\t);\n\t});\n\tprintElement(container);\n\troot.unmount();\n\tdocument.body.removeChild(container);\n}\n\n/**\n * ブックの内容を印刷する。\n *\n * `useNoteContext` が返す `context` を渡すだけで、book・values・pluginRegistry を自動で解決して印刷する。\n *\n * @example\n * ```ts\n * // 印刷ボタンなどから直接呼ぶだけでよい\n * printNote(context);\n * ```\n */\nexport function printNote(\n\tcontext: NoteContext,\n\tprintSettings?: PrintSettings,\n): void {\n\tprintNoteRaw(\n\t\tcontext.book,\n\t\tcontext.values,\n\t\tcontext.pluginRegistry,\n\t\tprintSettings,\n\t);\n}\n","import {\n\tAddPageIcon,\n\tChevronLeftIcon,\n\tChevronRightIcon,\n\tDeletePageIcon,\n} from \"../../../components/icons\";\nimport { IconActionButton } from \"../../ui\";\nimport styles from \"./ActionBar.module.css\";\n\n/**\n * `PageNavigationSection` コンポーネントへの props。\n */\nexport interface PageNavigationSectionProps {\n\t/** 現在のページインデックス(0 始まり) */\n\tpageIdx: number;\n\n\t/** 総ページ数 */\n\tpageCount: number;\n\n\t/** ページ移動時のコールバック */\n\tonPageChange: (idx: number) => void;\n\n\t/** ページ追加のコールバック */\n\tonAddPage?: () => void;\n\n\t/** ページ削除のコールバック。省略時は削除ボタンを非表示 */\n\tonDeletePage?: () => void;\n\n\t/** `true` のときページ削除を無効化(1 ページのみのときなど) */\n\tcanDeletePage?: boolean;\n}\n\n/**\n * `ActionBar` 上にページ前後移動・追加・削除ボタンとページ番号表示を提供するセクション。\n *\n * @remarks\n * `ActionBar` のページナビゲーションセクション。\n */\nexport const PageNavigationSection = ({\n\tpageIdx,\n\tpageCount,\n\tonPageChange,\n\tonAddPage,\n\tonDeletePage,\n\tcanDeletePage = true,\n}: PageNavigationSectionProps) => {\n\treturn (\n\t\t<>\n\t\t\t<IconActionButton\n\t\t\t\ticon={<ChevronLeftIcon aria-hidden=\"true\" />}\n\t\t\t\tlabel=\"前のページへ\"\n\t\t\t\ttitle=\"前のページへ\"\n\t\t\t\tonClick={() => onPageChange(Math.max(0, pageIdx - 1))}\n\t\t\t\tdisabled={pageIdx === 0}\n\t\t\t\tpreventFocusOnMouseDown\n\t\t\t/>\n\t\t\t<span className={styles.sectionLabel}>\n\t\t\t\t{pageIdx + 1} / {pageCount}\n\t\t\t</span>\n\t\t\t<IconActionButton\n\t\t\t\ticon={<ChevronRightIcon aria-hidden=\"true\" />}\n\t\t\t\tlabel=\"次のページへ\"\n\t\t\t\ttitle=\"次のページへ\"\n\t\t\t\tonClick={() => onPageChange(Math.min(pageCount - 1, pageIdx + 1))}\n\t\t\t\tdisabled={pageIdx >= pageCount - 1}\n\t\t\t\tpreventFocusOnMouseDown\n\t\t\t/>\n\t\t\t{onAddPage !== undefined && (\n\t\t\t\t<IconActionButton\n\t\t\t\t\ticon={<AddPageIcon aria-hidden=\"true\" />}\n\t\t\t\t\tlabel=\"ページを追加\"\n\t\t\t\t\ttitle=\"ページを追加\"\n\t\t\t\t\tonClick={onAddPage}\n\t\t\t\t\tpreventFocusOnMouseDown\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t{onDeletePage !== undefined && (\n\t\t\t\t<IconActionButton\n\t\t\t\t\ticon={<DeletePageIcon aria-hidden=\"true\" />}\n\t\t\t\t\tlabel=\"ページを削除\"\n\t\t\t\t\ttitle=\"ページを削除\"\n\t\t\t\t\tonClick={onDeletePage}\n\t\t\t\t\tdisabled={!canDeletePage}\n\t\t\t\t\tpreventFocusOnMouseDown\n\t\t\t\t/>\n\t\t\t)}\n\t\t</>\n\t);\n};\n\nPageNavigationSection.displayName = \"PageNavigationSection\";\n","import { printNote } from \"../../../utils/print/printNote\";\nimport { CanvasActionSection } from \"./CanvasActionSection\";\nimport { GridSettingsSection } from \"./GridSettingsSection\";\nimport { PageNavigationSection } from \"./PageNavigationSection\";\nimport { PaperSettingsSection } from \"./PaperSettingsSection\";\n\nimport type { ReactNode } from \"react\";\nimport type { NoteContext } from \"../../../contexts/useNoteContext\";\nimport type { ActionFeedback } from \"../../actionFeedback\";\n\n/**\n * `getDefaultActionBarSections` のオプション。\n *\n * @remarks\n * `getDefaultActionBarSections` に渡す引数の型。\n */\nexport interface GetDefaultActionBarSectionsOptions {\n\t/** `useNoteContext` が返すコンテキスト */\n\tcontext: NoteContext;\n\n\t/** アクション実行時のフィードバック(トースト表示など) */\n\tonActionFeedback?: (feedback: ActionFeedback) => void;\n\n\t/**\n\t * 印刷ボタン押下時のコールバック。\n\t * 省略時は `printNote(context)` を呼び出してNote内容のみを印刷する。\n\t * PDF生成など独自の印刷処理を行う場合に上書きする。\n\t */\n\tonPrint?: () => void;\n}\n\n/**\n * `ActionBar` に渡すデフォルト `sections` 配列を返す。\n *\n * @remarks\n * 各要素には `key` が付いているため `filter`/`map` で操作できる。\n *\n * パフォーマンスを要する場合は呼び出し側で `useMemo` を使うこと。\n *\n * @example\n * ```tsx\n * // デフォルトをそのまま使う\n * const sections = useMemo(\n * () => getDefaultActionBarSections({ context }),\n * [context],\n * );\n * <ActionBar sections={sections} />\n *\n * // カスタムセクションを末尾に追加\n * <ActionBar sections={[...sections, <MySection key=\"custom\" />]} />\n * ```\n */\nexport function getDefaultActionBarSections({\n\tcontext,\n\tonActionFeedback,\n\tonPrint,\n}: GetDefaultActionBarSectionsOptions): ReactNode[] {\n\tconst { actionContext } = context;\n\tconst { book, onBookChange } = context;\n\tconst editorState = context.editorState;\n\n\tconst pageIdx = editorState.pageIdx;\n\n\tconst page = book.pages[pageIdx] ?? book.pages[0];\n\n\tconst sections: ReactNode[] = [\n\t\t<CanvasActionSection\n\t\t\tkey=\"canvas\"\n\t\t\tactionContext={actionContext}\n\t\t\tonActionFeedback={onActionFeedback}\n\t\t\tonPrint={onPrint ?? (() => printNote(context))}\n\t\t/>,\n\t\t<PaperSettingsSection\n\t\t\tkey=\"paper\"\n\t\t\tpaper={book.paper}\n\t\t\tonPaperChange={(paper) => onBookChange({ ...book, paper })}\n\t\t/>,\n\t\t<GridSettingsSection\n\t\t\tkey=\"grid\"\n\t\t\tgrid={page.grid}\n\t\t\tonGridChange={(grid) => {\n\t\t\t\tconst newPages = book.pages.map((p, i) =>\n\t\t\t\t\ti === pageIdx ? { ...p, grid } : p,\n\t\t\t\t) as typeof book.pages;\n\t\t\t\tonBookChange({ ...book, pages: newPages });\n\t\t\t}}\n\t\t/>,\n\t];\n\n\tsections.push(\n\t\t<PageNavigationSection\n\t\t\tkey=\"page-nav\"\n\t\t\tpageIdx={pageIdx}\n\t\t\tpageCount={book.pages.length}\n\t\t\tonPageChange={(idx) => actionContext.execute(\"goToPage\", idx)}\n\t\t\tonAddPage={() => actionContext.execute(\"addPage\")}\n\t\t\tonDeletePage={() => actionContext.execute(\"deletePage\")}\n\t\t\tcanDeletePage={book.pages.length > 1}\n\t\t/>,\n\t);\n\n\treturn sections;\n}\n","import { useMemo, useRef } from \"react\";\n\nimport { getDefaultSelectionActionBarItems } from \"./getDefaultSelectionActionBarItems\";\nimport { SelectionActionBar } from \"./SelectionActionBar\";\nimport { SelectionActionBarOverlay } from \"./SelectionActionBarOverlay\";\nimport { useSelectionBounds } from \"./useSelectionBounds\";\n\nimport type { NoteContext } from \"../../../contexts/useNoteContext\";\nimport type { ActionFeedback } from \"../../actionFeedback\";\n\n/**\n * `DefaultSelectionActionBarOverlay` コンポーネントへの props。\n */\nexport interface DefaultSelectionActionBarOverlayProps {\n\t/** NoteContext(`useNoteContext` が返すコンテキスト) */\n\tcontext: NoteContext;\n\n\t/** グリッドサイズ(レイアウトパネルに使用) */\n\tgridSize?: { cols: number; rows: number };\n\n\t/** ドラッグ中のとき `true` を渡すと非表示になる */\n\tisDragging?: boolean;\n\n\t/** z-index(デフォルト: `Z_INDEX.SELECTION_ACTION_BAR`) */\n\tzIndex?: number;\n\n\t/** アクション実行時のフィードバック */\n\tonActionFeedback?: (feedback: ActionFeedback) => void;\n}\n\n/**\n * `getDefaultSelectionActionBarItems` + `SelectionActionBar` をキャンバス上に浮かせて表示するオーバーレイ。\n *\n * @remarks\n * `position: relative` なコンテナ内で選択ブロック群の右上コーナーに `SelectionActionBar` を浮かせる。\n *\n * @example\n * ```tsx\n * <div style={{ position: \"relative\" }}>\n * <NoteForm ... />\n * <DefaultSelectionActionBarOverlay context={context} />\n * </div>\n * ```\n */\nexport const DefaultSelectionActionBarOverlay = ({\n\tcontext,\n\tgridSize,\n\tisDragging,\n\tzIndex,\n\tonActionFeedback,\n}: DefaultSelectionActionBarOverlayProps) => {\n\tconst { book, containerRef } = context;\n\tconst editorState = context.editorState;\n\tconst fallbackRef = useRef<HTMLElement>(null);\n\n\tconst selectedBlockIds = editorState.selectedBlockIds ?? [];\n\n\t// book 内に存在する選択 ID のみに絞り込む。\n\t// book が変化した(ブロック移動など)場合も新参照を生成して useSelectionBounds の再計測をトリガーする。\n\tconst selectionSnapshot = useMemo(() => {\n\t\tconst validIds = new Set(\n\t\t\tbook.pages.flatMap((p) => p.blocks.map((b) => b.id)),\n\t\t);\n\t\treturn selectedBlockIds.filter((id: string) => validIds.has(id));\n\t}, [selectedBlockIds, book]);\n\n\tconst selectionBoundingBox =\n\t\tuseSelectionBounds(containerRef ?? fallbackRef, selectionSnapshot) ?? null;\n\n\treturn (\n\t\t<SelectionActionBarOverlay\n\t\t\tselectionBoundingBox={selectionBoundingBox}\n\t\t\tisDragging={isDragging}\n\t\t\tzIndex={zIndex}\n\t\t>\n\t\t\t<SelectionActionBar\n\t\t\t\titems={getDefaultSelectionActionBarItems({\n\t\t\t\t\tcontext,\n\t\t\t\t\tgridSize,\n\t\t\t\t\tonActionFeedback,\n\t\t\t\t})}\n\t\t\t\tonPointerDown={(e) => e.stopPropagation()}\n\t\t\t/>\n\t\t</SelectionActionBarOverlay>\n\t);\n};\n\nDefaultSelectionActionBarOverlay.displayName =\n\t\"DefaultSelectionActionBarOverlay\";\n","import { DefaultBlockPropertyPanel } from \"../../panels/BlockPropertyPanel/DefaultBlockPropertyPanel\";\nimport { DefaultCanvasPanel } from \"../../panels/CanvasPanel/DefaultCanvasPanel\";\nimport { OtherPanel } from \"../../panels/OtherPanel\";\nimport { PalettePanel } from \"../../panels/PalettePanel\";\n\nimport type { NoteContext } from \"../../../contexts/useNoteContext\";\nimport type { ActionFeedback } from \"../../actionFeedback\";\nimport type { SidebarTab } from \"./Sidebar\";\n\n/**\n * `getDefaultSidebarTabs` のオプション。\n *\n * @remarks\n * `getDefaultSidebarTabs` に渡す引数の型。\n */\nexport interface GetDefaultSidebarTabsOptions {\n\t/** `useNoteContext` が返すコンテキスト */\n\tcontext: NoteContext;\n\n\t/** グリッドサイズ(LayoutPanel で使用) */\n\tgridSize?: { cols: number; rows: number };\n\n\t/** ホバー中のブロック ID 通知 */\n\tonBlockHover?: (id: string | null) => void;\n\n\t/** ドラッグ中のブロック ID 通知 */\n\tonBlockDragChange?: (id: string | null) => void;\n\n\t/** アクション実行時のフィードバック */\n\tonActionFeedback?: (feedback: ActionFeedback) => void;\n}\n\n/**\n * `Sidebar` に渡すデフォルト tabs 配列(ブロック / キャンバス / その他)を返す。\n *\n * @remarks\n * パフォーマンスを要する場合は呼び出し側で `useMemo` を使うこと。\n *\n * @example\n * ```tsx\n * // デフォルトをそのまま使う\n * const tabs = useMemo(\n * () => getDefaultSidebarTabs({ context }),\n * [context],\n * );\n * <Sidebar tabs={tabs} />\n *\n * // カスタムタブを末尾に追加\n * <Sidebar tabs={[...tabs, { value: \"custom\", label: \"カスタム\", content: <MyPanel /> }]} />\n *\n * // 特定タブを除外\n * <Sidebar tabs={tabs.filter((t) => t.value !== \"other\")} />\n * ```\n */\nexport function getDefaultSidebarTabs({\n\tcontext,\n\tgridSize,\n\tonBlockHover,\n\tonBlockDragChange,\n\tonActionFeedback,\n}: GetDefaultSidebarTabsOptions): SidebarTab[] {\n\tconst editorState = context.editorState;\n\tconst selectedBlockIds = editorState.selectedBlockIds ?? [];\n\n\tconst hasSelection = selectedBlockIds.length > 0;\n\n\treturn [\n\t\t{\n\t\t\tvalue: \"block\",\n\t\t\tlabel: \"ブロック\",\n\t\t\tcontent: hasSelection ? (\n\t\t\t\t<DefaultBlockPropertyPanel context={context} gridSize={gridSize} />\n\t\t\t) : (\n\t\t\t\t<PalettePanel context={context} />\n\t\t\t),\n\t\t},\n\t\t{\n\t\t\tvalue: \"canvas\",\n\t\t\tlabel: \"キャンバス\",\n\t\t\tcontent: (\n\t\t\t\t<DefaultCanvasPanel\n\t\t\t\t\tcontext={context}\n\t\t\t\t\tonBlockHover={onBlockHover}\n\t\t\t\t\tonBlockDragChange={onBlockDragChange}\n\t\t\t\t\tonActionFeedback={onActionFeedback}\n\t\t\t\t/>\n\t\t\t),\n\t\t},\n\t\t{\n\t\t\tvalue: \"other\",\n\t\t\tlabel: \"その他\",\n\t\t\tcontent: <OtherPanel context={context} />,\n\t\t},\n\t];\n}\n","import { Tabs, TabsContent, TabsList, TabsTrigger } from \"../../ui\";\nimport styles from \"./Sidebar.module.css\";\nimport { SIDEBAR_PORTAL_PROPS } from \"./sidebarPortal\";\n\nimport type { ReactNode } from \"react\";\n\n/**\n * サイドバーのタブ定義オブジェクト。\n */\nexport interface SidebarTab {\n\t/** タブの value(一意な文字列) */\n\tvalue: string;\n\n\t/** タブヘッダーに表示するラベル */\n\tlabel: ReactNode;\n\n\t/** タブのコンテンツ */\n\tcontent: ReactNode;\n}\n\n/**\n * サイドバーコンポーネントへの props。\n */\nexport interface SidebarProps {\n\t/** タブ定義(必須) */\n\ttabs: SidebarTab[];\n\n\t/** デフォルトで選択されるタブの value。未指定時は最初のタブ */\n\tdefaultTab?: string;\n\n\t/** カスタムクラス名 */\n\tclassName?: string;\n}\n\n/**\n * サイドバーコンポーネント。\n *\n * @remarks\n * **Shell** — タブシェルのみを提供する純粹なコンテナ。\n *\n * タブの内容は `getDefaultSidebarTabs()` で生成してください。\n */\nexport const Sidebar = ({ tabs, defaultTab, className }: SidebarProps) => {\n\tconst activeDefaultTab = defaultTab ?? tabs[0]?.value ?? \"\";\n\n\treturn (\n\t\t<div\n\t\t\tclassName={`${styles.container} ${className || \"\"}`}\n\t\t\t{...SIDEBAR_PORTAL_PROPS}\n\t\t>\n\t\t\t<Tabs defaultValue={activeDefaultTab} variant=\"default\">\n\t\t\t\t<TabsList className={styles.tabHeader}>\n\t\t\t\t\t{tabs.map((tab) => (\n\t\t\t\t\t\t<TabsTrigger key={tab.value} value={tab.value}>\n\t\t\t\t\t\t\t{tab.label}\n\t\t\t\t\t\t</TabsTrigger>\n\t\t\t\t\t))}\n\t\t\t\t</TabsList>\n\t\t\t\t{tabs.map((tab) => (\n\t\t\t\t\t<TabsContent\n\t\t\t\t\t\tkey={tab.value}\n\t\t\t\t\t\tvalue={tab.value}\n\t\t\t\t\t\tclassName={styles.tabContent}\n\t\t\t\t\t>\n\t\t\t\t\t\t{tab.content}\n\t\t\t\t\t</TabsContent>\n\t\t\t\t))}\n\t\t\t</Tabs>\n\t\t</div>\n\t);\n};\n\nSidebar.displayName = \"Sidebar\";\n","import { useMemo, useRef, useState } from \"react\";\n\nimport { Note } from \"../../note/Note\";\nimport { createPluginRegistry } from \"../../plugin/registry\";\nimport { NoteMode } from \"../../types/mode\";\nimport { SIDEBAR_PORTAL_PROPS } from \"../bars/Sidebar/sidebarPortal\";\n\nimport type React from \"react\";\nimport type { WidgetDef } from \"../../canvas/widgets\";\nimport type { NoteContext } from \"../../contexts/useNoteContext\";\nimport type { BindingContext, EditorState } from \"../../types/context\";\n\n/**\n * `FloatingWidget` コンポーネントへの props。\n */\nexport interface FloatingWidgetProps {\n\t/** タイトルバーに表示するラベル */\n\tlabel: string;\n\n\t/** 表示するウィジェット(必要なプラグインを内包した {@link WidgetDef}) */\n\twidget: WidgetDef;\n\n\t/** `widget.plugins` に追加で使用するプラグイン(省略可) */\n\textraPlugins?: WidgetDef[\"plugins\"];\n\n\t/** フローティング位置(position: fixed の left / top) */\n\tposition: { x: number; y: number };\n\n\t/** `useNoteContext` が返すコンテキスト */\n\tcontext: NoteContext;\n\n\t/** ドラッグ中かどうか(影の強弱・pointer-events の制御に使用) */\n\tisDragging: boolean;\n\n\t/** タイトルバー(ドラッグハンドル)の pointerdown ハンドラ */\n\tonTitlePointerDown: React.PointerEventHandler<HTMLDivElement>;\n\n\t/** ✕ボタンが押されたときのコールバック */\n\tonClose: () => void;\n\n\t/** コンテナ全体の pointerdown ハンドラ(省略可) */\n\tonContainerPointerDown?: () => void;\n\n\t/**\n\t * コンテナの style を上書きする(position, z-index などを変更したい場合に使用)。\n\t *\n\t * デフォルト: `position: \"fixed\"`, z-index: isDragging ? 3750000 : 3700000\n\t */\n\tstyle?: React.CSSProperties;\n}\n\n/** @internal 選択・ページ管理なしのデフォルト EditorState(フローティングウィジェット内部用) */\nconst NOOP_EDITOR_STATE: EditorState = {\n\tselectedBlockIds: [],\n\tpageIdx: 0,\n};\n\n/**\n * キャンバス上にフローティング表示するウィジェットコンポーネント。\n *\n * タイトルバーをドラッグで移動、右下コーナードラッグでズーム(拡縮)できる。\n *\n * `bindingContext` を省略した場合は `widget.book` をローカル state で管理する。\n */\nexport function FloatingWidget({\n\tlabel,\n\twidget,\n\textraPlugins,\n\tposition,\n\tisDragging,\n\tonTitlePointerDown,\n\tonClose,\n\tonContainerPointerDown,\n\tstyle,\n\tcontext,\n}: FloatingWidgetProps) {\n\t// widget.book をベースにしたローカルコンテキスト(bindingContext / actionContext はメイン context から引き継ぐ)\n\tconst pluginRegistry = useMemo(\n\t\t() => createPluginRegistry([...widget.plugins, ...(extraPlugins ?? [])]),\n\t\t[widget.plugins, extraPlugins],\n\t);\n\n\tconst widgetContainerRef = useRef<HTMLDivElement | null>(null);\n\n\t// canvas の book が変わるたびに新しいオブジェクトを生成することで、\n\t// memo 最適化された子コンポーネント(NoteEdit / BlockRenderer)が再描画され、\n\t// NoteBlockPlugin 内部の binding 値(stepper 等)の表示が更新される。\n\tconst widgetBindingContext = useMemo<BindingContext>(\n\t\t() => ({\n\t\t\tget: (path) => {\n\t\t\t\t// context.book をクロージャで参照し、canvas book 変更時にこのオブジェクト参照が\n\t\t\t\t// 変わるようにする(memo の bailout を防ぎ子 Note まで更新を伝播させる)\n\t\t\t\tvoid context.book;\n\t\t\t\treturn context.bindingContext.get(path);\n\t\t\t},\n\t\t\tset: (path, value) => context.bindingContext.set(path, value),\n\t\t}),\n\t\t[context.bindingContext, context.book],\n\t);\n\n\tconst widgetContext = useMemo<NoteContext>(\n\t\t() => ({\n\t\t\tbook: widget.props.book,\n\t\t\tonBookChange: () => {},\n\t\t\tpluginRegistry,\n\t\t\tcontainerRef: widgetContainerRef,\n\t\t\tbindingContext: widgetBindingContext,\n\t\t\tactionContext: context.actionContext,\n\t\t\teditorState: NOOP_EDITOR_STATE,\n\t\t\tvalues: {},\n\t\t}),\n\t\t[\n\t\t\twidget.props.book,\n\t\t\tpluginRegistry,\n\t\t\twidgetBindingContext,\n\t\t\tcontext.actionContext,\n\t\t],\n\t);\n\n\t// 右下コーナードラッグによる zoom 変更\n\tconst [zoom, setZoom] = useState(0.5);\n\tconst resizeStartRef = useRef({ x: 0, zoom: 0.5 });\n\tconst handleResizePointerDown = (e: React.PointerEvent) => {\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\t\tresizeStartRef.current = { x: e.clientX, zoom };\n\t\tconst handleMove = (ev: PointerEvent) => {\n\t\t\tconst dx = ev.clientX - resizeStartRef.current.x;\n\t\t\tsetZoom(\n\t\t\t\tMath.max(0.25, Math.min(2, resizeStartRef.current.zoom + dx / 400)),\n\t\t\t);\n\t\t};\n\t\tconst handleUp = () => {\n\t\t\twindow.removeEventListener(\"pointermove\", handleMove);\n\t\t\twindow.removeEventListener(\"pointerup\", handleUp);\n\t\t};\n\t\twindow.addEventListener(\"pointermove\", handleMove);\n\t\twindow.addEventListener(\"pointerup\", handleUp);\n\t};\n\n\treturn (\n\t\t<div\n\t\t\tonPointerDown={onContainerPointerDown}\n\t\t\t{...SIDEBAR_PORTAL_PROPS}\n\t\t\tstyle={{\n\t\t\t\tposition: \"fixed\",\n\t\t\t\tleft: position.x,\n\t\t\t\ttop: position.y,\n\t\t\t\tzIndex: isDragging ? 3750000 : 3700000,\n\t\t\t\tbackground: \"#fff\",\n\t\t\t\tborder: \"1px solid #d1d5db\",\n\t\t\t\tborderRadius: 6,\n\t\t\t\tboxShadow: isDragging\n\t\t\t\t\t? \"0 8px 24px rgba(0,0,0,0.2)\"\n\t\t\t\t\t: \"0 2px 8px rgba(0,0,0,0.12)\",\n\t\t\t\t...style,\n\t\t\t}}\n\t\t>\n\t\t\t{/* タイトルバー(ドラッグハンドル) */}\n\t\t\t<div\n\t\t\t\tstyle={{\n\t\t\t\t\tdisplay: \"flex\",\n\t\t\t\t\talignItems: \"center\",\n\t\t\t\t\tjustifyContent: \"space-between\",\n\t\t\t\t\tpadding: \"3px 4px 3px 8px\",\n\t\t\t\t\tbackground: \"#f9fafb\",\n\t\t\t\t\tborderBottom: \"1px solid #e5e7eb\",\n\t\t\t\t\tborderRadius: \"6px 6px 0 0\",\n\t\t\t\t\tcursor: \"move\",\n\t\t\t\t\tuserSelect: \"none\",\n\t\t\t\t\tgap: 4,\n\t\t\t\t}}\n\t\t\t\tonPointerDown={onTitlePointerDown}\n\t\t\t>\n\t\t\t\t<span style={{ fontSize: 11, color: \"#555\", whiteSpace: \"nowrap\" }}>\n\t\t\t\t\t{label}\n\t\t\t\t</span>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tonPointerDown={(e) => e.stopPropagation()}\n\t\t\t\t\tonClick={onClose}\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tbackground: \"none\",\n\t\t\t\t\t\tborder: \"none\",\n\t\t\t\t\t\tcursor: \"pointer\",\n\t\t\t\t\t\tfontSize: 12,\n\t\t\t\t\t\tcolor: \"#9ca3af\",\n\t\t\t\t\t\tpadding: \"0 2px\",\n\t\t\t\t\t\tlineHeight: 1,\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t✕\n\t\t\t\t</button>\n\t\t\t</div>\n\n\t\t\t{/* ウィジェット本体(zoom で拡縮) */}\n\t\t\t<div style={{ pointerEvents: isDragging ? \"none\" : \"auto\", zoom }}>\n\t\t\t\t<Note mode={NoteMode.EDIT} context={widgetContext} />\n\t\t\t</div>\n\n\t\t\t{/* リサイズハンドル(右下コーナーをドラッグで zoom 変更) */}\n\t\t\t<div\n\t\t\t\tonPointerDown={handleResizePointerDown}\n\t\t\t\tstyle={{\n\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\tbottom: 0,\n\t\t\t\t\tright: 0,\n\t\t\t\t\twidth: 14,\n\t\t\t\t\theight: 14,\n\t\t\t\t\tcursor: \"se-resize\",\n\t\t\t\t\tbackground: \"linear-gradient(135deg, transparent 50%, #9ca3af 50%)\",\n\t\t\t\t\tborderRadius: \"0 0 6px 0\",\n\t\t\t\t}}\n\t\t\t/>\n\t\t</div>\n\t);\n}\n"],"names":["resolveDefaultProps","plugin","result","prop","createPluginRegistry","plugins","seen","H_ALIGN_MAP","V_ALIGN_MAP","isDefaultDim","d","arrayToSparse","dims","sparse","i","dim","migrateGrid","grid","g","colsArr","rowsArr","sparseCols","sparseRows","migratePadding","props","isIndividual","allVal","migrateAlignment","oldVal","migrateBlockProps","migratePage","page","registry","p","block","b","kind","isLegacyFormSchema","data","isBook","migrateBook","notebook","nb","migrateFormSchemaToBook","schema","source","blocks","migratedPage","migrate","BASE_PLUGINS","CheckboxPlugin","SelectPlugin","TextPlugin","editorInternalReducer","state","action","initialEditorInternalState","useEditorState","book","handleBookChange","dispatch","useReducer","selectedBlockIds","pageIdx","bookRef","useRef","stateRef","handleUpdateBlocks","useCallback","updates","options","pi","currentPage","updatedBlocks","blk","update","setPage","selectedIds","newSelectedIds","id","newId","_a","handleDeleteSelected","ids","deletedIds","newBlocks","handleCopySelected","copied","handleDuplicateSelected","selected","createBlockId","handlePaste","cb","handleAddPage","newPage","insertPage","handleDeletePage","newBook","removePage","actionHandlers","useMemo","v","useNoteContext","initialBook","pluginRegistry","defaultValues","extra","containerRef","historyActionHandlers","useBookHistory","values","setValues","useState","handleValuesChange","changes","prev","value","next","editorState","bindingContextOptions","bindingContext","useBookBindingContext","actionContext","useBookActionContext","BUTTON_ICON_PATHS","BTN_PADDING","btn","iconPath","title","createCanvasActionsWidget","idPrefix","PaperSizePreset","ButtonPlugin","canvasActionsWidget","createClipboardWidget","clipboardWidget","createHistoryWidget","historyWidget","ATOM_PAPER","COMPOUND_PAPER_BASE","blockLayoutWidget","numberInputBlock","StepperPlugin","createPageNavigationWidget","pageCount","currentLabel","totalLabel","pageNavigationWidget","createSelectionDeleteWidget","selectionDeleteWidget","ActionBar","sections","className","style","jsx","styles","section","sectionIndex","key","isValidElement","Fragment","ActionBarDivider","PrintPage","memo","paper","paperPx","getBlockRectPx","useGridCalc","DEFAULT_DPI","path","visibleBlocks","evalHiddenBinding","BlockLayer","NoteMode","NotePrintBase","forwardRef","printSettings","ref","effectivePaper","resolveEffectivePaper","pageStyleContent","buildPageCss","useEffect","_b","pageStyle","pageStyleLegacy","index","pageKey","NotePrint","escapeHtml","str","printElement","element","iframe","iframeWin","iframeDoc","styleHTML","s","linkHTML","l","contentHTML","cleanup","printNoteRaw","container","root","createRoot","flushSync","createElement","printNote","context","PageNavigationSection","onPageChange","onAddPage","onDeletePage","canDeletePage","jsxs","IconActionButton","ChevronLeftIcon","ChevronRightIcon","AddPageIcon","DeletePageIcon","getDefaultActionBarSections","onActionFeedback","onPrint","onBookChange","CanvasActionSection","PaperSettingsSection","GridSettingsSection","newPages","idx","DefaultSelectionActionBarOverlay","gridSize","isDragging","zIndex","fallbackRef","selectionSnapshot","validIds","selectionBoundingBox","useSelectionBounds","SelectionActionBarOverlay","SelectionActionBar","getDefaultSelectionActionBarItems","e","getDefaultSidebarTabs","onBlockHover","onBlockDragChange","DefaultBlockPropertyPanel","PalettePanel","DefaultCanvasPanel","OtherPanel","Sidebar","tabs","defaultTab","activeDefaultTab","SIDEBAR_PORTAL_PROPS","Tabs","TabsList","tab","TabsTrigger","TabsContent","NOOP_EDITOR_STATE","FloatingWidget","label","widget","extraPlugins","position","onTitlePointerDown","onClose","onContainerPointerDown","widgetContainerRef","widgetBindingContext","widgetContext","zoom","setZoom","resizeStartRef","handleResizePointerDown","handleMove","ev","dx","handleUp","Note"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/plugin/registry.ts","../src/canvas/blocks/basePlugins.ts","../src/contexts/editor/useEditorState.ts","../src/contexts/useNoteContext.ts","../src/canvas/blocks/button/iconPaths.ts","../src/canvas/widgets/common/btn.ts","../src/canvas/widgets/canvasActions/canvasActionsWidget.ts","../src/canvas/widgets/clipboard/clipboardWidget.ts","../src/canvas/widgets/history/historyWidget.ts","../src/canvas/widgets/layout/layoutSettingsWidget.ts","../src/canvas/widgets/pageNavigation/pageNavigationWidget.ts","../src/canvas/widgets/selectionDelete/selectionDeleteWidget.ts","../src/shell/bars/ActionBar/ActionBar.tsx","../src/note/NotePrint/NotePrint.tsx","../src/utils/print/printElement.ts","../src/utils/print/printNote.ts","../src/shell/bars/ActionBar/PageNavigationSection.tsx","../src/shell/bars/ActionBar/getDefaultActionBarSections.tsx","../src/shell/bars/SelectionActionBar/DefaultSelectionActionBarOverlay.tsx","../src/shell/bars/Sidebar/getDefaultSidebarTabs.tsx","../src/shell/bars/Sidebar/Sidebar.tsx","../src/shell/floating/FloatingWidget.tsx"],"sourcesContent":["import type { ForwardRefExoticComponent, RefAttributes } from \"react\";\nimport type { Value } from \"../types\";\nimport type {\n\tBlockPlugin,\n\tBlockPluginMeta,\n\tBlockRef,\n\tPropDef,\n\tRendererProps,\n} from \"./types\";\n\n/**\n * createPluginRegistry が受け付けるプラグイン入力型。\n *\n * @remarks\n * BlockPlugin<P, V> は Renderer / validateValue の引数型が P・V に依存するため、異なるプラグインをそのまま BlockPlugin[] として受け取ることはできない。\n *\n * レジストリ入口では共通メタ情報だけを型付きで受け取り、variance の影響を受けるフィールドは unknown として受けてから ResolvedPlugin 側で型消去する。\n *\n * public export はせず、ユーザーには BlockPlugin と createPluginRegistry だけを見せる。\n *\n * @internal\n */\ntype PluginRegistryInput = Pick<BlockPlugin, \"kind\" | \"meta\" | \"properties\"> & {\n\tRenderer: unknown;\n\tmigrateProps?: unknown;\n\tvalidateProps?: unknown;\n\tvalidateValue?: unknown;\n};\n\n// 各 PropDef の defaultProps を合成してプラグイン全体のデフォルト props オブジェクトを生成する\nfunction resolveDefaultProps(\n\tplugin: Pick<PluginRegistryInput, \"properties\">,\n): Record<string, Value> {\n\tconst result: Record<string, Value> = {};\n\tfor (const prop of plugin.properties) {\n\t\tObject.assign(result, prop.defaultProps);\n\t}\n\treturn result;\n}\n\n// BlockPlugin<P,V>.Renderer を ResolvedPlugin に格納するためにジェネリクスを消去したベース型\ntype BaseRenderer = ForwardRefExoticComponent<\n\tRendererProps<Record<string, Value>, Value> & RefAttributes<BlockRef>\n>;\n\n/**\n * レジストリに登録された解決済みプラグイン。\n *\n * @remarks\n * BlockPlugin<P,V> のジェネリクスを型消去し、Shell/Canvas 層が any なしで扱えるフラットな構造にまとめたもの。\n *\n * Renderer の P/V variance 問題は BaseRenderer 型への単一キャストで解決。\n */\nexport interface ResolvedPlugin {\n\t/** `block.kind` と対応するプラグインの一意識別子 */\n\tkind: string;\n\n\t/** UI 表示・アイコン・デフォルトサイズ等のメタ情報 */\n\tmeta: BlockPluginMeta;\n\n\t/** プロパティパネルに表示するプロパティ定義一覧 */\n\tproperties: PropDef[];\n\n\t/** プラグインの全 `PropDef.defaultProps` を合成した、このブロック種別のデフォルト props */\n\tdefaultProps: Record<string, Value>;\n\n\t/**\n\t * ブロックを描画する Renderer コンポーネント。\n\t *\n\t * BlockPlugin<P,V>.Renderer を格納する際、P/V の variance 問題を回避するためベース型にキャストしている。\n\t *\n\t * 実行時には block.props(解決済み)と value が渡されるため安全。\n\t */\n\tRenderer: BaseRenderer;\n\n\t/** 旧バージョンの props を現バージョンに変換する。`validateProps` の前に呼ばれる */\n\tmigrateProps?: (props: unknown) => Record<string, unknown>;\n\n\t/**\n\t * ストレージから読み込んだ生の `block.props` をサニタイズして型安全な Props に変換する。\n\t *\n\t * 省略時は raw オブジェクトをそのまま使用する。\n\t */\n\tvalidateProps?: (props: unknown) => Record<string, Value>;\n\n\t/**\n\t * 外部 state から読み込んだ生の値をサニタイズする。\n\t *\n\t * `undefined` を返した場合は `block.initValue`、それもなければ raw 値にフォールバックする。\n\t *\n\t * フォールバックを指示する場合にのみ `undefined` を使い、`null` は正当な値として返せる。\n\t *\n\t * 省略時は raw 値をそのまま使用する。\n\t */\n\tvalidateValue?: (\n\t\tvalue: unknown,\n\t\tprops: Record<string, Value>,\n\t) => Value | undefined;\n}\n\n/**\n * `createPluginRegistry` が返す、`block.kind` をキーにしたプラグインレジストリ。\n *\n * 未登録の `kind` は `undefined` になるため、アクセス前に存在確認が必要。\n */\nexport type PluginRegistry = Record<string, ResolvedPlugin | undefined>;\n\n/**\n * プラグインの配列から `kind` をキーとしたレジストリを生成する。\n *\n * 各プラグインの `properties` から `defaultProps` を合成し、`Renderer` をベース型に正規化した `ResolvedPlugin` を返す。\n *\n * @example\n * ```ts\n * const registry = createPluginRegistry([TextPlugin, CheckboxPlugin]);\n * ```\n */\nexport function createPluginRegistry(\n\tplugins: readonly (Pick<BlockPlugin, \"kind\" | \"meta\" | \"properties\"> & {\n\t\t/**\n\t\t * `forwardRef()` で生成した React コンポーネント。\n\t\t *\n\t\t * `ForwardRefExoticComponent<never>` は P=never(⊥型)を使うことでどの P でも代入可。\n\t\t *\n\t\t * 非コンポーネント値(数値等)は型エラーになる。\n\t\t */\n\t\tRenderer: ForwardRefExoticComponent<never>;\n\t\t/**\n\t\t * `never[]` rest 型により、任意の引数型の関数が代入可。\n\t\t *\n\t\t * 非関数値は型エラーになる。\n\t\t */\n\t\tmigrateProps?: (...args: never[]) => unknown;\n\t\t/**\n\t\t * `never[]` rest 型により、任意の引数型の関数が代入可。\n\t\t *\n\t\t * 非関数値は型エラーになる。\n\t\t */\n\t\tvalidateProps?: (...args: never[]) => unknown;\n\t\t/**\n\t\t * `never[]` rest 型により、任意の引数型の関数が代入可。\n\t\t *\n\t\t * 非関数値は型エラーになる。\n\t\t */\n\t\tvalidateValue?: (...args: never[]) => unknown;\n\t})[],\n): PluginRegistry;\nexport function createPluginRegistry(\n\tplugins: readonly PluginRegistryInput[],\n): PluginRegistry {\n\tconst seen = new Set<string>();\n\tfor (const plugin of plugins) {\n\t\tif (seen.has(plugin.kind)) {\n\t\t\tthrow new Error(\n\t\t\t\t`[createPluginRegistry] duplicate plugin kind: \"${plugin.kind}\". Each kind must be registered only once.`,\n\t\t\t);\n\t\t}\n\t\tseen.add(plugin.kind);\n\t}\n\treturn Object.fromEntries(\n\t\tplugins.map((plugin) => {\n\t\t\t// Renderer の P/V variance 問題はここで一度だけ型消去して解決する。\n\t\t\tif (!plugin.Renderer) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`[createPluginRegistry] plugin \"${plugin.kind}\" is missing a Renderer. Ensure you are passing a full BlockPlugin.`,\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn [\n\t\t\t\tplugin.kind,\n\t\t\t\t{\n\t\t\t\t\tkind: plugin.kind,\n\t\t\t\t\tmeta: plugin.meta,\n\t\t\t\t\tproperties: plugin.properties,\n\t\t\t\t\tdefaultProps: resolveDefaultProps(plugin),\n\t\t\t\t\tRenderer: plugin.Renderer as BaseRenderer,\n\t\t\t\t\t...(typeof plugin.migrateProps === \"function\"\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tmigrateProps:\n\t\t\t\t\t\t\t\t\tplugin.migrateProps as ResolvedPlugin[\"migrateProps\"],\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: {}),\n\t\t\t\t\t...(typeof plugin.validateProps === \"function\"\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tvalidateProps:\n\t\t\t\t\t\t\t\t\tplugin.validateProps as ResolvedPlugin[\"validateProps\"],\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: {}),\n\t\t\t\t\t...(typeof plugin.validateValue === \"function\"\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tvalidateValue:\n\t\t\t\t\t\t\t\t\tplugin.validateValue as ResolvedPlugin[\"validateValue\"],\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: {}),\n\t\t\t\t} satisfies ResolvedPlugin,\n\t\t\t];\n\t\t}),\n\t);\n}\n","import { CheckboxPlugin } from \"./checkbox/plugin\";\nimport { SelectPlugin } from \"./select/plugin\";\nimport { TextPlugin } from \"./text/plugin\";\n\n/**\n * フォーム構築に最低限必要な標準プラグインのリスト。\n *\n * `CheckboxPlugin` / `SelectPlugin` / `TextPlugin` の3つを含む。\n *\n * `createPluginRegistry` にそのまま渡して使用する。\n *\n * @example\n * ```ts\n * import { BASE_PLUGINS, createPluginRegistry } from \"@tatamicks/core\";\n *\n * const pluginRegistry = createPluginRegistry(BASE_PLUGINS);\n * ```\n */\nexport const BASE_PLUGINS = [CheckboxPlugin, SelectPlugin, TextPlugin] as const;\n","import { useCallback, useMemo, useReducer, useRef } from \"react\";\n\nimport { createBlockId } from \"../../utils/block\";\nimport { insertPage, removePage, setPage } from \"../../utils/book\";\n\nimport type { Block } from \"../../types/block\";\nimport type { OnBookChange } from \"../../types/callbacks\";\nimport type { EditorState } from \"../../types/context\";\nimport type { Book } from \"../../types/schema\";\nimport type { ActionHandlers } from \"../action/useBookActionContext\";\n\ntype EditorInternalState = {\n\tselectedBlockIds: string[];\n\tpageIdx: number;\n\tclipboard: Block[];\n};\n\ntype EditorInternalAction =\n\t| { type: \"setSelectedBlockIds\"; ids: string[] }\n\t| { type: \"setPageIdx\"; idx: number }\n\t| { type: \"setClipboard\"; blocks: Block[] };\n\nfunction editorInternalReducer(\n\tstate: EditorInternalState,\n\taction: EditorInternalAction,\n): EditorInternalState {\n\tswitch (action.type) {\n\t\tcase \"setSelectedBlockIds\":\n\t\t\treturn { ...state, selectedBlockIds: action.ids };\n\t\tcase \"setPageIdx\":\n\t\t\treturn { ...state, pageIdx: action.idx };\n\t\tcase \"setClipboard\":\n\t\t\treturn { ...state, clipboard: action.blocks };\n\t}\n}\n\nconst initialEditorInternalState: EditorInternalState = {\n\tselectedBlockIds: [],\n\tpageIdx: 0,\n\tclipboard: [],\n};\n\n/**\n * {@link useEditorState} の入力オプション。\n */\nexport interface UseEditorStateOptions {\n\t/** 編集対象の Book。 */\n\tbook: Book;\n\n\t/** Book 変更時のコールバック。 */\n\thandleBookChange: OnBookChange;\n}\n\n/**\n * {@link useEditorState} の戻り値。\n */\nexport interface UseEditorStateResult {\n\t/** 選択・ページ・クリップボードなど UI 状態をまとめたコンテキスト。 */\n\teditorState: EditorState;\n\n\t/** 選択・ページ更新・コピー等のアクションハンドラー集合。 */\n\tactionHandlers: ActionHandlers;\n\n\t/** 現在選択中のブロック ID 一覧。 */\n\tselectedBlockIds: string[];\n}\n\n/**\n * フルエディター用 UI 状態管理フック。\n *\n * 選択状態・ページ・クリップボードを管理し、\n * 配線済みの `editorState` / `actionHandlers` を返す。\n *\n * @remarks\n * {@link useNoteContext} に渡す中間レイヤー。\n *\n * 外部から直接呼ぶのは、独自のエディター状態層を構築する場合のみとすること。\n */\nexport function useEditorState({\n\tbook,\n\thandleBookChange,\n}: UseEditorStateOptions): UseEditorStateResult {\n\t// ---- UI 状態 -------------------------------------------------------------\n\tconst [state, dispatch] = useReducer(\n\t\teditorInternalReducer,\n\t\tinitialEditorInternalState,\n\t);\n\tconst { selectedBlockIds, pageIdx } = state;\n\n\t// ---- stale closure 回避 ref ---------------------------------------------\n\tconst bookRef = useRef(book);\n\tbookRef.current = book;\n\tconst stateRef = useRef(state);\n\tstateRef.current = state;\n\n\t// ---- ブロック操作ハンドラー -------------------------------------------------\n\tconst handleUpdateBlocks = useCallback(\n\t\t(\n\t\t\tupdates: Record<string, Partial<Block>>,\n\t\t\toptions?: { mergeKey?: string },\n\t\t) => {\n\t\t\tconst b = bookRef.current;\n\t\t\tconst pi = stateRef.current.pageIdx;\n\t\t\tconst currentPage = b.pages[pi];\n\t\t\tif (!currentPage) return;\n\t\t\tconst updatedBlocks = currentPage.blocks.map((blk) => {\n\t\t\t\tconst update = updates[blk.id];\n\t\t\t\treturn update ? { ...blk, ...update } : blk;\n\t\t\t});\n\t\t\thandleBookChange(\n\t\t\t\tsetPage(b, pi, { ...currentPage, blocks: updatedBlocks }),\n\t\t\t\toptions,\n\t\t\t);\n\t\t\t// ブロック ID が変更された場合、selectedBlockIds を新しい ID に追従させる\n\t\t\tconst selectedIds = stateRef.current.selectedBlockIds;\n\t\t\tconst newSelectedIds = selectedIds.map((id) => {\n\t\t\t\tconst newId = updates[id]?.id;\n\t\t\t\treturn typeof newId === \"string\" ? newId : id;\n\t\t\t});\n\t\t\tif (newSelectedIds.some((id, i) => id !== selectedIds[i])) {\n\t\t\t\tdispatch({ type: \"setSelectedBlockIds\", ids: newSelectedIds });\n\t\t\t}\n\t\t},\n\t\t[handleBookChange],\n\t);\n\n\tconst handleDeleteSelected = useCallback(\n\t\t(ids: string[]) => {\n\t\t\tconst b = bookRef.current;\n\t\t\tconst pi = stateRef.current.pageIdx;\n\t\t\tconst currentPage = b.pages[pi];\n\t\t\tif (!currentPage) return;\n\t\t\tconst deletedIds = new Set(ids);\n\t\t\tconst newBlocks = currentPage.blocks.filter(\n\t\t\t\t(blk) => !deletedIds.has(blk.id),\n\t\t\t);\n\t\t\thandleBookChange(setPage(b, pi, { ...currentPage, blocks: newBlocks }));\n\t\t\tdispatch({ type: \"setSelectedBlockIds\", ids: [] });\n\t\t},\n\t\t[handleBookChange],\n\t);\n\n\tconst handleCopySelected = useCallback((ids: string[]) => {\n\t\tconst b = bookRef.current;\n\t\tconst pi = stateRef.current.pageIdx;\n\t\tconst currentPage = b.pages[pi];\n\t\tif (!currentPage) return;\n\t\tconst copied = currentPage.blocks.filter((blk) => ids.includes(blk.id));\n\t\tdispatch({ type: \"setClipboard\", blocks: copied });\n\t}, []);\n\n\tconst handleDuplicateSelected = useCallback(\n\t\t(ids: string[]) => {\n\t\t\tconst b = bookRef.current;\n\t\t\tconst pi = stateRef.current.pageIdx;\n\t\t\tconst currentPage = b.pages[pi];\n\t\t\tif (!currentPage) return;\n\t\t\tconst selected = currentPage.blocks.filter((blk) => ids.includes(blk.id));\n\t\t\tconst grid = currentPage.grid;\n\t\t\tconst newBlocks = selected.map((blk) => ({\n\t\t\t\t...blk,\n\t\t\t\tid: createBlockId(blk.kind),\n\t\t\t\tlayout: {\n\t\t\t\t\t...blk.layout,\n\t\t\t\t\tx: Math.min(blk.layout.x + 1, grid.colCount - blk.layout.w),\n\t\t\t\t\ty: Math.min(blk.layout.y + 1, grid.rowCount - blk.layout.h),\n\t\t\t\t},\n\t\t\t}));\n\t\t\thandleBookChange(\n\t\t\t\tsetPage(b, pi, {\n\t\t\t\t\t...currentPage,\n\t\t\t\t\tblocks: [...currentPage.blocks, ...newBlocks],\n\t\t\t\t}),\n\t\t\t);\n\t\t\tdispatch({\n\t\t\t\ttype: \"setSelectedBlockIds\",\n\t\t\t\tids: newBlocks.map((blk) => blk.id),\n\t\t\t});\n\t\t},\n\t\t[handleBookChange],\n\t);\n\n\tconst handlePaste = useCallback(() => {\n\t\tconst cb = stateRef.current.clipboard;\n\t\tif (cb.length === 0) return;\n\t\tconst b = bookRef.current;\n\t\tconst pi = stateRef.current.pageIdx;\n\t\tconst currentPage = b.pages[pi];\n\t\tif (!currentPage) return;\n\t\tconst grid = currentPage.grid;\n\t\tconst newBlocks = cb.map((blk) => ({\n\t\t\t...blk,\n\t\t\tid: createBlockId(blk.kind),\n\t\t\tlayout: {\n\t\t\t\t...blk.layout,\n\t\t\t\tx: Math.min(blk.layout.x + 1, grid.colCount - blk.layout.w),\n\t\t\t\ty: Math.min(blk.layout.y + 1, grid.rowCount - blk.layout.h),\n\t\t\t},\n\t\t}));\n\t\thandleBookChange(\n\t\t\tsetPage(b, pi, {\n\t\t\t\t...currentPage,\n\t\t\t\tblocks: [...currentPage.blocks, ...newBlocks],\n\t\t\t}),\n\t\t);\n\t\tdispatch({\n\t\t\ttype: \"setSelectedBlockIds\",\n\t\t\tids: newBlocks.map((blk) => blk.id),\n\t\t});\n\t}, [handleBookChange]);\n\n\tconst handleAddPage = useCallback(() => {\n\t\tconst b = bookRef.current;\n\t\tconst pi = stateRef.current.pageIdx;\n\t\tconst currentPage = b.pages[pi];\n\t\tconst newPage = {\n\t\t\tgrid: currentPage\n\t\t\t\t? currentPage.grid\n\t\t\t\t: (b.pages[0]?.grid ?? { colCount: 12, rowCount: 24 }),\n\t\t\tblocks: [],\n\t\t};\n\t\thandleBookChange(insertPage(b, pi, newPage));\n\t\tdispatch({ type: \"setPageIdx\", idx: pi + 1 });\n\t}, [handleBookChange]);\n\n\tconst handleDeletePage = useCallback(() => {\n\t\tconst b = bookRef.current;\n\t\tconst pi = stateRef.current.pageIdx;\n\t\tif (b.pages.length <= 1) return;\n\t\tconst newBook = removePage(b, pi);\n\t\thandleBookChange(newBook);\n\t\tdispatch({\n\t\t\ttype: \"setPageIdx\",\n\t\t\tidx: Math.min(pi, newBook.pages.length - 1),\n\t\t});\n\t}, [handleBookChange]);\n\n\t// ---- actionHandlers(useBookActionContext に渡す)------------------------\n\tconst actionHandlers = useMemo<ActionHandlers>(\n\t\t() => ({\n\t\t\tpaste: {\n\t\t\t\texecute: handlePaste,\n\t\t\t\tisEnabled: () => stateRef.current.clipboard.length > 0,\n\t\t\t},\n\t\t\tdelete: {\n\t\t\t\texecute: () => handleDeleteSelected(stateRef.current.selectedBlockIds),\n\t\t\t\tisEnabled: () => stateRef.current.selectedBlockIds.length > 0,\n\t\t\t},\n\t\t\tcopy: {\n\t\t\t\texecute: () => handleCopySelected(stateRef.current.selectedBlockIds),\n\t\t\t\tisEnabled: () => stateRef.current.selectedBlockIds.length > 0,\n\t\t\t},\n\t\t\tduplicate: {\n\t\t\t\texecute: () =>\n\t\t\t\t\thandleDuplicateSelected(stateRef.current.selectedBlockIds),\n\t\t\t\tisEnabled: () => stateRef.current.selectedBlockIds.length > 0,\n\t\t\t},\n\t\t\taddPage: {\n\t\t\t\texecute: handleAddPage,\n\t\t\t\tisEnabled: () => true,\n\t\t\t},\n\t\t\tdeletePage: {\n\t\t\t\texecute: handleDeletePage,\n\t\t\t\tisEnabled: () => bookRef.current.pages.length > 1,\n\t\t\t},\n\t\t\tselectBlocks: {\n\t\t\t\texecute: (p) =>\n\t\t\t\t\tdispatch({ type: \"setSelectedBlockIds\", ids: p as string[] }),\n\t\t\t\tisEnabled: () => true,\n\t\t\t\tvalidatePayload: (p) =>\n\t\t\t\t\tArray.isArray(p) && p.every((v) => typeof v === \"string\"),\n\t\t\t},\n\t\t\tgoToPage: {\n\t\t\t\texecute: (p) => dispatch({ type: \"setPageIdx\", idx: p as number }),\n\t\t\t\tisEnabled: () => true,\n\t\t\t\tvalidatePayload: (p) => typeof p === \"number\",\n\t\t\t},\n\t\t\tupdateBlocks: {\n\t\t\t\texecute: (p) => {\n\t\t\t\t\tconst { updates, options } = p as {\n\t\t\t\t\t\tupdates: Record<string, Partial<Block>>;\n\t\t\t\t\t\toptions?: { mergeKey?: string };\n\t\t\t\t\t};\n\t\t\t\t\thandleUpdateBlocks(updates, options);\n\t\t\t\t},\n\t\t\t\tisEnabled: () => true,\n\t\t\t\tvalidatePayload: (p) =>\n\t\t\t\t\ttypeof p === \"object\" &&\n\t\t\t\t\tp !== null &&\n\t\t\t\t\t\"updates\" in p &&\n\t\t\t\t\ttypeof (p as Record<string, unknown>).updates === \"object\",\n\t\t\t},\n\t\t}),\n\t\t[\n\t\t\thandlePaste,\n\t\t\thandleDeleteSelected,\n\t\t\thandleCopySelected,\n\t\t\thandleDuplicateSelected,\n\t\t\thandleAddPage,\n\t\t\thandleDeletePage,\n\t\t\thandleUpdateBlocks,\n\t\t],\n\t);\n\n\t// ---- editorState --------------------------------------------------------\n\tconst editorState = useMemo<EditorState>(\n\t\t() => ({\n\t\t\tselectedBlockIds,\n\t\t\tpageIdx,\n\t\t}),\n\t\t[selectedBlockIds, pageIdx],\n\t);\n\n\treturn {\n\t\teditorState,\n\t\tactionHandlers,\n\t\tselectedBlockIds,\n\t};\n}\n","import { useCallback, useMemo, useRef, useState } from \"react\";\n\nimport { useBookActionContext } from \"./action/useBookActionContext\";\nimport {\n\ttype BookBindingContextOptions,\n\tuseBookBindingContext,\n} from \"./binding/useBookBindingContext\";\nimport { useEditorState } from \"./editor/useEditorState\";\nimport { useBookHistory } from \"./history/useBookHistory\";\n\nimport type { RefObject } from \"react\";\nimport type { PluginRegistry } from \"../plugin/registry\";\nimport type {\n\tOnBookChange,\n\tOnValuesChange,\n\tValueChange,\n} from \"../types/callbacks\";\nimport type {\n\tActionContext,\n\tBindingContext,\n\tEditorState,\n} from \"../types/context\";\nimport type { Book } from \"../types/schema\";\nimport type { Value } from \"../types/value\";\n\n/**\n * `useNoteContext` が組み立てるコンテキストオブジェクト。\n *\n * Note / ActionBar / Sidebar / DefaultSelectionActionBarOverlay にそのまま渡して使用する。\n */\nexport interface NoteContext {\n\t/** Book(用紙設定・ページを含む) */\n\tbook: Book;\n\n\t/** Book 変更コールバック */\n\tonBookChange: OnBookChange;\n\n\t/** ブロックプラグインのレジストリ(`createPluginRegistry` で生成) */\n\tpluginRegistry: PluginRegistry;\n\n\t/** Note を包む `position: relative` なコンテナの ref */\n\tcontainerRef: RefObject<HTMLDivElement | null>;\n\n\t/** バインディングパス対応の値読み書きコンテキスト */\n\tbindingContext: BindingContext;\n\n\t/** ブロック挿入・移動・削除などのアクションハンドラコンテキスト */\n\tactionContext: ActionContext;\n\n\t/** 各ブロックの現在の入力値 */\n\tvalues: Record<string, Value>;\n\n\t/** 入力値が変更されたときのコールバック */\n\tonValuesChange?: OnValuesChange;\n\n\t/**\n\t * フルエディター用の UI 状態。\n\t * DefaultSelectionActionBarOverlay / getDefaultActionBarSections / getDefaultSidebarTabs\n\t * はこのフィールドを参照する。\n\t */\n\teditorState: EditorState;\n}\n\n/**\n * {@link useNoteContext} のオプション。\n */\nexport interface UseNoteContextOptions {\n\t/**\n\t * 初期ブックデータ。\n\t *\n\t * **マウント時のみ参照される**(React の `useState` 初期値と同じ挙動)。\n\t * マウント後に値を変えても内部状態には反映されない。\n\t *\n\t * そのため、非同期ロード後にデータを渡す場合は、\n\t * **ロード完了後にコンポーネントをマウントする**こと。\n\t *\n\t * @example\n\t * ```tsx\n\t * // ✅ ロード完了後にマウント\n\t * if (!templateData) return <Loading />;\n\t * return <MyEditor initialBook={templateData} />;\n\t *\n\t * // ✅ ドキュメント切り替え時は key でリマウント\n\t * return <MyEditor key={documentId} initialBook={loadedBook} />;\n\t * ```\n\t */\n\tinitialBook: Book;\n\n\t/** ブロックプラグインのレジストリ(`createPluginRegistry` で生成) */\n\tpluginRegistry: PluginRegistry;\n\n\t/**\n\t * 各ブロックの初期入力値(省略可)。\n\t *\n\t * **マウント時のみ参照される**(React の `useState` 初期値と同じ挙動)。\n\t * マウント後に値が変わっても内部状態には反映されない。\n\t *\n\t * そのため、非同期ロード後にデータを渡す場合は、\n\t * **ロード完了後にコンポーネントをマウントする**こと。\n\t *\n\t * @example\n\t * ```tsx\n\t * // ❌ ダメな例 — フェッチ中は undefined、完了後に変わっても無視される\n\t * const { data: savedValues } = useFetch(\"/api/answers\");\n\t * const { context } = useNoteContext({ initialBook, pluginRegistry, defaultValues: savedValues });\n\t *\n\t * // ✅ ロード完了後にマウント\n\t * const { data: savedValues } = useFetch(\"/api/answers\");\n\t * if (!savedValues) return <Loading />;\n\t * return <MyEditor defaultValues={savedValues} />;\n\t * ```\n\t */\n\tdefaultValues?: Record<string, Value>;\n\n\t/**\n\t * ユーザー定義の追加 BindingContext。\n\t * 組み込みパスより優先して参照される。\n\t * 詳細は {@link BookBindingContextOptions.extra} を参照。\n\t */\n\textra?: BindingContext;\n}\n\n/**\n * {@link useNoteContext} の戻り値。\n */\nexport interface UseNoteContextResult {\n\t/** Note / ActionBar / Sidebar / DefaultSelectionActionBarOverlay に渡す context */\n\tcontext: NoteContext;\n}\n\n/**\n * フルエディター(ActionBar + Note + SelectionActionBarOverlay + Sidebar)向けの Context 統合フック。\n *\n * `useBookHistory` / `useEditorState` / `useBookBindingContext` / `useBookActionContext`\n * を組み合わせ、配線済みの `NoteContext` を返す。\n *\n * @example\n * ```tsx\n * const { context } = useNoteContext({ initialBook, pluginRegistry });\n * const [mode, setMode] = useState<NoteMode>(NoteMode.FORM);\n *\n * <ActionBar sections={getDefaultActionBarSections({ context })} />\n * <div ref={context.containerRef} style={{ position: \"relative\" }}>\n * <Note mode={mode} context={context} />\n * <DefaultSelectionActionBarOverlay context={context} />\n * </div>\n * <Sidebar tabs={getDefaultSidebarTabs({ context })} />\n * ```\n */\nexport function useNoteContext({\n\tinitialBook,\n\tpluginRegistry,\n\tdefaultValues,\n\textra,\n}: UseNoteContextOptions): UseNoteContextResult {\n\tconst containerRef = useRef<HTMLDivElement>(null);\n\n\tconst { book, handleBookChange, historyActionHandlers } = useBookHistory({\n\t\tinitialBook,\n\t});\n\n\tconst [values, setValues] = useState<Record<string, Value>>(\n\t\tdefaultValues ?? {},\n\t);\n\tconst handleValuesChange = useCallback((changes: ValueChange[]) => {\n\t\tif (changes.length === 0) return;\n\t\tsetValues((prev) => {\n\t\t\tconst hasChange = changes.some(({ id, value }) =>\n\t\t\t\tvalue === undefined ? id in prev : prev[id] !== value,\n\t\t\t);\n\t\t\tif (!hasChange) return prev;\n\t\t\tconst next = { ...prev };\n\t\t\tfor (const { id, value } of changes) {\n\t\t\t\tif (value === undefined) delete next[id];\n\t\t\t\telse next[id] = value;\n\t\t\t}\n\t\t\treturn next;\n\t\t});\n\t}, []);\n\n\tconst { editorState, actionHandlers } = useEditorState({\n\t\tbook,\n\t\thandleBookChange,\n\t});\n\n\tconst bindingContextOptions: BookBindingContextOptions = {\n\t\tpageIdx: editorState.pageIdx,\n\t\t...(extra ? { extra } : {}),\n\t};\n\tconst bindingContext = useBookBindingContext(\n\t\tbook,\n\t\thandleBookChange,\n\t\tbindingContextOptions,\n\t);\n\tconst actionContext = useBookActionContext({\n\t\t...historyActionHandlers,\n\t\t...actionHandlers,\n\t});\n\n\tconst context = useMemo<NoteContext>(\n\t\t() => ({\n\t\t\tbook,\n\t\t\tonBookChange: handleBookChange,\n\t\t\tpluginRegistry,\n\t\t\tcontainerRef,\n\t\t\tbindingContext,\n\t\t\tactionContext,\n\t\t\tvalues,\n\t\t\tonValuesChange: handleValuesChange,\n\t\t\teditorState,\n\t\t}),\n\t\t[\n\t\t\tbook,\n\t\t\thandleBookChange,\n\t\t\tpluginRegistry,\n\t\t\tbindingContext,\n\t\t\tactionContext,\n\t\t\tvalues,\n\t\t\thandleValuesChange,\n\t\t\teditorState,\n\t\t],\n\t);\n\n\treturn { context };\n}\n","/**\n * ButtonBlock 用 SVG アイコンパス定数\n *\n * Material Design アイコンの 24×24 viewBox 用パスデータ。\n *\n * Unicode 絵文字・OS フォントに依存せず、あらゆる環境で確実に表示できる。\n *\n * ButtonProps.iconPath に渡して使用する。\n *\n * レンダラーは `<svg viewBox=\"0 0 24 24\"><path d={iconPath} fill=\"currentColor\"/>` で描画する。\n */\nexport const BUTTON_ICON_PATHS = {\n\t/** チェック済みチェックボックス (check_box) */\n\tselectAll:\n\t\t\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-9 14l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z\",\n\n\t/** 空チェックボックス (check_box_outline_blank) */\n\tdeselectAll:\n\t\t\"M19 5v14H5V5h14m0-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z\",\n\n\t/** ゴミ箱 (delete) */\n\tdelete:\n\t\t\"M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z\",\n\n\t/** 二重矩形・コピー (content_copy) */\n\tcopy: \"M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z\",\n\n\t/** クリップボード・ペースト (content_paste) */\n\tpaste:\n\t\t\"M19 2h-4.18C14.4.84 13.3 0 12 0c-1.3 0-2.4.84-2.82 2H5c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-7 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm7 18H5V4h2v3h10V4h2v16z\",\n\n\t/** ページ+プラス・複製 (library_add) */\n\tduplicate:\n\t\t\"M4 6H2v14c0 1.1.9 2 2 2h14v-2H4V6zm16-4H8c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-1 9h-4v4h-2v-4H9V9h4V5h2v4h4v2z\",\n\n\t/** 左向き弧矢印・元に戻す (undo) */\n\tundo: \"M12.5 8c-2.65 0-5.05.99-6.9 2.6L2 7v9h9l-3.62-3.62c1.39-1.16 3.16-1.88 5.12-1.88 3.54 0 6.55 2.31 7.6 5.5l2.37-.78C21.08 11.03 17.15 8 12.5 8z\",\n\n\t/** 右向き弧矢印・やり直し (redo) */\n\tredo: \"M18.4 10.6C16.55 8.99 14.15 8 11.5 8c-4.65 0-8.58 3.03-9.96 7.22L3.9 16c1.05-3.19 4.05-5.5 7.6-5.5 1.95 0 3.73.72 5.12 1.88L13 16h9V7l-3.6 3.6z\",\n\n\t/** 左向き山括弧・前のページ (navigate_before / chevron_left) */\n\tprevPage: \"M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z\",\n\n\t/** 右向き山括弧・次のページ (navigate_next / chevron_right) */\n\tnextPage: \"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\",\n\n\t/** プラス・ページ追加 (add) */\n\taddPage: \"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\",\n\n\t/** マイナス・ページ削除 (remove) */\n\tdeletePage: \"M19 13H5v-2h14v2z\",\n} as const;\n","import type { Value } from \"../../../types\";\n\n/**\n * ウィジェットボタン共通の内側パディング。\n *\n * @remarks カスタムシェル構築専用。\n */\nexport const BTN_PADDING = { value: 2, unit: \"mm\" as const };\n\n/**\n * ウィジェット用ボタン props ヘルパー。\n *\n * @remarks\n * カスタムシェル構築専用。\n *\n * `iconPath`・`action`・オプショナルなトールチップに基づき、`ButtonBlock` 用の props オブジェクトを返す。\n */\nexport function btn(\n\ticonPath: string,\n\taction: string,\n\ttitle?: string,\n): Record<string, Value> {\n\treturn {\n\t\ticonPath,\n\t\tlabel: \"\",\n\t\taction,\n\t\t...(title ? { title } : {}),\n\t\ttop: BTN_PADDING,\n\t\tright: BTN_PADDING,\n\t\tbottom: BTN_PADDING,\n\t\tleft: BTN_PADDING,\n\t};\n}\n","import { PaperSizePreset } from \"../../../types/paper\";\nimport { ButtonPlugin } from \"../../blocks/button\";\nimport { BUTTON_ICON_PATHS } from \"../../blocks/button/iconPaths\";\nimport { btn } from \"../common/btn\";\n\nimport type { WidgetDef } from \"../types\";\n\n/**\n * キャンバス操作ボタン widget を生成するファクトリ関数。\n *\n * @remarks\n * カスタムシェル構築専用。\n *\n * 8 列 × 1 行: [全選択][解除][削除][コピー][貼付][複製][元に戻す][やり直し]\n *\n * `idPrefix` でブロック ID プレフィックスを変更できる。\n */\nexport function createCanvasActionsWidget(\n\tidPrefix = \"canvas-actions\",\n): WidgetDef {\n\treturn {\n\t\tprops: {\n\t\t\tbook: {\n\t\t\t\tpaper: {\n\t\t\t\t\tsize: {\n\t\t\t\t\t\tpreset: PaperSizePreset.CUSTOM,\n\t\t\t\t\t\twidth: { value: 160, unit: \"mm\" },\n\t\t\t\t\t\theight: { value: 20, unit: \"mm\" },\n\t\t\t\t\t},\n\t\t\t\t\tmargin: {\n\t\t\t\t\t\ttop: { value: 0, unit: \"mm\" },\n\t\t\t\t\t\tright: { value: 0, unit: \"mm\" },\n\t\t\t\t\t\tbottom: { value: 0, unit: \"mm\" },\n\t\t\t\t\t\tleft: { value: 0, unit: \"mm\" },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tpages: [\n\t\t\t\t\t{\n\t\t\t\t\t\tgrid: { colCount: 8, rowCount: 1 },\n\t\t\t\t\t\tblocks: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: `${idPrefix}-select-all`,\n\t\t\t\t\t\t\t\tkind: \"button\",\n\t\t\t\t\t\t\t\tlayout: { x: 0, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t\t\tprops: btn(\n\t\t\t\t\t\t\t\t\tBUTTON_ICON_PATHS.selectAll,\n\t\t\t\t\t\t\t\t\t\"select_all\",\n\t\t\t\t\t\t\t\t\t\"すべて選択\",\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: `${idPrefix}-deselect-all`,\n\t\t\t\t\t\t\t\tkind: \"button\",\n\t\t\t\t\t\t\t\tlayout: { x: 1, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t\t\tprops: btn(\n\t\t\t\t\t\t\t\t\tBUTTON_ICON_PATHS.deselectAll,\n\t\t\t\t\t\t\t\t\t\"deselect_all\",\n\t\t\t\t\t\t\t\t\t\"選択を解除\",\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: `${idPrefix}-delete`,\n\t\t\t\t\t\t\t\tkind: \"button\",\n\t\t\t\t\t\t\t\tlayout: { x: 2, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t\t\tprops: btn(\n\t\t\t\t\t\t\t\t\tBUTTON_ICON_PATHS.delete,\n\t\t\t\t\t\t\t\t\t\"delete\",\n\t\t\t\t\t\t\t\t\t\"削除 (Delete / Backspace)\",\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: `${idPrefix}-copy`,\n\t\t\t\t\t\t\t\tkind: \"button\",\n\t\t\t\t\t\t\t\tlayout: { x: 3, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t\t\tprops: btn(\n\t\t\t\t\t\t\t\t\tBUTTON_ICON_PATHS.copy,\n\t\t\t\t\t\t\t\t\t\"copy\",\n\t\t\t\t\t\t\t\t\t\"コピー (Ctrl+C / Cmd+C)\",\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: `${idPrefix}-paste`,\n\t\t\t\t\t\t\t\tkind: \"button\",\n\t\t\t\t\t\t\t\tlayout: { x: 4, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t\t\tprops: btn(\n\t\t\t\t\t\t\t\t\tBUTTON_ICON_PATHS.paste,\n\t\t\t\t\t\t\t\t\t\"paste\",\n\t\t\t\t\t\t\t\t\t\"貼り付け (Ctrl+V / Cmd+V)\",\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: `${idPrefix}-duplicate`,\n\t\t\t\t\t\t\t\tkind: \"button\",\n\t\t\t\t\t\t\t\tlayout: { x: 5, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t\t\tprops: btn(\n\t\t\t\t\t\t\t\t\tBUTTON_ICON_PATHS.duplicate,\n\t\t\t\t\t\t\t\t\t\"duplicate\",\n\t\t\t\t\t\t\t\t\t\"複製 (Ctrl+D / Cmd+D)\",\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: `${idPrefix}-undo`,\n\t\t\t\t\t\t\t\tkind: \"button\",\n\t\t\t\t\t\t\t\tlayout: { x: 6, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t\t\tprops: btn(\n\t\t\t\t\t\t\t\t\tBUTTON_ICON_PATHS.undo,\n\t\t\t\t\t\t\t\t\t\"undo\",\n\t\t\t\t\t\t\t\t\t\"元に戻す (Ctrl+Z / Cmd+Z)\",\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: `${idPrefix}-redo`,\n\t\t\t\t\t\t\t\tkind: \"button\",\n\t\t\t\t\t\t\t\tlayout: { x: 7, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t\t\tprops: btn(\n\t\t\t\t\t\t\t\t\tBUTTON_ICON_PATHS.redo,\n\t\t\t\t\t\t\t\t\t\"redo\",\n\t\t\t\t\t\t\t\t\t\"やり直し (Ctrl+Y / Cmd+Y)\",\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t},\n\t\tplugins: [ButtonPlugin],\n\t};\n}\n\n/**\n * デフォルトのキャンバス操作ボタン widget。\n *\n * @remarks\n * カスタムシェル構築専用。\n *\n * `createCanvasActionsWidget()` と等価。\n */\nexport const canvasActionsWidget: WidgetDef = createCanvasActionsWidget();\n","import { PaperSizePreset } from \"../../../types/paper\";\nimport { ButtonPlugin } from \"../../blocks/button\";\nimport { BUTTON_ICON_PATHS } from \"../../blocks/button/iconPaths\";\nimport { btn } from \"../common/btn\";\n\nimport type { WidgetDef } from \"../types\";\n\n/**\n * クリップボード操作ボタン widget を生成するファクトリ関数。\n *\n * @remarks\n * カスタムシェル構築専用。\n *\n * 3 列 × 1 行: [コピー][貼付][複製]\n *\n * `idPrefix` でブロック ID プレフィックスを変更できる。\n */\nexport function createClipboardWidget(idPrefix = \"clipboard\"): WidgetDef {\n\treturn {\n\t\tprops: {\n\t\t\tbook: {\n\t\t\t\tpaper: {\n\t\t\t\t\tsize: {\n\t\t\t\t\t\tpreset: PaperSizePreset.CUSTOM,\n\t\t\t\t\t\twidth: { value: 60, unit: \"mm\" },\n\t\t\t\t\t\theight: { value: 20, unit: \"mm\" },\n\t\t\t\t\t},\n\t\t\t\t\tmargin: {\n\t\t\t\t\t\ttop: { value: 0, unit: \"mm\" },\n\t\t\t\t\t\tright: { value: 0, unit: \"mm\" },\n\t\t\t\t\t\tbottom: { value: 0, unit: \"mm\" },\n\t\t\t\t\t\tleft: { value: 0, unit: \"mm\" },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tpages: [\n\t\t\t\t\t{\n\t\t\t\t\t\tgrid: { colCount: 3, rowCount: 1 },\n\t\t\t\t\t\tblocks: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: `${idPrefix}-copy`,\n\t\t\t\t\t\t\t\tkind: \"button\",\n\t\t\t\t\t\t\t\tlayout: { x: 0, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t\t\tprops: btn(BUTTON_ICON_PATHS.copy, \"copy\"),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: `${idPrefix}-paste`,\n\t\t\t\t\t\t\t\tkind: \"button\",\n\t\t\t\t\t\t\t\tlayout: { x: 1, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t\t\tprops: btn(BUTTON_ICON_PATHS.paste, \"paste\"),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: `${idPrefix}-duplicate`,\n\t\t\t\t\t\t\t\tkind: \"button\",\n\t\t\t\t\t\t\t\tlayout: { x: 2, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t\t\tprops: btn(BUTTON_ICON_PATHS.duplicate, \"duplicate\"),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t},\n\t\tplugins: [ButtonPlugin],\n\t};\n}\n\n/**\n * デフォルトのクリップボード操作ボタン widget。\n *\n * @remarks\n * カスタムシェル構築専用。\n *\n * `createClipboardWidget()` と等価。\n */\nexport const clipboardWidget: WidgetDef = createClipboardWidget();\n","import { PaperSizePreset } from \"../../../types/paper\";\nimport { ButtonPlugin } from \"../../blocks/button\";\nimport { BUTTON_ICON_PATHS } from \"../../blocks/button/iconPaths\";\nimport { btn } from \"../common/btn\";\n\nimport type { WidgetDef } from \"../types\";\n\n/**\n * 操作履歴(アンドゥ・リドゥ)ボタン widget を生成するファクトリ関数。\n *\n * @remarks\n * カスタムシェル構築専用。\n *\n * 2 列 × 1 行: [元に戻す][やり直し]\n *\n * `idPrefix` でブロック ID プレフィックスを変更できる。\n */\nexport function createHistoryWidget(idPrefix = \"history\"): WidgetDef {\n\treturn {\n\t\tprops: {\n\t\t\tbook: {\n\t\t\t\tpaper: {\n\t\t\t\t\tsize: {\n\t\t\t\t\t\tpreset: PaperSizePreset.CUSTOM,\n\t\t\t\t\t\twidth: { value: 40, unit: \"mm\" },\n\t\t\t\t\t\theight: { value: 20, unit: \"mm\" },\n\t\t\t\t\t},\n\t\t\t\t\tmargin: {\n\t\t\t\t\t\ttop: { value: 0, unit: \"mm\" },\n\t\t\t\t\t\tright: { value: 0, unit: \"mm\" },\n\t\t\t\t\t\tbottom: { value: 0, unit: \"mm\" },\n\t\t\t\t\t\tleft: { value: 0, unit: \"mm\" },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tpages: [\n\t\t\t\t\t{\n\t\t\t\t\t\tgrid: { colCount: 2, rowCount: 1 },\n\t\t\t\t\t\tblocks: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: `${idPrefix}-undo`,\n\t\t\t\t\t\t\t\tkind: \"button\",\n\t\t\t\t\t\t\t\tlayout: { x: 0, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t\t\tprops: btn(BUTTON_ICON_PATHS.undo, \"undo\"),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: `${idPrefix}-redo`,\n\t\t\t\t\t\t\t\tkind: \"button\",\n\t\t\t\t\t\t\t\tlayout: { x: 1, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t\t\tprops: btn(BUTTON_ICON_PATHS.redo, \"redo\"),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t},\n\t\tplugins: [ButtonPlugin],\n\t};\n}\n\n/**\n * デフォルトの履歴操作ボタン widget。\n *\n * @remarks\n * カスタムシェル構築専用。\n *\n * `createHistoryWidget()` と等価。\n */\nexport const historyWidget: WidgetDef = createHistoryWidget();\n","import { PaperSizePreset } from \"../../../types/paper\";\nimport { StepperPlugin } from \"../../blocks/stepper\";\nimport { TextPlugin } from \"../../blocks/text\";\nimport { numberInputBlock } from \"../primitives/numberInputBlock\";\n\nimport type { WidgetDef } from \"../types\";\n\n// blockLayoutWidget のペーパー設定共通値\nconst ATOM_PAPER = {\n\tsize: {\n\t\tpreset: PaperSizePreset.CUSTOM,\n\t\twidth: { value: 60, unit: \"mm\" as const },\n\t\theight: { value: 8, unit: \"mm\" as const },\n\t},\n\tmargin: {\n\t\ttop: { value: 0, unit: \"mm\" as const },\n\t\tright: { value: 0, unit: \"mm\" as const },\n\t\tbottom: { value: 0, unit: \"mm\" as const },\n\t\tleft: { value: 0, unit: \"mm\" as const },\n\t},\n\tautoHeight: true,\n\tautoWidth: true,\n};\n\n// compound widget 用ペーパー共通設定(余白・高さ・ autoFit を ATOM_PAPER と共有)\nconst COMPOUND_PAPER_BASE = {\n\tmargin: ATOM_PAPER.margin,\n\tautoHeight: ATOM_PAPER.autoHeight,\n\tautoWidth: ATOM_PAPER.autoWidth,\n};\n\n/**\n * ブロックレイアウト設定 compound widget。\n *\n * @remarks\n * カスタムシェル構築専用。\n *\n * X / Y / W / H の 4 入力を 1 行フラット構成で横並びにする。\n *\n * 12 列 × 1 行グリッド。\n *\n * 列構成:\n *\n * 0(label X) 1(input X) 2(stepper X・8mm)\n *\n * 3(label Y) 4(input Y) 5(stepper Y・8mm)\n *\n * 6(label W) 7(input W) 8(stepper W・8mm)\n *\n * 9(label H) 10(input H) 11(stepper H・8mm)\n */\nexport const blockLayoutWidget: WidgetDef = {\n\tprops: {\n\t\tbook: {\n\t\t\tpaper: {\n\t\t\t\t...COMPOUND_PAPER_BASE,\n\t\t\t\tsize: {\n\t\t\t\t\tpreset: PaperSizePreset.CUSTOM,\n\t\t\t\t\twidth: { value: 160, unit: \"mm\" as const },\n\t\t\t\t\theight: { value: 8, unit: \"mm\" as const },\n\t\t\t\t},\n\t\t\t},\n\t\t\tpages: [\n\t\t\t\t{\n\t\t\t\t\tgrid: {\n\t\t\t\t\t\tcolCount: 12,\n\t\t\t\t\t\trowCount: 1,\n\t\t\t\t\t\tcols: {\n\t\t\t\t\t\t\t2: { value: 8, unit: \"mm\" as const },\n\t\t\t\t\t\t\t5: { value: 8, unit: \"mm\" as const },\n\t\t\t\t\t\t\t8: { value: 8, unit: \"mm\" as const },\n\t\t\t\t\t\t\t11: { value: 8, unit: \"mm\" as const },\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tblocks: [\n\t\t\t\t\t\t// X\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"layout-x-label\",\n\t\t\t\t\t\t\tkind: \"text\",\n\t\t\t\t\t\t\tlayout: { x: 0, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t\tinitValue: \"X\",\n\t\t\t\t\t\t\tbehavior: { readOnly: true },\n\t\t\t\t\t\t\tprops: { horizontal: \"center\", vertical: \"center\" },\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t...numberInputBlock(\"layout-x-value\", \"layout.x\"),\n\t\t\t\t\t\t\tlayout: { x: 1, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"layout-x-stepper\",\n\t\t\t\t\t\t\tkind: \"stepper\",\n\t\t\t\t\t\t\tlayout: { x: 2, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t\tprops: { binding: \"layout.x\", step: 1, min: 0 },\n\t\t\t\t\t\t},\n\t\t\t\t\t\t// Y\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"layout-y-label\",\n\t\t\t\t\t\t\tkind: \"text\",\n\t\t\t\t\t\t\tlayout: { x: 3, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t\tinitValue: \"Y\",\n\t\t\t\t\t\t\tbehavior: { readOnly: true },\n\t\t\t\t\t\t\tprops: { horizontal: \"center\", vertical: \"center\" },\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t...numberInputBlock(\"layout-y-value\", \"layout.y\"),\n\t\t\t\t\t\t\tlayout: { x: 4, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"layout-y-stepper\",\n\t\t\t\t\t\t\tkind: \"stepper\",\n\t\t\t\t\t\t\tlayout: { x: 5, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t\tprops: { binding: \"layout.y\", step: 1, min: 0 },\n\t\t\t\t\t\t},\n\t\t\t\t\t\t// W\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"layout-w-label\",\n\t\t\t\t\t\t\tkind: \"text\",\n\t\t\t\t\t\t\tlayout: { x: 6, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t\tinitValue: \"W\",\n\t\t\t\t\t\t\tbehavior: { readOnly: true },\n\t\t\t\t\t\t\tprops: { horizontal: \"center\", vertical: \"center\" },\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t...numberInputBlock(\"layout-w-value\", \"layout.w\"),\n\t\t\t\t\t\t\tlayout: { x: 7, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"layout-w-stepper\",\n\t\t\t\t\t\t\tkind: \"stepper\",\n\t\t\t\t\t\t\tlayout: { x: 8, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t\tprops: { binding: \"layout.w\", step: 1, min: 1 },\n\t\t\t\t\t\t},\n\t\t\t\t\t\t// H\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"layout-h-label\",\n\t\t\t\t\t\t\tkind: \"text\",\n\t\t\t\t\t\t\tlayout: { x: 9, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t\tinitValue: \"H\",\n\t\t\t\t\t\t\tbehavior: { readOnly: true },\n\t\t\t\t\t\t\tprops: { horizontal: \"center\", vertical: \"center\" },\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t...numberInputBlock(\"layout-h-value\", \"layout.h\"),\n\t\t\t\t\t\t\tlayout: { x: 10, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"layout-h-stepper\",\n\t\t\t\t\t\t\tkind: \"stepper\",\n\t\t\t\t\t\t\tlayout: { x: 11, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t\tprops: { binding: \"layout.h\", step: 1, min: 1 },\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t},\n\tplugins: [TextPlugin, StepperPlugin],\n};\n","import { PaperSizePreset } from \"../../../types/paper\";\nimport { ButtonPlugin } from \"../../blocks/button\";\nimport { BUTTON_ICON_PATHS } from \"../../blocks/button/iconPaths\";\nimport { TextPlugin } from \"../../blocks/text\";\n\nimport type { WidgetDef } from \"../types\";\n\n/**\n * ページナビゲーション widget を生成するファクトリ関数。\n *\n * @remarks\n * カスタムシェル構築専用。\n *\n * 7 列 × 1 行の NoteBlock プリセット:\n *\n * [prev][current][separator][total][next][add][delete]\n *\n * `pageIdx` と `pageCount` を渡すとインジケーター表示が動的になる。\n *\n * 省略時は「—」が表示される。\n */\nexport function createPageNavigationWidget(options: {\n\tpageIdx?: number;\n\tpageCount?: number;\n}): WidgetDef {\n\tconst { pageIdx, pageCount } = options;\n\tconst currentLabel = pageIdx !== undefined ? String(pageIdx + 1) : \"\\u2014\";\n\tconst totalLabel = pageCount !== undefined ? String(pageCount) : \"\\u2014\";\n\n\treturn {\n\t\tprops: {\n\t\t\tbook: {\n\t\t\t\tpaper: {\n\t\t\t\t\tsize: {\n\t\t\t\t\t\tpreset: PaperSizePreset.CUSTOM,\n\t\t\t\t\t\twidth: { value: 130, unit: \"mm\" },\n\t\t\t\t\t\theight: { value: 20, unit: \"mm\" },\n\t\t\t\t\t},\n\t\t\t\t\tmargin: {\n\t\t\t\t\t\ttop: { value: 0, unit: \"mm\" },\n\t\t\t\t\t\tright: { value: 0, unit: \"mm\" },\n\t\t\t\t\t\tbottom: { value: 0, unit: \"mm\" },\n\t\t\t\t\t\tleft: { value: 0, unit: \"mm\" },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tpages: [\n\t\t\t\t\t{\n\t\t\t\t\t\tgrid: {\n\t\t\t\t\t\t\tcolCount: 7,\n\t\t\t\t\t\t\trowCount: 1,\n\t\t\t\t\t\t\tcols: {\n\t\t\t\t\t\t\t\t2: { value: 10, unit: \"mm\" },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tblocks: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: \"prev-page\",\n\t\t\t\t\t\t\t\tkind: \"button\",\n\t\t\t\t\t\t\t\tlayout: { x: 0, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\t\t\ticonPath: BUTTON_ICON_PATHS.prevPage,\n\t\t\t\t\t\t\t\t\tlabel: \"\",\n\t\t\t\t\t\t\t\t\taction: \"prev_page\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: \"page-current\",\n\t\t\t\t\t\t\t\tkind: \"text\",\n\t\t\t\t\t\t\t\tlayout: { x: 1, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t\t\tbehavior: { readOnly: true },\n\t\t\t\t\t\t\t\tinitValue: currentLabel,\n\t\t\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\t\t\thorizontal: \"right\",\n\t\t\t\t\t\t\t\t\tvertical: \"center\",\n\t\t\t\t\t\t\t\t\tfontSize: { value: 25, unit: \"pt\" as const },\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: \"page-separator\",\n\t\t\t\t\t\t\t\tkind: \"text\",\n\t\t\t\t\t\t\t\tlayout: { x: 2, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t\t\tbehavior: { readOnly: true },\n\t\t\t\t\t\t\t\tinitValue: \"/\",\n\t\t\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\t\t\thorizontal: \"center\",\n\t\t\t\t\t\t\t\t\tvertical: \"center\",\n\t\t\t\t\t\t\t\t\tfontSize: { value: 25, unit: \"pt\" as const },\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: \"page-total\",\n\t\t\t\t\t\t\t\tkind: \"text\",\n\t\t\t\t\t\t\t\tlayout: { x: 3, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t\t\tbehavior: { readOnly: true },\n\t\t\t\t\t\t\t\tinitValue: totalLabel,\n\t\t\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\t\t\thorizontal: \"left\",\n\t\t\t\t\t\t\t\t\tvertical: \"center\",\n\t\t\t\t\t\t\t\t\tfontSize: { value: 25, unit: \"pt\" as const },\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: \"next-page\",\n\t\t\t\t\t\t\t\tkind: \"button\",\n\t\t\t\t\t\t\t\tlayout: { x: 4, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\t\t\ticonPath: BUTTON_ICON_PATHS.nextPage,\n\t\t\t\t\t\t\t\t\tlabel: \"\",\n\t\t\t\t\t\t\t\t\taction: \"next_page\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: \"add-page\",\n\t\t\t\t\t\t\t\tkind: \"button\",\n\t\t\t\t\t\t\t\tlayout: { x: 5, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\t\t\ticonPath: BUTTON_ICON_PATHS.addPage,\n\t\t\t\t\t\t\t\t\tlabel: \"\",\n\t\t\t\t\t\t\t\t\taction: \"add_page\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: \"delete-page\",\n\t\t\t\t\t\t\t\tkind: \"button\",\n\t\t\t\t\t\t\t\tlayout: { x: 6, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\t\t\ticonPath: BUTTON_ICON_PATHS.deletePage,\n\t\t\t\t\t\t\t\t\tlabel: \"\",\n\t\t\t\t\t\t\t\t\taction: \"delete_page\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t},\n\t\tplugins: [ButtonPlugin, TextPlugin],\n\t};\n}\n\n/**\n * デフォルトのページナビゲーション widget(ページ数不明の初期状態)。\n *\n * @remarks\n * カスタムシェル構築専用。\n *\n * `createPageNavigationWidget({})` と等価。\n */\nexport const pageNavigationWidget: WidgetDef = createPageNavigationWidget({});\n","import { PaperSizePreset } from \"../../../types/paper\";\nimport { ButtonPlugin } from \"../../blocks/button\";\nimport { BUTTON_ICON_PATHS } from \"../../blocks/button/iconPaths\";\nimport { btn } from \"../common/btn\";\n\nimport type { WidgetDef } from \"../types\";\n\n/**\n * 選択操作・削除ボタン widget を生成するファクトリ関数。\n *\n * @remarks\n * カスタムシェル構築専用。\n *\n * 3 列 × 1 行: [全選択][選択解除][削除]\n *\n * `idPrefix` でブロック ID プレフィックスを変更できる。\n */\nexport function createSelectionDeleteWidget(idPrefix = \"selection\"): WidgetDef {\n\treturn {\n\t\tprops: {\n\t\t\tbook: {\n\t\t\t\tpaper: {\n\t\t\t\t\tsize: {\n\t\t\t\t\t\tpreset: PaperSizePreset.CUSTOM,\n\t\t\t\t\t\twidth: { value: 60, unit: \"mm\" },\n\t\t\t\t\t\theight: { value: 20, unit: \"mm\" },\n\t\t\t\t\t},\n\t\t\t\t\tmargin: {\n\t\t\t\t\t\ttop: { value: 0, unit: \"mm\" },\n\t\t\t\t\t\tright: { value: 0, unit: \"mm\" },\n\t\t\t\t\t\tbottom: { value: 0, unit: \"mm\" },\n\t\t\t\t\t\tleft: { value: 0, unit: \"mm\" },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tpages: [\n\t\t\t\t\t{\n\t\t\t\t\t\tgrid: { colCount: 3, rowCount: 1 },\n\t\t\t\t\t\tblocks: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: `${idPrefix}-select-all`,\n\t\t\t\t\t\t\t\tkind: \"button\",\n\t\t\t\t\t\t\t\tlayout: { x: 0, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t\t\tprops: btn(BUTTON_ICON_PATHS.selectAll, \"select_all\"),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: `${idPrefix}-deselect-all`,\n\t\t\t\t\t\t\t\tkind: \"button\",\n\t\t\t\t\t\t\t\tlayout: { x: 1, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t\t\tprops: btn(BUTTON_ICON_PATHS.deselectAll, \"deselect_all\"),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: `${idPrefix}-delete`,\n\t\t\t\t\t\t\t\tkind: \"button\",\n\t\t\t\t\t\t\t\tlayout: { x: 2, y: 0, w: 1, h: 1 },\n\t\t\t\t\t\t\t\tprops: btn(BUTTON_ICON_PATHS.delete, \"delete\"),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t},\n\t\tplugins: [ButtonPlugin],\n\t};\n}\n\n/**\n * デフォルトの選択操作・削除ボタン widget。\n *\n * @remarks\n * カスタムシェル構築専用。\n *\n * `createSelectionDeleteWidget()` と等価。\n */\nexport const selectionDeleteWidget: WidgetDef = createSelectionDeleteWidget();\n","import { Fragment, isValidElement } from \"react\";\n\nimport styles from \"./ActionBar.module.css\";\nimport { ActionBarDivider } from \"./ActionBarDivider\";\n\nimport type React from \"react\";\nimport type { ReactNode } from \"react\";\n\n/**\n * アクションバーコンポーネントへの props。\n */\nexport interface ActionBarProps {\n\t/**\n\t * バーに表示するセクションの配列。\n\t *\n\t * 隣接するセクション間には区切り線が自動挿入される。\n\t *\n\t * デフォルト値は `getDefaultActionBarSections()` で取得できる。\n\t */\n\tsections?: ReactNode[];\n\n\t/** カスタムクラス名 */\n\tclassName?: string;\n\n\t/** インラインスタイル */\n\tstyle?: React.CSSProperties;\n}\n\n/**\n * アクションバーコンポーネント。\n *\n * @remarks\n * **Shell** — `sections` 配列でセクションを渡すと区切り線を自動挿入して横並びにレンダリングする。\n *\n * デフォルトの `sections` は `getDefaultActionBarSections()` で取得できる。\n */\nexport const ActionBar = ({\n\tsections = [],\n\tclassName,\n\tstyle,\n}: ActionBarProps) => {\n\treturn (\n\t\t<div\n\t\t\tclassName={`${styles.container}${className ? ` ${className}` : \"\"}`}\n\t\t\tstyle={style}\n\t\t\tdata-testid=\"action-bar\"\n\t\t>\n\t\t\t{sections.map((section, sectionIndex) => {\n\t\t\t\tconst key =\n\t\t\t\t\tisValidElement(section) && section.key != null\n\t\t\t\t\t\t? section.key\n\t\t\t\t\t\t: `section-${sectionIndex}`;\n\t\t\t\treturn (\n\t\t\t\t\t<Fragment key={key}>\n\t\t\t\t\t\t{sectionIndex > 0 && <ActionBarDivider />}\n\t\t\t\t\t\t<div className={styles.section}>{section}</div>\n\t\t\t\t\t</Fragment>\n\t\t\t\t);\n\t\t\t})}\n\t\t</div>\n\t);\n};\n\nActionBar.displayName = \"ActionBar\";\n","import { forwardRef, memo, useEffect } from \"react\";\n\nimport { BlockLayer } from \"../../canvas/layers\";\nimport { useGridCalc } from \"../../canvas/layers/GridLayer/hooks\";\nimport { NoteMode } from \"../../types/mode\";\nimport { evalHiddenBinding } from \"../../utils/block\";\nimport { DEFAULT_DPI } from \"../../utils/convert\";\nimport { buildPageCss, resolveEffectivePaper } from \"../../utils/print\";\nimport styles from \"./NotePrint.module.css\";\n\nimport type { PluginRegistry } from \"../../plugin/registry\";\nimport type { BindingContext } from \"../../types/context\";\nimport type { Paper } from \"../../types/paper\";\nimport type { PrintSettings } from \"../../types/print\";\nimport type { Book, Page } from \"../../types/schema\";\nimport type { Value } from \"../../types/value\";\n\n/**\n * {@link NotePrint} の props。\n */\nexport interface NotePrintProps {\n\t/** 印刷対象の Book(全ページ縦並べで出力される)。 */\n\tbook: Book;\n\n\t/** 入力コントロールの値マップ(全ページ共通・フラット)。 */\n\tvalues?: Record<string, Value>;\n\n\t/** ブロックプラグインのレジストリ(`createPluginRegistry` で生成)。 */\n\tpluginRegistry: PluginRegistry;\n\n\t/** 印刷時に適用する設定。省略時は `book.paper` の設定をそのまま使用する。 */\n\tprintSettings?: PrintSettings;\n\n\t/** ルート要素に追加する className。 */\n\tclassName?: string;\n\n\t/** ルート要素に適用する style。 */\n\tstyle?: React.CSSProperties;\n}\n\n// ----- 1ページ分の印刷レンダリング -----\n\n// PrintPage コンポーネントへの props(1ページ分の紙・グリッド情報)\ninterface PrintPageProps {\n\tpage: Page;\n\tpaper: Paper;\n\tvalues?: Record<string, Value>;\n\tpluginRegistry: PluginRegistry;\n}\n\nconst PrintPage = memo(\n\t({ page, paper, values, pluginRegistry }: PrintPageProps) => {\n\t\tconst { paperPx, getBlockRectPx } = useGridCalc(\n\t\t\tpaper,\n\t\t\tpage.grid,\n\t\t\tDEFAULT_DPI,\n\t\t);\n\n\t\tconst bindingContext: BindingContext | undefined = values\n\t\t\t? { get: (path) => values[path] ?? null, set: () => {} }\n\t\t\t: undefined;\n\n\t\tconst visibleBlocks = page.blocks.filter(\n\t\t\t(block) => !evalHiddenBinding(block.hiddenBinding, bindingContext),\n\t\t);\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tstyle={{\n\t\t\t\t\tposition: \"relative\",\n\t\t\t\t\twidth: `${paperPx.canvas.width}px`,\n\t\t\t\t\theight: `${paperPx.canvas.height}px`,\n\t\t\t\t\tbackgroundColor: \"#fff\",\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<BlockLayer\n\t\t\t\t\tblocks={visibleBlocks}\n\t\t\t\t\tpluginRegistry={pluginRegistry}\n\t\t\t\t\tmode={NoteMode.VIEW}\n\t\t\t\t\tvalues={values ?? {}}\n\t\t\t\t\tblockDefaults={page.blockDefaults}\n\t\t\t\t\tgetBlockRectPx={getBlockRectPx}\n\t\t\t\t\tshowGuides={false}\n\t\t\t\t\tshowBorder={true}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t);\n\t},\n);\n\nPrintPage.displayName = \"PrintPage\";\n\n// ----- NotePrint 本体 -----\n\nconst NotePrintBase = forwardRef<HTMLDivElement, NotePrintProps>(\n\t({ book, values, pluginRegistry, printSettings, className, style }, ref) => {\n\t\t// printSettings によるオーバーライドを反映した実効用紙設定\n\t\tconst effectivePaper = resolveEffectivePaper(book, printSettings);\n\n\t\t// @page CSS を文字列として事前計算することで、useEffect の deps を string 比較にする。\n\t\t// オブジェクト参照(effectivePaper)を deps に含めると resolveEffectivePaper が\n\t\t// 毎 render で新規オブジェクトを返すため、values 変更だけで DOM 操作が走ってしまう。\n\t\tconst pageStyleContent = buildPageCss(\n\t\t\teffectivePaper,\n\t\t\tprintSettings?.margin,\n\t\t);\n\n\t\t// ブック全体の用紙サイズで @page を設定\n\t\tuseEffect(() => {\n\t\t\tdocument.getElementById(\"printable-note-page-style\")?.remove();\n\t\t\tdocument.getElementById(\"tatamicks-book-page-style\")?.remove();\n\n\t\t\tconst pageStyle = document.createElement(\"style\");\n\t\t\tpageStyle.id = \"printable-note-page-style\";\n\t\t\tpageStyle.textContent = pageStyleContent;\n\t\t\tdocument.head.appendChild(pageStyle);\n\n\t\t\tconst pageStyleLegacy = document.createElement(\"style\");\n\t\t\tpageStyleLegacy.id = \"tatamicks-book-page-style\";\n\t\t\tpageStyleLegacy.textContent = pageStyleContent;\n\t\t\tdocument.head.appendChild(pageStyleLegacy);\n\n\t\t\treturn () => {\n\t\t\t\tdocument.getElementById(\"printable-note-page-style\")?.remove();\n\t\t\t\tdocument.getElementById(\"tatamicks-book-page-style\")?.remove();\n\t\t\t};\n\t\t}, [pageStyleContent]);\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\tclassName={[styles.printContainer, className].filter(Boolean).join(\" \")}\n\t\t\t\tstyle={style}\n\t\t\t>\n\t\t\t\t{book.pages.map((page, index) => {\n\t\t\t\t\tconst pageKey =\n\t\t\t\t\t\tpage.id ??\n\t\t\t\t\t\t(page.blocks.map((b) => b.id).join(\"_\") || `page-${index}`);\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tkey={pageKey}\n\t\t\t\t\t\t\tclassName={\n\t\t\t\t\t\t\t\tindex < book.pages.length - 1 ? styles.pageBreak : undefined\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<PrintPage\n\t\t\t\t\t\t\t\tpage={page}\n\t\t\t\t\t\t\t\tpaper={effectivePaper}\n\t\t\t\t\t\t\t\tvalues={values}\n\t\t\t\t\t\t\t\tpluginRegistry={pluginRegistry}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</div>\n\t\t);\n\t},\n);\n\nNotePrintBase.displayName = \"NotePrint\";\n\n/**\n * Book の全ページを縦並べで印刷するコンポーネント。\n *\n * `page-break-after: always` によりブラウザ印刷時に改ページされる。\n * 単一ページ印刷が必要な場合は 1 ページのみの Book を渡すことで対応できる。\n *\n * @remarks\n * 直接使用するのは独自の印刷 UI を構築する場合のみとすること。\n *\n * 通常は {@link printNote} 関数を使用すること。\n */\nexport const NotePrint = memo(NotePrintBase) as React.ForwardRefExoticComponent<\n\tNotePrintProps & React.RefAttributes<HTMLDivElement>\n>;\n","// iframe に書き出す HTML 内で XSS が発生しないよう特殊文字をエスケープする\nfunction escapeHtml(str: string): string {\n\treturn str\n\t\t.replace(/&/g, \"&\")\n\t\t.replace(/</g, \"<\")\n\t\t.replace(/>/g, \">\")\n\t\t.replace(/\"/g, \""\");\n}\n\n/**\n * 特定の要素だけを印刷する。\n *\n * 対象要素の HTML と現在ページのすべてのスタイルを隠し iframe にコピーし、\n * iframe.contentWindow.print() を呼ぶことで、ページ外の UI(サイドバー等)を\n * 完全に除外した印刷を実現する。window.print() は使用しない。\n */\nexport function printElement(\n\telement: HTMLElement,\n\toptions?: {\n\t\ttitle?: string;\n\t\tonBeforePrint?: () => void;\n\t\tonAfterPrint?: () => void;\n\t},\n): void {\n\tconst title = options?.title ?? document.title;\n\n\t// 隠し iframe を作成(visibility:hidden で表示しつつ画面上は見えない状態)\n\tconst iframe = document.createElement(\"iframe\");\n\tiframe.style.cssText =\n\t\t\"position:fixed;top:0;left:0;width:100%;height:100%;visibility:hidden;z-index:-9999;border:none;\";\n\tdocument.body.appendChild(iframe);\n\n\tconst iframeWin = iframe.contentWindow;\n\tconst iframeDoc = iframe.contentDocument ?? iframeWin?.document;\n\tif (!iframeDoc || !iframeWin) {\n\t\tdocument.body.removeChild(iframe);\n\t\treturn;\n\t}\n\n\t// 現在ページの全 <style> タグを収集(CSS Modules の生成スタイル・@page ルールを含む)\n\tconst styleHTML = Array.from(document.querySelectorAll(\"style\"))\n\t\t.map((s) => s.outerHTML)\n\t\t.join(\"\\n\");\n\n\t// <link rel=\"stylesheet\"> も収集(本番ビルド時の外部 CSS ファイル)\n\tconst linkHTML = Array.from(\n\t\tdocument.querySelectorAll('link[rel=\"stylesheet\"]'),\n\t)\n\t\t.map((l) => l.outerHTML)\n\t\t.join(\"\\n\");\n\n\t// element の中身(innerHTML)を使い、printOnly ラッパー(display:none)を除外する\n\tconst contentHTML = element.innerHTML;\n\n\tiframeDoc.open();\n\tiframeDoc.write(\n\t\t`<!DOCTYPE html><html><head><meta charset=\"utf-8\" /><title>${escapeHtml(title)}</title>${linkHTML}${styleHTML}<style>*{-webkit-print-color-adjust:exact!important;print-color-adjust:exact!important;}</style></head><body>${contentHTML}</body></html>`,\n\t);\n\tiframeDoc.close();\n\n\tconst cleanup = () => {\n\t\tif (document.body.contains(iframe)) {\n\t\t\tdocument.body.removeChild(iframe);\n\t\t}\n\t};\n\n\tiframeWin.addEventListener(\"afterprint\", () => {\n\t\toptions?.onAfterPrint?.();\n\t\tcleanup();\n\t});\n\n\toptions?.onBeforePrint?.();\n\n\t// スタイルの適用を待ってから印刷ダイアログを開く\n\tsetTimeout(() => {\n\t\tiframeWin.focus();\n\t\tiframeWin.print();\n\t}, 0);\n}\n","import { createElement } from \"react\";\nimport { flushSync } from \"react-dom\";\nimport { createRoot } from \"react-dom/client\";\n\nimport { NotePrint } from \"../../note/NotePrint\";\nimport { printElement } from \"./printElement\";\n\nimport type { NoteContext } from \"../../contexts/useNoteContext\";\nimport type { PluginRegistry } from \"../../plugin/registry\";\nimport type { PrintSettings } from \"../../types/print\";\nimport type { Book } from \"../../types/schema\";\nimport type { Value } from \"../../types/value\";\n\n/**\n * ブックの内容を印刷する内部実装。\n *\n * `NoteView` のスタンドアロン利用(context なし)向けに値解決済みの引数を受け取る。\n */\nexport function printNoteRaw(\n\tbook: Book,\n\tvalues: Record<string, Value>,\n\tpluginRegistry: PluginRegistry,\n\tprintSettings?: PrintSettings,\n): void {\n\tconst container = document.createElement(\"div\");\n\tcontainer.style.cssText = \"position:absolute;top:-9999px;left:-9999px;\";\n\tdocument.body.appendChild(container);\n\tconst root = createRoot(container);\n\tflushSync(() => {\n\t\troot.render(\n\t\t\tcreateElement(NotePrint, { book, values, pluginRegistry, printSettings }),\n\t\t);\n\t});\n\tprintElement(container);\n\troot.unmount();\n\tdocument.body.removeChild(container);\n}\n\n/**\n * ブックの内容を印刷する。\n *\n * `useNoteContext` が返す `context` を渡すだけで、book・values・pluginRegistry を自動で解決して印刷する。\n *\n * @example\n * ```ts\n * // 印刷ボタンなどから直接呼ぶだけでよい\n * printNote(context);\n * ```\n */\nexport function printNote(\n\tcontext: NoteContext,\n\tprintSettings?: PrintSettings,\n): void {\n\tprintNoteRaw(\n\t\tcontext.book,\n\t\tcontext.values,\n\t\tcontext.pluginRegistry,\n\t\tprintSettings,\n\t);\n}\n","import {\n\tAddPageIcon,\n\tChevronLeftIcon,\n\tChevronRightIcon,\n\tDeletePageIcon,\n} from \"../../../components/icons\";\nimport { IconActionButton } from \"../../ui\";\nimport styles from \"./ActionBar.module.css\";\n\n/**\n * `PageNavigationSection` コンポーネントへの props。\n */\nexport interface PageNavigationSectionProps {\n\t/** 現在のページインデックス(0 始まり) */\n\tpageIdx: number;\n\n\t/** 総ページ数 */\n\tpageCount: number;\n\n\t/** ページ移動時のコールバック */\n\tonPageChange: (idx: number) => void;\n\n\t/** ページ追加のコールバック */\n\tonAddPage?: () => void;\n\n\t/** ページ削除のコールバック。省略時は削除ボタンを非表示 */\n\tonDeletePage?: () => void;\n\n\t/** `true` のときページ削除を無効化(1 ページのみのときなど) */\n\tcanDeletePage?: boolean;\n}\n\n/**\n * `ActionBar` 上にページ前後移動・追加・削除ボタンとページ番号表示を提供するセクション。\n *\n * @remarks\n * `ActionBar` のページナビゲーションセクション。\n */\nexport const PageNavigationSection = ({\n\tpageIdx,\n\tpageCount,\n\tonPageChange,\n\tonAddPage,\n\tonDeletePage,\n\tcanDeletePage = true,\n}: PageNavigationSectionProps) => {\n\treturn (\n\t\t<>\n\t\t\t<IconActionButton\n\t\t\t\ticon={<ChevronLeftIcon aria-hidden=\"true\" />}\n\t\t\t\tlabel=\"前のページへ\"\n\t\t\t\ttitle=\"前のページへ\"\n\t\t\t\tonClick={() => onPageChange(Math.max(0, pageIdx - 1))}\n\t\t\t\tdisabled={pageIdx === 0}\n\t\t\t\tpreventFocusOnMouseDown\n\t\t\t/>\n\t\t\t<span className={styles.sectionLabel}>\n\t\t\t\t{pageIdx + 1} / {pageCount}\n\t\t\t</span>\n\t\t\t<IconActionButton\n\t\t\t\ticon={<ChevronRightIcon aria-hidden=\"true\" />}\n\t\t\t\tlabel=\"次のページへ\"\n\t\t\t\ttitle=\"次のページへ\"\n\t\t\t\tonClick={() => onPageChange(Math.min(pageCount - 1, pageIdx + 1))}\n\t\t\t\tdisabled={pageIdx >= pageCount - 1}\n\t\t\t\tpreventFocusOnMouseDown\n\t\t\t/>\n\t\t\t{onAddPage !== undefined && (\n\t\t\t\t<IconActionButton\n\t\t\t\t\ticon={<AddPageIcon aria-hidden=\"true\" />}\n\t\t\t\t\tlabel=\"ページを追加\"\n\t\t\t\t\ttitle=\"ページを追加\"\n\t\t\t\t\tonClick={onAddPage}\n\t\t\t\t\tpreventFocusOnMouseDown\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t{onDeletePage !== undefined && (\n\t\t\t\t<IconActionButton\n\t\t\t\t\ticon={<DeletePageIcon aria-hidden=\"true\" />}\n\t\t\t\t\tlabel=\"ページを削除\"\n\t\t\t\t\ttitle=\"ページを削除\"\n\t\t\t\t\tonClick={onDeletePage}\n\t\t\t\t\tdisabled={!canDeletePage}\n\t\t\t\t\tpreventFocusOnMouseDown\n\t\t\t\t/>\n\t\t\t)}\n\t\t</>\n\t);\n};\n\nPageNavigationSection.displayName = \"PageNavigationSection\";\n","import { printNote } from \"../../../utils/print/printNote\";\nimport { CanvasActionSection } from \"./CanvasActionSection\";\nimport { GridSettingsSection } from \"./GridSettingsSection\";\nimport { PageNavigationSection } from \"./PageNavigationSection\";\nimport { PaperSettingsSection } from \"./PaperSettingsSection\";\n\nimport type { ReactNode } from \"react\";\nimport type { NoteContext } from \"../../../contexts/useNoteContext\";\nimport type { ActionFeedback } from \"../../actionFeedback\";\n\n/**\n * `getDefaultActionBarSections` のオプション。\n *\n * @remarks\n * `getDefaultActionBarSections` に渡す引数の型。\n */\nexport interface GetDefaultActionBarSectionsOptions {\n\t/** `useNoteContext` が返すコンテキスト */\n\tcontext: NoteContext;\n\n\t/** アクション実行時のフィードバック(トースト表示など) */\n\tonActionFeedback?: (feedback: ActionFeedback) => void;\n\n\t/**\n\t * 印刷ボタン押下時のコールバック。\n\t * 省略時は `printNote(context)` を呼び出してNote内容のみを印刷する。\n\t * PDF生成など独自の印刷処理を行う場合に上書きする。\n\t */\n\tonPrint?: () => void;\n}\n\n/**\n * `ActionBar` に渡すデフォルト `sections` 配列を返す。\n *\n * @remarks\n * 各要素には `key` が付いているため `filter`/`map` で操作できる。\n *\n * パフォーマンスを要する場合は呼び出し側で `useMemo` を使うこと。\n *\n * @example\n * ```tsx\n * // デフォルトをそのまま使う\n * const sections = useMemo(\n * () => getDefaultActionBarSections({ context }),\n * [context],\n * );\n * <ActionBar sections={sections} />\n *\n * // カスタムセクションを末尾に追加\n * <ActionBar sections={[...sections, <MySection key=\"custom\" />]} />\n * ```\n */\nexport function getDefaultActionBarSections({\n\tcontext,\n\tonActionFeedback,\n\tonPrint,\n}: GetDefaultActionBarSectionsOptions): ReactNode[] {\n\tconst { actionContext } = context;\n\tconst { book, onBookChange } = context;\n\tconst editorState = context.editorState;\n\n\tconst pageIdx = editorState.pageIdx;\n\n\tconst page = book.pages[pageIdx] ?? book.pages[0];\n\n\tconst sections: ReactNode[] = [\n\t\t<CanvasActionSection\n\t\t\tkey=\"canvas\"\n\t\t\tactionContext={actionContext}\n\t\t\tonActionFeedback={onActionFeedback}\n\t\t\tonPrint={onPrint ?? (() => printNote(context))}\n\t\t/>,\n\t\t<PaperSettingsSection\n\t\t\tkey=\"paper\"\n\t\t\tpaper={book.paper}\n\t\t\tonPaperChange={(paper) => onBookChange({ ...book, paper })}\n\t\t/>,\n\t\t<GridSettingsSection\n\t\t\tkey=\"grid\"\n\t\t\tgrid={page.grid}\n\t\t\tonGridChange={(grid) => {\n\t\t\t\tconst newPages = book.pages.map((p, i) =>\n\t\t\t\t\ti === pageIdx ? { ...p, grid } : p,\n\t\t\t\t) as typeof book.pages;\n\t\t\t\tonBookChange({ ...book, pages: newPages });\n\t\t\t}}\n\t\t/>,\n\t];\n\n\tsections.push(\n\t\t<PageNavigationSection\n\t\t\tkey=\"page-nav\"\n\t\t\tpageIdx={pageIdx}\n\t\t\tpageCount={book.pages.length}\n\t\t\tonPageChange={(idx) => actionContext.execute(\"goToPage\", idx)}\n\t\t\tonAddPage={() => actionContext.execute(\"addPage\")}\n\t\t\tonDeletePage={() => actionContext.execute(\"deletePage\")}\n\t\t\tcanDeletePage={book.pages.length > 1}\n\t\t/>,\n\t);\n\n\treturn sections;\n}\n","import { useMemo, useRef } from \"react\";\n\nimport { getDefaultSelectionActionBarItems } from \"./getDefaultSelectionActionBarItems\";\nimport { SelectionActionBar } from \"./SelectionActionBar\";\nimport { SelectionActionBarOverlay } from \"./SelectionActionBarOverlay\";\nimport { useSelectionBounds } from \"./useSelectionBounds\";\n\nimport type { NoteContext } from \"../../../contexts/useNoteContext\";\nimport type { ActionFeedback } from \"../../actionFeedback\";\n\n/**\n * `DefaultSelectionActionBarOverlay` コンポーネントへの props。\n */\nexport interface DefaultSelectionActionBarOverlayProps {\n\t/** NoteContext(`useNoteContext` が返すコンテキスト) */\n\tcontext: NoteContext;\n\n\t/** グリッドサイズ(レイアウトパネルに使用) */\n\tgridSize?: { cols: number; rows: number };\n\n\t/** ドラッグ中のとき `true` を渡すと非表示になる */\n\tisDragging?: boolean;\n\n\t/** z-index(デフォルト: `Z_INDEX.SELECTION_ACTION_BAR`) */\n\tzIndex?: number;\n\n\t/** アクション実行時のフィードバック */\n\tonActionFeedback?: (feedback: ActionFeedback) => void;\n}\n\n/**\n * `getDefaultSelectionActionBarItems` + `SelectionActionBar` をキャンバス上に浮かせて表示するオーバーレイ。\n *\n * @remarks\n * `position: relative` なコンテナ内で選択ブロック群の右上コーナーに `SelectionActionBar` を浮かせる。\n *\n * @example\n * ```tsx\n * <div style={{ position: \"relative\" }}>\n * <NoteForm ... />\n * <DefaultSelectionActionBarOverlay context={context} />\n * </div>\n * ```\n */\nexport const DefaultSelectionActionBarOverlay = ({\n\tcontext,\n\tgridSize,\n\tisDragging,\n\tzIndex,\n\tonActionFeedback,\n}: DefaultSelectionActionBarOverlayProps) => {\n\tconst { book, containerRef } = context;\n\tconst editorState = context.editorState;\n\tconst fallbackRef = useRef<HTMLElement>(null);\n\n\tconst selectedBlockIds = editorState.selectedBlockIds ?? [];\n\n\t// book 内に存在する選択 ID のみに絞り込む。\n\t// book が変化した(ブロック移動など)場合も新参照を生成して useSelectionBounds の再計測をトリガーする。\n\tconst selectionSnapshot = useMemo(() => {\n\t\tconst validIds = new Set(\n\t\t\tbook.pages.flatMap((p) => p.blocks.map((b) => b.id)),\n\t\t);\n\t\treturn selectedBlockIds.filter((id: string) => validIds.has(id));\n\t}, [selectedBlockIds, book]);\n\n\tconst selectionBoundingBox =\n\t\tuseSelectionBounds(containerRef ?? fallbackRef, selectionSnapshot) ?? null;\n\n\treturn (\n\t\t<SelectionActionBarOverlay\n\t\t\tselectionBoundingBox={selectionBoundingBox}\n\t\t\tisDragging={isDragging}\n\t\t\tzIndex={zIndex}\n\t\t>\n\t\t\t<SelectionActionBar\n\t\t\t\titems={getDefaultSelectionActionBarItems({\n\t\t\t\t\tcontext,\n\t\t\t\t\tgridSize,\n\t\t\t\t\tonActionFeedback,\n\t\t\t\t})}\n\t\t\t\tonPointerDown={(e) => e.stopPropagation()}\n\t\t\t/>\n\t\t</SelectionActionBarOverlay>\n\t);\n};\n\nDefaultSelectionActionBarOverlay.displayName =\n\t\"DefaultSelectionActionBarOverlay\";\n","import { DefaultBlockPropertyPanel } from \"../../panels/BlockPropertyPanel/DefaultBlockPropertyPanel\";\nimport { DefaultCanvasPanel } from \"../../panels/CanvasPanel/DefaultCanvasPanel\";\nimport { OtherPanel } from \"../../panels/OtherPanel\";\nimport { PalettePanel } from \"../../panels/PalettePanel\";\n\nimport type { NoteContext } from \"../../../contexts/useNoteContext\";\nimport type { ActionFeedback } from \"../../actionFeedback\";\nimport type { SidebarTab } from \"./Sidebar\";\n\n/**\n * `getDefaultSidebarTabs` のオプション。\n *\n * @remarks\n * `getDefaultSidebarTabs` に渡す引数の型。\n */\nexport interface GetDefaultSidebarTabsOptions {\n\t/** `useNoteContext` が返すコンテキスト */\n\tcontext: NoteContext;\n\n\t/** グリッドサイズ(LayoutPanel で使用) */\n\tgridSize?: { cols: number; rows: number };\n\n\t/** ホバー中のブロック ID 通知 */\n\tonBlockHover?: (id: string | null) => void;\n\n\t/** ドラッグ中のブロック ID 通知 */\n\tonBlockDragChange?: (id: string | null) => void;\n\n\t/** アクション実行時のフィードバック */\n\tonActionFeedback?: (feedback: ActionFeedback) => void;\n}\n\n/**\n * `Sidebar` に渡すデフォルト tabs 配列(ブロック / キャンバス / その他)を返す。\n *\n * @remarks\n * パフォーマンスを要する場合は呼び出し側で `useMemo` を使うこと。\n *\n * @example\n * ```tsx\n * // デフォルトをそのまま使う\n * const tabs = useMemo(\n * () => getDefaultSidebarTabs({ context }),\n * [context],\n * );\n * <Sidebar tabs={tabs} />\n *\n * // カスタムタブを末尾に追加\n * <Sidebar tabs={[...tabs, { value: \"custom\", label: \"カスタム\", content: <MyPanel /> }]} />\n *\n * // 特定タブを除外\n * <Sidebar tabs={tabs.filter((t) => t.value !== \"other\")} />\n * ```\n */\nexport function getDefaultSidebarTabs({\n\tcontext,\n\tgridSize,\n\tonBlockHover,\n\tonBlockDragChange,\n\tonActionFeedback,\n}: GetDefaultSidebarTabsOptions): SidebarTab[] {\n\tconst editorState = context.editorState;\n\tconst selectedBlockIds = editorState.selectedBlockIds ?? [];\n\n\tconst hasSelection = selectedBlockIds.length > 0;\n\n\treturn [\n\t\t{\n\t\t\tvalue: \"block\",\n\t\t\tlabel: \"ブロック\",\n\t\t\tcontent: hasSelection ? (\n\t\t\t\t<DefaultBlockPropertyPanel context={context} gridSize={gridSize} />\n\t\t\t) : (\n\t\t\t\t<PalettePanel context={context} />\n\t\t\t),\n\t\t},\n\t\t{\n\t\t\tvalue: \"canvas\",\n\t\t\tlabel: \"キャンバス\",\n\t\t\tcontent: (\n\t\t\t\t<DefaultCanvasPanel\n\t\t\t\t\tcontext={context}\n\t\t\t\t\tonBlockHover={onBlockHover}\n\t\t\t\t\tonBlockDragChange={onBlockDragChange}\n\t\t\t\t\tonActionFeedback={onActionFeedback}\n\t\t\t\t/>\n\t\t\t),\n\t\t},\n\t\t{\n\t\t\tvalue: \"other\",\n\t\t\tlabel: \"その他\",\n\t\t\tcontent: <OtherPanel context={context} />,\n\t\t},\n\t];\n}\n","import { Tabs, TabsContent, TabsList, TabsTrigger } from \"../../ui\";\nimport styles from \"./Sidebar.module.css\";\nimport { SIDEBAR_PORTAL_PROPS } from \"./sidebarPortal\";\n\nimport type { ReactNode } from \"react\";\n\n/**\n * サイドバーのタブ定義オブジェクト。\n */\nexport interface SidebarTab {\n\t/** タブの value(一意な文字列) */\n\tvalue: string;\n\n\t/** タブヘッダーに表示するラベル */\n\tlabel: ReactNode;\n\n\t/** タブのコンテンツ */\n\tcontent: ReactNode;\n}\n\n/**\n * サイドバーコンポーネントへの props。\n */\nexport interface SidebarProps {\n\t/** タブ定義(必須) */\n\ttabs: SidebarTab[];\n\n\t/** デフォルトで選択されるタブの value。未指定時は最初のタブ */\n\tdefaultTab?: string;\n\n\t/** カスタムクラス名 */\n\tclassName?: string;\n}\n\n/**\n * サイドバーコンポーネント。\n *\n * @remarks\n * **Shell** — タブシェルのみを提供する純粹なコンテナ。\n *\n * タブの内容は `getDefaultSidebarTabs()` で生成してください。\n */\nexport const Sidebar = ({ tabs, defaultTab, className }: SidebarProps) => {\n\tconst activeDefaultTab = defaultTab ?? tabs[0]?.value ?? \"\";\n\n\treturn (\n\t\t<div\n\t\t\tclassName={`${styles.container} ${className || \"\"}`}\n\t\t\t{...SIDEBAR_PORTAL_PROPS}\n\t\t>\n\t\t\t<Tabs defaultValue={activeDefaultTab} variant=\"default\">\n\t\t\t\t<TabsList className={styles.tabHeader}>\n\t\t\t\t\t{tabs.map((tab) => (\n\t\t\t\t\t\t<TabsTrigger key={tab.value} value={tab.value}>\n\t\t\t\t\t\t\t{tab.label}\n\t\t\t\t\t\t</TabsTrigger>\n\t\t\t\t\t))}\n\t\t\t\t</TabsList>\n\t\t\t\t{tabs.map((tab) => (\n\t\t\t\t\t<TabsContent\n\t\t\t\t\t\tkey={tab.value}\n\t\t\t\t\t\tvalue={tab.value}\n\t\t\t\t\t\tclassName={styles.tabContent}\n\t\t\t\t\t>\n\t\t\t\t\t\t{tab.content}\n\t\t\t\t\t</TabsContent>\n\t\t\t\t))}\n\t\t\t</Tabs>\n\t\t</div>\n\t);\n};\n\nSidebar.displayName = \"Sidebar\";\n","import { useMemo, useRef, useState } from \"react\";\n\nimport { Note } from \"../../note/Note\";\nimport { createPluginRegistry } from \"../../plugin/registry\";\nimport { NoteMode } from \"../../types/mode\";\nimport { SIDEBAR_PORTAL_PROPS } from \"../bars/Sidebar/sidebarPortal\";\n\nimport type React from \"react\";\nimport type { WidgetDef } from \"../../canvas/widgets\";\nimport type { NoteContext } from \"../../contexts/useNoteContext\";\nimport type { BindingContext, EditorState } from \"../../types/context\";\n\n/**\n * `FloatingWidget` コンポーネントへの props。\n */\nexport interface FloatingWidgetProps {\n\t/** タイトルバーに表示するラベル */\n\tlabel: string;\n\n\t/** 表示するウィジェット(必要なプラグインを内包した {@link WidgetDef}) */\n\twidget: WidgetDef;\n\n\t/** `widget.plugins` に追加で使用するプラグイン(省略可) */\n\textraPlugins?: WidgetDef[\"plugins\"];\n\n\t/** フローティング位置(position: fixed の left / top) */\n\tposition: { x: number; y: number };\n\n\t/** `useNoteContext` が返すコンテキスト */\n\tcontext: NoteContext;\n\n\t/** ドラッグ中かどうか(影の強弱・pointer-events の制御に使用) */\n\tisDragging: boolean;\n\n\t/** タイトルバー(ドラッグハンドル)の pointerdown ハンドラ */\n\tonTitlePointerDown: React.PointerEventHandler<HTMLDivElement>;\n\n\t/** ✕ボタンが押されたときのコールバック */\n\tonClose: () => void;\n\n\t/** コンテナ全体の pointerdown ハンドラ(省略可) */\n\tonContainerPointerDown?: () => void;\n\n\t/**\n\t * コンテナの style を上書きする(position, z-index などを変更したい場合に使用)。\n\t *\n\t * デフォルト: `position: \"fixed\"`, z-index: isDragging ? 3750000 : 3700000\n\t */\n\tstyle?: React.CSSProperties;\n}\n\n/** @internal 選択・ページ管理なしのデフォルト EditorState(フローティングウィジェット内部用) */\nconst NOOP_EDITOR_STATE: EditorState = {\n\tselectedBlockIds: [],\n\tpageIdx: 0,\n};\n\n/**\n * キャンバス上にフローティング表示するウィジェットコンポーネント。\n *\n * タイトルバーをドラッグで移動、右下コーナードラッグでズーム(拡縮)できる。\n *\n * `bindingContext` を省略した場合は `widget.book` をローカル state で管理する。\n */\nexport function FloatingWidget({\n\tlabel,\n\twidget,\n\textraPlugins,\n\tposition,\n\tisDragging,\n\tonTitlePointerDown,\n\tonClose,\n\tonContainerPointerDown,\n\tstyle,\n\tcontext,\n}: FloatingWidgetProps) {\n\t// widget.book をベースにしたローカルコンテキスト(bindingContext / actionContext はメイン context から引き継ぐ)\n\tconst pluginRegistry = useMemo(\n\t\t() => createPluginRegistry([...widget.plugins, ...(extraPlugins ?? [])]),\n\t\t[widget.plugins, extraPlugins],\n\t);\n\n\tconst widgetContainerRef = useRef<HTMLDivElement | null>(null);\n\n\t// canvas の book が変わるたびに新しいオブジェクトを生成することで、\n\t// memo 最適化された子コンポーネント(NoteEdit / BlockRenderer)が再描画され、\n\t// NoteBlockPlugin 内部の binding 値(stepper 等)の表示が更新される。\n\tconst widgetBindingContext = useMemo<BindingContext>(\n\t\t() => ({\n\t\t\tget: (path) => {\n\t\t\t\t// context.book をクロージャで参照し、canvas book 変更時にこのオブジェクト参照が\n\t\t\t\t// 変わるようにする(memo の bailout を防ぎ子 Note まで更新を伝播させる)\n\t\t\t\tvoid context.book;\n\t\t\t\treturn context.bindingContext.get(path);\n\t\t\t},\n\t\t\tset: (path, value) => context.bindingContext.set(path, value),\n\t\t}),\n\t\t[context.bindingContext, context.book],\n\t);\n\n\tconst widgetContext = useMemo<NoteContext>(\n\t\t() => ({\n\t\t\tbook: widget.props.book,\n\t\t\tonBookChange: () => {},\n\t\t\tpluginRegistry,\n\t\t\tcontainerRef: widgetContainerRef,\n\t\t\tbindingContext: widgetBindingContext,\n\t\t\tactionContext: context.actionContext,\n\t\t\teditorState: NOOP_EDITOR_STATE,\n\t\t\tvalues: {},\n\t\t}),\n\t\t[\n\t\t\twidget.props.book,\n\t\t\tpluginRegistry,\n\t\t\twidgetBindingContext,\n\t\t\tcontext.actionContext,\n\t\t],\n\t);\n\n\t// 右下コーナードラッグによる zoom 変更\n\tconst [zoom, setZoom] = useState(0.5);\n\tconst resizeStartRef = useRef({ x: 0, zoom: 0.5 });\n\tconst handleResizePointerDown = (e: React.PointerEvent) => {\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\t\tresizeStartRef.current = { x: e.clientX, zoom };\n\t\tconst handleMove = (ev: PointerEvent) => {\n\t\t\tconst dx = ev.clientX - resizeStartRef.current.x;\n\t\t\tsetZoom(\n\t\t\t\tMath.max(0.25, Math.min(2, resizeStartRef.current.zoom + dx / 400)),\n\t\t\t);\n\t\t};\n\t\tconst handleUp = () => {\n\t\t\twindow.removeEventListener(\"pointermove\", handleMove);\n\t\t\twindow.removeEventListener(\"pointerup\", handleUp);\n\t\t};\n\t\twindow.addEventListener(\"pointermove\", handleMove);\n\t\twindow.addEventListener(\"pointerup\", handleUp);\n\t};\n\n\treturn (\n\t\t<div\n\t\t\tonPointerDown={onContainerPointerDown}\n\t\t\t{...SIDEBAR_PORTAL_PROPS}\n\t\t\tstyle={{\n\t\t\t\tposition: \"fixed\",\n\t\t\t\tleft: position.x,\n\t\t\t\ttop: position.y,\n\t\t\t\tzIndex: isDragging ? 3750000 : 3700000,\n\t\t\t\tbackground: \"#fff\",\n\t\t\t\tborder: \"1px solid #d1d5db\",\n\t\t\t\tborderRadius: 6,\n\t\t\t\tboxShadow: isDragging\n\t\t\t\t\t? \"0 8px 24px rgba(0,0,0,0.2)\"\n\t\t\t\t\t: \"0 2px 8px rgba(0,0,0,0.12)\",\n\t\t\t\t...style,\n\t\t\t}}\n\t\t>\n\t\t\t{/* タイトルバー(ドラッグハンドル) */}\n\t\t\t<div\n\t\t\t\tstyle={{\n\t\t\t\t\tdisplay: \"flex\",\n\t\t\t\t\talignItems: \"center\",\n\t\t\t\t\tjustifyContent: \"space-between\",\n\t\t\t\t\tpadding: \"3px 4px 3px 8px\",\n\t\t\t\t\tbackground: \"#f9fafb\",\n\t\t\t\t\tborderBottom: \"1px solid #e5e7eb\",\n\t\t\t\t\tborderRadius: \"6px 6px 0 0\",\n\t\t\t\t\tcursor: \"move\",\n\t\t\t\t\tuserSelect: \"none\",\n\t\t\t\t\tgap: 4,\n\t\t\t\t}}\n\t\t\t\tonPointerDown={onTitlePointerDown}\n\t\t\t>\n\t\t\t\t<span style={{ fontSize: 11, color: \"#555\", whiteSpace: \"nowrap\" }}>\n\t\t\t\t\t{label}\n\t\t\t\t</span>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tonPointerDown={(e) => e.stopPropagation()}\n\t\t\t\t\tonClick={onClose}\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tbackground: \"none\",\n\t\t\t\t\t\tborder: \"none\",\n\t\t\t\t\t\tcursor: \"pointer\",\n\t\t\t\t\t\tfontSize: 12,\n\t\t\t\t\t\tcolor: \"#9ca3af\",\n\t\t\t\t\t\tpadding: \"0 2px\",\n\t\t\t\t\t\tlineHeight: 1,\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t✕\n\t\t\t\t</button>\n\t\t\t</div>\n\n\t\t\t{/* ウィジェット本体(zoom で拡縮) */}\n\t\t\t<div style={{ pointerEvents: isDragging ? \"none\" : \"auto\", zoom }}>\n\t\t\t\t<Note mode={NoteMode.EDIT} context={widgetContext} />\n\t\t\t</div>\n\n\t\t\t{/* リサイズハンドル(右下コーナーをドラッグで zoom 変更) */}\n\t\t\t<div\n\t\t\t\tonPointerDown={handleResizePointerDown}\n\t\t\t\tstyle={{\n\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\tbottom: 0,\n\t\t\t\t\tright: 0,\n\t\t\t\t\twidth: 14,\n\t\t\t\t\theight: 14,\n\t\t\t\t\tcursor: \"se-resize\",\n\t\t\t\t\tbackground: \"linear-gradient(135deg, transparent 50%, #9ca3af 50%)\",\n\t\t\t\t\tborderRadius: \"0 0 6px 0\",\n\t\t\t\t}}\n\t\t\t/>\n\t\t</div>\n\t);\n}\n"],"names":["resolveDefaultProps","plugin","result","prop","createPluginRegistry","plugins","seen","BASE_PLUGINS","CheckboxPlugin","SelectPlugin","TextPlugin","editorInternalReducer","state","action","initialEditorInternalState","useEditorState","book","handleBookChange","dispatch","useReducer","selectedBlockIds","pageIdx","bookRef","useRef","stateRef","handleUpdateBlocks","useCallback","updates","options","b","pi","currentPage","updatedBlocks","blk","update","setPage","selectedIds","newSelectedIds","id","newId","_a","i","handleDeleteSelected","ids","deletedIds","newBlocks","handleCopySelected","copied","handleDuplicateSelected","selected","grid","createBlockId","handlePaste","cb","handleAddPage","newPage","insertPage","handleDeletePage","newBook","removePage","actionHandlers","useMemo","p","v","useNoteContext","initialBook","pluginRegistry","defaultValues","extra","containerRef","historyActionHandlers","useBookHistory","values","setValues","useState","handleValuesChange","changes","prev","value","next","editorState","bindingContextOptions","bindingContext","useBookBindingContext","actionContext","useBookActionContext","BUTTON_ICON_PATHS","BTN_PADDING","btn","iconPath","title","createCanvasActionsWidget","idPrefix","PaperSizePreset","ButtonPlugin","canvasActionsWidget","createClipboardWidget","clipboardWidget","createHistoryWidget","historyWidget","ATOM_PAPER","COMPOUND_PAPER_BASE","blockLayoutWidget","numberInputBlock","StepperPlugin","createPageNavigationWidget","pageCount","currentLabel","totalLabel","pageNavigationWidget","createSelectionDeleteWidget","selectionDeleteWidget","ActionBar","sections","className","style","jsx","styles","section","sectionIndex","key","isValidElement","Fragment","ActionBarDivider","PrintPage","memo","page","paper","paperPx","getBlockRectPx","useGridCalc","DEFAULT_DPI","path","visibleBlocks","block","evalHiddenBinding","BlockLayer","NoteMode","NotePrintBase","forwardRef","printSettings","ref","effectivePaper","resolveEffectivePaper","pageStyleContent","buildPageCss","useEffect","_b","pageStyle","pageStyleLegacy","index","pageKey","NotePrint","escapeHtml","str","printElement","element","iframe","iframeWin","iframeDoc","styleHTML","s","linkHTML","l","contentHTML","cleanup","printNoteRaw","container","root","createRoot","flushSync","createElement","printNote","context","PageNavigationSection","onPageChange","onAddPage","onDeletePage","canDeletePage","jsxs","IconActionButton","ChevronLeftIcon","ChevronRightIcon","AddPageIcon","DeletePageIcon","getDefaultActionBarSections","onActionFeedback","onPrint","onBookChange","CanvasActionSection","PaperSettingsSection","GridSettingsSection","newPages","idx","DefaultSelectionActionBarOverlay","gridSize","isDragging","zIndex","fallbackRef","selectionSnapshot","validIds","selectionBoundingBox","useSelectionBounds","SelectionActionBarOverlay","SelectionActionBar","getDefaultSelectionActionBarItems","e","getDefaultSidebarTabs","onBlockHover","onBlockDragChange","DefaultBlockPropertyPanel","PalettePanel","DefaultCanvasPanel","OtherPanel","Sidebar","tabs","defaultTab","activeDefaultTab","SIDEBAR_PORTAL_PROPS","Tabs","TabsList","tab","TabsTrigger","TabsContent","NOOP_EDITOR_STATE","FloatingWidget","label","widget","extraPlugins","position","onTitlePointerDown","onClose","onContainerPointerDown","widgetContainerRef","widgetBindingContext","widgetContext","zoom","setZoom","resizeStartRef","handleResizePointerDown","handleMove","ev","dx","handleUp","Note"],"mappings":"gUA8BA,SAASA,GACRC,EACwB,CACxB,MAAMC,EAAgC,CAAA,EACtC,UAAWC,KAAQF,EAAO,WACzB,OAAO,OAAOC,EAAQC,EAAK,YAAY,EAExC,OAAOD,CACR,CA6GO,SAASE,EACfC,EACiB,CACjB,MAAMC,MAAW,IACjB,UAAWL,KAAUI,EAAS,CAC7B,GAAIC,EAAK,IAAIL,EAAO,IAAI,EACvB,MAAM,IAAI,MACT,kDAAkDA,EAAO,IAAI,4CAAA,EAG/DK,EAAK,IAAIL,EAAO,IAAI,CACrB,CACA,OAAO,OAAO,YACbI,EAAQ,IAAKJ,GAAW,CAEvB,GAAI,CAACA,EAAO,SACX,MAAM,IAAI,MACT,kCAAkCA,EAAO,IAAI,qEAAA,EAG/C,MAAO,CACNA,EAAO,KACP,CACC,KAAMA,EAAO,KACb,KAAMA,EAAO,KACb,WAAYA,EAAO,WACnB,aAAcD,GAAoBC,CAAM,EACxC,SAAUA,EAAO,SACjB,GAAI,OAAOA,EAAO,cAAiB,WAChC,CACA,aACCA,EAAO,YAAA,EAER,CAAA,EACH,GAAI,OAAOA,EAAO,eAAkB,WACjC,CACA,cACCA,EAAO,aAAA,EAER,CAAA,EACH,GAAI,OAAOA,EAAO,eAAkB,WACjC,CACA,cACCA,EAAO,aAAA,EAER,CAAA,CAAC,CACL,CAEF,CAAC,CAAA,CAEH,CCnLO,MAAMM,GAAe,CAACC,iBAAgBC,EAAAA,aAAcC,EAAAA,UAAU,ECIrE,SAASC,GACRC,EACAC,EACsB,CACtB,OAAQA,EAAO,KAAA,CACd,IAAK,sBACJ,MAAO,CAAE,GAAGD,EAAO,iBAAkBC,EAAO,GAAA,EAC7C,IAAK,aACJ,MAAO,CAAE,GAAGD,EAAO,QAASC,EAAO,GAAA,EACpC,IAAK,eACJ,MAAO,CAAE,GAAGD,EAAO,UAAWC,EAAO,MAAA,CAAO,CAE/C,CAEA,MAAMC,GAAkD,CACvD,iBAAkB,CAAA,EAClB,QAAS,EACT,UAAW,CAAA,CACZ,EAsCO,SAASC,GAAe,CAC9B,KAAAC,EACA,iBAAAC,CACD,EAAgD,CAE/C,KAAM,CAACL,EAAOM,CAAQ,EAAIC,EAAAA,WACzBR,GACAG,EAAA,EAEK,CAAE,iBAAAM,EAAkB,QAAAC,CAAA,EAAYT,EAGhCU,EAAUC,EAAAA,OAAOP,CAAI,EAC3BM,EAAQ,QAAUN,EAClB,MAAMQ,EAAWD,EAAAA,OAAOX,CAAK,EAC7BY,EAAS,QAAUZ,EAGnB,MAAMa,EAAqBC,EAAAA,YAC1B,CACCC,EACAC,IACI,CACJ,MAAMC,EAAIP,EAAQ,QACZQ,EAAKN,EAAS,QAAQ,QACtBO,EAAcF,EAAE,MAAMC,CAAE,EAC9B,GAAI,CAACC,EAAa,OAClB,MAAMC,EAAgBD,EAAY,OAAO,IAAKE,GAAQ,CACrD,MAAMC,EAASP,EAAQM,EAAI,EAAE,EAC7B,OAAOC,EAAS,CAAE,GAAGD,EAAK,GAAGC,GAAWD,CACzC,CAAC,EACDhB,EACCkB,EAAAA,QAAQN,EAAGC,EAAI,CAAE,GAAGC,EAAa,OAAQC,EAAe,EACxDJ,CAAA,EAGD,MAAMQ,EAAcZ,EAAS,QAAQ,iBAC/Ba,EAAiBD,EAAY,IAAKE,GAAO,OAC9C,MAAMC,GAAQC,EAAAb,EAAQW,CAAE,IAAV,YAAAE,EAAa,GAC3B,OAAO,OAAOD,GAAU,SAAWA,EAAQD,CAC5C,CAAC,EACGD,EAAe,KAAK,CAACC,EAAIG,IAAMH,IAAOF,EAAYK,CAAC,CAAC,GACvDvB,EAAS,CAAE,KAAM,sBAAuB,IAAKmB,EAAgB,CAE/D,EACA,CAACpB,CAAgB,CAAA,EAGZyB,EAAuBhB,EAAAA,YAC3BiB,GAAkB,CAClB,MAAMd,EAAIP,EAAQ,QACZQ,EAAKN,EAAS,QAAQ,QACtBO,EAAcF,EAAE,MAAMC,CAAE,EAC9B,GAAI,CAACC,EAAa,OAClB,MAAMa,EAAa,IAAI,IAAID,CAAG,EACxBE,EAAYd,EAAY,OAAO,OACnCE,GAAQ,CAACW,EAAW,IAAIX,EAAI,EAAE,CAAA,EAEhChB,EAAiBkB,EAAAA,QAAQN,EAAGC,EAAI,CAAE,GAAGC,EAAa,OAAQc,CAAA,CAAW,CAAC,EACtE3B,EAAS,CAAE,KAAM,sBAAuB,IAAK,CAAA,EAAI,CAClD,EACA,CAACD,CAAgB,CAAA,EAGZ6B,EAAqBpB,cAAaiB,GAAkB,CACzD,MAAMd,EAAIP,EAAQ,QACZQ,EAAKN,EAAS,QAAQ,QACtBO,EAAcF,EAAE,MAAMC,CAAE,EAC9B,GAAI,CAACC,EAAa,OAClB,MAAMgB,EAAShB,EAAY,OAAO,OAAQE,GAAQU,EAAI,SAASV,EAAI,EAAE,CAAC,EACtEf,EAAS,CAAE,KAAM,eAAgB,OAAQ6B,EAAQ,CAClD,EAAG,CAAA,CAAE,EAECC,EAA0BtB,EAAAA,YAC9BiB,GAAkB,CAClB,MAAMd,EAAIP,EAAQ,QACZQ,EAAKN,EAAS,QAAQ,QACtBO,EAAcF,EAAE,MAAMC,CAAE,EAC9B,GAAI,CAACC,EAAa,OAClB,MAAMkB,EAAWlB,EAAY,OAAO,OAAQE,GAAQU,EAAI,SAASV,EAAI,EAAE,CAAC,EAClEiB,EAAOnB,EAAY,KACnBc,EAAYI,EAAS,IAAKhB,IAAS,CACxC,GAAGA,EACH,GAAIkB,EAAAA,cAAclB,EAAI,IAAI,EAC1B,OAAQ,CACP,GAAGA,EAAI,OACP,EAAG,KAAK,IAAIA,EAAI,OAAO,EAAI,EAAGiB,EAAK,SAAWjB,EAAI,OAAO,CAAC,EAC1D,EAAG,KAAK,IAAIA,EAAI,OAAO,EAAI,EAAGiB,EAAK,SAAWjB,EAAI,OAAO,CAAC,CAAA,CAC3D,EACC,EACFhB,EACCkB,EAAAA,QAAQN,EAAGC,EAAI,CACd,GAAGC,EACH,OAAQ,CAAC,GAAGA,EAAY,OAAQ,GAAGc,CAAS,CAAA,CAC5C,CAAA,EAEF3B,EAAS,CACR,KAAM,sBACN,IAAK2B,EAAU,IAAKZ,GAAQA,EAAI,EAAE,CAAA,CAClC,CACF,EACA,CAAChB,CAAgB,CAAA,EAGZmC,EAAc1B,EAAAA,YAAY,IAAM,CACrC,MAAM2B,EAAK7B,EAAS,QAAQ,UAC5B,GAAI6B,EAAG,SAAW,EAAG,OACrB,MAAMxB,EAAIP,EAAQ,QACZQ,EAAKN,EAAS,QAAQ,QACtBO,EAAcF,EAAE,MAAMC,CAAE,EAC9B,GAAI,CAACC,EAAa,OAClB,MAAMmB,EAAOnB,EAAY,KACnBc,EAAYQ,EAAG,IAAKpB,IAAS,CAClC,GAAGA,EACH,GAAIkB,EAAAA,cAAclB,EAAI,IAAI,EAC1B,OAAQ,CACP,GAAGA,EAAI,OACP,EAAG,KAAK,IAAIA,EAAI,OAAO,EAAI,EAAGiB,EAAK,SAAWjB,EAAI,OAAO,CAAC,EAC1D,EAAG,KAAK,IAAIA,EAAI,OAAO,EAAI,EAAGiB,EAAK,SAAWjB,EAAI,OAAO,CAAC,CAAA,CAC3D,EACC,EACFhB,EACCkB,EAAAA,QAAQN,EAAGC,EAAI,CACd,GAAGC,EACH,OAAQ,CAAC,GAAGA,EAAY,OAAQ,GAAGc,CAAS,CAAA,CAC5C,CAAA,EAEF3B,EAAS,CACR,KAAM,sBACN,IAAK2B,EAAU,IAAKZ,GAAQA,EAAI,EAAE,CAAA,CAClC,CACF,EAAG,CAAChB,CAAgB,CAAC,EAEfqC,EAAgB5B,EAAAA,YAAY,IAAM,OACvC,MAAMG,EAAIP,EAAQ,QACZQ,EAAKN,EAAS,QAAQ,QACtBO,EAAcF,EAAE,MAAMC,CAAE,EACxByB,EAAU,CACf,KAAMxB,EACHA,EAAY,OACXS,EAAAX,EAAE,MAAM,CAAC,IAAT,YAAAW,EAAY,OAAQ,CAAE,SAAU,GAAI,SAAU,EAAA,EAClD,OAAQ,CAAA,CAAC,EAEVvB,EAAiBuC,EAAAA,WAAW3B,EAAGC,EAAIyB,CAAO,CAAC,EAC3CrC,EAAS,CAAE,KAAM,aAAc,IAAKY,EAAK,EAAG,CAC7C,EAAG,CAACb,CAAgB,CAAC,EAEfwC,EAAmB/B,EAAAA,YAAY,IAAM,CAC1C,MAAMG,EAAIP,EAAQ,QACZQ,EAAKN,EAAS,QAAQ,QAC5B,GAAIK,EAAE,MAAM,QAAU,EAAG,OACzB,MAAM6B,EAAUC,EAAAA,WAAW9B,EAAGC,CAAE,EAChCb,EAAiByC,CAAO,EACxBxC,EAAS,CACR,KAAM,aACN,IAAK,KAAK,IAAIY,EAAI4B,EAAQ,MAAM,OAAS,CAAC,CAAA,CAC1C,CACF,EAAG,CAACzC,CAAgB,CAAC,EAGf2C,EAAiBC,EAAAA,QACtB,KAAO,CACN,MAAO,CACN,QAAST,EACT,UAAW,IAAM5B,EAAS,QAAQ,UAAU,OAAS,CAAA,EAEtD,OAAQ,CACP,QAAS,IAAMkB,EAAqBlB,EAAS,QAAQ,gBAAgB,EACrE,UAAW,IAAMA,EAAS,QAAQ,iBAAiB,OAAS,CAAA,EAE7D,KAAM,CACL,QAAS,IAAMsB,EAAmBtB,EAAS,QAAQ,gBAAgB,EACnE,UAAW,IAAMA,EAAS,QAAQ,iBAAiB,OAAS,CAAA,EAE7D,UAAW,CACV,QAAS,IACRwB,EAAwBxB,EAAS,QAAQ,gBAAgB,EAC1D,UAAW,IAAMA,EAAS,QAAQ,iBAAiB,OAAS,CAAA,EAE7D,QAAS,CACR,QAAS8B,EACT,UAAW,IAAM,EAAA,EAElB,WAAY,CACX,QAASG,EACT,UAAW,IAAMnC,EAAQ,QAAQ,MAAM,OAAS,CAAA,EAEjD,aAAc,CACb,QAAUwC,GACT5C,EAAS,CAAE,KAAM,sBAAuB,IAAK4C,EAAe,EAC7D,UAAW,IAAM,GACjB,gBAAkBA,GACjB,MAAM,QAAQA,CAAC,GAAKA,EAAE,MAAOC,GAAM,OAAOA,GAAM,QAAQ,CAAA,EAE1D,SAAU,CACT,QAAUD,GAAM5C,EAAS,CAAE,KAAM,aAAc,IAAK4C,EAAa,EACjE,UAAW,IAAM,GACjB,gBAAkBA,GAAM,OAAOA,GAAM,QAAA,EAEtC,aAAc,CACb,QAAUA,GAAM,CACf,KAAM,CAAE,QAAAnC,EAAS,QAAAC,CAAA,EAAYkC,EAI7BrC,EAAmBE,EAASC,CAAO,CACpC,EACA,UAAW,IAAM,GACjB,gBAAkBkC,GACjB,OAAOA,GAAM,UACbA,IAAM,MACN,YAAaA,GACb,OAAQA,EAA8B,SAAY,QAAA,CACpD,GAED,CACCV,EACAV,EACAI,EACAE,EACAM,EACAG,EACAhC,CAAA,CACD,EAYD,MAAO,CACN,YATmBoC,EAAAA,QACnB,KAAO,CACN,iBAAAzC,EACA,QAAAC,CAAA,GAED,CAACD,EAAkBC,CAAO,CAAA,EAK1B,eAAAuC,EACA,iBAAAxC,CAAA,CAEF,CCzKO,SAAS4C,GAAe,CAC9B,YAAAC,EACA,eAAAC,EACA,cAAAC,EACA,MAAAC,CACD,EAAgD,CAC/C,MAAMC,EAAe9C,EAAAA,OAAuB,IAAI,EAE1C,CAAE,KAAAP,EAAM,iBAAAC,EAAkB,sBAAAqD,CAAA,EAA0BC,EAAAA,eAAe,CACxE,YAAAN,CAAA,CACA,EAEK,CAACO,EAAQC,CAAS,EAAIC,EAAAA,SAC3BP,GAAiB,CAAA,CAAC,EAEbQ,EAAqBjD,cAAakD,GAA2B,CAC9DA,EAAQ,SAAW,GACvBH,EAAWI,GAAS,CAInB,GAAI,CAHcD,EAAQ,KAAK,CAAC,CAAE,GAAAtC,EAAI,MAAAwC,CAAA,IACrCA,IAAU,OAAYxC,KAAMuC,EAAOA,EAAKvC,CAAE,IAAMwC,CAAA,EAEjC,OAAOD,EACvB,MAAME,EAAO,CAAE,GAAGF,CAAA,EAClB,SAAW,CAAE,GAAAvC,EAAI,MAAAwC,CAAA,IAAWF,EACvBE,IAAU,OAAW,OAAOC,EAAKzC,CAAE,EAClCyC,EAAKzC,CAAE,EAAIwC,EAEjB,OAAOC,CACR,CAAC,CACF,EAAG,CAAA,CAAE,EAEC,CAAE,YAAAC,EAAa,eAAApB,CAAA,EAAmB7C,GAAe,CACtD,KAAAC,EACA,iBAAAC,CAAA,CACA,EAEKgE,EAAmD,CACxD,QAASD,EAAY,QACrB,GAAIZ,EAAQ,CAAE,MAAAA,GAAU,CAAA,CAAC,EAEpBc,EAAiBC,EAAAA,sBACtBnE,EACAC,EACAgE,CAAA,EAEKG,EAAgBC,EAAAA,qBAAqB,CAC1C,GAAGf,EACH,GAAGV,CAAA,CACH,EA0BD,MAAO,CAAE,QAxBOC,EAAAA,QACf,KAAO,CACN,KAAA7C,EACA,aAAcC,EACd,eAAAiD,EACA,aAAAG,EACA,eAAAa,EACA,cAAAE,EACA,OAAAZ,EACA,eAAgBG,EAChB,YAAAK,CAAA,GAED,CACChE,EACAC,EACAiD,EACAgB,EACAE,EACAZ,EACAG,EACAK,CAAA,CACD,CAGQ,CACV,CCrNO,MAAMM,EAAoB,CAEhC,UACC,kIAGD,YACC,6FAGD,OACC,gFAGD,KAAM,kIAGN,MACC,2MAGD,UACC,kJAGD,KAAM,iJAGN,KAAM,kJAGN,SAAU,gDAGV,SAAU,iDAGV,QAAS,sCAGT,WAAY,mBACb,EC7CaC,EAAc,CAAE,MAAO,EAAG,KAAM,IAAA,EAUtC,SAASC,EACfC,EACA5E,EACA6E,EACwB,CACxB,MAAO,CACN,SAAAD,EACA,MAAO,GACP,OAAA5E,EACA,GAAI6E,EAAQ,CAAE,MAAAA,CAAA,EAAU,CAAA,EACxB,IAAKH,EACL,MAAOA,EACP,OAAQA,EACR,KAAMA,CAAA,CAER,CCfO,SAASI,EACfC,EAAW,iBACC,CACZ,MAAO,CACN,MAAO,CACN,KAAM,CACL,MAAO,CACN,KAAM,CACL,OAAQC,EAAAA,gBAAgB,OACxB,MAAO,CAAE,MAAO,IAAK,KAAM,IAAA,EAC3B,OAAQ,CAAE,MAAO,GAAI,KAAM,IAAA,CAAK,EAEjC,OAAQ,CACP,IAAK,CAAE,MAAO,EAAG,KAAM,IAAA,EACvB,MAAO,CAAE,MAAO,EAAG,KAAM,IAAA,EACzB,OAAQ,CAAE,MAAO,EAAG,KAAM,IAAA,EAC1B,KAAM,CAAE,MAAO,EAAG,KAAM,IAAA,CAAK,CAC9B,EAED,MAAO,CACN,CACC,KAAM,CAAE,SAAU,EAAG,SAAU,CAAA,EAC/B,OAAQ,CACP,CACC,GAAI,GAAGD,CAAQ,cACf,KAAM,SACN,OAAQ,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAA,EAC/B,MAAOJ,EACNF,EAAkB,UAClB,aACA,OAAA,CACD,EAED,CACC,GAAI,GAAGM,CAAQ,gBACf,KAAM,SACN,OAAQ,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAA,EAC/B,MAAOJ,EACNF,EAAkB,YAClB,eACA,OAAA,CACD,EAED,CACC,GAAI,GAAGM,CAAQ,UACf,KAAM,SACN,OAAQ,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAA,EAC/B,MAAOJ,EACNF,EAAkB,OAClB,SACA,yBAAA,CACD,EAED,CACC,GAAI,GAAGM,CAAQ,QACf,KAAM,SACN,OAAQ,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAA,EAC/B,MAAOJ,EACNF,EAAkB,KAClB,OACA,sBAAA,CACD,EAED,CACC,GAAI,GAAGM,CAAQ,SACf,KAAM,SACN,OAAQ,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAA,EAC/B,MAAOJ,EACNF,EAAkB,MAClB,QACA,uBAAA,CACD,EAED,CACC,GAAI,GAAGM,CAAQ,aACf,KAAM,SACN,OAAQ,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAA,EAC/B,MAAOJ,EACNF,EAAkB,UAClB,YACA,qBAAA,CACD,EAED,CACC,GAAI,GAAGM,CAAQ,QACf,KAAM,SACN,OAAQ,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAA,EAC/B,MAAOJ,EACNF,EAAkB,KAClB,OACA,uBAAA,CACD,EAED,CACC,GAAI,GAAGM,CAAQ,QACf,KAAM,SACN,OAAQ,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAA,EAC/B,MAAOJ,EACNF,EAAkB,KAClB,OACA,uBAAA,CACD,CACD,CACD,CACD,CACD,CACD,EAED,QAAS,CAACQ,EAAAA,YAAY,CAAA,CAExB,CAUO,MAAMC,GAAiCJ,EAAA,ECxHvC,SAASK,EAAsBJ,EAAW,YAAwB,CACxE,MAAO,CACN,MAAO,CACN,KAAM,CACL,MAAO,CACN,KAAM,CACL,OAAQC,EAAAA,gBAAgB,OACxB,MAAO,CAAE,MAAO,GAAI,KAAM,IAAA,EAC1B,OAAQ,CAAE,MAAO,GAAI,KAAM,IAAA,CAAK,EAEjC,OAAQ,CACP,IAAK,CAAE,MAAO,EAAG,KAAM,IAAA,EACvB,MAAO,CAAE,MAAO,EAAG,KAAM,IAAA,EACzB,OAAQ,CAAE,MAAO,EAAG,KAAM,IAAA,EAC1B,KAAM,CAAE,MAAO,EAAG,KAAM,IAAA,CAAK,CAC9B,EAED,MAAO,CACN,CACC,KAAM,CAAE,SAAU,EAAG,SAAU,CAAA,EAC/B,OAAQ,CACP,CACC,GAAI,GAAGD,CAAQ,QACf,KAAM,SACN,OAAQ,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAA,EAC/B,MAAOJ,EAAIF,EAAkB,KAAM,MAAM,CAAA,EAE1C,CACC,GAAI,GAAGM,CAAQ,SACf,KAAM,SACN,OAAQ,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAA,EAC/B,MAAOJ,EAAIF,EAAkB,MAAO,OAAO,CAAA,EAE5C,CACC,GAAI,GAAGM,CAAQ,aACf,KAAM,SACN,OAAQ,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAA,EAC/B,MAAOJ,EAAIF,EAAkB,UAAW,WAAW,CAAA,CACpD,CACD,CACD,CACD,CACD,EAED,QAAS,CAACQ,EAAAA,YAAY,CAAA,CAExB,CAUO,MAAMG,GAA6BD,EAAA,ECxDnC,SAASE,EAAoBN,EAAW,UAAsB,CACpE,MAAO,CACN,MAAO,CACN,KAAM,CACL,MAAO,CACN,KAAM,CACL,OAAQC,EAAAA,gBAAgB,OACxB,MAAO,CAAE,MAAO,GAAI,KAAM,IAAA,EAC1B,OAAQ,CAAE,MAAO,GAAI,KAAM,IAAA,CAAK,EAEjC,OAAQ,CACP,IAAK,CAAE,MAAO,EAAG,KAAM,IAAA,EACvB,MAAO,CAAE,MAAO,EAAG,KAAM,IAAA,EACzB,OAAQ,CAAE,MAAO,EAAG,KAAM,IAAA,EAC1B,KAAM,CAAE,MAAO,EAAG,KAAM,IAAA,CAAK,CAC9B,EAED,MAAO,CACN,CACC,KAAM,CAAE,SAAU,EAAG,SAAU,CAAA,EAC/B,OAAQ,CACP,CACC,GAAI,GAAGD,CAAQ,QACf,KAAM,SACN,OAAQ,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAA,EAC/B,MAAOJ,EAAIF,EAAkB,KAAM,MAAM,CAAA,EAE1C,CACC,GAAI,GAAGM,CAAQ,QACf,KAAM,SACN,OAAQ,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAA,EAC/B,MAAOJ,EAAIF,EAAkB,KAAM,MAAM,CAAA,CAC1C,CACD,CACD,CACD,CACD,EAED,QAAS,CAACQ,EAAAA,YAAY,CAAA,CAExB,CAUO,MAAMK,GAA2BD,EAAA,EC3DlCE,EAAa,CAClB,KAAM,CACL,OAAQP,EAAAA,gBAAgB,MAGzB,EACA,OAAQ,CACP,IAAK,CAAE,MAAO,EAAG,KAAM,IAAA,EACvB,MAAO,CAAE,MAAO,EAAG,KAAM,IAAA,EACzB,OAAQ,CAAE,MAAO,EAAG,KAAM,IAAA,EAC1B,KAAM,CAAE,MAAO,EAAG,KAAM,IAAA,CAAc,EAEvC,WAAY,GACZ,UAAW,EACZ,EAGMQ,GAAsB,CAC3B,OAAQD,EAAW,OACnB,WAAYA,EAAW,WACvB,UAAWA,EAAW,SACvB,EAsBaE,GAA+B,CAC3C,MAAO,CACN,KAAM,CACL,MAAO,CACN,GAAGD,GACH,KAAM,CACL,OAAQR,EAAAA,gBAAgB,OACxB,MAAO,CAAE,MAAO,IAAK,KAAM,IAAA,EAC3B,OAAQ,CAAE,MAAO,EAAG,KAAM,IAAA,CAAc,CACzC,EAED,MAAO,CACN,CACC,KAAM,CACL,SAAU,GACV,SAAU,EACV,KAAM,CACL,EAAG,CAAE,MAAO,EAAG,KAAM,IAAA,EACrB,EAAG,CAAE,MAAO,EAAG,KAAM,IAAA,EACrB,EAAG,CAAE,MAAO,EAAG,KAAM,IAAA,EACrB,GAAI,CAAE,MAAO,EAAG,KAAM,IAAA,CAAc,CACrC,EAED,OAAQ,CAEP,CACC,GAAI,iBACJ,KAAM,OACN,OAAQ,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAA,EAC/B,UAAW,IACX,SAAU,CAAE,SAAU,EAAA,EACtB,MAAO,CAAE,WAAY,SAAU,SAAU,QAAA,CAAS,EAEnD,CACC,GAAGU,EAAAA,iBAAiB,iBAAkB,UAAU,EAChD,OAAQ,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAA,CAAE,EAElC,CACC,GAAI,mBACJ,KAAM,UACN,OAAQ,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAA,EAC/B,MAAO,CAAE,QAAS,WAAY,KAAM,EAAG,IAAK,CAAA,CAAE,EAG/C,CACC,GAAI,iBACJ,KAAM,OACN,OAAQ,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAA,EAC/B,UAAW,IACX,SAAU,CAAE,SAAU,EAAA,EACtB,MAAO,CAAE,WAAY,SAAU,SAAU,QAAA,CAAS,EAEnD,CACC,GAAGA,EAAAA,iBAAiB,iBAAkB,UAAU,EAChD,OAAQ,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAA,CAAE,EAElC,CACC,GAAI,mBACJ,KAAM,UACN,OAAQ,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAA,EAC/B,MAAO,CAAE,QAAS,WAAY,KAAM,EAAG,IAAK,CAAA,CAAE,EAG/C,CACC,GAAI,iBACJ,KAAM,OACN,OAAQ,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAA,EAC/B,UAAW,IACX,SAAU,CAAE,SAAU,EAAA,EACtB,MAAO,CAAE,WAAY,SAAU,SAAU,QAAA,CAAS,EAEnD,CACC,GAAGA,EAAAA,iBAAiB,iBAAkB,UAAU,EAChD,OAAQ,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAA,CAAE,EAElC,CACC,GAAI,mBACJ,KAAM,UACN,OAAQ,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAA,EAC/B,MAAO,CAAE,QAAS,WAAY,KAAM,EAAG,IAAK,CAAA,CAAE,EAG/C,CACC,GAAI,iBACJ,KAAM,OACN,OAAQ,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAA,EAC/B,UAAW,IACX,SAAU,CAAE,SAAU,EAAA,EACtB,MAAO,CAAE,WAAY,SAAU,SAAU,QAAA,CAAS,EAEnD,CACC,GAAGA,EAAAA,iBAAiB,iBAAkB,UAAU,EAChD,OAAQ,CAAE,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,CAAA,CAAE,EAEnC,CACC,GAAI,mBACJ,KAAM,UACN,OAAQ,CAAE,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,CAAA,EAChC,MAAO,CAAE,QAAS,WAAY,KAAM,EAAG,IAAK,CAAA,CAAE,CAC/C,CACD,CACD,CACD,CACD,EAED,QAAS,CAAC7F,EAAAA,WAAY8F,EAAAA,aAAa,CACpC,ECxIO,SAASC,EAA2B7E,EAG7B,CACb,KAAM,CAAE,QAAAP,EAAS,UAAAqF,CAAA,EAAc9E,EACzB+E,EAAetF,IAAY,OAAY,OAAOA,EAAU,CAAC,EAAI,IAC7DuF,EAAaF,IAAc,OAAY,OAAOA,CAAS,EAAI,IAEjE,MAAO,CACN,MAAO,CACN,KAAM,CACL,MAAO,CACN,KAAM,CACL,OAAQb,EAAAA,gBAAgB,OACxB,MAAO,CAAE,MAAO,IAAK,KAAM,IAAA,EAC3B,OAAQ,CAAE,MAAO,GAAI,KAAM,IAAA,CAAK,EAEjC,OAAQ,CACP,IAAK,CAAE,MAAO,EAAG,KAAM,IAAA,EACvB,MAAO,CAAE,MAAO,EAAG,KAAM,IAAA,EACzB,OAAQ,CAAE,MAAO,EAAG,KAAM,IAAA,EAC1B,KAAM,CAAE,MAAO,EAAG,KAAM,IAAA,CAAK,CAC9B,EAED,MAAO,CACN,CACC,KAAM,CACL,SAAU,EACV,SAAU,EACV,KAAM,CACL,EAAG,CAAE,MAAO,GAAI,KAAM,IAAA,CAAK,CAC5B,EAED,OAAQ,CACP,CACC,GAAI,YACJ,KAAM,SACN,OAAQ,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAA,EAC/B,MAAO,CACN,SAAUP,EAAkB,SAC5B,MAAO,GACP,OAAQ,WAAA,CACT,EAED,CACC,GAAI,eACJ,KAAM,OACN,OAAQ,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAA,EAC/B,SAAU,CAAE,SAAU,EAAA,EACtB,UAAWqB,EACX,MAAO,CACN,WAAY,QACZ,SAAU,SACV,SAAU,CAAE,MAAO,GAAI,KAAM,IAAA,CAAc,CAC5C,EAED,CACC,GAAI,iBACJ,KAAM,OACN,OAAQ,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAA,EAC/B,SAAU,CAAE,SAAU,EAAA,EACtB,UAAW,IACX,MAAO,CACN,WAAY,SACZ,SAAU,SACV,SAAU,CAAE,MAAO,GAAI,KAAM,IAAA,CAAc,CAC5C,EAED,CACC,GAAI,aACJ,KAAM,OACN,OAAQ,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAA,EAC/B,SAAU,CAAE,SAAU,EAAA,EACtB,UAAWC,EACX,MAAO,CACN,WAAY,OACZ,SAAU,SACV,SAAU,CAAE,MAAO,GAAI,KAAM,IAAA,CAAc,CAC5C,EAED,CACC,GAAI,YACJ,KAAM,SACN,OAAQ,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAA,EAC/B,MAAO,CACN,SAAUtB,EAAkB,SAC5B,MAAO,GACP,OAAQ,WAAA,CACT,EAED,CACC,GAAI,WACJ,KAAM,SACN,OAAQ,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAA,EAC/B,MAAO,CACN,SAAUA,EAAkB,QAC5B,MAAO,GACP,OAAQ,UAAA,CACT,EAED,CACC,GAAI,cACJ,KAAM,SACN,OAAQ,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAA,EAC/B,MAAO,CACN,SAAUA,EAAkB,WAC5B,MAAO,GACP,OAAQ,aAAA,CACT,CACD,CACD,CACD,CACD,CACD,EAED,QAAS,CAACQ,EAAAA,aAAcpF,EAAAA,UAAU,CAAA,CAEpC,CAUO,MAAMmG,GAAkCJ,EAA2B,CAAA,CAAE,ECnIrE,SAASK,EAA4BlB,EAAW,YAAwB,CAC9E,MAAO,CACN,MAAO,CACN,KAAM,CACL,MAAO,CACN,KAAM,CACL,OAAQC,EAAAA,gBAAgB,OACxB,MAAO,CAAE,MAAO,GAAI,KAAM,IAAA,EAC1B,OAAQ,CAAE,MAAO,GAAI,KAAM,IAAA,CAAK,EAEjC,OAAQ,CACP,IAAK,CAAE,MAAO,EAAG,KAAM,IAAA,EACvB,MAAO,CAAE,MAAO,EAAG,KAAM,IAAA,EACzB,OAAQ,CAAE,MAAO,EAAG,KAAM,IAAA,EAC1B,KAAM,CAAE,MAAO,EAAG,KAAM,IAAA,CAAK,CAC9B,EAED,MAAO,CACN,CACC,KAAM,CAAE,SAAU,EAAG,SAAU,CAAA,EAC/B,OAAQ,CACP,CACC,GAAI,GAAGD,CAAQ,cACf,KAAM,SACN,OAAQ,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAA,EAC/B,MAAOJ,EAAIF,EAAkB,UAAW,YAAY,CAAA,EAErD,CACC,GAAI,GAAGM,CAAQ,gBACf,KAAM,SACN,OAAQ,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAA,EAC/B,MAAOJ,EAAIF,EAAkB,YAAa,cAAc,CAAA,EAEzD,CACC,GAAI,GAAGM,CAAQ,UACf,KAAM,SACN,OAAQ,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAA,EAC/B,MAAOJ,EAAIF,EAAkB,OAAQ,QAAQ,CAAA,CAC9C,CACD,CACD,CACD,CACD,EAED,QAAS,CAACQ,EAAAA,YAAY,CAAA,CAExB,CAUO,MAAMiB,GAAmCD,EAAA,ECrCnCE,EAAY,CAAC,CACzB,SAAAC,EAAW,CAAA,EACX,UAAAC,EACA,MAAAC,CACD,IAEEC,EAAAA,IAAC,MAAA,CACA,UAAW,GAAGC,SAAO,SAAS,GAAGH,EAAY,IAAIA,CAAS,GAAK,EAAE,GACjE,MAAAC,EACA,cAAY,aAEX,SAAAF,EAAS,IAAI,CAACK,EAASC,IAAiB,CACxC,MAAMC,EACLC,EAAAA,eAAeH,CAAO,GAAKA,EAAQ,KAAO,KACvCA,EAAQ,IACR,WAAWC,CAAY,GAC3B,cACEG,WAAA,CACC,SAAA,CAAAH,EAAe,SAAMI,EAAAA,iBAAA,CAAA,CAAiB,EACvCP,EAAAA,IAAC,MAAA,CAAI,UAAWC,EAAAA,OAAO,QAAU,SAAAC,CAAA,CAAQ,CAAA,CAAA,EAF3BE,CAGf,CAEF,CAAC,CAAA,CAAA,EAKJR,EAAU,YAAc,0GCblBY,EAAYC,EAAAA,KACjB,CAAC,CAAE,KAAAC,EAAM,MAAAC,EAAO,OAAAvD,EAAQ,eAAAN,KAAqC,CAC5D,KAAM,CAAE,QAAA8D,EAAS,eAAAC,CAAA,EAAmBC,EAAAA,YACnCH,EACAD,EAAK,KACLK,EAAAA,WAAA,EAGKjD,EAA6CV,EAChD,CAAE,IAAM4D,GAAS5D,EAAO4D,CAAI,GAAK,KAAM,IAAK,IAAM,CAAC,GACnD,OAEGC,EAAgBP,EAAK,OAAO,OAChCQ,GAAU,CAACC,EAAAA,kBAAkBD,EAAM,cAAepD,CAAc,CAAA,EAGlE,OACCkC,EAAAA,IAAC,MAAA,CACA,MAAO,CACN,SAAU,WACV,MAAO,GAAGY,EAAQ,OAAO,KAAK,KAC9B,OAAQ,GAAGA,EAAQ,OAAO,MAAM,KAChC,gBAAiB,MAAA,EAGlB,SAAAZ,EAAAA,IAACoB,EAAAA,WAAA,CACA,OAAQH,EACR,eAAAnE,EACA,KAAMuE,EAAAA,SAAS,KACf,OAAQjE,GAAU,CAAA,EAClB,cAAesD,EAAK,cACpB,eAAAG,EACA,WAAY,GACZ,WAAY,EAAA,CAAA,CACb,CAAA,CAGH,CACD,EAEAL,EAAU,YAAc,YAIxB,MAAMc,EAAgBC,EAAAA,WACrB,CAAC,CAAE,KAAA3H,EAAM,OAAAwD,EAAQ,eAAAN,EAAgB,cAAA0E,EAAe,UAAA1B,EAAW,MAAAC,CAAA,EAAS0B,IAAQ,CAE3E,MAAMC,EAAiBC,EAAAA,sBAAsB/H,EAAM4H,CAAa,EAK1DI,EAAmBC,EAAAA,aACxBH,EACAF,GAAA,YAAAA,EAAe,MAAA,EAIhBM,OAAAA,EAAAA,UAAU,IAAM,UACf1G,EAAA,SAAS,eAAe,2BAA2B,IAAnD,MAAAA,EAAsD,UACtD2G,EAAA,SAAS,eAAe,2BAA2B,IAAnD,MAAAA,EAAsD,SAEtD,MAAMC,EAAY,SAAS,cAAc,OAAO,EAChDA,EAAU,GAAK,4BACfA,EAAU,YAAcJ,EACxB,SAAS,KAAK,YAAYI,CAAS,EAEnC,MAAMC,EAAkB,SAAS,cAAc,OAAO,EACtD,OAAAA,EAAgB,GAAK,4BACrBA,EAAgB,YAAcL,EAC9B,SAAS,KAAK,YAAYK,CAAe,EAElC,IAAM,UACZ7G,EAAA,SAAS,eAAe,2BAA2B,IAAnD,MAAAA,EAAsD,UACtD2G,EAAA,SAAS,eAAe,2BAA2B,IAAnD,MAAAA,EAAsD,QACvD,CACD,EAAG,CAACH,CAAgB,CAAC,EAGpB5B,EAAAA,IAAC,MAAA,CACA,IAAAyB,EACA,UAAW,CAACxB,EAAO,eAAgBH,CAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,EACtE,MAAAC,EAEC,SAAAnG,EAAK,MAAM,IAAI,CAAC8G,EAAMwB,IAAU,CAChC,MAAMC,EACLzB,EAAK,KACJA,EAAK,OAAO,IAAKjG,GAAMA,EAAE,EAAE,EAAE,KAAK,GAAG,GAAK,QAAQyH,CAAK,IACzD,OACClC,EAAAA,IAAC,MAAA,CAEA,UACCkC,EAAQtI,EAAK,MAAM,OAAS,EAAIqG,EAAO,UAAY,OAGpD,SAAAD,EAAAA,IAACQ,EAAA,CACA,KAAAE,EACA,MAAOgB,EACP,OAAAtE,EACA,eAAAN,CAAA,CAAA,CACD,EAVKqF,CAAA,CAaR,CAAC,CAAA,CAAA,CAGJ,CACD,EAEAb,EAAc,YAAc,YAarB,MAAMc,GAAY3B,EAAAA,KAAKa,CAAa,EC3K3C,SAASe,GAAWC,EAAqB,CACxC,OAAOA,EACL,QAAQ,KAAM,OAAO,EACrB,QAAQ,KAAM,MAAM,EACpB,QAAQ,KAAM,MAAM,EACpB,QAAQ,KAAM,QAAQ,CACzB,CASO,SAASC,GACfC,EACAhI,EAKO,CACP,MAAM8D,EAA0B,SAAS,MAGnCmE,EAAS,SAAS,cAAc,QAAQ,EAC9CA,EAAO,MAAM,QACZ,kGACD,SAAS,KAAK,YAAYA,CAAM,EAEhC,MAAMC,EAAYD,EAAO,cACnBE,EAAYF,EAAO,kBAAmBC,GAAA,YAAAA,EAAW,UACvD,GAAI,CAACC,GAAa,CAACD,EAAW,CAC7B,SAAS,KAAK,YAAYD,CAAM,EAChC,MACD,CAGA,MAAMG,EAAY,MAAM,KAAK,SAAS,iBAAiB,OAAO,CAAC,EAC7D,IAAKC,GAAMA,EAAE,SAAS,EACtB,KAAK;AAAA,CAAI,EAGLC,EAAW,MAAM,KACtB,SAAS,iBAAiB,wBAAwB,CAAA,EAEjD,IAAKC,GAAMA,EAAE,SAAS,EACtB,KAAK;AAAA,CAAI,EAGLC,EAAcR,EAAQ,UAE5BG,EAAU,KAAA,EACVA,EAAU,MACT,6DAA6DN,GAAW/D,CAAK,CAAC,WAAWwE,CAAQ,GAAGF,CAAS,gHAAgHI,CAAW,gBAAA,EAEzOL,EAAU,MAAA,EAEV,MAAMM,EAAU,IAAM,CACjB,SAAS,KAAK,SAASR,CAAM,GAChC,SAAS,KAAK,YAAYA,CAAM,CAElC,EAEAC,EAAU,iBAAiB,aAAc,IAAM,CAE9CO,EAAA,CACD,CAAC,EAKD,WAAW,IAAM,CAChBP,EAAU,MAAA,EACVA,EAAU,MAAA,CACX,EAAG,CAAC,CACL,CC5DO,SAASQ,GACftJ,EACAwD,EACAN,EACA0E,EACO,CACP,MAAM2B,EAAY,SAAS,cAAc,KAAK,EAC9CA,EAAU,MAAM,QAAU,8CAC1B,SAAS,KAAK,YAAYA,CAAS,EACnC,MAAMC,EAAOC,EAAAA,WAAWF,CAAS,EACjCG,EAAAA,UAAU,IAAM,CACfF,EAAK,OACJG,EAAAA,cAAcnB,GAAW,CAAE,KAAAxI,EAAM,OAAAwD,EAAQ,eAAAN,EAAgB,cAAA0E,EAAe,CAAA,CAE1E,CAAC,EACDe,GAAaY,CAAS,EACtBC,EAAK,QAAA,EACL,SAAS,KAAK,YAAYD,CAAS,CACpC,CAaO,SAASK,EACfC,EACAjC,EACO,CACP0B,GACCO,EAAQ,KACRA,EAAQ,OACRA,EAAQ,eACRjC,CAAA,CAEF,CCrBO,MAAMkC,EAAwB,CAAC,CACrC,QAAAzJ,EACA,UAAAqF,EACA,aAAAqE,EACA,UAAAC,EACA,aAAAC,EACA,cAAAC,EAAgB,EACjB,IAEEC,EAAAA,KAAAzD,WAAA,CACC,SAAA,CAAAN,EAAAA,IAACgE,EAAAA,iBAAA,CACA,KAAMhE,EAAAA,IAACiE,EAAAA,gBAAA,CAAgB,cAAY,MAAA,CAAO,EAC1C,MAAM,SACN,MAAM,SACN,QAAS,IAAMN,EAAa,KAAK,IAAI,EAAG1J,EAAU,CAAC,CAAC,EACpD,SAAUA,IAAY,EACtB,wBAAuB,EAAA,CAAA,EAExB8J,EAAAA,KAAC,OAAA,CAAK,UAAW9D,EAAAA,OAAO,aACtB,SAAA,CAAAhG,EAAU,EAAE,MAAIqF,CAAA,EAClB,EACAU,EAAAA,IAACgE,EAAAA,iBAAA,CACA,KAAMhE,EAAAA,IAACkE,EAAAA,iBAAA,CAAiB,cAAY,MAAA,CAAO,EAC3C,MAAM,SACN,MAAM,SACN,QAAS,IAAMP,EAAa,KAAK,IAAIrE,EAAY,EAAGrF,EAAU,CAAC,CAAC,EAChE,SAAUA,GAAWqF,EAAY,EACjC,wBAAuB,EAAA,CAAA,EAEvBsE,IAAc,QACd5D,EAAAA,IAACgE,EAAAA,iBAAA,CACA,KAAMhE,EAAAA,IAACmE,EAAAA,YAAA,CAAY,cAAY,MAAA,CAAO,EACtC,MAAM,SACN,MAAM,SACN,QAASP,EACT,wBAAuB,EAAA,CAAA,EAGxBC,IAAiB,QACjB7D,EAAAA,IAACgE,EAAAA,iBAAA,CACA,KAAMhE,EAAAA,IAACoE,EAAAA,eAAA,CAAe,cAAY,MAAA,CAAO,EACzC,MAAM,SACN,MAAM,SACN,QAASP,EACT,SAAU,CAACC,EACX,wBAAuB,EAAA,CAAA,CACxB,EAEF,EAIFJ,EAAsB,YAAc,wBCtC7B,SAASW,GAA4B,CAC3C,QAAAZ,EACA,iBAAAa,EACA,QAAAC,CACD,EAAoD,CACnD,KAAM,CAAE,cAAAvG,GAAkByF,EACpB,CAAE,KAAA7J,EAAM,aAAA4K,CAAA,EAAiBf,EAGzBxJ,EAFcwJ,EAAQ,YAEA,QAEtB/C,EAAO9G,EAAK,MAAMK,CAAO,GAAKL,EAAK,MAAM,CAAC,EAE1CiG,EAAwB,CAC7BG,EAAAA,IAACyE,EAAAA,oBAAA,CAEA,cAAAzG,EACA,iBAAAsG,EACA,QAASC,IAAY,IAAMf,EAAUC,CAAO,EAAA,EAHxC,QAAA,EAKLzD,EAAAA,IAAC0E,EAAAA,qBAAA,CAEA,MAAO9K,EAAK,MACZ,cAAgB+G,GAAU6D,EAAa,CAAE,GAAG5K,EAAM,MAAA+G,EAAO,CAAA,EAFrD,OAAA,EAILX,EAAAA,IAAC2E,EAAAA,oBAAA,CAEA,KAAMjE,EAAK,KACX,aAAe5E,GAAS,CACvB,MAAM8I,EAAWhL,EAAK,MAAM,IAAI,CAAC8C,EAAGrB,IACnCA,IAAMpB,EAAU,CAAE,GAAGyC,EAAG,KAAAZ,GAASY,CAAA,EAElC8H,EAAa,CAAE,GAAG5K,EAAM,MAAOgL,EAAU,CAC1C,CAAA,EAPI,MAAA,CAQL,EAGD,OAAA/E,EAAS,KACRG,EAAAA,IAAC0D,EAAA,CAEA,QAAAzJ,EACA,UAAWL,EAAK,MAAM,OACtB,aAAeiL,GAAQ7G,EAAc,QAAQ,WAAY6G,CAAG,EAC5D,UAAW,IAAM7G,EAAc,QAAQ,SAAS,EAChD,aAAc,IAAMA,EAAc,QAAQ,YAAY,EACtD,cAAepE,EAAK,MAAM,OAAS,CAAA,EAN/B,UAAA,CAOL,EAGMiG,CACR,CC1DO,MAAMiF,EAAmC,CAAC,CAChD,QAAArB,EACA,SAAAsB,EACA,WAAAC,EACA,OAAAC,EACA,iBAAAX,CACD,IAA6C,CAC5C,KAAM,CAAE,KAAA1K,EAAM,aAAAqD,CAAA,EAAiBwG,EACzB7F,EAAc6F,EAAQ,YACtByB,EAAc/K,EAAAA,OAAoB,IAAI,EAEtCH,EAAmB4D,EAAY,kBAAoB,CAAA,EAInDuH,EAAoB1I,EAAAA,QAAQ,IAAM,CACvC,MAAM2I,EAAW,IAAI,IACpBxL,EAAK,MAAM,QAAS8C,GAAMA,EAAE,OAAO,IAAKjC,GAAMA,EAAE,EAAE,CAAC,CAAA,EAEpD,OAAOT,EAAiB,OAAQkB,GAAekK,EAAS,IAAIlK,CAAE,CAAC,CAChE,EAAG,CAAClB,EAAkBJ,CAAI,CAAC,EAErByL,EACLC,EAAAA,mBAAmBrI,GAAgBiI,EAAaC,CAAiB,GAAK,KAEvE,OACCnF,EAAAA,IAACuF,EAAAA,0BAAA,CACA,qBAAAF,EACA,WAAAL,EACA,OAAAC,EAEA,SAAAjF,EAAAA,IAACwF,EAAAA,mBAAA,CACA,MAAOC,EAAAA,kCAAkC,CACxC,QAAAhC,EACA,SAAAsB,EACA,iBAAAT,CAAA,CACA,EACD,cAAgBoB,GAAMA,EAAE,gBAAA,CAAgB,CAAA,CACzC,CAAA,CAGH,EAEAZ,EAAiC,YAChC,mCClCM,SAASa,GAAsB,CACrC,QAAAlC,EACA,SAAAsB,EACA,aAAAa,EACA,kBAAAC,EACA,iBAAAvB,CACD,EAA+C,CAM9C,MAAO,CACN,CACC,MAAO,QACP,MAAO,OACP,SATkBb,EAAQ,YACS,kBAAoB,CAAA,GAEnB,OAAS,EAO5CzD,MAAC8F,EAAAA,0BAAA,CAA0B,QAAArC,EAAkB,SAAAsB,CAAA,CAAoB,EAEjE/E,EAAAA,IAAC+F,EAAAA,aAAA,CAAa,QAAAtC,CAAA,CAAkB,CAAA,EAGlC,CACC,MAAO,SACP,MAAO,QACP,QACCzD,EAAAA,IAACgG,EAAAA,mBAAA,CACA,QAAAvC,EACA,aAAAmC,EACA,kBAAAC,EACA,iBAAAvB,CAAA,CAAA,CACD,EAGF,CACC,MAAO,QACP,MAAO,MACP,QAAStE,EAAAA,IAACiG,aAAA,CAAW,QAAAxC,CAAA,CAAkB,CAAA,CACxC,CAEF,8HCpDayC,EAAU,CAAC,CAAE,KAAAC,EAAM,WAAAC,EAAY,UAAAtG,KAA8B,OACzE,MAAMuG,EAAmBD,KAAchL,EAAA+K,EAAK,CAAC,IAAN,YAAA/K,EAAS,QAAS,GAEzD,OACC4E,EAAAA,IAAC,MAAA,CACA,UAAW,GAAGC,EAAO,SAAS,IAAIH,GAAa,EAAE,GAChD,GAAGwG,EAAAA,qBAEJ,SAAAvC,EAAAA,KAACwC,EAAAA,KAAA,CAAK,aAAcF,EAAkB,QAAQ,UAC7C,SAAA,CAAArG,EAAAA,IAACwG,EAAAA,UAAS,UAAWvG,EAAO,UAC1B,SAAAkG,EAAK,IAAKM,GACVzG,EAAAA,IAAC0G,cAAA,CAA4B,MAAOD,EAAI,MACtC,SAAAA,EAAI,OADYA,EAAI,KAEtB,CACA,EACF,EACCN,EAAK,IAAKM,GACVzG,EAAAA,IAAC2G,EAAAA,YAAA,CAEA,MAAOF,EAAI,MACX,UAAWxG,EAAO,WAEjB,SAAAwG,EAAI,OAAA,EAJAA,EAAI,KAAA,CAMV,CAAA,CAAA,CACF,CAAA,CAAA,CAGH,EAEAP,EAAQ,YAAc,UCpBtB,MAAMU,GAAiC,CACtC,iBAAkB,CAAA,EAClB,QAAS,CACV,EASO,SAASC,GAAe,CAC9B,MAAAC,EACA,OAAAC,EACA,aAAAC,EACA,SAAAC,EACA,WAAAjC,EACA,mBAAAkC,EACA,QAAAC,EACA,uBAAAC,EACA,MAAArH,EACA,QAAA0D,CACD,EAAwB,CAEvB,MAAM3G,EAAiBL,EAAAA,QACtB,IAAMzD,EAAqB,CAAC,GAAG+N,EAAO,QAAS,GAAIC,GAAgB,CAAA,CAAG,CAAC,EACvE,CAACD,EAAO,QAASC,CAAY,CAAA,EAGxBK,EAAqBlN,EAAAA,OAA8B,IAAI,EAKvDmN,EAAuB7K,EAAAA,QAC5B,KAAO,CACN,IAAMuE,IAGAyC,EAAQ,KACNA,EAAQ,eAAe,IAAIzC,CAAI,GAEvC,IAAK,CAACA,EAAMtD,IAAU+F,EAAQ,eAAe,IAAIzC,EAAMtD,CAAK,CAAA,GAE7D,CAAC+F,EAAQ,eAAgBA,EAAQ,IAAI,CAAA,EAGhC8D,EAAgB9K,EAAAA,QACrB,KAAO,CACN,KAAMsK,EAAO,MAAM,KACnB,aAAc,IAAM,CAAC,EACrB,eAAAjK,EACA,aAAcuK,EACd,eAAgBC,EAChB,cAAe7D,EAAQ,cACvB,YAAamD,GACb,OAAQ,CAAA,CAAC,GAEV,CACCG,EAAO,MAAM,KACbjK,EACAwK,EACA7D,EAAQ,aAAA,CACT,EAIK,CAAC+D,EAAMC,CAAO,EAAInK,EAAAA,SAAS,EAAG,EAC9BoK,EAAiBvN,EAAAA,OAAO,CAAE,EAAG,EAAG,KAAM,GAAK,EAC3CwN,EAA2BjC,GAA0B,CAC1DA,EAAE,eAAA,EACFA,EAAE,gBAAA,EACFgC,EAAe,QAAU,CAAE,EAAGhC,EAAE,QAAS,KAAA8B,CAAA,EACzC,MAAMI,EAAcC,GAAqB,CACxC,MAAMC,EAAKD,EAAG,QAAUH,EAAe,QAAQ,EAC/CD,EACC,KAAK,IAAI,IAAM,KAAK,IAAI,EAAGC,EAAe,QAAQ,KAAOI,EAAK,GAAG,CAAC,CAAA,CAEpE,EACMC,EAAW,IAAM,CACtB,OAAO,oBAAoB,cAAeH,CAAU,EACpD,OAAO,oBAAoB,YAAaG,CAAQ,CACjD,EACA,OAAO,iBAAiB,cAAeH,CAAU,EACjD,OAAO,iBAAiB,YAAaG,CAAQ,CAC9C,EAEA,OACChE,EAAAA,KAAC,MAAA,CACA,cAAeqD,EACd,GAAGd,EAAAA,qBACJ,MAAO,CACN,SAAU,QACV,KAAMW,EAAS,EACf,IAAKA,EAAS,EACd,OAAQjC,EAAa,MAAU,KAC/B,WAAY,OACZ,OAAQ,oBACR,aAAc,EACd,UAAWA,EACR,6BACA,6BACH,GAAGjF,CAAA,EAIJ,SAAA,CAAAgE,EAAAA,KAAC,MAAA,CACA,MAAO,CACN,QAAS,OACT,WAAY,SACZ,eAAgB,gBAChB,QAAS,kBACT,WAAY,UACZ,aAAc,oBACd,aAAc,cACd,OAAQ,OACR,WAAY,OACZ,IAAK,CAAA,EAEN,cAAemD,EAEf,SAAA,CAAAlH,EAAAA,IAAC,OAAA,CAAK,MAAO,CAAE,SAAU,GAAI,MAAO,OAAQ,WAAY,QAAA,EACtD,SAAA8G,CAAA,CACF,EACA9G,EAAAA,IAAC,SAAA,CACA,KAAK,SACL,cAAgB0F,GAAMA,EAAE,gBAAA,EACxB,QAASyB,EACT,MAAO,CACN,WAAY,OACZ,OAAQ,OACR,OAAQ,UACR,SAAU,GACV,MAAO,UACP,QAAS,QACT,WAAY,CAAA,EAEb,SAAA,GAAA,CAAA,CAED,CAAA,CAAA,QAIA,MAAA,CAAI,MAAO,CAAE,cAAenC,EAAa,OAAS,OAAQ,KAAAwC,CAAA,EAC1D,eAACQ,EAAAA,KAAA,CAAK,KAAM3G,EAAAA,SAAS,KAAM,QAASkG,EAAe,EACpD,EAGAvH,EAAAA,IAAC,MAAA,CACA,cAAe2H,EACf,MAAO,CACN,SAAU,WACV,OAAQ,EACR,MAAO,EACP,MAAO,GACP,OAAQ,GACR,OAAQ,YACR,WAAY,wDACZ,aAAc,WAAA,CACf,CAAA,CACD,CAAA,CAAA,CAGH"}
|