@lofcz/pptist 2.0.8 → 2.0.9

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.
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "schemaVersion": 2,
3
3
  "package": "@lofcz/pptist",
4
- "packageVersion": "2.0.8",
5
- "generatedAt": "2026-06-01T05:43:33.073Z",
6
- "summary": "Authoring guidance for the PPTist agentic bridge: the coordinate system, a default design system, per-domain and per-command notes, and reusable slide composition recipes. Pair this with the machine schema (command payload/return types) in the same manifest.",
7
- "commandCount": 169,
4
+ "packageVersion": "2.0.9",
5
+ "generatedAt": "2026-06-02T04:47:06.952Z",
6
+ "summary": "Authoring guidance for the PPTist agentic bridge. The fast, reliable way to build a deck: (1) pick ONE style preset and apply it with deck.applyStyle, then (2) add slides with slides.createFromLayout, filling a few content slots. The engine handles colors, contrast, fonts, sizing and placement for you. Drop down to manual element placement only for bespoke slides. Content is authored as Markdown, plain text, or structured slot values — never hand-written HTML. Pair this with the machine schema (command payload/return types) in the same manifest.",
7
+ "commandCount": 173,
8
8
  "designSystem": {
9
- "summary": "PPTist lays elements out in a fixed pixel coordinate space, not inches. Design against these tokens for clean, readable decks.",
9
+ "summary": "PPTist lays elements out in a fixed pixel coordinate space, not inches. Prefer style presets + layouts (deck.applyStyle + slides.createFromLayout) so colors, contrast, fonts and sizing come from a curated, accessible design system instead of being hand-picked. These tokens describe the *fallback* defaults for manual placement.",
10
10
  "coordinateSystem": {
11
11
  "summary": "The default 16:9 canvas is 1000 x 562.5 px (viewport.size = 1000, viewport.ratio = 0.5625). Origin (0,0) is the top-left corner. Every element has left, top, width, height in px and rotate in degrees.",
12
12
  "notes": [
@@ -14,11 +14,12 @@
14
14
  "Keep a 40px safe margin from every edge (left/top >= 40, and left+width <= 960, top+height <= 522 on the default canvas).",
15
15
  "Coordinates are absolute px, NOT inches/points. To port an inches-based layout, multiply inches by 100 (10in wide deck -> 1000px).",
16
16
  "rotate is clockwise degrees about the element center. Lines use start/end points instead of width/height/rotate.",
17
- "Text size is controlled by inline styles inside the element's HTML content (e.g. <span style=\"font-size:40px\">), not by a top-level fontSize field. defaultColor/defaultFontName are only fallbacks."
17
+ "When you use slides.createFromLayout you do NOT compute coordinates or sizes — the layout places themed elements for you. The notes above only matter for manual element placement.",
18
+ "For manual text, write Markdown or plain text (text.create({ markdown }) / { content } as plain text). The engine stores text as HTML internally; you should not author raw HTML tags yourself (they are escaped and show as literal text). Per-run font sizing is an advanced manual concern — reach for a layout instead."
18
19
  ]
19
20
  },
20
21
  "tokens": {
21
- "summary": "A neutral, presentation-safe default palette and type scale (px). Override per deck via deck.setTheme.",
22
+ "summary": "The neutral fallback palette/type scale (px) used when no style preset is applied. PREFER applying a curated preset with deck.applyStyle (see styles.catalog) — presets ship contrast-safe role colors (background/surface/title/body/muted/rule/accent), a heading+body font pairing, and a tuned type scale. Override individual tokens with deck.setTheme only when a preset is not enough.",
22
23
  "colors": {
23
24
  "background": "#FFFFFF",
24
25
  "primary": "#1F4E79",
@@ -47,10 +48,10 @@
47
48
  "domains": [
48
49
  {
49
50
  "id": "deck",
50
- "commandCount": 7,
51
+ "commandCount": 8,
51
52
  "title": "Deck",
52
- "summary": "Whole-document state: title, theme, viewport, templates, plus full get/set/patch.",
53
- "whenToUse": "Set the deck theme and viewport once up front; use whole-document import/export at persistence boundaries."
53
+ "summary": "Whole-document state: title, theme/style, viewport, templates, plus full get/set/patch.",
54
+ "whenToUse": "Apply a style with deck.applyStyle up front; set the viewport once; use whole-document import/export at persistence boundaries."
54
55
  },
55
56
  {
56
57
  "id": "import",
@@ -66,12 +67,26 @@
66
67
  "summary": "Serializable JSON snapshot of the deck.",
67
68
  "whenToUse": "Persist/autosave from documentChanged events."
68
69
  },
70
+ {
71
+ "id": "styles",
72
+ "commandCount": 1,
73
+ "title": "Styles",
74
+ "summary": "Curated style presets (palette + fonts + type scale). styles.catalog lists them; deck.applyStyle applies one to the whole deck.",
75
+ "whenToUse": "FIRST. Pick exactly one preset that matches the audience/tone and apply it before adding any slides. Never hand-pick colors or fonts when a preset fits."
76
+ },
77
+ {
78
+ "id": "layouts",
79
+ "commandCount": 1,
80
+ "title": "Layouts",
81
+ "summary": "Pre-composed slide recipes (title, section, bullets, twoColumn, imageText, bigStat, quote, chart, comparison, closing). layouts.catalog lists them with their content slots; slides.createFromLayout builds one.",
82
+ "whenToUse": "The default way to add a slide. Choose the layout that fits the content, fill its slots with text/bullets/data, and the engine places themed, contrast-safe elements. Only fall back to manual element placement for bespoke slides a layout can't express."
83
+ },
69
84
  {
70
85
  "id": "slides",
71
- "commandCount": 17,
86
+ "commandCount": 18,
72
87
  "title": "Slides",
73
- "summary": "Create, read, update, delete, duplicate, move, select slides; set background, transition and speaker remark.",
74
- "whenToUse": "Add one slide per idea; capture the returned slide id and reuse it for every element you place on that slide."
88
+ "summary": "Create slides from layouts (slides.createFromLayout) or blank; read, update, delete, duplicate, move, select; set background, transition and speaker remark.",
89
+ "whenToUse": "Prefer slides.createFromLayout (one call per slide). When building manually, add one slide per idea and reuse the returned slide id for every element."
75
90
  },
76
91
  {
77
92
  "id": "elements",
@@ -91,8 +106,8 @@
91
106
  "id": "text",
92
107
  "commandCount": 11,
93
108
  "title": "Text",
94
- "summary": "Text element create/update plus content helpers. Accepts Markdown via text.create({ markdown }) and text.setMarkdown.",
95
- "whenToUse": "Place titles, body copy and captions. Author content as HTML, or pass Markdown and let the bridge convert it."
109
+ "summary": "Text element create/update plus content helpers. Author content as Markdown (text.create({ markdown }) / text.setMarkdown) or plain text.",
110
+ "whenToUse": "For manual slides only — layouts already place titles, body and captions. Pass Markdown or plain text; do NOT write raw HTML tags (they are escaped and show as literal text). The literal-HTML path (text.setContent / { content }) is reserved for intentionally rendering code-like markup."
96
111
  },
97
112
  {
98
113
  "id": "lines",
@@ -106,7 +121,7 @@
106
121
  "commandCount": 3,
107
122
  "title": "Rich text",
108
123
  "summary": "Document-model edits to a text element's prose: set content, run styles and paragraph attributes.",
109
- "whenToUse": "Use when you need paragraph alignment / inline run styling beyond raw HTML replacement."
124
+ "whenToUse": "Use when you need paragraph alignment / inline run styling on an existing text element."
110
125
  },
111
126
  {
112
127
  "id": "animations",
@@ -285,6 +300,58 @@
285
300
  ]
286
301
  }
287
302
  },
303
+ {
304
+ "name": "deck.applyStyle",
305
+ "domain": "deck",
306
+ "payload": "{ style: string; applyToSlides?: boolean }",
307
+ "returns": "PptistApplyStyleResult",
308
+ "optional": true,
309
+ "doc": {
310
+ "summary": "Apply ONE style preset to the whole deck. Sets the theme (background, fonts, accent palette) and records the active style id so layouts inherit it.",
311
+ "details": "Do this once, up front, before adding slides. After applying, slides.createFromLayout uses the preset's role tokens automatically. Pass applyToSlides:true to also restyle slides you already created.",
312
+ "params": [
313
+ {
314
+ "name": "style",
315
+ "type": "string",
316
+ "required": true,
317
+ "description": "A preset id from styles.catalog (e.g. 'academic', 'minimal', 'bold', 'playful')."
318
+ },
319
+ {
320
+ "name": "applyToSlides",
321
+ "type": "boolean",
322
+ "required": false,
323
+ "description": "Also re-apply fonts/colors to existing slide content."
324
+ }
325
+ ],
326
+ "examples": [
327
+ "await controller.deck.applyStyle('academic')"
328
+ ],
329
+ "tips": [
330
+ "Choose one style and keep it for the whole deck. Do not hand-pick colors or fonts on top of a preset."
331
+ ],
332
+ "related": [
333
+ "styles.catalog",
334
+ "slides.createFromLayout"
335
+ ]
336
+ }
337
+ },
338
+ {
339
+ "name": "styles.catalog",
340
+ "domain": "styles",
341
+ "payload": "undefined",
342
+ "returns": "PptistStyleSummary[]",
343
+ "doc": {
344
+ "summary": "List the available style presets: id, label, description, the heading+body fonts, and a few preview colors.",
345
+ "details": "Read this first. Each preset is a curated, contrast-safe bundle of role colors (background/surface/title/body/muted/rule/accent), a font pairing, and a type scale. Pick exactly one whose tone fits the audience, then apply it with deck.applyStyle.",
346
+ "examples": [
347
+ "const styles = controller.styles.catalog() // -> [{ id:'academic', label:'Academic', ... }, ...]"
348
+ ],
349
+ "related": [
350
+ "deck.applyStyle",
351
+ "layouts.catalog"
352
+ ]
353
+ }
354
+ },
288
355
  {
289
356
  "name": "deck.setViewport",
290
357
  "domain": "deck",
@@ -307,6 +374,23 @@
307
374
  "payload": "{ templates: Parameters<typeof stores.slides.setTemplates>[0] }",
308
375
  "returns": "SlideTemplate[]"
309
376
  },
377
+ {
378
+ "name": "layouts.catalog",
379
+ "domain": "layouts",
380
+ "payload": "undefined",
381
+ "returns": "PptistLayout[]",
382
+ "doc": {
383
+ "summary": "List the compositional slide layouts with their content slots (name, type, required, description).",
384
+ "details": "Each layout is a pre-composed, themed recipe. Read the slots to see what content it needs, then call slides.createFromLayout with that layout id and a slots object.",
385
+ "examples": [
386
+ "const layouts = controller.layouts.catalog() // -> [{ id:'bullets', slots:[{ name:'title', ... }, { name:'bullets', ... }] }, ...]"
387
+ ],
388
+ "related": [
389
+ "slides.createFromLayout",
390
+ "styles.catalog"
391
+ ]
392
+ }
393
+ },
310
394
  {
311
395
  "name": "slides.list",
312
396
  "domain": "slides",
@@ -378,6 +462,62 @@
378
462
  ]
379
463
  }
380
464
  },
