@json-to-office/jto 2.3.1 → 3.0.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 (57) hide show
  1. package/dist/cli.js +123 -39
  2. package/dist/cli.js.map +1 -1
  3. package/dist/client/assets/HomePage-BlzZ7qG4.js +245 -0
  4. package/dist/client/assets/HomePage-BlzZ7qG4.js.map +1 -0
  5. package/dist/client/assets/{JsonEditorPage-DR9E7ul1.js → JsonEditorPage-kWuP_kL3.js} +3 -3
  6. package/dist/client/assets/{JsonEditorPage-DR9E7ul1.js.map → JsonEditorPage-kWuP_kL3.js.map} +1 -1
  7. package/dist/client/assets/{MonacoPluginProvider-CdHBp1cD.js → MonacoPluginProvider-Dbv1PrO2.js} +6 -6
  8. package/dist/client/assets/{MonacoPluginProvider-CdHBp1cD.js.map → MonacoPluginProvider-Dbv1PrO2.js.map} +1 -1
  9. package/dist/client/assets/{_virtual_jto-plugin-type-libs-BlMraosv.js → _virtual_jto-plugin-type-libs-B6KyD9RL.js} +7912 -3250
  10. package/dist/client/assets/{_virtual_jto-plugin-type-libs-BlMraosv.js.map → _virtual_jto-plugin-type-libs-B6KyD9RL.js.map} +1 -1
  11. package/dist/client/assets/_virtual_jto-sandbox-runtime-Bzo2M5U7.js +2 -0
  12. package/dist/client/assets/_virtual_jto-sandbox-runtime-Bzo2M5U7.js.map +1 -0
  13. package/dist/client/assets/editor-CwEocOY2.js +16 -0
  14. package/dist/client/assets/editor-CwEocOY2.js.map +1 -0
  15. package/dist/client/assets/editor-monaco-json-D_oiidNg.js +24 -0
  16. package/dist/client/assets/editor-monaco-json-D_oiidNg.js.map +1 -0
  17. package/dist/client/assets/index--kF4jVbp.css +1 -0
  18. package/dist/client/assets/index-DFJaEoi0.js +27 -0
  19. package/dist/client/assets/index-DFJaEoi0.js.map +1 -0
  20. package/dist/client/assets/index-UheDso2P.js +2 -0
  21. package/dist/client/assets/index-UheDso2P.js.map +1 -0
  22. package/dist/client/assets/preview-CWdUATNl.js +4 -0
  23. package/dist/client/assets/preview-CWdUATNl.js.map +1 -0
  24. package/dist/client/assets/useQualityAnalysis-Cl4QPeOT.js +6 -0
  25. package/dist/client/assets/useQualityAnalysis-Cl4QPeOT.js.map +1 -0
  26. package/dist/client/index.html +2 -2
  27. package/dist/client/templates/client-report-blocks.docx.json +791 -0
  28. package/dist/client/templates/consulting-deck-blocks.pptx.json +455 -0
  29. package/dist/client/templates/data-report-presentation.pptx.json +108 -36
  30. package/dist/client/templates/management-plan.pptx.json +100 -22
  31. package/dist/client/templates/minimalist-pitch-deck.pptx.json +172 -101
  32. package/dist/prompts/instructions-edit-document-pptx-blocks.md +77 -0
  33. package/dist/prompts/instructions-edit-document-pptx-slides.md +15 -21
  34. package/dist/prompts/instructions-edit-document-pptx.md +34 -53
  35. package/dist/prompts/instructions-edit-pptx.md +9 -8
  36. package/dist/prompts/instructions-generate-pptx.md +13 -17
  37. package/dist/prompts/pptx-core.md +104 -127
  38. package/dist/prompts/pptx-design.md +115 -109
  39. package/package.json +10 -9
  40. package/dist/client/assets/HomePage-Cq_CI7_t.js +0 -251
  41. package/dist/client/assets/HomePage-Cq_CI7_t.js.map +0 -1
  42. package/dist/client/assets/_virtual_jto-sandbox-runtime-XWrhySEO.js +0 -2
  43. package/dist/client/assets/_virtual_jto-sandbox-runtime-XWrhySEO.js.map +0 -1
  44. package/dist/client/assets/editor-D-LgWzQZ.js +0 -16
  45. package/dist/client/assets/editor-D-LgWzQZ.js.map +0 -1
  46. package/dist/client/assets/editor-monaco-json-BVkSRpj1.js +0 -24
  47. package/dist/client/assets/editor-monaco-json-BVkSRpj1.js.map +0 -1
  48. package/dist/client/assets/editor-refs-store-COFjkOeo.js +0 -2
  49. package/dist/client/assets/editor-refs-store-COFjkOeo.js.map +0 -1
  50. package/dist/client/assets/index-B9j3hDSy.js +0 -5
  51. package/dist/client/assets/index-B9j3hDSy.js.map +0 -1
  52. package/dist/client/assets/index-Bj6ZAKUc.css +0 -1
  53. package/dist/client/assets/preview-D0HsunpU.js +0 -4
  54. package/dist/client/assets/preview-D0HsunpU.js.map +0 -1
  55. package/dist/client/assets/useQualityAnalysis-PZsxJDvP.js +0 -6
  56. package/dist/client/assets/useQualityAnalysis-PZsxJDvP.js.map +0 -1
  57. package/dist/prompts/instructions-edit-document-pptx-templates.md +0 -63
