@json-to-office/jto 2.4.0 → 3.1.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-D_mB1xuk.js +245 -0
  4. package/dist/client/assets/HomePage-D_mB1xuk.js.map +1 -0
  5. package/dist/client/assets/{JsonEditorPage-DjLAUBv5.js → JsonEditorPage-FZF7bI9j.js} +3 -3
  6. package/dist/client/assets/{JsonEditorPage-DjLAUBv5.js.map → JsonEditorPage-FZF7bI9j.js.map} +1 -1
  7. package/dist/client/assets/{MonacoPluginProvider-D_GUFwWQ.js → MonacoPluginProvider-B7HWmtL0.js} +6 -6
  8. package/dist/client/assets/{MonacoPluginProvider-D_GUFwWQ.js.map → MonacoPluginProvider-B7HWmtL0.js.map} +1 -1
  9. package/dist/client/assets/{_virtual_jto-plugin-type-libs-9elxvZT2.js → _virtual_jto-plugin-type-libs-C1-TFWU1.js} +9195 -4529
  10. package/dist/client/assets/{_virtual_jto-plugin-type-libs-9elxvZT2.js.map → _virtual_jto-plugin-type-libs-C1-TFWU1.js.map} +1 -1
  11. package/dist/client/assets/_virtual_jto-sandbox-runtime-B-I74ajs.js +2 -0
  12. package/dist/client/assets/_virtual_jto-sandbox-runtime-B-I74ajs.js.map +1 -0
  13. package/dist/client/assets/editor-CB0JVQZR.js +16 -0
  14. package/dist/client/assets/editor-CB0JVQZR.js.map +1 -0
  15. package/dist/client/assets/editor-monaco-json-BmaikXAE.js +24 -0
  16. package/dist/client/assets/editor-monaco-json-BmaikXAE.js.map +1 -0
  17. package/dist/client/assets/index--kF4jVbp.css +1 -0
  18. package/dist/client/assets/index-B5xm7tQq.js +27 -0
  19. package/dist/client/assets/index-B5xm7tQq.js.map +1 -0
  20. package/dist/client/assets/index-D4AFQUeZ.js +2 -0
  21. package/dist/client/assets/index-D4AFQUeZ.js.map +1 -0
  22. package/dist/client/assets/preview-D5DLJy12.js +4 -0
  23. package/dist/client/assets/preview-D5DLJy12.js.map +1 -0
  24. package/dist/client/assets/useQualityAnalysis-9ud5tV-u.js +6 -0
  25. package/dist/client/assets/useQualityAnalysis-9ud5tV-u.js.map +1 -0
  26. package/dist/client/index.html +2 -2
  27. package/dist/client/templates/client-report-blocks.docx.json +1224 -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-mtUb6jxc.js +0 -251
  41. package/dist/client/assets/HomePage-mtUb6jxc.js.map +0 -1
  42. package/dist/client/assets/_virtual_jto-sandbox-runtime-Dqq17bow.js +0 -2
  43. package/dist/client/assets/_virtual_jto-sandbox-runtime-Dqq17bow.js.map +0 -1
  44. package/dist/client/assets/editor-ZbEHVEFs.js +0 -16
  45. package/dist/client/assets/editor-ZbEHVEFs.js.map +0 -1
  46. package/dist/client/assets/editor-monaco-json-FaaVfftD.js +0 -24
  47. package/dist/client/assets/editor-monaco-json-FaaVfftD.js.map +0 -1
  48. package/dist/client/assets/editor-refs-store-DAEAPqEk.js +0 -2
  49. package/dist/client/assets/editor-refs-store-DAEAPqEk.js.map +0 -1
  50. package/dist/client/assets/index-Bj6ZAKUc.css +0 -1
  51. package/dist/client/assets/index-DRbATnbJ.js +0 -5
  52. package/dist/client/assets/index-DRbATnbJ.js.map +0 -1
  53. package/dist/client/assets/preview-CM2ywF-8.js +0 -4
  54. package/dist/client/assets/preview-CM2ywF-8.js.map +0 -1
  55. package/dist/client/assets/useQualityAnalysis-ClgkaIc2.js +0 -6
  56. package/dist/client/assets/useQualityAnalysis-ClgkaIc2.js.map +0 -1
  57. package/dist/prompts/instructions-edit-document-pptx-templates.md +0 -63
