@tatamicks/core 0.3.1 → 1.0.1
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/README.md +518 -81
- package/dist/PalettePanel-CtXsH6Cb.js +5137 -0
- package/dist/PalettePanel-CtXsH6Cb.js.map +1 -0
- package/dist/PalettePanel-Dipvtj7D.cjs +9 -0
- package/dist/PalettePanel-Dipvtj7D.cjs.map +1 -0
- package/dist/PalettePanel.css +1 -0
- package/dist/canvas.cjs +1 -0
- package/dist/canvas.cjs.map +1 -0
- package/dist/canvas.mjs +354 -0
- package/dist/canvas.mjs.map +1 -0
- package/dist/index.cjs +5 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.css +3 -1
- package/dist/index.css.d.ts +2 -0
- package/dist/index.mjs +1424 -6889
- package/dist/index.mjs.map +1 -1
- package/dist/paperSettingsWidget-DgDoBA0P.js +5137 -0
- package/dist/paperSettingsWidget-DgDoBA0P.js.map +1 -0
- package/dist/paperSettingsWidget-sLJsIUxS.cjs +2 -0
- package/dist/paperSettingsWidget-sLJsIUxS.cjs.map +1 -0
- package/dist/paperSettingsWidget.css +1 -0
- package/dist/shell.cjs +1 -0
- package/dist/shell.cjs.map +1 -0
- package/dist/shell.mjs +65 -0
- package/dist/shell.mjs.map +1 -0
- package/dist/sidebarPortal-C06y4JSP.js +723 -0
- package/dist/sidebarPortal-C06y4JSP.js.map +1 -0
- package/dist/sidebarPortal-C3HszQyp.cjs +1 -0
- package/dist/sidebarPortal-C3HszQyp.cjs.map +1 -0
- package/dist/src/canvas.d.ts +2523 -0
- package/dist/src/index.d.ts +1801 -2880
- package/dist/src/shell.d.ts +1982 -0
- package/package.json +21 -8
- package/dist/index.js +0 -70
- package/dist/index.js.map +0 -1
|
@@ -0,0 +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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"}
|
package/dist/index.css
CHANGED
|
@@ -1 +1,3 @@
|
|
|
1
|
-
._container_1mr3i_5{position:relative;width:100%;min-width:0}._select_1mr3i_11{width:100%;min-width:0;padding:.25rem 1.75rem .25rem .375rem;font-size:.75rem;line-height:1.25;border:1px solid var(--de-border-color, #d1d5db);border-radius:.25rem;background-color:var(--de-input-background, #ffffff);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right .375rem center;background-size:.875rem;color:var(--de-text-color, #000000);cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}._select_1mr3i_11:focus{outline:none;border-color:var(--de-primary-color, #3b82f6);box-shadow:0 0 0 3px var(--de-primary-shadow, rgba(59, 130, 246, .1))}._select_1mr3i_11:disabled{background-color:var(--de-input-disabled-background, #f3f4f6);color:var(--de-input-disabled-color, #9ca3af);cursor:not-allowed}._placeholderOverlay_1mr3i_44{position:absolute;top:0;left:0;right:0;bottom:0;font-size:.75rem;line-height:1.25;padding:1rem .375rem;color:var(--de-input-placeholder-color, #9ca3af);pointer-events:none;border:none;background:transparent;outline:none}._container_1tnp6_5{display:inline-flex;align-items:center;gap:.5rem;cursor:pointer;-webkit-user-select:none;user-select:none}._container_1tnp6_5:has(._input_1tnp6_13:disabled){cursor:not-allowed;opacity:.6}._input_1tnp6_13{width:1rem;height:1rem;cursor:pointer;accent-color:var(--de-primary-color, #3b82f6)}._input_1tnp6_13:disabled{cursor:not-allowed}._label_1tnp6_29{font-size:.875rem;line-height:1.5;color:var(--de-text-color, #000000)}._container_qbvob_5{display:flex;align-items:center;gap:.25rem;min-width:0;position:relative}._colorButton_qbvob_13{width:2rem;height:1.5rem;padding:0;border:1px solid var(--de-border-color, #d1d5db);border-radius:.25rem;cursor:pointer;transition:border-color .15s ease-in-out;background:repeating-conic-gradient(#e5e7eb,#e5e7eb 25%,#fff 0%,#fff 50%) 50% / 8px 8px}._colorButton_qbvob_13:hover:not(:disabled){border-color:var(--de-primary-color, #3b82f6)}._colorButton_qbvob_13:focus{outline:none;border-color:var(--de-primary-color, #3b82f6);box-shadow:0 0 0 3px var(--de-primary-shadow, rgba(59, 130, 246, .1))}._colorButton_qbvob_13:disabled{cursor:not-allowed;opacity:.6}._textInputWrapper_qbvob_40{display:flex;align-items:center;flex:1;min-width:0;border:1px solid var(--de-border-color, #d1d5db);border-radius:.25rem;background-color:var(--de-input-background, #ffffff);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}._textInputWrapper_qbvob_40:focus-within{border-color:var(--de-primary-color, #3b82f6);box-shadow:0 0 0 3px var(--de-primary-shadow, rgba(59, 130, 246, .1))}._textInputWrapper_qbvob_40:has(input:disabled){background-color:var(--de-input-disabled-background, #f3f4f6)}._textInputPrefix_qbvob_62{padding-left:.375rem;font-size:.75rem;font-family:ui-monospace,Cascadia Code,Source Code Pro,Menlo,Consolas,DejaVu Sans Mono,monospace;color:var(--de-text-secondary, #6b7280);-webkit-user-select:none;user-select:none}._textInput_qbvob_40{flex:1;min-width:0;padding:.25rem .375rem;font-size:.75rem;font-family:ui-monospace,Cascadia Code,Source Code Pro,Menlo,Consolas,DejaVu Sans Mono,monospace;line-height:1.25;border:none;background:transparent;color:var(--de-text-color, #000000)}._textInput_qbvob_40:focus{outline:none}._textInput_qbvob_40:disabled{color:var(--de-input-disabled-color, #9ca3af);cursor:not-allowed}._transparentButton_qbvob_95{width:1.5rem;height:1.5rem;padding:0;border:1px solid var(--de-border-color, #d1d5db);border-radius:.25rem;background:repeating-conic-gradient(#d1d5db 0% 25%,transparent 0% 50%) 50% / 8px 8px;cursor:pointer;transition:border-color .15s ease-in-out;position:relative}._transparentButton_qbvob_95:hover:not(:disabled){border-color:var(--de-primary-color, #3b82f6)}._transparentButton_qbvob_95:disabled{cursor:not-allowed;opacity:.6}._transparentButton_qbvob_95:after{content:"";position:absolute;top:2px;right:2px;bottom:2px;left:2px;background:transparent}._popover_qbvob_125{position:absolute;top:calc(100% + .25rem);left:0;padding:.5rem;background:var(--de-popover-background, #ffffff);border:1px solid var(--de-border-color, #d1d5db);border-radius:.5rem;box-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a;width:fit-content;min-width:180px}._palette_qbvob_141{display:grid;grid-template-columns:repeat(10,1fr);gap:.05rem;margin-bottom:.5rem}._paletteButton_qbvob_148{width:1.2rem;height:1.2rem;padding:0;border:2px solid var(--de-border-color, #d1d5db);border-radius:50%;cursor:pointer;transition:border-color .15s ease-in-out,transform .15s ease-in-out}._paletteButton_qbvob_148:hover{border-color:var(--de-primary-color, #3b82f6);transform:scale(1.1)}._paletteButton_qbvob_148:focus{outline:none;border-color:var(--de-primary-color, #3b82f6);box-shadow:0 0 0 3px var(--de-primary-shadow, rgba(59, 130, 246, .1))}._paletteButton_qbvob_148._selected_qbvob_171{border-color:var(--de-primary-color, #3b82f6);border-width:2px;box-shadow:0 0 0 2px var(--de-primary-shadow, rgba(59, 130, 246, .2))}._transparentPaletteButton_qbvob_177{background:repeating-conic-gradient(#d1d5db,#d1d5db 25%,#fff 0%,#fff 50%) 50% / 8px 8px}._rgbaInputs_qbvob_183{display:flex;gap:.25rem;padding-top:.5rem;border-top:1px solid var(--de-border-color, #e5e7eb)}._rgbaInputGroup_qbvob_190{display:flex;flex-direction:column;align-items:center;gap:.25rem}._rgbaInputs_qbvob_183 ._rgbaInputGroup_qbvob_190 input[type=number]{padding:.25rem .2rem;font-size:.75rem;text-align:center;line-height:1.2}._rgbaLabel_qbvob_205{font-size:.75rem;font-weight:600;color:var(--de-text-secondary, #6b7280);-webkit-user-select:none;user-select:none}._hexInput_qbvob_213{display:flex;align-items:center;gap:.5rem;padding-top:.5rem;margin-top:.5rem;border-top:1px solid var(--de-border-color, #e5e7eb)}._hexLabel_qbvob_222{font-size:.75rem;font-weight:600;color:var(--de-text-secondary, #6b7280);-webkit-user-select:none;user-select:none;min-width:2.5rem}._hexTextInput_qbvob_230{flex:1;min-width:0;padding:.375rem .5rem;font-size:.75rem;font-family:ui-monospace,Cascadia Code,Source Code Pro,Menlo,Consolas,DejaVu Sans Mono,monospace;line-height:1.25;border:1px solid var(--de-border-color, #d1d5db);border-radius:.25rem;background-color:var(--de-input-background, #ffffff);color:var(--de-text-color, #000000);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}._hexTextInput_qbvob_230:focus{outline:none;border-color:var(--de-primary-color, #3b82f6);box-shadow:0 0 0 3px var(--de-primary-shadow, rgba(59, 130, 246, .1))}._hexTextInput_qbvob_230:disabled{background-color:var(--de-input-disabled-background, #f3f4f6);color:var(--de-input-disabled-color, #9ca3af);cursor:not-allowed}._input_14n56_5{width:100%;padding:.25rem .375rem;font-size:.75rem;line-height:1.25;border:1px solid var(--de-border-color, #d1d5db);border-radius:.25rem;background-color:var(--de-input-background, #ffffff);color:var(--de-text-color, #000000);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}._input_14n56_5:focus{outline:none;border-color:var(--de-primary-color, #3b82f6);box-shadow:0 0 0 3px var(--de-primary-shadow, rgba(59, 130, 246, .1))}._input_14n56_5:disabled{background-color:var(--de-input-disabled-background, #f3f4f6);color:var(--de-input-disabled-color, #9ca3af);cursor:not-allowed}._input_14n56_5::-webkit-outer-spin-button,._input_14n56_5::-webkit-inner-spin-button{height:1.5rem}._container_1n9lj_5{display:flex;gap:0;align-items:stretch;min-width:0;border:1px solid var(--de-border-color, #d1d5db);border-radius:.25rem;background-color:var(--de-input-background, #ffffff);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}._container_1n9lj_5:focus-within{border-color:var(--de-primary-color, #3b82f6);box-shadow:0 0 0 3px var(--de-primary-shadow, rgba(59, 130, 246, .1))}._valueInput_1n9lj_23{flex:1;min-width:0;padding:.25rem .375rem;font-size:.75rem;line-height:1.25;border:none;border-radius:.25rem 0 0 .25rem;background-color:transparent;color:var(--de-text-color, #000000)}._valueInput_1n9lj_23:focus{outline:none}._valueInput_1n9lj_23:disabled{background-color:var(--de-input-disabled-background, #f3f4f6);color:var(--de-input-disabled-color, #9ca3af);cursor:not-allowed}._unitSelect_1n9lj_45{flex-shrink:0;min-width:3rem;padding:.25rem .375rem;font-size:.75rem;line-height:1.25;border:none;border-left:1px solid var(--de-border-color, #d1d5db);border-radius:0 .25rem .25rem 0;background-color:var(--de-input-background-secondary, #f9fafb);color:var(--de-text-color, #000000);cursor:pointer}._unitSelect_1n9lj_45:focus{outline:none}._container_1n9lj_5:has(._valueInput_1n9lj_23:disabled),._container_1n9lj_5:has(._unitSelect_1n9lj_45:disabled){background-color:var(--de-input-disabled-background, #f3f4f6);border-color:var(--de-border-color, #d1d5db);box-shadow:none}._valueInput_1n9lj_23:disabled{color:var(--de-input-disabled-color, #9ca3af);cursor:not-allowed}._unitSelect_1n9lj_45:disabled{background-color:transparent;color:var(--de-input-disabled-color, #9ca3af);cursor:not-allowed}._container_1bfk3_6{width:100%;height:100%;background-color:#fff;border-left:1px solid var(--de-border-color, #e5e7eb);display:flex;flex-direction:column;overflow:hidden;box-sizing:border-box}._container_1bfk3_6 *,._container_1bfk3_6 *:before,._container_1bfk3_6 *:after{box-sizing:border-box}._scrollArea_1bfk3_23{flex:1;overflow-y:auto;overflow-x:hidden;width:100%}._emptyState_1bfk3_31{display:flex;align-items:center;justify-content:center;height:100%;color:#9ca3af;font-size:.875rem;padding:1rem;text-align:center}._root_qs6t8_3{display:flex;flex-direction:column;width:100%;height:100%;box-sizing:border-box}._list_qs6t8_11{display:flex;flex-direction:row;border-bottom:1px solid var(--color-border, #e5e7eb);background-color:var(--color-bg-primary, #ffffff)}._list_qs6t8_11[data-variant=segmented]{padding:4px;gap:4px;border-bottom:none;background-color:var(--color-bg-secondary, #f3f4f6);border-radius:6px}._trigger_qs6t8_26{padding:8px 16px;border:none;background:none;cursor:pointer;font-size:14px;font-weight:500;color:var(--color-text-secondary, #6b7280);transition:all .2s ease;position:relative}._trigger_qs6t8_26:hover{color:var(--color-text-primary, #1f2937)}._trigger_qs6t8_26[data-state=active]{color:var(--color-primary, #3b82f6)}._trigger_qs6t8_26[data-variant=default][data-state=active]:after{content:"";position:absolute;bottom:0;left:0;right:0;height:2px;background-color:var(--color-primary, #3b82f6)}._trigger_qs6t8_26[data-variant=segmented]{border-radius:4px;padding:6px 12px}._trigger_qs6t8_26[data-variant=segmented][data-state=active]{background-color:var(--color-bg-primary, #ffffff);box-shadow:0 1px 3px #0000001a}._trigger_qs6t8_26:disabled{opacity:.5;cursor:not-allowed}._content_qs6t8_71{flex:1;display:flex;flex-direction:column;width:100%;box-sizing:border-box}._input_9unrj_5{width:100%;padding:.375rem .5rem;font-size:.875rem;font-family:inherit;line-height:1.5;border:1px solid var(--de-border-color, #d1d5db);border-radius:.25rem;background-color:var(--de-input-background, #ffffff);color:var(--de-text-color, #000000);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}._input_9unrj_5:focus{outline:none;border-color:var(--de-primary-color, #3b82f6);box-shadow:0 0 0 3px var(--de-primary-shadow, rgba(59, 130, 246, .1))}._input_9unrj_5:disabled{background-color:var(--de-input-disabled-background, #f3f4f6);color:var(--de-input-disabled-color, #9ca3af);cursor:not-allowed}textarea._input_9unrj_5{resize:vertical;min-height:3rem}._label_vgaic_1{position:absolute;font-size:10px;color:#0006;background-color:#fffc;padding:2px 4px;border:none;border-radius:2px;-webkit-user-select:none;user-select:none;cursor:pointer;pointer-events:auto;z-index:2800100;white-space:nowrap;transition:all .15s ease}._label_vgaic_1:hover{color:#000000b3;background-color:#fff}._label_vgaic_1:not([style*=vertical-rl]):hover{transform:translate(-50%) scale(1.1)}._label_vgaic_1[style*=vertical-rl]:hover{transform:translateY(-50%) scale(1.1)}._editor_6szgo_5{position:absolute;display:flex;gap:4px;background-color:#fff;border:1px solid #3b82f6;border-radius:4px;padding:6px;box-shadow:0 2px 8px #00000026;z-index:2800200;pointer-events:auto}._input_6szgo_18{width:60px;height:24px;padding:2px 6px;border:1px solid #d1d5db;border-radius:3px;font-size:12px;text-align:center}._input_6szgo_18:focus{outline:none;border-color:#3b82f6}._input_6szgo_18:disabled{background-color:#f3f4f6;color:#9ca3af}._select_6szgo_38{width:60px;height:24px;padding:2px 4px;border:1px solid #d1d5db;border-radius:3px;font-size:12px;background-color:#fff;cursor:pointer}._select_6szgo_38:focus{outline:none;border-color:#3b82f6}._button_6szgo_54{width:24px;height:24px;display:flex;align-items:center;justify-content:center;border:1px solid #3b82f6;border-radius:3px;background-color:#3b82f6;color:#fff;font-size:14px;cursor:pointer;transition:background-color .15s ease}._button_6szgo_54:hover{background-color:#2563eb}._button_6szgo_54:active{background-color:#1d4ed8}._handle_1mgtx_1{position:absolute;background-color:#fff;border:1px solid #3b82f6;border-radius:50%;transition:opacity .2s ease,transform .2s ease;z-index:2800000;opacity:0;box-sizing:border-box}._handle_1mgtx_1:hover{opacity:1;transform:scale(1.2)}._handle_1mgtx_1._dragging_1mgtx_19{opacity:1;background-color:#3b82f6;transform:scale(1.2)}._interactionBlock_145kg_7:hover ._resizeHandle_145kg_7,._interactionBlock_145kg_7 ._resizeHandle_145kg_7:hover{opacity:1}._container_1tfjv_1{display:flex;flex-direction:column;gap:.5rem;padding:.75rem 2%;width:100%;box-sizing:border-box}._header_1tfjv_12{font-size:.75rem;font-weight:700;color:#6b7280;text-transform:uppercase;margin-bottom:.25rem}._row_1tfjv_20{display:flex;align-items:center;gap:.5rem}._label_1tfjv_26{font-size:.75rem;color:#6b7280;width:3rem;flex-shrink:0;display:flex;justify-content:center}._inputWrapper_1tfjv_37{flex:1;min-width:0}._container_1daw7_1{display:flex;flex-direction:column;gap:.5rem;padding:.75rem 2%;width:100%;box-sizing:border-box}._header_1daw7_10{font-size:.75rem;font-weight:700;color:#6b7280;text-transform:uppercase;margin-bottom:.5rem}._grid_1daw7_19{display:grid;grid-template-columns:repeat(4,1fr);gap:.5rem}._field_1daw7_26{display:flex;align-items:center;gap:.5rem;width:100%}._label_1daw7_33{font-size:.75rem;color:#6b7280;width:12px;flex-shrink:0;display:flex;justify-content:center;margin-bottom:.1rem}._inputWrapper_1daw7_43{flex:1;min-width:0;display:flex}._container_1h4w8_1{display:flex;flex-direction:column;gap:.5rem;padding:.75rem 2%;width:100%;box-sizing:border-box}._row_1h4w8_10{display:flex;align-items:center;gap:.5rem}._label_1h4w8_16{font-size:.9rem;color:#6b7280;width:1.5rem;flex-shrink:0;display:flex;justify-content:center}._inputWrapper_1h4w8_25{flex:1;min-width:0;display:flex}._container_wa11y_1{width:100%;height:100%;background-color:#fff;border-left:1px solid var(--de-border-color, #e5e7eb);display:flex;flex-direction:column;overflow:hidden;box-sizing:border-box}._container_wa11y_1 *,._container_wa11y_1 *:before,._container_wa11y_1 *:after{box-sizing:border-box}._scrollArea_wa11y_18{flex:1;overflow-y:auto;overflow-x:hidden;width:100%}._section_wa11y_26{border-bottom:1px solid var(--de-border-color, #e5e7eb)}._section_wa11y_26:last-child{border-bottom:none}._sectionTitle_wa11y_35{padding:.5rem .75rem;background-color:#f9fafb;font-size:.7rem;font-weight:700;color:#6b7280;text-transform:uppercase;letter-spacing:.05em;border-bottom:1px solid #f3f4f6}._subsection_wa11y_47{border-top:1px solid #f3f4f6}._subsectionTitle_wa11y_51{padding:.5rem 1rem;font-size:.75rem;font-weight:600;color:#6b7280;background-color:#fafafa}._fields_wa11y_59{padding:.75rem 2%;display:flex;flex-direction:column;gap:1rem;width:100%;box-sizing:border-box}._emptyState_wa11y_69{display:flex;align-items:center;justify-content:center;height:100%;color:#9ca3af;font-size:.875rem;padding:1rem;text-align:center}._field_qo0ef_1{display:flex;flex-direction:column;gap:.25rem}._label_qo0ef_7{display:block;font-size:.875rem;font-weight:500;color:var(--text-gray-700, #374151);cursor:help}._mixed_qo0ef_15{font-size:.75rem;color:var(--warning-color, #f59e0b);font-style:italic;margin-top:.25rem}._description_qo0ef_22{font-size:.75rem;color:var(--text-gray-400, #9ca3af);margin:0;margin-top:.25rem}._panel_1h33v_1{width:16rem;border-left:1px solid var(--border-color, #e5e7eb);background-color:var(--bg-white, #ffffff);height:100%;overflow-y:auto;display:flex;flex-direction:column}._header_1h33v_11{padding:1rem;font-weight:700;border-bottom:1px solid var(--border-color, #e5e7eb);background-color:var(--bg-white, #ffffff)}._group_1h33v_18{border-bottom:1px solid var(--border-color, #e5e7eb)}._group_1h33v_18:last-child{border-bottom:none}._groupTitle_1h33v_26{padding:.5rem 1rem;background-color:var(--bg-gray-50, #f9fafb);font-size:.75rem;font-weight:700;color:var(--text-gray-500, #6b7280);text-transform:uppercase;letter-spacing:.05em}._groupContent_1h33v_36{padding:1rem;display:flex;flex-direction:column;gap:1rem}._field_1h33v_43{display:flex;flex-direction:column;gap:.25rem}._label_1h33v_49{display:block;font-size:.875rem;font-weight:500;color:var(--text-gray-700, #374151);cursor:help}._mixed_1h33v_57{font-size:.75rem;color:var(--warning-color, #f59e0b);font-style:italic;margin-top:.25rem}._description_1h33v_64{font-size:.75rem;color:var(--text-gray-400, #9ca3af);margin:0;margin-top:.25rem}._panel_1ekwd_6{border-bottom:1px solid var(--de-border-color, #e5e7eb)}._title_1ekwd_10{margin:0;padding:.5rem .75rem;background-color:#f9fafb;font-size:.7rem;font-weight:700;color:#6b7280;text-transform:uppercase;letter-spacing:.05em;border-bottom:1px solid #f3f4f6}._content_1ekwd_22{padding:.75rem;display:flex;flex-direction:column;gap:8px}._description_1ekwd_29{margin:0 0 8px;font-size:.7rem;color:#9ca3af}._list_1ekwd_35{display:flex;flex-direction:column;gap:8px;list-style:none;margin:0;padding:0}._item_1ekwd_44{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;background-color:var(--de-bg-secondary, #f5f5f5);border:1px solid var(--de-border-color, #e0e0e0);border-radius:4px;font-size:12px;cursor:grab;transition:all .2s}._item_1ekwd_44:active{cursor:grabbing}._item_1ekwd_44._dragging_1ekwd_61{opacity:.5;cursor:grabbing}._item_1ekwd_44._dragOver_1ekwd_66{border-color:var(--de-accent-color, #2196f3);background-color:var(--de-accent-light, rgba(33, 150, 243, .1))}._dragHandle_1ekwd_71{display:flex;align-items:center;justify-content:center;width:20px;height:20px;margin-right:8px;color:var(--de-text-secondary, #666);cursor:grab}._item_1ekwd_44:active ._dragHandle_1ekwd_71{cursor:grabbing}._itemInfo_1ekwd_86{display:flex;flex-direction:column;gap:4px;flex:1}._itemId_1ekwd_93{font-weight:500;color:var(--de-text-primary, #333)}._itemMeta_1ekwd_98{display:flex;gap:8px;font-size:11px;color:var(--de-text-secondary, #666)}._itemKind_1ekwd_105{font-family:monospace}._itemIndex_1ekwd_109{color:var(--de-accent-color, #2196f3)}._itemActions_1ekwd_113{display:flex;gap:4px}._actionButton_1ekwd_118{display:flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;border:1px solid var(--de-border-color, #e0e0e0);border-radius:4px;background-color:var(--de-bg-primary, #fff);color:var(--de-text-secondary, #666);cursor:pointer;transition:all .2s}._actionButton_1ekwd_118:hover{background-color:var(--de-accent-light, rgba(33, 150, 243, .1));border-color:var(--de-accent-color, #2196f3);color:var(--de-accent-color, #2196f3)}._actionButton_1ekwd_118:active{transform:scale(.95)}._actionButton_1ekwd_118:disabled{opacity:.4;cursor:not-allowed}._actionButton_1ekwd_118:disabled:hover{background-color:var(--de-bg-primary, #fff);border-color:var(--de-border-color, #e0e0e0);color:var(--de-text-secondary, #666)}._empty_1ekwd_154{padding:24px;text-align:center;font-size:12px;color:var(--de-text-secondary, #666);background-color:var(--de-bg-secondary, #f5f5f5);border-radius:4px}._panel_1axyd_6{border-bottom:1px solid var(--de-border-color, #e5e7eb)}._title_1axyd_10{margin:0;padding:.5rem .75rem;background-color:#f9fafb;font-size:.7rem;font-weight:700;color:#6b7280;text-transform:uppercase;letter-spacing:.05em;border-bottom:1px solid #f3f4f6}._content_1axyd_22{padding:.75rem;display:flex;flex-direction:column;gap:8px}._field_1axyd_29{display:flex;flex-direction:column;gap:6px}._field_1axyd_29._horizontal_1axyd_35{flex-direction:row;align-items:center;gap:4px}._label_1axyd_41{font-size:12px;font-weight:500;color:var(--de-text-secondary, #666)}._field_1axyd_29._horizontal_1axyd_35 ._label_1axyd_41{min-width:32px;flex-shrink:0}._gridSizeRow_1axyd_52{display:flex;gap:16px}._gridSizeRow_1axyd_52>._field_1axyd_29{flex:1;min-width:0}._panel_qlcb6_6{border-bottom:1px solid var(--de-border-color, #e5e7eb)}._header_qlcb6_10{display:flex;justify-content:space-between;align-items:center;padding:.5rem .75rem;background-color:#f9fafb;border-bottom:1px solid #f3f4f6;gap:8px}._title_qlcb6_20{margin:0;font-size:.7rem;font-weight:700;color:#6b7280;text-transform:uppercase;letter-spacing:.05em}._headerActions_qlcb6_29{flex-shrink:0}._content_qlcb6_33{padding:.75rem}._field_qlcb6_37{display:flex;flex-direction:column;gap:6px}._field_qlcb6_37._horizontal_qlcb6_43{flex-direction:row;align-items:center;gap:4px}._label_qlcb6_49{font-size:12px;font-weight:500;color:var(--de-text-secondary, #666)}._field_qlcb6_37._horizontal_qlcb6_43 ._label_qlcb6_49{min-width:24px;flex-shrink:0}._marginsGrid_qlcb6_60{display:flex;flex-direction:column;gap:8px}._topMargin_qlcb6_66,._bottomMargin_qlcb6_67{align-self:center;width:120px;flex-shrink:0}._sideMargins_qlcb6_73{display:flex;gap:36px;justify-content:center}._sideMargins_qlcb6_73>._field_qlcb6_37{width:120px;flex-shrink:0;min-width:0}._panel_16d9o_6{border-bottom:1px solid var(--de-border-color, #e5e7eb)}._title_16d9o_10{margin:0;padding:.5rem .75rem;background-color:#f9fafb;font-size:.7rem;font-weight:700;color:#6b7280;text-transform:uppercase;letter-spacing:.05em;border-bottom:1px solid #f3f4f6}._content_16d9o_22{padding:.75rem;display:flex;flex-direction:column;gap:8px}._field_16d9o_29{display:flex;flex-direction:column;gap:1px}._field_16d9o_29._horizontal_16d9o_35{flex-direction:row;align-items:center;gap:8px}._label_16d9o_41{font-size:12px;font-weight:500;color:var(--de-text-secondary, #666)}._field_16d9o_29._horizontal_16d9o_35 ._label_16d9o_41{min-width:40px;flex-shrink:0}._dimensionsRow_16d9o_52{display:flex;gap:16px}._dimensionsRow_16d9o_52>._field_16d9o_29{flex:1;min-width:0;gap:0}._dimensionsRow_16d9o_52>._field_16d9o_29 ._label_16d9o_41{min-width:32px}._preview_16d9o_67{margin-top:8px}._previewLabel_16d9o_71{font-size:12px;font-weight:500;color:var(--de-text-secondary, #666);margin-bottom:8px}._previewBox_16d9o_78{display:flex;justify-content:center;align-items:center;padding:16px;background-color:var(--de-bg-secondary, #f5f5f5);border-radius:4px;min-height:100px}._previewPaper_16d9o_88{max-width:80px;max-height:100px;background-color:var(--de-paper-bg, #fff);border:1px solid var(--de-border-color, #ccc);box-shadow:0 2px 4px #0000001a}._section_p4xnx_6{border-bottom:1px solid var(--de-border-color, #e5e7eb)}._section_p4xnx_6:last-child{border-bottom:none}._title_p4xnx_14{margin:0;padding:.5rem .75rem;background-color:#f9fafb;font-size:.7rem;font-weight:700;color:#6b7280;text-transform:uppercase;letter-spacing:.05em;border-bottom:1px solid #f3f4f6}._content_p4xnx_26{padding:.75rem;display:flex;flex-direction:column;gap:8px}._buttonGroup_p4xnx_33{display:flex;flex-direction:column;gap:8px}._button_p4xnx_33{display:flex;align-items:center;justify-content:center;gap:8px;padding:10px 16px;border:1px solid var(--de-border-color, #e0e0e0);border-radius:4px;background-color:var(--de-bg-primary, #fff);color:var(--de-text-primary, #333);font-size:13px;font-weight:500;cursor:pointer;transition:all .2s}._button_p4xnx_33:hover{background-color:var(--de-accent-light, rgba(33, 150, 243, .1));border-color:var(--de-accent-color, #2196f3);color:var(--de-accent-color, #2196f3)}._button_p4xnx_33:active{transform:scale(.98)}._error_p4xnx_65{padding:12px;background-color:var(--de-error-bg, #ffebee);border:1px solid var(--de-error-border, #ef5350);border-radius:4px;color:var(--de-error-text, #c62828);font-size:12px;line-height:1.5;word-break:break-word}._container_6c3ft_3{display:flex;flex-direction:column;width:100%;height:100%;background-color:var(--color-bg-secondary, #fafafa);overflow:hidden;box-sizing:border-box}._header_6c3ft_13{padding:16px;border-bottom:1px solid var(--color-border, #e5e7eb);background-color:var(--color-bg-primary, #ffffff)}._title_6c3ft_19{margin:0 0 8px;font-size:16px;font-weight:600;color:var(--color-text-primary, #1f2937)}._description_6c3ft_26{margin:0;font-size:12px;color:var(--color-text-secondary, #6b7280)}._paletteItems_6c3ft_32{flex:1;width:100%;padding:12px;overflow-y:auto;display:flex;flex-direction:column;gap:12px;box-sizing:border-box}._item_6c3ft_44{display:flex;flex-direction:column;width:100%;border:1px solid var(--color-border, #d1d5db);border-radius:6px;background-color:var(--color-bg-primary, #ffffff);text-align:left;transition:all .2s ease;-webkit-user-select:none;user-select:none;box-sizing:border-box;flex-shrink:0;overflow:hidden}._item_6c3ft_44:hover{background-color:var(--color-bg-hover, #f3f4f6);border-color:var(--color-border-hover, #9ca3af);box-shadow:0 2px 4px #0000000d}._item_6c3ft_44:focus-visible{outline:2px solid var(--color-primary, #3b82f6);outline-offset:2px}._itemName_6c3ft_70{width:100%;padding:12px;font-weight:600;font-size:14px;color:var(--color-text-primary, #1f2937);background:transparent;border:none;cursor:grab;text-align:left;transition:background-color .2s ease}._itemName_6c3ft_70:hover{background-color:var(--color-bg-hover, #f9fafb)}._itemName_6c3ft_70:active{cursor:grabbing;background-color:var(--color-bg-active, #f3f4f6)}._itemName_6c3ft_70:focus-visible{outline:2px solid var(--color-primary, #3b82f6);outline-offset:-2px}._itemPreview_6c3ft_98{width:100%;height:80px;padding:8px;border-top:1px solid var(--color-border-light, #e5e7eb);overflow:hidden;background:var(--color-bg-canvas, #f9fafb);display:flex;align-items:center;justify-content:center;position:relative;flex-shrink:0;box-sizing:border-box}._itemPreview_6c3ft_98:after{content:"";position:absolute;top:0;left:0;right:0;bottom:0;z-index:1000;cursor:grab;pointer-events:auto}._itemPreview_6c3ft_98>*{width:200px;height:100px;transform:scale(.6);transform-origin:center center;pointer-events:none;border:1px solid var(--color-border-light, #e5e7eb);border-radius:4px;background:#fff;box-shadow:0 1px 3px #0000001a}._itemPreview_6c3ft_98 *,._itemPreview_6c3ft_98 *:before,._itemPreview_6c3ft_98 *:after{pointer-events:none}._itemInfo_6c3ft_147{display:flex;flex-direction:column}._itemDescription_6c3ft_152{font-size:12px;color:var(--color-text-secondary, #6b7280);margin-bottom:4px}._itemSize_6c3ft_158{font-size:11px;color:var(--color-text-tertiary, #9ca3af)}._container_rt0ql_3{display:flex;flex-direction:column;height:100%;width:100%;background-color:var(--color-bg-secondary, #fafafa);border-left:1px solid var(--color-border, #e5e7eb);overflow:hidden}._tabHeader_rt0ql_14{flex-shrink:0;border-bottom:1px solid var(--color-border, #e5e7eb);background-color:var(--color-bg-primary, #ffffff)}._tabContent_rt0ql_21{flex:1;overflow:hidden;display:flex;flex-direction:column;width:100%;box-sizing:border-box}._placeholder_rt0ql_31{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;padding:24px;text-align:center;color:var(--color-text-secondary, #6b7280)}._placeholder_rt0ql_31 p{margin:0 0 8px;font-size:14px}._placeholderHint_rt0ql_47{font-size:12px;color:var(--color-text-tertiary, #9ca3af)}
|
|
1
|
+
._container_1xv5c_4{display:flex;flex-direction:row;align-items:center;gap:4px;padding:6px 8px;background-color:var(--de-bg-secondary, #f9fafb);border:1px solid var(--de-border-color, #e5e7eb);border-radius:6px;flex-wrap:wrap}._section_1xv5c_16{display:flex;flex-direction:row;align-items:center;gap:4px}._divider_1xv5c_23{width:1px;height:20px;background-color:var(--de-border-color, #d1d5db);flex-shrink:0;margin:0 2px}._sectionLabel_1xv5c_31{font-size:11px;color:var(--de-text-secondary, #6b7280);white-space:nowrap;-webkit-user-select:none;user-select:none}._select_1xv5c_38{height:28px;padding:0 4px;border:1px solid var(--de-border-color, #d1d5db);border-radius:4px;background-color:var(--de-bg-primary, #ffffff);color:var(--de-text-primary, #374151);font-size:12px;cursor:pointer;outline:none}._select_1xv5c_38:hover{border-color:var(--de-border-hover, #9ca3af)}._select_1xv5c_38:focus{border-color:var(--de-primary-color, #6366f1);box-shadow:0 0 0 2px #6366f133}._numberInput_1xv5c_59{width:48px;height:28px;padding:0 4px;border:1px solid var(--de-border-color, #d1d5db);border-radius:4px;background-color:var(--de-bg-primary, #ffffff);color:var(--de-text-primary, #374151);font-size:12px;text-align:center;outline:none}._numberInput_1xv5c_59:hover{border-color:var(--de-border-hover, #9ca3af)}._numberInput_1xv5c_59:focus{border-color:var(--de-primary-color, #6366f1);box-shadow:0 0 0 2px #6366f133}._numberInput_1xv5c_59::-webkit-inner-spin-button,._numberInput_1xv5c_59::-webkit-outer-spin-button{opacity:1}._heightModeSwitch_1xv5c_87{display:inline-flex;align-items:center;gap:3px}._switchLabel_1xv5c_93{font-size:.625rem;font-weight:600;color:var(--de-text-tertiary, #9ca3af);-webkit-user-select:none;user-select:none;white-space:nowrap}._switchLabelActive_1xv5c_101{color:var(--de-text-primary, #374151)}._toggle_1xv5c_105{position:relative;width:28px;height:16px;border-radius:8px;background-color:var(--de-border-color, #d1d5db);border:none;cursor:pointer;padding:0;flex-shrink:0;transition:background-color .2s}._toggle_1xv5c_105[aria-checked=true]{background-color:var(--de-primary-color, #3b82f6)}._thumb_1xv5c_122{position:absolute;top:2px;left:2px;width:12px;height:12px;border-radius:50%;background-color:#fff;transition:left .2s;pointer-events:none}._toggle_1xv5c_105[aria-checked=true] ._thumb_1xv5c_122{left:14px}._container_1tnp6_5{display:inline-flex;align-items:center;gap:.5rem;cursor:pointer;-webkit-user-select:none;user-select:none}._container_1tnp6_5:has(._input_1tnp6_13:disabled){cursor:not-allowed;opacity:.6}._input_1tnp6_13{width:1rem;height:1rem;cursor:pointer;accent-color:var(--de-primary-color, #3b82f6)}._input_1tnp6_13:disabled{cursor:not-allowed}._label_1tnp6_29{font-size:.875rem;line-height:1.5;color:var(--de-text-color, #000000)}._header_1c1mq_6{display:flex;align-items:center;gap:4px;width:100%;margin:0;padding:.25rem .75rem;background-color:var(--de-bg-secondary, #f9fafb);border:none;border-bottom:1px solid var(--de-bg-hover, #f3f4f6);border-top:1px solid var(--de-bg-hover, #f3f4f6);text-align:left;box-sizing:border-box}button._header_1c1mq_6{cursor:pointer}button._header_1c1mq_6:hover{background-color:var(--de-bg-hover, #f3f4f6)}._title_1c1mq_32{font-size:.7rem;font-weight:700;color:var(--de-text-secondary, #6b7280);text-transform:uppercase;letter-spacing:.05em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}._actions_1c1mq_43{flex-shrink:0}._titleGroup_1c1mq_49{flex:1;display:flex;align-items:center;gap:4px;min-width:0;overflow:hidden}._infoIcon_1c1mq_60{display:inline-flex;align-items:center;justify-content:center;width:.9375rem;height:.9375rem;border-radius:9999px;background-color:var(--de-border-color, #d1d5db);color:#fff;font-size:.625rem;font-weight:700;font-style:normal;font-family:inherit;line-height:1;cursor:help;-webkit-user-select:none;user-select:none;flex-shrink:0;transition:background-color .15s}._infoIcon_1c1mq_60:hover{background-color:var(--de-primary-color, #3b82f6)}._chevron_1c1mq_84{flex-shrink:0;font-size:.9rem;transition:transform .18s;display:inline-block;transform:rotate(-90deg)}._chevronOpen_1c1mq_92{transform:rotate(0)}._statusBadge_1c1mq_98{flex-shrink:0;padding:.1em .45em;border-radius:.25rem;font-size:.6rem;font-weight:600;letter-spacing:.03em;line-height:1.4}._statusBadgeOn_1c1mq_108{background-color:var(--de-badge-on-bg, #dbeafe);color:var(--de-primary-dark, #1d4ed8)}._statusBadgeOff_1c1mq_113{background-color:var(--de-bg-hover, #f3f4f6);color:var(--de-text-tertiary, #9ca3af)}._content_1c1mq_120{padding:.6rem .1875rem;display:flex;flex-direction:column;gap:8px}._contentNoPadding_1c1mq_127{display:flex;flex-direction:column}._container_1cdzu_5{display:flex;align-items:center;gap:.25rem;min-width:0;position:relative}._colorButton_1cdzu_13{width:2rem;height:1.5rem;padding:0;border:1px solid var(--de-border-color, #d1d5db);border-radius:.25rem;cursor:pointer;transition:border-color .15s ease-in-out;background:repeating-conic-gradient(#e5e7eb,#e5e7eb 25%,#fff 0%,#fff 50%) 50% / 8px 8px}._colorButton_1cdzu_13:hover:not(:disabled){border-color:var(--de-primary-color, #3b82f6)}._colorButton_1cdzu_13:focus{outline:none;border-color:var(--de-primary-color, #3b82f6);box-shadow:0 0 0 3px var(--de-primary-shadow, rgba(59, 130, 246, .1))}._colorButton_1cdzu_13:disabled{cursor:not-allowed;opacity:.6}._textInputWrapper_1cdzu_40{display:flex;align-items:center;flex:1;min-width:0;border:1px solid var(--de-border-color, #d1d5db);border-radius:.25rem;background-color:var(--de-input-background, #ffffff);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}._textInputWrapper_1cdzu_40:focus-within{border-color:var(--de-primary-color, #3b82f6);box-shadow:0 0 0 3px var(--de-primary-shadow, rgba(59, 130, 246, .1))}._textInputWrapper_1cdzu_40:has(input:disabled){background-color:var(--de-input-disabled-background, #f3f4f6)}._textInputPrefix_1cdzu_62{padding-left:.375rem;font-size:.75rem;font-family:ui-monospace,Cascadia Code,Source Code Pro,Menlo,Consolas,DejaVu Sans Mono,monospace;color:var(--de-text-secondary, #6b7280);-webkit-user-select:none;user-select:none}._textInput_1cdzu_40{flex:1;min-width:0;padding:.25rem .375rem;font-size:.75rem;font-family:ui-monospace,Cascadia Code,Source Code Pro,Menlo,Consolas,DejaVu Sans Mono,monospace;line-height:1.25;border:none;background:transparent;color:var(--de-text-color, #000000)}._textInput_1cdzu_40:focus{outline:none}._textInput_1cdzu_40:disabled{color:var(--de-input-disabled-color, #9ca3af);cursor:not-allowed}._popover_1cdzu_96{position:absolute;top:calc(100% + .25rem);left:0;padding:.5rem;background:var(--de-popover-background, #ffffff);border:1px solid var(--de-border-color, #d1d5db);border-radius:.5rem;box-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a;width:fit-content;min-width:180px}._palette_1cdzu_112{display:grid;grid-template-columns:repeat(10,1fr);gap:.05rem;margin-bottom:.5rem}._paletteButton_1cdzu_119{width:1.2rem;height:1.2rem;padding:0;border:2px solid var(--de-border-color, #d1d5db);border-radius:50%;cursor:pointer;transition:border-color .15s ease-in-out,transform .15s ease-in-out}._paletteButton_1cdzu_119:hover{border-color:var(--de-primary-color, #3b82f6);transform:scale(1.1)}._paletteButton_1cdzu_119:focus{outline:none;border-color:var(--de-primary-color, #3b82f6);box-shadow:0 0 0 3px var(--de-primary-shadow, rgba(59, 130, 246, .1))}._paletteButton_1cdzu_119._selected_1cdzu_142{border-color:var(--de-primary-color, #3b82f6);border-width:2px;box-shadow:0 0 0 2px var(--de-primary-shadow, rgba(59, 130, 246, .2))}._transparentPaletteButton_1cdzu_148{background:repeating-conic-gradient(#d1d5db,#d1d5db 25%,#fff 0%,#fff 50%) 50% / 8px 8px}._rgbaInputs_1cdzu_154{display:flex;gap:.25rem;padding-top:.5rem;border-top:1px solid var(--de-border-color, #e5e7eb)}._rgbaInputGroup_1cdzu_161{display:flex;flex-direction:column;align-items:center;gap:.25rem}._rgbaInputs_1cdzu_154 ._rgbaInputGroup_1cdzu_161 input[type=number]{padding:.25rem .2rem;font-size:.75rem;text-align:center;line-height:1.2}._rgbaLabel_1cdzu_175{font-size:.75rem;font-weight:600;color:var(--de-text-secondary, #6b7280);-webkit-user-select:none;user-select:none}._hexInput_1cdzu_183{display:flex;align-items:center;gap:.5rem;padding-top:.5rem;margin-top:.5rem;border-top:1px solid var(--de-border-color, #e5e7eb)}._hexLabel_1cdzu_192{font-size:.75rem;font-weight:600;color:var(--de-text-secondary, #6b7280);-webkit-user-select:none;user-select:none;min-width:2.5rem}._hexTextInput_1cdzu_200{flex:1;min-width:0;padding:.375rem .5rem;font-size:.75rem;font-family:ui-monospace,Cascadia Code,Source Code Pro,Menlo,Consolas,DejaVu Sans Mono,monospace;line-height:1.25;border:1px solid var(--de-border-color, #d1d5db);border-radius:.25rem;background-color:var(--de-input-background, #ffffff);color:var(--de-text-color, #000000);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}._hexTextInput_1cdzu_200:focus{outline:none;border-color:var(--de-primary-color, #3b82f6);box-shadow:0 0 0 3px var(--de-primary-shadow, rgba(59, 130, 246, .1))}._hexTextInput_1cdzu_200:disabled{background-color:var(--de-input-disabled-background, #f3f4f6);color:var(--de-input-disabled-color, #9ca3af);cursor:not-allowed}._input_14n56_5{width:100%;padding:.25rem .375rem;font-size:.75rem;line-height:1.25;border:1px solid var(--de-border-color, #d1d5db);border-radius:.25rem;background-color:var(--de-input-background, #ffffff);color:var(--de-text-color, #000000);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}._input_14n56_5:focus{outline:none;border-color:var(--de-primary-color, #3b82f6);box-shadow:0 0 0 3px var(--de-primary-shadow, rgba(59, 130, 246, .1))}._input_14n56_5:disabled{background-color:var(--de-input-disabled-background, #f3f4f6);color:var(--de-input-disabled-color, #9ca3af);cursor:not-allowed}._input_14n56_5::-webkit-outer-spin-button,._input_14n56_5::-webkit-inner-spin-button{height:1.5rem}._container_1n9lj_5{display:flex;gap:0;align-items:stretch;min-width:0;border:1px solid var(--de-border-color, #d1d5db);border-radius:.25rem;background-color:var(--de-input-background, #ffffff);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}._container_1n9lj_5:focus-within{border-color:var(--de-primary-color, #3b82f6);box-shadow:0 0 0 3px var(--de-primary-shadow, rgba(59, 130, 246, .1))}._valueInput_1n9lj_23{flex:1;min-width:0;padding:.25rem .375rem;font-size:.75rem;line-height:1.25;border:none;border-radius:.25rem 0 0 .25rem;background-color:transparent;color:var(--de-text-color, #000000)}._valueInput_1n9lj_23:focus{outline:none}._valueInput_1n9lj_23:disabled{background-color:var(--de-input-disabled-background, #f3f4f6);color:var(--de-input-disabled-color, #9ca3af);cursor:not-allowed}._unitSelect_1n9lj_45{flex-shrink:0;min-width:3rem;padding:.25rem .375rem;font-size:.75rem;line-height:1.25;border:none;border-left:1px solid var(--de-border-color, #d1d5db);border-radius:0 .25rem .25rem 0;background-color:var(--de-input-background-secondary, #f9fafb);color:var(--de-text-color, #000000);cursor:pointer}._unitSelect_1n9lj_45:focus{outline:none}._container_1n9lj_5:has(._valueInput_1n9lj_23:disabled),._container_1n9lj_5:has(._unitSelect_1n9lj_45:disabled){background-color:var(--de-input-disabled-background, #f3f4f6);border-color:var(--de-border-color, #d1d5db);box-shadow:none}._valueInput_1n9lj_23:disabled{color:var(--de-input-disabled-color, #9ca3af);cursor:not-allowed}._unitSelect_1n9lj_45:disabled{background-color:transparent;color:var(--de-input-disabled-color, #9ca3af);cursor:not-allowed}._container_14f2v_5{position:relative;width:100%;min-width:0}._select_14f2v_11{width:100%;min-width:0;padding:.25rem 1.75rem .25rem .375rem;font-size:.75rem;line-height:1.25;border:1px solid var(--de-border-color, #d1d5db);border-radius:.25rem;background-color:var(--de-input-background, #ffffff);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right .375rem center;background-size:.875rem;color:var(--de-text-color, #000000);cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}._select_14f2v_11:focus{outline:none;border-color:var(--de-primary-color, #3b82f6);box-shadow:0 0 0 3px var(--de-primary-shadow, rgba(59, 130, 246, .1))}._select_14f2v_11:disabled{background-color:var(--de-input-disabled-background, #f3f4f6);color:var(--de-input-disabled-color, #9ca3af);cursor:not-allowed}._placeholderOverlay_14f2v_44{position:absolute;top:0;left:0;right:0;bottom:0;display:flex;align-items:center;padding:.5rem 1.75rem .25rem .375rem;font-size:.75rem;line-height:1.25;color:var(--de-input-placeholder-color, #9ca3af);pointer-events:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;box-sizing:border-box}._button_16snt_1{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;border:1px solid var(--de-border-color, #d1d5db);border-radius:4px;background-color:var(--de-bg-primary, #ffffff);color:var(--de-text-primary, #374151);font-size:14px;cursor:pointer;transition:background-color .1s,border-color .1s,opacity .1s;line-height:1}._button_16snt_1:hover:not(:disabled){background-color:var(--de-bg-hover, #f3f4f6);border-color:var(--de-border-hover, #9ca3af)}._button_16snt_1:active:not(:disabled){background-color:var(--de-bg-active, #e5e7eb)}._button_16snt_1:disabled{opacity:.4;cursor:not-allowed}._container_ytzac_4{width:100%;height:100%;background-color:var(--de-bg-primary, #ffffff);border-left:1px solid var(--de-border-color, #e5e7eb);display:flex;flex-direction:column;overflow:hidden;box-sizing:border-box}._container_ytzac_4 *,._container_ytzac_4 *:before,._container_ytzac_4 *:after{box-sizing:border-box}._scrollArea_ytzac_21{flex:1;overflow-y:auto;overflow-x:hidden;width:100%}._emptyState_ytzac_29{display:flex;align-items:center;justify-content:center;height:100%;color:var(--de-text-tertiary, #9ca3af);font-size:.875rem;padding:1rem;text-align:center}._root_vttth_1{display:flex;flex-direction:column;width:100%;height:100%;box-sizing:border-box}._list_vttth_9{display:flex;flex-direction:row;border-bottom:1px solid var(--de-border-color, #e5e7eb);background-color:var(--de-bg-primary, #ffffff)}._list_vttth_9[data-variant=segmented]{padding:4px;gap:4px;border-bottom:none;background-color:var(--de-bg-secondary, #f3f4f6);border-radius:6px}._trigger_vttth_24{padding:8px 16px;border:none;background:none;cursor:pointer;font-size:14px;font-weight:500;color:var(--de-text-secondary, #6b7280);transition:all .2s ease;position:relative}._trigger_vttth_24:hover{color:var(--de-text-primary, #1f2937)}._trigger_vttth_24[data-state=active]{color:var(--de-primary-color, #3b82f6)}._trigger_vttth_24[data-variant=default][data-state=active]:after{content:"";position:absolute;bottom:0;left:0;right:0;height:2px;background-color:var(--de-primary-color, #3b82f6)}._trigger_vttth_24[data-variant=segmented]{border-radius:4px;padding:6px 12px}._trigger_vttth_24[data-variant=segmented][data-state=active]{background-color:var(--de-bg-primary, #ffffff);box-shadow:0 1px 3px #0000001a}._trigger_vttth_24:disabled{opacity:.5;cursor:not-allowed}._content_vttth_69{flex:1;display:flex;flex-direction:column;width:100%;box-sizing:border-box}._input_jxjyc_5{width:100%;box-sizing:border-box;padding:.25rem .375rem;font-size:.75rem;font-family:inherit;line-height:1.25;border:1px solid var(--de-border-color, #d1d5db);border-radius:.25rem;background-color:var(--de-input-background, #ffffff);color:var(--de-text-color, #000000);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}._input_jxjyc_5:focus{outline:none;border-color:var(--de-primary-color, #3b82f6);box-shadow:0 0 0 3px var(--de-primary-shadow, rgba(59, 130, 246, .1))}._input_jxjyc_5:disabled{background-color:var(--de-input-disabled-background, #f3f4f6);color:var(--de-input-disabled-color, #9ca3af);cursor:not-allowed}textarea._input_jxjyc_5{resize:vertical;min-height:3rem}._container_1gf2q_1{display:flex;flex-direction:column;gap:.5rem;width:100%;box-sizing:border-box}._grid_1gf2q_9{display:grid;grid-template-columns:repeat(4,1fr);gap:.5rem}._field_1gf2q_15{display:flex;align-items:center;gap:.5rem;width:100%}._label_1gf2q_22{font-size:.75rem;color:var(--de-text-secondary, #6b7280);width:12px;flex-shrink:0;display:flex;justify-content:center;margin-bottom:.1rem}._inputWrapper_1gf2q_32{flex:1;min-width:0;display:flex}._group_xhfvf_1{display:inline-flex;border:1px solid var(--de-border-color, #d1d5db);padding:0;margin:0;gap:0;border-radius:.25rem;overflow:hidden;background-color:var(--de-bg-secondary, #f9fafb)}._btn_xhfvf_13{display:inline-flex;align-items:center;justify-content:center;width:2rem;height:1.75rem;padding:0;border:none;border-right:1px solid var(--de-border-color, #d1d5db);background-color:transparent;color:var(--de-text-secondary, #6b7280);cursor:pointer;transition:background-color .12s,color .12s;flex-shrink:0}._btn_xhfvf_13:last-child{border-right:none}._btn_xhfvf_13:hover:not(:disabled){background-color:var(--de-bg-active, #e5e7eb);color:var(--de-text-primary, #374151)}._btn_xhfvf_13:disabled{cursor:not-allowed;opacity:.5}._active_xhfvf_46{background-color:var(--de-primary-color, #2563eb);color:#fff}._active_xhfvf_46:hover:not(:disabled){background-color:var(--de-primary-dark, #1d4ed8);color:#fff}._btn_xhfvf_13 svg{display:block;width:1rem;height:1rem;pointer-events:none}._group_1uyid_1{display:inline-flex;border:1px solid var(--de-border-color, #d1d5db);padding:0;margin:0;gap:0;border-radius:.25rem;overflow:hidden;background-color:var(--de-bg-secondary, #f9fafb)}._btn_1uyid_13{display:inline-flex;align-items:center;justify-content:center;width:2rem;height:1.75rem;padding:0;border:none;border-right:1px solid var(--de-border-color, #d1d5db);background-color:transparent;color:var(--de-text-secondary, #6b7280);cursor:pointer;transition:background-color .12s,color .12s;flex-shrink:0}._btn_1uyid_13:last-child{border-right:none}._btn_1uyid_13:hover:not(:disabled){background-color:var(--de-bg-active, #e5e7eb);color:var(--de-text-primary, #374151)}._btn_1uyid_13:disabled{cursor:not-allowed;opacity:.5}._active_1uyid_46{background-color:var(--de-primary-color, #2563eb);color:#fff}._iconBold_1uyid_52{font-weight:700;font-size:.875rem;font-family:Georgia,serif;line-height:1}._iconItalic_1uyid_59{font-style:italic;font-size:.875rem;font-family:Georgia,serif;line-height:1}._iconUnderline_1uyid_66{text-decoration:underline;font-size:.875rem;font-family:Georgia,serif;line-height:1}._iconLineThrough_1uyid_73{text-decoration:line-through;font-size:.875rem;font-family:Georgia,serif;line-height:1}._root_12n4v_6{display:grid;grid-template-columns:1fr 8rem;gap:4px;align-items:center}._fontFamilyCell_12n4v_13,._fontSizeCell_12n4v_14,._colorCell_12n4v_15{min-width:0}._root_111zo_7{display:flex;flex-direction:column;gap:6px}._linkLabel_111zo_14{display:flex;align-items:center;gap:4px;font-size:11px;color:var(--de-text-secondary, #666);cursor:pointer;-webkit-user-select:none;user-select:none;flex-shrink:0}._linkLabel_111zo_14 input[type=checkbox]{cursor:pointer;accent-color:var(--de-primary-color, #3b82f6)}._allRow_111zo_31{display:flex;align-items:center;justify-content:center}._grid_111zo_38{display:flex;flex-direction:column;align-items:center;gap:4px}._sideRow_111zo_45{display:flex;align-items:center;justify-content:center;gap:8px}._cell_111zo_53{width:96px;flex-shrink:0}._spacer_111zo_59{width:48px;flex-shrink:0}._bar_13lr1_4{display:inline-flex;flex-direction:row;align-items:center;gap:2px;padding:4px 6px;border:1px solid var(--de-border-color, #d1d5db);border-radius:6px;background-color:var(--de-bg-primary, #ffffff);box-shadow:0 2px 8px #0000001f,0 1px 3px #00000014}._divider_13lr1_18{width:1px;height:18px;background-color:var(--de-bg-active, #e5e7eb);margin:0 2px}._barWrapper_13lr1_26{position:relative;display:inline-block}._popover_13lr1_31{position:absolute;top:calc(100% + 4px);left:0;z-index:1;background-color:var(--de-bg-primary, #ffffff);border:1px solid var(--de-border-color, #d1d5db);border-radius:6px;box-shadow:0 4px 16px #00000024,0 1px 4px #00000014;padding:12px;min-width:320px;max-height:480px;overflow-y:auto}._container_3lvww_1{display:flex;flex-direction:column;gap:.5rem;width:100%;box-sizing:border-box}._row_3lvww_9{display:flex;align-items:center;gap:.5rem}._label_3lvww_15{font-size:.9rem;color:var(--de-text-secondary, #6b7280);width:1.5rem;flex-shrink:0;display:flex;justify-content:center}._inputWrapper_3lvww_24{flex:1;min-width:0;display:flex;flex-direction:column}._error_3lvww_31{font-size:.75rem;color:var(--de-error-color, #dc2626);margin-top:.25rem}._container_2zb6l_1{width:100%;height:100%;background-color:var(--de-bg-primary, #ffffff);border-left:1px solid var(--de-border-color, #e5e7eb);display:flex;flex-direction:column;overflow:hidden;box-sizing:border-box}._container_2zb6l_1 *,._container_2zb6l_1 *:before,._container_2zb6l_1 *:after{box-sizing:border-box}._scrollArea_2zb6l_18{flex:1;overflow-y:auto;overflow-x:hidden;width:100%}._fields_2zb6l_25{display:flex;flex-direction:column;gap:1rem;width:100%;box-sizing:border-box}._emptyState_2zb6l_33{display:flex;align-items:center;justify-content:center;height:100%;color:var(--de-text-tertiary, #9ca3af);font-size:.875rem;padding:1rem;text-align:center}._kindSelector_qrad9_1{display:flex;flex-wrap:wrap;gap:.25rem;padding:.5rem .75rem;border-bottom:1px solid var(--de-border-color, #e5e7eb)}._kindTab_qrad9_9{display:inline-flex;align-items:center;justify-content:center;padding:.25rem .625rem;font-size:.75rem;border:1px solid var(--de-border-color, #d1d5db);border-radius:.25rem;background-color:var(--de-bg-secondary, #f9fafb);color:var(--de-text-primary, #374151);cursor:pointer;white-space:nowrap;transition:background-color .1s,color .1s}._kindTab_qrad9_9:hover{background-color:var(--de-bg-hover, #f3f4f6)}._kindTabActive_qrad9_30{background-color:var(--de-primary-color, #2563eb);color:#fff;border-color:var(--de-primary-color, #2563eb)}._kindTabActive_qrad9_30:hover{background-color:var(--de-primary-dark, #1d4ed8)}._kindTabIcon_qrad9_40{width:1rem;height:1rem}._propertyList_qrad9_46{display:flex;flex-direction:column;gap:0;padding:.25rem 0}._propRow_qrad9_54{display:flex;align-items:center;justify-content:space-between;padding:.375rem .75rem;border-bottom:1px solid var(--de-border-color, #f3f4f6);gap:.5rem}._propRow_qrad9_54:last-child{border-bottom:none}._propInfo_qrad9_67{display:flex;align-items:center;gap:.5rem;flex:1;min-width:0}._propKind_qrad9_75{font-family:monospace;font-size:.75rem;color:var(--de-text-primary, #374151)}._customBadge_qrad9_81{font-size:.625rem;font-weight:600;padding:.1rem .375rem;border-radius:.25rem;background-color:#eff6ff;color:var(--de-primary-color, #2563eb);border:1px solid #bfdbfe;white-space:nowrap}._propActions_qrad9_92{display:flex;gap:.25rem;flex-shrink:0}._setButton_qrad9_98,._resetButton_qrad9_99{padding:.25rem .625rem;font-size:.7rem;border-radius:.25rem;border:1px solid;cursor:pointer;transition:all .1s}._setButton_qrad9_98{background-color:var(--de-bg-secondary, #f9fafb);border-color:var(--de-border-color, #d1d5db);color:var(--de-text-primary, #374151)}._setButton_qrad9_98:hover{background-color:#eff6ff;border-color:#93c5fd;color:var(--de-primary-color, #2563eb)}._resetButton_qrad9_99{background-color:#fef2f2;border-color:#fca5a5;color:var(--de-error-color, #dc2626)}._resetButton_qrad9_99:hover{background-color:#fee2e2}._emptyState_qrad9_131{padding:1rem .75rem;color:var(--de-text-tertiary, #9ca3af);font-size:.8rem;text-align:center}._description_12dfx_4{margin:0 0 8px;font-size:.7rem;color:var(--de-text-tertiary, #9ca3af)}._list_12dfx_10{display:flex;flex-direction:column;gap:8px;list-style:none;margin:0;padding:0}._item_12dfx_19{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;background-color:var(--de-bg-secondary, #f5f5f5);border:1px solid var(--de-border-color, #e0e0e0);border-radius:4px;font-size:12px;cursor:grab;transition:all .2s}._item_12dfx_19:active{cursor:grabbing}._item_12dfx_19._dragging_12dfx_36{opacity:.5;cursor:grabbing}._item_12dfx_19._selected_12dfx_41{border-color:var(--de-accent-color, #2196f3);background-color:var(--de-accent-light, rgba(33, 150, 243, .1))}._dragHandle_12dfx_46{display:flex;align-items:center;justify-content:center;width:20px;height:20px;margin-right:8px;color:var(--de-text-secondary, #666);pointer-events:none}._item_12dfx_19:hover:not(._ghost_12dfx_57){box-shadow:0 0 0 2px var(--de-accent-color, #2196f3)}._item_12dfx_19._ghost_12dfx_57{opacity:.45;border:2px dashed var(--de-accent-color, #2196f3);background-color:var(--de-accent-light, rgba(33, 150, 243, .08));cursor:default}._itemInfo_12dfx_68{display:flex;flex-direction:column;gap:4px;flex:1}._itemId_12dfx_75{font-weight:500;color:var(--de-text-primary, #333)}._itemMeta_12dfx_80{display:flex;gap:8px;font-size:11px;color:var(--de-text-secondary, #666)}._itemKind_12dfx_87{font-family:monospace}._itemIndex_12dfx_91{color:var(--de-accent-color, #2196f3)}._itemActions_12dfx_95{display:flex;gap:4px}._actionButton_12dfx_100{display:flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;border:1px solid var(--de-border-color, #e0e0e0);border-radius:4px;background-color:var(--de-bg-primary, #fff);color:var(--de-text-secondary, #666);cursor:pointer;transition:all .2s}._actionButton_12dfx_100:hover{background-color:var(--de-accent-light, rgba(33, 150, 243, .1));border-color:var(--de-accent-color, #2196f3);color:var(--de-accent-color, #2196f3)}._actionButton_12dfx_100:active{transform:scale(.95)}._actionButton_12dfx_100:disabled{opacity:.4;cursor:not-allowed}._actionButton_12dfx_100:disabled:hover{background-color:var(--de-bg-primary, #fff);border-color:var(--de-border-color, #e0e0e0);color:var(--de-text-secondary, #666)}._empty_12dfx_136{padding:24px;text-align:center;font-size:12px;color:var(--de-text-secondary, #666);background-color:var(--de-bg-secondary, #f5f5f5);border-radius:4px}._container_1x0zd_4{display:flex;flex-direction:row;align-items:center;gap:4px;padding:6px 8px;border-bottom:1px solid var(--de-border-color, #e5e7eb);background-color:var(--de-bg-secondary, #f9fafb);flex-shrink:0;flex-wrap:wrap}._group_1x0zd_16{display:flex;flex-direction:row;gap:2px}._divider_1x0zd_22{width:1px;height:20px;background-color:var(--de-border-color, #d1d5db);flex-shrink:0;margin:0 2px}._field_69k7e_6{display:flex;flex-direction:column;gap:6px}._field_69k7e_6._horizontal_69k7e_12{flex-direction:row;align-items:center;gap:4px}._label_69k7e_18{font-size:12px;font-weight:500;color:var(--de-text-secondary, #666)}._field_69k7e_6._horizontal_69k7e_12 ._label_69k7e_18{min-width:32px;flex-shrink:0}._gridSizeRow_69k7e_29{display:flex;gap:16px}._gridSizeRow_69k7e_29>._field_69k7e_6{flex:1;min-width:0}._topRow_2ni80_6{display:flex;align-items:center;justify-content:center;position:relative}._linkSwitch_2ni80_15{position:absolute;left:0;display:inline-flex;align-items:center;gap:3px}._switchLabel_2ni80_23{font-size:.625rem;font-weight:600;color:var(--de-text-tertiary, #9ca3af);-webkit-user-select:none;user-select:none;white-space:nowrap}._switchLabelActive_2ni80_31{color:var(--de-text-primary, #374151)}._toggle_2ni80_35{position:relative;width:28px;height:16px;border-radius:8px;background-color:var(--de-border-color, #d1d5db);border:none;cursor:pointer;padding:0;flex-shrink:0;transition:background-color .2s}._toggle_2ni80_35[aria-checked=true]{background-color:var(--de-primary-color, #3b82f6)}._thumb_2ni80_52{position:absolute;top:2px;left:2px;width:12px;height:12px;border-radius:50%;background-color:#fff;transition:left .2s;pointer-events:none}._toggle_2ni80_35[aria-checked=true] ._thumb_2ni80_52{left:14px}._topCell_2ni80_70{width:120px;flex-shrink:0}._sideCell_2ni80_75{width:120px;flex-shrink:0;min-width:0}._bottomCell_2ni80_81{width:120px;align-self:center}._sideMargins_2ni80_88{display:flex;gap:36px;justify-content:center}._grid_ddemj_5{display:grid;grid-template-columns:repeat(8,1fr);gap:4px 8px;align-items:center}._colSpan2_ddemj_13{grid-column:span 2}._colSpan3_ddemj_18{grid-column:span 3;min-width:0}._label_ddemj_23{font-size:12px;font-weight:500;color:var(--de-text-secondary, #666);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}._modeLabel_ddemj_32{font-size:11px;font-weight:500;color:var(--de-text-secondary, #666);white-space:nowrap}._modeToggle_ddemj_40{grid-column:span 3;display:inline-flex;align-items:center;gap:4px}._switchLabel_ddemj_47{font-size:.625rem;font-weight:600;color:var(--de-text-tertiary, #9ca3af);-webkit-user-select:none;user-select:none;white-space:nowrap}._switchLabelActive_ddemj_55{color:var(--de-text-primary, #374151)}._toggle_ddemj_59{position:relative;width:28px;height:16px;border-radius:8px;background-color:var(--de-border-color, #d1d5db);border:none;cursor:pointer;padding:0;flex-shrink:0;transition:background-color .2s}._toggle_ddemj_59[aria-checked=true]{background-color:var(--de-primary-color, #3b82f6)}._thumb_ddemj_76{position:absolute;top:2px;left:2px;width:12px;height:12px;border-radius:50%;background-color:#fff;transition:left .2s;pointer-events:none}._toggle_ddemj_59[aria-checked=true] ._thumb_ddemj_76{left:14px}._checkboxCell_ddemj_92{display:flex;justify-content:center;align-items:center}._buttonGroup_5h1ft_1{display:flex;flex-direction:column;gap:8px}._button_5h1ft_1{display:flex;align-items:center;justify-content:center;gap:8px;padding:10px 16px;border:1px solid var(--de-border-color, #e0e0e0);border-radius:4px;background-color:var(--de-bg-primary, #fff);color:var(--de-text-primary, #333);font-size:13px;font-weight:500;cursor:pointer;transition:all .2s}._button_5h1ft_1:hover{background-color:var(--de-accent-light, rgba(33, 150, 243, .1));border-color:var(--de-accent-color, #2196f3);color:var(--de-accent-color, #2196f3)}._button_5h1ft_1:active{transform:scale(.98)}._error_5h1ft_33{padding:12px;background-color:var(--de-error-bg, #ffebee);border:1px solid var(--de-error-border, #ef5350);border-radius:4px;color:var(--de-error-text, #c62828);font-size:12px;line-height:1.5;word-break:break-word}._container_16a0l_1{display:flex;flex-direction:column;width:100%;height:100%;background-color:var(--de-bg-secondary, #fafafa);overflow:hidden;box-sizing:border-box}._paletteItems_16a0l_11{flex:1;width:100%;padding:12px;overflow-y:auto;display:flex;flex-direction:column;gap:12px;box-sizing:border-box}._item_16a0l_23{display:flex;flex-direction:column;width:100%;border:1px solid var(--de-border-color, #d1d5db);border-radius:6px;background-color:var(--de-bg-primary, #ffffff);text-align:left;transition:all .2s ease;-webkit-user-select:none;user-select:none;box-sizing:border-box;flex-shrink:0;overflow:hidden}._item_16a0l_23:hover{background-color:var(--de-bg-hover, #f3f4f6);border-color:var(--de-border-hover, #9ca3af);box-shadow:0 2px 4px #0000000d}._item_16a0l_23:focus-visible{outline:2px solid var(--de-primary-color, #3b82f6);outline-offset:2px}._itemName_16a0l_49{width:100%;padding:12px;font-weight:600;font-size:14px;color:var(--de-text-primary, #1f2937);background:transparent;border:none;cursor:grab;text-align:left;transition:background-color .2s ease}._itemName_16a0l_49:hover{background-color:var(--de-bg-hover, #f9fafb)}._itemName_16a0l_49:active{cursor:grabbing;background-color:var(--de-bg-active, #f3f4f6)}._itemName_16a0l_49:focus-visible{outline:2px solid var(--de-primary-color, #3b82f6);outline-offset:-2px}._itemPreview_16a0l_77{width:100%;height:80px;padding:8px;border-top:1px solid var(--de-border-light, #e5e7eb);overflow:hidden;background:var(--de-bg-canvas, #f9fafb);display:flex;align-items:center;justify-content:center;position:relative;flex-shrink:0;box-sizing:border-box}._itemPreview_16a0l_77:after{content:"";position:absolute;top:0;left:0;right:0;bottom:0;z-index:1000;cursor:grab;pointer-events:auto}._itemPreview_16a0l_77>*{width:200px;height:100px;transform:scale(.6);transform-origin:center center;pointer-events:none;border:1px solid var(--de-border-light, #e5e7eb);border-radius:4px;background:var(--de-bg-primary, #ffffff);box-shadow:0 1px 3px #0000001a}._itemPreview_16a0l_77 *,._itemPreview_16a0l_77 *:before,._itemPreview_16a0l_77 *:after{pointer-events:none}._itemInfo_16a0l_126{display:flex;flex-direction:column}._itemDescription_16a0l_131{font-size:12px;color:var(--de-text-secondary, #6b7280);margin-bottom:4px}._itemSize_16a0l_137{font-size:11px;color:var(--de-text-tertiary, #9ca3af)}
|
|
2
|
+
|
|
3
|
+
._label_er4b8_1{position:absolute;font-size:10px;color:#0006;background-color:#fffc;padding:2px 4px;border:none;border-radius:2px;-webkit-user-select:none;user-select:none;cursor:pointer;pointer-events:auto;z-index:2800100;white-space:nowrap;transition:all .15s ease}._label_er4b8_1:hover{color:#000000b3;background-color:#fff}._label_er4b8_1:not([style*=vertical-rl]):hover{transform:translate(-50%) scale(1.1)}._label_er4b8_1[style*=vertical-rl]:hover{transform:translateY(-50%) scale(1.1)}._editor_1xj3w_1{position:absolute;display:flex;gap:4px;background-color:var(--de-bg-primary, #ffffff);border:1px solid var(--de-primary-color, #3b82f6);border-radius:4px;padding:6px;box-shadow:0 2px 8px #00000026;z-index:2800200;pointer-events:auto}._input_1xj3w_14{width:60px;height:24px;padding:2px 6px;border:1px solid var(--de-border-color, #d1d5db);border-radius:3px;font-size:12px;text-align:center}._input_1xj3w_14:focus{outline:none;border-color:var(--de-primary-color, #3b82f6)}._select_1xj3w_29{width:60px;height:24px;padding:2px 4px;border:1px solid var(--de-border-color, #d1d5db);border-radius:3px;font-size:12px;background-color:var(--de-bg-primary, #ffffff);cursor:pointer}._select_1xj3w_29:focus{outline:none;border-color:var(--de-primary-color, #3b82f6)}._button_1xj3w_45{width:24px;height:24px;display:flex;align-items:center;justify-content:center;border:1px solid var(--de-primary-color, #3b82f6);border-radius:3px;background-color:var(--de-primary-color, #3b82f6);color:#fff;font-size:14px;cursor:pointer;transition:background-color .15s ease}._button_1xj3w_45:hover{background-color:var(--de-primary-color, #2563eb)}._button_1xj3w_45:active{background-color:var(--de-primary-dark, #1d4ed8)}._handle_i8g0e_1{position:absolute;background-color:var(--de-bg-primary, #ffffff);border:1px solid var(--de-primary-color, #3b82f6);border-radius:50%;transition:opacity .2s ease,transform .2s ease;z-index:2800000;opacity:0;box-sizing:border-box}._handle_i8g0e_1:hover{opacity:1;transform:scale(1.2)}._handle_i8g0e_1._dragging_i8g0e_19{opacity:1;background-color:var(--de-primary-color, #3b82f6);transform:scale(1.2)}
|