@@ -58,104 +58,120 @@
58
58
  "color": "text"
59
59
  }
60
60
  },
61
- "templates": [
62
- {
63
- "name": "veil-bottom-right",
64
- "background": {
65
- "gradient": {
66
- "type": "radial",
67
- "focus": "bottomRight",
68
- "stops": [
69
- {
70
- "color": "primary",
71
- "pos": 0
72
- },
73
- {
74
- "color": "primary",
75
- "pos": 79
76
- },
77
- {
78
- "color": "secondary",
79
- "pos": 100
80
- }
81
- ]
61
+ "blocks": {
62
+ "veil-bottom-right": {
63
+ "description": "Slide chrome shared by the veil-bottom-right slides of this deck.",
64
+ "slots": {},
65
+ "slide": {
66
+ "background": {
67
+ "gradient": {
68
+ "type": "radial",
69
+ "focus": "bottomRight",
70
+ "stops": [
71
+ {
72
+ "color": "primary",
73
+ "pos": 0
74
+ },
75
+ {
76
+ "color": "primary",
77
+ "pos": 79
78
+ },
79
+ {
80
+ "color": "secondary",
81
+ "pos": 100
82
+ }
83
+ ]
84
+ }
82
85
  }
83
- }
86
+ },
87
+ "body": []
84
88
  },
85
- {
86
- "name": "veil-top-left",
87
- "background": {
88
- "gradient": {
89
- "type": "radial",
90
- "focus": "topLeft",
91
- "stops": [
92
- {
93
- "color": "primary",
94
- "pos": 0
95
- },
96
- {
97
- "color": "primary",
98
- "pos": 79
99
- },
100
- {
101
- "color": "secondary",
102
- "pos": 100
103
- }
104
- ]
89
+ "veil-top-left": {
90
+ "description": "Slide chrome shared by the veil-top-left slides of this deck.",
91
+ "slots": {},
92
+ "slide": {
93
+ "background": {
94
+ "gradient": {
95
+ "type": "radial",
96
+ "focus": "topLeft",
97
+ "stops": [
98
+ {
99
+ "color": "primary",
100
+ "pos": 0
101
+ },
102
+ {
103
+ "color": "primary",
104
+ "pos": 79
105
+ },
106
+ {
107
+ "color": "secondary",
108
+ "pos": 100
109
+ }
110
+ ]
111
+ }
105
112
  }
106
- }
113
+ },
114
+ "body": []
107
115
  },
108
- {
109
- "name": "dawn-diagonal",
110
- "background": {
111
- "gradient": {
112
- "type": "linear",
113
- "angle": 110,
114
- "stops": [
115
- {
116
- "color": "primary",
117
- "pos": 0
118
- },
119
- {
120
- "color": "secondary",
121
- "pos": 23
122
- },
123
- {
124
- "color": "background2",
125
- "pos": 73
126
- },
127
- {
128
- "color": "background2",
129
- "pos": 100
130
- }
131
- ]
116
+ "dawn-diagonal": {
117
+ "description": "Slide chrome shared by the dawn-diagonal slides of this deck.",
118
+ "slots": {},
119
+ "slide": {
120
+ "background": {
121
+ "gradient": {
122
+ "type": "linear",
123
+ "angle": 110,
124
+ "stops": [
125
+ {
126
+ "color": "primary",
127
+ "pos": 0
128
+ },
129
+ {
130
+ "color": "secondary",
131
+ "pos": 23
132
+ },
133
+ {
134
+ "color": "background2",
135
+ "pos": 73
136
+ },
137
+ {
138
+ "color": "background2",
139
+ "pos": 100
140
+ }
141
+ ]
142
+ }
132
143
  }
133
- }
144
+ },
145
+ "body": []
134
146
  },
135
- {
136
- "name": "haze-bottom-left",
137
- "background": {
138
- "gradient": {
139
- "type": "radial",
140
- "focus": "bottomLeft",
141
- "stops": [
142
- {
143
- "color": "secondary",
144
- "pos": 0
145
- },
146
- {
147
- "color": "background2",
148
- "pos": 38
149
- },
150
- {
151
- "color": "background2",
152
- "pos": 100
153
- }
154
- ]
147
+ "haze-bottom-left": {
148
+ "description": "Slide chrome shared by the haze-bottom-left slides of this deck.",
149
+ "slots": {},
150
+ "slide": {
151
+ "background": {
152
+ "gradient": {
153
+ "type": "radial",
154
+ "focus": "bottomLeft",
155
+ "stops": [
156
+ {
157
+ "color": "secondary",
158
+ "pos": 0
159
+ },
160
+ {
161
+ "color": "background2",
162
+ "pos": 38
163
+ },
164
+ {
165
+ "color": "background2",
166
+ "pos": 100
167
+ }
168
+ ]
169
+ }
155
170
  }
156
- }
171
+ },
172
+ "body": []
157
173
  }
158
- ]
174
+ }
159
175
  },
160
176
  "children": [
161
177
  {
@@ -405,10 +421,15 @@
405
421
  {
406
422
  "name": "slide",
407
423
  "props": {
408
- "template": "veil-bottom-right",
409
424
  "notes": "Welcome slide with stat and image."
410
425
  },
411
426
  "children": [
427
+ {
428
+ "name": "block",
429
+ "props": {
430
+ "ref": "veil-bottom-right"
431
+ }
432
+ },
412
433
  {
413
434
  "name": "text",
414
435
  "props": {
@@ -545,10 +566,15 @@
545
566
  {
546
567
  "name": "slide",
547
568
  "props": {
548
- "template": "veil-top-left",
549
569
  "notes": "Vision statement with stat and two square images."
550
570
  },
551
571
  "children": [
572
+ {
573
+ "name": "block",
574
+ "props": {
575
+ "ref": "veil-top-left"
576
+ }
577
+ },
552
578
  {
553
579
  "name": "text",
554
580
  "props": {
@@ -717,10 +743,15 @@
717
743
  {
718
744
  "name": "slide",
719
745
  "props": {
720
- "template": "dawn-diagonal",
721
746
  "notes": "Problem and solution overview."
722
747
  },
723
748
  "children": [
749
+ {
750
+ "name": "block",
751
+ "props": {
752
+ "ref": "dawn-diagonal"
753
+ }
754
+ },
724
755
  {
725
756
  "name": "text",
726
757
  "props": {
@@ -1746,10 +1777,15 @@
1746
1777
  {
1747
1778
  "name": "slide",
1748
1779
  "props": {
1749
- "template": "veil-bottom-right",
1750
1780
  "notes": "Product overview with right image band."
1751
1781
  },
1752
1782
  "children": [
1783
+ {
1784
+ "name": "block",
1785
+ "props": {
1786
+ "ref": "veil-bottom-right"
1787
+ }
1788
+ },
1753
1789
  {
1754
1790
  "name": "image",
1755
1791
  "props": {
@@ -1879,10 +1915,15 @@
1879
1915
  {
1880
1916
  "name": "slide",
1881
1917
  "props": {
1882
- "template": "veil-top-left",
1883
1918
  "notes": "Three product feature images."
1884
1919
  },
1885
1920
  "children": [
1921
+ {
1922
+ "name": "block",
1923
+ "props": {
1924
+ "ref": "veil-top-left"
1925
+ }
1926
+ },
1886
1927
  {
1887
1928
  "name": "image",
1888
1929
  "props": {
@@ -2031,10 +2072,15 @@
2031
2072
  "meta": {
2032
2073
  "title": "Case timeline"
2033
2074
  },
2034
- "template": "dawn-diagonal",
2035
2075
  "notes": "Arc timeline with four cases."
2036
2076
  },
2037
2077
  "children": [
2078
+ {
2079
+ "name": "block",
2080
+ "props": {
2081
+ "ref": "dawn-diagonal"
2082
+ }
2083
+ },
2038
2084
  {
2039
2085
  "name": "text",
2040
2086
  "props": {
@@ -2383,10 +2429,15 @@
2383
2429
  "meta": {
2384
2430
  "title": "Market overview"
2385
2431
  },
2386
- "template": "haze-bottom-left",
2387
2432
  "notes": "Market overview pies."
2388
2433
  },
2389
2434
  "children": [
2435
+ {
2436
+ "name": "block",
2437
+ "props": {
2438
+ "ref": "haze-bottom-left"
2439
+ }
2440
+ },
2390
2441
  {
2391
2442
  "name": "text",
2392
2443
  "props": {
@@ -2835,10 +2886,15 @@
2835
2886
  "meta": {
2836
2887
  "title": "Competitive landscape"
2837
2888
  },
2838
- "template": "veil-bottom-right",
2839
2889
  "notes": "Competitive landscape stats and images."
2840
2890
  },
2841
2891
  "children": [
2892
+ {
2893
+ "name": "block",
2894
+ "props": {
2895
+ "ref": "veil-bottom-right"
2896
+ }
2897
+ },
2842
2898
  {
2843
2899
  "name": "image",
2844
2900
  "props": {
@@ -3021,10 +3077,15 @@
3021
3077
  "meta": {
3022
3078
  "title": "Laptop mockup"
3023
3079
  },
3024
- "template": "veil-top-left",
3025
3080
  "notes": "Laptop mockup slide."
3026
3081
  },
3027
3082
  "children": [
3083
+ {
3084
+ "name": "block",
3085
+ "props": {
3086
+ "ref": "veil-top-left"
3087
+ }
3088
+ },
3028
3089
  {
3029
3090
  "name": "shape",
3030
3091
  "props": {
@@ -3263,10 +3324,15 @@
3263
3324
  "meta": {
3264
3325
  "title": "Values"
3265
3326
  },
3266
- "template": "dawn-diagonal",
3267
3327
  "notes": "Values list and percent column."
3268
3328
  },
3269
3329
  "children": [
3330
+ {
3331
+ "name": "block",
3332
+ "props": {
3333
+ "ref": "dawn-diagonal"
3334
+ }
3335
+ },
3270
3336
  {
3271
3337
  "name": "image",
3272
3338
  "props": {
@@ -3427,10 +3493,15 @@
3427
3493
  "meta": {
3428
3494
  "title": "Revenue KPIs"
3429
3495
  },
3430
- "template": "haze-bottom-left",
3431
3496
  "notes": "Revenue KPIs."
3432
3497
  },
3433
3498
  "children": [
3499
+ {
3500
+ "name": "block",
3501
+ "props": {
3502
+ "ref": "haze-bottom-left"
3503
+ }
3504
+ },
3434
3505
  {
3435
3506
  "name": "text",
3436
3507
  "props": {
@@ -0,0 +1,77 @@
1
+ ## Presentation: {{documentName}}
2
+
3
+ ### Current block definitions
4
+
5
+ ```json
6
+ {{blocksText}}
7
+ ```
8
+
9
+ ### Slides invoking them (reference only — do not output these)
10
+
11
+ {{slidesSummary}}
12
+
13
+ You are EDITING the block definitions of this presentation. Output **only new or modified** definitions:
14
+
15
+ ```json
16
+ {
17
+ "blocks": { "<name>": { ...complete definition... } }
18
+ }
19
+ ```
20
+
21
+ Unchanged definitions are automatically preserved — do NOT echo them back.
22
+
23
+ ### Rules for block-scoped editing
24
+
25
+ - Output ONLY definitions you are adding or modifying. Omit unchanged definitions entirely.
26
+ - Do NOT include `"name"`, `"children"` or other top-level keys — only `"blocks"`.
27
+ - When modifying a definition, output the **complete** definition (all its slots, its whole body, its `slide` effects) — not just the changed fields.
28
+ - Keep definition names stable — slides reference them by name. Keep every slot the slides above fill, with the same name and type; renaming or removing one breaks those slides.
29
+ - To DELETE a definition, output `"<name>": null`.
30
+ - New names are lowercase-kebab (`kpi-row`, `two-column`). Each definition needs `slots` and `body`; add `description` and, when the slide should inherit a background or notes, `slide`.
31
+ - Author geometry as percentage frames of the slide, bind sizes to type roles with a `default`, wrap optional slots in `$if`, give titles a `fit`, and put page numbers and trackers in the body.
32
+ - **Component format:** every item in a `body` MUST be `{ "name": "<type>", "props": { ... } }` or a binding directive. Never `{ "type": "...", ... }` with flat props.
33
+
34
+ ### Example
35
+
36
+ **User request:** "Add a source line to the statement block"
37
+
38
+ **Correct output (only the modified definition, complete):**
39
+
40
+ ```json
41
+ {
42
+ "blocks": {
43
+ "statement": {
44
+ "description": "One sentence on an otherwise empty slide, with an optional source.",
45
+ "slots": {
46
+ "text": { "type": "string", "required": true, "maxWords": 30, "role": "actionTitle" },
47
+ "source": { "type": "string", "maxWords": 20, "role": "source" }
48
+ },
49
+ "body": [
50
+ {
51
+ "name": "text",
52
+ "props": {
53
+ "text": { "$slot": "/text" },
54
+ "style": "display",
55
+ "fontSize": { "$theme": "/styles/display/fontSize", "default": 28 },
56
+ "x": "3.75%", "y": "30%", "w": "92.5%", "h": "30%",
57
+ "valign": "middle",
58
+ "fit": { "maxLines": 3, "shrink": [24, 22] }
59
+ }
60
+ },
61
+ {
62
+ "$if": "/source",
63
+ "then": {
64
+ "name": "text",
65
+ "props": {
66
+ "text": { "$slot": "/source" },
67
+ "style": "source",
68
+ "fontSize": { "$theme": "/styles/source/fontSize", "default": 9 },
69
+ "x": "3.75%", "y": "94.5%", "w": "75%", "h": "5%"
70
+ }
71
+ }
72
+ }
73
+ ]
74
+ }
75
+ }
76
+ }
77
+ ```
@@ -1,10 +1,10 @@
1
1
  ## Presentation: {{documentName}}
2
2
 
3
- ### Available Templates (reference only — do not output these)
3
+ ### Available blocks (reference only — do not output these)
4
4
 
5
- {{templatesSummary}}
5
+ {{blocksSummary}}
6
6
 
7
- ### Current Slides
7
+ ### Current slides
8
8
 
9
9
  ```json
10
10
  {{slidesText}}
@@ -21,40 +21,34 @@ You are EDITING the slides of this presentation. Return ONLY the modified slides
21
21
  ### Rules for slide-scoped editing
22
22
 
23
23
  - Output the COMPLETE `children` array — include ALL slides, not just changed ones.
24
- - Do NOT include `"name"` or `"props"` keys — templates and presentation settings are unchanged.
25
- - Reference existing template names from the list above.
26
- - New slides MUST reference existing templates — do not invent new templates.
24
+ - Do NOT include `"name"` or `"props"` keys — the block definitions and presentation settings are unchanged.
25
+ - New slides MUST invoke blocks from the list above — do not define new blocks here and do not add coordinates to an invocation.
27
26
  - Preserve unmodified slides exactly as they appear above.
28
- - When editing a slide, keep its `template` reference and only change `placeholders` content.
29
- - If the presentation uses templates, new slides should also use templates for consistency.
27
+ - When editing a slide that invokes a block, keep its `ref` and change only the `slots`; fill every required slot and respect `maxWords`/`oneLine`.
30
28
  - **Component format:** every component MUST be `{ "name": "<type>", "props": { ... } }`. Never use `{ "type": "...", ... }` with flat props.
31
29
 
32
30
  ### Example
33
31
 
34
32
  **User request:** "Add a slide about pricing"
35
33
 
36
- **Correct output (complete children array with new slide appended):**
34
+ **Correct output (complete children array with the new slide appended):**
37
35
 
38
36
  ```json
39
37
  {
40
38
  "children": [
41
39
  {
42
40
  "name": "slide",
43
- "props": {
44
- "template": "CONTENT_TEMPLATE",
45
- "placeholders": {
46
- "heading": { "name": "text", "props": { "text": "Overview" } }
47
- }
48
- }
41
+ "props": { "meta": { "title": "Overview" } },
42
+ "children": [
43
+ { "name": "block", "props": { "ref": "statement", "slots": { "text": "Growth improved as delivery became reliable." } } }
44
+ ]
49
45
  },
50
46
  {
51
47
  "name": "slide",
52
- "props": {
53
- "template": "CONTENT_TEMPLATE",
54
- "placeholders": {
55
- "heading": { "name": "text", "props": { "text": "Pricing" } }
56
- }
57
- }
48
+ "props": { "meta": { "title": "Pricing" } },
49
+ "children": [
50
+ { "name": "block", "props": { "ref": "statement", "slots": { "text": "Pricing moves to three tiers." } } }
51
+ ]
58
52
  }
59
53
  ]
60
54
  }
@@ -10,11 +10,11 @@ IMPORTANT: This {{contentLabelLower}} already exists. You are EDITING it, not ge
10
10
 
11
11
  ### Rules for editing presentations
12
12
 
13
- - **Preserve all existing templates** in `pptx.props.templates` unless explicitly asked to modify them.
14
- - When adding new slides, **reference existing template names** — do not invent new templates unless the user asks for a new layout.
15
- - When editing a slide, keep its `template` reference and only change the `placeholders` content.
16
- - If the presentation uses templates, new slides should also use templates for consistency.
17
- - **Component format:** every component MUST be `{ "name": "<type>", "props": { ... } }`. Never use `{ "type": "...", ... }` with flat props.
13
+ - **Preserve every definition in `pptx.props.blocks`** unless explicitly asked to change it.
14
+ - When adding slides, **invoke an existing block** — do not define a new one unless the user asks for a new layout, and never add coordinates to an invocation.
15
+ - When editing a slide that invokes a block, keep its `ref` and change only the `slots`.
16
+ - If the presentation uses blocks, new slides should invoke blocks too, for consistency.
17
+ - **Component format:** every component MUST be `{ "name": "<type>", "props": { ... } }`. Never use `{ "type": "...", ... }` with flat props. Never emit `templates`, `template` or `placeholders` keys.
18
18
 
19
19
  ### Example
20
20
 
@@ -24,26 +24,23 @@ IMPORTANT: This {{contentLabelLower}} already exists. You are EDITING it, not ge
24
24
  {
25
25
  "name": "pptx",
26
26
  "props": {
27
- "templates": [
28
- {
29
- "name": "CONTENT_TEMPLATE",
30
- "placeholders": [
31
- { "name": "heading", "type": "title" },
32
- { "name": "body", "type": "body" }
33
- ]
27
+ "theme": "consulting",
28
+ "slideWidth": 13.333,
29
+ "slideHeight": 7.5,
30
+ "blocks": {
31
+ "statement": {
32
+ "slots": { "text": { "type": "string", "required": true, "maxWords": 30 } },
33
+ "body": [{ "name": "text", "props": { "text": { "$slot": "/text" }, "style": "display", "x": "3.75%", "y": "30%", "w": "92.5%", "h": "30%" } }]
34
34
  }
35
- ]
35
+ }
36
36
  },
37
37
  "children": [
38
38
  {
39
39
  "name": "slide",
40
- "props": {
41
- "template": "CONTENT_TEMPLATE",
42
- "placeholders": {
43
- "heading": { "name": "text", "props": { "text": "Overview" } },
44
- "body": { "name": "text", "props": { "text": "Content here." } }
45
- }
46
- }
40
+ "props": { "meta": { "title": "Overview" } },
41
+ "children": [
42
+ { "name": "block", "props": { "ref": "statement", "slots": { "text": "Growth improved as delivery became reliable." } } }
43
+ ]
47
44
  }
48
45
  ]
49
46
  }
@@ -51,52 +48,36 @@ IMPORTANT: This {{contentLabelLower}} already exists. You are EDITING it, not ge
51
48
 
52
49
  **User request:** "Add a slide about pricing"
53
50
 
54
- **Correct output (full document with new slide appended, using existing template):**
51
+ **Correct output (full document with the new slide appended, invoking the existing block):**
55
52
 
56
53
  ```json
57
54
  {
58
55
  "name": "pptx",
59
56
  "props": {
60
- "templates": [
61
- {
62
- "name": "CONTENT_TEMPLATE",
63
- "placeholders": [
64
- { "name": "heading", "type": "title" },
65
- { "name": "body", "type": "body" }
66
- ]
57
+ "theme": "consulting",
58
+ "slideWidth": 13.333,
59
+ "slideHeight": 7.5,
60
+ "blocks": {
61
+ "statement": {
62
+ "slots": { "text": { "type": "string", "required": true, "maxWords": 30 } },
63
+ "body": [{ "name": "text", "props": { "text": { "$slot": "/text" }, "style": "display", "x": "3.75%", "y": "30%", "w": "92.5%", "h": "30%" } }]
67
64
  }
68
- ]
65
+ }
69
66
  },
70
67
  "children": [
71
68
  {
72
69
  "name": "slide",
73
- "props": {
74
- "template": "CONTENT_TEMPLATE",
75
- "placeholders": {
76
- "heading": { "name": "text", "props": { "text": "Overview" } },
77
- "body": { "name": "text", "props": { "text": "Content here." } }
78
- }
79
- }
70
+ "props": { "meta": { "title": "Overview" } },
71
+ "children": [
72
+ { "name": "block", "props": { "ref": "statement", "slots": { "text": "Growth improved as delivery became reliable." } } }
73
+ ]
80
74
  },
81
75
  {
82
76
  "name": "slide",
83
- "props": {
84
- "template": "CONTENT_TEMPLATE",
85
- "placeholders": {
86
- "heading": { "name": "text", "props": { "text": "Pricing" } },
87
- "body": {
88
- "name": "table",
89
- "props": {
90
- "rows": [
91
- ["Plan", "Price"],
92
- ["Starter", "$9/mo"],
93
- ["Pro", "$29/mo"]
94
- ],
95
- "grid": { "column": 0, "row": 2, "columnSpan": 12, "rowSpan": 3 }
96
- }
97
- }
98
- }
99
- }
77
+ "props": { "meta": { "title": "Pricing" } },
78
+ "children": [
79
+ { "name": "block", "props": { "ref": "statement", "slots": { "text": "Pricing moves to three tiers: Starter at $9, Pro at $29, Enterprise on request." } } }
80
+ ]
100
81
  }
101
82
  ]
102
83
  }