@json-to-office/shared-docx 1.0.0 → 1.2.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.
Files changed (49) hide show
  1. package/dist/{chunk-ZC2I7CTZ.js → chunk-45I2NASU.js} +5 -3
  2. package/dist/{chunk-ZC2I7CTZ.js.map → chunk-45I2NASU.js.map} +1 -1
  3. package/dist/chunk-5KOKA5GY.js +687 -0
  4. package/dist/chunk-5KOKA5GY.js.map +1 -0
  5. package/dist/{chunk-MG2PLA6W.js → chunk-6B3LHADB.js} +2 -2
  6. package/dist/{chunk-WXG3FQ5V.js → chunk-A2K66URO.js} +30 -151
  7. package/dist/chunk-A2K66URO.js.map +1 -0
  8. package/dist/{chunk-V4HZOLMN.js → chunk-B4STXH5L.js} +36 -20
  9. package/dist/chunk-B4STXH5L.js.map +1 -0
  10. package/dist/{chunk-G3XK537A.js → chunk-BBFR3RRN.js} +14 -8
  11. package/dist/chunk-BBFR3RRN.js.map +1 -0
  12. package/dist/{chunk-VEF4T6PL.js → chunk-MYLVUQCN.js} +2 -2
  13. package/dist/{chunk-NZO5SZUO.js → chunk-NAZDY3PK.js} +45 -8
  14. package/dist/chunk-NAZDY3PK.js.map +1 -0
  15. package/dist/chunk-OP5PCDNN.js +1272 -0
  16. package/dist/chunk-OP5PCDNN.js.map +1 -0
  17. package/dist/{chunk-NAVRPVTN.js → chunk-SOI64OJZ.js} +6 -6
  18. package/dist/{chunk-GT3MN2RI.js → chunk-TODYYVZ4.js} +2 -2
  19. package/dist/chunk-VX2J2KWA.js +465 -0
  20. package/dist/chunk-VX2J2KWA.js.map +1 -0
  21. package/dist/index.d.ts +2 -2
  22. package/dist/index.js +52 -28
  23. package/dist/index.js.map +1 -1
  24. package/dist/schemas/api.js +7 -6
  25. package/dist/schemas/component-defaults.js +2 -1
  26. package/dist/schemas/component-registry.js +5 -4
  27. package/dist/schemas/components.d.ts +1792 -34
  28. package/dist/schemas/components.js +72 -27
  29. package/dist/schemas/document.js +8 -7
  30. package/dist/schemas/export.d.ts +8 -2
  31. package/dist/schemas/export.js +6 -5
  32. package/dist/schemas/generator.js +6 -5
  33. package/dist/schemas/renderer.d.ts +21 -3
  34. package/dist/schemas/renderer.js +5 -1
  35. package/dist/schemas/theme.js +3 -2
  36. package/dist/validation/unified/index.js +8 -7
  37. package/package.json +2 -2
  38. package/dist/chunk-2YUAD26Q.js +0 -1718
  39. package/dist/chunk-2YUAD26Q.js.map +0 -1
  40. package/dist/chunk-G3XK537A.js.map +0 -1
  41. package/dist/chunk-NZO5SZUO.js.map +0 -1
  42. package/dist/chunk-T7P4TA7I.js +0 -89
  43. package/dist/chunk-T7P4TA7I.js.map +0 -1
  44. package/dist/chunk-V4HZOLMN.js.map +0 -1
  45. package/dist/chunk-WXG3FQ5V.js.map +0 -1
  46. /package/dist/{chunk-MG2PLA6W.js.map → chunk-6B3LHADB.js.map} +0 -0
  47. /package/dist/{chunk-VEF4T6PL.js.map → chunk-MYLVUQCN.js.map} +0 -0
  48. /package/dist/{chunk-NAVRPVTN.js.map → chunk-SOI64OJZ.js.map} +0 -0
  49. /package/dist/{chunk-GT3MN2RI.js.map → chunk-TODYYVZ4.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/schemas/components/visual.ts","../src/schemas/components/visual-native.ts","../src/schemas/renderer.ts"],"sourcesContent":["/**\n * Visual Component Schema\n *\n * A `visual` is a free-canvas graphic: absolute positioning, overlapping\n * shapes and layered art that the docx flow layout cannot express — think\n * infographics, diagrams and hero compositions.\n *\n * There are two ways to draw one, chosen by `renderMode`.\n *\n * `raster` (the default, and what an omitted `renderMode` means) authors the\n * canvas as a single pptx slide and embeds the result as a PNG. An injected\n * rasterization service renders it (see `PptxServiceConfig` in\n * @json-to-office/shared), exactly the way `highcharts` offloads chart\n * rendering to an export server; at render time the component desugars to a\n * plain `image`. Every pptx slide element is available, and the output is\n * pixels.\n *\n * `native` draws the same canvas as one Word DrawingML group — real text\n * boxes, real shapes, real pictures — with no pptx, no rasterizer and no PNG.\n * The text stays searchable and every object stays editable in Word. It needs\n * the `office-open` renderer, and its content model is the narrower, strictly\n * validated one in `./visual-native`.\n */\n\nimport { Type, Static } from '@sinclair/typebox';\nimport {\n MIN_VISUAL_DPI,\n MAX_VISUAL_DPI,\n DEFAULT_VISUAL_DPI,\n} from '@json-to-office/shared';\nimport { PptxSlideContentSchema } from '@json-to-office/shared/schemas/slide-content';\nimport {\n AlignmentSchema,\n SpacingSchema,\n FloatingPropertiesSchema,\n} from './common';\nimport {\n NativeVisualCanvasSchema,\n NativeVisualElementSchema,\n} from './visual-native';\n\nexport * from './visual-native';\n\n/**\n * Canvas background — a solid color and/or a background image.\n * Mirrors the pptx slide background shape (kept local to avoid coupling\n * shared-docx to shared-pptx; the rasterizer forwards it verbatim).\n */\nexport const VisualCanvasBackgroundSchema = Type.Object(\n {\n color: Type.Optional(\n Type.String({\n description:\n 'Background color (hex like \"#FFFFFF\" or a theme color name)',\n })\n ),\n image: Type.Optional(\n Type.Object(\n {\n path: Type.Optional(Type.String()),\n base64: Type.Optional(Type.String()),\n },\n { additionalProperties: false }\n )\n ),\n },\n { additionalProperties: false }\n);\n\n/**\n * The pptx canvas the visual is drawn on. Width/height are in inches and set\n * both the aspect ratio and the physical print size of the embedded image.\n */\nexport const VisualCanvasSchema = Type.Object(\n {\n width: Type.Number({\n minimum: 0.1,\n description: 'Canvas width in inches (pptx slideWidth)',\n }),\n height: Type.Number({\n minimum: 0.1,\n description: 'Canvas height in inches (pptx slideHeight)',\n }),\n theme: Type.Optional(\n Type.String({ description: 'pptx theme name applied to the slide' })\n ),\n background: Type.Optional(VisualCanvasBackgroundSchema),\n },\n {\n description: 'pptx canvas definition for the visual',\n additionalProperties: false,\n }\n);\n\n/**\n * Where the drawing sits on the page, and how big it is.\n *\n * Identical for both render modes: a visual is placed like an image whether\n * its pixels came from a rasterizer or its objects were drawn by Word.\n */\nconst PlacementProps = {\n width: Type.Optional(\n Type.Union(\n [\n Type.Number({ minimum: 1, description: 'Rendered width in pixels' }),\n Type.String({\n pattern: '^\\\\d+(\\\\.\\\\d+)?%$',\n description: 'Rendered width as percentage (e.g. \"90%\")',\n }),\n ],\n {\n description:\n 'Rendered width in the document, in pixels (number) or percentage string. Defaults to the canvas physical size.',\n }\n )\n ),\n height: Type.Optional(\n Type.Union([\n Type.Number({ minimum: 1, description: 'Rendered height in pixels' }),\n Type.String({\n pattern: '^\\\\d+(\\\\.\\\\d+)?%$',\n description: 'Rendered height as percentage (e.g. \"90%\")',\n }),\n ])\n ),\n alignment: Type.Optional(AlignmentSchema),\n caption: Type.Optional(\n Type.String({\n description:\n 'Caption (supports rich text with **bold**, *italic*, ***both***)',\n })\n ),\n alt: Type.Optional(\n Type.String({ description: 'Alternative text for accessibility' })\n ),\n spacing: Type.Optional(SpacingSchema),\n floating: Type.Optional(FloatingPropertiesSchema),\n keepNext: Type.Optional(\n Type.Boolean({\n description: 'Keep paragraph with next paragraph on same page',\n })\n ),\n keepLines: Type.Optional(\n Type.Boolean({\n description: 'Keep all lines of paragraph together on same page',\n })\n ),\n} as const;\n\n// A single pptx slide content element (text, image, shape, table, highcharts,\n// chart) is validated against the real PPTX slide-content union\n// (`PptxSlideContentSchema` from @json-to-office/shared/schemas/slide-content)\n// — same authoring fidelity as a standalone `.pptx.json`. Used directly as the\n// `elements` item schema below.\n\n/**\n * The rasterized form: a pptx slide rendered to a PNG.\n *\n * `renderMode` is optional here because omitting it has always meant raster,\n * and every document written before native mode existed must keep rendering\n * byte-for-byte the way it did.\n */\nexport const VisualRasterPropsSchema = Type.Object(\n {\n renderMode: Type.Optional(\n Type.Literal('raster', {\n description:\n 'Render as a rasterized pptx slide (the default when omitted).',\n })\n ),\n\n // ── canvas (drives aspect ratio + physical size) ──\n canvas: VisualCanvasSchema,\n // pptx slide content elements, absolutely positioned on the canvas\n elements: Type.Optional(\n Type.Array(PptxSlideContentSchema, {\n description:\n 'pptx slide content elements (text, image, shape, table, highcharts, chart), positioned with x/y/w/h in inches',\n })\n ),\n\n // ── rasterization ──\n dpi: Type.Optional(\n Type.Number({\n minimum: MIN_VISUAL_DPI,\n maximum: MAX_VISUAL_DPI,\n default: DEFAULT_VISUAL_DPI,\n description: `Raster resolution in DPI (default ${DEFAULT_VISUAL_DPI}, range ${MIN_VISUAL_DPI}-${MAX_VISUAL_DPI}). Higher = sharper + larger.`,\n })\n ),\n serverUrl: Type.Optional(\n Type.String({\n description:\n 'Rasterization service URL override (default from services.pptx)',\n })\n ),\n\n // ── placement in the document (mirrors `image`) ──\n ...PlacementProps,\n },\n {\n // Hoisted into its own JSON-Schema definition rather than inlined at every\n // position a component can appear. `visual.props` is by far the largest\n // props schema in the registry, and inlining two of them pushed the\n // exported `ComponentDefinition` past the depth Ajv can compile.\n $id: 'DocxVisualRasterProps',\n description: 'Visual component props (pptx-rendered graphic)',\n additionalProperties: false,\n }\n);\n\n/**\n * The native form: one Word DrawingML group.\n *\n * `dpi` and `serverUrl` are absent rather than ignored — nothing is\n * rasterized, so a resolution or a service URL would describe work that never\n * happens. `renderMode` is required, which is what makes this branch\n * unreachable by accident.\n */\nexport const VisualNativePropsSchema = Type.Object(\n {\n renderMode: Type.Literal('native', {\n description:\n 'Draw natively as a Word DrawingML group. Requires the \"office-open\" renderer.',\n }),\n canvas: NativeVisualCanvasSchema,\n elements: Type.Optional(\n Type.Array(NativeVisualElementSchema, {\n description:\n 'Native drawing elements (text, shape, image), positioned with x/y/w/h in inches or canvas percentages',\n })\n ),\n ...PlacementProps,\n },\n {\n // Hoisted for the same reason as the raster branch above.\n $id: 'DocxVisualNativeProps',\n description:\n 'Visual component props (native Word drawing group; requires renderer \"office-open\")',\n additionalProperties: false,\n }\n);\n\n/**\n * The authoring surface of `visual`, as a union discriminated on `renderMode`.\n *\n * Kept as one canonical schema rather than two registry entries because the\n * runtime validator checks an un-profiled schema: both shapes have to be\n * structurally valid here, and which one a *document* may use is decided by\n * its renderer, in `schemas/renderer.ts`.\n */\nexport const VisualPropsSchema = Type.Union(\n [VisualRasterPropsSchema, VisualNativePropsSchema],\n {\n description:\n 'Visual component props — rasterized pptx slide (default) or a native Word drawing group',\n }\n);\n\nexport type VisualRasterProps = Static<typeof VisualRasterPropsSchema>;\nexport type VisualNativeProps = Static<typeof VisualNativePropsSchema>;\nexport type VisualProps = VisualRasterProps | VisualNativeProps;\nexport type VisualCanvas = Static<typeof VisualCanvasSchema>;\n\n/** The `renderMode` value that selects the native drawing-group path. */\nexport const NATIVE_RENDER_MODE = 'native';\n\n/** True when these props ask for the native DrawingML path. */\nexport function isNativeVisualProps(\n props: VisualProps | undefined | null\n): props is VisualNativeProps {\n return (\n !!props &&\n (props as { renderMode?: unknown }).renderMode === NATIVE_RENDER_MODE\n );\n}\n","/**\n * Native visual content — the DrawingML side of the `visual` component.\n *\n * A raster visual is authored as a pptx slide because a pptx slide is what\n * rasterizes it. A *native* visual has no such intermediary: it becomes one\n * Word drawing group, so its content model is the subset of that pptx surface\n * Word can draw natively — three element kinds, and only the properties that\n * lower to real DrawingML.\n *\n * The surface is deliberately narrower than the raster one, and strict with it.\n * Every schema here is `additionalProperties: false`, so a property that native\n * mode would ignore is rejected at the authoring boundary instead of silently\n * doing nothing: an author who writes a gradient fill or a chart gets told it\n * is not drawn, rather than shipping a document missing the thing they asked\n * for.\n *\n * Geometry is inches, or a percentage of the canvas extent on that axis. The\n * raster path's \"a number below 100 is inches, at or above it is EMU\" rule is\n * deliberately not reproduced: nothing here is ever EMU.\n */\n\nimport { Type, Static, type TSchema } from '@sinclair/typebox';\nimport { ShapeTypeSchema } from '@json-to-office/shared/schemas/slide-content';\n\n/**\n * A colour anywhere inside a native visual.\n *\n * The same vocabulary the rest of a `.docx.json` uses — `#RRGGBB`, a bare\n * six-digit hex, or a docx theme colour name — because a native visual is\n * drawn by the docx pipeline against the docx theme. The pptx palette names\n * (`accent4`, `tx1`, `bg2`) belong to the raster path and do not resolve here.\n */\nexport const NativeVisualColorSchema = Type.String({\n pattern: '^(#?[0-9A-Fa-f]{6}|[a-zA-Z][a-zA-Z0-9]*)$',\n description:\n 'Hex colour (\"#0F172A\" or \"0F172A\") or a docx theme colour name (e.g. \"primary\")',\n});\n\n/**\n * A signed percentage, for a position: an element may legitimately start off\n * the left or top edge of the canvas.\n */\nconst SIGNED_PERCENT_PATTERN = '^-?\\\\d+(\\\\.\\\\d+)?%$';\n\n/**\n * An unsigned percentage, for a size.\n *\n * Separate from the signed pattern on purpose. The number branch below states\n * `minimum: 0`, and a size that could be negative in one spelling and not the\n * other would make the surface's strictness depend on how the author happened\n * to write it — a negative width has no drawing to refuse it, it just comes\n * out as a zero-size object nobody can see.\n */\nconst PERCENT_PATTERN = '^\\\\d+(\\\\.\\\\d+)?%$';\n\n/** A position on the canvas: inches, or a percentage of the canvas extent. */\nexport const NativeVisualOffsetSchema = Type.Union(\n [\n Type.Number({ description: 'Inches from the canvas origin' }),\n Type.String({\n pattern: SIGNED_PERCENT_PATTERN,\n description: 'Percentage of the canvas extent on this axis, e.g. \"25%\"',\n }),\n ],\n { description: 'Position in inches (number) or as a canvas percentage' }\n);\n\n/** An extent on the canvas: inches, or a percentage of the canvas extent. */\nexport const NativeVisualExtentSchema = Type.Union(\n [\n Type.Number({ minimum: 0, description: 'Size in inches' }),\n Type.String({\n pattern: PERCENT_PATTERN,\n description: 'Percentage of the canvas extent on this axis, e.g. \"50%\"',\n }),\n ],\n { description: 'Size in inches (number) or as a canvas percentage' }\n);\n\nconst FrameProps = {\n x: Type.Optional(NativeVisualOffsetSchema),\n y: Type.Optional(NativeVisualOffsetSchema),\n w: Type.Optional(NativeVisualExtentSchema),\n h: Type.Optional(NativeVisualExtentSchema),\n rotate: Type.Optional(\n Type.Number({ description: 'Clockwise rotation in degrees' })\n ),\n} as const;\n\n/**\n * Underline, as Word draws it.\n *\n * `true` is a single line in the run's own colour; the object form names the\n * line style and, optionally, a colour of its own.\n */\nexport const NativeVisualUnderlineSchema = Type.Union(\n [\n Type.Boolean({ description: 'Single underline in the text colour' }),\n Type.Object(\n {\n style: Type.Optional(\n Type.Union(\n [\n Type.Literal('sng'),\n Type.Literal('dbl'),\n Type.Literal('dash'),\n Type.Literal('dotted'),\n ],\n { description: 'Underline style (default \"sng\")' }\n )\n ),\n color: Type.Optional(NativeVisualColorSchema),\n },\n { additionalProperties: false }\n ),\n ],\n { description: 'Underline: true for a single line, or a style/colour object' }\n);\n\nconst InlineTextProps = {\n fontFace: Type.Optional(Type.String({ description: 'Font family name' })),\n fontSize: Type.Optional(\n Type.Number({ minimum: 1, description: 'Font size in points' })\n ),\n bold: Type.Optional(Type.Boolean()),\n italic: Type.Optional(Type.Boolean()),\n} as const;\n\n/** One formatted span inside a native `text` element. */\nexport const NativeVisualTextRunSchema = Type.Object(\n {\n text: Type.String({ description: 'Run text' }),\n color: Type.Optional(NativeVisualColorSchema),\n ...InlineTextProps,\n underline: Type.Optional(NativeVisualUnderlineSchema),\n strike: Type.Optional(Type.Boolean({ description: 'Strikethrough' })),\n breakLine: Type.Optional(\n Type.Boolean({ description: 'Start a new line after this run' })\n ),\n },\n {\n additionalProperties: false,\n description: 'A formatted run inside a native visual text element',\n }\n);\n\n/**\n * One span of a shape's text.\n *\n * Deliberately not the same shape as a text run: shape text carries no\n * underline or strikethrough in the raster surface either, and native mode\n * keeps the two surfaces aligned rather than quietly widening one.\n */\nexport const NativeVisualTextSegmentSchema = Type.Object(\n {\n text: Type.String({ description: 'Segment text' }),\n color: Type.Optional(NativeVisualColorSchema),\n ...InlineTextProps,\n breakLine: Type.Optional(\n Type.Boolean({ description: 'Start a new line after this segment' })\n ),\n },\n {\n additionalProperties: false,\n description: 'A formatted segment of a native visual shape’s text',\n }\n);\n\n/** A solid fill, or none at all. */\nexport const NativeVisualFillSchema = Type.Object(\n {\n color: Type.Optional(NativeVisualColorSchema),\n transparency: Type.Optional(\n Type.Number({\n minimum: 0,\n maximum: 100,\n description: 'Fill transparency, 0 (opaque) to 100 (invisible)',\n })\n ),\n },\n {\n additionalProperties: false,\n description:\n 'Solid fill. Omit the whole property for no fill; gradients and patterns are raster-only.',\n }\n);\n\n/** A shape outline: solid or dashed, one uniform stroke. */\nexport const NativeVisualLineSchema = Type.Object(\n {\n color: Type.Optional(NativeVisualColorSchema),\n width: Type.Optional(\n Type.Number({ minimum: 0, description: 'Outline width in points' })\n ),\n dashType: Type.Optional(\n Type.Union(\n [\n Type.Literal('solid'),\n Type.Literal('dash'),\n Type.Literal('dot'),\n Type.Literal('dashDot'),\n ],\n { description: 'Outline dash pattern (default \"solid\")' }\n )\n ),\n },\n { additionalProperties: false, description: 'Shape outline' }\n);\n\nexport const NativeVisualAlignmentSchema = Type.Union(\n [\n Type.Literal('left'),\n Type.Literal('center'),\n Type.Literal('right'),\n Type.Literal('justify'),\n ],\n { description: 'Horizontal text alignment' }\n);\n\nexport const NativeVisualVerticalAlignmentSchema = Type.Union(\n [Type.Literal('top'), Type.Literal('middle'), Type.Literal('bottom')],\n { description: 'Vertical text anchoring inside the box' }\n);\n\n/** Text inset, in points: one value for every side, or `[top, right, bottom, left]`. */\nexport const NativeVisualMarginSchema = Type.Union(\n [\n Type.Number({ minimum: 0, description: 'Inset on every side, in points' }),\n Type.Array(Type.Number({ minimum: 0 }), {\n minItems: 4,\n maxItems: 4,\n description: 'Insets as [top, right, bottom, left], in points',\n }),\n ],\n { description: 'Text insets in points' }\n);\n\nexport const NativeVisualTextPropsSchema = Type.Object(\n {\n text: Type.Optional(Type.String({ description: 'Plain text content' })),\n runs: Type.Optional(\n Type.Array(NativeVisualTextRunSchema, {\n minItems: 1,\n description: 'Formatted runs, as an alternative to \"text\"',\n })\n ),\n ...FrameProps,\n color: Type.Optional(NativeVisualColorSchema),\n ...InlineTextProps,\n underline: Type.Optional(NativeVisualUnderlineSchema),\n strike: Type.Optional(Type.Boolean({ description: 'Strikethrough' })),\n align: Type.Optional(NativeVisualAlignmentSchema),\n valign: Type.Optional(NativeVisualVerticalAlignmentSchema),\n margin: Type.Optional(NativeVisualMarginSchema),\n fill: Type.Optional(NativeVisualFillSchema),\n },\n {\n additionalProperties: false,\n description:\n 'Native visual text element — becomes a Word text box (wps:wsp) inside the drawing group',\n }\n);\n\nexport const NativeVisualShapePropsSchema = Type.Object(\n {\n type: ShapeTypeSchema,\n ...FrameProps,\n fill: Type.Optional(NativeVisualFillSchema),\n line: Type.Optional(NativeVisualLineSchema),\n text: Type.Optional(\n Type.Union(\n [\n Type.String(),\n Type.Array(NativeVisualTextSegmentSchema, { minItems: 1 }),\n ],\n { description: 'Text drawn inside the shape' }\n )\n ),\n ...InlineTextProps,\n fontColor: Type.Optional(NativeVisualColorSchema),\n align: Type.Optional(NativeVisualAlignmentSchema),\n valign: Type.Optional(NativeVisualVerticalAlignmentSchema),\n margin: Type.Optional(NativeVisualMarginSchema),\n flipH: Type.Optional(Type.Boolean({ description: 'Mirror horizontally' })),\n flipV: Type.Optional(Type.Boolean({ description: 'Mirror vertically' })),\n },\n {\n additionalProperties: false,\n description:\n 'Native visual shape element — becomes a preset-geometry shape (wps:wsp) inside the drawing group',\n }\n);\n\nexport const NativeVisualImagePropsSchema = Type.Object(\n {\n path: Type.Optional(\n Type.String({ description: 'File path or http(s) URL' })\n ),\n base64: Type.Optional(Type.String({ description: 'Base64 data URI' })),\n svg: Type.Optional(Type.String({ description: 'Raw SVG markup' })),\n ...FrameProps,\n sizing: Type.Optional(\n Type.Object(\n {\n type: Type.Union(\n [\n Type.Literal('contain'),\n Type.Literal('cover'),\n Type.Literal('crop'),\n ],\n { description: 'How the image fills its box' }\n ),\n w: Type.Optional(\n Type.Number({\n minimum: 0,\n description:\n 'Box width in inches; overrides the element’s own \"w\"',\n })\n ),\n h: Type.Optional(\n Type.Number({\n minimum: 0,\n description:\n 'Box height in inches; overrides the element’s own \"h\"',\n })\n ),\n },\n {\n additionalProperties: false,\n description:\n 'How the image fills its box. \"w\"/\"h\" state the box itself, taking precedence over the element’s \"w\"/\"h\", as they do in raster mode.',\n }\n )\n ),\n alt: Type.Optional(\n Type.String({ description: 'Alternative text for accessibility' })\n ),\n },\n {\n additionalProperties: false,\n description:\n 'Native visual image element — becomes a native picture inside the drawing group',\n }\n);\n\n/** The three element kinds a native visual can hold, in public schema order. */\nexport const NATIVE_VISUAL_ELEMENT_NAMES = ['text', 'shape', 'image'] as const;\n\nexport type NativeVisualElementName =\n (typeof NATIVE_VISUAL_ELEMENT_NAMES)[number];\n\nfunction nativeElement<\n const TName extends NativeVisualElementName,\n const TProps extends TSchema,\n>(name: TName, propsSchema: TProps, description: string) {\n return Type.Object(\n {\n name: Type.Literal(name),\n id: Type.Optional(Type.String()),\n enabled: Type.Optional(\n Type.Boolean({\n default: true,\n description:\n 'When false, this element is filtered out and not drawn. Defaults to true.',\n })\n ),\n props: propsSchema,\n },\n { additionalProperties: false, description }\n );\n}\n\n/**\n * A single element of a native visual.\n *\n * `table`, `chart` and `highcharts` are absent on purpose: a Word table cannot\n * live inside a drawing group, and neither chart kind has a native mapping\n * here yet. Naming one is a validation error rather than a silent drop.\n *\n * The `$id` is distinct from the raster union's `PptxSlideContent` so the two\n * never collide when the document schema hoists them into shared definitions.\n */\nexport const NativeVisualElementSchema = Type.Union(\n [\n nativeElement(\n 'text',\n NativeVisualTextPropsSchema,\n 'Text element - a native Word text box drawn on the visual canvas.'\n ),\n nativeElement(\n 'shape',\n NativeVisualShapePropsSchema,\n 'Shape element - a native preset-geometry shape, optionally holding text.'\n ),\n nativeElement(\n 'image',\n NativeVisualImagePropsSchema,\n 'Image element - a native picture; an SVG stays vector.'\n ),\n ],\n {\n $id: 'DocxNativeVisualContent',\n discriminator: { propertyName: 'name' },\n description: 'A single native visual element (text, shape, or image).',\n }\n);\n\n/**\n * The canvas a native visual is drawn on.\n *\n * No `theme`: the raster canvas names a *pptx* theme, which the docx pipeline\n * cannot resolve. Native colours resolve against the document's own docx theme\n * instead, so naming a pptx theme here would promise something that could not\n * be kept.\n */\nexport const NativeVisualCanvasSchema = Type.Object(\n {\n width: Type.Number({\n minimum: 0.1,\n description: 'Canvas width in inches',\n }),\n height: Type.Number({\n minimum: 0.1,\n description: 'Canvas height in inches',\n }),\n background: Type.Optional(\n Type.Object(\n {\n color: Type.Optional(NativeVisualColorSchema),\n image: Type.Optional(\n Type.Object(\n {\n path: Type.Optional(Type.String()),\n base64: Type.Optional(Type.String()),\n },\n { additionalProperties: false }\n )\n ),\n },\n {\n additionalProperties: false,\n description:\n 'Canvas background. A colour becomes the bottom-most rectangle; an image becomes the bottom-most picture.',\n }\n )\n ),\n },\n {\n additionalProperties: false,\n description: 'Drawing canvas for a native visual',\n }\n);\n\nexport type NativeVisualCanvas = Static<typeof NativeVisualCanvasSchema>;\nexport type NativeVisualElement = Static<typeof NativeVisualElementSchema>;\nexport type NativeVisualTextProps = Static<typeof NativeVisualTextPropsSchema>;\nexport type NativeVisualShapeProps = Static<\n typeof NativeVisualShapePropsSchema\n>;\nexport type NativeVisualImageProps = Static<\n typeof NativeVisualImagePropsSchema\n>;\nexport type NativeVisualTextRun = Static<typeof NativeVisualTextRunSchema>;\nexport type NativeVisualTextSegment = Static<\n typeof NativeVisualTextSegmentSchema\n>;\nexport type NativeVisualFill = Static<typeof NativeVisualFillSchema>;\nexport type NativeVisualLine = Static<typeof NativeVisualLineSchema>;\n","import type { TSchema } from '@sinclair/typebox';\nimport type { ValidationError } from '@json-to-office/shared';\nimport { NATIVE_RENDER_MODE } from './components/visual';\n\nexport const DOCX_RENDERER_IDS = ['docxjs', 'office-open'] as const;\nexport type DocxRendererId = (typeof DOCX_RENDERER_IDS)[number];\nexport const DEFAULT_DOCX_RENDERER_ID: DocxRendererId = 'docxjs';\n\n/** The element kinds a native `visual` can hold. */\nconst NATIVE_VISUAL_ELEMENTS: ReadonlySet<string> = new Set([\n 'text',\n 'shape',\n 'image',\n]);\n\n/**\n * The exported JSON-Schema definition name for one renderer's component union.\n *\n * One name per renderer, never a shared one. The two views differ wherever a\n * backend cannot draw something, so a single definition would hand every\n * position that goes through it — a section header or footer, a table cell's\n * content, `componentDefaults` — whichever view the exporter happened to walk\n * last, and give a schema-driven editor the wrong diagnostics for the other\n * renderer.\n */\nexport function docxComponentDefinitionName(renderer: DocxRendererId): string {\n return `ComponentDefinition_${renderer}`;\n}\n\n/**\n * Derive one renderer view from the canonical props schema.\n *\n * The canonical schema is the union of everything any backend can express, so\n * a profile is a *subtraction*: the branches and fields this renderer cannot\n * draw are removed, which is what makes a schema-driven editor offer only what\n * the chosen backend will actually render.\n */\nexport function docxPropsSchemaForRenderer(\n componentName: string,\n schema: TSchema,\n renderer: DocxRendererId\n): TSchema {\n const copy = cloneSchema(schema);\n nameComponentPlaceholders(copy, docxComponentDefinitionName(renderer));\n\n if (componentName === 'visual' && renderer !== 'office-open') {\n // Only `office-open` draws a native group, so every other backend sees the\n // raster branch alone — a plain object rather than a union, which is what\n // gives an editor one unambiguous completion set.\n return firstUnionBranch(copy) ?? copy;\n }\n\n if (renderer === 'office-open') pruneThreadFields(copy);\n return copy;\n}\n\n/** Static renderer-profile diagnostics used by CLI/library validation. */\nexport function collectDocxRendererErrors(data: unknown): ValidationError[] {\n if (!data || typeof data !== 'object' || Array.isArray(data)) return [];\n const root = data as Record<string, any>;\n const renderer = root.renderer ?? DEFAULT_DOCX_RENDERER_ID;\n\n if (!DOCX_RENDERER_IDS.includes(renderer)) {\n return [\n {\n path: '/renderer',\n message: `Invalid renderer \"${String(renderer)}\". Expected \"docxjs\" or \"office-open\".`,\n code: 'invalid_value',\n },\n ];\n }\n\n const errors: ValidationError[] = [];\n const isOfficeOpen = renderer === 'office-open';\n\n const visit = (node: unknown, path: string): void => {\n if (Array.isArray(node)) {\n node.forEach((entry, index) => visit(entry, `${path}/${index}`));\n return;\n }\n if (!node || typeof node !== 'object') return;\n const object = node as Record<string, unknown>;\n\n if (isOfficeOpen) {\n const comment = object.comment;\n if (comment && typeof comment === 'object' && !Array.isArray(comment)) {\n const value = comment as Record<string, unknown>;\n for (const field of ['replies', 'resolved'] as const) {\n if (value[field] !== undefined) {\n errors.push({\n path: `${path}/comment/${field}`,\n message: `The \"office-open\" renderer does not support comment threads.`,\n code: 'unsupported_renderer_feature',\n });\n }\n }\n }\n }\n\n if (object.name === 'visual') {\n collectVisualErrors(object, `${path}`, isOfficeOpen, errors);\n }\n\n for (const [key, value] of Object.entries(object)) {\n if (key !== 'renderer') visit(value, `${path}/${key}`);\n }\n };\n\n visit(root, '');\n return errors;\n}\n\n/**\n * Native-mode rules for one `visual` node.\n *\n * Two separate concerns, and both have to name a path an editor can jump to.\n * A backend that cannot draw a group must reject the mode itself, at\n * `props/renderMode`. A backend that can must still reject element kinds that\n * have no native form — otherwise a `chart` inside a native visual would\n * validate and then vanish, which is exactly the failure mode strictness\n * exists to prevent.\n */\nfunction collectVisualErrors(\n node: Record<string, unknown>,\n path: string,\n isOfficeOpen: boolean,\n errors: ValidationError[]\n): void {\n const props = node.props;\n if (!props || typeof props !== 'object' || Array.isArray(props)) return;\n const value = props as Record<string, unknown>;\n if (value.renderMode !== NATIVE_RENDER_MODE) return;\n\n if (!isOfficeOpen) {\n errors.push({\n path: `${path}/props/renderMode`,\n message:\n 'Only the \"office-open\" renderer draws a native visual. Set the document\\'s \"renderer\" to \"office-open\", or drop \"renderMode\" to rasterize.',\n code: 'unsupported_renderer_feature',\n });\n return;\n }\n\n const elements = value.elements;\n if (!Array.isArray(elements)) return;\n elements.forEach((element, index) => {\n if (!element || typeof element !== 'object' || Array.isArray(element)) {\n return;\n }\n const name = (element as Record<string, unknown>).name;\n if (typeof name !== 'string' || NATIVE_VISUAL_ELEMENTS.has(name)) return;\n errors.push({\n path: `${path}/props/elements/${index}/name`,\n message:\n `A native visual cannot draw \"${name}\". Native mode holds \"text\", ` +\n '\"shape\" and \"image\"; use renderMode \"raster\" for anything else.',\n code: 'unsupported_renderer_feature',\n });\n });\n}\n\n/** The first branch of a union schema, if this is one. */\nfunction firstUnionBranch(schema: TSchema): TSchema | undefined {\n const branches = (schema as { anyOf?: TSchema[] }).anyOf;\n return Array.isArray(branches) && branches.length > 0\n ? branches[0]\n : undefined;\n}\n\nfunction pruneThreadFields(node: unknown): void {\n if (Array.isArray(node)) {\n node.forEach(pruneThreadFields);\n return;\n }\n if (!node || typeof node !== 'object') return;\n const schema = node as Record<PropertyKey, any>;\n const properties = schema.properties as Record<string, TSchema> | undefined;\n if (\n properties?.text &&\n properties?.author &&\n (properties.replies || properties.resolved) &&\n typeof schema.description === 'string' &&\n schema.description.includes('Word review comment')\n ) {\n delete properties.replies;\n delete properties.resolved;\n const required = schema.required as string[] | undefined;\n if (required) {\n schema.required = required.filter(\n (key) => key !== 'replies' && key !== 'resolved'\n );\n }\n }\n for (const key of Reflect.ownKeys(schema)) {\n pruneThreadFields(schema[key]);\n }\n}\n\n/**\n * Point a renderer's props at that renderer's component definition.\n *\n * A position that holds arbitrary components but is built from a *static*\n * schema carries an untyped item instead of a live recursive ref —\n * `componentDefaults.section.header` is the one that matters, because\n * `ComponentDefaultsSchema` is shared with the theme and so cannot be handed\n * the recursion. The export pass used to resolve those against one hard-coded\n * name; naming them here, while the renderer is still known and the schema is\n * still this renderer's private clone, is what keeps the two views apart.\n */\nfunction nameComponentPlaceholders(\n node: unknown,\n definitionName: string\n): void {\n if (Array.isArray(node)) {\n node.forEach((entry) => nameComponentPlaceholders(entry, definitionName));\n return;\n }\n if (!node || typeof node !== 'object') return;\n const schema = node as Record<PropertyKey, any>;\n\n if (\n schema.type === 'array' &&\n schema.items &&\n typeof schema.items === 'object' &&\n Object.keys(schema.items).length === 0\n ) {\n // A bare name, the same shape `Type.Recursive` emits for its own self\n // reference. `fixSchemaReferences` resolves both to `#/definitions/...`.\n schema.items = { $ref: definitionName };\n }\n\n for (const key of Reflect.ownKeys(schema)) {\n nameComponentPlaceholders(schema[key], definitionName);\n }\n}\n\nfunction cloneSchema<T>(value: T): T {\n if (Array.isArray(value)) return value.map(cloneSchema) as T;\n if (!value || typeof value !== 'object') return value;\n const copy = Object.create(Object.getPrototypeOf(value));\n for (const key of Reflect.ownKeys(value as object)) {\n copy[key] = cloneSchema((value as any)[key]);\n }\n return copy;\n}\n"],"mappings":"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","names":["Type","Type"]}
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  createAllComponentSchemas,
3
3
  createAllComponentSchemasNarrowed
4
- } from "./chunk-WXG3FQ5V.js";
4
+ } from "./chunk-A2K66URO.js";
5
5
 