465
+ {
466
+ "name": "slides.createFromLayout",
467
+ "domain": "slides",
468
+ "payload": "PptistCreateFromLayoutInput",
469
+ "returns": "PptistCreateFromLayoutResult",
470
+ "doc": {
471
+ "summary": "Create a new themed slide from a layout id + content slots. The PREFERRED way to add a slide.",
472
+ "details": "The engine places contrast-safe, themed elements using the active style preset — you do NOT pick colors, fonts, sizes or coordinates. Fill the layout's slots (see layouts.catalog) with Markdown/plain-text strings, arrays (for bullets), or structured values (chart/comparison data). Do not pass HTML. If a required slot is missing the command fails with a clear message; non-fatal issues (e.g. a missing optional image) come back as warnings.",
473
+ "params": [
474
+ {
475
+ "name": "layout",
476
+ "type": "string",
477
+ "required": true,
478
+ "description": "Layout id from layouts.catalog (e.g. 'title', 'bullets', 'twoColumn', 'imageText', 'bigStat', 'quote', 'chart', 'comparison', 'section', 'closing')."
479
+ },
480
+ {
481
+ "name": "slots",
482
+ "type": "Record<string, unknown>",
483
+ "required": true,
484
+ "description": "Content for the layout's slots. Strings are Markdown/plain text; bullets accept string arrays; chart/comparison take labels/series/rows."
485
+ },
486
+ {
487
+ "name": "style",
488
+ "type": "string",
489
+ "required": false,
490
+ "description": "Override the style preset for this slide; defaults to the deck's active style."
491
+ },
492
+ {
493
+ "name": "index",
494
+ "type": "number",
495
+ "required": false,
496
+ "description": "Insert position; appends when omitted."
497
+ },
498
+ {
499
+ "name": "background",
500
+ "type": "'auto' | 'feature' | 'plain'",
501
+ "required": false,
502
+ "description": "Background override; 'auto' uses the layout default (dark for title/section/closing)."
503
+ }
504
+ ],
505
+ "examples": [
506
+ "await controller.slides.createFromLayout({ layout:'title', slots:{ eyebrow:'Biology 101', title:'Cellular Respiration', subtitle:'How cells release energy' } })",
507
+ "await controller.slides.createFromLayout({ layout:'bullets', slots:{ title:'Key stages', bullets:['Glycolysis','Krebs cycle','Electron transport chain'] } })",
508
+ "await controller.slides.createFromLayout({ layout:'chart', slots:{ title:'ATP yield by stage', chartType:'column', labels:['Glycolysis','Krebs','ETC'], series:[2, 2, 34] } })"
509
+ ],
510
+ "tips": [
511
+ "One layout call creates a complete, themed slide. After creating/editing a slide, look at a screenshot and fix any overflow before moving on.",
512
+ "Choose the layout by content shape: a list -> bullets; two groups -> twoColumn; a visual + text -> imageText; a metric -> bigStat; data -> chart; options -> comparison."
513
+ ],
514
+ "related": [
515
+ "layouts.catalog",
516
+ "deck.applyStyle",
517
+ "slides.create"
518
+ ]
519
+ }
520
+ },
381
521
  {
382
522
  "name": "slides.insert",
383
523
  "domain": "slides",
@@ -498,8 +638,8 @@
498
638
  "payload": "{ slideId?: string; index?: number; element: Partial<PPTElement> & { type: PPTElement['type'] }; select?: boolean }",
499
639
  "returns": "PPTElement",
500
640
  "doc": {
501
- "summary": "Create any element type on a slide. payload.element.type is required.",
502
- "details": "Generic creator across all element types. For text you can use { type:'text', content } (HTML). Prefer the typed creators (text.create, shapes.create, charts.create, tables.create) for richer, validated input. Provide left/top/width/height in canvas px and rotate in degrees.",
641
+ "summary": "Create any element type on a slide (manual placement). payload.element.type is required.",
642
+ "details": "Generic creator across all element types, for bespoke slides a layout can't express. Prefer slides.createFromLayout for whole slides, or the typed creators (text.create, shapes.create, charts.create, tables.create) for single elements. Provide left/top/width/height in canvas px and rotate in degrees. For text, pass Markdown via text.create instead of hand-writing HTML here.",
503
643
  "params": [
504
644
  {
505
645
  "name": "slideId",
@@ -751,8 +891,8 @@
751
891
  "payload": "PptistCreateTextInput | undefined",
752
892
  "returns": "PPTTextElement",
753
893
  "doc": {
754
- "summary": "Create a text element. Accepts HTML via content, or Markdown via markdown (converted to HTML).",
755
- "details": "If element.content or content (HTML) is given it wins; otherwise markdown is converted to HTML. Size text via inline styles in the HTML; use defaultColor for the fallback color.",
894
+ "summary": "Create a text element (manual placement). Author content as Markdown via `markdown` (recommended) or plain text via `content`.",
895
+ "details": "Pass `markdown` for formatted copy (the bridge converts it to the HTML PPTist stores). `content` is treated as literal markup pass plain text there, or intentional HTML only when you specifically want to render markup (e.g. a code snippet). Do NOT type raw HTML tags into `markdown`: they are escaped and appear as literal text (the bridge warns when it detects this). The fallback color/font come from defaultColor/defaultFontName.",
756
896
  "params": [
757
897
  {
758
898
  "name": "slideId",
@@ -761,16 +901,16 @@
761
901
  "description": "Target slide."
762
902
  },
763
903
  {
764
- "name": "content",
904
+ "name": "markdown",
765
905
  "type": "string",
766
906
  "required": false,
767
- "description": "HTML content (wins over markdown)."
907
+ "description": "Markdown content (recommended). Converted to HTML."
768
908
  },
769
909
  {
770
- "name": "markdown",
910
+ "name": "content",
771
911
  "type": "string",
772
912
  "required": false,
773
- "description": "Markdown content; converted to HTML."
913
+ "description": "Literal content (plain text, or intentional HTML for code-like markup). Wins over markdown."
774
914
  },
775
915
  {
776
916
  "name": "element",
@@ -781,16 +921,16 @@
781
921
  ],
782
922
  "examples": [
783
923
  "controller.text.create({ slideId, markdown: '**Key finding:** treated group improved 18%', element: { left:520, top:130, width:440, height:300, rotate:0, defaultColor:'#2D2D2D' } })",
784
- "controller.text.create({ slideId, content:'<p><span style=\"font-size:40px;color:#1F4E79\"><strong>Methods</strong></span></p>', element:{ left:40, top:40, width:920, height:90, rotate:0 } })"
924
+ "controller.text.create({ slideId, markdown: '- First point\\n- Second point\\n- Third point', element:{ left:40, top:140, width:920, height:300, rotate:0 } })"
785
925
  ],
786
926
  "tips": [
787
- "Flavor: markdown-it + markdown-it-texmath (KaTeX)."
927
+ "Prefer slides.createFromLayout for whole slides. Markdown flavor: markdown-it + markdown-it-texmath (KaTeX). Write Markdown, not HTML."
788
928
  ],
789
929
  "related": [
790
930
  "text.setMarkdown",
791
931
  "text.setContent",
792
932
  "richText.setContent",
793
- "elements.create"
933
+ "slides.createFromLayout"
794
934
  ]
795
935
  }
796
936
  },
@@ -818,7 +958,8 @@
818
958
  "payload": "{ elementId: string; slideId?: string; content: string }",
819
959
  "returns": "PPTTextElement",
820
960
  "doc": {
821
- "summary": "Replace a text element's HTML content verbatim.",
961
+ "summary": "Replace a text element's content with a literal string (the literal-markup path).",
962
+ "details": "Use for plain text, or for intentionally rendering HTML markup (e.g. a code snippet). For normal formatted copy use text.setMarkdown instead.",
822
963
  "related": [
823
964
  "text.setMarkdown",
824
965
  "richText.setContent"
@@ -832,6 +973,7 @@
832
973
  "returns": "PPTTextElement",
833
974
  "doc": {
834
975
  "summary": "Replace a text element's content from a Markdown string (converted to HTML).",
976
+ "details": "Author in Markdown. Raw HTML tags are escaped (they would render as literal text) and trigger a warning — use Markdown syntax instead.",
835
977
  "examples": [
836
978
  "controller.text.setMarkdown(elementId, '- First point\\n- Second point\\n- Third point')"
837
979
  ],
@@ -1489,17 +1631,43 @@
1489
1631
  }
1490
1632
  ],
1491
1633
  "guides": [
1634
+ {
1635
+ "id": "styles-and-layouts",
1636
+ "title": "How to build a deck (styles + layouts)",
1637
+ "summary": "The recommended flow: apply one style, then add each slide with a layout. The engine handles design.",
1638
+ "body": [
1639
+ "1. Read styles.catalog and pick exactly ONE preset whose tone fits the audience (e.g. 'academic' for lessons, 'minimal' for crisp talks, 'bold' for keynotes, 'playful' for younger groups).",
1640
+ "2. Apply it once: deck.applyStyle('<id>'). This sets the palette, fonts and type scale for the whole deck. Do not hand-pick colors or fonts after this.",
1641
+ "3. Read layouts.catalog to see the available slide recipes and their content slots.",
1642
+ "4. For each slide, call slides.createFromLayout with the layout that matches the content shape and fill its slots: a list -> 'bullets'; two groups -> 'twoColumn'; a visual + explanation -> 'imageText'; a headline metric -> 'bigStat'; a quotation -> 'quote'; data -> 'chart'; options across attributes -> 'comparison'; opener -> 'title'; part break -> 'section'; wrap-up -> 'closing'.",
1643
+ "5. Fill slots with Markdown/plain-text strings and arrays (bullets) or structured data (chart labels/series, comparison rows). Never pass HTML.",
1644
+ "6. After creating or editing a slide, look at a screenshot of it. Check for text overflow, empty/placeholder content, and balance; fix issues before moving to the next slide. Trust the screenshot over your assumptions.",
1645
+ "7. Only drop to manual element placement (slides.create + text/shapes/charts) for a bespoke slide no layout can express."
1646
+ ]
1647
+ },
1648
+ {
1649
+ "id": "content-authoring",
1650
+ "title": "Authoring content (Markdown / plain text / structured data — not HTML)",
1651
+ "summary": "What to put in text and layout slots, and why raw HTML does not belong there.",
1652
+ "body": [
1653
+ "Layout slots and the markdown text path accept Markdown, plain text, or structured values (arrays for bullets; { labels, series } for charts; rows for comparison). The engine renders them into clean, themed HTML for you.",
1654
+ "Do NOT write raw HTML tags (<div>, <span style>, <br>, <b>, ...) into Markdown/plain-text inputs. They are ESCAPED and appear as literal angle-bracket text on the slide. The bridge attaches a warning when it detects this — treat that warning as a must-fix.",
1655
+ "Use Markdown syntax for emphasis: **bold**, _italic_, `code`, and - / 1. for lists. Math uses $...$ / $$...$$ (KaTeX).",
1656
+ "The only place literal HTML is appropriate is the explicit literal path (text.setContent / element.content) when you intentionally want to render markup — for example, displaying an HTML code snippet as content. Even then, prefer a fenced code block in Markdown when you just want code to look like code.",
1657
+ "If a screenshot shows literal tags or markup characters on a slide, you used the wrong path: re-author the text as Markdown via text.setMarkdown, or rebuild the slide with slides.createFromLayout."
1658
+ ]
1659
+ },
1492
1660
  {
1493
1661
  "id": "getting-started",
1494
- "title": "How to build a deck",
1495
- "summary": "The read -> theme -> per-slide batch -> review loop the bridge is designed for.",
1662
+ "title": "Manual placement (fallback)",
1663
+ "summary": "For bespoke slides a layout can't express: the read -> style -> per-slide batch -> review loop.",
1496
1664
  "body": [
1497
- "1. Read the current deck (controller.export.json() or deck.get) and the design tokens (controller.docs().designSystem).",
1498
- "2. Set the deck theme once with deck.setTheme so element defaults inherit your palette and font.",
1499
- "3. For each slide: create the slide, capture result.data.id, then add its elements in a single executeBatch so the slide is one undo step.",
1500
- "4. Place elements in canvas px (default 1000 x 562.5). Keep a 40px margin and a clear visual hierarchy: title row, content area, footer/citation.",
1501
- "5. Author body text in Markdown (text.create({ markdown }) / text.setMarkdown) or HTML; use inline font-size styles in HTML when you need exact sizes.",
1502
- "6. Review and iterate. Use meta.dryRun to validate a risky payload before applying it."
1665
+ "Prefer styles + layouts (see the styles-and-layouts guide). Use manual placement only when no layout fits.",
1666
+ "1. Read the current deck (controller.export.json() or deck.get) and apply a style (deck.applyStyle) so element defaults inherit a coherent palette and font.",
1667
+ "2. For each slide: create the slide, capture result.data.id, then add its elements in a single executeBatch so the slide is one undo step.",
1668
+ "3. Place elements in canvas px (default 1000 x 562.5). Keep a 40px margin and a clear visual hierarchy: title row, content area, footer/citation.",
1669
+ "4. Author body text in Markdown (text.create({ markdown }) / text.setMarkdown), never raw HTML.",
1670
+ "5. Screenshot the slide and fix overflow/contrast/alignment before moving on. Use meta.dryRun to validate a risky payload before applying it."
1503
1671
  ]
1504
1672
  },
1505
1673
  {
@@ -1630,6 +1798,7 @@
1630
1798
  "PptistAnimationPreset": "export interface PptistAnimationPreset { name: string; value: string }",
1631
1799
  "PptistAnimationPresetGroup": "export interface PptistAnimationPresetGroup { type: string; name: string; children: PptistAnimationPreset[] }",
1632
1800
  "PptistAnimationSequenceStep": "export interface PptistAnimationSequenceStep { index: number; animations: PPTAnimation[]; autoNext: boolean }",
1801
+ "PptistApplyStyleResult": "export interface PptistApplyStyleResult { styleId: string; theme: SlideTheme }",
1633
1802
  "PptistAudioElementPatch": "export type PptistAudioElementPatch = Partial<Pick<PPTAudioElement, 'src' | 'ext' | 'autoplay' | 'loop' | 'color' | 'fixedRatio' | 'link' | 'name' | 'lock' | 'groupId'>> & { transform?: PptistAudioTransformPatch }",
1634
1803
  "PptistAudioSourceInput": "export type PptistAudioSourceInput = PptistMediaAssetInput",
1635
1804
  "PptistAudioTransformPatch": "export type PptistAudioTransformPatch = Pick<PptistElementTransformPatch, 'left' | 'top' | 'width' | 'height' | 'rotate'>",
@@ -1637,6 +1806,8 @@
1637
1806
  "PptistChartElementPatch": "export interface PptistChartElementPatch { chartType?: ChartType; data?: ChartData; options?: ChartOptions; fill?: PPTChartElement['fill']; outline?: Partial<NonNullable<PPTChartElement['outline']>>; themeColors?: string[]; textColor?: string; lineColor?: string }",
1638
1807
  "PptistCreateAudioInput": "export interface PptistCreateAudioInput extends PptistAudioElementPatch { id?: string; source?: PptistAudioSourceInput; slideId?: string; index?: number; select?: boolean }",
1639
1808
  "PptistCreateChartInput": "export type PptistCreateChartInput = PptistChartElementPatch & Partial<Pick<PPTChartElement, 'id' | 'left' | 'top' | 'width' | 'height' | 'rotate'>> & { slideId?: string; index?: number; select?: boolean }",
1809
+ "PptistCreateFromLayoutInput": "export interface PptistCreateFromLayoutInput { layout: string; slots?: Record<string, unknown>; style?: string; index?: number; select?: boolean; background?: PptistLayoutBackgroundMode }",
1810
+ "PptistCreateFromLayoutResult": "export interface PptistCreateFromLayoutResult { slideId: string; elementIds: string[]; layout: string; styleId: string }",
1640
1811
  "PptistCreateLatexElementInput": "export interface PptistCreateLatexElementInput { slideId?: string; index?: number; element: PptistLatexElementInput; select?: boolean }",
1641
1812
  "PptistCreateLineElementInput": "export interface PptistCreateLineElementInput { slideId?: string; index?: number; element: PptistLineElementInput; select?: boolean }",
1642
1813
  "PptistCreateTableInput": "export type PptistCreateTableInput = PptistTableElementPatch & { id?: string; slideId?: string; index?: number; select?: boolean; element?: Partial<PPTTableElement> }",
@@ -1663,6 +1834,9 @@
1663
1834
  "PptistLatexElementInput": "export type PptistLatexElementInput = PptistLatexElementSizing & Pick<PPTLatexElement, 'latex' | 'path'> & Partial<Pick<PPTLatexElement, 'id' | 'color' | 'strokeWidth' | 'viewBox' | 'fixedRatio' | 'link' | 'name' | 'lock' | 'groupId'>>",
1664
1835
  "PptistLatexElementPatch": "export type PptistLatexElementPatch = Partial<PptistLatexElementSizing & Pick<PPTLatexElement, 'latex' | 'path' | 'color' | 'strokeWidth' | 'viewBox' | 'fixedRatio' | 'link' | 'name' | 'lock' | 'groupId'>>",
1665
1836
  "PptistLatexElementSizing": "export interface PptistLatexElementSizing { left?: number; top?: number; width?: number; height?: number; rotate?: number }",
1837
+ "PptistLayout": "export interface PptistLayout { id: string; label: string; summary: string; bestFor: string; feature: boolean; slots: PptistLayoutSlotDef[] }",
1838
+ "PptistLayoutBackgroundMode": "export type PptistLayoutBackgroundMode = 'auto' | 'feature' | 'plain'",
1839
+ "PptistLayoutSlotDef": "export interface PptistLayoutSlotDef { name: string; type: 'text' | 'bullets' | 'image' | 'chart' | 'stats' | 'rows'; required: boolean; description: string }",
1666
1840
  "PptistLineDirectionInput": "export type PptistLineDirectionInput = Broken2LineDirection | 'auto'",
1667
1841
  "PptistLineElementInput": "export type PptistLineElementInput = Partial<Pick<PPTLineElement, 'id' | 'left' | 'top' | 'width' | 'style' | 'color' | 'points' | 'shadow' | 'broken' | 'broken2' | 'broken2Direction' | 'curve' | 'cubic' | 'link' | 'name' | 'lock' | 'groupId'>> & Pick<PPTLineElement, 'start' | 'end'>",
1668
1842
  "PptistLineElementPatch": "export type PptistLineElementPatch = Partial<Pick<PPTLineElement, 'left' | 'top' | 'width' | 'start' | 'end' | 'style' | 'color' | 'points' | 'shadow' | 'broken' | 'broken2' | 'broken2Direction' | 'curve' | 'cubic' | 'link' | 'name' | 'lock' | 'groupId'>>",
@@ -1686,6 +1860,8 @@
1686
1860
  "PptistSlideReference": "export type PptistSlideReference = string | number",
1687
1861
  "PptistSlideThemePatch": "export type PptistSlideThemePatch = Omit<Partial<SlideTheme>, 'outline' | 'shadow'> & { outline?: Partial<SlideTheme['outline']>; shadow?: Partial<SlideTheme['shadow']> }",
1688
1862
  "PptistSlideTransition": "export interface PptistSlideTransition { slideId: string; turningMode?: TurningMode }",
1863
+ "PptistStyleFonts": "export interface PptistStyleFonts { heading: string; body: string }",
1864
+ "PptistStyleSummary": "export interface PptistStyleSummary { id: string; label: string; description: string; fonts: PptistStyleFonts; preview: { background: string; title: string; body: string; accent: string; featureBackground: string } }",
1689
1865
  "PptistTableElementPatch": "export type PptistTableElementPatch = Partial<Omit<PPTTableElement, 'type' | 'id' | 'outline' | 'theme'>> & { outline?: Partial<PPTTableElement['outline']>; theme?: Partial<NonNullable<PPTTableElement['theme']>> }",
1690
1866
  "PptistVideoPatch": "export type PptistVideoPatch = PptistVideoPlaybackPatch & PptistVideoSizePatch & PptistVideoPositionPatch & PptistVideoStylePatch",
1691
1867
  "PptistVideoPlaybackPatch": "export interface PptistVideoPlaybackPatch { src?: string; ext?: string; autoplay?: boolean; poster?: string }",
@@ -1739,7 +1915,7 @@
1739
1915
  "SlideBackgroundImageSize": "export type SlideBackgroundImageSize = 'cover' | 'contain' | 'repeat'",
1740
1916
  "SlideBackgroundType": "export type SlideBackgroundType = 'solid' | 'image' | 'gradient'",
1741
1917
  "SlideTemplate": "export interface SlideTemplate { name: string; id: string; cover: string; origin?: string }",
1742
- "SlideTheme": "export interface SlideTheme { backgroundColor: string; themeColors: string[]; fontColor: string; fontName: string; outline: PPTElementOutline; shadow: PPTElementShadow }",
1918
+ "SlideTheme": "export interface SlideTheme { backgroundColor: string; themeColors: string[]; fontColor: string; fontName: string; outline: PPTElementOutline; shadow: PPTElementShadow; styleId?: string }",
1743
1919
  "SlideType": "export type SlideType = 'cover' | 'contents' | 'transition' | 'content' | 'end'",
1744
1920
  "TableCell": "export interface TableCell { id: string; colspan: number; rowspan: number; text: string; style?: TableCellStyle }",
1745
1921
  "TableCellStyle": "export interface TableCellStyle { bold?: boolean; em?: boolean; underline?: boolean; strikethrough?: boolean; color?: string; backcolor?: string; fontsize?: string; fontname?: string; align?: TextAlign; vAlign?: TextAlignVertical }",