@@ -0,0 +1,1224 @@
1
+ {
2
+ "name": "docx",
3
+ "props": {
4
+ "theme": "consulting",
5
+ "metadata": {
6
+ "title": "Client performance report"
7
+ },
8
+ "blocks": {
9
+ "key-takeaways": {
10
+ "description": "Executive conclusions with bounded one-line takeaways. Copy and adapt this document-local example.",
11
+ "slots": {
12
+ "label": {
13
+ "type": "string",
14
+ "oneLine": true,
15
+ "maxWords": 8,
16
+ "required": false,
17
+ "default": "Key takeaways"
18
+ },
19
+ "items": {
20
+ "type": "array",
21
+ "required": true,
22
+ "minItems": 3,
23
+ "maxItems": 5,
24
+ "items": {
25
+ "type": "string",
26
+ "oneLine": true,
27
+ "maxWords": 25,
28
+ "required": true
29
+ }
30
+ }
31
+ },
32
+ "body": [
33
+ {
34
+ "name": "divider",
35
+ "props": {
36
+ "thickness": {
37
+ "$theme": "/chrome/keyTakeaways/rule/weightPt",
38
+ "default": 1.5
39
+ },
40
+ "color": {
41
+ "$theme": "/chrome/keyTakeaways/rule/color",
42
+ "default": "borderPrimary"
43
+ },
44
+ "spacing": {
45
+ "before": 4,
46
+ "after": 6
47
+ }
48
+ }
49
+ },
50
+ {
51
+ "name": "paragraph",
52
+ "props": {
53
+ "text": {
54
+ "$slot": "/label"
55
+ },
56
+ "font": {
57
+ "family": {
58
+ "$theme": "/fonts/body/family",
59
+ "default": "Calibri"
60
+ },
61
+ "size": {
62
+ "$theme": "/styles/label/size",
63
+ "default": 9
64
+ },
65
+ "bold": {
66
+ "$theme": "/styles/label/bold",
67
+ "default": true
68
+ },
69
+ "color": {
70
+ "$theme": "/styles/label/color",
71
+ "default": "textPrimary"
72
+ }
73
+ },
74
+ "keepNext": true
75
+ }
76
+ },
77
+ {
78
+ "name": "list",
79
+ "props": {
80
+ "items": {
81
+ "$slot": "/items"
82
+ }
83
+ }
84
+ },
85
+ {
86
+ "name": "divider",
87
+ "props": {
88
+ "thickness": {
89
+ "$theme": "/chrome/keyTakeaways/rule/weightPt",
90
+ "default": 0.5
91
+ },
92
+ "color": {
93
+ "$theme": "/chrome/keyTakeaways/rule/color",
94
+ "default": "borderPrimary"
95
+ },
96
+ "spacing": {
97
+ "before": 4,
98
+ "after": 6
99
+ }
100
+ }
101
+ }
102
+ ]
103
+ },
104
+ "cover": {
105
+ "description": "A themed title page; optional subtitle, logo and metadata collapse when omitted.",
106
+ "slots": {
107
+ "title": {
108
+ "type": "string",
109
+ "oneLine": true,
110
+ "maxWords": 16,
111
+ "required": true
112
+ },
113
+ "subtitle": {
114
+ "type": "string",
115
+ "oneLine": true,
116
+ "maxWords": 30,
117
+ "required": false
118
+ },
119
+ "client": {
120
+ "type": "string",
121
+ "oneLine": true,
122
+ "maxWords": 8,
123
+ "required": false
124
+ },
125
+ "date": {
126
+ "type": "string",
127
+ "oneLine": true,
128
+ "maxWords": 6,
129
+ "required": false
130
+ },
131
+ "confidentiality": {
132
+ "type": "string",
133
+ "oneLine": true,
134
+ "maxWords": 8,
135
+ "required": false
136
+ },
137
+ "logo": {
138
+ "type": "component"
139
+ }
140
+ },
141
+ "body": [
142
+ {
143
+ "$if": "/logo",
144
+ "then": {
145
+ "$slot": "/logo"
146
+ }
147
+ },
148
+ {
149
+ "name": "paragraph",
150
+ "props": {
151
+ "text": "",
152
+ "spacing": {
153
+ "before": {
154
+ "$measure": "height",
155
+ "fraction": 0.22,
156
+ "unit": "pt"
157
+ },
158
+ "after": 0
159
+ }
160
+ }
161
+ },
162
+ {
163
+ "name": "divider",
164
+ "props": {
165
+ "thickness": {
166
+ "$theme": "/chrome/cover/rule/weightPt",
167
+ "default": 3
168
+ },
169
+ "color": {
170
+ "$theme": "/chrome/cover/rule/color",
171
+ "default": "borderPrimary"
172
+ },
173
+ "spacing": {
174
+ "before": 4,
175
+ "after": 6
176
+ }
177
+ }
178
+ },
179
+ {
180
+ "$if": "/client",
181
+ "then": {
182
+ "name": "paragraph",
183
+ "props": {
184
+ "text": {
185
+ "$slot": "/client"
186
+ },
187
+ "font": {
188
+ "family": {
189
+ "$theme": "/fonts/body/family",
190
+ "default": "Calibri"
191
+ },
192
+ "size": {
193
+ "$theme": "/styles/eyebrow/size",
194
+ "default": 9
195
+ },
196
+ "bold": {
197
+ "$theme": "/styles/eyebrow/bold",
198
+ "default": true
199
+ },
200
+ "color": {
201
+ "$theme": "/styles/eyebrow/color",
202
+ "default": "accent"
203
+ }
204
+ },
205
+ "keepNext": true
206
+ }
207
+ }
208
+ },
209
+ {
210
+ "name": "paragraph",
211
+ "props": {
212
+ "text": {
213
+ "$slot": "/title"
214
+ },
215
+ "font": {
216
+ "family": {
217
+ "$theme": "/fonts/body/family",
218
+ "default": "Calibri"
219
+ },
220
+ "size": {
221
+ "$theme": "/styles/display/size",
222
+ "default": 26
223
+ },
224
+ "bold": {
225
+ "$theme": "/styles/display/bold",
226
+ "default": true
227
+ },
228
+ "color": {
229
+ "$theme": "/styles/display/color",
230
+ "default": "textPrimary"
231
+ }
232
+ },
233
+ "keepNext": true
234
+ }
235
+ },
236
+ {
237
+ "$if": "/subtitle",
238
+ "then": {
239
+ "name": "paragraph",
240
+ "props": {
241
+ "text": {
242
+ "$slot": "/subtitle"
243
+ },
244
+ "font": {
245
+ "family": {
246
+ "$theme": "/fonts/body/family",
247
+ "default": "Calibri"
248
+ },
249
+ "size": {
250
+ "$theme": "/styles/subtitle/size",
251
+ "default": 13
252
+ },
253
+ "bold": {
254
+ "$theme": "/styles/subtitle/bold",
255
+ "default": false
256
+ },
257
+ "color": {
258
+ "$theme": "/styles/subtitle/color",
259
+ "default": "textPrimary"
260
+ }
261
+ },
262
+ "keepNext": true
263
+ }
264
+ }
265
+ },
266
+ {
267
+ "$if": "/date",
268
+ "then": {
269
+ "name": "paragraph",
270
+ "props": {
271
+ "text": {
272
+ "$slot": "/date"
273
+ },
274
+ "font": {
275
+ "family": {
276
+ "$theme": "/fonts/body/family",
277
+ "default": "Calibri"
278
+ },
279
+ "size": {
280
+ "$theme": "/styles/label/size",
281
+ "default": 9
282
+ },
283
+ "bold": {
284
+ "$theme": "/styles/label/bold",
285
+ "default": false
286
+ },
287
+ "color": {
288
+ "$theme": "/styles/label/color",
289
+ "default": "textPrimary"
290
+ }
291
+ }
292
+ }
293
+ }
294
+ },
295
+ {
296
+ "$if": "/confidentiality",
297
+ "then": {
298
+ "name": "paragraph",
299
+ "props": {
300
+ "text": {
301
+ "$slot": "/confidentiality"
302
+ },
303
+ "font": {
304
+ "family": {
305
+ "$theme": "/fonts/body/family",
306
+ "default": "Calibri"
307
+ },
308
+ "size": {
309
+ "$theme": "/styles/label/size",
310
+ "default": 9
311
+ },
312
+ "bold": {
313
+ "$theme": "/styles/label/bold",
314
+ "default": false
315
+ },
316
+ "color": {
317
+ "$theme": "/styles/label/color",
318
+ "default": "textPrimary"
319
+ }
320
+ }
321
+ }
322
+ }
323
+ }
324
+ ]
325
+ },
326
+ "section-opener": {
327
+ "description": "A numbered section heading which sets the general section tracker.",
328
+ "slots": {
329
+ "number": {
330
+ "type": "string",
331
+ "oneLine": true,
332
+ "maxWords": 3,
333
+ "required": false
334
+ },
335
+ "title": {
336
+ "type": "string",
337
+ "oneLine": true,
338
+ "maxWords": 12,
339
+ "required": true
340
+ },
341
+ "tracker": {
342
+ "type": "string",
343
+ "oneLine": true,
344
+ "maxWords": 6,
345
+ "required": false
346
+ }
347
+ },
348
+ "section": {
349
+ "tracker": {
350
+ "$slot": "/tracker",
351
+ "default": {
352
+ "$slot": "/title"
353
+ }
354
+ }
355
+ },
356
+ "body": [
357
+ {
358
+ "$if": "/number",
359
+ "then": {
360
+ "name": "paragraph",
361
+ "props": {
362
+ "text": {
363
+ "$slot": "/number"
364
+ },
365
+ "font": {
366
+ "family": {
367
+ "$theme": "/fonts/body/family",
368
+ "default": "Calibri"
369
+ },
370
+ "size": {
371
+ "$theme": "/styles/eyebrow/size",
372
+ "default": 9
373
+ },
374
+ "bold": {
375
+ "$theme": "/styles/eyebrow/bold",
376
+ "default": true
377
+ },
378
+ "color": {
379
+ "$theme": "/styles/eyebrow/color",
380
+ "default": "accent"
381
+ }
382
+ },
383
+ "keepNext": true
384
+ }
385
+ }
386
+ },
387
+ {
388
+ "name": "heading",
389
+ "props": {
390
+ "text": {
391
+ "$slot": "/title"
392
+ },
393
+ "level": 1
394
+ }
395
+ }
396
+ ]
397
+ },
398
+ "running-head": {
399
+ "description": "Document title/section tracker and page fields, inherited by subsequent sections.",
400
+ "slots": {
401
+ "title": {
402
+ "type": "string",
403
+ "oneLine": true,
404
+ "maxWords": 12,
405
+ "required": false
406
+ },
407
+ "tracker": {
408
+ "type": "string",
409
+ "oneLine": true,
410
+ "maxWords": 6,
411
+ "required": false
412
+ },
413
+ "confidentiality": {
414
+ "type": "string",
415
+ "oneLine": true,
416
+ "maxWords": 8,
417
+ "required": false
418
+ },
419
+ "date": {
420
+ "type": "string",
421
+ "oneLine": true,
422
+ "maxWords": 6,
423
+ "required": false
424
+ },
425
+ "pageNumbers": {
426
+ "type": "boolean",
427
+ "default": true
428
+ }
429
+ },
430
+ "body": [],
431
+ "section": {
432
+ "scope": "following",
433
+ "pageBreak": true,
434
+ "header": [
435
+ {
436
+ "name": "paragraph",
437
+ "props": {
438
+ "text": {
439
+ "$join": [
440
+ {
441
+ "$slot": "/title",
442
+ "default": {
443
+ "$context": "/document/title",
444
+ "default": ""
445
+ }
446
+ },
447
+ {
448
+ "$context": "/section/tracker",
449
+ "default": {
450
+ "$slot": "/tracker",
451
+ "default": ""
452
+ }
453
+ }
454
+ ],
455
+ "separator": "\t",
456
+ "keepEmpty": true
457
+ },
458
+ "font": {
459
+ "family": {
460
+ "$theme": "/fonts/body/family",
461
+ "default": "Calibri"
462
+ },
463
+ "size": {
464
+ "$theme": "/styles/tracker/size",
465
+ "default": 8
466
+ },
467
+ "bold": {
468
+ "$theme": "/styles/tracker/bold",
469
+ "default": false
470
+ },
471
+ "color": {
472
+ "$theme": "/styles/tracker/color",
473
+ "default": "textMuted"
474
+ }
475
+ },
476
+ "tabStops": [
477
+ {
478
+ "type": "right",
479
+ "position": {
480
+ "$measure": "width",
481
+ "unit": "twip"
482
+ }
483
+ }
484
+ ],
485
+ "spacing": {
486
+ "before": 0,
487
+ "after": 0
488
+ }
489
+ }
490
+ },
491
+ {
492
+ "name": "divider",
493
+ "props": {
494
+ "thickness": {
495
+ "$theme": "/chrome/runningHead/rule/weightPt",
496
+ "default": 0.5
497
+ },
498
+ "color": {
499
+ "$theme": "/chrome/runningHead/rule/color",
500
+ "default": "borderPrimary"
501
+ },
502
+ "spacing": {
503
+ "before": 4,
504
+ "after": 6
505
+ }
506
+ }
507
+ }
508
+ ],
509
+ "footer": [
510
+ {
511
+ "name": "divider",
512
+ "props": {
513
+ "thickness": {
514
+ "$theme": "/chrome/confidentialFooter/rule/weightPt",
515
+ "default": 0.5
516
+ },
517
+ "color": {
518
+ "$theme": "/chrome/confidentialFooter/rule/color",
519
+ "default": "borderPrimary"
520
+ },
521
+ "spacing": {
522
+ "before": 4,
523
+ "after": 6
524
+ }
525
+ }
526
+ },
527
+ {
528
+ "name": "paragraph",
529
+ "props": {
530
+ "text": {
531
+ "$join": [
532
+ {
533
+ "$slot": "/confidentiality",
534
+ "default": ""
535
+ },
536
+ {
537
+ "$if": "/pageNumbers",
538
+ "then": "{PAGE} / {TOTAL_PAGES}",
539
+ "else": ""
540
+ },
541
+ {
542
+ "$slot": "/date",
543
+ "default": ""
544
+ }
545
+ ],
546
+ "separator": "\t",
547
+ "keepEmpty": true
548
+ },
549
+ "font": {
550
+ "family": {
551
+ "$theme": "/fonts/body/family",
552
+ "default": "Calibri"
553
+ },
554
+ "size": {
555
+ "$theme": "/styles/footer/size",
556
+ "default": 8
557
+ },
558
+ "bold": {
559
+ "$theme": "/styles/footer/bold",
560
+ "default": false
561
+ },
562
+ "color": {
563
+ "$theme": "/styles/footer/color",
564
+ "default": "textMuted"
565
+ }
566
+ },
567
+ "tabStops": [
568
+ {
569
+ "type": "center",
570
+ "position": {
571
+ "$measure": "width",
572
+ "fraction": 0.5,
573
+ "unit": "twip"
574
+ }
575
+ },
576
+ {
577
+ "type": "right",
578
+ "position": {
579
+ "$measure": "width",
580
+ "unit": "twip"
581
+ }
582
+ }
583
+ ],
584
+ "spacing": {
585
+ "before": 0,
586
+ "after": 0
587
+ }
588
+ }
589
+ }
590
+ ]
591
+ }
592
+ },
593
+ "source-line": {
594
+ "description": "A hairline and a source line in the source role, under a figure or a table. The data blocks invoke it; copy it to add a source to anything else.",
595
+ "slots": {
596
+ "text": {
597
+ "type": "string",
598
+ "required": true,
599
+ "maxWords": 20,
600
+ "role": "source"
601
+ }
602
+ },
603
+ "body": [
604
+ {
605
+ "name": "divider",
606
+ "props": {
607
+ "thickness": 0.5,
608
+ "color": {
609
+ "$theme": "/palette/rule",
610
+ "default": "borderPrimary"
611
+ },
612
+ "spacing": {
613
+ "before": 4,
614
+ "after": 4
615
+ }
616
+ }
617
+ },
618
+ {
619
+ "name": "paragraph",
620
+ "props": {
621
+ "text": {
622
+ "$slot": "/text"
623
+ },
624
+ "font": {
625
+ "family": {
626
+ "$theme": "/fonts/body/family",
627
+ "default": "Calibri"
628
+ },
629
+ "size": {
630
+ "$theme": "/styles/source/size",
631
+ "default": 8
632
+ },
633
+ "bold": {
634
+ "$theme": "/styles/source/bold",
635
+ "default": false
636
+ },
637
+ "color": {
638
+ "$theme": "/styles/source/color",
639
+ "default": "textMuted"
640
+ }
641
+ },
642
+ "spacing": {
643
+ "before": 0,
644
+ "after": 8
645
+ }
646
+ }
647
+ }
648
+ ]
649
+ },
650
+ "kpi-row": {
651
+ "description": "Two to four headline metrics in equal columns: value with its unit, label, and a signed delta with a direction glyph. An optional source collapses with its hairline. Text budgets reject overflow; columns reflow at unchanged type size.",
652
+ "slots": {
653
+ "items": {
654
+ "type": "array",
655
+ "required": true,
656
+ "minItems": 2,
657
+ "maxItems": 4,
658
+ "items": {
659
+ "type": "object",
660
+ "properties": {
661
+ "value": {
662
+ "type": "string",
663
+ "required": true,
664
+ "maxLength": 12,
665
+ "description": "The headline figure, already formatted: 8.8, 94, +18."
666
+ },
667
+ "unit": {
668
+ "type": "string",
669
+ "maxLength": 6,
670
+ "description": "Suffix drawn after the figure at half its size: %, €m, pts. Write the space yourself when one belongs."
671
+ },
672
+ "label": {
673
+ "type": "string",
674
+ "required": true,
675
+ "oneLine": true,
676
+ "maxWords": 6,
677
+ "description": "What the figure measures."
678
+ },
679
+ "delta": {
680
+ "type": "string",
681
+ "maxLength": 12,
682
+ "description": "Signed change shown beside the figure: +3.2 pts, −0.4."
683
+ },
684
+ "trend": {
685
+ "type": "string",
686
+ "enum": ["up", "down", "neutral"],
687
+ "description": "Direction glyph drawn before the delta."
688
+ }
689
+ }
690
+ }
691
+ },
692
+ "source": {
693
+ "type": "string",
694
+ "maxWords": 20,
695
+ "role": "source"
696
+ }
697
+ },
698
+ "body": [
699
+ {
700
+ "name": "columns",
701
+ "props": {
702
+ "columns": {
703
+ "$count": "/items"
704
+ },
705
+ "gap": 12
706
+ },
707
+ "children": [
708
+ {
709
+ "$each": "/items",
710
+ "template": {
711
+ "name": "statistic",
712
+ "props": {
713
+ "number": {
714
+ "$item": "/value"
715
+ },
716
+ "unit": {
717
+ "$item": "/unit"
718
+ },
719
+ "description": {
720
+ "$item": "/label"
721
+ },
722
+ "trend": {
723
+ "$item": "/trend"
724
+ },
725
+ "trendValue": {
726
+ "$item": "/delta"
727
+ }
728
+ }
729
+ }
730
+ }
731
+ ]
732
+ },
733
+ {
734
+ "$if": "/source",
735
+ "then": {
736
+ "name": "block",
737
+ "props": {
738
+ "ref": "source-line",
739
+ "slots": {
740
+ "text": {
741
+ "$slot": "/source"
742
+ }
743
+ }
744
+ }
745
+ }
746
+ }
747
+ ]
748
+ },
749
+ "callout": {
750
+ "description": "An aside set off by a hairline rule down its left edge: a short label over up to sixty words of text. No fill, so it reads as a note beside the argument rather than a box in it.",
751
+ "slots": {
752
+ "label": {
753
+ "type": "string",
754
+ "oneLine": true,
755
+ "maxWords": 6,
756
+ "default": "Note"
757
+ },
758
+ "text": {
759
+ "type": "string",
760
+ "required": true,
761
+ "maxWords": 60
762
+ }
763
+ },
764
+ "body": [
765
+ {
766
+ "name": "text-box",
767
+ "props": {
768
+ "width": "100%",
769
+ "style": {
770
+ "padding": {
771
+ "top": 2,
772
+ "bottom": 2,
773
+ "left": 10,
774
+ "right": 0
775
+ },
776
+ "border": {
777
+ "left": {
778
+ "style": "solid",
779
+ "width": 0.75,
780
+ "color": {
781
+ "$theme": "/palette/rule",
782
+ "default": "borderPrimary"
783
+ }
784
+ }
785
+ }
786
+ }
787
+ },
788
+ "children": [
789
+ {
790
+ "name": "paragraph",
791
+ "props": {
792
+ "text": {
793
+ "$slot": "/label"
794
+ },
795
+ "font": {
796
+ "family": {
797
+ "$theme": "/fonts/body/family",
798
+ "default": "Calibri"
799
+ },
800
+ "size": {
801
+ "$theme": "/styles/label/size",
802
+ "default": 9
803
+ },
804
+ "bold": {
805
+ "$theme": "/styles/label/bold",
806
+ "default": true
807
+ },
808
+ "color": {
809
+ "$theme": "/styles/label/color",
810
+ "default": "textPrimary"
811
+ }
812
+ },
813
+ "spacing": {
814
+ "before": 0,
815
+ "after": 2
816
+ },
817
+ "keepNext": true
818
+ }
819
+ },
820
+ {
821
+ "name": "paragraph",
822
+ "props": {
823
+ "text": {
824
+ "$slot": "/text"
825
+ },
826
+ "spacing": {
827
+ "before": 0,
828
+ "after": 0
829
+ }
830
+ }
831
+ }
832
+ ]
833
+ }
834
+ ]
835
+ },
836
+ "data-table": {
837
+ "description": "A sourced numeric table: a title, a text column of row labels, one to six data columns right-aligned by construction, then optional notes and a source line. With its header, 24 rows keep the table on one page; the table-design rule checks the compiled table for mixed decimals.",
838
+ "slots": {
839
+ "title": {
840
+ "type": "string",
841
+ "required": true,
842
+ "oneLine": true,
843
+ "maxWords": 16
844
+ },
845
+ "labelHeader": {
846
+ "type": "string",
847
+ "oneLine": true,
848
+ "maxWords": 4,
849
+ "default": "",
850
+ "description": "Header of the row-label column."
851
+ },
852
+ "labels": {
853
+ "type": "array",
854
+ "required": true,
855
+ "minItems": 1,
856
+ "maxItems": 24,
857
+ "items": {
858
+ "type": "string",
859
+ "oneLine": true,
860
+ "maxWords": 8
861
+ },
862
+ "description": "Row labels, top to bottom. Every data column lists its cells in this order and at this count."
863
+ },
864
+ "columns": {
865
+ "type": "array",
866
+ "required": true,
867
+ "minItems": 1,
868
+ "maxItems": 6,
869
+ "items": {
870
+ "type": "object",
871
+ "properties": {
872
+ "header": {
873
+ "type": "string",
874
+ "required": true,
875
+ "oneLine": true,
876
+ "maxWords": 4,
877
+ "description": "Column header; put the unit here: Revenue (€m)."
878
+ },
879
+ "cells": {
880
+ "type": "array",
881
+ "required": true,
882
+ "minItems": 1,
883
+ "maxItems": 24,
884
+ "items": {
885
+ "type": "string",
886
+ "maxLength": 16
887
+ },
888
+ "description": "One formatted value per row label, rounded the same way down the column."
889
+ },
890
+ "numeric": {
891
+ "type": "boolean",
892
+ "default": true,
893
+ "description": "Right-align header and cells so digits line up by place value. Set false for a text column."
894
+ }
895
+ }
896
+ }
897
+ },
898
+ "notes": {
899
+ "type": "string",
900
+ "maxWords": 40,
901
+ "description": "What the reader needs to interpret the figures: definitions, periods, exclusions."
902
+ },
903
+ "source": {
904
+ "type": "string",
905
+ "maxWords": 20,
906
+ "role": "source"
907
+ }
908
+ },
909
+ "body": [
910
+ {
911
+ "name": "paragraph",
912
+ "props": {
913
+ "text": {
914
+ "$slot": "/title"
915
+ },
916
+ "font": {
917
+ "family": {
918
+ "$theme": "/fonts/body/family",
919
+ "default": "Calibri"
920
+ },
921
+ "size": {
922
+ "$theme": "/styles/label/size",
923
+ "default": 9
924
+ },
925
+ "bold": {
926
+ "$theme": "/styles/label/bold",
927
+ "default": true
928
+ },
929
+ "color": {
930
+ "$theme": "/styles/label/color",
931
+ "default": "textPrimary"
932
+ }
933
+ },
934
+ "spacing": {
935
+ "before": 8,
936
+ "after": 4
937
+ },
938
+ "keepNext": true
939
+ }
940
+ },
941
+ {
942
+ "name": "table",
943
+ "props": {
944
+ "width": 100,
945
+ "repeatHeaderOnPageBreak": true,
946
+ "columns": [
947
+ {
948
+ "header": {
949
+ "content": {
950
+ "$slot": "/labelHeader"
951
+ }
952
+ },
953
+ "cells": {
954
+ "$each": "/labels",
955
+ "template": {
956
+ "content": {
957
+ "$item": ""
958
+ }
959
+ }
960
+ }
961
+ },
962
+ {
963
+ "$each": "/columns",
964
+ "template": {
965
+ "header": {
966
+ "content": {
967
+ "$item": "/header"
968
+ },
969
+ "horizontalAlignment": {
970
+ "$if": {
971
+ "$item": "/numeric"
972
+ },
973
+ "then": "right",
974
+ "else": "left"
975
+ }
976
+ },
977
+ "cellDefaults": {
978
+ "horizontalAlignment": {
979
+ "$if": {
980
+ "$item": "/numeric"
981
+ },
982
+ "then": "right",
983
+ "else": "left"
984
+ }
985
+ },
986
+ "cells": {
987
+ "$each": {
988
+ "$item": "/cells"
989
+ },
990
+ "template": {
991
+ "content": {
992
+ "$item": ""
993
+ }
994
+ }
995
+ }
996
+ }
997
+ }
998
+ ]
999
+ }
1000
+ },
1001
+ {
1002
+ "$if": "/notes",
1003
+ "then": {
1004
+ "name": "paragraph",
1005
+ "props": {
1006
+ "text": {
1007
+ "$slot": "/notes"
1008
+ },
1009
+ "font": {
1010
+ "family": {
1011
+ "$theme": "/fonts/body/family",
1012
+ "default": "Calibri"
1013
+ },
1014
+ "size": {
1015
+ "$theme": "/styles/source/size",
1016
+ "default": 8
1017
+ },
1018
+ "bold": {
1019
+ "$theme": "/styles/source/bold",
1020
+ "default": false
1021
+ },
1022
+ "color": {
1023
+ "$theme": "/styles/source/color",
1024
+ "default": "textMuted"
1025
+ }
1026
+ },
1027
+ "spacing": {
1028
+ "before": 4,
1029
+ "after": 0
1030
+ }
1031
+ }
1032
+ }
1033
+ },
1034
+ {
1035
+ "$if": "/source",
1036
+ "then": {
1037
+ "name": "block",
1038
+ "props": {
1039
+ "ref": "source-line",
1040
+ "slots": {
1041
+ "text": {
1042
+ "$slot": "/source"
1043
+ }
1044
+ }
1045
+ }
1046
+ }
1047
+ }
1048
+ ]
1049
+ }
1050
+ }
1051
+ },
1052
+ "children": [
1053
+ {
1054
+ "name": "section",
1055
+ "props": {},
1056
+ "children": [
1057
+ {
1058
+ "name": "block",
1059
+ "props": {
1060
+ "ref": "cover",
1061
+ "slots": {
1062
+ "title": "Growth improved as delivery became more reliable",
1063
+ "subtitle": "Quarterly client performance review",
1064
+ "client": "Example client",
1065
+ "date": "September 2026",
1066
+ "confidentiality": "Confidential"
1067
+ }
1068
+ }
1069
+ }
1070
+ ]
1071
+ },
1072
+ {
1073
+ "name": "section",
1074
+ "props": {},
1075
+ "children": [
1076
+ {
1077
+ "name": "block",
1078
+ "props": {
1079
+ "ref": "running-head",
1080
+ "slots": {
1081
+ "confidentiality": "Confidential",
1082
+ "date": "September 2026"
1083
+ }
1084
+ }
1085
+ },
1086
+ {
1087
+ "name": "block",
1088
+ "props": {
1089
+ "ref": "section-opener",
1090
+ "slots": {
1091
+ "number": "01",
1092
+ "title": "Delivery improvements supported growth",
1093
+ "tracker": "Performance"
1094
+ }
1095
+ }
1096
+ },
1097
+ {
1098
+ "name": "block",
1099
+ "props": {
1100
+ "ref": "key-takeaways",
1101
+ "slots": {
1102
+ "items": [
1103
+ "Revenue grew as more contracted work reached completion.",
1104
+ "On-time delivery improved following clearer weekly ownership.",
1105
+ "Next quarter should prioritize retention and recurring revenue."
1106
+ ]
1107
+ }
1108
+ }
1109
+ },
1110
+ {
1111
+ "name": "paragraph",
1112
+ "props": {
1113
+ "text": "The report designs above are ordinary JSON definitions in this document. Edit their slots or composition in the playground; the engine has no built-in cover or takeaways implementation."
1114
+ }
1115
+ },
1116
+ {
1117
+ "name": "block",
1118
+ "props": {
1119
+ "ref": "kpi-row",
1120
+ "slots": {
1121
+ "items": [
1122
+ {
1123
+ "value": "8.8",
1124
+ "unit": " €m",
1125
+ "label": "Revenue year to date",
1126
+ "delta": "+16.9%",
1127
+ "trend": "up"
1128
+ },
1129
+ {
1130
+ "value": "94",
1131
+ "unit": "%",
1132
+ "label": "Client retention",
1133
+ "delta": "+2 pts",
1134
+ "trend": "up"
1135
+ },
1136
+ {
1137
+ "value": "11",
1138
+ "unit": " days",
1139
+ "label": "Median time to deliver",
1140
+ "delta": "−3 days",
1141
+ "trend": "down"
1142
+ }
1143
+ ],
1144
+ "source": "Source: quarterly operating review, 2026."
1145
+ }
1146
+ }
1147
+ },
1148
+ {
1149
+ "name": "block",
1150
+ "props": {
1151
+ "ref": "callout",
1152
+ "slots": {
1153
+ "label": "How to read the deltas",
1154
+ "text": "Deltas compare the first three quarters of 2026 with the same period of 2025. Retention counts contracts renewed within thirty days of their term; late renewals are excluded from both years."
1155
+ }
1156
+ }
1157
+ }
1158
+ ]
1159
+ },
1160
+ {
1161
+ "name": "section",
1162
+ "props": {
1163
+ "page": {
1164
+ "size": "LETTER",
1165
+ "margins": {
1166
+ "left": 720,
1167
+ "right": 720
1168
+ }
1169
+ }
1170
+ },
1171
+ "children": [
1172
+ {
1173
+ "name": "block",
1174
+ "props": {
1175
+ "ref": "section-opener",
1176
+ "slots": {
1177
+ "number": "02",
1178
+ "title": "Focus the next quarter on retention",
1179
+ "tracker": "Recommendations"
1180
+ }
1181
+ }
1182
+ },
1183
+ {
1184
+ "name": "block",
1185
+ "props": {
1186
+ "ref": "data-table",
1187
+ "slots": {
1188
+ "title": "Revenue and retention by segment, 2026 to date",
1189
+ "labelHeader": "Segment",
1190
+ "labels": [
1191
+ "Enterprise",
1192
+ "Mid-market",
1193
+ "Public sector",
1194
+ "All segments"
1195
+ ],
1196
+ "columns": [
1197
+ {
1198
+ "header": "Revenue (€m)",
1199
+ "cells": ["4.2", "2.7", "1.9", "8.8"]
1200
+ },
1201
+ {
1202
+ "header": "Growth (%)",
1203
+ "cells": ["21.0", "14.5", "9.8", "16.9"]
1204
+ },
1205
+ {
1206
+ "header": "Retention (%)",
1207
+ "cells": ["96", "93", "91", "94"]
1208
+ }
1209
+ ],
1210
+ "notes": "Growth is year on year on the same nine months. Retention counts contracts renewed within thirty days of their term.",
1211
+ "source": "Source: quarterly operating review, 2026."
1212
+ }
1213
+ }
1214
+ },
1215
+ {
1216
+ "name": "paragraph",
1217
+ "props": {
1218
+ "text": "The inherited running header uses this section’s tracker and page width. Page numbers are native Word fields."
1219
+ }
1220
+ }
1221
+ ]
1222
+ }
1223
+ ]
1224
+ }