6
6
  // src/schemas/components.ts
7
7
  import { Type } from "@sinclair/typebox";
@@ -31,4 +31,4 @@ export {
31
31
  StandardComponentDefinitionSchema,
32
32
  ComponentDefinitionSchema
33
33
  };
34
- //# sourceMappingURL=chunk-MG2PLA6W.js.map
34
+ //# sourceMappingURL=chunk-6B3LHADB.js.map
@@ -1,33 +1,34 @@
1
1
  import {
2
2
  DOCX_RENDERER_IDS,
3
+ VisualPropsSchema,
3
4
  docxPropsSchemaForRenderer
4
- } from "./chunk-T7P4TA7I.js";
5
+ } from "./chunk-5KOKA5GY.js";
5
6
  import {
6
7
  ThemeOverridesSchema
7
- } from "./chunk-ZC2I7CTZ.js";
8
+ } from "./chunk-45I2NASU.js";
8
9
  import {
9
- AlignmentSchema,
10
10
  ColumnsPropsSchema,
11
11
  ComponentDefaultsSchema,
12
- FloatingPropertiesSchema,
13
12
  HeadingPropsSchema,
14
13
  ImagePropsSchema,
15
14
  ListPropsSchema,
16
15
  ParagraphPropsSchema,
17
16
  SectionPropsSchema,
18
- SpacingSchema,
19
17
  StatisticPropsSchema,
20
18
  TablePropsSchema,
21
19
  createSectionPropsSchema,
22
20
  createTablePropsSchema
23
- } from "./chunk-2YUAD26Q.js";
21
+ } from "./chunk-OP5PCDNN.js";
22
+ import {
23
+ FloatingPropertiesSchema
24
+ } from "./chunk-VX2J2KWA.js";
24
25
  import {
25
26
  HexColorSchema,
26
27
  NoProofWordsSchema
27
28
  } from "./chunk-7TTAAYQ5.js";
