@hirokisakabe/pom 8.8.0 → 8.9.0

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 CHANGED
@@ -44,7 +44,7 @@
44
44
  - **Rich Nodes** — 20 built-in node types: charts, flowcharts, tables, timelines, org trees, and more.
45
45
  - **Design Tokens** — Declare a color palette once with a top-level `<Theme>` element and reference tokens as `$name` from any color attribute. See [Nodes — Top-Level `<Theme>`](./docs/nodes.md#top-level-theme-design-tokens).
46
46
  - **Schema-validated** — XML input is validated with Zod schemas at runtime with clear error messages.
47
- - **PowerPoint Native** — Generates real editable PowerPoint shapes — not images. Recipients can modify everything. Linear gradient backgrounds (`backgroundGradient="linear-gradient(135deg, #667EEA 0%, #764BA2 100%)"`) and text fills (`textGradient="linear-gradient(90deg, #38BDF8 0%, #A78BFA 100%)"` on `<Text>`) are exported as native gradient fills.
47
+ - **PowerPoint Native** — Generates real editable PowerPoint shapes — not images. Recipients can modify everything. Linear / radial gradient backgrounds (`backgroundGradient="linear-gradient(135deg, #667EEA 0%, #764BA2 100%)"` or `backgroundGradient="radial-gradient(circle at center, #1D4ED8 0%, #38BDF8 100%)"`) and text fills (`textGradient="linear-gradient(90deg, #38BDF8 0%, #A78BFA 100%)"` on `<Text>`) are exported as native gradient fills.
48
48
  - **Leaf Rotation** — `Text`, `Shape`, `Image`, and `Icon` support `rotate` in clockwise degrees at render time without affecting flex layout.
49
49
  - **Pixel Units** — Intuitive pixel-based sizing (internally converted to inches at 96 DPI).
50
50
  - **Master Slide** — Define headers, footers, and page numbers once — applied to all slides automatically.
@@ -199,6 +199,18 @@ For detailed node documentation, see [Nodes](./docs/nodes.md).
199
199
  </Timeline>
200
200
  ```
201
201
 
202
+ `connectorColor` / `connectorGradient` customize the axis line. `useColorForDate` makes each item's date inherit its `color`, and `TimelineItem.dateColor` overrides per item. `fontFamily` swaps the default `Noto Sans JP` for any other family.
203
+
204
+ ```xml
205
+ <Timeline direction="horizontal" w="100%" h="120"
206
+ connectorGradient="linear-gradient(90deg, #1D4ED8 0%, #DC2626 100%)"
207
+ useColorForDate="true" fontFamily="Arial">
208
+ <TimelineItem date="Start" title="Begin" color="1D4ED8" />
209
+ <TimelineItem date="Mid" title="Middle" color="9333EA" dateColor="111827" />
210
+ <TimelineItem date="End" title="Finish" color="DC2626" />
211
+ </Timeline>
212
+ ```
213
+
202
214
  <img src="./docs/images/timeline.png" alt="Timeline example" width="600">
203
215
 
204
216
  ### ProcessArrow
@@ -382,7 +382,11 @@ const NODE_COERCION_MAP = {
382
382
  items: "json",
383
383
  dateColor: "string",
384
384
  titleColor: "string",
385
- descriptionColor: "string"
385
+ descriptionColor: "string",
386
+ connectorColor: "string",
387
+ connectorGradient: "string",
388
+ useColorForDate: "boolean",
389
+ fontFamily: "string"
386
390
  },
387
391
  matrix: {
388
392
  ...BASE_RULES,
@@ -491,7 +495,8 @@ const CHILD_ELEMENT_COERCION_MAP = {
491
495
  date: "string",
492
496
  title: "string",
493
497
  description: "string",
494
- color: "string"
498
+ color: "string",
499
+ dateColor: "string"
495
500
  },
496
501
  MatrixAxes: {
497
502
  x: "string",
@@ -1 +1 @@
1
- {"version":3,"file":"coercionRules.js","names":[],"sources":["../../src/parseXml/coercionRules.ts"],"sourcesContent":["/**\n * 明示的な型変換ルール定義\n *\n * Zod の内部構造(_def)に依存せず、XML 属性値の文字列→適切な型への変換ルールを\n * 静的に定義する。各ノードタイプ・子要素タイプごとに変換テーブルを持つ。\n */\n\n// ===== CoercionRule 型定義 =====\nexport type CoercionRule =\n | \"number\"\n | \"boolean\"\n | \"string\" // string, enum を含む\n | \"json\" // array, object, record, tuple → JSON.parse\n | { type: \"literal\"; value: string | number | boolean }\n | { type: \"union\"; options: CoercionRule[] }\n | { type: \"object\"; shape: Record<string, CoercionRule> };\n\n// ===== 変換関数 =====\n\nexport function coerceWithRule(\n value: string,\n rule: CoercionRule,\n): { value: unknown; error: string | null } {\n if (rule === \"number\") {\n if (value === \"\") {\n return {\n value: undefined,\n error: `Cannot convert \"${value}\" to number`,\n };\n }\n const num = Number(value);\n if (isNaN(num)) {\n return {\n value: undefined,\n error: `Cannot convert \"${value}\" to number`,\n };\n }\n return { value: num, error: null };\n }\n if (rule === \"boolean\") {\n if (value !== \"true\" && value !== \"false\") {\n return {\n value: undefined,\n error: `Cannot convert \"${value}\" to boolean (expected \"true\" or \"false\")`,\n };\n }\n return { value: value === \"true\", error: null };\n }\n if (rule === \"string\") {\n return { value, error: null };\n }\n if (rule === \"json\") {\n try {\n return { value: JSON.parse(value), error: null };\n } catch {\n return {\n value: undefined,\n error: `Cannot parse JSON value: \"${value}\"`,\n };\n }\n }\n // オブジェクト型のルール\n if (rule.type === \"literal\") {\n return { value: rule.value, error: null };\n }\n if (rule.type === \"union\") {\n return { value: coerceUnionWithRules(value, rule.options), error: null };\n }\n if (rule.type === \"object\") {\n try {\n return { value: JSON.parse(value), error: null };\n } catch {\n return {\n value: undefined,\n error: `Cannot parse JSON value: \"${value}\"`,\n };\n }\n }\n return { value: coerceFallback(value), error: null };\n}\n\nexport function coerceUnionWithRules(\n value: string,\n options: CoercionRule[],\n): unknown {\n // boolean を試行\n if ((value === \"true\" || value === \"false\") && options.includes(\"boolean\")) {\n return value === \"true\";\n }\n\n // number を試行\n if (options.includes(\"number\")) {\n const num = Number(value);\n if (!isNaN(num) && value !== \"\") {\n return num;\n }\n }\n\n // literal を試行\n for (const opt of options) {\n if (typeof opt === \"object\" && opt.type === \"literal\") {\n if (`${opt.value as string | number}` === value) return opt.value;\n }\n }\n\n // object/json を試行(JSON パース)\n if (\n options.some(\n (opt) =>\n opt === \"json\" || (typeof opt === \"object\" && opt.type === \"object\"),\n )\n ) {\n if (value.startsWith(\"{\") || value.startsWith(\"[\")) {\n try {\n return JSON.parse(value);\n } catch {\n /* ignore */\n }\n }\n }\n\n // string にフォールバック\n return value;\n}\n\nexport function coerceFallback(value: string): unknown {\n if (value === \"true\") return true;\n if (value === \"false\") return false;\n const num = Number(value);\n if (value !== \"\" && !isNaN(num)) return num;\n if (value.startsWith(\"{\") || value.startsWith(\"[\")) {\n try {\n return JSON.parse(value);\n } catch {\n /* ignore */\n }\n }\n return value;\n}\n\n/**\n * CoercionRule からオブジェクト型の shape を取得する。\n * dot notation の展開で使用。\n */\nexport function getObjectShapeFromRule(\n rule: CoercionRule,\n): Record<string, CoercionRule> | undefined {\n if (typeof rule === \"object\" && rule.type === \"object\") {\n return rule.shape;\n }\n if (typeof rule === \"object\" && rule.type === \"union\") {\n const objectOpt = rule.options.find(\n (opt): opt is { type: \"object\"; shape: Record<string, CoercionRule> } =>\n typeof opt === \"object\" && opt.type === \"object\",\n );\n return objectOpt?.shape;\n }\n return undefined;\n}\n\n/**\n * boolean と object の union かどうかを判定する。\n * endArrow=\"true\" と endArrow.type=\"triangle\" の共存を許可するために使用。\n */\nexport function isBooleanObjectUnionRule(rule: CoercionRule): boolean {\n if (typeof rule === \"string\") return false;\n if (rule.type !== \"union\") return false;\n const hasBoolean = rule.options.includes(\"boolean\");\n const hasObject = rule.options.some(\n (opt) => typeof opt === \"object\" && opt.type === \"object\",\n );\n return hasBoolean && hasObject;\n}\n\ntype ResolvedMixedNotationShorthand =\n | { mode: \"merge\"; value: Record<string, unknown> }\n | { mode: \"ignore\" }\n | { mode: \"conflict\" };\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isDirectionalBoxShape(shape: Record<string, CoercionRule>): boolean {\n const keys = Object.keys(shape).sort();\n return (\n keys.length === 4 &&\n keys[0] === \"bottom\" &&\n keys[1] === \"left\" &&\n keys[2] === \"right\" &&\n keys[3] === \"top\"\n );\n}\n\n/**\n * 同一属性で shorthand と dot notation を併用したときに、\n * shorthand 側をどのように扱うかを解決する。\n *\n * - merge: shorthand をオブジェクト化して dot notation 側で上書き\n * - ignore: boolean shorthand を無視して dot notation を優先\n * - conflict: 併用不可(従来どおりエラー)\n */\nexport function resolveMixedNotationShorthand(\n value: string,\n rule: CoercionRule,\n): ResolvedMixedNotationShorthand {\n const objectShape = getObjectShapeFromRule(rule);\n if (!objectShape) return { mode: \"conflict\" };\n\n if (\n isBooleanObjectUnionRule(rule) &&\n (value === \"true\" || value === \"false\")\n ) {\n return { mode: \"ignore\" };\n }\n\n const coerced = coerceWithRule(value, rule);\n if (coerced.error !== null) return { mode: \"conflict\" };\n\n if (isPlainObject(coerced.value)) {\n return { mode: \"merge\", value: coerced.value };\n }\n\n if (typeof coerced.value === \"number\" && isDirectionalBoxShape(objectShape)) {\n return {\n mode: \"merge\",\n value: {\n top: coerced.value,\n right: coerced.value,\n bottom: coerced.value,\n left: coerced.value,\n },\n };\n }\n\n return { mode: \"conflict\" };\n}\n\n// ===== 共通変換ルール =====\n\nconst LENGTH_RULE: CoercionRule = {\n type: \"union\",\n options: [\"number\", { type: \"literal\", value: \"max\" }, \"string\"],\n};\n\nconst PADDING_RULE: CoercionRule = {\n type: \"union\",\n options: [\n \"number\",\n {\n type: \"object\",\n shape: {\n top: \"number\",\n right: \"number\",\n bottom: \"number\",\n left: \"number\",\n },\n },\n ],\n};\n\nconst BORDER_STYLE_RULE: CoercionRule = {\n type: \"object\",\n shape: { color: \"string\", width: \"number\", dashType: \"string\" },\n};\n\nconst FILL_STYLE_RULE: CoercionRule = {\n type: \"object\",\n shape: { color: \"string\", transparency: \"number\" },\n};\n\nconst SHADOW_STYLE_RULE: CoercionRule = {\n type: \"object\",\n shape: {\n type: \"string\",\n opacity: \"number\",\n blur: \"number\",\n angle: \"number\",\n offset: \"number\",\n color: \"string\",\n },\n};\n\nconst UNDERLINE_RULE: CoercionRule = {\n type: \"union\",\n options: [\n \"boolean\",\n { type: \"object\", shape: { style: \"string\", color: \"string\" } },\n ],\n};\n\nconst TEXT_GLOW_RULE: CoercionRule = {\n type: \"object\",\n shape: { size: \"number\", opacity: \"number\", color: \"string\" },\n};\n\nconst TEXT_OUTLINE_RULE: CoercionRule = {\n type: \"object\",\n shape: { size: \"number\", color: \"string\" },\n};\n\nconst LINE_ARROW_RULE: CoercionRule = {\n type: \"union\",\n options: [\"boolean\", { type: \"object\", shape: { type: \"string\" } }],\n};\n\nconst BACKGROUND_IMAGE_RULE: CoercionRule = {\n type: \"object\",\n shape: { src: \"string\", sizing: \"string\" },\n};\n\nconst TREE_CONNECTOR_STYLE_RULE: CoercionRule = {\n type: \"object\",\n shape: { color: \"string\", width: \"number\" },\n};\n\nconst FLOW_CONNECTOR_STYLE_RULE: CoercionRule = {\n type: \"object\",\n shape: {\n color: \"string\",\n width: \"number\",\n arrowType: \"string\",\n labelColor: \"string\",\n },\n};\n\nconst IMAGE_SIZING_RULE: CoercionRule = {\n type: \"object\",\n shape: {\n type: \"string\",\n w: \"number\",\n h: \"number\",\n x: \"number\",\n y: \"number\",\n },\n};\n\n// ===== Base node 属性 =====\nconst BASE_RULES: Record<string, CoercionRule> = {\n id: \"string\",\n w: LENGTH_RULE,\n h: LENGTH_RULE,\n grow: \"number\",\n minW: \"number\",\n maxW: \"number\",\n minH: \"number\",\n maxH: \"number\",\n padding: PADDING_RULE,\n margin: PADDING_RULE,\n backgroundColor: \"string\",\n backgroundGradient: \"string\",\n backgroundImage: BACKGROUND_IMAGE_RULE,\n border: BORDER_STYLE_RULE,\n borderTop: BORDER_STYLE_RULE,\n borderRight: BORDER_STYLE_RULE,\n borderBottom: BORDER_STYLE_RULE,\n borderLeft: BORDER_STYLE_RULE,\n borderRadius: \"number\",\n opacity: \"number\",\n zIndex: \"number\",\n position: \"string\",\n top: \"number\",\n right: \"number\",\n bottom: \"number\",\n left: \"number\",\n alignSelf: \"string\",\n shadow: SHADOW_STYLE_RULE,\n};\n\n// テキスト系の共通属性\nconst TEXT_STYLE_RULES: Record<string, CoercionRule> = {\n fontSize: \"number\",\n color: \"string\",\n textAlign: \"string\",\n bold: \"boolean\",\n italic: \"boolean\",\n underline: UNDERLINE_RULE,\n strike: \"boolean\",\n subscript: \"boolean\",\n superscript: \"boolean\",\n highlight: \"string\",\n fontFamily: \"string\",\n lineHeight: \"number\",\n};\n\n// ===== ノードタイプ別の変換ルールマップ =====\nexport const NODE_COERCION_MAP: Record<string, Record<string, CoercionRule>> = {\n text: {\n ...BASE_RULES,\n text: \"string\",\n rotate: \"number\",\n ...TEXT_STYLE_RULES,\n textGradient: \"string\",\n letterSpacing: \"number\",\n glow: TEXT_GLOW_RULE,\n outline: TEXT_OUTLINE_RULE,\n },\n ul: {\n ...BASE_RULES,\n items: \"json\",\n ...TEXT_STYLE_RULES,\n },\n ol: {\n ...BASE_RULES,\n items: \"json\",\n ...TEXT_STYLE_RULES,\n numberType: \"string\",\n numberStartAt: \"number\",\n },\n image: {\n ...BASE_RULES,\n src: \"string\",\n sizing: IMAGE_SIZING_RULE,\n rotate: \"number\",\n },\n icon: {\n ...BASE_RULES,\n name: \"string\",\n size: \"number\",\n color: \"string\",\n variant: \"string\",\n bgColor: \"string\",\n glow: TEXT_GLOW_RULE,\n outline: TEXT_OUTLINE_RULE,\n rotate: \"number\",\n },\n svg: {\n ...BASE_RULES,\n color: \"string\",\n },\n table: {\n ...BASE_RULES,\n columns: \"json\",\n rows: \"json\",\n defaultRowHeight: \"number\",\n cellBorder: BORDER_STYLE_RULE,\n },\n shape: {\n ...BASE_RULES,\n shapeType: \"string\",\n text: \"string\",\n rotate: \"number\",\n fill: FILL_STYLE_RULE,\n line: BORDER_STYLE_RULE,\n glow: TEXT_GLOW_RULE,\n outline: TEXT_OUTLINE_RULE,\n ...TEXT_STYLE_RULES,\n },\n chart: {\n ...BASE_RULES,\n chartType: \"string\",\n data: \"json\",\n showLegend: \"boolean\",\n showTitle: \"boolean\",\n title: \"string\",\n chartColors: \"json\",\n radarStyle: \"string\",\n sparkline: \"boolean\",\n },\n timeline: {\n ...BASE_RULES,\n direction: \"string\",\n items: \"json\",\n dateColor: \"string\",\n titleColor: \"string\",\n descriptionColor: \"string\",\n },\n matrix: {\n ...BASE_RULES,\n axes: \"json\",\n quadrants: \"json\",\n items: \"json\",\n axisLabelColor: \"string\",\n quadrantLabelColor: \"string\",\n itemLabelColor: \"string\",\n },\n tree: {\n ...BASE_RULES,\n layout: \"string\",\n nodeShape: \"string\",\n data: \"json\",\n textColor: \"string\",\n connectorStyle: TREE_CONNECTOR_STYLE_RULE,\n nodeWidth: \"number\",\n nodeHeight: \"number\",\n levelGap: \"number\",\n siblingGap: \"number\",\n },\n flow: {\n ...BASE_RULES,\n direction: \"string\",\n nodes: \"json\",\n connections: \"json\",\n connectorStyle: FLOW_CONNECTOR_STYLE_RULE,\n nodeWidth: \"number\",\n nodeHeight: \"number\",\n nodeGap: \"number\",\n },\n processArrow: {\n ...BASE_RULES,\n direction: \"string\",\n steps: \"json\",\n itemWidth: \"number\",\n itemHeight: \"number\",\n gap: \"number\",\n fontSize: \"number\",\n bold: \"boolean\",\n italic: \"boolean\",\n underline: UNDERLINE_RULE,\n strike: \"boolean\",\n highlight: \"string\",\n fontFamily: \"string\",\n },\n pyramid: {\n ...BASE_RULES,\n direction: \"string\",\n levels: \"json\",\n fontSize: \"number\",\n bold: \"boolean\",\n fontFamily: \"string\",\n },\n line: {\n ...BASE_RULES,\n x1: \"number\",\n y1: \"number\",\n x2: \"number\",\n y2: \"number\",\n color: \"string\",\n lineWidth: \"number\",\n dashType: \"string\",\n beginArrow: LINE_ARROW_RULE,\n endArrow: LINE_ARROW_RULE,\n },\n arrow: {\n ...BASE_RULES,\n from: \"string\",\n to: \"string\",\n color: \"string\",\n lineWidth: \"number\",\n dashType: \"string\",\n beginArrow: LINE_ARROW_RULE,\n endArrow: LINE_ARROW_RULE,\n },\n // コンテナノード\n vstack: {\n ...BASE_RULES,\n gap: \"number\",\n alignItems: \"string\",\n justifyContent: \"string\",\n flexWrap: \"string\",\n },\n hstack: {\n ...BASE_RULES,\n gap: \"number\",\n alignItems: \"string\",\n justifyContent: \"string\",\n flexWrap: \"string\",\n },\n layer: {\n ...BASE_RULES,\n },\n};\n\n// ===== 子要素の変換ルールマップ =====\nexport const CHILD_ELEMENT_COERCION_MAP: Record<\n string,\n Record<string, CoercionRule>\n> = {\n ProcessArrowStep: {\n label: \"string\",\n color: \"string\",\n textColor: \"string\",\n },\n PyramidLevel: {\n label: \"string\",\n color: \"string\",\n textColor: \"string\",\n },\n TimelineItem: {\n date: \"string\",\n title: \"string\",\n description: \"string\",\n color: \"string\",\n },\n MatrixAxes: {\n x: \"string\",\n y: \"string\",\n },\n MatrixQuadrants: {\n topLeft: \"string\",\n topRight: \"string\",\n bottomLeft: \"string\",\n bottomRight: \"string\",\n },\n MatrixItem: {\n label: \"string\",\n x: \"number\",\n y: \"number\",\n color: \"string\",\n textColor: \"string\",\n },\n FlowNode: {\n id: \"string\",\n shape: \"string\",\n text: \"string\",\n color: \"string\",\n textColor: \"string\",\n width: \"number\",\n height: \"number\",\n },\n FlowConnection: {\n from: \"string\",\n to: \"string\",\n label: \"string\",\n color: \"string\",\n labelColor: \"string\",\n },\n Col: {\n width: \"number\",\n },\n Td: {\n text: \"string\",\n fontSize: \"number\",\n color: \"string\",\n bold: \"boolean\",\n italic: \"boolean\",\n underline: UNDERLINE_RULE,\n strike: \"boolean\",\n subscript: \"boolean\",\n superscript: \"boolean\",\n highlight: \"string\",\n fontFamily: \"string\",\n textAlign: \"string\",\n backgroundColor: \"string\",\n colspan: \"number\",\n rowspan: \"number\",\n },\n Li: {\n text: \"string\",\n bold: \"boolean\",\n italic: \"boolean\",\n underline: UNDERLINE_RULE,\n strike: \"boolean\",\n subscript: \"boolean\",\n superscript: \"boolean\",\n highlight: \"string\",\n color: \"string\",\n fontSize: \"number\",\n fontFamily: \"string\",\n },\n B: {},\n I: {},\n Span: {\n color: \"string\",\n fontFamily: \"string\",\n fontSize: \"number\",\n letterSpacing: \"number\",\n },\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"coercionRules.js","names":[],"sources":["../../src/parseXml/coercionRules.ts"],"sourcesContent":["/**\n * 明示的な型変換ルール定義\n *\n * Zod の内部構造(_def)に依存せず、XML 属性値の文字列→適切な型への変換ルールを\n * 静的に定義する。各ノードタイプ・子要素タイプごとに変換テーブルを持つ。\n */\n\n// ===== CoercionRule 型定義 =====\nexport type CoercionRule =\n | \"number\"\n | \"boolean\"\n | \"string\" // string, enum を含む\n | \"json\" // array, object, record, tuple → JSON.parse\n | { type: \"literal\"; value: string | number | boolean }\n | { type: \"union\"; options: CoercionRule[] }\n | { type: \"object\"; shape: Record<string, CoercionRule> };\n\n// ===== 変換関数 =====\n\nexport function coerceWithRule(\n value: string,\n rule: CoercionRule,\n): { value: unknown; error: string | null } {\n if (rule === \"number\") {\n if (value === \"\") {\n return {\n value: undefined,\n error: `Cannot convert \"${value}\" to number`,\n };\n }\n const num = Number(value);\n if (isNaN(num)) {\n return {\n value: undefined,\n error: `Cannot convert \"${value}\" to number`,\n };\n }\n return { value: num, error: null };\n }\n if (rule === \"boolean\") {\n if (value !== \"true\" && value !== \"false\") {\n return {\n value: undefined,\n error: `Cannot convert \"${value}\" to boolean (expected \"true\" or \"false\")`,\n };\n }\n return { value: value === \"true\", error: null };\n }\n if (rule === \"string\") {\n return { value, error: null };\n }\n if (rule === \"json\") {\n try {\n return { value: JSON.parse(value), error: null };\n } catch {\n return {\n value: undefined,\n error: `Cannot parse JSON value: \"${value}\"`,\n };\n }\n }\n // オブジェクト型のルール\n if (rule.type === \"literal\") {\n return { value: rule.value, error: null };\n }\n if (rule.type === \"union\") {\n return { value: coerceUnionWithRules(value, rule.options), error: null };\n }\n if (rule.type === \"object\") {\n try {\n return { value: JSON.parse(value), error: null };\n } catch {\n return {\n value: undefined,\n error: `Cannot parse JSON value: \"${value}\"`,\n };\n }\n }\n return { value: coerceFallback(value), error: null };\n}\n\nexport function coerceUnionWithRules(\n value: string,\n options: CoercionRule[],\n): unknown {\n // boolean を試行\n if ((value === \"true\" || value === \"false\") && options.includes(\"boolean\")) {\n return value === \"true\";\n }\n\n // number を試行\n if (options.includes(\"number\")) {\n const num = Number(value);\n if (!isNaN(num) && value !== \"\") {\n return num;\n }\n }\n\n // literal を試行\n for (const opt of options) {\n if (typeof opt === \"object\" && opt.type === \"literal\") {\n if (`${opt.value as string | number}` === value) return opt.value;\n }\n }\n\n // object/json を試行(JSON パース)\n if (\n options.some(\n (opt) =>\n opt === \"json\" || (typeof opt === \"object\" && opt.type === \"object\"),\n )\n ) {\n if (value.startsWith(\"{\") || value.startsWith(\"[\")) {\n try {\n return JSON.parse(value);\n } catch {\n /* ignore */\n }\n }\n }\n\n // string にフォールバック\n return value;\n}\n\nexport function coerceFallback(value: string): unknown {\n if (value === \"true\") return true;\n if (value === \"false\") return false;\n const num = Number(value);\n if (value !== \"\" && !isNaN(num)) return num;\n if (value.startsWith(\"{\") || value.startsWith(\"[\")) {\n try {\n return JSON.parse(value);\n } catch {\n /* ignore */\n }\n }\n return value;\n}\n\n/**\n * CoercionRule からオブジェクト型の shape を取得する。\n * dot notation の展開で使用。\n */\nexport function getObjectShapeFromRule(\n rule: CoercionRule,\n): Record<string, CoercionRule> | undefined {\n if (typeof rule === \"object\" && rule.type === \"object\") {\n return rule.shape;\n }\n if (typeof rule === \"object\" && rule.type === \"union\") {\n const objectOpt = rule.options.find(\n (opt): opt is { type: \"object\"; shape: Record<string, CoercionRule> } =>\n typeof opt === \"object\" && opt.type === \"object\",\n );\n return objectOpt?.shape;\n }\n return undefined;\n}\n\n/**\n * boolean と object の union かどうかを判定する。\n * endArrow=\"true\" と endArrow.type=\"triangle\" の共存を許可するために使用。\n */\nexport function isBooleanObjectUnionRule(rule: CoercionRule): boolean {\n if (typeof rule === \"string\") return false;\n if (rule.type !== \"union\") return false;\n const hasBoolean = rule.options.includes(\"boolean\");\n const hasObject = rule.options.some(\n (opt) => typeof opt === \"object\" && opt.type === \"object\",\n );\n return hasBoolean && hasObject;\n}\n\ntype ResolvedMixedNotationShorthand =\n | { mode: \"merge\"; value: Record<string, unknown> }\n | { mode: \"ignore\" }\n | { mode: \"conflict\" };\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isDirectionalBoxShape(shape: Record<string, CoercionRule>): boolean {\n const keys = Object.keys(shape).sort();\n return (\n keys.length === 4 &&\n keys[0] === \"bottom\" &&\n keys[1] === \"left\" &&\n keys[2] === \"right\" &&\n keys[3] === \"top\"\n );\n}\n\n/**\n * 同一属性で shorthand と dot notation を併用したときに、\n * shorthand 側をどのように扱うかを解決する。\n *\n * - merge: shorthand をオブジェクト化して dot notation 側で上書き\n * - ignore: boolean shorthand を無視して dot notation を優先\n * - conflict: 併用不可(従来どおりエラー)\n */\nexport function resolveMixedNotationShorthand(\n value: string,\n rule: CoercionRule,\n): ResolvedMixedNotationShorthand {\n const objectShape = getObjectShapeFromRule(rule);\n if (!objectShape) return { mode: \"conflict\" };\n\n if (\n isBooleanObjectUnionRule(rule) &&\n (value === \"true\" || value === \"false\")\n ) {\n return { mode: \"ignore\" };\n }\n\n const coerced = coerceWithRule(value, rule);\n if (coerced.error !== null) return { mode: \"conflict\" };\n\n if (isPlainObject(coerced.value)) {\n return { mode: \"merge\", value: coerced.value };\n }\n\n if (typeof coerced.value === \"number\" && isDirectionalBoxShape(objectShape)) {\n return {\n mode: \"merge\",\n value: {\n top: coerced.value,\n right: coerced.value,\n bottom: coerced.value,\n left: coerced.value,\n },\n };\n }\n\n return { mode: \"conflict\" };\n}\n\n// ===== 共通変換ルール =====\n\nconst LENGTH_RULE: CoercionRule = {\n type: \"union\",\n options: [\"number\", { type: \"literal\", value: \"max\" }, \"string\"],\n};\n\nconst PADDING_RULE: CoercionRule = {\n type: \"union\",\n options: [\n \"number\",\n {\n type: \"object\",\n shape: {\n top: \"number\",\n right: \"number\",\n bottom: \"number\",\n left: \"number\",\n },\n },\n ],\n};\n\nconst BORDER_STYLE_RULE: CoercionRule = {\n type: \"object\",\n shape: { color: \"string\", width: \"number\", dashType: \"string\" },\n};\n\nconst FILL_STYLE_RULE: CoercionRule = {\n type: \"object\",\n shape: { color: \"string\", transparency: \"number\" },\n};\n\nconst SHADOW_STYLE_RULE: CoercionRule = {\n type: \"object\",\n shape: {\n type: \"string\",\n opacity: \"number\",\n blur: \"number\",\n angle: \"number\",\n offset: \"number\",\n color: \"string\",\n },\n};\n\nconst UNDERLINE_RULE: CoercionRule = {\n type: \"union\",\n options: [\n \"boolean\",\n { type: \"object\", shape: { style: \"string\", color: \"string\" } },\n ],\n};\n\nconst TEXT_GLOW_RULE: CoercionRule = {\n type: \"object\",\n shape: { size: \"number\", opacity: \"number\", color: \"string\" },\n};\n\nconst TEXT_OUTLINE_RULE: CoercionRule = {\n type: \"object\",\n shape: { size: \"number\", color: \"string\" },\n};\n\nconst LINE_ARROW_RULE: CoercionRule = {\n type: \"union\",\n options: [\"boolean\", { type: \"object\", shape: { type: \"string\" } }],\n};\n\nconst BACKGROUND_IMAGE_RULE: CoercionRule = {\n type: \"object\",\n shape: { src: \"string\", sizing: \"string\" },\n};\n\nconst TREE_CONNECTOR_STYLE_RULE: CoercionRule = {\n type: \"object\",\n shape: { color: \"string\", width: \"number\" },\n};\n\nconst FLOW_CONNECTOR_STYLE_RULE: CoercionRule = {\n type: \"object\",\n shape: {\n color: \"string\",\n width: \"number\",\n arrowType: \"string\",\n labelColor: \"string\",\n },\n};\n\nconst IMAGE_SIZING_RULE: CoercionRule = {\n type: \"object\",\n shape: {\n type: \"string\",\n w: \"number\",\n h: \"number\",\n x: \"number\",\n y: \"number\",\n },\n};\n\n// ===== Base node 属性 =====\nconst BASE_RULES: Record<string, CoercionRule> = {\n id: \"string\",\n w: LENGTH_RULE,\n h: LENGTH_RULE,\n grow: \"number\",\n minW: \"number\",\n maxW: \"number\",\n minH: \"number\",\n maxH: \"number\",\n padding: PADDING_RULE,\n margin: PADDING_RULE,\n backgroundColor: \"string\",\n backgroundGradient: \"string\",\n backgroundImage: BACKGROUND_IMAGE_RULE,\n border: BORDER_STYLE_RULE,\n borderTop: BORDER_STYLE_RULE,\n borderRight: BORDER_STYLE_RULE,\n borderBottom: BORDER_STYLE_RULE,\n borderLeft: BORDER_STYLE_RULE,\n borderRadius: \"number\",\n opacity: \"number\",\n zIndex: \"number\",\n position: \"string\",\n top: \"number\",\n right: \"number\",\n bottom: \"number\",\n left: \"number\",\n alignSelf: \"string\",\n shadow: SHADOW_STYLE_RULE,\n};\n\n// テキスト系の共通属性\nconst TEXT_STYLE_RULES: Record<string, CoercionRule> = {\n fontSize: \"number\",\n color: \"string\",\n textAlign: \"string\",\n bold: \"boolean\",\n italic: \"boolean\",\n underline: UNDERLINE_RULE,\n strike: \"boolean\",\n subscript: \"boolean\",\n superscript: \"boolean\",\n highlight: \"string\",\n fontFamily: \"string\",\n lineHeight: \"number\",\n};\n\n// ===== ノードタイプ別の変換ルールマップ =====\nexport const NODE_COERCION_MAP: Record<string, Record<string, CoercionRule>> = {\n text: {\n ...BASE_RULES,\n text: \"string\",\n rotate: \"number\",\n ...TEXT_STYLE_RULES,\n textGradient: \"string\",\n letterSpacing: \"number\",\n glow: TEXT_GLOW_RULE,\n outline: TEXT_OUTLINE_RULE,\n },\n ul: {\n ...BASE_RULES,\n items: \"json\",\n ...TEXT_STYLE_RULES,\n },\n ol: {\n ...BASE_RULES,\n items: \"json\",\n ...TEXT_STYLE_RULES,\n numberType: \"string\",\n numberStartAt: \"number\",\n },\n image: {\n ...BASE_RULES,\n src: \"string\",\n sizing: IMAGE_SIZING_RULE,\n rotate: \"number\",\n },\n icon: {\n ...BASE_RULES,\n name: \"string\",\n size: \"number\",\n color: \"string\",\n variant: \"string\",\n bgColor: \"string\",\n glow: TEXT_GLOW_RULE,\n outline: TEXT_OUTLINE_RULE,\n rotate: \"number\",\n },\n svg: {\n ...BASE_RULES,\n color: \"string\",\n },\n table: {\n ...BASE_RULES,\n columns: \"json\",\n rows: \"json\",\n defaultRowHeight: \"number\",\n cellBorder: BORDER_STYLE_RULE,\n },\n shape: {\n ...BASE_RULES,\n shapeType: \"string\",\n text: \"string\",\n rotate: \"number\",\n fill: FILL_STYLE_RULE,\n line: BORDER_STYLE_RULE,\n glow: TEXT_GLOW_RULE,\n outline: TEXT_OUTLINE_RULE,\n ...TEXT_STYLE_RULES,\n },\n chart: {\n ...BASE_RULES,\n chartType: \"string\",\n data: \"json\",\n showLegend: \"boolean\",\n showTitle: \"boolean\",\n title: \"string\",\n chartColors: \"json\",\n radarStyle: \"string\",\n sparkline: \"boolean\",\n },\n timeline: {\n ...BASE_RULES,\n direction: \"string\",\n items: \"json\",\n dateColor: \"string\",\n titleColor: \"string\",\n descriptionColor: \"string\",\n connectorColor: \"string\",\n connectorGradient: \"string\",\n useColorForDate: \"boolean\",\n fontFamily: \"string\",\n },\n matrix: {\n ...BASE_RULES,\n axes: \"json\",\n quadrants: \"json\",\n items: \"json\",\n axisLabelColor: \"string\",\n quadrantLabelColor: \"string\",\n itemLabelColor: \"string\",\n },\n tree: {\n ...BASE_RULES,\n layout: \"string\",\n nodeShape: \"string\",\n data: \"json\",\n textColor: \"string\",\n connectorStyle: TREE_CONNECTOR_STYLE_RULE,\n nodeWidth: \"number\",\n nodeHeight: \"number\",\n levelGap: \"number\",\n siblingGap: \"number\",\n },\n flow: {\n ...BASE_RULES,\n direction: \"string\",\n nodes: \"json\",\n connections: \"json\",\n connectorStyle: FLOW_CONNECTOR_STYLE_RULE,\n nodeWidth: \"number\",\n nodeHeight: \"number\",\n nodeGap: \"number\",\n },\n processArrow: {\n ...BASE_RULES,\n direction: \"string\",\n steps: \"json\",\n itemWidth: \"number\",\n itemHeight: \"number\",\n gap: \"number\",\n fontSize: \"number\",\n bold: \"boolean\",\n italic: \"boolean\",\n underline: UNDERLINE_RULE,\n strike: \"boolean\",\n highlight: \"string\",\n fontFamily: \"string\",\n },\n pyramid: {\n ...BASE_RULES,\n direction: \"string\",\n levels: \"json\",\n fontSize: \"number\",\n bold: \"boolean\",\n fontFamily: \"string\",\n },\n line: {\n ...BASE_RULES,\n x1: \"number\",\n y1: \"number\",\n x2: \"number\",\n y2: \"number\",\n color: \"string\",\n lineWidth: \"number\",\n dashType: \"string\",\n beginArrow: LINE_ARROW_RULE,\n endArrow: LINE_ARROW_RULE,\n },\n arrow: {\n ...BASE_RULES,\n from: \"string\",\n to: \"string\",\n color: \"string\",\n lineWidth: \"number\",\n dashType: \"string\",\n beginArrow: LINE_ARROW_RULE,\n endArrow: LINE_ARROW_RULE,\n },\n // コンテナノード\n vstack: {\n ...BASE_RULES,\n gap: \"number\",\n alignItems: \"string\",\n justifyContent: \"string\",\n flexWrap: \"string\",\n },\n hstack: {\n ...BASE_RULES,\n gap: \"number\",\n alignItems: \"string\",\n justifyContent: \"string\",\n flexWrap: \"string\",\n },\n layer: {\n ...BASE_RULES,\n },\n};\n\n// ===== 子要素の変換ルールマップ =====\nexport const CHILD_ELEMENT_COERCION_MAP: Record<\n string,\n Record<string, CoercionRule>\n> = {\n ProcessArrowStep: {\n label: \"string\",\n color: \"string\",\n textColor: \"string\",\n },\n PyramidLevel: {\n label: \"string\",\n color: \"string\",\n textColor: \"string\",\n },\n TimelineItem: {\n date: \"string\",\n title: \"string\",\n description: \"string\",\n color: \"string\",\n dateColor: \"string\",\n },\n MatrixAxes: {\n x: \"string\",\n y: \"string\",\n },\n MatrixQuadrants: {\n topLeft: \"string\",\n topRight: \"string\",\n bottomLeft: \"string\",\n bottomRight: \"string\",\n },\n MatrixItem: {\n label: \"string\",\n x: \"number\",\n y: \"number\",\n color: \"string\",\n textColor: \"string\",\n },\n FlowNode: {\n id: \"string\",\n shape: \"string\",\n text: \"string\",\n color: \"string\",\n textColor: \"string\",\n width: \"number\",\n height: \"number\",\n },\n FlowConnection: {\n from: \"string\",\n to: \"string\",\n label: \"string\",\n color: \"string\",\n labelColor: \"string\",\n },\n Col: {\n width: \"number\",\n },\n Td: {\n text: \"string\",\n fontSize: \"number\",\n color: \"string\",\n bold: \"boolean\",\n italic: \"boolean\",\n underline: UNDERLINE_RULE,\n strike: \"boolean\",\n subscript: \"boolean\",\n superscript: \"boolean\",\n highlight: \"string\",\n fontFamily: \"string\",\n textAlign: \"string\",\n backgroundColor: \"string\",\n colspan: \"number\",\n rowspan: \"number\",\n },\n Li: {\n text: \"string\",\n bold: \"boolean\",\n italic: \"boolean\",\n underline: UNDERLINE_RULE,\n strike: \"boolean\",\n subscript: \"boolean\",\n superscript: \"boolean\",\n highlight: \"string\",\n color: \"string\",\n fontSize: \"number\",\n fontFamily: \"string\",\n },\n B: {},\n I: {},\n Span: {\n color: \"string\",\n fontFamily: \"string\",\n fontSize: \"number\",\n letterSpacing: \"number\",\n },\n};\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { parseLinearGradient } from "../shared/gradient.js";
1
+ import { parseGradient, parseLinearGradient } from "../shared/gradient.js";
2
2
  //#region src/renderPptx/gradientFills.ts
3
3
  async function loadJSZip() {
4
4
  const mod = await import("jszip");
@@ -50,10 +50,11 @@ var GradientFillRegistry = class {
50
50
  };
51
51
  /**
52
52
  * backgroundGradient 属性値をパースしてレジストリに登録し、マーカー色を返す。
53
+ * linear-gradient / radial-gradient の両方に対応。
53
54
  * パースできない場合 (スキーマ検証済みのため通常発生しない) は undefined を返す。
54
55
  */
55
56
  function registerBackgroundGradient(value, opacity, registry) {
56
- const gradient = parseLinearGradient(value);
57
+ const gradient = parseGradient(value);
57
58
  if (!gradient) return void 0;
58
59
  return registry.register(gradient, opacity);
59
60
  }
@@ -63,26 +64,40 @@ function registerBackgroundGradient(value, opacity, registry) {
63
64
  * `<a:rPr><a:solidFill><a:srgbClr val="マーカー色"/></a:solidFill></a:rPr>` が
64
65
  * 後処理で gradFill に置換され、PowerPoint 上ネイティブの文字グラデーションとして
65
66
  * 表示・編集可能になる。
67
+ *
68
+ * textGradient は radial-gradient を受け付けない (linear-gradient のみ)。
66
69
  * パースできない場合 (スキーマ検証済みのため通常発生しない) は undefined を返す。
67
70
  */
68
71
  function registerTextGradient(value, registry) {
69
- const gradient = parseLinearGradient(value);
70
- if (!gradient) return void 0;
71
- return registry.register(gradient);
72
+ const linear = parseLinearGradient(value);
73
+ if (!linear) return void 0;
74
+ return registry.register({
75
+ kind: "linear",
76
+ value: linear
77
+ });
72
78
  }
73
79
  /**
74
- * LinearGradient を DrawingML の `<a:gradFill>` 要素に変換する
80
+ * Gradient を DrawingML の `<a:gradFill>` 要素に変換する
75
81
  *
76
82
  * - カラーストップ位置: % → 1/1000 % (0-100000)
77
- * - 角度: CSS 基準 (0deg = 上向き) → DrawingML 基準 (0 = 右向き、1/60000 度)
83
+ * - 角度 (linear): CSS 基準 (0deg = 上向き) → DrawingML 基準 (0 = 右向き、1/60000 度)
84
+ * - 中心位置 (radial): CSS 風 % → DrawingML `<a:fillToRect l/t/r/b>` (1/1000 %)。
85
+ * fillToRect は焦点を表す矩形で、中心位置 (cx, cy) に対し
86
+ * l=cx*1000 / t=cy*1000 / r=(100-cx)*1000 / b=(100-cy)*1000 とする。
87
+ * PowerPoint の radial fill は path="circle" 1 種類で、shape (circle / ellipse) や
88
+ * size キーワードを描画上区別しない。要素の縦横比に応じて自動で楕円状になる。
78
89
  */
79
90
  function buildGradFillXml(gradient, opacity) {
80
91
  const alphaXml = opacity !== void 0 ? `<a:alpha val="${Math.round(opacity * 1e5)}"/>` : "";
81
- const gsXml = gradient.stops.map((stop) => {
92
+ const gsXml = gradient.value.stops.map((stop) => {
82
93
  return `<a:gs pos="${Math.round(stop.position * 1e3)}">${alphaXml ? `<a:srgbClr val="${stop.color}">${alphaXml}</a:srgbClr>` : `<a:srgbClr val="${stop.color}"/>`}</a:gs>`;
83
94
  }).join("");
84
- const dmlAngle = ((gradient.angle - 90) % 360 + 360) % 360;
85
- return `<a:gradFill flip="none" rotWithShape="1"><a:gsLst>${gsXml}</a:gsLst><a:lin ang="${Math.round(dmlAngle * 6e4)}" scaled="0"/></a:gradFill>`;
95
+ if (gradient.kind === "linear") {
96
+ const dmlAngle = ((gradient.value.angle - 90) % 360 + 360) % 360;
97
+ return `<a:gradFill flip="none" rotWithShape="1"><a:gsLst>${gsXml}</a:gsLst><a:lin ang="${Math.round(dmlAngle * 6e4)}" scaled="0"/></a:gradFill>`;
98
+ }
99
+ const { centerX, centerY } = gradient.value;
100
+ return `<a:gradFill flip="none" rotWithShape="1"><a:gsLst>${gsXml}</a:gsLst><a:path path="circle"><a:fillToRect l="${Math.round(centerX * 1e3)}" t="${Math.round(centerY * 1e3)}" r="${Math.round((100 - centerX) * 1e3)}" b="${Math.round((100 - centerY) * 1e3)}"/></a:path></a:gradFill>`;
86
101
  }
87
102
  /**
88
103
  * 出力 zip 内のスライド XML のマーカー solidFill を gradFill に置換する
@@ -1 +1 @@
1
- {"version":3,"file":"gradientFills.js","names":[],"sources":["../../src/renderPptx/gradientFills.ts"],"sourcesContent":["/**\n * グラデーション塗りの実現\n *\n * pptxgenjs はグラデーション塗りを未サポート\n * (https://github.com/gitbrent/PptxGenJS/issues/102) のため、以下の方式で実現する:\n *\n * 1. レンダリング時: グラデーション指定のある shape をビルド内で一意なマーカー色の\n * 単色塗り (solidFill) として描画し、レジストリに登録する\n * 2. 出力時: pptx.write() / writeFile() をラップし、出力 zip 内のスライド XML の\n * `<a:solidFill><a:srgbClr val=\"マーカー色\"/></a:solidFill>` を\n * DrawingML ネイティブの `<a:gradFill>` に置換する\n *\n * 置換は pptxgenjs が生成する固定パターンに対する完全一致の文字列置換で行う。\n * スライド XML 全体をパーサーで往復させると無関係な要素の表現が変わり得るため、\n * 意図的に文字列置換を採用している。\n */\nimport type { LinearGradient } from \"../shared/gradient.ts\";\nimport { parseLinearGradient } from \"../shared/gradient.ts\";\n\ntype PptxGenJSInstance = import(\"pptxgenjs\").default;\ntype WriteProps = NonNullable<Parameters<PptxGenJSInstance[\"write\"]>[0]>;\ntype WriteFileProps = NonNullable<\n Parameters<PptxGenJSInstance[\"writeFile\"]>[0]\n>;\n\n// JSZip は CJS パッケージのため動的 import で読み込む\nasync function loadJSZip(): Promise<typeof import(\"jszip\")> {\n const mod = await import(\"jszip\");\n /* eslint-disable @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-return */\n return (mod as any).default ?? mod;\n /* eslint-enable @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-return */\n}\n\ninterface RegisteredGradientFill {\n /** マーカー色 (6桁大文字 HEX、# なし) */\n marker: string;\n gradient: LinearGradient;\n /** 0-1。指定時は各カラーストップに alpha として反映する */\n opacity?: number;\n}\n\n/** マーカー色の探索開始値。reserveColors で予約済みの色はスキップされる */\nconst MARKER_BASE = 0x0f7a3d;\n\nexport class GradientFillRegistry {\n private readonly reserved = new Set<string>();\n private readonly markerBySpec = new Map<string, string>();\n private readonly registered: RegisteredGradientFill[] = [];\n private nextCandidate = MARKER_BASE;\n\n /**\n * テキスト中に現れる 6桁 HEX をマーカー候補から除外する。\n * 入力 XML 由来のユーザー指定色とマーカーの衝突を防ぐため、\n * register より前に入力 XML 文字列を渡しておく。\n */\n reserveColors(text: string): void {\n for (const match of text.matchAll(/[0-9a-fA-F]{6}/g)) {\n this.reserved.add(match[0].toUpperCase());\n }\n }\n\n /** グラデーションを登録し、対応するマーカー色を返す */\n register(gradient: LinearGradient, opacity?: number): string {\n const specKey = JSON.stringify({ gradient, opacity });\n const existing = this.markerBySpec.get(specKey);\n if (existing) return existing;\n\n let marker: string;\n do {\n marker = this.nextCandidate.toString(16).toUpperCase().padStart(6, \"0\");\n this.nextCandidate = (this.nextCandidate + 1) % 0x1000000;\n } while (this.reserved.has(marker));\n this.reserved.add(marker);\n\n this.markerBySpec.set(specKey, marker);\n this.registered.push({ marker, gradient, opacity });\n return marker;\n }\n\n get isEmpty(): boolean {\n return this.registered.length === 0;\n }\n\n get entries(): readonly RegisteredGradientFill[] {\n return this.registered;\n }\n}\n\n/**\n * backgroundGradient 属性値をパースしてレジストリに登録し、マーカー色を返す。\n * パースできない場合 (スキーマ検証済みのため通常発生しない) は undefined を返す。\n */\nexport function registerBackgroundGradient(\n value: string,\n opacity: number | undefined,\n registry: GradientFillRegistry,\n): string | undefined {\n const gradient = parseLinearGradient(value);\n if (!gradient) return undefined;\n return registry.register(gradient, opacity);\n}\n\n/**\n * textGradient 属性値をパースしてレジストリに登録し、マーカー色を返す。\n * 戻り値のマーカー色を text run の color に渡すと、pptxgenjs が出力する\n * `<a:rPr><a:solidFill><a:srgbClr val=\"マーカー色\"/></a:solidFill></a:rPr>` が\n * 後処理で gradFill に置換され、PowerPoint 上ネイティブの文字グラデーションとして\n * 表示・編集可能になる。\n * パースできない場合 (スキーマ検証済みのため通常発生しない) は undefined を返す。\n */\nexport function registerTextGradient(\n value: string,\n registry: GradientFillRegistry,\n): string | undefined {\n const gradient = parseLinearGradient(value);\n if (!gradient) return undefined;\n return registry.register(gradient);\n}\n\n/**\n * LinearGradient を DrawingML の `<a:gradFill>` 要素に変換する\n *\n * - カラーストップ位置: % → 1/1000 % (0-100000)\n * - 角度: CSS 基準 (0deg = 上向き) → DrawingML 基準 (0 = 右向き、1/60000 度)\n */\nfunction buildGradFillXml(gradient: LinearGradient, opacity?: number): string {\n const alphaXml =\n opacity !== undefined\n ? `<a:alpha val=\"${Math.round(opacity * 100000)}\"/>`\n : \"\";\n const gsXml = gradient.stops\n .map((stop) => {\n const pos = Math.round(stop.position * 1000);\n const srgbClr = alphaXml\n ? `<a:srgbClr val=\"${stop.color}\">${alphaXml}</a:srgbClr>`\n : `<a:srgbClr val=\"${stop.color}\"/>`;\n return `<a:gs pos=\"${pos}\">${srgbClr}</a:gs>`;\n })\n .join(\"\");\n const dmlAngle = (((gradient.angle - 90) % 360) + 360) % 360;\n const ang = Math.round(dmlAngle * 60000);\n return `<a:gradFill flip=\"none\" rotWithShape=\"1\"><a:gsLst>${gsXml}</a:gsLst><a:lin ang=\"${ang}\" scaled=\"0\"/></a:gradFill>`;\n}\n\n/**\n * 出力 zip 内のスライド XML のマーカー solidFill を gradFill に置換する\n */\nexport async function applyGradientFills(\n data: Uint8Array | ArrayBuffer,\n registry: GradientFillRegistry,\n): Promise<import(\"jszip\")> {\n const JSZip = await loadJSZip();\n const zip = await JSZip.loadAsync(data);\n\n const slidePaths = Object.keys(zip.files).filter((path) =>\n /^ppt\\/slides\\/slide\\d+\\.xml$/.test(path),\n );\n for (const path of slidePaths) {\n const file = zip.file(path);\n if (!file) continue;\n let xml = await file.async(\"text\");\n let replaced = false;\n for (const { marker, gradient, opacity } of registry.entries) {\n const target = `<a:solidFill><a:srgbClr val=\"${marker}\"/></a:solidFill>`;\n if (!xml.includes(target)) continue;\n xml = xml.replaceAll(target, buildGradFillXml(gradient, opacity));\n replaced = true;\n }\n if (replaced) {\n zip.file(path, xml);\n }\n }\n return zip;\n}\n\n/**\n * pptx インスタンスの write / writeFile をラップし、\n * 出力時にグラデーション後処理を適用する。\n *\n * pptxgenjs の write と同じ outputType / compression の挙動を再現する。\n * writeFile は Node 環境のみ後処理対象 (ブラウザでは pptxgenjs がダウンロード\n * 処理を行うため、元の実装にフォールバックする)。\n */\nexport function patchPptxWriteForGradientFills(\n pptx: PptxGenJSInstance,\n registry: GradientFillRegistry,\n): void {\n if (registry.isEmpty) return;\n\n const originalWrite = pptx.write.bind(pptx);\n const originalWriteFile = pptx.writeFile.bind(pptx);\n\n const patchedWrite = async (rawProps?: WriteProps | string) => {\n // DEPRECATED: pptxgenjs は write(outputType) の文字列 overload を\n // ランタイムでは今も受け付けるため、同様に正規化する\n const props: WriteProps | undefined =\n typeof rawProps === \"string\"\n ? ({ outputType: rawProps } as WriteProps)\n : rawProps;\n const data = (await originalWrite({\n outputType: \"uint8array\",\n })) as Uint8Array;\n const zip = await applyGradientFills(data, registry);\n\n const outputType = props?.outputType;\n if (outputType === \"STREAM\") {\n return zip.generateAsync({\n type: \"nodebuffer\",\n compression: props?.compression ? \"DEFLATE\" : \"STORE\",\n });\n }\n if (outputType) {\n return zip.generateAsync({ type: outputType });\n }\n return zip.generateAsync({\n type: \"blob\",\n compression: props?.compression ? \"DEFLATE\" : \"STORE\",\n });\n };\n pptx.write = patchedWrite;\n\n const patchedWriteFile = async (rawProps?: WriteFileProps | string) => {\n // DEPRECATED: pptxgenjs は writeFile(fileName) の文字列 overload を\n // ランタイムでは今も受け付けるため、同様に正規化する\n const props: WriteFileProps | undefined =\n typeof rawProps === \"string\" ? { fileName: rawProps } : rawProps;\n const isNode =\n typeof process !== \"undefined\" && Boolean(process.versions?.node);\n if (!isNode) {\n return originalWriteFile(props);\n }\n const rawName = props?.fileName ?? \"Presentation.pptx\";\n const fileName = rawName.toLowerCase().endsWith(\".pptx\")\n ? rawName\n : `${rawName}.pptx`;\n const buffer = (await patchedWrite({\n outputType: \"nodebuffer\",\n compression: props?.compression,\n })) as Buffer;\n const fs = await import(\"fs\");\n await fs.promises.writeFile(fileName, buffer);\n return fileName;\n };\n pptx.writeFile = patchedWriteFile;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"gradientFills.js","names":[],"sources":["../../src/renderPptx/gradientFills.ts"],"sourcesContent":["/**\n * グラデーション塗りの実現\n *\n * pptxgenjs はグラデーション塗りを未サポート\n * (https://github.com/gitbrent/PptxGenJS/issues/102) のため、以下の方式で実現する:\n *\n * 1. レンダリング時: グラデーション指定のある shape をビルド内で一意なマーカー色の\n * 単色塗り (solidFill) として描画し、レジストリに登録する\n * 2. 出力時: pptx.write() / writeFile() をラップし、出力 zip 内のスライド XML の\n * `<a:solidFill><a:srgbClr val=\"マーカー色\"/></a:solidFill>` を\n * DrawingML ネイティブの `<a:gradFill>` に置換する\n *\n * 置換は pptxgenjs が生成する固定パターンに対する完全一致の文字列置換で行う。\n * スライド XML 全体をパーサーで往復させると無関係な要素の表現が変わり得るため、\n * 意図的に文字列置換を採用している。\n */\nimport type { Gradient } from \"../shared/gradient.ts\";\nimport { parseGradient, parseLinearGradient } from \"../shared/gradient.ts\";\n\ntype PptxGenJSInstance = import(\"pptxgenjs\").default;\ntype WriteProps = NonNullable<Parameters<PptxGenJSInstance[\"write\"]>[0]>;\ntype WriteFileProps = NonNullable<\n Parameters<PptxGenJSInstance[\"writeFile\"]>[0]\n>;\n\n// JSZip は CJS パッケージのため動的 import で読み込む\nasync function loadJSZip(): Promise<typeof import(\"jszip\")> {\n const mod = await import(\"jszip\");\n /* eslint-disable @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-return */\n return (mod as any).default ?? mod;\n /* eslint-enable @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-return */\n}\n\ninterface RegisteredGradientFill {\n /** マーカー色 (6桁大文字 HEX、# なし) */\n marker: string;\n gradient: Gradient;\n /** 0-1。指定時は各カラーストップに alpha として反映する */\n opacity?: number;\n}\n\n/** マーカー色の探索開始値。reserveColors で予約済みの色はスキップされる */\nconst MARKER_BASE = 0x0f7a3d;\n\nexport class GradientFillRegistry {\n private readonly reserved = new Set<string>();\n private readonly markerBySpec = new Map<string, string>();\n private readonly registered: RegisteredGradientFill[] = [];\n private nextCandidate = MARKER_BASE;\n\n /**\n * テキスト中に現れる 6桁 HEX をマーカー候補から除外する。\n * 入力 XML 由来のユーザー指定色とマーカーの衝突を防ぐため、\n * register より前に入力 XML 文字列を渡しておく。\n */\n reserveColors(text: string): void {\n for (const match of text.matchAll(/[0-9a-fA-F]{6}/g)) {\n this.reserved.add(match[0].toUpperCase());\n }\n }\n\n /** グラデーションを登録し、対応するマーカー色を返す */\n register(gradient: Gradient, opacity?: number): string {\n const specKey = JSON.stringify({ gradient, opacity });\n const existing = this.markerBySpec.get(specKey);\n if (existing) return existing;\n\n let marker: string;\n do {\n marker = this.nextCandidate.toString(16).toUpperCase().padStart(6, \"0\");\n this.nextCandidate = (this.nextCandidate + 1) % 0x1000000;\n } while (this.reserved.has(marker));\n this.reserved.add(marker);\n\n this.markerBySpec.set(specKey, marker);\n this.registered.push({ marker, gradient, opacity });\n return marker;\n }\n\n get isEmpty(): boolean {\n return this.registered.length === 0;\n }\n\n get entries(): readonly RegisteredGradientFill[] {\n return this.registered;\n }\n}\n\n/**\n * backgroundGradient 属性値をパースしてレジストリに登録し、マーカー色を返す。\n * linear-gradient / radial-gradient の両方に対応。\n * パースできない場合 (スキーマ検証済みのため通常発生しない) は undefined を返す。\n */\nexport function registerBackgroundGradient(\n value: string,\n opacity: number | undefined,\n registry: GradientFillRegistry,\n): string | undefined {\n const gradient = parseGradient(value);\n if (!gradient) return undefined;\n return registry.register(gradient, opacity);\n}\n\n/**\n * textGradient 属性値をパースしてレジストリに登録し、マーカー色を返す。\n * 戻り値のマーカー色を text run の color に渡すと、pptxgenjs が出力する\n * `<a:rPr><a:solidFill><a:srgbClr val=\"マーカー色\"/></a:solidFill></a:rPr>` が\n * 後処理で gradFill に置換され、PowerPoint 上ネイティブの文字グラデーションとして\n * 表示・編集可能になる。\n *\n * textGradient は radial-gradient を受け付けない (linear-gradient のみ)。\n * パースできない場合 (スキーマ検証済みのため通常発生しない) は undefined を返す。\n */\nexport function registerTextGradient(\n value: string,\n registry: GradientFillRegistry,\n): string | undefined {\n const linear = parseLinearGradient(value);\n if (!linear) return undefined;\n return registry.register({ kind: \"linear\", value: linear });\n}\n\n/**\n * Gradient を DrawingML の `<a:gradFill>` 要素に変換する\n *\n * - カラーストップ位置: % → 1/1000 % (0-100000)\n * - 角度 (linear): CSS 基準 (0deg = 上向き) → DrawingML 基準 (0 = 右向き、1/60000 度)\n * - 中心位置 (radial): CSS 風 % → DrawingML `<a:fillToRect l/t/r/b>` (1/1000 %)。\n * fillToRect は焦点を表す矩形で、中心位置 (cx, cy) に対し\n * l=cx*1000 / t=cy*1000 / r=(100-cx)*1000 / b=(100-cy)*1000 とする。\n * PowerPoint の radial fill は path=\"circle\" 1 種類で、shape (circle / ellipse) や\n * size キーワードを描画上区別しない。要素の縦横比に応じて自動で楕円状になる。\n */\nfunction buildGradFillXml(gradient: Gradient, opacity?: number): string {\n const alphaXml =\n opacity !== undefined\n ? `<a:alpha val=\"${Math.round(opacity * 100000)}\"/>`\n : \"\";\n const gsXml = gradient.value.stops\n .map((stop) => {\n const pos = Math.round(stop.position * 1000);\n const srgbClr = alphaXml\n ? `<a:srgbClr val=\"${stop.color}\">${alphaXml}</a:srgbClr>`\n : `<a:srgbClr val=\"${stop.color}\"/>`;\n return `<a:gs pos=\"${pos}\">${srgbClr}</a:gs>`;\n })\n .join(\"\");\n\n if (gradient.kind === \"linear\") {\n const dmlAngle = (((gradient.value.angle - 90) % 360) + 360) % 360;\n const ang = Math.round(dmlAngle * 60000);\n return `<a:gradFill flip=\"none\" rotWithShape=\"1\"><a:gsLst>${gsXml}</a:gsLst><a:lin ang=\"${ang}\" scaled=\"0\"/></a:gradFill>`;\n }\n\n const { centerX, centerY } = gradient.value;\n const l = Math.round(centerX * 1000);\n const t = Math.round(centerY * 1000);\n const r = Math.round((100 - centerX) * 1000);\n const b = Math.round((100 - centerY) * 1000);\n return `<a:gradFill flip=\"none\" rotWithShape=\"1\"><a:gsLst>${gsXml}</a:gsLst><a:path path=\"circle\"><a:fillToRect l=\"${l}\" t=\"${t}\" r=\"${r}\" b=\"${b}\"/></a:path></a:gradFill>`;\n}\n\n/**\n * 出力 zip 内のスライド XML のマーカー solidFill を gradFill に置換する\n */\nexport async function applyGradientFills(\n data: Uint8Array | ArrayBuffer,\n registry: GradientFillRegistry,\n): Promise<import(\"jszip\")> {\n const JSZip = await loadJSZip();\n const zip = await JSZip.loadAsync(data);\n\n const slidePaths = Object.keys(zip.files).filter((path) =>\n /^ppt\\/slides\\/slide\\d+\\.xml$/.test(path),\n );\n for (const path of slidePaths) {\n const file = zip.file(path);\n if (!file) continue;\n let xml = await file.async(\"text\");\n let replaced = false;\n for (const { marker, gradient, opacity } of registry.entries) {\n const target = `<a:solidFill><a:srgbClr val=\"${marker}\"/></a:solidFill>`;\n if (!xml.includes(target)) continue;\n xml = xml.replaceAll(target, buildGradFillXml(gradient, opacity));\n replaced = true;\n }\n if (replaced) {\n zip.file(path, xml);\n }\n }\n return zip;\n}\n\n/**\n * pptx インスタンスの write / writeFile をラップし、\n * 出力時にグラデーション後処理を適用する。\n *\n * pptxgenjs の write と同じ outputType / compression の挙動を再現する。\n * writeFile は Node 環境のみ後処理対象 (ブラウザでは pptxgenjs がダウンロード\n * 処理を行うため、元の実装にフォールバックする)。\n */\nexport function patchPptxWriteForGradientFills(\n pptx: PptxGenJSInstance,\n registry: GradientFillRegistry,\n): void {\n if (registry.isEmpty) return;\n\n const originalWrite = pptx.write.bind(pptx);\n const originalWriteFile = pptx.writeFile.bind(pptx);\n\n const patchedWrite = async (rawProps?: WriteProps | string) => {\n // DEPRECATED: pptxgenjs は write(outputType) の文字列 overload を\n // ランタイムでは今も受け付けるため、同様に正規化する\n const props: WriteProps | undefined =\n typeof rawProps === \"string\"\n ? ({ outputType: rawProps } as WriteProps)\n : rawProps;\n const data = (await originalWrite({\n outputType: \"uint8array\",\n })) as Uint8Array;\n const zip = await applyGradientFills(data, registry);\n\n const outputType = props?.outputType;\n if (outputType === \"STREAM\") {\n return zip.generateAsync({\n type: \"nodebuffer\",\n compression: props?.compression ? \"DEFLATE\" : \"STORE\",\n });\n }\n if (outputType) {\n return zip.generateAsync({ type: outputType });\n }\n return zip.generateAsync({\n type: \"blob\",\n compression: props?.compression ? \"DEFLATE\" : \"STORE\",\n });\n };\n pptx.write = patchedWrite;\n\n const patchedWriteFile = async (rawProps?: WriteFileProps | string) => {\n // DEPRECATED: pptxgenjs は writeFile(fileName) の文字列 overload を\n // ランタイムでは今も受け付けるため、同様に正規化する\n const props: WriteFileProps | undefined =\n typeof rawProps === \"string\" ? { fileName: rawProps } : rawProps;\n const isNode =\n typeof process !== \"undefined\" && Boolean(process.versions?.node);\n if (!isNode) {\n return originalWriteFile(props);\n }\n const rawName = props?.fileName ?? \"Presentation.pptx\";\n const fileName = rawName.toLowerCase().endsWith(\".pptx\")\n ? rawName\n : `${rawName}.pptx`;\n const buffer = (await patchedWrite({\n outputType: \"nodebuffer\",\n compression: props?.compression,\n })) as Buffer;\n const fs = await import(\"fs\");\n await fs.promises.writeFile(fileName, buffer);\n return fileName;\n };\n pptx.writeFile = patchedWriteFile;\n}\n"],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import { pxToIn, pxToPt } from "../units.js";
2
2
  import { withContentBounds } from "../utils/contentArea.js";
3
+ import { registerBackgroundGradient } from "../gradientFills.js";
3
4
  import { stripHash } from "../utils/visualStyle.js";
4
5
  import { measureTimeline } from "../../calcYogaLayout/measureCompositeNodes.js";
5
6
  import { resolveScaledContentArea } from "../utils/scaleToFit.js";
@@ -16,14 +17,37 @@ function renderTimelineNode(node, ctx) {
16
17
  title: stripHash(node.titleColor) ?? "1E293B",
17
18
  description: stripHash(node.descriptionColor) ?? "64748B"
18
19
  };
20
+ const connectorLineColor = (node.connectorGradient ? registerBackgroundGradient(node.connectorGradient, node.opacity, ctx.buildContext.gradientFills) : void 0) ?? stripHash(node.connectorColor) ?? "E2E8F0";
21
+ const fontFace = node.fontFamily ?? "Noto Sans JP";
22
+ const useColorForDate = node.useColorForDate ?? false;
19
23
  const { content, scaleFactor } = resolveScaledContentArea(node, measureTimeline(node), ctx);
20
24
  const nodeRadius = baseNodeRadius * scaleFactor;
21
25
  const lineWidth = baseLineWidth * scaleFactor;
22
26
  const contentNode = withContentBounds(node, content);
23
- if (direction === "horizontal") renderHorizontalTimeline(contentNode, ctx, items, defaultColor, nodeRadius, lineWidth, scaleFactor, textColors);
24
- else renderVerticalTimeline(contentNode, ctx, items, defaultColor, nodeRadius, lineWidth, scaleFactor, textColors);
27
+ const options = {
28
+ defaultColor,
29
+ nodeRadius,
30
+ lineWidth,
31
+ scaleFactor,
32
+ textColors,
33
+ connectorLineColor,
34
+ fontFace,
35
+ useColorForDate
36
+ };
37
+ if (direction === "horizontal") renderHorizontalTimeline(contentNode, ctx, items, options);
38
+ else renderVerticalTimeline(contentNode, ctx, items, options);
39
+ }
40
+ function resolveItemDateColor(item, options) {
41
+ const perItemDateColor = stripHash(item.dateColor);
42
+ if (perItemDateColor) return perItemDateColor;
43
+ if (options.useColorForDate && item.color) {
44
+ const inherited = stripHash(item.color);
45
+ if (inherited) return inherited;
46
+ }
47
+ return options.textColors.date;
25
48
  }
26
- function renderHorizontalTimeline(node, ctx, items, defaultColor, nodeRadius, lineWidth, scaleFactor, textColors) {
49
+ function renderHorizontalTimeline(node, ctx, items, options) {
50
+ const { defaultColor, nodeRadius, lineWidth, scaleFactor, textColors, connectorLineColor, fontFace } = options;
27
51
  const itemCount = items.length;
28
52
  const lineY = node.y + node.h / 2;
29
53
  const labelW = 120 * scaleFactor;
@@ -36,7 +60,7 @@ function renderHorizontalTimeline(node, ctx, items, defaultColor, nodeRadius, li
36
60
  w: pxToIn(lineLength),
37
61
  h: 0,
38
62
  line: {
39
- color: "E2E8F0",
63
+ color: connectorLineColor,
40
64
  width: pxToPt(lineWidth)
41
65
  }
42
66
  });
@@ -50,6 +74,7 @@ function renderHorizontalTimeline(node, ctx, items, defaultColor, nodeRadius, li
50
74
  const cx = startX + lineLength * (itemCount === 1 ? .5 : index / (itemCount - 1));
51
75
  const cy = lineY;
52
76
  const color = item.color ?? defaultColor;
77
+ const dateColor = resolveItemDateColor(item, options);
53
78
  ctx.slide.addShape(ctx.pptx.ShapeType.ellipse, {
54
79
  x: pxToIn(cx - nodeRadius),
55
80
  y: pxToIn(cy - nodeRadius),
@@ -64,8 +89,8 @@ function renderHorizontalTimeline(node, ctx, items, defaultColor, nodeRadius, li
64
89
  w: pxToIn(labelW),
65
90
  h: pxToIn(dateLabelH),
66
91
  fontSize: pxToPt(12 * scaleFactor),
67
- fontFace: "Noto Sans JP",
68
- color: textColors.date,
92
+ fontFace,
93
+ color: dateColor,
69
94
  align: "center",
70
95
  valign: "bottom"
71
96
  });
@@ -75,7 +100,7 @@ function renderHorizontalTimeline(node, ctx, items, defaultColor, nodeRadius, li
75
100
  w: pxToIn(labelW),
76
101
  h: pxToIn(titleLabelH),
77
102
  fontSize: pxToPt(14 * scaleFactor),
78
- fontFace: "Noto Sans JP",
103
+ fontFace,
79
104
  color: textColors.title,
80
105
  bold: true,
81
106
  align: "center",
@@ -87,14 +112,15 @@ function renderHorizontalTimeline(node, ctx, items, defaultColor, nodeRadius, li
87
112
  w: pxToIn(labelW),
88
113
  h: pxToIn(descLabelH),
89
114
  fontSize: pxToPt(11 * scaleFactor),
90
- fontFace: "Noto Sans JP",
115
+ fontFace,
91
116
  color: textColors.description,
92
117
  align: "center",
93
118
  valign: "top"
94
119
  });
95
120
  });
96
121
  }
97
- function renderVerticalTimeline(node, ctx, items, defaultColor, nodeRadius, lineWidth, scaleFactor, textColors) {
122
+ function renderVerticalTimeline(node, ctx, items, options) {
123
+ const { defaultColor, nodeRadius, lineWidth, scaleFactor, textColors, connectorLineColor, fontFace } = options;
98
124
  const itemCount = items.length;
99
125
  const lineX = node.x + 40 * scaleFactor;
100
126
  const startY = node.y + nodeRadius;
@@ -105,7 +131,7 @@ function renderVerticalTimeline(node, ctx, items, defaultColor, nodeRadius, line
105
131
  w: 0,
106
132
  h: pxToIn(lineLength),
107
133
  line: {
108
- color: "E2E8F0",
134
+ color: connectorLineColor,
109
135
  width: pxToPt(lineWidth)
110
136
  }
111
137
  });
@@ -121,6 +147,7 @@ function renderVerticalTimeline(node, ctx, items, defaultColor, nodeRadius, line
121
147
  const cx = lineX;
122
148
  const cy = startY + lineLength * progress;
123
149
  const color = item.color ?? defaultColor;
150
+ const dateColor = resolveItemDateColor(item, options);
124
151
  ctx.slide.addShape(ctx.pptx.ShapeType.ellipse, {
125
152
  x: pxToIn(cx - nodeRadius),
126
153
  y: pxToIn(cy - nodeRadius),
@@ -135,8 +162,8 @@ function renderVerticalTimeline(node, ctx, items, defaultColor, nodeRadius, line
135
162
  w: pxToIn(dateLabelW),
136
163
  h: pxToIn(dateLabelH),
137
164
  fontSize: pxToPt(12 * scaleFactor),
138
- fontFace: "Noto Sans JP",
139
- color: textColors.date,
165
+ fontFace,
166
+ color: dateColor,
140
167
  align: "left",
141
168
  valign: "bottom"
142
169
  });
@@ -146,7 +173,7 @@ function renderVerticalTimeline(node, ctx, items, defaultColor, nodeRadius, line
146
173
  w: pxToIn(titleLabelW),
147
174
  h: pxToIn(titleLabelH),
148
175
  fontSize: pxToPt(14 * scaleFactor),
149
- fontFace: "Noto Sans JP",
176
+ fontFace,
150
177
  color: textColors.title,
151
178
  bold: true,
152
179
  align: "left",
@@ -158,7 +185,7 @@ function renderVerticalTimeline(node, ctx, items, defaultColor, nodeRadius, line
158
185
  w: pxToIn(descLabelW),
159
186
  h: pxToIn(descLabelH),
160
187
  fontSize: pxToPt(11 * scaleFactor),
161
- fontFace: "Noto Sans JP",
188
+ fontFace,
162
189
  color: textColors.description,
163
190
  align: "left",
164
191
  valign: "top"
@@ -1 +1 @@
1
- {"version":3,"file":"timeline.js","names":[],"sources":["../../../src/renderPptx/nodes/timeline.ts"],"sourcesContent":["import type { PositionedNode } from \"../../types.ts\";\nimport type { RenderContext } from \"../types.ts\";\nimport { stripHash } from \"../utils/visualStyle.ts\";\nimport { pxToIn, pxToPt } from \"../units.ts\";\nimport { measureTimeline } from \"../../calcYogaLayout/measureCompositeNodes.ts\";\nimport { resolveScaledContentArea } from \"../utils/scaleToFit.ts\";\nimport { withContentBounds } from \"../utils/contentArea.ts\";\n\ntype TimelinePositionedNode = Extract<PositionedNode, { type: \"timeline\" }>;\n\ntype TimelineTextColors = {\n date: string;\n title: string;\n description: string;\n};\n\nexport function renderTimelineNode(\n node: TimelinePositionedNode,\n ctx: RenderContext,\n): void {\n const direction = node.direction ?? \"horizontal\";\n const items = node.items;\n const itemCount = items.length;\n\n if (itemCount === 0) return;\n\n const defaultColor = \"1D4ED8\"; // blue\n const baseNodeRadius = 12; // px\n const baseLineWidth = 4; // px\n\n const textColors: TimelineTextColors = {\n date: stripHash(node.dateColor) ?? \"64748B\",\n title: stripHash(node.titleColor) ?? \"1E293B\",\n description: stripHash(node.descriptionColor) ?? \"64748B\",\n };\n\n // スケール係数を計算(コンテンツ領域基準)\n const { content, scaleFactor } = resolveScaledContentArea(\n node,\n measureTimeline(node),\n ctx,\n );\n\n const nodeRadius = baseNodeRadius * scaleFactor;\n const lineWidth = baseLineWidth * scaleFactor;\n\n // コンテンツ領域を使用するための仮想ノードを作成\n const contentNode = withContentBounds(node, content);\n\n if (direction === \"horizontal\") {\n renderHorizontalTimeline(\n contentNode,\n ctx,\n items,\n defaultColor,\n nodeRadius,\n lineWidth,\n scaleFactor,\n textColors,\n );\n } else {\n renderVerticalTimeline(\n contentNode,\n ctx,\n items,\n defaultColor,\n nodeRadius,\n lineWidth,\n scaleFactor,\n textColors,\n );\n }\n}\n\nfunction renderHorizontalTimeline(\n node: TimelinePositionedNode,\n ctx: RenderContext,\n items: TimelinePositionedNode[\"items\"],\n defaultColor: string,\n nodeRadius: number,\n lineWidth: number,\n scaleFactor: number,\n textColors: TimelineTextColors,\n): void {\n const itemCount = items.length;\n const lineY = node.y + node.h / 2;\n const labelW = 120 * scaleFactor;\n // 極端に狭い node.w でも startX <= endX を保つため、インセットを node.w/2 で頭打ちする\n const inset = Math.min(labelW / 2, node.w / 2);\n const startX = node.x + inset;\n const endX = node.x + node.w - inset;\n const lineLength = endX - startX;\n\n // メインの線を描画\n ctx.slide.addShape(ctx.pptx.ShapeType.line, {\n x: pxToIn(startX),\n y: pxToIn(lineY),\n w: pxToIn(lineLength),\n h: 0,\n line: { color: \"E2E8F0\", width: pxToPt(lineWidth) },\n });\n const dateLabelH = 24 * scaleFactor;\n const titleLabelH = 24 * scaleFactor;\n const descLabelH = 32 * scaleFactor;\n const dateOffset = 40 * scaleFactor;\n const titleGap = 8 * scaleFactor;\n const descOffset = 32 * scaleFactor;\n\n // 各アイテムを描画\n items.forEach((item, index) => {\n const progress = itemCount === 1 ? 0.5 : index / (itemCount - 1);\n const cx = startX + lineLength * progress;\n const cy = lineY;\n const color = item.color ?? defaultColor;\n\n // ノード(円)を描画\n ctx.slide.addShape(ctx.pptx.ShapeType.ellipse, {\n x: pxToIn(cx - nodeRadius),\n y: pxToIn(cy - nodeRadius),\n w: pxToIn(nodeRadius * 2),\n h: pxToIn(nodeRadius * 2),\n fill: { color },\n line: { type: \"none\" as const },\n });\n\n // 日付を上に表示\n ctx.slide.addText(item.date, {\n x: pxToIn(cx - labelW / 2),\n y: pxToIn(cy - nodeRadius - dateOffset),\n w: pxToIn(labelW),\n h: pxToIn(dateLabelH),\n fontSize: pxToPt(12 * scaleFactor),\n fontFace: \"Noto Sans JP\",\n color: textColors.date,\n align: \"center\",\n valign: \"bottom\",\n });\n\n // タイトルを下に表示\n ctx.slide.addText(item.title, {\n x: pxToIn(cx - labelW / 2),\n y: pxToIn(cy + nodeRadius + titleGap),\n w: pxToIn(labelW),\n h: pxToIn(titleLabelH),\n fontSize: pxToPt(14 * scaleFactor),\n fontFace: \"Noto Sans JP\",\n color: textColors.title,\n bold: true,\n align: \"center\",\n valign: \"top\",\n });\n\n // 説明を表示\n if (item.description) {\n ctx.slide.addText(item.description, {\n x: pxToIn(cx - labelW / 2),\n y: pxToIn(cy + nodeRadius + descOffset),\n w: pxToIn(labelW),\n h: pxToIn(descLabelH),\n fontSize: pxToPt(11 * scaleFactor),\n fontFace: \"Noto Sans JP\",\n color: textColors.description,\n align: \"center\",\n valign: \"top\",\n });\n }\n });\n}\n\nfunction renderVerticalTimeline(\n node: TimelinePositionedNode,\n ctx: RenderContext,\n items: TimelinePositionedNode[\"items\"],\n defaultColor: string,\n nodeRadius: number,\n lineWidth: number,\n scaleFactor: number,\n textColors: TimelineTextColors,\n): void {\n const itemCount = items.length;\n const lineX = node.x + 40 * scaleFactor;\n const startY = node.y + nodeRadius;\n const endY = node.y + node.h - nodeRadius;\n const lineLength = endY - startY;\n\n // メインの線を描画\n ctx.slide.addShape(ctx.pptx.ShapeType.line, {\n x: pxToIn(lineX),\n y: pxToIn(startY),\n w: 0,\n h: pxToIn(lineLength),\n line: { color: \"E2E8F0\", width: pxToPt(lineWidth) },\n });\n\n const labelGap = 16 * scaleFactor;\n const dateLabelW = 100 * scaleFactor;\n const dateLabelH = 20 * scaleFactor;\n const titleLabelH = 24 * scaleFactor;\n const descLabelH = 32 * scaleFactor;\n const titleLabelW = node.w - 80 * scaleFactor;\n const descLabelW = node.w - 80 * scaleFactor;\n\n // 各アイテムを描画\n items.forEach((item, index) => {\n const progress = itemCount === 1 ? 0.5 : index / (itemCount - 1);\n const cx = lineX;\n const cy = startY + lineLength * progress;\n const color = item.color ?? defaultColor;\n\n // ノード(円)を描画\n ctx.slide.addShape(ctx.pptx.ShapeType.ellipse, {\n x: pxToIn(cx - nodeRadius),\n y: pxToIn(cy - nodeRadius),\n w: pxToIn(nodeRadius * 2),\n h: pxToIn(nodeRadius * 2),\n fill: { color },\n line: { type: \"none\" as const },\n });\n\n // 日付を左上に表示\n ctx.slide.addText(item.date, {\n x: pxToIn(cx + nodeRadius + labelGap),\n y: pxToIn(cy - nodeRadius - 4 * scaleFactor),\n w: pxToIn(dateLabelW),\n h: pxToIn(dateLabelH),\n fontSize: pxToPt(12 * scaleFactor),\n fontFace: \"Noto Sans JP\",\n color: textColors.date,\n align: \"left\",\n valign: \"bottom\",\n });\n\n // タイトルを右に表示\n ctx.slide.addText(item.title, {\n x: pxToIn(cx + nodeRadius + labelGap),\n y: pxToIn(cy - 4 * scaleFactor),\n w: pxToIn(titleLabelW),\n h: pxToIn(titleLabelH),\n fontSize: pxToPt(14 * scaleFactor),\n fontFace: \"Noto Sans JP\",\n color: textColors.title,\n bold: true,\n align: \"left\",\n valign: \"top\",\n });\n\n // 説明を表示\n if (item.description) {\n ctx.slide.addText(item.description, {\n x: pxToIn(cx + nodeRadius + labelGap),\n y: pxToIn(cy + 20 * scaleFactor),\n w: pxToIn(descLabelW),\n h: pxToIn(descLabelH),\n fontSize: pxToPt(11 * scaleFactor),\n fontFace: \"Noto Sans JP\",\n color: textColors.description,\n align: \"left\",\n valign: \"top\",\n });\n }\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"timeline.js","names":[],"sources":["../../../src/renderPptx/nodes/timeline.ts"],"sourcesContent":["import type { PositionedNode } from \"../../types.ts\";\nimport type { RenderContext } from \"../types.ts\";\nimport { stripHash } from \"../utils/visualStyle.ts\";\nimport { pxToIn, pxToPt } from \"../units.ts\";\nimport { measureTimeline } from \"../../calcYogaLayout/measureCompositeNodes.ts\";\nimport { resolveScaledContentArea } from \"../utils/scaleToFit.ts\";\nimport { withContentBounds } from \"../utils/contentArea.ts\";\nimport { registerBackgroundGradient } from \"../gradientFills.ts\";\n\ntype TimelinePositionedNode = Extract<PositionedNode, { type: \"timeline\" }>;\n\ntype TimelineTextColors = {\n date: string;\n title: string;\n description: string;\n};\n\ntype TimelineRenderOptions = {\n defaultColor: string;\n nodeRadius: number;\n lineWidth: number;\n scaleFactor: number;\n textColors: TimelineTextColors;\n connectorLineColor: string;\n fontFace: string;\n useColorForDate: boolean;\n};\n\nexport function renderTimelineNode(\n node: TimelinePositionedNode,\n ctx: RenderContext,\n): void {\n const direction = node.direction ?? \"horizontal\";\n const items = node.items;\n const itemCount = items.length;\n\n if (itemCount === 0) return;\n\n const defaultColor = \"1D4ED8\"; // blue\n const baseNodeRadius = 12; // px\n const baseLineWidth = 4; // px\n\n const textColors: TimelineTextColors = {\n date: stripHash(node.dateColor) ?? \"64748B\",\n title: stripHash(node.titleColor) ?? \"1E293B\",\n description: stripHash(node.descriptionColor) ?? \"64748B\",\n };\n\n // 軸線色を解決する。connectorGradient が指定されていれば gradient registry に\n // 登録してマーカー色を採用する (後処理で gradFill に置換される)。\n // connectorColor が指定されていればそれを採用、未指定ならデフォルトの E2E8F0。\n const connectorGradientMarker = node.connectorGradient\n ? registerBackgroundGradient(\n node.connectorGradient,\n node.opacity,\n ctx.buildContext.gradientFills,\n )\n : undefined;\n const connectorLineColor =\n connectorGradientMarker ?? stripHash(node.connectorColor) ?? \"E2E8F0\";\n\n const fontFace = node.fontFamily ?? \"Noto Sans JP\";\n const useColorForDate = node.useColorForDate ?? false;\n\n // スケール係数を計算(コンテンツ領域基準)\n const { content, scaleFactor } = resolveScaledContentArea(\n node,\n measureTimeline(node),\n ctx,\n );\n\n const nodeRadius = baseNodeRadius * scaleFactor;\n const lineWidth = baseLineWidth * scaleFactor;\n\n // コンテンツ領域を使用するための仮想ノードを作成\n const contentNode = withContentBounds(node, content);\n\n const options: TimelineRenderOptions = {\n defaultColor,\n nodeRadius,\n lineWidth,\n scaleFactor,\n textColors,\n connectorLineColor,\n fontFace,\n useColorForDate,\n };\n\n if (direction === \"horizontal\") {\n renderHorizontalTimeline(contentNode, ctx, items, options);\n } else {\n renderVerticalTimeline(contentNode, ctx, items, options);\n }\n}\n\nfunction resolveItemDateColor(\n item: TimelinePositionedNode[\"items\"][number],\n options: TimelineRenderOptions,\n): string {\n // 優先順位: item.dateColor > (useColorForDate && item.color) > Timeline.dateColor\n const perItemDateColor = stripHash(item.dateColor);\n if (perItemDateColor) return perItemDateColor;\n if (options.useColorForDate && item.color) {\n const inherited = stripHash(item.color);\n if (inherited) return inherited;\n }\n return options.textColors.date;\n}\n\nfunction renderHorizontalTimeline(\n node: TimelinePositionedNode,\n ctx: RenderContext,\n items: TimelinePositionedNode[\"items\"],\n options: TimelineRenderOptions,\n): void {\n const {\n defaultColor,\n nodeRadius,\n lineWidth,\n scaleFactor,\n textColors,\n connectorLineColor,\n fontFace,\n } = options;\n const itemCount = items.length;\n const lineY = node.y + node.h / 2;\n const labelW = 120 * scaleFactor;\n // 極端に狭い node.w でも startX <= endX を保つため、インセットを node.w/2 で頭打ちする\n const inset = Math.min(labelW / 2, node.w / 2);\n const startX = node.x + inset;\n const endX = node.x + node.w - inset;\n const lineLength = endX - startX;\n\n // メインの線を描画\n ctx.slide.addShape(ctx.pptx.ShapeType.line, {\n x: pxToIn(startX),\n y: pxToIn(lineY),\n w: pxToIn(lineLength),\n h: 0,\n line: { color: connectorLineColor, width: pxToPt(lineWidth) },\n });\n const dateLabelH = 24 * scaleFactor;\n const titleLabelH = 24 * scaleFactor;\n const descLabelH = 32 * scaleFactor;\n const dateOffset = 40 * scaleFactor;\n const titleGap = 8 * scaleFactor;\n const descOffset = 32 * scaleFactor;\n\n // 各アイテムを描画\n items.forEach((item, index) => {\n const progress = itemCount === 1 ? 0.5 : index / (itemCount - 1);\n const cx = startX + lineLength * progress;\n const cy = lineY;\n const color = item.color ?? defaultColor;\n const dateColor = resolveItemDateColor(item, options);\n\n // ノード(円)を描画\n ctx.slide.addShape(ctx.pptx.ShapeType.ellipse, {\n x: pxToIn(cx - nodeRadius),\n y: pxToIn(cy - nodeRadius),\n w: pxToIn(nodeRadius * 2),\n h: pxToIn(nodeRadius * 2),\n fill: { color },\n line: { type: \"none\" as const },\n });\n\n // 日付を上に表示\n ctx.slide.addText(item.date, {\n x: pxToIn(cx - labelW / 2),\n y: pxToIn(cy - nodeRadius - dateOffset),\n w: pxToIn(labelW),\n h: pxToIn(dateLabelH),\n fontSize: pxToPt(12 * scaleFactor),\n fontFace,\n color: dateColor,\n align: \"center\",\n valign: \"bottom\",\n });\n\n // タイトルを下に表示\n ctx.slide.addText(item.title, {\n x: pxToIn(cx - labelW / 2),\n y: pxToIn(cy + nodeRadius + titleGap),\n w: pxToIn(labelW),\n h: pxToIn(titleLabelH),\n fontSize: pxToPt(14 * scaleFactor),\n fontFace,\n color: textColors.title,\n bold: true,\n align: \"center\",\n valign: \"top\",\n });\n\n // 説明を表示\n if (item.description) {\n ctx.slide.addText(item.description, {\n x: pxToIn(cx - labelW / 2),\n y: pxToIn(cy + nodeRadius + descOffset),\n w: pxToIn(labelW),\n h: pxToIn(descLabelH),\n fontSize: pxToPt(11 * scaleFactor),\n fontFace,\n color: textColors.description,\n align: \"center\",\n valign: \"top\",\n });\n }\n });\n}\n\nfunction renderVerticalTimeline(\n node: TimelinePositionedNode,\n ctx: RenderContext,\n items: TimelinePositionedNode[\"items\"],\n options: TimelineRenderOptions,\n): void {\n const {\n defaultColor,\n nodeRadius,\n lineWidth,\n scaleFactor,\n textColors,\n connectorLineColor,\n fontFace,\n } = options;\n const itemCount = items.length;\n const lineX = node.x + 40 * scaleFactor;\n const startY = node.y + nodeRadius;\n const endY = node.y + node.h - nodeRadius;\n const lineLength = endY - startY;\n\n // メインの線を描画\n ctx.slide.addShape(ctx.pptx.ShapeType.line, {\n x: pxToIn(lineX),\n y: pxToIn(startY),\n w: 0,\n h: pxToIn(lineLength),\n line: { color: connectorLineColor, width: pxToPt(lineWidth) },\n });\n\n const labelGap = 16 * scaleFactor;\n const dateLabelW = 100 * scaleFactor;\n const dateLabelH = 20 * scaleFactor;\n const titleLabelH = 24 * scaleFactor;\n const descLabelH = 32 * scaleFactor;\n const titleLabelW = node.w - 80 * scaleFactor;\n const descLabelW = node.w - 80 * scaleFactor;\n\n // 各アイテムを描画\n items.forEach((item, index) => {\n const progress = itemCount === 1 ? 0.5 : index / (itemCount - 1);\n const cx = lineX;\n const cy = startY + lineLength * progress;\n const color = item.color ?? defaultColor;\n const dateColor = resolveItemDateColor(item, options);\n\n // ノード(円)を描画\n ctx.slide.addShape(ctx.pptx.ShapeType.ellipse, {\n x: pxToIn(cx - nodeRadius),\n y: pxToIn(cy - nodeRadius),\n w: pxToIn(nodeRadius * 2),\n h: pxToIn(nodeRadius * 2),\n fill: { color },\n line: { type: \"none\" as const },\n });\n\n // 日付を左上に表示\n ctx.slide.addText(item.date, {\n x: pxToIn(cx + nodeRadius + labelGap),\n y: pxToIn(cy - nodeRadius - 4 * scaleFactor),\n w: pxToIn(dateLabelW),\n h: pxToIn(dateLabelH),\n fontSize: pxToPt(12 * scaleFactor),\n fontFace,\n color: dateColor,\n align: \"left\",\n valign: \"bottom\",\n });\n\n // タイトルを右に表示\n ctx.slide.addText(item.title, {\n x: pxToIn(cx + nodeRadius + labelGap),\n y: pxToIn(cy - 4 * scaleFactor),\n w: pxToIn(titleLabelW),\n h: pxToIn(titleLabelH),\n fontSize: pxToPt(14 * scaleFactor),\n fontFace,\n color: textColors.title,\n bold: true,\n align: \"left\",\n valign: \"top\",\n });\n\n // 説明を表示\n if (item.description) {\n ctx.slide.addText(item.description, {\n x: pxToIn(cx + nodeRadius + labelGap),\n y: pxToIn(cy + 20 * scaleFactor),\n w: pxToIn(descLabelW),\n h: pxToIn(descLabelH),\n fontSize: pxToPt(11 * scaleFactor),\n fontFace,\n color: textColors.description,\n align: \"left\",\n valign: \"top\",\n });\n }\n });\n}\n"],"mappings":";;;;;;;AA4BA,SAAgB,mBACd,MACA,KACM;CACN,MAAM,YAAY,KAAK,aAAa;CACpC,MAAM,QAAQ,KAAK;CAGnB,IAFkB,MAAM,WAEN,GAAG;CAErB,MAAM,eAAe;CACrB,MAAM,iBAAiB;CACvB,MAAM,gBAAgB;CAEtB,MAAM,aAAiC;EACrC,MAAM,UAAU,KAAK,SAAS,KAAK;EACnC,OAAO,UAAU,KAAK,UAAU,KAAK;EACrC,aAAa,UAAU,KAAK,gBAAgB,KAAK;CACnD;CAYA,MAAM,sBAP0B,KAAK,oBACjC,2BACE,KAAK,mBACL,KAAK,SACL,IAAI,aAAa,aACnB,IACA,KAAA,MAEyB,UAAU,KAAK,cAAc,KAAK;CAE/D,MAAM,WAAW,KAAK,cAAc;CACpC,MAAM,kBAAkB,KAAK,mBAAmB;CAGhD,MAAM,EAAE,SAAS,gBAAgB,yBAC/B,MACA,gBAAgB,IAAI,GACpB,GACF;CAEA,MAAM,aAAa,iBAAiB;CACpC,MAAM,YAAY,gBAAgB;CAGlC,MAAM,cAAc,kBAAkB,MAAM,OAAO;CAEnD,MAAM,UAAiC;EACrC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CAEA,IAAI,cAAc,cAChB,yBAAyB,aAAa,KAAK,OAAO,OAAO;MAEzD,uBAAuB,aAAa,KAAK,OAAO,OAAO;AAE3D;AAEA,SAAS,qBACP,MACA,SACQ;CAER,MAAM,mBAAmB,UAAU,KAAK,SAAS;CACjD,IAAI,kBAAkB,OAAO;CAC7B,IAAI,QAAQ,mBAAmB,KAAK,OAAO;EACzC,MAAM,YAAY,UAAU,KAAK,KAAK;EACtC,IAAI,WAAW,OAAO;CACxB;CACA,OAAO,QAAQ,WAAW;AAC5B;AAEA,SAAS,yBACP,MACA,KACA,OACA,SACM;CACN,MAAM,EACJ,cACA,YACA,WACA,aACA,YACA,oBACA,aACE;CACJ,MAAM,YAAY,MAAM;CACxB,MAAM,QAAQ,KAAK,IAAI,KAAK,IAAI;CAChC,MAAM,SAAS,MAAM;CAErB,MAAM,QAAQ,KAAK,IAAI,SAAS,GAAG,KAAK,IAAI,CAAC;CAC7C,MAAM,SAAS,KAAK,IAAI;CAExB,MAAM,aADO,KAAK,IAAI,KAAK,IAAI,QACL;CAG1B,IAAI,MAAM,SAAS,IAAI,KAAK,UAAU,MAAM;EAC1C,GAAG,OAAO,MAAM;EAChB,GAAG,OAAO,KAAK;EACf,GAAG,OAAO,UAAU;EACpB,GAAG;EACH,MAAM;GAAE,OAAO;GAAoB,OAAO,OAAO,SAAS;EAAE;CAC9D,CAAC;CACD,MAAM,aAAa,KAAK;CACxB,MAAM,cAAc,KAAK;CACzB,MAAM,aAAa,KAAK;CACxB,MAAM,aAAa,KAAK;CACxB,MAAM,WAAW,IAAI;CACrB,MAAM,aAAa,KAAK;CAGxB,MAAM,SAAS,MAAM,UAAU;EAE7B,MAAM,KAAK,SAAS,cADH,cAAc,IAAI,KAAM,SAAS,YAAY;EAE9D,MAAM,KAAK;EACX,MAAM,QAAQ,KAAK,SAAS;EAC5B,MAAM,YAAY,qBAAqB,MAAM,OAAO;EAGpD,IAAI,MAAM,SAAS,IAAI,KAAK,UAAU,SAAS;GAC7C,GAAG,OAAO,KAAK,UAAU;GACzB,GAAG,OAAO,KAAK,UAAU;GACzB,GAAG,OAAO,aAAa,CAAC;GACxB,GAAG,OAAO,aAAa,CAAC;GACxB,MAAM,EAAE,MAAM;GACd,MAAM,EAAE,MAAM,OAAgB;EAChC,CAAC;EAGD,IAAI,MAAM,QAAQ,KAAK,MAAM;GAC3B,GAAG,OAAO,KAAK,SAAS,CAAC;GACzB,GAAG,OAAO,KAAK,aAAa,UAAU;GACtC,GAAG,OAAO,MAAM;GAChB,GAAG,OAAO,UAAU;GACpB,UAAU,OAAO,KAAK,WAAW;GACjC;GACA,OAAO;GACP,OAAO;GACP,QAAQ;EACV,CAAC;EAGD,IAAI,MAAM,QAAQ,KAAK,OAAO;GAC5B,GAAG,OAAO,KAAK,SAAS,CAAC;GACzB,GAAG,OAAO,KAAK,aAAa,QAAQ;GACpC,GAAG,OAAO,MAAM;GAChB,GAAG,OAAO,WAAW;GACrB,UAAU,OAAO,KAAK,WAAW;GACjC;GACA,OAAO,WAAW;GAClB,MAAM;GACN,OAAO;GACP,QAAQ;EACV,CAAC;EAGD,IAAI,KAAK,aACP,IAAI,MAAM,QAAQ,KAAK,aAAa;GAClC,GAAG,OAAO,KAAK,SAAS,CAAC;GACzB,GAAG,OAAO,KAAK,aAAa,UAAU;GACtC,GAAG,OAAO,MAAM;GAChB,GAAG,OAAO,UAAU;GACpB,UAAU,OAAO,KAAK,WAAW;GACjC;GACA,OAAO,WAAW;GAClB,OAAO;GACP,QAAQ;EACV,CAAC;CAEL,CAAC;AACH;AAEA,SAAS,uBACP,MACA,KACA,OACA,SACM;CACN,MAAM,EACJ,cACA,YACA,WACA,aACA,YACA,oBACA,aACE;CACJ,MAAM,YAAY,MAAM;CACxB,MAAM,QAAQ,KAAK,IAAI,KAAK;CAC5B,MAAM,SAAS,KAAK,IAAI;CAExB,MAAM,aADO,KAAK,IAAI,KAAK,IAAI,aACL;CAG1B,IAAI,MAAM,SAAS,IAAI,KAAK,UAAU,MAAM;EAC1C,GAAG,OAAO,KAAK;EACf,GAAG,OAAO,MAAM;EAChB,GAAG;EACH,GAAG,OAAO,UAAU;EACpB,MAAM;GAAE,OAAO;GAAoB,OAAO,OAAO,SAAS;EAAE;CAC9D,CAAC;CAED,MAAM,WAAW,KAAK;CACtB,MAAM,aAAa,MAAM;CACzB,MAAM,aAAa,KAAK;CACxB,MAAM,cAAc,KAAK;CACzB,MAAM,aAAa,KAAK;CACxB,MAAM,cAAc,KAAK,IAAI,KAAK;CAClC,MAAM,aAAa,KAAK,IAAI,KAAK;CAGjC,MAAM,SAAS,MAAM,UAAU;EAC7B,MAAM,WAAW,cAAc,IAAI,KAAM,SAAS,YAAY;EAC9D,MAAM,KAAK;EACX,MAAM,KAAK,SAAS,aAAa;EACjC,MAAM,QAAQ,KAAK,SAAS;EAC5B,MAAM,YAAY,qBAAqB,MAAM,OAAO;EAGpD,IAAI,MAAM,SAAS,IAAI,KAAK,UAAU,SAAS;GAC7C,GAAG,OAAO,KAAK,UAAU;GACzB,GAAG,OAAO,KAAK,UAAU;GACzB,GAAG,OAAO,aAAa,CAAC;GACxB,GAAG,OAAO,aAAa,CAAC;GACxB,MAAM,EAAE,MAAM;GACd,MAAM,EAAE,MAAM,OAAgB;EAChC,CAAC;EAGD,IAAI,MAAM,QAAQ,KAAK,MAAM;GAC3B,GAAG,OAAO,KAAK,aAAa,QAAQ;GACpC,GAAG,OAAO,KAAK,aAAa,IAAI,WAAW;GAC3C,GAAG,OAAO,UAAU;GACpB,GAAG,OAAO,UAAU;GACpB,UAAU,OAAO,KAAK,WAAW;GACjC;GACA,OAAO;GACP,OAAO;GACP,QAAQ;EACV,CAAC;EAGD,IAAI,MAAM,QAAQ,KAAK,OAAO;GAC5B,GAAG,OAAO,KAAK,aAAa,QAAQ;GACpC,GAAG,OAAO,KAAK,IAAI,WAAW;GAC9B,GAAG,OAAO,WAAW;GACrB,GAAG,OAAO,WAAW;GACrB,UAAU,OAAO,KAAK,WAAW;GACjC;GACA,OAAO,WAAW;GAClB,MAAM;GACN,OAAO;GACP,QAAQ;EACV,CAAC;EAGD,IAAI,KAAK,aACP,IAAI,MAAM,QAAQ,KAAK,aAAa;GAClC,GAAG,OAAO,KAAK,aAAa,QAAQ;GACpC,GAAG,OAAO,KAAK,KAAK,WAAW;GAC/B,GAAG,OAAO,UAAU;GACpB,GAAG,OAAO,UAAU;GACpB,UAAU,OAAO,KAAK,WAAW;GACjC;GACA,OAAO,WAAW;GAClB,OAAO;GACP,QAAQ;EACV,CAAC;CAEL,CAAC;AACH"}
@@ -54,6 +54,28 @@ function resolveStopPositions(stops) {
54
54
  };
55
55
  });
56
56
  }
57
+ /** カラーストップ群 (`<color> [<pos>%]`) を parse する。失敗時 null */
58
+ function parseColorStops(stopArgs) {
59
+ if (stopArgs.length < 2) return null;
60
+ const stops = [];
61
+ for (const stopArg of stopArgs) {
62
+ const parts = stopArg.split(/\s+/);
63
+ if (parts.length === 0 || parts.length > 2) return null;
64
+ const color = normalizeColor(parts[0]);
65
+ if (color === null) return null;
66
+ let position;
67
+ if (parts.length === 2) {
68
+ const posMatch = /^(-?\d+(?:\.\d+)?)%$/.exec(parts[1]);
69
+ if (!posMatch) return null;
70
+ position = Number(posMatch[1]);
71
+ }
72
+ stops.push({
73
+ color,
74
+ position
75
+ });
76
+ }
77
+ return resolveStopPositions(stops);
78
+ }
57
79
  /**
58
80
  * linear-gradient() 構文をパースする。不正な構文の場合は null を返す。
59
81
  */
@@ -74,30 +96,174 @@ function parseLinearGradient(value) {
74
96
  angle = directionAngle;
75
97
  stopArgs = args.slice(1);
76
98
  }
77
- if (stopArgs.length < 2) return null;
78
- const stops = [];
79
- for (const stopArg of stopArgs) {
80
- const parts = stopArg.split(/\s+/);
81
- if (parts.length === 0 || parts.length > 2) return null;
82
- const color = normalizeColor(parts[0]);
83
- if (color === null) return null;
84
- let position;
85
- if (parts.length === 2) {
86
- const posMatch = /^(-?\d+(?:\.\d+)?)%$/.exec(parts[1]);
87
- if (!posMatch) return null;
88
- position = Number(posMatch[1]);
99
+ const stops = parseColorStops(stopArgs);
100
+ if (!stops) return null;
101
+ return {
102
+ angle,
103
+ stops
104
+ };
105
+ }
106
+ const SHAPE_KEYWORDS = new Set(["circle", "ellipse"]);
107
+ const SIZE_KEYWORDS = new Set([
108
+ "closest-side",
109
+ "closest-corner",
110
+ "farthest-side",
111
+ "farthest-corner"
112
+ ]);
113
+ const POSITION_X_KEYWORDS = {
114
+ left: 0,
115
+ center: 50,
116
+ right: 100
117
+ };
118
+ const POSITION_Y_KEYWORDS = {
119
+ top: 0,
120
+ center: 50,
121
+ bottom: 100
122
+ };
123
+ /**
124
+ * `at <position>` の <position> 部分を parse する。
125
+ * 1〜2 トークンの組み合わせを受け取り、{ x, y } (各 0-100 %) を返す。
126
+ *
127
+ * 受け付ける形:
128
+ * center / left / right / top / bottom
129
+ * top right / left bottom / center top など (2 トークン)
130
+ * 50% / 25% 75% (% 値)
131
+ *
132
+ * 不正な組み合わせは null。
133
+ */
134
+ function parsePosition(tokens) {
135
+ if (tokens.length === 0 || tokens.length > 2) return null;
136
+ if (tokens.length === 1) {
137
+ const t = tokens[0].toLowerCase();
138
+ if (t === "center") return {
139
+ x: 50,
140
+ y: 50
141
+ };
142
+ if (t in POSITION_X_KEYWORDS) return {
143
+ x: POSITION_X_KEYWORDS[t],
144
+ y: 50
145
+ };
146
+ if (t in POSITION_Y_KEYWORDS) return {
147
+ x: 50,
148
+ y: POSITION_Y_KEYWORDS[t]
149
+ };
150
+ const pct = /^(-?\d+(?:\.\d+)?)%$/.exec(t);
151
+ if (pct) return {
152
+ x: Number(pct[1]),
153
+ y: 50
154
+ };
155
+ return null;
156
+ }
157
+ let x = null;
158
+ let y = null;
159
+ let centerCount = 0;
160
+ for (const raw of tokens) {
161
+ const t = raw.toLowerCase();
162
+ const pct = /^(-?\d+(?:\.\d+)?)%$/.exec(t);
163
+ if (pct) {
164
+ const v = Number(pct[1]);
165
+ if (x === null) x = v;
166
+ else if (y === null) y = v;
167
+ else return null;
168
+ continue;
89
169
  }
90
- stops.push({
91
- color,
92
- position
93
- });
170
+ if (t === "left" || t === "right") {
171
+ if (x !== null) return null;
172
+ x = POSITION_X_KEYWORDS[t];
173
+ continue;
174
+ }
175
+ if (t === "top" || t === "bottom") {
176
+ if (y !== null) return null;
177
+ y = POSITION_Y_KEYWORDS[t];
178
+ continue;
179
+ }
180
+ if (t === "center") {
181
+ centerCount++;
182
+ continue;
183
+ }
184
+ return null;
94
185
  }
186
+ for (let i = 0; i < centerCount; i++) if (x === null) x = 50;
187
+ else if (y === null) y = 50;
188
+ else return null;
95
189
  return {
96
- angle,
97
- stops: resolveStopPositions(stops)
190
+ x: x ?? 50,
191
+ y: y ?? 50
192
+ };
193
+ }
194
+ /**
195
+ * radial-gradient() 構文をパースする。不正な構文の場合は null を返す。
196
+ *
197
+ * 受け付ける構文:
198
+ * radial-gradient(<color stops>)
199
+ * radial-gradient(<shape>?, <color stops>) // 例: radial-gradient(circle, #FF0000, #0000FF)
200
+ * radial-gradient(<shape>? <size>?, <color stops>) // 例: radial-gradient(circle farthest-side, ...)
201
+ * radial-gradient(<shape>? <size>? at <position>, <color stops>) // 例: radial-gradient(ellipse at top right, ...)
202
+ * radial-gradient(at <position>, <color stops>) // 例: radial-gradient(at 25% 75%, ...)
203
+ */
204
+ function parseRadialGradient(value) {
205
+ const match = /^\s*radial-gradient\s*\(\s*(.+?)\s*\)\s*$/.exec(value);
206
+ if (!match) return null;
207
+ const args = match[1].split(",").map((s) => s.trim());
208
+ if (args.length === 0) return null;
209
+ let shape = "ellipse";
210
+ let size = "farthest-corner";
211
+ let centerX = 50;
212
+ let centerY = 50;
213
+ let stopArgs = args;
214
+ const firstTokens = args[0].split(/\s+/).filter((t) => t.length > 0);
215
+ const firstLowerTokens = firstTokens.map((t) => t.toLowerCase());
216
+ if (firstLowerTokens.some((t) => SHAPE_KEYWORDS.has(t) || SIZE_KEYWORDS.has(t) || t === "at")) {
217
+ const atIdx = firstLowerTokens.indexOf("at");
218
+ const shapeSizeTokens = atIdx >= 0 ? firstLowerTokens.slice(0, atIdx) : firstLowerTokens;
219
+ const positionTokens = atIdx >= 0 ? firstTokens.slice(atIdx + 1) : [];
220
+ let shapeSeen = false;
221
+ let sizeSeen = false;
222
+ for (const token of shapeSizeTokens) if (SHAPE_KEYWORDS.has(token)) {
223
+ if (shapeSeen) return null;
224
+ shape = token;
225
+ shapeSeen = true;
226
+ } else if (SIZE_KEYWORDS.has(token)) {
227
+ if (sizeSeen) return null;
228
+ size = token;
229
+ sizeSeen = true;
230
+ } else return null;
231
+ if (atIdx >= 0) {
232
+ if (positionTokens.length === 0) return null;
233
+ const pos = parsePosition(positionTokens);
234
+ if (!pos) return null;
235
+ centerX = pos.x;
236
+ centerY = pos.y;
237
+ }
238
+ stopArgs = args.slice(1);
239
+ }
240
+ const stops = parseColorStops(stopArgs);
241
+ if (!stops) return null;
242
+ return {
243
+ shape,
244
+ size,
245
+ centerX,
246
+ centerY,
247
+ stops
248
+ };
249
+ }
250
+ /**
251
+ * linear-gradient / radial-gradient のいずれかを parse する。
252
+ */
253
+ function parseGradient(value) {
254
+ const linear = parseLinearGradient(value);
255
+ if (linear) return {
256
+ kind: "linear",
257
+ value: linear
258
+ };
259
+ const radial = parseRadialGradient(value);
260
+ if (radial) return {
261
+ kind: "radial",
262
+ value: radial
98
263
  };
264
+ return null;
99
265
  }
100
266
  //#endregion
101
- export { parseLinearGradient };
267
+ export { parseGradient, parseLinearGradient };
102
268
 
103
269
  //# sourceMappingURL=gradient.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"gradient.js","names":[],"sources":["../../src/shared/gradient.ts"],"sourcesContent":["/**\n * リニアグラデーション文字列のパース\n *\n * CSS の linear-gradient() 風の構文を受け付ける:\n * linear-gradient(135deg, #FF0000 0%, #0000FF 100%)\n * linear-gradient(to right, #FF0000, #00FF00, #0000FF)\n * linear-gradient(#FF0000, #0000FF) ← 角度省略時は 180deg (上→下)\n *\n * - 角度: `<数値>deg` または `to <方向>` キーワード。省略時は 180deg。\n * - カラーストップ: 16進カラー (#RGB / #RRGGBB / RRGGBB) + 任意の位置 (%)。\n * 位置省略時は CSS と同様に補間する (先頭 0% / 末尾 100% / 中間は線形補間)。\n * - ストップは 2 つ以上必須。\n */\n\nexport interface GradientStop {\n /** 6桁大文字 HEX (# なし) */\n color: string;\n /** 0-100 (%) */\n position: number;\n}\n\nexport interface LinearGradient {\n /** CSS 基準の角度 (deg)。0 = 上向き、時計回り。0-360 に正規化済み */\n angle: number;\n stops: GradientStop[];\n}\n\n/** `to <方向>` キーワード → CSS 角度 (deg)。コーナーは 45 度刻みの近似 */\nconst DIRECTION_KEYWORDS: Record<string, number> = {\n \"to top\": 0,\n \"to right\": 90,\n \"to bottom\": 180,\n \"to left\": 270,\n \"to top right\": 45,\n \"to right top\": 45,\n \"to bottom right\": 135,\n \"to right bottom\": 135,\n \"to bottom left\": 225,\n \"to left bottom\": 225,\n \"to top left\": 315,\n \"to left top\": 315,\n};\n\nconst COLOR_PATTERN = /^#?([0-9a-fA-F]{6}|[0-9a-fA-F]{3})$/;\n\nfunction normalizeColor(raw: string): string | null {\n const match = COLOR_PATTERN.exec(raw);\n if (!match) return null;\n const hex = match[1];\n if (hex.length === 3) {\n return hex\n .split(\"\")\n .map((c) => c + c)\n .join(\"\")\n .toUpperCase();\n }\n return hex.toUpperCase();\n}\n\n/**\n * 位置省略されたストップに CSS 互換のルールで位置を割り当てる。\n * - 先頭が省略なら 0、末尾が省略なら 100\n * - 中間の省略は前後の明示位置の間で均等配置\n * - 位置が前のストップより小さい場合は前の値に切り上げ (非減少を保証)\n */\nfunction resolveStopPositions(\n stops: { color: string; position: number | undefined }[],\n): GradientStop[] {\n const positions: (number | undefined)[] = stops.map((s) => s.position);\n if (positions[0] === undefined) positions[0] = 0;\n if (positions[positions.length - 1] === undefined) {\n positions[positions.length - 1] = 100;\n }\n\n let prevIndex = 0;\n for (let i = 1; i < positions.length; i++) {\n if (positions[i] === undefined) continue;\n const gap = i - prevIndex;\n if (gap > 1) {\n const start = positions[prevIndex]!;\n const end = positions[i]!;\n for (let j = 1; j < gap; j++) {\n positions[prevIndex + j] = start + ((end - start) * j) / gap;\n }\n }\n prevIndex = i;\n }\n\n let prev = 0;\n return stops.map((stop, i) => {\n const clamped = Math.min(Math.max(positions[i]!, 0), 100);\n const position = Math.max(clamped, prev);\n prev = position;\n return { color: stop.color, position };\n });\n}\n\n/**\n * linear-gradient() 構文をパースする。不正な構文の場合は null を返す。\n */\nexport function parseLinearGradient(value: string): LinearGradient | null {\n const match = /^\\s*linear-gradient\\s*\\(\\s*(.+?)\\s*\\)\\s*$/.exec(value);\n if (!match) return null;\n\n const args = match[1].split(\",\").map((s) => s.trim());\n if (args.length === 0) return null;\n\n let angle = 180;\n let stopArgs = args;\n\n const first = args[0];\n const angleMatch = /^(-?\\d+(?:\\.\\d+)?)deg$/.exec(first);\n const directionAngle =\n DIRECTION_KEYWORDS[first.toLowerCase().replace(/\\s+/g, \" \")];\n if (angleMatch) {\n angle = ((Number(angleMatch[1]) % 360) + 360) % 360;\n stopArgs = args.slice(1);\n } else if (directionAngle !== undefined) {\n angle = directionAngle;\n stopArgs = args.slice(1);\n }\n\n if (stopArgs.length < 2) return null;\n\n const stops: { color: string; position: number | undefined }[] = [];\n for (const stopArg of stopArgs) {\n const parts = stopArg.split(/\\s+/);\n if (parts.length === 0 || parts.length > 2) return null;\n const color = normalizeColor(parts[0]);\n if (color === null) return null;\n\n let position: number | undefined;\n if (parts.length === 2) {\n const posMatch = /^(-?\\d+(?:\\.\\d+)?)%$/.exec(parts[1]);\n if (!posMatch) return null;\n position = Number(posMatch[1]);\n }\n stops.push({ color, position });\n }\n\n return { angle, stops: resolveStopPositions(stops) };\n}\n"],"mappings":";;AA4BA,MAAM,qBAA6C;CACjD,UAAU;CACV,YAAY;CACZ,aAAa;CACb,WAAW;CACX,gBAAgB;CAChB,gBAAgB;CAChB,mBAAmB;CACnB,mBAAmB;CACnB,kBAAkB;CAClB,kBAAkB;CAClB,eAAe;CACf,eAAe;AACjB;AAEA,MAAM,gBAAgB;AAEtB,SAAS,eAAe,KAA4B;CAClD,MAAM,QAAQ,cAAc,KAAK,GAAG;CACpC,IAAI,CAAC,OAAO,OAAO;CACnB,MAAM,MAAM,MAAM;CAClB,IAAI,IAAI,WAAW,GACjB,OAAO,IACJ,MAAM,EAAE,CAAC,CACT,KAAK,MAAM,IAAI,CAAC,CAAC,CACjB,KAAK,EAAE,CAAC,CACR,YAAY;CAEjB,OAAO,IAAI,YAAY;AACzB;;;;;;;AAQA,SAAS,qBACP,OACgB;CAChB,MAAM,YAAoC,MAAM,KAAK,MAAM,EAAE,QAAQ;CACrE,IAAI,UAAU,OAAO,KAAA,GAAW,UAAU,KAAK;CAC/C,IAAI,UAAU,UAAU,SAAS,OAAO,KAAA,GACtC,UAAU,UAAU,SAAS,KAAK;CAGpC,IAAI,YAAY;CAChB,KAAK,IAAI,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;EACzC,IAAI,UAAU,OAAO,KAAA,GAAW;EAChC,MAAM,MAAM,IAAI;EAChB,IAAI,MAAM,GAAG;GACX,MAAM,QAAQ,UAAU;GACxB,MAAM,MAAM,UAAU;GACtB,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,KACvB,UAAU,YAAY,KAAK,SAAU,MAAM,SAAS,IAAK;EAE7D;EACA,YAAY;CACd;CAEA,IAAI,OAAO;CACX,OAAO,MAAM,KAAK,MAAM,MAAM;EAC5B,MAAM,UAAU,KAAK,IAAI,KAAK,IAAI,UAAU,IAAK,CAAC,GAAG,GAAG;EACxD,MAAM,WAAW,KAAK,IAAI,SAAS,IAAI;EACvC,OAAO;EACP,OAAO;GAAE,OAAO,KAAK;GAAO;EAAS;CACvC,CAAC;AACH;;;;AAKA,SAAgB,oBAAoB,OAAsC;CACxE,MAAM,QAAQ,4CAA4C,KAAK,KAAK;CACpE,IAAI,CAAC,OAAO,OAAO;CAEnB,MAAM,OAAO,MAAM,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,MAAM,EAAE,KAAK,CAAC;CACpD,IAAI,KAAK,WAAW,GAAG,OAAO;CAE9B,IAAI,QAAQ;CACZ,IAAI,WAAW;CAEf,MAAM,QAAQ,KAAK;CACnB,MAAM,aAAa,yBAAyB,KAAK,KAAK;CACtD,MAAM,iBACJ,mBAAmB,MAAM,YAAY,CAAC,CAAC,QAAQ,QAAQ,GAAG;CAC5D,IAAI,YAAY;EACd,SAAU,OAAO,WAAW,EAAE,IAAI,MAAO,OAAO;EAChD,WAAW,KAAK,MAAM,CAAC;CACzB,OAAO,IAAI,mBAAmB,KAAA,GAAW;EACvC,QAAQ;EACR,WAAW,KAAK,MAAM,CAAC;CACzB;CAEA,IAAI,SAAS,SAAS,GAAG,OAAO;CAEhC,MAAM,QAA2D,CAAC;CAClE,KAAK,MAAM,WAAW,UAAU;EAC9B,MAAM,QAAQ,QAAQ,MAAM,KAAK;EACjC,IAAI,MAAM,WAAW,KAAK,MAAM,SAAS,GAAG,OAAO;EACnD,MAAM,QAAQ,eAAe,MAAM,EAAE;EACrC,IAAI,UAAU,MAAM,OAAO;EAE3B,IAAI;EACJ,IAAI,MAAM,WAAW,GAAG;GACtB,MAAM,WAAW,uBAAuB,KAAK,MAAM,EAAE;GACrD,IAAI,CAAC,UAAU,OAAO;GACtB,WAAW,OAAO,SAAS,EAAE;EAC/B;EACA,MAAM,KAAK;GAAE;GAAO;EAAS,CAAC;CAChC;CAEA,OAAO;EAAE;EAAO,OAAO,qBAAqB,KAAK;CAAE;AACrD"}
1
+ {"version":3,"file":"gradient.js","names":[],"sources":["../../src/shared/gradient.ts"],"sourcesContent":["/**\n * CSS 風グラデーション文字列のパース\n *\n * linear-gradient と radial-gradient の 2 種類を扱う:\n * linear-gradient(135deg, #FF0000 0%, #0000FF 100%)\n * linear-gradient(to right, #FF0000, #00FF00, #0000FF)\n * linear-gradient(#FF0000, #0000FF)\n * radial-gradient(circle at center, #FF0000, #0000FF)\n * radial-gradient(ellipse farthest-corner at 50% 50%, #FF0000 0%, #0000FF 100%)\n * radial-gradient(#FF0000, #0000FF)\n *\n * - 角度 (linear): `<数値>deg` または `to <方向>` キーワード。省略時は 180deg。\n * - 形状 (radial): `circle` / `ellipse`。省略時は `ellipse`。\n * PowerPoint の DrawingML radial fill は shape を区別しないため、出力上は同一になる。\n * - サイズキーワード (radial): `closest-side` / `closest-corner` / `farthest-side` /\n * `farthest-corner`。省略時は `farthest-corner`。MVP では構文として受け付けるのみで\n * 出力は farthest-corner 相当 (PPT 標準) に固定。\n * - 中心位置 (radial): `at <position>` で指定。`center` / `top right` / `25% 75%` 等。\n * 省略時は `center` (50% 50%)。\n * - カラーストップ: 16進カラー (#RGB / #RRGGBB / RRGGBB) + 任意の位置 (%)。\n * 位置省略時は CSS と同様に補間する (先頭 0% / 末尾 100% / 中間は線形補間)。\n * - ストップは 2 つ以上必須。\n */\n\nexport interface GradientStop {\n /** 6桁大文字 HEX (# なし) */\n color: string;\n /** 0-100 (%) */\n position: number;\n}\n\nexport interface LinearGradient {\n /** CSS 基準の角度 (deg)。0 = 上向き、時計回り。0-360 に正規化済み */\n angle: number;\n stops: GradientStop[];\n}\n\nexport type RadialGradientShape = \"circle\" | \"ellipse\";\nexport type RadialGradientSize =\n | \"closest-side\"\n | \"closest-corner\"\n | \"farthest-side\"\n | \"farthest-corner\";\n\nexport interface RadialGradient {\n shape: RadialGradientShape;\n size: RadialGradientSize;\n /** 中心位置 X (%、0=左 / 100=右) */\n centerX: number;\n /** 中心位置 Y (%、0=上 / 100=下) */\n centerY: number;\n stops: GradientStop[];\n}\n\nexport type Gradient =\n | { kind: \"linear\"; value: LinearGradient }\n | { kind: \"radial\"; value: RadialGradient };\n\n/** `to <方向>` キーワード → CSS 角度 (deg)。コーナーは 45 度刻みの近似 */\nconst DIRECTION_KEYWORDS: Record<string, number> = {\n \"to top\": 0,\n \"to right\": 90,\n \"to bottom\": 180,\n \"to left\": 270,\n \"to top right\": 45,\n \"to right top\": 45,\n \"to bottom right\": 135,\n \"to right bottom\": 135,\n \"to bottom left\": 225,\n \"to left bottom\": 225,\n \"to top left\": 315,\n \"to left top\": 315,\n};\n\nconst COLOR_PATTERN = /^#?([0-9a-fA-F]{6}|[0-9a-fA-F]{3})$/;\n\nfunction normalizeColor(raw: string): string | null {\n const match = COLOR_PATTERN.exec(raw);\n if (!match) return null;\n const hex = match[1];\n if (hex.length === 3) {\n return hex\n .split(\"\")\n .map((c) => c + c)\n .join(\"\")\n .toUpperCase();\n }\n return hex.toUpperCase();\n}\n\n/**\n * 位置省略されたストップに CSS 互換のルールで位置を割り当てる。\n * - 先頭が省略なら 0、末尾が省略なら 100\n * - 中間の省略は前後の明示位置の間で均等配置\n * - 位置が前のストップより小さい場合は前の値に切り上げ (非減少を保証)\n */\nfunction resolveStopPositions(\n stops: { color: string; position: number | undefined }[],\n): GradientStop[] {\n const positions: (number | undefined)[] = stops.map((s) => s.position);\n if (positions[0] === undefined) positions[0] = 0;\n if (positions[positions.length - 1] === undefined) {\n positions[positions.length - 1] = 100;\n }\n\n let prevIndex = 0;\n for (let i = 1; i < positions.length; i++) {\n if (positions[i] === undefined) continue;\n const gap = i - prevIndex;\n if (gap > 1) {\n const start = positions[prevIndex]!;\n const end = positions[i]!;\n for (let j = 1; j < gap; j++) {\n positions[prevIndex + j] = start + ((end - start) * j) / gap;\n }\n }\n prevIndex = i;\n }\n\n let prev = 0;\n return stops.map((stop, i) => {\n const clamped = Math.min(Math.max(positions[i]!, 0), 100);\n const position = Math.max(clamped, prev);\n prev = position;\n return { color: stop.color, position };\n });\n}\n\n/** カラーストップ群 (`<color> [<pos>%]`) を parse する。失敗時 null */\nfunction parseColorStops(stopArgs: string[]): GradientStop[] | null {\n if (stopArgs.length < 2) return null;\n const stops: { color: string; position: number | undefined }[] = [];\n for (const stopArg of stopArgs) {\n const parts = stopArg.split(/\\s+/);\n if (parts.length === 0 || parts.length > 2) return null;\n const color = normalizeColor(parts[0]);\n if (color === null) return null;\n\n let position: number | undefined;\n if (parts.length === 2) {\n const posMatch = /^(-?\\d+(?:\\.\\d+)?)%$/.exec(parts[1]);\n if (!posMatch) return null;\n position = Number(posMatch[1]);\n }\n stops.push({ color, position });\n }\n return resolveStopPositions(stops);\n}\n\n/**\n * linear-gradient() 構文をパースする。不正な構文の場合は null を返す。\n */\nexport function parseLinearGradient(value: string): LinearGradient | null {\n const match = /^\\s*linear-gradient\\s*\\(\\s*(.+?)\\s*\\)\\s*$/.exec(value);\n if (!match) return null;\n\n const args = match[1].split(\",\").map((s) => s.trim());\n if (args.length === 0) return null;\n\n let angle = 180;\n let stopArgs = args;\n\n const first = args[0];\n const angleMatch = /^(-?\\d+(?:\\.\\d+)?)deg$/.exec(first);\n const directionAngle =\n DIRECTION_KEYWORDS[first.toLowerCase().replace(/\\s+/g, \" \")];\n if (angleMatch) {\n angle = ((Number(angleMatch[1]) % 360) + 360) % 360;\n stopArgs = args.slice(1);\n } else if (directionAngle !== undefined) {\n angle = directionAngle;\n stopArgs = args.slice(1);\n }\n\n const stops = parseColorStops(stopArgs);\n if (!stops) return null;\n\n return { angle, stops };\n}\n\nconst SHAPE_KEYWORDS: ReadonlySet<string> = new Set([\"circle\", \"ellipse\"]);\nconst SIZE_KEYWORDS: ReadonlySet<string> = new Set([\n \"closest-side\",\n \"closest-corner\",\n \"farthest-side\",\n \"farthest-corner\",\n]);\nconst POSITION_X_KEYWORDS: Record<string, number> = {\n left: 0,\n center: 50,\n right: 100,\n};\nconst POSITION_Y_KEYWORDS: Record<string, number> = {\n top: 0,\n center: 50,\n bottom: 100,\n};\n\n/**\n * `at <position>` の <position> 部分を parse する。\n * 1〜2 トークンの組み合わせを受け取り、{ x, y } (各 0-100 %) を返す。\n *\n * 受け付ける形:\n * center / left / right / top / bottom\n * top right / left bottom / center top など (2 トークン)\n * 50% / 25% 75% (% 値)\n *\n * 不正な組み合わせは null。\n */\nfunction parsePosition(tokens: string[]): { x: number; y: number } | null {\n if (tokens.length === 0 || tokens.length > 2) return null;\n if (tokens.length === 1) {\n const t = tokens[0].toLowerCase();\n if (t === \"center\") return { x: 50, y: 50 };\n if (t in POSITION_X_KEYWORDS) {\n return { x: POSITION_X_KEYWORDS[t], y: 50 };\n }\n if (t in POSITION_Y_KEYWORDS) {\n return { x: 50, y: POSITION_Y_KEYWORDS[t] };\n }\n const pct = /^(-?\\d+(?:\\.\\d+)?)%$/.exec(t);\n if (pct) return { x: Number(pct[1]), y: 50 };\n return null;\n }\n // 2 tokens. center は X/Y どちらにも割り当て可能なため一旦保留し、\n // 残りトークン処理後に未確定の軸へ振り分ける (CSS の `<position>` 2-value 構文に従う)。\n let x: number | null = null;\n let y: number | null = null;\n let centerCount = 0;\n for (const raw of tokens) {\n const t = raw.toLowerCase();\n const pct = /^(-?\\d+(?:\\.\\d+)?)%$/.exec(t);\n if (pct) {\n const v = Number(pct[1]);\n if (x === null) x = v;\n else if (y === null) y = v;\n else return null;\n continue;\n }\n if (t === \"left\" || t === \"right\") {\n if (x !== null) return null;\n x = POSITION_X_KEYWORDS[t];\n continue;\n }\n if (t === \"top\" || t === \"bottom\") {\n if (y !== null) return null;\n y = POSITION_Y_KEYWORDS[t];\n continue;\n }\n if (t === \"center\") {\n centerCount++;\n continue;\n }\n return null;\n }\n // center を未確定軸に割り当てる。両方未確定なら 1 つ目 center で X=50、\n // 2 つ目 center で Y=50 になる。\n for (let i = 0; i < centerCount; i++) {\n if (x === null) x = 50;\n else if (y === null) y = 50;\n else return null;\n }\n return { x: x ?? 50, y: y ?? 50 };\n}\n\n/**\n * radial-gradient() 構文をパースする。不正な構文の場合は null を返す。\n *\n * 受け付ける構文:\n * radial-gradient(<color stops>)\n * radial-gradient(<shape>?, <color stops>) // 例: radial-gradient(circle, #FF0000, #0000FF)\n * radial-gradient(<shape>? <size>?, <color stops>) // 例: radial-gradient(circle farthest-side, ...)\n * radial-gradient(<shape>? <size>? at <position>, <color stops>) // 例: radial-gradient(ellipse at top right, ...)\n * radial-gradient(at <position>, <color stops>) // 例: radial-gradient(at 25% 75%, ...)\n */\nexport function parseRadialGradient(value: string): RadialGradient | null {\n const match = /^\\s*radial-gradient\\s*\\(\\s*(.+?)\\s*\\)\\s*$/.exec(value);\n if (!match) return null;\n\n const args = match[1].split(\",\").map((s) => s.trim());\n if (args.length === 0) return null;\n\n let shape: RadialGradientShape = \"ellipse\";\n let size: RadialGradientSize = \"farthest-corner\";\n let centerX = 50;\n let centerY = 50;\n let stopArgs = args;\n\n const first = args[0];\n const firstTokens = first.split(/\\s+/).filter((t) => t.length > 0);\n const firstLowerTokens = firstTokens.map((t) => t.toLowerCase());\n\n // prelude 判定: shape / size / \"at\" のいずれかキーワードが含まれていれば prelude として扱う。\n const hasPreludeKeyword = firstLowerTokens.some(\n (t) => SHAPE_KEYWORDS.has(t) || SIZE_KEYWORDS.has(t) || t === \"at\",\n );\n\n if (hasPreludeKeyword) {\n const atIdx = firstLowerTokens.indexOf(\"at\");\n const shapeSizeTokens =\n atIdx >= 0 ? firstLowerTokens.slice(0, atIdx) : firstLowerTokens;\n const positionTokens = atIdx >= 0 ? firstTokens.slice(atIdx + 1) : [];\n\n let shapeSeen = false;\n let sizeSeen = false;\n for (const token of shapeSizeTokens) {\n if (SHAPE_KEYWORDS.has(token)) {\n if (shapeSeen) return null;\n shape = token as RadialGradientShape;\n shapeSeen = true;\n } else if (SIZE_KEYWORDS.has(token)) {\n if (sizeSeen) return null;\n size = token as RadialGradientSize;\n sizeSeen = true;\n } else {\n return null;\n }\n }\n\n if (atIdx >= 0) {\n if (positionTokens.length === 0) return null;\n const pos = parsePosition(positionTokens);\n if (!pos) return null;\n centerX = pos.x;\n centerY = pos.y;\n }\n\n stopArgs = args.slice(1);\n }\n\n const stops = parseColorStops(stopArgs);\n if (!stops) return null;\n\n return { shape, size, centerX, centerY, stops };\n}\n\n/**\n * linear-gradient / radial-gradient のいずれかを parse する。\n */\nexport function parseGradient(value: string): Gradient | null {\n const linear = parseLinearGradient(value);\n if (linear) return { kind: \"linear\", value: linear };\n const radial = parseRadialGradient(value);\n if (radial) return { kind: \"radial\", value: radial };\n return null;\n}\n"],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -2107,10 +2107,15 @@ declare const timelineNodeSchema: z.ZodObject<{
2107
2107
  title: z.ZodString;
2108
2108
  description: z.ZodOptional<z.ZodString>;
2109
2109
  color: z.ZodOptional<z.ZodString>;
2110
+ dateColor: z.ZodOptional<z.ZodString>;
2110
2111
  }, z.core.$strip>>;
2111
2112
  dateColor: z.ZodOptional<z.ZodString>;
2112
2113
  titleColor: z.ZodOptional<z.ZodString>;
2113
2114
  descriptionColor: z.ZodOptional<z.ZodString>;
2115
+ connectorColor: z.ZodOptional<z.ZodString>;
2116
+ connectorGradient: z.ZodOptional<z.ZodString>;
2117
+ useColorForDate: z.ZodOptional<z.ZodBoolean>;
2118
+ fontFamily: z.ZodOptional<z.ZodString>;
2114
2119
  }, z.core.$strip>;
2115
2120
  type TimelineNode = z.infer<typeof timelineNodeSchema>;
2116
2121
  declare const matrixNodeSchema: z.ZodObject<{
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","names":[],"sources":["../src/types.ts"],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","names":[],"sources":["../src/types.ts"],"mappings":"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"}
package/dist/types.js CHANGED
@@ -1,4 +1,4 @@
1
- import { parseLinearGradient } from "./shared/gradient.js";
1
+ import { parseGradient, parseLinearGradient } from "./shared/gradient.js";
2
2
  import { ICON_DATA } from "./icons/iconData.js";
3
3
  import { z } from "zod";
4
4
  //#region src/types.ts
@@ -300,7 +300,8 @@ const backgroundImageSchema = z.object({
300
300
  src: z.string(),
301
301
  sizing: backgroundImageSizingSchema.optional()
302
302
  });
303
- const backgroundGradientSchema = z.string().refine((value) => parseLinearGradient(value) !== null, { message: "Invalid gradient syntax. Expected: linear-gradient(<angle>deg, <color> <position>%, ...) e.g. \"linear-gradient(135deg, #FF0000 0%, #0000FF 100%)\"" });
303
+ const backgroundGradientSchema = z.string().refine((value) => parseGradient(value) !== null, { message: "Invalid gradient syntax. Expected: linear-gradient(<angle>deg, <color> <position>%, ...) or radial-gradient(<shape>? <size>? at <position>?, <color> <position>%, ...) e.g. \"linear-gradient(135deg, #FF0000 0%, #0000FF 100%)\" or \"radial-gradient(circle at center, #FF0000 0%, #0000FF 100%)\"" });
304
+ const textGradientSchema = z.string().refine((value) => parseLinearGradient(value) !== null, { message: "Invalid textGradient syntax. Expected: linear-gradient(<angle>deg, <color> <position>%, ...). radial-gradient is not supported on textGradient." });
304
305
  const basePOMNodeSchema = z.object({
305
306
  id: z.string().optional(),
306
307
  w: lengthSchema.optional(),
@@ -353,7 +354,7 @@ const textNodeSchema = basePOMNodeSchema.extend({
353
354
  rotate: z.number().optional(),
354
355
  fontSize: z.number().optional(),
355
356
  color: z.string().optional(),
356
- textGradient: backgroundGradientSchema.optional(),
357
+ textGradient: textGradientSchema.optional(),
357
358
  textAlign: z.enum([
358
359
  "left",
359
360
  "center",
@@ -565,7 +566,8 @@ const timelineItemSchema = z.object({
565
566
  date: z.string(),
566
567
  title: z.string(),
567
568
  description: z.string().optional(),
568
- color: z.string().optional()
569
+ color: z.string().optional(),
570
+ dateColor: z.string().optional()
569
571
  });
570
572
  const timelineNodeSchema = basePOMNodeSchema.extend({
571
573
  type: z.literal("timeline"),
@@ -573,7 +575,11 @@ const timelineNodeSchema = basePOMNodeSchema.extend({
573
575
  items: z.array(timelineItemSchema),
574
576
  dateColor: z.string().optional(),
575
577
  titleColor: z.string().optional(),
576
- descriptionColor: z.string().optional()
578
+ descriptionColor: z.string().optional(),
579
+ connectorColor: z.string().optional(),
580
+ connectorGradient: backgroundGradientSchema.optional(),
581
+ useColorForDate: z.boolean().optional(),
582
+ fontFamily: z.string().optional()
577
583
  });
578
584
  const matrixAxisSchema = z.object({
579
585
  x: z.string(),
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","names":[],"sources":["../src/types.ts"],"sourcesContent":["import { z } from \"zod\";\nimport { ICON_DATA } from \"./icons/iconData.ts\";\nimport { parseLinearGradient } from \"./shared/gradient.ts\";\n\n// ===== Basic Types =====\nconst lengthSchema = z.union([\n z.number(),\n z.literal(\"max\"),\n z.string().regex(/^\\d+%$/),\n]);\n\nconst paddingSchema = z.union([\n z.number(),\n z.object({\n top: z.number().optional(),\n right: z.number().optional(),\n bottom: z.number().optional(),\n left: z.number().optional(),\n }),\n]);\n\nconst borderDashSchema = z.enum([\n \"solid\",\n \"dash\",\n \"dashDot\",\n \"lgDash\",\n \"lgDashDot\",\n \"lgDashDotDot\",\n \"sysDash\",\n \"sysDot\",\n]);\n\nconst borderStyleSchema = z.object({\n color: z.string().optional(),\n width: z.number().optional(),\n dashType: borderDashSchema.optional(),\n});\n\nconst fillStyleSchema = z.object({\n color: z.string().optional(),\n transparency: z.number().optional(),\n});\n\nexport const shadowStyleSchema = z.object({\n type: z.enum([\"outer\", \"inner\"]).optional(),\n opacity: z.number().optional(),\n blur: z.number().optional(),\n angle: z.number().optional(),\n offset: z.number().optional(),\n color: z.string().optional(),\n});\n\nconst bulletNumberTypeSchema = z.enum([\n \"alphaLcParenBoth\",\n \"alphaLcParenR\",\n \"alphaLcPeriod\",\n \"alphaUcParenBoth\",\n \"alphaUcParenR\",\n \"alphaUcPeriod\",\n \"arabicParenBoth\",\n \"arabicParenR\",\n \"arabicPeriod\",\n \"arabicPlain\",\n \"romanLcParenBoth\",\n \"romanLcParenR\",\n \"romanLcPeriod\",\n \"romanUcParenBoth\",\n \"romanUcParenR\",\n \"romanUcPeriod\",\n]);\n\nexport const underlineStyleSchema = z.enum([\n \"dash\",\n \"dashHeavy\",\n \"dashLong\",\n \"dashLongHeavy\",\n \"dbl\",\n \"dotDash\",\n \"dotDotDash\",\n \"dotted\",\n \"dottedHeavy\",\n \"heavy\",\n \"none\",\n \"sng\",\n \"wavy\",\n \"wavyDbl\",\n \"wavyHeavy\",\n]);\n\nexport const underlineSchema = z.union([\n z.boolean(),\n z.object({\n style: underlineStyleSchema.optional(),\n color: z.string().optional(),\n }),\n]);\n\nexport const textGlowSchema = z.object({\n size: z.number().nonnegative().optional(),\n opacity: z.number().min(0).max(1).optional(),\n color: z.string().optional(),\n});\n\nexport const textOutlineSchema = z.object({\n size: z.number().nonnegative().optional(),\n color: z.string().optional(),\n});\n\nconst alignItemsSchema = z.enum([\"start\", \"center\", \"end\", \"stretch\"]);\n\nconst alignSelfSchema = z.enum([\"auto\", \"start\", \"center\", \"end\", \"stretch\"]);\n\nconst positionTypeSchema = z.enum([\"relative\", \"absolute\"]);\n\nconst flexWrapSchema = z.enum([\"nowrap\", \"wrap\", \"wrapReverse\"]);\n\nconst justifyContentSchema = z.enum([\n \"start\",\n \"center\",\n \"end\",\n \"spaceBetween\",\n \"spaceAround\",\n \"spaceEvenly\",\n]);\n\nconst shapeTypeSchema = z.enum([\n \"accentBorderCallout1\",\n \"accentBorderCallout2\",\n \"accentBorderCallout3\",\n \"accentCallout1\",\n \"accentCallout2\",\n \"accentCallout3\",\n \"actionButtonBackPrevious\",\n \"actionButtonBeginning\",\n \"actionButtonBlank\",\n \"actionButtonDocument\",\n \"actionButtonEnd\",\n \"actionButtonForwardNext\",\n \"actionButtonHelp\",\n \"actionButtonHome\",\n \"actionButtonInformation\",\n \"actionButtonMovie\",\n \"actionButtonReturn\",\n \"actionButtonSound\",\n \"arc\",\n \"bentArrow\",\n \"bentUpArrow\",\n \"bevel\",\n \"blockArc\",\n \"borderCallout1\",\n \"borderCallout2\",\n \"borderCallout3\",\n \"bracePair\",\n \"bracketPair\",\n \"callout1\",\n \"callout2\",\n \"callout3\",\n \"can\",\n \"chartPlus\",\n \"chartStar\",\n \"chartX\",\n \"chevron\",\n \"chord\",\n \"circularArrow\",\n \"cloud\",\n \"cloudCallout\",\n \"corner\",\n \"cornerTabs\",\n \"cube\",\n \"curvedDownArrow\",\n \"curvedLeftArrow\",\n \"curvedRightArrow\",\n \"curvedUpArrow\",\n \"decagon\",\n \"diagStripe\",\n \"diamond\",\n \"dodecagon\",\n \"donut\",\n \"doubleWave\",\n \"downArrow\",\n \"downArrowCallout\",\n \"ellipse\",\n \"ellipseRibbon\",\n \"ellipseRibbon2\",\n \"flowChartAlternateProcess\",\n \"flowChartCollate\",\n \"flowChartConnector\",\n \"flowChartDecision\",\n \"flowChartDelay\",\n \"flowChartDisplay\",\n \"flowChartDocument\",\n \"flowChartExtract\",\n \"flowChartInputOutput\",\n \"flowChartInternalStorage\",\n \"flowChartMagneticDisk\",\n \"flowChartMagneticDrum\",\n \"flowChartMagneticTape\",\n \"flowChartManualInput\",\n \"flowChartManualOperation\",\n \"flowChartMerge\",\n \"flowChartMultidocument\",\n \"flowChartOfflineStorage\",\n \"flowChartOffpageConnector\",\n \"flowChartOnlineStorage\",\n \"flowChartOr\",\n \"flowChartPredefinedProcess\",\n \"flowChartPreparation\",\n \"flowChartProcess\",\n \"flowChartPunchedCard\",\n \"flowChartPunchedTape\",\n \"flowChartSort\",\n \"flowChartSummingJunction\",\n \"flowChartTerminator\",\n \"folderCorner\",\n \"frame\",\n \"funnel\",\n \"gear6\",\n \"gear9\",\n \"halfFrame\",\n \"heart\",\n \"heptagon\",\n \"hexagon\",\n \"homePlate\",\n \"horizontalScroll\",\n \"irregularSeal1\",\n \"irregularSeal2\",\n \"leftArrow\",\n \"leftArrowCallout\",\n \"leftBrace\",\n \"leftBracket\",\n \"leftCircularArrow\",\n \"leftRightArrow\",\n \"leftRightArrowCallout\",\n \"leftRightCircularArrow\",\n \"leftRightRibbon\",\n \"leftRightUpArrow\",\n \"leftUpArrow\",\n \"lightningBolt\",\n \"line\",\n \"lineInv\",\n \"mathDivide\",\n \"mathEqual\",\n \"mathMinus\",\n \"mathMultiply\",\n \"mathNotEqual\",\n \"mathPlus\",\n \"moon\",\n \"noSmoking\",\n \"nonIsoscelesTrapezoid\",\n \"notchedRightArrow\",\n \"octagon\",\n \"parallelogram\",\n \"pentagon\",\n \"pie\",\n \"pieWedge\",\n \"plaque\",\n \"plaqueTabs\",\n \"plus\",\n \"quadArrow\",\n \"quadArrowCallout\",\n \"rect\",\n \"ribbon\",\n \"ribbon2\",\n \"rightArrow\",\n \"rightArrowCallout\",\n \"rightBrace\",\n \"rightBracket\",\n \"round1Rect\",\n \"round2DiagRect\",\n \"round2SameRect\",\n \"roundRect\",\n \"rtTriangle\",\n \"smileyFace\",\n \"snip1Rect\",\n \"snip2DiagRect\",\n \"snip2SameRect\",\n \"snipRoundRect\",\n \"squareTabs\",\n \"star10\",\n \"star12\",\n \"star16\",\n \"star24\",\n \"star32\",\n \"star4\",\n \"star5\",\n \"star6\",\n \"star7\",\n \"star8\",\n \"stripedRightArrow\",\n \"sun\",\n \"swooshArrow\",\n \"teardrop\",\n \"trapezoid\",\n \"triangle\",\n \"upArrow\",\n \"upArrowCallout\",\n \"upDownArrow\",\n \"upDownArrowCallout\",\n \"uturnArrow\",\n \"verticalScroll\",\n \"wave\",\n \"wedgeEllipseCallout\",\n \"wedgeRectCallout\",\n \"wedgeRoundRectCallout\",\n]);\n\n// ===== TypeScript Types (defined early for recursive references) =====\nexport type ShadowStyle = z.infer<typeof shadowStyleSchema>;\nexport type BorderStyle = z.infer<typeof borderStyleSchema>;\nexport type AlignItems = z.infer<typeof alignItemsSchema>;\nexport type FlexWrap = z.infer<typeof flexWrapSchema>;\nexport type JustifyContent = z.infer<typeof justifyContentSchema>;\nexport type UnderlineStyle = z.infer<typeof underlineStyleSchema>;\nexport type Underline = z.infer<typeof underlineSchema>;\nexport type TextGlow = z.infer<typeof textGlowSchema>;\nexport type TextOutline = z.infer<typeof textOutlineSchema>;\n\n// ===== Background Image =====\nconst backgroundImageSizingSchema = z.enum([\"cover\", \"contain\"]);\n\nconst backgroundImageSchema = z.object({\n src: z.string(),\n sizing: backgroundImageSizingSchema.optional(),\n});\n\n// ===== Background Gradient =====\nconst backgroundGradientSchema = z\n .string()\n .refine((value) => parseLinearGradient(value) !== null, {\n message:\n 'Invalid gradient syntax. Expected: linear-gradient(<angle>deg, <color> <position>%, ...) e.g. \"linear-gradient(135deg, #FF0000 0%, #0000FF 100%)\"',\n });\n\n// ===== Base Node =====\nconst basePOMNodeSchema = z.object({\n id: z.string().optional(),\n w: lengthSchema.optional(),\n h: lengthSchema.optional(),\n grow: z.number().positive().optional(),\n minW: z.number().optional(),\n maxW: z.number().optional(),\n minH: z.number().optional(),\n maxH: z.number().optional(),\n padding: paddingSchema.optional(),\n margin: paddingSchema.optional(),\n backgroundColor: z.string().optional(),\n backgroundGradient: backgroundGradientSchema.optional(),\n backgroundImage: backgroundImageSchema.optional(),\n border: borderStyleSchema.optional(),\n borderTop: borderStyleSchema.optional(),\n borderRight: borderStyleSchema.optional(),\n borderBottom: borderStyleSchema.optional(),\n borderLeft: borderStyleSchema.optional(),\n borderRadius: z.number().optional(),\n opacity: z.number().min(0).max(1).optional(),\n zIndex: z.number().optional(),\n position: positionTypeSchema.optional(),\n top: z.number().optional(),\n right: z.number().optional(),\n bottom: z.number().optional(),\n left: z.number().optional(),\n alignSelf: alignSelfSchema.optional(),\n shadow: shadowStyleSchema.optional(),\n});\n\ntype BasePOMNode = z.infer<typeof basePOMNodeSchema>;\n\n// ===== Inline text run (partial bold/italic within a text node) =====\nconst textRunSchema = z.object({\n text: z.string(),\n bold: z.boolean().optional(),\n italic: z.boolean().optional(),\n underline: z.boolean().optional(),\n strike: z.boolean().optional(),\n subscript: z.boolean().optional(),\n superscript: z.boolean().optional(),\n highlight: z.string().optional(),\n color: z.string().optional(),\n href: z.string().optional(),\n fontFamily: z.string().optional(),\n fontSize: z.number().optional(),\n letterSpacing: z.number().optional(),\n});\n\n// ===== Non-recursive Node Types =====\nexport const textNodeSchema = basePOMNodeSchema.extend({\n type: z.literal(\"text\"),\n text: z.string(),\n runs: z.array(textRunSchema).optional(),\n rotate: z.number().optional(),\n fontSize: z.number().optional(),\n color: z.string().optional(),\n textGradient: backgroundGradientSchema.optional(),\n textAlign: z.enum([\"left\", \"center\", \"right\"]).optional(),\n bold: z.boolean().optional(),\n italic: z.boolean().optional(),\n underline: underlineSchema.optional(),\n strike: z.boolean().optional(),\n subscript: z.boolean().optional(),\n superscript: z.boolean().optional(),\n highlight: z.string().optional(),\n fontFamily: z.string().optional(),\n lineHeight: z.number().optional(),\n letterSpacing: z.number().optional(),\n glow: textGlowSchema.optional(),\n outline: textOutlineSchema.optional(),\n});\n\nexport const liNodeSchema = z.object({\n text: z.string(),\n runs: z.array(textRunSchema).optional(),\n bold: z.boolean().optional(),\n italic: z.boolean().optional(),\n underline: underlineSchema.optional(),\n strike: z.boolean().optional(),\n subscript: z.boolean().optional(),\n superscript: z.boolean().optional(),\n highlight: z.string().optional(),\n color: z.string().optional(),\n fontSize: z.number().optional(),\n fontFamily: z.string().optional(),\n});\n\nexport const ulNodeSchema = basePOMNodeSchema.extend({\n type: z.literal(\"ul\"),\n items: z.array(liNodeSchema),\n fontSize: z.number().optional(),\n color: z.string().optional(),\n textAlign: z.enum([\"left\", \"center\", \"right\"]).optional(),\n bold: z.boolean().optional(),\n italic: z.boolean().optional(),\n underline: underlineSchema.optional(),\n strike: z.boolean().optional(),\n subscript: z.boolean().optional(),\n superscript: z.boolean().optional(),\n highlight: z.string().optional(),\n fontFamily: z.string().optional(),\n lineHeight: z.number().optional(),\n});\n\nexport const olNodeSchema = basePOMNodeSchema.extend({\n type: z.literal(\"ol\"),\n items: z.array(liNodeSchema),\n fontSize: z.number().optional(),\n color: z.string().optional(),\n textAlign: z.enum([\"left\", \"center\", \"right\"]).optional(),\n bold: z.boolean().optional(),\n italic: z.boolean().optional(),\n underline: underlineSchema.optional(),\n strike: z.boolean().optional(),\n subscript: z.boolean().optional(),\n superscript: z.boolean().optional(),\n highlight: z.string().optional(),\n fontFamily: z.string().optional(),\n lineHeight: z.number().optional(),\n numberType: bulletNumberTypeSchema.optional(),\n numberStartAt: z.number().optional(),\n});\n\nconst imageSizingSchema = z.object({\n type: z.enum([\"contain\", \"cover\", \"crop\"]),\n w: z.number().optional(),\n h: z.number().optional(),\n x: z.number().optional(),\n y: z.number().optional(),\n});\n\nexport const imageNodeSchema = basePOMNodeSchema.extend({\n type: z.literal(\"image\"),\n src: z.string(),\n sizing: imageSizingSchema.optional(),\n rotate: z.number().optional(),\n});\n\nconst iconNameSchema = z.enum(Object.keys(ICON_DATA) as [string, ...string[]]);\n\nconst iconColorSchema = z\n .string()\n .regex(/^#?[0-9a-fA-F]{3,8}$/)\n .optional();\n\nconst iconVariantSchema = z\n .enum([\n \"circle-filled\",\n \"circle-outlined\",\n \"square-filled\",\n \"square-outlined\",\n ])\n .optional();\n\nexport const iconNodeSchema = basePOMNodeSchema.extend({\n type: z.literal(\"icon\"),\n name: iconNameSchema,\n size: z.number().positive().max(1024).optional(),\n color: iconColorSchema,\n variant: iconVariantSchema,\n bgColor: iconColorSchema,\n // glow / outline は variant 指定時の背景図形にのみ適用される\n // (PNG ベースのアイコン本体には適用されない)\n glow: textGlowSchema.optional(),\n outline: textOutlineSchema.optional(),\n rotate: z.number().optional(),\n});\n\nexport type IconNode = z.infer<typeof iconNodeSchema>;\n\nexport const svgNodeSchema = basePOMNodeSchema.extend({\n type: z.literal(\"svg\"),\n svgContent: z.string(),\n w: z.number().positive().max(1024).optional(),\n h: z.number().positive().max(1024).optional(),\n color: iconColorSchema,\n});\n\nexport type SvgNode = z.infer<typeof svgNodeSchema>;\n\nconst tableCellSchema = z.object({\n text: z.string(),\n runs: z.array(textRunSchema).optional(),\n fontSize: z.number().optional(),\n color: z.string().optional(),\n bold: z.boolean().optional(),\n italic: z.boolean().optional(),\n underline: underlineSchema.optional(),\n strike: z.boolean().optional(),\n subscript: z.boolean().optional(),\n superscript: z.boolean().optional(),\n highlight: z.string().optional(),\n fontFamily: z.string().optional(),\n textAlign: z.enum([\"left\", \"center\", \"right\"]).optional(),\n backgroundColor: z.string().optional(),\n colspan: z.number().int().min(1).optional(),\n rowspan: z.number().int().min(1).optional(),\n});\n\nconst tableRowSchema = z.object({\n cells: z.array(tableCellSchema),\n height: z.number().optional(),\n});\n\nconst tableColumnSchema = z.object({\n width: z.number().optional(),\n});\n\nexport const tableNodeSchema = basePOMNodeSchema.extend({\n type: z.literal(\"table\"),\n columns: z.array(tableColumnSchema),\n rows: z.array(tableRowSchema),\n defaultRowHeight: z.number().optional(),\n cellBorder: borderStyleSchema.optional(),\n});\n\nexport const shapeNodeSchema = basePOMNodeSchema.extend({\n type: z.literal(\"shape\"),\n shapeType: shapeTypeSchema,\n text: z.string().optional(),\n rotate: z.number().optional(),\n fill: fillStyleSchema.optional(),\n line: borderStyleSchema.optional(),\n glow: textGlowSchema.optional(),\n outline: textOutlineSchema.optional(),\n fontSize: z.number().optional(),\n color: z.string().optional(),\n textAlign: z.enum([\"left\", \"center\", \"right\"]).optional(),\n bold: z.boolean().optional(),\n italic: z.boolean().optional(),\n underline: underlineSchema.optional(),\n strike: z.boolean().optional(),\n subscript: z.boolean().optional(),\n superscript: z.boolean().optional(),\n highlight: z.string().optional(),\n fontFamily: z.string().optional(),\n lineHeight: z.number().optional(),\n});\n\nconst chartTypeSchema = z.enum([\n \"bar\",\n \"line\",\n \"pie\",\n \"area\",\n \"doughnut\",\n \"radar\",\n]);\n\nconst radarStyleSchema = z.enum([\"standard\", \"marker\", \"filled\"]);\n\nconst chartDataSchema = z.object({\n name: z.string().optional(),\n labels: z.array(z.string()),\n values: z.array(z.number()),\n});\n\nexport const chartNodeSchema = basePOMNodeSchema.extend({\n type: z.literal(\"chart\"),\n chartType: chartTypeSchema,\n data: z.array(chartDataSchema),\n showLegend: z.boolean().optional(),\n showTitle: z.boolean().optional(),\n title: z.string().optional(),\n chartColors: z.array(z.string()).optional(),\n // radar専用オプション\n radarStyle: radarStyleSchema.optional(),\n // sparkline モード: true のとき凡例 / 軸 / マージンをすべて非表示にして\n // 小さい寸法 (h=40px 程度) でも視認できる sparkline 風表示にする\n sparkline: z.boolean().optional(),\n});\n\nexport type TextNode = z.infer<typeof textNodeSchema>;\nexport type LiNode = z.infer<typeof liNodeSchema>;\nexport type UlNode = z.infer<typeof ulNodeSchema>;\nexport type OlNode = z.infer<typeof olNodeSchema>;\nexport type ImageNode = z.infer<typeof imageNodeSchema>;\nexport type TableNode = z.infer<typeof tableNodeSchema>;\nexport type ShapeNode = z.infer<typeof shapeNodeSchema>;\nexport type ChartNode = z.infer<typeof chartNodeSchema>;\n\n// ===== Timeline Node =====\nconst timelineDirectionSchema = z.enum([\"horizontal\", \"vertical\"]);\n\nconst timelineItemSchema = z.object({\n date: z.string(),\n title: z.string(),\n description: z.string().optional(),\n color: z.string().optional(),\n});\n\nexport const timelineNodeSchema = basePOMNodeSchema.extend({\n type: z.literal(\"timeline\"),\n direction: timelineDirectionSchema.optional(),\n items: z.array(timelineItemSchema),\n dateColor: z.string().optional(),\n titleColor: z.string().optional(),\n descriptionColor: z.string().optional(),\n});\n\nexport type TimelineNode = z.infer<typeof timelineNodeSchema>;\n\n// ===== Matrix Node =====\nconst matrixAxisSchema = z.object({\n x: z.string(),\n y: z.string(),\n});\n\nconst matrixQuadrantsSchema = z.object({\n topLeft: z.string(),\n topRight: z.string(),\n bottomLeft: z.string(),\n bottomRight: z.string(),\n});\n\nconst matrixItemSchema = z.object({\n label: z.string(),\n x: z.number().min(0).max(1),\n y: z.number().min(0).max(1),\n color: z.string().optional(),\n textColor: z.string().optional(),\n});\n\nexport const matrixNodeSchema = basePOMNodeSchema.extend({\n type: z.literal(\"matrix\"),\n axes: matrixAxisSchema,\n quadrants: matrixQuadrantsSchema.optional(),\n items: z.array(matrixItemSchema),\n axisLabelColor: z.string().optional(),\n quadrantLabelColor: z.string().optional(),\n itemLabelColor: z.string().optional(),\n});\n\nexport type MatrixNode = z.infer<typeof matrixNodeSchema>;\n\n// ===== Tree Node =====\nconst treeLayoutSchema = z.enum([\"vertical\", \"horizontal\"]);\n\nexport const treeNodeShapeSchema = z.enum([\"rect\", \"roundRect\", \"ellipse\"]);\n\nexport const treeConnectorStyleSchema = z.object({\n color: z.string().optional(),\n width: z.number().optional(),\n});\n\nexport type TreeDataItem = {\n label: string;\n color?: string;\n textColor?: string;\n children?: TreeDataItem[];\n};\n\nconst treeDataItemSchema: z.ZodType<TreeDataItem> = z.lazy(() =>\n z.object({\n label: z.string(),\n color: z.string().optional(),\n textColor: z.string().optional(),\n children: z.array(treeDataItemSchema).optional(),\n }),\n);\n\nexport const treeNodeSchema = basePOMNodeSchema.extend({\n type: z.literal(\"tree\"),\n layout: treeLayoutSchema.optional(),\n nodeShape: treeNodeShapeSchema.optional(),\n data: treeDataItemSchema,\n textColor: z.string().optional(),\n connectorStyle: treeConnectorStyleSchema.optional(),\n nodeWidth: z.number().optional(),\n nodeHeight: z.number().optional(),\n levelGap: z.number().optional(),\n siblingGap: z.number().optional(),\n});\n\nexport type TreeNodeShape = z.infer<typeof treeNodeShapeSchema>;\nexport type TreeConnectorStyle = z.infer<typeof treeConnectorStyleSchema>;\nexport type TreeNode = z.infer<typeof treeNodeSchema>;\n\n// ===== ProcessArrow Node =====\nconst processArrowDirectionSchema = z.enum([\"horizontal\", \"vertical\"]);\n\nconst processArrowStepSchema = z.object({\n label: z.string(),\n color: z.string().optional(),\n textColor: z.string().optional(),\n});\n\nexport const processArrowNodeSchema = basePOMNodeSchema.extend({\n type: z.literal(\"processArrow\"),\n direction: processArrowDirectionSchema.optional(),\n steps: z.array(processArrowStepSchema),\n itemWidth: z.number().optional(),\n itemHeight: z.number().optional(),\n gap: z.number().optional(),\n fontSize: z.number().optional(),\n bold: z.boolean().optional(),\n italic: z.boolean().optional(),\n underline: underlineSchema.optional(),\n strike: z.boolean().optional(),\n highlight: z.string().optional(),\n fontFamily: z.string().optional(),\n});\n\nexport type ProcessArrowNode = z.infer<typeof processArrowNodeSchema>;\n\n// ===== Pyramid Node =====\nconst pyramidDirectionSchema = z.enum([\"up\", \"down\"]);\n\nconst pyramidLevelSchema = z.object({\n label: z.string(),\n color: z.string().optional(),\n textColor: z.string().optional(),\n});\n\nexport const pyramidNodeSchema = basePOMNodeSchema.extend({\n type: z.literal(\"pyramid\"),\n direction: pyramidDirectionSchema.optional(),\n levels: z.array(pyramidLevelSchema).min(1),\n fontSize: z.number().optional(),\n bold: z.boolean().optional(),\n fontFamily: z.string().optional(),\n});\n\nexport type PyramidNode = z.infer<typeof pyramidNodeSchema>;\n\n// ===== Flow Node =====\nconst flowDirectionSchema = z.enum([\"horizontal\", \"vertical\"]);\n\nconst flowNodeShapeSchema = z.enum([\n \"flowChartTerminator\",\n \"flowChartProcess\",\n \"flowChartDecision\",\n \"flowChartInputOutput\",\n \"flowChartDocument\",\n \"flowChartPredefinedProcess\",\n \"flowChartConnector\",\n \"flowChartPreparation\",\n \"flowChartManualInput\",\n \"flowChartManualOperation\",\n \"flowChartDelay\",\n \"flowChartMagneticDisk\",\n]);\n\nconst flowNodeItemSchema = z.object({\n id: z.string(),\n shape: flowNodeShapeSchema,\n text: z.string(),\n color: z.string().optional(),\n textColor: z.string().optional(),\n width: z.number().optional(),\n height: z.number().optional(),\n});\n\nconst flowConnectionSchema = z.object({\n from: z.string(),\n to: z.string(),\n label: z.string().optional(),\n color: z.string().optional(),\n labelColor: z.string().optional(),\n});\n\nconst flowConnectorStyleSchema = z.object({\n color: z.string().optional(),\n width: z.number().optional(),\n labelColor: z.string().optional(),\n arrowType: z\n .enum([\"none\", \"arrow\", \"diamond\", \"oval\", \"stealth\", \"triangle\"])\n .optional(),\n});\n\nexport const flowNodeSchema = basePOMNodeSchema.extend({\n type: z.literal(\"flow\"),\n direction: flowDirectionSchema.optional(),\n nodes: z.array(flowNodeItemSchema),\n connections: z.array(flowConnectionSchema),\n connectorStyle: flowConnectorStyleSchema.optional(),\n nodeWidth: z.number().optional(),\n nodeHeight: z.number().optional(),\n nodeGap: z.number().optional(),\n});\n\nexport type FlowNode = z.infer<typeof flowNodeSchema>;\n\n// ===== Line Node =====\nconst lineArrowTypeSchema = z.enum([\n \"none\",\n \"arrow\",\n \"triangle\",\n \"diamond\",\n \"oval\",\n \"stealth\",\n]);\n\nconst lineArrowOptionsSchema = z.object({\n type: lineArrowTypeSchema.optional(),\n});\n\nexport const lineArrowSchema = z.union([z.boolean(), lineArrowOptionsSchema]);\n\nexport const lineNodeSchema = basePOMNodeSchema.extend({\n type: z.literal(\"line\"),\n x1: z.number(),\n y1: z.number(),\n x2: z.number(),\n y2: z.number(),\n color: z.string().optional(),\n lineWidth: z.number().optional(),\n dashType: borderDashSchema.optional(),\n beginArrow: lineArrowSchema.optional(),\n endArrow: lineArrowSchema.optional(),\n});\n\nexport type LineArrow = z.infer<typeof lineArrowSchema>;\nexport type LineNode = z.infer<typeof lineNodeSchema>;\n\n// ===== Arrow Node =====\nexport const arrowNodeSchema = basePOMNodeSchema.extend({\n type: z.literal(\"arrow\"),\n from: z.string(),\n to: z.string(),\n color: z.string().optional(),\n lineWidth: z.number().optional(),\n dashType: borderDashSchema.optional(),\n beginArrow: lineArrowSchema.optional(),\n endArrow: lineArrowSchema.optional(),\n});\n\nexport type ArrowNode = z.infer<typeof arrowNodeSchema>;\n\n// ===== Layer Node =====\n// LayerChild, LayerNode types are defined below after POMNode\n\n// ===== Recursive Types with Explicit Type Definitions =====\n\n// Define the types explicitly to avoid 'any' inference\nexport type VStackNode = BasePOMNode & {\n type: \"vstack\";\n children: POMNode[];\n gap?: number;\n alignItems?: AlignItems;\n justifyContent?: JustifyContent;\n flexWrap?: FlexWrap;\n};\n\nexport type HStackNode = BasePOMNode & {\n type: \"hstack\";\n children: POMNode[];\n gap?: number;\n alignItems?: AlignItems;\n justifyContent?: JustifyContent;\n flexWrap?: FlexWrap;\n};\n\n// Layer の子要素は x, y を必須とする\ntype LayerChild = POMNode & {\n x: number;\n y: number;\n};\n\nexport type LayerNode = BasePOMNode & {\n type: \"layer\";\n children: LayerChild[];\n};\n\nexport type POMNode =\n | TextNode\n | UlNode\n | OlNode\n | ImageNode\n | TableNode\n | VStackNode\n | HStackNode\n | ShapeNode\n | ChartNode\n | TimelineNode\n | MatrixNode\n | TreeNode\n | FlowNode\n | ProcessArrowNode\n | PyramidNode\n | LineNode\n | ArrowNode\n | LayerNode\n | IconNode\n | SvgNode;\n\n// Define schemas using passthrough to maintain type safety\nexport const vStackNodeSchema = basePOMNodeSchema.extend({\n type: z.literal(\"vstack\"),\n children: z.array(z.lazy(() => pomNodeSchema)),\n gap: z.number().optional(),\n alignItems: alignItemsSchema.optional(),\n justifyContent: justifyContentSchema.optional(),\n flexWrap: flexWrapSchema.optional(),\n});\n\nexport const hStackNodeSchema = basePOMNodeSchema.extend({\n type: z.literal(\"hstack\"),\n children: z.array(z.lazy(() => pomNodeSchema)),\n gap: z.number().optional(),\n alignItems: alignItemsSchema.optional(),\n justifyContent: justifyContentSchema.optional(),\n flexWrap: flexWrapSchema.optional(),\n});\n\nconst layerChildSchemaBase = z.lazy(() =>\n pomNodeSchema.and(\n z.object({\n x: z.number(),\n y: z.number(),\n }),\n ),\n);\n\nexport const layerNodeSchema = basePOMNodeSchema.extend({\n type: z.literal(\"layer\"),\n children: z.array(layerChildSchemaBase),\n});\n\nconst pomNodeSchema: z.ZodType<POMNode> = z.lazy(() =>\n z.discriminatedUnion(\"type\", [\n textNodeSchema,\n ulNodeSchema,\n olNodeSchema,\n imageNodeSchema,\n tableNodeSchema,\n vStackNodeSchema,\n hStackNodeSchema,\n shapeNodeSchema,\n chartNodeSchema,\n timelineNodeSchema,\n matrixNodeSchema,\n treeNodeSchema,\n flowNodeSchema,\n processArrowNodeSchema,\n pyramidNodeSchema,\n lineNodeSchema,\n arrowNodeSchema,\n layerNodeSchema,\n iconNodeSchema,\n svgNodeSchema,\n ]),\n);\n\n// ===== Positioned Node Types =====\nconst positionedBaseSchema = z.object({\n x: z.number(),\n y: z.number(),\n w: z.number(),\n h: z.number(),\n});\n\ntype PositionedBase = z.infer<typeof positionedBaseSchema>;\n\n// Layer の子要素(位置情報付き)\nexport type PositionedLayerChild = PositionedNode & {\n x: number;\n y: number;\n};\n\nexport type PositionedNode =\n | (TextNode & PositionedBase)\n | (UlNode & PositionedBase)\n | (OlNode & PositionedBase)\n | (ImageNode & PositionedBase & { imageData?: string })\n | (TableNode & PositionedBase)\n | (VStackNode & PositionedBase & { children: PositionedNode[] })\n | (HStackNode & PositionedBase & { children: PositionedNode[] })\n | (ShapeNode & PositionedBase)\n | (ChartNode & PositionedBase)\n | (TimelineNode & PositionedBase)\n | (MatrixNode & PositionedBase)\n | (TreeNode & PositionedBase)\n | (FlowNode & PositionedBase)\n | (ProcessArrowNode & PositionedBase)\n | (PyramidNode & PositionedBase)\n | (LineNode & PositionedBase)\n | (ArrowNode & PositionedBase)\n | (LayerNode & PositionedBase & { children: PositionedLayerChild[] })\n | (IconNode &\n PositionedBase & {\n iconImageData: string;\n bgX?: number;\n bgY?: number;\n bgW?: number;\n bgH?: number;\n iconX?: number;\n iconY?: number;\n iconW?: number;\n iconH?: number;\n })\n | (SvgNode & PositionedBase & { iconImageData: string });\n\nconst positionedLayerChildSchema: z.ZodType<PositionedLayerChild> = z.lazy(() =>\n positionedNodeSchema.and(\n z.object({\n x: z.number(),\n y: z.number(),\n }),\n ),\n);\n\nconst positionedNodeSchema: z.ZodType<PositionedNode> = z.lazy(() =>\n z.union([\n textNodeSchema.merge(positionedBaseSchema),\n ulNodeSchema.merge(positionedBaseSchema),\n olNodeSchema.merge(positionedBaseSchema),\n imageNodeSchema.merge(positionedBaseSchema).extend({\n imageData: z.string().optional(),\n }),\n tableNodeSchema.merge(positionedBaseSchema),\n vStackNodeSchema.merge(positionedBaseSchema).extend({\n children: z.array(z.lazy(() => positionedNodeSchema)),\n }),\n hStackNodeSchema.merge(positionedBaseSchema).extend({\n children: z.array(z.lazy(() => positionedNodeSchema)),\n }),\n shapeNodeSchema.merge(positionedBaseSchema),\n chartNodeSchema.merge(positionedBaseSchema),\n timelineNodeSchema.merge(positionedBaseSchema),\n matrixNodeSchema.merge(positionedBaseSchema),\n treeNodeSchema.merge(positionedBaseSchema),\n flowNodeSchema.merge(positionedBaseSchema),\n processArrowNodeSchema.merge(positionedBaseSchema),\n pyramidNodeSchema.merge(positionedBaseSchema),\n lineNodeSchema.merge(positionedBaseSchema),\n arrowNodeSchema.merge(positionedBaseSchema),\n layerNodeSchema.merge(positionedBaseSchema).extend({\n children: z.array(positionedLayerChildSchema),\n }),\n iconNodeSchema.merge(positionedBaseSchema).extend({\n iconImageData: z.string(),\n }),\n svgNodeSchema.merge(positionedBaseSchema).extend({\n iconImageData: z.string(),\n }),\n ]),\n);\n\n// ===== Slide Master Options =====\nconst masterTextObjectSchema = z.object({\n type: z.literal(\"text\"),\n text: z.string(),\n x: z.number(),\n y: z.number(),\n w: z.number(),\n h: z.number(),\n fontSize: z.number().optional(),\n fontFamily: z.string().optional(),\n color: z.string().optional(),\n bold: z.boolean().optional(),\n italic: z.boolean().optional(),\n underline: underlineSchema.optional(),\n strike: z.boolean().optional(),\n highlight: z.string().optional(),\n textAlign: z.enum([\"left\", \"center\", \"right\"]).optional(),\n});\n\nconst masterImageObjectSchema = z.object({\n type: z.literal(\"image\"),\n src: z.string(),\n x: z.number(),\n y: z.number(),\n w: z.number(),\n h: z.number(),\n});\n\nconst masterRectObjectSchema = z.object({\n type: z.literal(\"rect\"),\n x: z.number(),\n y: z.number(),\n w: z.number(),\n h: z.number(),\n fill: fillStyleSchema.optional(),\n border: borderStyleSchema.optional(),\n});\n\nconst masterLineObjectSchema = z.object({\n type: z.literal(\"line\"),\n x: z.number(),\n y: z.number(),\n w: z.number(),\n h: z.number(),\n line: borderStyleSchema.optional(),\n});\n\nexport const masterObjectSchema = z.discriminatedUnion(\"type\", [\n masterTextObjectSchema,\n masterImageObjectSchema,\n masterRectObjectSchema,\n masterLineObjectSchema,\n]);\n\nconst slideNumberOptionsSchema = z.object({\n x: z.number(),\n y: z.number(),\n w: z.number().optional(),\n h: z.number().optional(),\n fontSize: z.number().optional(),\n fontFamily: z.string().optional(),\n color: z.string().optional(),\n});\n\nconst slideMasterBackgroundSchema = z.union([\n z.object({ color: z.string() }),\n z.object({ path: z.string() }),\n z.object({ data: z.string() }),\n z.object({ image: z.string() }),\n]);\n\nconst slideMasterMarginSchema = z.union([\n z.number(),\n z.object({\n top: z.number().optional(),\n right: z.number().optional(),\n bottom: z.number().optional(),\n left: z.number().optional(),\n }),\n]);\n\nexport const slideMasterOptionsSchema = z.object({\n title: z.string().optional(),\n background: slideMasterBackgroundSchema.optional(),\n margin: slideMasterMarginSchema.optional(),\n objects: z.array(masterObjectSchema).optional(),\n slideNumber: slideNumberOptionsSchema.optional(),\n});\n\nexport type MasterTextObject = z.infer<typeof masterTextObjectSchema>;\nexport type MasterImageObject = z.infer<typeof masterImageObjectSchema>;\nexport type MasterRectObject = z.infer<typeof masterRectObjectSchema>;\nexport type MasterLineObject = z.infer<typeof masterLineObjectSchema>;\nexport type MasterObject = z.infer<typeof masterObjectSchema>;\nexport type SlideNumberOptions = z.infer<typeof slideNumberOptionsSchema>;\nexport type SlideMasterBackground = z.infer<typeof slideMasterBackgroundSchema>;\nexport type SlideMasterMargin = z.infer<typeof slideMasterMarginSchema>;\nexport type SlideMasterOptions = z.infer<typeof slideMasterOptionsSchema>;\n"],"mappings":"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"}
1
+ {"version":3,"file":"types.js","names":[],"sources":["../src/types.ts"],"sourcesContent":["import { z } from \"zod\";\nimport { ICON_DATA } from \"./icons/iconData.ts\";\nimport { parseGradient, parseLinearGradient } from \"./shared/gradient.ts\";\n\n// ===== Basic Types =====\nconst lengthSchema = z.union([\n z.number(),\n z.literal(\"max\"),\n z.string().regex(/^\\d+%$/),\n]);\n\nconst paddingSchema = z.union([\n z.number(),\n z.object({\n top: z.number().optional(),\n right: z.number().optional(),\n bottom: z.number().optional(),\n left: z.number().optional(),\n }),\n]);\n\nconst borderDashSchema = z.enum([\n \"solid\",\n \"dash\",\n \"dashDot\",\n \"lgDash\",\n \"lgDashDot\",\n \"lgDashDotDot\",\n \"sysDash\",\n \"sysDot\",\n]);\n\nconst borderStyleSchema = z.object({\n color: z.string().optional(),\n width: z.number().optional(),\n dashType: borderDashSchema.optional(),\n});\n\nconst fillStyleSchema = z.object({\n color: z.string().optional(),\n transparency: z.number().optional(),\n});\n\nexport const shadowStyleSchema = z.object({\n type: z.enum([\"outer\", \"inner\"]).optional(),\n opacity: z.number().optional(),\n blur: z.number().optional(),\n angle: z.number().optional(),\n offset: z.number().optional(),\n color: z.string().optional(),\n});\n\nconst bulletNumberTypeSchema = z.enum([\n \"alphaLcParenBoth\",\n \"alphaLcParenR\",\n \"alphaLcPeriod\",\n \"alphaUcParenBoth\",\n \"alphaUcParenR\",\n \"alphaUcPeriod\",\n \"arabicParenBoth\",\n \"arabicParenR\",\n \"arabicPeriod\",\n \"arabicPlain\",\n \"romanLcParenBoth\",\n \"romanLcParenR\",\n \"romanLcPeriod\",\n \"romanUcParenBoth\",\n \"romanUcParenR\",\n \"romanUcPeriod\",\n]);\n\nexport const underlineStyleSchema = z.enum([\n \"dash\",\n \"dashHeavy\",\n \"dashLong\",\n \"dashLongHeavy\",\n \"dbl\",\n \"dotDash\",\n \"dotDotDash\",\n \"dotted\",\n \"dottedHeavy\",\n \"heavy\",\n \"none\",\n \"sng\",\n \"wavy\",\n \"wavyDbl\",\n \"wavyHeavy\",\n]);\n\nexport const underlineSchema = z.union([\n z.boolean(),\n z.object({\n style: underlineStyleSchema.optional(),\n color: z.string().optional(),\n }),\n]);\n\nexport const textGlowSchema = z.object({\n size: z.number().nonnegative().optional(),\n opacity: z.number().min(0).max(1).optional(),\n color: z.string().optional(),\n});\n\nexport const textOutlineSchema = z.object({\n size: z.number().nonnegative().optional(),\n color: z.string().optional(),\n});\n\nconst alignItemsSchema = z.enum([\"start\", \"center\", \"end\", \"stretch\"]);\n\nconst alignSelfSchema = z.enum([\"auto\", \"start\", \"center\", \"end\", \"stretch\"]);\n\nconst positionTypeSchema = z.enum([\"relative\", \"absolute\"]);\n\nconst flexWrapSchema = z.enum([\"nowrap\", \"wrap\", \"wrapReverse\"]);\n\nconst justifyContentSchema = z.enum([\n \"start\",\n \"center\",\n \"end\",\n \"spaceBetween\",\n \"spaceAround\",\n \"spaceEvenly\",\n]);\n\nconst shapeTypeSchema = z.enum([\n \"accentBorderCallout1\",\n \"accentBorderCallout2\",\n \"accentBorderCallout3\",\n \"accentCallout1\",\n \"accentCallout2\",\n \"accentCallout3\",\n \"actionButtonBackPrevious\",\n \"actionButtonBeginning\",\n \"actionButtonBlank\",\n \"actionButtonDocument\",\n \"actionButtonEnd\",\n \"actionButtonForwardNext\",\n \"actionButtonHelp\",\n \"actionButtonHome\",\n \"actionButtonInformation\",\n \"actionButtonMovie\",\n \"actionButtonReturn\",\n \"actionButtonSound\",\n \"arc\",\n \"bentArrow\",\n \"bentUpArrow\",\n \"bevel\",\n \"blockArc\",\n \"borderCallout1\",\n \"borderCallout2\",\n \"borderCallout3\",\n \"bracePair\",\n \"bracketPair\",\n \"callout1\",\n \"callout2\",\n \"callout3\",\n \"can\",\n \"chartPlus\",\n \"chartStar\",\n \"chartX\",\n \"chevron\",\n \"chord\",\n \"circularArrow\",\n \"cloud\",\n \"cloudCallout\",\n \"corner\",\n \"cornerTabs\",\n \"cube\",\n \"curvedDownArrow\",\n \"curvedLeftArrow\",\n \"curvedRightArrow\",\n \"curvedUpArrow\",\n \"decagon\",\n \"diagStripe\",\n \"diamond\",\n \"dodecagon\",\n \"donut\",\n \"doubleWave\",\n \"downArrow\",\n \"downArrowCallout\",\n \"ellipse\",\n \"ellipseRibbon\",\n \"ellipseRibbon2\",\n \"flowChartAlternateProcess\",\n \"flowChartCollate\",\n \"flowChartConnector\",\n \"flowChartDecision\",\n \"flowChartDelay\",\n \"flowChartDisplay\",\n \"flowChartDocument\",\n \"flowChartExtract\",\n \"flowChartInputOutput\",\n \"flowChartInternalStorage\",\n \"flowChartMagneticDisk\",\n \"flowChartMagneticDrum\",\n \"flowChartMagneticTape\",\n \"flowChartManualInput\",\n \"flowChartManualOperation\",\n \"flowChartMerge\",\n \"flowChartMultidocument\",\n \"flowChartOfflineStorage\",\n \"flowChartOffpageConnector\",\n \"flowChartOnlineStorage\",\n \"flowChartOr\",\n \"flowChartPredefinedProcess\",\n \"flowChartPreparation\",\n \"flowChartProcess\",\n \"flowChartPunchedCard\",\n \"flowChartPunchedTape\",\n \"flowChartSort\",\n \"flowChartSummingJunction\",\n \"flowChartTerminator\",\n \"folderCorner\",\n \"frame\",\n \"funnel\",\n \"gear6\",\n \"gear9\",\n \"halfFrame\",\n \"heart\",\n \"heptagon\",\n \"hexagon\",\n \"homePlate\",\n \"horizontalScroll\",\n \"irregularSeal1\",\n \"irregularSeal2\",\n \"leftArrow\",\n \"leftArrowCallout\",\n \"leftBrace\",\n \"leftBracket\",\n \"leftCircularArrow\",\n \"leftRightArrow\",\n \"leftRightArrowCallout\",\n \"leftRightCircularArrow\",\n \"leftRightRibbon\",\n \"leftRightUpArrow\",\n \"leftUpArrow\",\n \"lightningBolt\",\n \"line\",\n \"lineInv\",\n \"mathDivide\",\n \"mathEqual\",\n \"mathMinus\",\n \"mathMultiply\",\n \"mathNotEqual\",\n \"mathPlus\",\n \"moon\",\n \"noSmoking\",\n \"nonIsoscelesTrapezoid\",\n \"notchedRightArrow\",\n \"octagon\",\n \"parallelogram\",\n \"pentagon\",\n \"pie\",\n \"pieWedge\",\n \"plaque\",\n \"plaqueTabs\",\n \"plus\",\n \"quadArrow\",\n \"quadArrowCallout\",\n \"rect\",\n \"ribbon\",\n \"ribbon2\",\n \"rightArrow\",\n \"rightArrowCallout\",\n \"rightBrace\",\n \"rightBracket\",\n \"round1Rect\",\n \"round2DiagRect\",\n \"round2SameRect\",\n \"roundRect\",\n \"rtTriangle\",\n \"smileyFace\",\n \"snip1Rect\",\n \"snip2DiagRect\",\n \"snip2SameRect\",\n \"snipRoundRect\",\n \"squareTabs\",\n \"star10\",\n \"star12\",\n \"star16\",\n \"star24\",\n \"star32\",\n \"star4\",\n \"star5\",\n \"star6\",\n \"star7\",\n \"star8\",\n \"stripedRightArrow\",\n \"sun\",\n \"swooshArrow\",\n \"teardrop\",\n \"trapezoid\",\n \"triangle\",\n \"upArrow\",\n \"upArrowCallout\",\n \"upDownArrow\",\n \"upDownArrowCallout\",\n \"uturnArrow\",\n \"verticalScroll\",\n \"wave\",\n \"wedgeEllipseCallout\",\n \"wedgeRectCallout\",\n \"wedgeRoundRectCallout\",\n]);\n\n// ===== TypeScript Types (defined early for recursive references) =====\nexport type ShadowStyle = z.infer<typeof shadowStyleSchema>;\nexport type BorderStyle = z.infer<typeof borderStyleSchema>;\nexport type AlignItems = z.infer<typeof alignItemsSchema>;\nexport type FlexWrap = z.infer<typeof flexWrapSchema>;\nexport type JustifyContent = z.infer<typeof justifyContentSchema>;\nexport type UnderlineStyle = z.infer<typeof underlineStyleSchema>;\nexport type Underline = z.infer<typeof underlineSchema>;\nexport type TextGlow = z.infer<typeof textGlowSchema>;\nexport type TextOutline = z.infer<typeof textOutlineSchema>;\n\n// ===== Background Image =====\nconst backgroundImageSizingSchema = z.enum([\"cover\", \"contain\"]);\n\nconst backgroundImageSchema = z.object({\n src: z.string(),\n sizing: backgroundImageSizingSchema.optional(),\n});\n\n// ===== Background Gradient =====\nconst backgroundGradientSchema = z\n .string()\n .refine((value) => parseGradient(value) !== null, {\n message:\n 'Invalid gradient syntax. Expected: linear-gradient(<angle>deg, <color> <position>%, ...) or radial-gradient(<shape>? <size>? at <position>?, <color> <position>%, ...) e.g. \"linear-gradient(135deg, #FF0000 0%, #0000FF 100%)\" or \"radial-gradient(circle at center, #FF0000 0%, #0000FF 100%)\"',\n });\n\n// textGradient は radial-gradient を受け付けない (linear-gradient のみ)\nconst textGradientSchema = z\n .string()\n .refine((value) => parseLinearGradient(value) !== null, {\n message:\n \"Invalid textGradient syntax. Expected: linear-gradient(<angle>deg, <color> <position>%, ...). radial-gradient is not supported on textGradient.\",\n });\n\n// ===== Base Node =====\nconst basePOMNodeSchema = z.object({\n id: z.string().optional(),\n w: lengthSchema.optional(),\n h: lengthSchema.optional(),\n grow: z.number().positive().optional(),\n minW: z.number().optional(),\n maxW: z.number().optional(),\n minH: z.number().optional(),\n maxH: z.number().optional(),\n padding: paddingSchema.optional(),\n margin: paddingSchema.optional(),\n backgroundColor: z.string().optional(),\n backgroundGradient: backgroundGradientSchema.optional(),\n backgroundImage: backgroundImageSchema.optional(),\n border: borderStyleSchema.optional(),\n borderTop: borderStyleSchema.optional(),\n borderRight: borderStyleSchema.optional(),\n borderBottom: borderStyleSchema.optional(),\n borderLeft: borderStyleSchema.optional(),\n borderRadius: z.number().optional(),\n opacity: z.number().min(0).max(1).optional(),\n zIndex: z.number().optional(),\n position: positionTypeSchema.optional(),\n top: z.number().optional(),\n right: z.number().optional(),\n bottom: z.number().optional(),\n left: z.number().optional(),\n alignSelf: alignSelfSchema.optional(),\n shadow: shadowStyleSchema.optional(),\n});\n\ntype BasePOMNode = z.infer<typeof basePOMNodeSchema>;\n\n// ===== Inline text run (partial bold/italic within a text node) =====\nconst textRunSchema = z.object({\n text: z.string(),\n bold: z.boolean().optional(),\n italic: z.boolean().optional(),\n underline: z.boolean().optional(),\n strike: z.boolean().optional(),\n subscript: z.boolean().optional(),\n superscript: z.boolean().optional(),\n highlight: z.string().optional(),\n color: z.string().optional(),\n href: z.string().optional(),\n fontFamily: z.string().optional(),\n fontSize: z.number().optional(),\n letterSpacing: z.number().optional(),\n});\n\n// ===== Non-recursive Node Types =====\nexport const textNodeSchema = basePOMNodeSchema.extend({\n type: z.literal(\"text\"),\n text: z.string(),\n runs: z.array(textRunSchema).optional(),\n rotate: z.number().optional(),\n fontSize: z.number().optional(),\n color: z.string().optional(),\n textGradient: textGradientSchema.optional(),\n textAlign: z.enum([\"left\", \"center\", \"right\"]).optional(),\n bold: z.boolean().optional(),\n italic: z.boolean().optional(),\n underline: underlineSchema.optional(),\n strike: z.boolean().optional(),\n subscript: z.boolean().optional(),\n superscript: z.boolean().optional(),\n highlight: z.string().optional(),\n fontFamily: z.string().optional(),\n lineHeight: z.number().optional(),\n letterSpacing: z.number().optional(),\n glow: textGlowSchema.optional(),\n outline: textOutlineSchema.optional(),\n});\n\nexport const liNodeSchema = z.object({\n text: z.string(),\n runs: z.array(textRunSchema).optional(),\n bold: z.boolean().optional(),\n italic: z.boolean().optional(),\n underline: underlineSchema.optional(),\n strike: z.boolean().optional(),\n subscript: z.boolean().optional(),\n superscript: z.boolean().optional(),\n highlight: z.string().optional(),\n color: z.string().optional(),\n fontSize: z.number().optional(),\n fontFamily: z.string().optional(),\n});\n\nexport const ulNodeSchema = basePOMNodeSchema.extend({\n type: z.literal(\"ul\"),\n items: z.array(liNodeSchema),\n fontSize: z.number().optional(),\n color: z.string().optional(),\n textAlign: z.enum([\"left\", \"center\", \"right\"]).optional(),\n bold: z.boolean().optional(),\n italic: z.boolean().optional(),\n underline: underlineSchema.optional(),\n strike: z.boolean().optional(),\n subscript: z.boolean().optional(),\n superscript: z.boolean().optional(),\n highlight: z.string().optional(),\n fontFamily: z.string().optional(),\n lineHeight: z.number().optional(),\n});\n\nexport const olNodeSchema = basePOMNodeSchema.extend({\n type: z.literal(\"ol\"),\n items: z.array(liNodeSchema),\n fontSize: z.number().optional(),\n color: z.string().optional(),\n textAlign: z.enum([\"left\", \"center\", \"right\"]).optional(),\n bold: z.boolean().optional(),\n italic: z.boolean().optional(),\n underline: underlineSchema.optional(),\n strike: z.boolean().optional(),\n subscript: z.boolean().optional(),\n superscript: z.boolean().optional(),\n highlight: z.string().optional(),\n fontFamily: z.string().optional(),\n lineHeight: z.number().optional(),\n numberType: bulletNumberTypeSchema.optional(),\n numberStartAt: z.number().optional(),\n});\n\nconst imageSizingSchema = z.object({\n type: z.enum([\"contain\", \"cover\", \"crop\"]),\n w: z.number().optional(),\n h: z.number().optional(),\n x: z.number().optional(),\n y: z.number().optional(),\n});\n\nexport const imageNodeSchema = basePOMNodeSchema.extend({\n type: z.literal(\"image\"),\n src: z.string(),\n sizing: imageSizingSchema.optional(),\n rotate: z.number().optional(),\n});\n\nconst iconNameSchema = z.enum(Object.keys(ICON_DATA) as [string, ...string[]]);\n\nconst iconColorSchema = z\n .string()\n .regex(/^#?[0-9a-fA-F]{3,8}$/)\n .optional();\n\nconst iconVariantSchema = z\n .enum([\n \"circle-filled\",\n \"circle-outlined\",\n \"square-filled\",\n \"square-outlined\",\n ])\n .optional();\n\nexport const iconNodeSchema = basePOMNodeSchema.extend({\n type: z.literal(\"icon\"),\n name: iconNameSchema,\n size: z.number().positive().max(1024).optional(),\n color: iconColorSchema,\n variant: iconVariantSchema,\n bgColor: iconColorSchema,\n // glow / outline は variant 指定時の背景図形にのみ適用される\n // (PNG ベースのアイコン本体には適用されない)\n glow: textGlowSchema.optional(),\n outline: textOutlineSchema.optional(),\n rotate: z.number().optional(),\n});\n\nexport type IconNode = z.infer<typeof iconNodeSchema>;\n\nexport const svgNodeSchema = basePOMNodeSchema.extend({\n type: z.literal(\"svg\"),\n svgContent: z.string(),\n w: z.number().positive().max(1024).optional(),\n h: z.number().positive().max(1024).optional(),\n color: iconColorSchema,\n});\n\nexport type SvgNode = z.infer<typeof svgNodeSchema>;\n\nconst tableCellSchema = z.object({\n text: z.string(),\n runs: z.array(textRunSchema).optional(),\n fontSize: z.number().optional(),\n color: z.string().optional(),\n bold: z.boolean().optional(),\n italic: z.boolean().optional(),\n underline: underlineSchema.optional(),\n strike: z.boolean().optional(),\n subscript: z.boolean().optional(),\n superscript: z.boolean().optional(),\n highlight: z.string().optional(),\n fontFamily: z.string().optional(),\n textAlign: z.enum([\"left\", \"center\", \"right\"]).optional(),\n backgroundColor: z.string().optional(),\n colspan: z.number().int().min(1).optional(),\n rowspan: z.number().int().min(1).optional(),\n});\n\nconst tableRowSchema = z.object({\n cells: z.array(tableCellSchema),\n height: z.number().optional(),\n});\n\nconst tableColumnSchema = z.object({\n width: z.number().optional(),\n});\n\nexport const tableNodeSchema = basePOMNodeSchema.extend({\n type: z.literal(\"table\"),\n columns: z.array(tableColumnSchema),\n rows: z.array(tableRowSchema),\n defaultRowHeight: z.number().optional(),\n cellBorder: borderStyleSchema.optional(),\n});\n\nexport const shapeNodeSchema = basePOMNodeSchema.extend({\n type: z.literal(\"shape\"),\n shapeType: shapeTypeSchema,\n text: z.string().optional(),\n rotate: z.number().optional(),\n fill: fillStyleSchema.optional(),\n line: borderStyleSchema.optional(),\n glow: textGlowSchema.optional(),\n outline: textOutlineSchema.optional(),\n fontSize: z.number().optional(),\n color: z.string().optional(),\n textAlign: z.enum([\"left\", \"center\", \"right\"]).optional(),\n bold: z.boolean().optional(),\n italic: z.boolean().optional(),\n underline: underlineSchema.optional(),\n strike: z.boolean().optional(),\n subscript: z.boolean().optional(),\n superscript: z.boolean().optional(),\n highlight: z.string().optional(),\n fontFamily: z.string().optional(),\n lineHeight: z.number().optional(),\n});\n\nconst chartTypeSchema = z.enum([\n \"bar\",\n \"line\",\n \"pie\",\n \"area\",\n \"doughnut\",\n \"radar\",\n]);\n\nconst radarStyleSchema = z.enum([\"standard\", \"marker\", \"filled\"]);\n\nconst chartDataSchema = z.object({\n name: z.string().optional(),\n labels: z.array(z.string()),\n values: z.array(z.number()),\n});\n\nexport const chartNodeSchema = basePOMNodeSchema.extend({\n type: z.literal(\"chart\"),\n chartType: chartTypeSchema,\n data: z.array(chartDataSchema),\n showLegend: z.boolean().optional(),\n showTitle: z.boolean().optional(),\n title: z.string().optional(),\n chartColors: z.array(z.string()).optional(),\n // radar専用オプション\n radarStyle: radarStyleSchema.optional(),\n // sparkline モード: true のとき凡例 / 軸 / マージンをすべて非表示にして\n // 小さい寸法 (h=40px 程度) でも視認できる sparkline 風表示にする\n sparkline: z.boolean().optional(),\n});\n\nexport type TextNode = z.infer<typeof textNodeSchema>;\nexport type LiNode = z.infer<typeof liNodeSchema>;\nexport type UlNode = z.infer<typeof ulNodeSchema>;\nexport type OlNode = z.infer<typeof olNodeSchema>;\nexport type ImageNode = z.infer<typeof imageNodeSchema>;\nexport type TableNode = z.infer<typeof tableNodeSchema>;\nexport type ShapeNode = z.infer<typeof shapeNodeSchema>;\nexport type ChartNode = z.infer<typeof chartNodeSchema>;\n\n// ===== Timeline Node =====\nconst timelineDirectionSchema = z.enum([\"horizontal\", \"vertical\"]);\n\nconst timelineItemSchema = z.object({\n date: z.string(),\n title: z.string(),\n description: z.string().optional(),\n color: z.string().optional(),\n dateColor: z.string().optional(),\n});\n\nexport const timelineNodeSchema = basePOMNodeSchema.extend({\n type: z.literal(\"timeline\"),\n direction: timelineDirectionSchema.optional(),\n items: z.array(timelineItemSchema),\n dateColor: z.string().optional(),\n titleColor: z.string().optional(),\n descriptionColor: z.string().optional(),\n connectorColor: z.string().optional(),\n connectorGradient: backgroundGradientSchema.optional(),\n useColorForDate: z.boolean().optional(),\n fontFamily: z.string().optional(),\n});\n\nexport type TimelineNode = z.infer<typeof timelineNodeSchema>;\n\n// ===== Matrix Node =====\nconst matrixAxisSchema = z.object({\n x: z.string(),\n y: z.string(),\n});\n\nconst matrixQuadrantsSchema = z.object({\n topLeft: z.string(),\n topRight: z.string(),\n bottomLeft: z.string(),\n bottomRight: z.string(),\n});\n\nconst matrixItemSchema = z.object({\n label: z.string(),\n x: z.number().min(0).max(1),\n y: z.number().min(0).max(1),\n color: z.string().optional(),\n textColor: z.string().optional(),\n});\n\nexport const matrixNodeSchema = basePOMNodeSchema.extend({\n type: z.literal(\"matrix\"),\n axes: matrixAxisSchema,\n quadrants: matrixQuadrantsSchema.optional(),\n items: z.array(matrixItemSchema),\n axisLabelColor: z.string().optional(),\n quadrantLabelColor: z.string().optional(),\n itemLabelColor: z.string().optional(),\n});\n\nexport type MatrixNode = z.infer<typeof matrixNodeSchema>;\n\n// ===== Tree Node =====\nconst treeLayoutSchema = z.enum([\"vertical\", \"horizontal\"]);\n\nexport const treeNodeShapeSchema = z.enum([\"rect\", \"roundRect\", \"ellipse\"]);\n\nexport const treeConnectorStyleSchema = z.object({\n color: z.string().optional(),\n width: z.number().optional(),\n});\n\nexport type TreeDataItem = {\n label: string;\n color?: string;\n textColor?: string;\n children?: TreeDataItem[];\n};\n\nconst treeDataItemSchema: z.ZodType<TreeDataItem> = z.lazy(() =>\n z.object({\n label: z.string(),\n color: z.string().optional(),\n textColor: z.string().optional(),\n children: z.array(treeDataItemSchema).optional(),\n }),\n);\n\nexport const treeNodeSchema = basePOMNodeSchema.extend({\n type: z.literal(\"tree\"),\n layout: treeLayoutSchema.optional(),\n nodeShape: treeNodeShapeSchema.optional(),\n data: treeDataItemSchema,\n textColor: z.string().optional(),\n connectorStyle: treeConnectorStyleSchema.optional(),\n nodeWidth: z.number().optional(),\n nodeHeight: z.number().optional(),\n levelGap: z.number().optional(),\n siblingGap: z.number().optional(),\n});\n\nexport type TreeNodeShape = z.infer<typeof treeNodeShapeSchema>;\nexport type TreeConnectorStyle = z.infer<typeof treeConnectorStyleSchema>;\nexport type TreeNode = z.infer<typeof treeNodeSchema>;\n\n// ===== ProcessArrow Node =====\nconst processArrowDirectionSchema = z.enum([\"horizontal\", \"vertical\"]);\n\nconst processArrowStepSchema = z.object({\n label: z.string(),\n color: z.string().optional(),\n textColor: z.string().optional(),\n});\n\nexport const processArrowNodeSchema = basePOMNodeSchema.extend({\n type: z.literal(\"processArrow\"),\n direction: processArrowDirectionSchema.optional(),\n steps: z.array(processArrowStepSchema),\n itemWidth: z.number().optional(),\n itemHeight: z.number().optional(),\n gap: z.number().optional(),\n fontSize: z.number().optional(),\n bold: z.boolean().optional(),\n italic: z.boolean().optional(),\n underline: underlineSchema.optional(),\n strike: z.boolean().optional(),\n highlight: z.string().optional(),\n fontFamily: z.string().optional(),\n});\n\nexport type ProcessArrowNode = z.infer<typeof processArrowNodeSchema>;\n\n// ===== Pyramid Node =====\nconst pyramidDirectionSchema = z.enum([\"up\", \"down\"]);\n\nconst pyramidLevelSchema = z.object({\n label: z.string(),\n color: z.string().optional(),\n textColor: z.string().optional(),\n});\n\nexport const pyramidNodeSchema = basePOMNodeSchema.extend({\n type: z.literal(\"pyramid\"),\n direction: pyramidDirectionSchema.optional(),\n levels: z.array(pyramidLevelSchema).min(1),\n fontSize: z.number().optional(),\n bold: z.boolean().optional(),\n fontFamily: z.string().optional(),\n});\n\nexport type PyramidNode = z.infer<typeof pyramidNodeSchema>;\n\n// ===== Flow Node =====\nconst flowDirectionSchema = z.enum([\"horizontal\", \"vertical\"]);\n\nconst flowNodeShapeSchema = z.enum([\n \"flowChartTerminator\",\n \"flowChartProcess\",\n \"flowChartDecision\",\n \"flowChartInputOutput\",\n \"flowChartDocument\",\n \"flowChartPredefinedProcess\",\n \"flowChartConnector\",\n \"flowChartPreparation\",\n \"flowChartManualInput\",\n \"flowChartManualOperation\",\n \"flowChartDelay\",\n \"flowChartMagneticDisk\",\n]);\n\nconst flowNodeItemSchema = z.object({\n id: z.string(),\n shape: flowNodeShapeSchema,\n text: z.string(),\n color: z.string().optional(),\n textColor: z.string().optional(),\n width: z.number().optional(),\n height: z.number().optional(),\n});\n\nconst flowConnectionSchema = z.object({\n from: z.string(),\n to: z.string(),\n label: z.string().optional(),\n color: z.string().optional(),\n labelColor: z.string().optional(),\n});\n\nconst flowConnectorStyleSchema = z.object({\n color: z.string().optional(),\n width: z.number().optional(),\n labelColor: z.string().optional(),\n arrowType: z\n .enum([\"none\", \"arrow\", \"diamond\", \"oval\", \"stealth\", \"triangle\"])\n .optional(),\n});\n\nexport const flowNodeSchema = basePOMNodeSchema.extend({\n type: z.literal(\"flow\"),\n direction: flowDirectionSchema.optional(),\n nodes: z.array(flowNodeItemSchema),\n connections: z.array(flowConnectionSchema),\n connectorStyle: flowConnectorStyleSchema.optional(),\n nodeWidth: z.number().optional(),\n nodeHeight: z.number().optional(),\n nodeGap: z.number().optional(),\n});\n\nexport type FlowNode = z.infer<typeof flowNodeSchema>;\n\n// ===== Line Node =====\nconst lineArrowTypeSchema = z.enum([\n \"none\",\n \"arrow\",\n \"triangle\",\n \"diamond\",\n \"oval\",\n \"stealth\",\n]);\n\nconst lineArrowOptionsSchema = z.object({\n type: lineArrowTypeSchema.optional(),\n});\n\nexport const lineArrowSchema = z.union([z.boolean(), lineArrowOptionsSchema]);\n\nexport const lineNodeSchema = basePOMNodeSchema.extend({\n type: z.literal(\"line\"),\n x1: z.number(),\n y1: z.number(),\n x2: z.number(),\n y2: z.number(),\n color: z.string().optional(),\n lineWidth: z.number().optional(),\n dashType: borderDashSchema.optional(),\n beginArrow: lineArrowSchema.optional(),\n endArrow: lineArrowSchema.optional(),\n});\n\nexport type LineArrow = z.infer<typeof lineArrowSchema>;\nexport type LineNode = z.infer<typeof lineNodeSchema>;\n\n// ===== Arrow Node =====\nexport const arrowNodeSchema = basePOMNodeSchema.extend({\n type: z.literal(\"arrow\"),\n from: z.string(),\n to: z.string(),\n color: z.string().optional(),\n lineWidth: z.number().optional(),\n dashType: borderDashSchema.optional(),\n beginArrow: lineArrowSchema.optional(),\n endArrow: lineArrowSchema.optional(),\n});\n\nexport type ArrowNode = z.infer<typeof arrowNodeSchema>;\n\n// ===== Layer Node =====\n// LayerChild, LayerNode types are defined below after POMNode\n\n// ===== Recursive Types with Explicit Type Definitions =====\n\n// Define the types explicitly to avoid 'any' inference\nexport type VStackNode = BasePOMNode & {\n type: \"vstack\";\n children: POMNode[];\n gap?: number;\n alignItems?: AlignItems;\n justifyContent?: JustifyContent;\n flexWrap?: FlexWrap;\n};\n\nexport type HStackNode = BasePOMNode & {\n type: \"hstack\";\n children: POMNode[];\n gap?: number;\n alignItems?: AlignItems;\n justifyContent?: JustifyContent;\n flexWrap?: FlexWrap;\n};\n\n// Layer の子要素は x, y を必須とする\ntype LayerChild = POMNode & {\n x: number;\n y: number;\n};\n\nexport type LayerNode = BasePOMNode & {\n type: \"layer\";\n children: LayerChild[];\n};\n\nexport type POMNode =\n | TextNode\n | UlNode\n | OlNode\n | ImageNode\n | TableNode\n | VStackNode\n | HStackNode\n | ShapeNode\n | ChartNode\n | TimelineNode\n | MatrixNode\n | TreeNode\n | FlowNode\n | ProcessArrowNode\n | PyramidNode\n | LineNode\n | ArrowNode\n | LayerNode\n | IconNode\n | SvgNode;\n\n// Define schemas using passthrough to maintain type safety\nexport const vStackNodeSchema = basePOMNodeSchema.extend({\n type: z.literal(\"vstack\"),\n children: z.array(z.lazy(() => pomNodeSchema)),\n gap: z.number().optional(),\n alignItems: alignItemsSchema.optional(),\n justifyContent: justifyContentSchema.optional(),\n flexWrap: flexWrapSchema.optional(),\n});\n\nexport const hStackNodeSchema = basePOMNodeSchema.extend({\n type: z.literal(\"hstack\"),\n children: z.array(z.lazy(() => pomNodeSchema)),\n gap: z.number().optional(),\n alignItems: alignItemsSchema.optional(),\n justifyContent: justifyContentSchema.optional(),\n flexWrap: flexWrapSchema.optional(),\n});\n\nconst layerChildSchemaBase = z.lazy(() =>\n pomNodeSchema.and(\n z.object({\n x: z.number(),\n y: z.number(),\n }),\n ),\n);\n\nexport const layerNodeSchema = basePOMNodeSchema.extend({\n type: z.literal(\"layer\"),\n children: z.array(layerChildSchemaBase),\n});\n\nconst pomNodeSchema: z.ZodType<POMNode> = z.lazy(() =>\n z.discriminatedUnion(\"type\", [\n textNodeSchema,\n ulNodeSchema,\n olNodeSchema,\n imageNodeSchema,\n tableNodeSchema,\n vStackNodeSchema,\n hStackNodeSchema,\n shapeNodeSchema,\n chartNodeSchema,\n timelineNodeSchema,\n matrixNodeSchema,\n treeNodeSchema,\n flowNodeSchema,\n processArrowNodeSchema,\n pyramidNodeSchema,\n lineNodeSchema,\n arrowNodeSchema,\n layerNodeSchema,\n iconNodeSchema,\n svgNodeSchema,\n ]),\n);\n\n// ===== Positioned Node Types =====\nconst positionedBaseSchema = z.object({\n x: z.number(),\n y: z.number(),\n w: z.number(),\n h: z.number(),\n});\n\ntype PositionedBase = z.infer<typeof positionedBaseSchema>;\n\n// Layer の子要素(位置情報付き)\nexport type PositionedLayerChild = PositionedNode & {\n x: number;\n y: number;\n};\n\nexport type PositionedNode =\n | (TextNode & PositionedBase)\n | (UlNode & PositionedBase)\n | (OlNode & PositionedBase)\n | (ImageNode & PositionedBase & { imageData?: string })\n | (TableNode & PositionedBase)\n | (VStackNode & PositionedBase & { children: PositionedNode[] })\n | (HStackNode & PositionedBase & { children: PositionedNode[] })\n | (ShapeNode & PositionedBase)\n | (ChartNode & PositionedBase)\n | (TimelineNode & PositionedBase)\n | (MatrixNode & PositionedBase)\n | (TreeNode & PositionedBase)\n | (FlowNode & PositionedBase)\n | (ProcessArrowNode & PositionedBase)\n | (PyramidNode & PositionedBase)\n | (LineNode & PositionedBase)\n | (ArrowNode & PositionedBase)\n | (LayerNode & PositionedBase & { children: PositionedLayerChild[] })\n | (IconNode &\n PositionedBase & {\n iconImageData: string;\n bgX?: number;\n bgY?: number;\n bgW?: number;\n bgH?: number;\n iconX?: number;\n iconY?: number;\n iconW?: number;\n iconH?: number;\n })\n | (SvgNode & PositionedBase & { iconImageData: string });\n\nconst positionedLayerChildSchema: z.ZodType<PositionedLayerChild> = z.lazy(() =>\n positionedNodeSchema.and(\n z.object({\n x: z.number(),\n y: z.number(),\n }),\n ),\n);\n\nconst positionedNodeSchema: z.ZodType<PositionedNode> = z.lazy(() =>\n z.union([\n textNodeSchema.merge(positionedBaseSchema),\n ulNodeSchema.merge(positionedBaseSchema),\n olNodeSchema.merge(positionedBaseSchema),\n imageNodeSchema.merge(positionedBaseSchema).extend({\n imageData: z.string().optional(),\n }),\n tableNodeSchema.merge(positionedBaseSchema),\n vStackNodeSchema.merge(positionedBaseSchema).extend({\n children: z.array(z.lazy(() => positionedNodeSchema)),\n }),\n hStackNodeSchema.merge(positionedBaseSchema).extend({\n children: z.array(z.lazy(() => positionedNodeSchema)),\n }),\n shapeNodeSchema.merge(positionedBaseSchema),\n chartNodeSchema.merge(positionedBaseSchema),\n timelineNodeSchema.merge(positionedBaseSchema),\n matrixNodeSchema.merge(positionedBaseSchema),\n treeNodeSchema.merge(positionedBaseSchema),\n flowNodeSchema.merge(positionedBaseSchema),\n processArrowNodeSchema.merge(positionedBaseSchema),\n pyramidNodeSchema.merge(positionedBaseSchema),\n lineNodeSchema.merge(positionedBaseSchema),\n arrowNodeSchema.merge(positionedBaseSchema),\n layerNodeSchema.merge(positionedBaseSchema).extend({\n children: z.array(positionedLayerChildSchema),\n }),\n iconNodeSchema.merge(positionedBaseSchema).extend({\n iconImageData: z.string(),\n }),\n svgNodeSchema.merge(positionedBaseSchema).extend({\n iconImageData: z.string(),\n }),\n ]),\n);\n\n// ===== Slide Master Options =====\nconst masterTextObjectSchema = z.object({\n type: z.literal(\"text\"),\n text: z.string(),\n x: z.number(),\n y: z.number(),\n w: z.number(),\n h: z.number(),\n fontSize: z.number().optional(),\n fontFamily: z.string().optional(),\n color: z.string().optional(),\n bold: z.boolean().optional(),\n italic: z.boolean().optional(),\n underline: underlineSchema.optional(),\n strike: z.boolean().optional(),\n highlight: z.string().optional(),\n textAlign: z.enum([\"left\", \"center\", \"right\"]).optional(),\n});\n\nconst masterImageObjectSchema = z.object({\n type: z.literal(\"image\"),\n src: z.string(),\n x: z.number(),\n y: z.number(),\n w: z.number(),\n h: z.number(),\n});\n\nconst masterRectObjectSchema = z.object({\n type: z.literal(\"rect\"),\n x: z.number(),\n y: z.number(),\n w: z.number(),\n h: z.number(),\n fill: fillStyleSchema.optional(),\n border: borderStyleSchema.optional(),\n});\n\nconst masterLineObjectSchema = z.object({\n type: z.literal(\"line\"),\n x: z.number(),\n y: z.number(),\n w: z.number(),\n h: z.number(),\n line: borderStyleSchema.optional(),\n});\n\nexport const masterObjectSchema = z.discriminatedUnion(\"type\", [\n masterTextObjectSchema,\n masterImageObjectSchema,\n masterRectObjectSchema,\n masterLineObjectSchema,\n]);\n\nconst slideNumberOptionsSchema = z.object({\n x: z.number(),\n y: z.number(),\n w: z.number().optional(),\n h: z.number().optional(),\n fontSize: z.number().optional(),\n fontFamily: z.string().optional(),\n color: z.string().optional(),\n});\n\nconst slideMasterBackgroundSchema = z.union([\n z.object({ color: z.string() }),\n z.object({ path: z.string() }),\n z.object({ data: z.string() }),\n z.object({ image: z.string() }),\n]);\n\nconst slideMasterMarginSchema = z.union([\n z.number(),\n z.object({\n top: z.number().optional(),\n right: z.number().optional(),\n bottom: z.number().optional(),\n left: z.number().optional(),\n }),\n]);\n\nexport const slideMasterOptionsSchema = z.object({\n title: z.string().optional(),\n background: slideMasterBackgroundSchema.optional(),\n margin: slideMasterMarginSchema.optional(),\n objects: z.array(masterObjectSchema).optional(),\n slideNumber: slideNumberOptionsSchema.optional(),\n});\n\nexport type MasterTextObject = z.infer<typeof masterTextObjectSchema>;\nexport type MasterImageObject = z.infer<typeof masterImageObjectSchema>;\nexport type MasterRectObject = z.infer<typeof masterRectObjectSchema>;\nexport type MasterLineObject = z.infer<typeof masterLineObjectSchema>;\nexport type MasterObject = z.infer<typeof masterObjectSchema>;\nexport type SlideNumberOptions = z.infer<typeof slideNumberOptionsSchema>;\nexport type SlideMasterBackground = z.infer<typeof slideMasterBackgroundSchema>;\nexport type SlideMasterMargin = z.infer<typeof slideMasterMarginSchema>;\nexport type SlideMasterOptions = z.infer<typeof slideMasterOptionsSchema>;\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hirokisakabe/pom",
3
- "version": "8.8.0",
3
+ "version": "8.9.0",
4
4
  "description": "AI-friendly PowerPoint generation with a Flexbox layout engine.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",