28
29
 
29
30
  // src/schemas/component-registry.ts
30
- import { Type as Type6 } from "@sinclair/typebox";
31
+ import { Type as Type5 } from "@sinclair/typebox";
31
32
 
32
33
  // src/schemas/components/report.ts
33
34
  import { Type } from "@sinclair/typebox";
@@ -517,129 +518,6 @@ var HighchartsPropsSchema = Type4.Object({
517
518
  )
518
519
  });
519
520
 
520
- // src/schemas/components/visual.ts
521
- import { Type as Type5 } from "@sinclair/typebox";
522
- import {
523
- MIN_VISUAL_DPI,
524
- MAX_VISUAL_DPI,
525
- DEFAULT_VISUAL_DPI
526
- } from "@json-to-office/shared";
527
- import { PptxSlideContentSchema } from "@json-to-office/shared/schemas/slide-content";
528
- var VisualCanvasBackgroundSchema = Type5.Object(
529
- {
530
- color: Type5.Optional(
531
- Type5.String({
532
- description: 'Background color (hex like "#FFFFFF" or a theme color name)'
533
- })
534
- ),
535
- image: Type5.Optional(
536
- Type5.Object(
537
- {
538
- path: Type5.Optional(Type5.String()),
539
- base64: Type5.Optional(Type5.String())
540
- },
541
- { additionalProperties: false }
542
- )
543
- )
544
- },
545
- { additionalProperties: false }
546
- );
547
- var VisualCanvasSchema = Type5.Object(
548
- {
549
- width: Type5.Number({
550
- minimum: 0.1,
551
- description: "Canvas width in inches (pptx slideWidth)"
552
- }),
553
- height: Type5.Number({
554
- minimum: 0.1,
555
- description: "Canvas height in inches (pptx slideHeight)"
556
- }),
557
- theme: Type5.Optional(
558
- Type5.String({ description: "pptx theme name applied to the slide" })
559
- ),
560
- background: Type5.Optional(VisualCanvasBackgroundSchema)
561
- },
562
- {
563
- description: "pptx canvas definition for the visual",
564
- additionalProperties: false
565
- }
566
- );
567
- var VisualPropsSchema = Type5.Object(
568
- {
569
- // ── canvas (drives aspect ratio + physical size) ──
570
- canvas: VisualCanvasSchema,
571
- // pptx slide content elements, absolutely positioned on the canvas
572
- elements: Type5.Optional(
573
- Type5.Array(PptxSlideContentSchema, {
574
- description: "pptx slide content elements (text, image, shape, table, highcharts, chart), positioned with x/y/w/h in inches"
575
- })
576
- ),
577
- // ── rasterization ──
578
- dpi: Type5.Optional(
579
- Type5.Number({
580
- minimum: MIN_VISUAL_DPI,
581
- maximum: MAX_VISUAL_DPI,
582
- default: DEFAULT_VISUAL_DPI,
583
- description: `Raster resolution in DPI (default ${DEFAULT_VISUAL_DPI}, range ${MIN_VISUAL_DPI}-${MAX_VISUAL_DPI}). Higher = sharper + larger.`
584
- })
585
- ),
586
- serverUrl: Type5.Optional(
587
- Type5.String({
588
- description: "Rasterization service URL override (default from services.pptx)"
589
- })
590
- ),
591
- // ── placement in the document (mirrors `image`) ──
592
- width: Type5.Optional(
593
- Type5.Union(
594
- [
595
- Type5.Number({ minimum: 1, description: "Rendered width in pixels" }),
596
- Type5.String({
597
- pattern: "^\\d+(\\.\\d+)?%$",
598
- description: 'Rendered width as percentage (e.g. "90%")'
599
- })
600
- ],
601
- {
602
- description: "Rendered width in the document, in pixels (number) or percentage string. Defaults to the canvas physical size."
603
- }
604
- )
605
- ),
606
- height: Type5.Optional(
607
- Type5.Union([
608
- Type5.Number({ minimum: 1, description: "Rendered height in pixels" }),
609
- Type5.String({
610
- pattern: "^\\d+(\\.\\d+)?%$",
611
- description: 'Rendered height as percentage (e.g. "90%")'
612
- })
613
- ])
614
- ),
615
- alignment: Type5.Optional(AlignmentSchema),
616
- caption: Type5.Optional(
617
- Type5.String({
618
- description: "Caption (supports rich text with **bold**, *italic*, ***both***)"
619
- })
620
- ),
621
- alt: Type5.Optional(
622
- Type5.String({ description: "Alternative text for accessibility" })
623
- ),
624
- spacing: Type5.Optional(SpacingSchema),
625
- floating: Type5.Optional(FloatingPropertiesSchema),
626
- keepNext: Type5.Optional(
627
- Type5.Boolean({
628
- description: "Keep paragraph with next paragraph on same page"
629
- })
630
- ),
631
- keepLines: Type5.Optional(
632
- Type5.Boolean({
633
- description: "Keep all lines of paragraph together on same page"
634
- })
635
- )
636
- },
637
- {
638
- description: "Visual component props (pptx-rendered graphic)",
639
- additionalProperties: false
640
- }
641
- );
642
-
643
521
  // src/schemas/component-registry.ts
644
522
  var STANDARD_COMPONENTS_REGISTRY = [
645
523
  // ========================================================================
@@ -770,7 +648,7 @@ var STANDARD_COMPONENTS_REGISTRY = [
770
648
  propsSchema: VisualPropsSchema,
771
649
  hasChildren: false,
772
650
  category: "content",
773
- description: "Free-canvas graphic authored as a single pptx slide and embedded as a rasterized PNG. Use for infographics, diagrams and layered compositions that the document flow cannot express."
651
+ description: 'Free-canvas graphic for infographics, diagrams and layered compositions the document flow cannot express. Rasterized from a pptx slide by default; renderMode "native" draws it as an editable Word drawing group (renderer "office-open").'
774
652
  }
775
653
  ];
776
654
  function getStandardComponent(name) {
@@ -797,26 +675,26 @@ function demandsProps(propsSchema) {
797
675
  }
798
676
  function createComponentSchemaObject(component, childrenType, selfRef, profile) {
799
677
  const schema = {
800
- name: Type6.Literal(component.name),
801
- id: Type6.Optional(Type6.String()),
802
- enabled: Type6.Optional(
803
- Type6.Boolean({
678
+ name: Type5.Literal(component.name),
679
+ id: Type5.Optional(Type5.String()),
680
+ enabled: Type5.Optional(
681
+ Type5.Boolean({
804
682
  default: true,
805
683
  description: "When false, this component is filtered out and not rendered. Defaults to true. Useful for conditional component inclusion."
806
684
  })
807
685
  )
808
686
  };
809
687
  if (component.special?.hasSchemaField) {
810
- schema.$schema = Type6.Optional(Type6.String({ format: "uri" }));
811
- schema.renderer = profile ? profile.requireDiscriminator ? Type6.Literal(profile.renderer, {
688
+ schema.$schema = Type5.Optional(Type5.String({ format: "uri" }));
689
+ schema.renderer = profile ? profile.requireDiscriminator ? Type5.Literal(profile.renderer, {
812
690
  description: "Renderer backend for this document"
813
- }) : Type6.Optional(
814
- Type6.Literal(profile.renderer, {
691
+ }) : Type5.Optional(
692
+ Type5.Literal(profile.renderer, {
815
693
  description: 'Renderer backend. Omitted defaults to "docxjs".'
816
694
  })
817
- ) : Type6.Optional(
818
- Type6.Union(
819
- DOCX_RENDERER_IDS.map((renderer) => Type6.Literal(renderer)),
695
+ ) : Type5.Optional(
696
+ Type5.Union(
697
+ DOCX_RENDERER_IDS.map((renderer) => Type5.Literal(renderer)),
820
698
  {
821
699
  description: 'Renderer backend. Omitted defaults to "docxjs".'
822
700
  }
@@ -824,12 +702,16 @@ function createComponentSchemaObject(component, childrenType, selfRef, profile)
824
702
  );
825
703
  }
826
704
  const basePropsSchema = component.createPropsSchema && selfRef ? component.createPropsSchema(selfRef) : component.propsSchema;
827
- const propsSchema = profile ? docxPropsSchemaForRenderer(basePropsSchema, profile.renderer) : basePropsSchema;
828
- schema.props = demandsProps(propsSchema) ? propsSchema : Type6.Optional(propsSchema);
705
+ const propsSchema = profile ? docxPropsSchemaForRenderer(
706
+ component.name,
707
+ basePropsSchema,
708
+ profile.renderer
709
+ ) : basePropsSchema;
710
+ schema.props = demandsProps(propsSchema) ? propsSchema : Type5.Optional(propsSchema);
829
711
  if (component.hasChildren && childrenType) {
830
- schema.children = component.special?.hasSchemaField ? Type6.Array(childrenType) : Type6.Optional(Type6.Array(childrenType));
712
+ schema.children = component.special?.hasSchemaField ? Type5.Array(childrenType) : Type5.Optional(Type5.Array(childrenType));
831
713
  }
832
- return Type6.Object(schema, {
714
+ return Type5.Object(schema, {
833
715
  additionalProperties: false,
834
716
  description: component.description
835
717
  });
@@ -870,7 +752,7 @@ function createAllComponentSchemasNarrowed(selfRef, pluginSchemas = [], profile)
870
752
  if (!containerDeps.every((d) => resolved.has(d))) continue;
871
753
  const childSchemas = comp.allowedChildren.map((name) => resolved.get(name) ?? leafSchemas.get(name)).filter((s) => s !== void 0);
872
754
  const allChildSchemas = [...childSchemas, ...pluginSchemas];
873
- const childrenType = allChildSchemas.length === 1 ? allChildSchemas[0] : Type6.Union(allChildSchemas);
755
+ const childrenType = allChildSchemas.length === 1 ? allChildSchemas[0] : Type5.Union(allChildSchemas);
874
756
  resolved.set(
875
757
  comp.name,
876
758
  createComponentSchemaObject(comp, childrenType, selfRef, profile)
@@ -897,9 +779,6 @@ export {
897
779
  TocDepthRangeSchema,
898
780
  TocPropsSchema,
899
781
  HighchartsPropsSchema,
900
- VisualCanvasBackgroundSchema,
901
- VisualCanvasSchema,
902
- VisualPropsSchema,
903
782
  STANDARD_COMPONENTS_REGISTRY,
904
783
  getStandardComponent,
905
784
  getAllStandardComponentNames,
@@ -911,4 +790,4 @@ export {
911
790
  createAllComponentSchemas,
912
791
  createAllComponentSchemasNarrowed
913
792
  };
914
- //# sourceMappingURL=chunk-WXG3FQ5V.js.map
793
+ //# sourceMappingURL=chunk-A2K66URO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/schemas/component-registry.ts","../src/schemas/components/report.ts","../src/schemas/components/text-box.ts","../src/schemas/components/toc.ts","../src/schemas/components/highcharts.ts"],"sourcesContent":["/**\n * Component Registry - SINGLE SOURCE OF TRUTH\n *\n * This is the ONLY place where standard components are defined.\n * All schema generators MUST use this registry.\n *\n * Adding a new component: Add it to STANDARD_COMPONENTS_REGISTRY below.\n * It will automatically be included in:\n * - StandardComponentDefinitionSchema (components.ts)\n * - ComponentDefinitionSchema (components.ts)\n * - generateUnifiedDocumentSchema (generator.ts)\n * - Monaco editor autocomplete\n * - Build-time JSON schemas\n */\n\nimport { Type, TSchema } from '@sinclair/typebox';\n// Import directly from individual component files to avoid circular dependency\n// (components.ts imports from this file, so we can't import from components.ts)\nimport { ReportPropsSchema } from './components/report';\nimport {\n SectionPropsSchema,\n createSectionPropsSchema,\n} from './components/section';\nimport { ColumnsPropsSchema } from './components/columns';\nimport { HeadingPropsSchema } from './components/heading';\nimport { ParagraphPropsSchema } from './components/paragraph';\nimport { TextBoxPropsSchema } from './components/text-box';\nimport { ImagePropsSchema } from './components/image';\nimport { StatisticPropsSchema } from './components/statistic';\nimport { TablePropsSchema, createTablePropsSchema } from './components/table';\nimport { ListPropsSchema } from './components/list';\nimport { TocPropsSchema } from './components/toc';\nimport { HighchartsPropsSchema } from './components/highcharts';\nimport { VisualPropsSchema } from './components/visual';\nimport {\n DOCX_RENDERER_IDS,\n docxPropsSchemaForRenderer,\n type DocxRendererId,\n} from './renderer';\n\n/**\n * Component definition with metadata\n */\nexport interface StandardComponentDefinition {\n /** Component name identifier (e.g., 'heading', 'text', 'toc') */\n name: string;\n /** TypeBox schema for the component's props */\n propsSchema: TSchema;\n /** Whether this component can contain children */\n hasChildren: boolean;\n /**\n * Names of standard components allowed as direct children.\n * Only meaningful when hasChildren is true.\n * Plugin components are always allowed in addition to these.\n * Omit to allow the full recursive union (backward-compat).\n */\n allowedChildren?: readonly string[];\n /**\n * Factory that builds props with a live recursive ref (e.g., for section\n * header/footer, table cell content). When present and a recursive ref is\n * available, used instead of the static `propsSchema`.\n */\n createPropsSchema?: (recursiveRef: TSchema) => TSchema;\n /** Component category for organization */\n category: 'container' | 'content' | 'layout';\n /** Human-readable description */\n description: string;\n /** Special flags for this component */\n special?: {\n /** Has $schema field (only 'docx') */\n hasSchemaField?: boolean;\n };\n}\n\n/**\n * SINGLE SOURCE OF TRUTH for all standard components\n *\n * This is the ONLY place where standard components are defined.\n * All schema generators MUST use this registry.\n *\n * IMPORTANT: When adding a new component:\n * 1. Add the component definition to this array\n * 2. Import its props schema at the top of this file\n * 3. That's it! The component will automatically appear everywhere.\n */\nexport const STANDARD_COMPONENTS_REGISTRY: readonly StandardComponentDefinition[] =\n [\n // ========================================================================\n // Container Components (can contain children)\n // ========================================================================\n {\n name: 'docx',\n propsSchema: ReportPropsSchema,\n hasChildren: true,\n allowedChildren: ['section'],\n category: 'container',\n description:\n 'Main document container - defines the overall document structure. Required as the root component.',\n special: {\n hasSchemaField: true, // Only docx root has $schema field\n },\n },\n {\n name: 'section',\n propsSchema: SectionPropsSchema,\n createPropsSchema: createSectionPropsSchema,\n hasChildren: true,\n allowedChildren: [\n 'heading',\n 'paragraph',\n 'image',\n 'statistic',\n 'table',\n 'list',\n 'toc',\n 'highcharts',\n 'visual',\n 'columns',\n 'text-box',\n ],\n category: 'container',\n description:\n 'Section container - groups related content with optional title. Use for organizing document structure.',\n },\n {\n name: 'columns',\n propsSchema: ColumnsPropsSchema,\n hasChildren: true,\n allowedChildren: [\n 'heading',\n 'paragraph',\n 'image',\n 'statistic',\n 'table',\n 'list',\n 'toc',\n 'highcharts',\n 'visual',\n 'text-box',\n ],\n category: 'layout',\n description:\n 'Multi-column layout - arranges content in 2-4 columns. Great for side-by-side content.',\n },\n {\n name: 'text-box',\n propsSchema: TextBoxPropsSchema,\n hasChildren: true,\n allowedChildren: ['heading', 'paragraph', 'image'],\n category: 'layout',\n description:\n 'Floating text container - allows positioning text anywhere on the page with absolute or relative positioning.',\n },\n\n // ========================================================================\n // Content Components (leaf nodes, no children)\n // ========================================================================\n {\n name: 'heading',\n propsSchema: HeadingPropsSchema,\n hasChildren: false,\n category: 'content',\n description:\n 'Heading text - supports levels 1-6 for document hierarchy. Level 1 is largest.',\n },\n {\n name: 'paragraph',\n propsSchema: ParagraphPropsSchema,\n hasChildren: false,\n category: 'content',\n description:\n 'Paragraph text - supports formatting like bold, italic, and color. Main content element.',\n },\n {\n name: 'image',\n propsSchema: ImagePropsSchema,\n hasChildren: false,\n category: 'content',\n description:\n 'Image element - displays images with optional caption. Supports various formats.',\n },\n {\n name: 'statistic',\n propsSchema: StatisticPropsSchema,\n hasChildren: false,\n category: 'content',\n description:\n 'Statistic display - shows a number with description. Perfect for KPIs and metrics.',\n },\n {\n name: 'table',\n propsSchema: TablePropsSchema,\n createPropsSchema: createTablePropsSchema,\n hasChildren: false,\n category: 'content',\n description:\n 'Data table - displays tabular data with headers. Supports formatting and alignment.',\n },\n {\n name: 'list',\n propsSchema: ListPropsSchema,\n hasChildren: false,\n category: 'content',\n description:\n 'List element - bulleted or numbered list items. Supports nested lists.',\n },\n {\n name: 'toc',\n propsSchema: TocPropsSchema,\n hasChildren: false,\n category: 'content',\n description:\n 'Table of contents - automatically generates TOC from document headings. Supports depth ranges and custom styles.',\n },\n {\n name: 'highcharts',\n propsSchema: HighchartsPropsSchema,\n hasChildren: false,\n category: 'content',\n description:\n 'Chart component powered by Highcharts - render line, bar, pie, heatmap, and more with rich options.',\n },\n {\n name: 'visual',\n propsSchema: VisualPropsSchema,\n hasChildren: false,\n category: 'content',\n description:\n 'Free-canvas graphic for infographics, diagrams and layered compositions the document flow cannot express. Rasterized from a pptx slide by default; renderMode \"native\" draws it as an editable Word drawing group (renderer \"office-open\").',\n },\n ] as const;\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Get a component definition by name\n */\nexport function getStandardComponent(\n name: string\n): StandardComponentDefinition | undefined {\n return STANDARD_COMPONENTS_REGISTRY.find((c) => c.name === name);\n}\n\n/**\n * Get all standard component names\n */\nexport function getAllStandardComponentNames(): readonly string[] {\n return STANDARD_COMPONENTS_REGISTRY.map((c) => c.name);\n}\n\n/**\n * Get components by category\n */\nexport function getComponentsByCategory(\n category: StandardComponentDefinition['category']\n): readonly StandardComponentDefinition[] {\n return STANDARD_COMPONENTS_REGISTRY.filter((c) => c.category === category);\n}\n\n/**\n * Get container components (components that can have children)\n */\nexport function getContainerComponents(): readonly StandardComponentDefinition[] {\n return STANDARD_COMPONENTS_REGISTRY.filter((c) => c.hasChildren);\n}\n\n/**\n * Get content components (components that cannot have children)\n */\nexport function getContentComponents(): readonly StandardComponentDefinition[] {\n return STANDARD_COMPONENTS_REGISTRY.filter((c) => !c.hasChildren);\n}\n\n/**\n * Check if a component name is a standard component\n */\nexport function isStandardComponent(name: string): boolean {\n return STANDARD_COMPONENTS_REGISTRY.some((c) => c.name === name);\n}\n\n// ============================================================================\n// Schema Generation Helpers\n// ============================================================================\n\n/**\n * True when a props schema rejects `{}`, i.e. the `props` key cannot be omitted.\n *\n * Only object schemas are inspected. Anything else (a union, a bare ref) is\n * treated as demanding props, preserving the previous stricter behavior for\n * shapes this cannot reason about.\n */\nfunction demandsProps(propsSchema: TSchema): boolean {\n const schema = propsSchema as { type?: string; required?: readonly string[] };\n return schema.type !== 'object' || (schema.required?.length ?? 0) > 0;\n}\n\n/**\n * Generate TypeBox schema object for a component.\n *\n * @param component - Component definition from the registry\n * @param childrenType - Schema for children items. For containers this should be\n * a narrowed union of allowed children; for leaves omit it.\n * @returns TypeBox schema object for the component\n */\nexport function createComponentSchemaObject(\n component: StandardComponentDefinition,\n childrenType?: TSchema,\n selfRef?: TSchema,\n profile?: { renderer: DocxRendererId; requireDiscriminator: boolean }\n): TSchema {\n const schema: Record<string, TSchema> = {\n name: Type.Literal(component.name),\n id: Type.Optional(Type.String()),\n enabled: Type.Optional(\n Type.Boolean({\n default: true,\n description:\n 'When false, this component is filtered out and not rendered. Defaults to true. Useful for conditional component inclusion.',\n })\n ),\n };\n\n // Special handling for report component (has $schema field)\n if (component.special?.hasSchemaField) {\n schema.$schema = Type.Optional(Type.String({ format: 'uri' }));\n schema.renderer = profile\n ? profile.requireDiscriminator\n ? Type.Literal(profile.renderer, {\n description: 'Renderer backend for this document',\n })\n : Type.Optional(\n Type.Literal(profile.renderer, {\n description: 'Renderer backend. Omitted defaults to \"docxjs\".',\n })\n )\n : Type.Optional(\n Type.Union(\n DOCX_RENDERER_IDS.map((renderer) => Type.Literal(renderer)),\n {\n description: 'Renderer backend. Omitted defaults to \"docxjs\".',\n }\n )\n );\n }\n\n // selfRef (full union) is intentionally passed to createPropsSchema so that\n // header/footer sub-schemas and table cell content can reference any component.\n const basePropsSchema =\n component.createPropsSchema && selfRef\n ? component.createPropsSchema(selfRef)\n : component.propsSchema;\n const propsSchema = profile\n ? docxPropsSchemaForRenderer(\n component.name,\n basePropsSchema,\n profile.renderer\n )\n : basePropsSchema;\n\n // `props` is required only when the props schema itself demands a field.\n // The runtime validator treats an omitted `props` as `{}` and lets the props\n // schema decide (see deep-validator.ts), so `section`, `toc`, `image` and\n // `text-box` are legal without the key. Exporting `props` as unconditionally\n // required reddened documents that build: the playground flagged all 23\n // propless sections in the shipped tech-report template while every runtime\n // gate stayed green. The root `docx` node already carried this fix locally in\n // generator.ts; this generalizes it to every component.\n schema.props = demandsProps(propsSchema)\n ? propsSchema\n : Type.Optional(propsSchema);\n\n // Add children support if applicable. The root component requires its\n // `children` array — deep-validator.ts enforces the same rule, but only on\n // the fallback path it takes when the TypeBox check already failed. That\n // made the rule fire only as a side effect of `props` being required, so\n // relaxing `props` above would silently retire it. Nested containers may\n // legitimately be empty.\n if (component.hasChildren && childrenType) {\n schema.children = component.special?.hasSchemaField\n ? Type.Array(childrenType)\n : Type.Optional(Type.Array(childrenType));\n }\n\n return Type.Object(schema, {\n additionalProperties: false,\n description: component.description,\n });\n}\n\n/**\n * Generate an array of TypeBox schemas for all standard components.\n * Uses a flat recursive ref for all containers (legacy behavior).\n *\n * @param recursiveRef - Optional recursive reference for children\n * @returns Array of TypeBox schemas for all components in the registry\n */\nexport function createAllComponentSchemas(\n recursiveRef?: TSchema\n): readonly TSchema[] {\n return STANDARD_COMPONENTS_REGISTRY.map((component) =>\n createComponentSchemaObject(component, recursiveRef)\n );\n}\n\n/**\n * Build all standard component schemas with per-container narrowed children.\n *\n * Resolves containers in dependency order so each container's children union\n * only references its allowedChildren. Plugin schemas are always included in\n * every container's children.\n *\n * @param selfRef - The Type.Recursive self-reference (used as fallback and for plugin children)\n * @param pluginSchemas - Plugin component schemas (always allowed in all containers)\n * @returns schemas array and a byName map for direct lookups\n */\nexport function createAllComponentSchemasNarrowed(\n selfRef: TSchema,\n pluginSchemas: TSchema[] = [],\n profile?: { renderer: DocxRendererId; requireDiscriminator: boolean }\n): { schemas: TSchema[]; byName: Map<string, TSchema> } {\n // Phase 1: Build leaf (non-container) component schemas — no children\n // selfRef is passed so factories (e.g. table) can wire up recursive refs.\n const leafSchemas = new Map<string, TSchema>();\n for (const comp of STANDARD_COMPONENTS_REGISTRY) {\n if (!comp.hasChildren) {\n leafSchemas.set(\n comp.name,\n createComponentSchemaObject(comp, undefined, selfRef, profile)\n );\n }\n }\n\n // Phase 2: Resolve containers in dependency order\n const containers = STANDARD_COMPONENTS_REGISTRY.filter((c) => c.hasChildren);\n const resolved = new Map<string, TSchema>();\n const pending = [...containers];\n\n while (pending.length > 0) {\n const before = pending.length;\n for (let i = pending.length - 1; i >= 0; i--) {\n const comp = pending[i];\n\n if (!comp.allowedChildren) {\n // No allowedChildren declared — fallback to full recursive ref\n resolved.set(\n comp.name,\n createComponentSchemaObject(comp, selfRef, selfRef, profile)\n );\n pending.splice(i, 1);\n continue;\n }\n\n // Check if all container dependencies are resolved\n const containerDeps = comp.allowedChildren.filter((name) =>\n containers.some((c) => c.name === name)\n );\n if (!containerDeps.every((d) => resolved.has(d))) continue;\n\n // Build narrowed children union\n const childSchemas = comp.allowedChildren\n .map((name) => resolved.get(name) ?? leafSchemas.get(name))\n .filter((s): s is TSchema => s !== undefined);\n\n const allChildSchemas = [...childSchemas, ...pluginSchemas];\n const childrenType =\n allChildSchemas.length === 1\n ? allChildSchemas[0]\n : Type.Union(allChildSchemas);\n\n resolved.set(\n comp.name,\n createComponentSchemaObject(comp, childrenType, selfRef, profile)\n );\n pending.splice(i, 1);\n }\n\n if (pending.length === before) {\n throw new Error(\n `Circular allowedChildren among: ${pending.map((c) => c.name).join(', ')}`\n );\n }\n }\n\n // Combine: containers (resolved) + leaves\n const byName = new Map([...resolved, ...leafSchemas]);\n return { schemas: [...byName.values()], byName };\n}\n","/**\n * Report Component Schema\n */\n\nimport { Type, Static, TSchema } from '@sinclair/typebox';\nimport { FontRegistrySchema } from '@json-to-office/shared';\nimport { ComponentDefaultsSchema } from '../component-defaults';\nimport { NoProofWordsSchema } from '../font';\nimport { ThemeOverridesSchema } from '../theme';\n\n// Create a function to generate ReportPropsSchema with recursive component reference\nexport const createReportPropsSchema = (_componentRef?: TSchema) =>\n Type.Object(\n {\n theme: Type.Optional(\n Type.String({\n description: 'Theme name to apply (default: \"minimal\")',\n examples: ['minimal', 'corporate', 'modern'],\n default: 'minimal',\n })\n ),\n themeOverrides: Type.Optional(ThemeOverridesSchema),\n fontRegistry: Type.Optional(FontRegistrySchema),\n componentDefaults: Type.Optional(ComponentDefaultsSchema),\n language: Type.Optional(\n Type.String({\n pattern: '^[A-Za-z]{2,3}(-[A-Za-z0-9]{2,8})*$',\n description:\n 'Default document language (BCP-47 tag, e.g. \"en-US\"). Sets Word\\'s default proofing/spell-check language; individual components can override it locally.',\n examples: ['en-US', 'fr-FR', 'de-DE', 'it-IT', 'es-ES'],\n })\n ),\n noProofWords: Type.Optional(NoProofWordsSchema),\n trackRevisions: Type.Optional(\n Type.Boolean({\n description:\n 'Open the document in track-changes mode: Word marks any further edits as revisions. Set automatically on redline documents produced by the diff engine',\n })\n ),\n metadata: Type.Optional(\n Type.Object(\n {\n title: Type.Optional(\n Type.String({\n description: 'Document title',\n examples: ['Annual Report 2024', 'Technical Documentation'],\n })\n ),\n subtitle: Type.Optional(\n Type.String({\n description: 'Document subtitle',\n })\n ),\n description: Type.Optional(Type.String()),\n author: Type.Optional(Type.String()),\n company: Type.Optional(\n Type.String({\n description:\n 'Company name, written to docProps/custom.xml (Word has no core-property slot for it)',\n })\n ),\n date: Type.Optional(\n Type.String({\n description:\n 'Document date used by {DATE}/{DATETIME} placeholders (defaults to the generation timestamp)',\n })\n ),\n version: Type.Optional(\n Type.String({\n description: 'Document version, written to docProps/custom.xml',\n examples: ['1.0', '2024.3'],\n })\n ),\n tags: Type.Optional(Type.Array(Type.String())),\n },\n {\n description:\n 'Document metadata (title, author, company, version, etc.). Package timestamps (dcterms:created/modified) are not part of this object: they come from the `generatedAt` generation option so repeated builds stay byte-identical.',\n additionalProperties: false,\n }\n )\n ),\n },\n {\n description: 'Report component props',\n additionalProperties: false,\n }\n );\n\nexport const ReportPropsSchema = createReportPropsSchema();\n\nexport type ReportProps = Static<typeof ReportPropsSchema>;\n","/**\n * Text Box Component Schema\n * A floating container that can hold child components (e.g., text, image, columns)\n *\n * Positioning API mirrors existing floating options from text/image for consistency.\n *\n * **Nested Columns Support:**\n * When a `columns` component is nested inside a `text-box`, it automatically renders\n * as a multi-column table instead of a section-level column layout. This allows\n * for columnar content within floating or inline containers.\n */\n\nimport { Type, Static } from '@sinclair/typebox';\nimport { FloatingPropertiesSchema } from './common';\nimport { HexColorSchema } from '../font';\n\nexport const TextBoxPropsSchema = Type.Object(\n {\n width: Type.Optional(\n Type.Union(\n [\n Type.Number({\n minimum: 1,\n description: 'Text box width in pixels',\n }),\n Type.String({\n pattern: '^\\\\d+(\\\\.\\\\d+)?%$',\n description:\n 'Text box width as percentage (e.g., \"50%\") relative to content width',\n }),\n ],\n {\n description:\n 'Text box width in pixels (number) or as percentage string (e.g., \"50%\")',\n }\n )\n ),\n height: Type.Optional(\n Type.Union(\n [\n Type.Number({\n minimum: 1,\n description: 'Text box height in pixels',\n }),\n Type.String({\n pattern: '^\\\\d+(\\\\.\\\\d+)?%$',\n description:\n 'Text box height as percentage (e.g., \"50%\") relative to content height',\n }),\n ],\n {\n description:\n 'Text box height in pixels (number) or as percentage string (e.g., \"50%\")',\n }\n )\n ),\n renderAs: Type.Optional(\n Type.Union([Type.Literal('table'), Type.Literal('shape')], {\n description:\n \"Rendering strategy. 'table' (default): borderless one-cell table — height auto-fits content, per-side borders and percentage widths resolve in Word. 'shape': native Word text box (WPS shape) — real wrap modes and z-order, but requires explicit width and height (no autofit), a single uniform border, and eagerly-resolved percentage sizes.\",\n })\n ),\n floating: Type.Optional(FloatingPropertiesSchema),\n style: Type.Optional(\n Type.Object(\n {\n padding: Type.Optional(\n Type.Object(\n {\n top: Type.Optional(Type.Number({ minimum: 0 })),\n right: Type.Optional(Type.Number({ minimum: 0 })),\n bottom: Type.Optional(Type.Number({ minimum: 0 })),\n left: Type.Optional(Type.Number({ minimum: 0 })),\n },\n { additionalProperties: false }\n )\n ),\n border: Type.Optional(\n Type.Object(\n {\n top: Type.Optional(\n // Reuse border schema semantics: style/width/color\n Type.Object(\n {\n style: Type.Optional(\n Type.Union([\n Type.Literal('solid'),\n Type.Literal('dashed'),\n Type.Literal('dotted'),\n Type.Literal('double'),\n Type.Literal('none'),\n ])\n ),\n width: Type.Optional(Type.Number({ minimum: 0 })),\n color: Type.Optional(HexColorSchema),\n },\n { additionalProperties: false }\n )\n ),\n right: Type.Optional(\n Type.Object(\n {\n style: Type.Optional(\n Type.Union([\n Type.Literal('solid'),\n Type.Literal('dashed'),\n Type.Literal('dotted'),\n Type.Literal('double'),\n Type.Literal('none'),\n ])\n ),\n width: Type.Optional(Type.Number({ minimum: 0 })),\n color: Type.Optional(HexColorSchema),\n },\n { additionalProperties: false }\n )\n ),\n bottom: Type.Optional(\n Type.Object(\n {\n style: Type.Optional(\n Type.Union([\n Type.Literal('solid'),\n Type.Literal('dashed'),\n Type.Literal('dotted'),\n Type.Literal('double'),\n Type.Literal('none'),\n ])\n ),\n width: Type.Optional(Type.Number({ minimum: 0 })),\n color: Type.Optional(HexColorSchema),\n },\n { additionalProperties: false }\n )\n ),\n left: Type.Optional(\n Type.Object(\n {\n style: Type.Optional(\n Type.Union([\n Type.Literal('solid'),\n Type.Literal('dashed'),\n Type.Literal('dotted'),\n Type.Literal('double'),\n Type.Literal('none'),\n ])\n ),\n width: Type.Optional(Type.Number({ minimum: 0 })),\n color: Type.Optional(HexColorSchema),\n },\n { additionalProperties: false }\n )\n ),\n },\n { additionalProperties: false }\n )\n ),\n shading: Type.Optional(\n Type.Object(\n {\n // Same domain as every other colour prop and as the border\n // colours above: resolveColor() accepts \"#RRGGBB\" or a theme\n // colour name, and throws on anything else at render time.\n fill: Type.Optional(HexColorSchema),\n },\n { additionalProperties: false }\n )\n ),\n },\n { additionalProperties: false }\n )\n ),\n },\n {\n additionalProperties: false,\n /**\n * The same two shape limits `collectTextBoxShapeConflicts` enforces, said\n * in JSON Schema so an editor can say it too.\n *\n * The deep validator only runs when a document is generated, so until now\n * an author learned that a shape needs a height by pressing Run. These are\n * plain cross-field rules, and `if`/`then` expresses them — which is what\n * Monaco checks the buffer against, so the editor underlines the mistake\n * while it is being made. The deep validator stays as the backstop: it\n * carries the remediation text, and it is what the API enforces for\n * callers who never see an editor.\n */\n allOf: [\n {\n if: {\n properties: { renderAs: { const: 'shape' } },\n required: ['renderAs'],\n },\n then: {\n required: ['width', 'height'],\n properties: {\n style: {\n properties: {\n border: {\n properties: Object.fromEntries(\n ['top', 'right', 'bottom', 'left'].map((side) => [\n side,\n { properties: { style: { enum: ['solid', 'none'] } } },\n ])\n ),\n },\n },\n },\n },\n },\n },\n ],\n }\n);\n\nexport type TextBoxProps = Static<typeof TextBoxPropsSchema>;\n","/**\n * Table of Contents Component Schema\n */\n\nimport { Type, Static } from '@sinclair/typebox';\n\n/**\n * Kept for back-compat only. Word's TOC field has no numbering switch, so the\n * renderer cannot apply this and logs a warning when it is set; entries inherit\n * the numbering of the heading styles they reference.\n */\nexport const TocStyleSchema = Type.Union(\n [Type.Literal('numeric'), Type.Literal('bullet'), Type.Literal('none')],\n {\n description:\n 'TOC numbering style — accepted but not applied (Word TOC fields carry no numbering switch); setting it logs a warning during generation',\n }\n);\n\nexport const TocScopeSchema = Type.Union(\n [Type.Literal('document'), Type.Literal('section')],\n { description: 'TOC scope: document-wide or section-only' }\n);\n\nexport const TocStyleMappingSchema = Type.Object(\n {\n styleId: Type.String({\n description: 'Custom style ID matching a key in theme.styles',\n }),\n level: Type.Number({\n minimum: 1,\n maximum: 6,\n description: 'TOC level (1-6) to assign to this style',\n }),\n },\n {\n description: 'Mapping of custom style to TOC level',\n additionalProperties: false,\n }\n);\n\nexport const TocDepthRangeSchema = Type.Object(\n {\n from: Type.Optional(\n Type.Number({\n minimum: 1,\n maximum: 6,\n default: 1,\n description:\n 'Starting heading level (1-6). Defaults to 1 if not specified.',\n })\n ),\n to: Type.Optional(\n Type.Number({\n minimum: 1,\n maximum: 6,\n default: 3,\n description:\n 'Ending heading level (1-6). Defaults to 3 if not specified.',\n })\n ),\n },\n {\n description:\n 'Range of heading levels to include in TOC. Specify at least one of \"from\" or \"to\".',\n additionalProperties: false,\n }\n);\n\nexport const TocPropsSchema = Type.Object(\n {\n pageBreak: Type.Optional(\n Type.Boolean({\n description: 'Insert page break before TOC block',\n })\n ),\n depth: Type.Optional(\n Type.Object(\n {\n from: Type.Optional(\n Type.Number({\n minimum: 1,\n maximum: 6,\n default: 1,\n description:\n 'Starting heading level (1-6). Defaults to 1 if not specified.',\n })\n ),\n to: Type.Optional(\n Type.Number({\n minimum: 1,\n maximum: 6,\n default: 3,\n description:\n 'Ending heading level (1-6). Defaults to 3 if not specified.',\n })\n ),\n },\n {\n description:\n 'Range of heading levels to include in TOC. Specify \"from\", \"to\", or both. Defaults: from=1, to=3',\n additionalProperties: false,\n default: { to: 3 },\n }\n )\n ),\n pageNumbersDepth: Type.Optional(\n Type.Object(\n {\n from: Type.Optional(\n Type.Number({\n minimum: 1,\n maximum: 6,\n default: 1,\n description:\n 'Starting heading level (1-6). Defaults to 1 if not specified.',\n })\n ),\n to: Type.Optional(\n Type.Number({\n minimum: 1,\n maximum: 6,\n default: 3,\n description:\n 'Ending heading level (1-6). Defaults to 3 if not specified.',\n })\n ),\n },\n {\n description:\n 'Range of heading levels to show page numbers. Specify \"from\", \"to\", or both. When specified, page numbers are hidden for entries outside this range.',\n additionalProperties: false,\n }\n )\n ),\n numberingStyle: Type.Optional(TocStyleSchema),\n title: Type.Optional(\n Type.String({\n description: 'TOC heading title',\n })\n ),\n includePageNumbers: Type.Optional(\n Type.Boolean({\n default: true,\n description: 'Show page numbers next to entries',\n })\n ),\n numberSeparator: Type.Optional(\n Type.Boolean({\n default: true,\n description:\n 'Use tab separator between entry and page number. True applies \"\\\\t\" (default), false applies \" \"',\n })\n ),\n scope: Type.Optional(\n Type.Union([TocScopeSchema, Type.Literal('auto')], {\n default: 'auto',\n description:\n 'TOC scope: \"document\" for entire document, \"section\" for parent section only, \"auto\" for automatic detection (section if inside section, otherwise document)',\n })\n ),\n styles: Type.Optional(\n Type.Array(TocStyleMappingSchema, {\n description:\n 'Custom style mappings for TOC entries. Maps custom theme styles to TOC levels.',\n })\n ),\n },\n {\n description: 'Table of Contents component props',\n additionalProperties: false,\n }\n);\n\nexport type TocProps = Static<typeof TocPropsSchema>;\n","/**\n * Highcharts Component Schema\n *\n * Standard component for rendering charts using Highcharts export server.\n */\n\nimport { Type, Static } from '@sinclair/typebox';\n\n/**\n * Highcharts component props schema\n * Accepts options that will be passed to Highcharts export server\n */\nexport const HighchartsPropsSchema = Type.Object({\n // Highcharts chart options - can be anything but must at least have chart.width and chart.height\n options: Type.Intersect([\n Type.Record(Type.String(), Type.Unknown()),\n Type.Object({\n chart: Type.Object({\n width: Type.Number(),\n height: Type.Number(),\n }),\n }),\n ]),\n // Optional scale factor for export\n scale: Type.Optional(Type.Number()),\n // Optional resources forwarded verbatim to the export server (CSS/JS/files).\n // Notably enables @font-face rules so charts render in custom fonts.\n resources: Type.Optional(\n Type.Object({\n css: Type.Optional(Type.String()),\n js: Type.Optional(Type.String()),\n files: Type.Optional(Type.Array(Type.String())),\n })\n ),\n // Optional Highcharts Export Server URL override\n serverUrl: Type.Optional(\n Type.String({\n description:\n 'Highcharts Export Server URL (default: http://localhost:7801)',\n })\n ),\n // Optional width for rendering (overrides chart width)\n width: Type.Optional(\n Type.Union(\n [\n Type.Number({\n minimum: 1,\n description: 'Image width in pixels',\n }),\n Type.String({\n pattern: '^\\\\d+(\\\\.\\\\d+)?%$',\n description:\n 'Image width as percentage (e.g., \"90%\") relative to content width',\n }),\n ],\n {\n description:\n 'Rendered image width in pixels (number) or as percentage string (e.g., \"90%\")',\n }\n )\n ),\n // Optional height for rendering (overrides chart height)\n height: Type.Optional(\n Type.Union(\n [\n Type.Number({\n minimum: 1,\n description: 'Image height in pixels',\n }),\n Type.String({\n pattern: '^\\\\d+(\\\\.\\\\d+)?%$',\n description:\n 'Image height as percentage (e.g., \"90%\") relative to content height',\n }),\n ],\n {\n description:\n 'Rendered image height in pixels (number) or as percentage string (e.g., \"90%\")',\n }\n )\n ),\n});\n\nexport type HighchartsProps = Static<typeof HighchartsPropsSchema>;\n"],"mappings":"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","names":["Type","Type","Type","Type","Type","Type"]}