@json-to-office/jto 4.5.0 → 5.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 (31) hide show
  1. package/dist/cli.js +1 -1
  2. package/dist/client/assets/{HomePage-CSBsGUBL.js → HomePage-FzRGVdrO.js} +4 -4
  3. package/dist/client/assets/{HomePage-CSBsGUBL.js.map → HomePage-FzRGVdrO.js.map} +1 -1
  4. package/dist/client/assets/{JsonEditorPage-BHVA2YLP.js → JsonEditorPage-DjbLMda1.js} +3 -3
  5. package/dist/client/assets/{JsonEditorPage-BHVA2YLP.js.map → JsonEditorPage-DjbLMda1.js.map} +1 -1
  6. package/dist/client/assets/{MonacoPluginProvider-D5aUgKZi.js → MonacoPluginProvider-CRemSLoy.js} +5 -5
  7. package/dist/client/assets/{MonacoPluginProvider-D5aUgKZi.js.map → MonacoPluginProvider-CRemSLoy.js.map} +1 -1
  8. package/dist/client/assets/{_virtual_jto-plugin-type-libs-gZZSIMe7.js → _virtual_jto-plugin-type-libs-Bns9FJk1.js} +56 -5
  9. package/dist/client/assets/{_virtual_jto-plugin-type-libs-gZZSIMe7.js.map → _virtual_jto-plugin-type-libs-Bns9FJk1.js.map} +1 -1
  10. package/dist/client/assets/_virtual_jto-sandbox-runtime-l26u1ylW.js +2 -0
  11. package/dist/client/assets/_virtual_jto-sandbox-runtime-l26u1ylW.js.map +1 -0
  12. package/dist/client/assets/{editor-Ce9XFPWx.js → editor-CclDHMVO.js} +2 -2
  13. package/dist/client/assets/{editor-Ce9XFPWx.js.map → editor-CclDHMVO.js.map} +1 -1
  14. package/dist/client/assets/{editor-monaco-json-u3bIh2LA.js → editor-monaco-json-D3j3jSTr.js} +2 -2
  15. package/dist/client/assets/{editor-monaco-json-u3bIh2LA.js.map → editor-monaco-json-D3j3jSTr.js.map} +1 -1
  16. package/dist/client/assets/{index-CHGFn3dH.js → index-CHWwrrUS.js} +4 -4
  17. package/dist/client/assets/index-CHWwrrUS.js.map +1 -0
  18. package/dist/client/assets/{index-DruKDred.js → index-gnUT72CY.js} +2 -2
  19. package/dist/client/assets/{index-DruKDred.js.map → index-gnUT72CY.js.map} +1 -1
  20. package/dist/client/assets/{preview-Bjxi6Nq3.js → preview-Co1OedmP.js} +2 -2
  21. package/dist/client/assets/preview-Co1OedmP.js.map +1 -0
  22. package/dist/client/assets/{useQualityAnalysis-AZKgMcJ7.js → useQualityAnalysis-CKVtQGjt.js} +3 -3
  23. package/dist/client/assets/{useQualityAnalysis-AZKgMcJ7.js.map → useQualityAnalysis-CKVtQGjt.js.map} +1 -1
  24. package/dist/client/index.html +1 -1
  25. package/dist/client/templates/consulting-deck-blocks.pptx.json +1057 -156
  26. package/dist/client/templates/technical-report-blocks.docx.json +1703 -0
  27. package/package.json +7 -7
  28. package/dist/client/assets/_virtual_jto-sandbox-runtime-CVTtmFTd.js +0 -2
  29. package/dist/client/assets/_virtual_jto-sandbox-runtime-CVTtmFTd.js.map +0 -1
  30. package/dist/client/assets/index-CHGFn3dH.js.map +0 -1
  31. package/dist/client/assets/preview-Bjxi6Nq3.js.map +0 -1
@@ -8,6 +8,185 @@
8
8
  "slideWidth": 13.333,
9
9
  "slideHeight": 7.5,
10
10
  "blocks": {
11
+ "cover": {
12
+ "description": "The deck's first slide: a client line and date in the eyebrow role, the title in the title role over an accent rule, a subtitle, an optional logo top right and the confidentiality line at the foot. Geometry is a frame of the slide in percentages; every size binds to a theme role with a safe default, so it renders on any bundled theme. Copy and adapt this document-local example.",
13
+ "slots": {
14
+ "title": {
15
+ "type": "string",
16
+ "required": true,
17
+ "maxWords": 16,
18
+ "description": "The deck's conclusion in one sentence; three lines at most, stepping down to 28 then 24pt."
19
+ },
20
+ "subtitle": {
21
+ "type": "string",
22
+ "oneLine": true,
23
+ "maxWords": 20,
24
+ "description": "What the deck answers, for whom."
25
+ },
26
+ "client": {
27
+ "type": "string",
28
+ "oneLine": true,
29
+ "maxWords": 8,
30
+ "description": "Who the deck is for; drawn with the date in the eyebrow line, which needs the client to appear."
31
+ },
32
+ "date": {
33
+ "type": "string",
34
+ "oneLine": true,
35
+ "maxWords": 6
36
+ },
37
+ "confidentiality": {
38
+ "type": "string",
39
+ "oneLine": true,
40
+ "maxWords": 6
41
+ },
42
+ "logo": {
43
+ "type": "component",
44
+ "description": "An image; the definition frames it top right at 18% of the width."
45
+ }
46
+ },
47
+ "body": [
48
+ {
49
+ "name": "group",
50
+ "props": {
51
+ "x": "3.75%",
52
+ "y": "4.5%",
53
+ "w": "92.5%",
54
+ "h": "91%"
55
+ },
56
+ "children": [
57
+ {
58
+ "$if": "/logo",
59
+ "then": {
60
+ "$slot": "/logo",
61
+ "props": {
62
+ "x": "82%",
63
+ "y": "0%",
64
+ "w": "18%",
65
+ "h": "10%"
66
+ }
67
+ }
68
+ },
69
+ {
70
+ "name": "shape",
71
+ "props": {
72
+ "type": "line",
73
+ "x": "0%",
74
+ "y": "30%",
75
+ "w": "16%",
76
+ "h": 0,
77
+ "line": {
78
+ "color": {
79
+ "$theme": "/chrome/cover/rule/color",
80
+ "default": "accent"
81
+ },
82
+ "width": {
83
+ "$theme": "/chrome/cover/rule/weightPt",
84
+ "default": 3
85
+ }
86
+ }
87
+ }
88
+ },
89
+ {
90
+ "$if": "/client",
91
+ "then": {
92
+ "name": "text",
93
+ "props": {
94
+ "text": {
95
+ "$join": [
96
+ {
97
+ "$slot": "/client",
98
+ "default": ""
99
+ },
100
+ {
101
+ "$slot": "/date",
102
+ "default": ""
103
+ }
104
+ ],
105
+ "separator": " · "
106
+ },
107
+ "style": "eyebrow",
108
+ "fontSize": {
109
+ "$theme": "/styles/eyebrow/fontSize",
110
+ "default": 10
111
+ },
112
+ "x": "0%",
113
+ "y": "33%",
114
+ "w": "100%",
115
+ "h": "5%"
116
+ }
117
+ }
118
+ },
119
+ {
120
+ "name": "text",
121
+ "props": {
122
+ "text": {
123
+ "$slot": "/title"
124
+ },
125
+ "style": "title",
126
+ "fontSize": {
127
+ "$theme": "/styles/title/fontSize",
128
+ "default": 32
129
+ },
130
+ "x": "0%",
131
+ "y": "39%",
132
+ "w": "90%",
133
+ "h": "30%",
134
+ "valign": "top",
135
+ "fit": {
136
+ "maxLines": 3,
137
+ "shrink": [28, 24]
138
+ }
139
+ }
140
+ },
141
+ {
142
+ "$if": "/subtitle",
143
+ "then": {
144
+ "name": "text",
145
+ "props": {
146
+ "text": {
147
+ "$slot": "/subtitle"
148
+ },
149
+ "style": "subtitle",
150
+ "fontSize": {
151
+ "$theme": "/styles/subtitle/fontSize",
152
+ "default": 16
153
+ },
154
+ "x": "0%",
155
+ "y": "60%",
156
+ "w": "80%",
157
+ "h": "14%",
158
+ "valign": "top",
159
+ "fit": {
160
+ "maxLines": 2,
161
+ "shrink": [14, 12]
162
+ }
163
+ }
164
+ }
165
+ },
166
+ {
167
+ "$if": "/confidentiality",
168
+ "then": {
169
+ "name": "text",
170
+ "props": {
171
+ "text": {
172
+ "$slot": "/confidentiality"
173
+ },
174
+ "style": "footer",
175
+ "fontSize": {
176
+ "$theme": "/styles/footer/fontSize",
177
+ "default": 9
178
+ },
179
+ "x": "0%",
180
+ "y": "96%",
181
+ "w": "50%",
182
+ "h": "4%"
183
+ }
184
+ }
185
+ }
186
+ ]
187
+ }
188
+ ]
189
+ },
11
190
  "action-chart": {
12
191
  "description": "The consulting workhorse: an action title over one chart, an optional takeaway beside it and an optional source beneath. Copy and adapt this document-local example; the consulting-deck quality profile requires the takeaway and the source, the theme only styles them. Geometry is a frame of the slide in percentages, so the same definition lays out on every canvas; sizes bind to the theme's type roles with safe defaults, so it renders on any bundled theme.",
13
192
  "slots": {
@@ -17,7 +196,555 @@
17
196
  "oneLine": true,
18
197
  "maxWords": 24,
19
198
  "role": "actionTitle",
20
- "description": "The claim the chart proves: a sentence with a number or a verb, two lines at most. Longer titles step down to 24 then 22pt, then fail."
199
+ "description": "The claim the chart proves: a sentence with a number or a verb, two lines at most. Longer titles step down to 24 then 22pt, then fail."
200
+ },
201
+ "tracker": {
202
+ "type": "string",
203
+ "oneLine": true,
204
+ "maxWords": 4,
205
+ "role": "tracker",
206
+ "description": "Section label, top right. Omit it and nothing is drawn."
207
+ },
208
+ "chart": {
209
+ "type": "component",
210
+ "required": true,
211
+ "description": "A chart or highcharts component with its data and units. The definition supplies its frame and the theme's series palette; both may be overridden except the frame."
212
+ },
213
+ "takeaway": {
214
+ "type": "string",
215
+ "maxWords": 40,
216
+ "role": "takeaway",
217
+ "description": "What the reader should conclude, set beside the chart under an accent rule."
218
+ },
219
+ "source": {
220
+ "type": "string",
221
+ "maxWords": 24,
222
+ "role": "source",
223
+ "description": "Where the numbers come from, e.g. 'Source: company filings, 2026'. Omit it and its rule collapses too."
224
+ }
225
+ },
226
+ "body": [
227
+ {
228
+ "name": "group",
229
+ "props": {
230
+ "x": "3.75%",
231
+ "y": "4.5%",
232
+ "w": "92.5%",
233
+ "h": "91%"
234
+ },
235
+ "children": [
236
+ {
237
+ "$if": "/tracker",
238
+ "then": {
239
+ "name": "text",
240
+ "props": {
241
+ "text": {
242
+ "$slot": "/tracker"
243
+ },
244
+ "style": "tracker",
245
+ "fontSize": {
246
+ "$theme": "/styles/tracker/fontSize",
247
+ "default": 10
248
+ },
249
+ "x": "70%",
250
+ "y": "0%",
251
+ "w": "30%",
252
+ "h": "4.5%",
253
+ "align": "right"
254
+ }
255
+ }
256
+ },
257
+ {
258
+ "name": "text",
259
+ "props": {
260
+ "text": {
261
+ "$slot": "/title"
262
+ },
263
+ "style": "display",
264
+ "fontSize": {
265
+ "$theme": "/styles/display/fontSize",
266
+ "default": 28
267
+ },
268
+ "x": "0%",
269
+ "y": "5%",
270
+ "w": "100%",
271
+ "h": "19%",
272
+ "valign": "top",
273
+ "fit": {
274
+ "maxLines": 2,
275
+ "shrink": [24, 22]
276
+ }
277
+ }
278
+ },
279
+ {
280
+ "name": "shape",
281
+ "props": {
282
+ "type": "line",
283
+ "x": "0%",
284
+ "y": "26%",
285
+ "w": "100%",
286
+ "h": 0,
287
+ "line": {
288
+ "color": {
289
+ "$theme": "/palette/rule",
290
+ "default": "background2"
291
+ },
292
+ "width": 0.5
293
+ }
294
+ }
295
+ },
296
+ {
297
+ "$slot": "/chart",
298
+ "props": {
299
+ "x": "0%",
300
+ "y": "29%",
301
+ "w": "68%",
302
+ "h": "62%",
303
+ "chartColors": [
304
+ "accent",
305
+ "secondary",
306
+ "accent4",
307
+ "accent6",
308
+ "accent5"
309
+ ],
310
+ "showLegend": true,
311
+ "legendPos": "b"
312
+ }
313
+ },
314
+ {
315
+ "$if": "/takeaway",
316
+ "then": [
317
+ {
318
+ "name": "shape",
319
+ "props": {
320
+ "type": "line",
321
+ "x": "71%",
322
+ "y": "29%",
323
+ "w": "29%",
324
+ "h": 0,
325
+ "line": {
326
+ "color": {
327
+ "$theme": "/chrome/keyTakeaways/rule/color",
328
+ "default": "accent"
329
+ },
330
+ "width": {
331
+ "$theme": "/chrome/keyTakeaways/rule/weightPt",
332
+ "default": 2
333
+ }
334
+ }
335
+ }
336
+ },
337
+ {
338
+ "name": "text",
339
+ "props": {
340
+ "text": "Takeaway",
341
+ "style": "eyebrow",
342
+ "fontSize": {
343
+ "$theme": "/styles/eyebrow/fontSize",
344
+ "default": 10
345
+ },
346
+ "bold": true,
347
+ "x": "71%",
348
+ "y": "31%",
349
+ "w": "29%",
350
+ "h": "4.5%"
351
+ }
352
+ },
353
+ {
354
+ "name": "text",
355
+ "props": {
356
+ "text": {
357
+ "$slot": "/takeaway"
358
+ },
359
+ "style": "quote",
360
+ "fontSize": {
361
+ "$theme": "/styles/quote/fontSize",
362
+ "default": 18
363
+ },
364
+ "x": "71%",
365
+ "y": "37%",
366
+ "w": "29%",
367
+ "h": "54%",
368
+ "valign": "top",
369
+ "fit": {
370
+ "shrink": [16, 14, 12]
371
+ }
372
+ }
373
+ }
374
+ ]
375
+ },
376
+ {
377
+ "$if": "/source",
378
+ "then": [
379
+ {
380
+ "name": "shape",
381
+ "props": {
382
+ "type": "line",
383
+ "x": "0%",
384
+ "y": "93.5%",
385
+ "w": "100%",
386
+ "h": 0,
387
+ "line": {
388
+ "color": {
389
+ "$theme": "/palette/rule",
390
+ "default": "background2"
391
+ },
392
+ "width": 0.5
393
+ }
394
+ }
395
+ },
396
+ {
397
+ "name": "text",
398
+ "props": {
399
+ "text": {
400
+ "$slot": "/source"
401
+ },
402
+ "style": "source",
403
+ "fontSize": {
404
+ "$theme": "/styles/source/fontSize",
405
+ "default": 9
406
+ },
407
+ "x": "0%",
408
+ "y": "94.5%",
409
+ "w": "75%",
410
+ "h": "5%"
411
+ }
412
+ }
413
+ ]
414
+ },
415
+ {
416
+ "name": "text",
417
+ "props": {
418
+ "text": "{PAGE_NUMBER} / {PAGE_COUNT}",
419
+ "style": "footer",
420
+ "fontSize": {
421
+ "$theme": "/styles/footer/fontSize",
422
+ "default": 9
423
+ },
424
+ "x": "88%",
425
+ "y": "96%",
426
+ "w": "12%",
427
+ "h": "4%",
428
+ "align": "right"
429
+ }
430
+ }
431
+ ]
432
+ }
433
+ ]
434
+ },
435
+ "kpi-row": {
436
+ "description": "An action title over two to four headline figures in equal cells: the value with its unit beside it in the stat role, a signed delta beneath, the label under that; an optional source at the foot. Two figures take half the row each, four a quarter and set the figures a size smaller; a figure too wide for its cell steps down to 20pt, then fails. Copy and adapt this document-local example; the consulting-deck profile asks for the source, the theme only styles it.",
437
+ "slots": {
438
+ "title": {
439
+ "type": "string",
440
+ "required": true,
441
+ "oneLine": true,
442
+ "maxWords": 24,
443
+ "role": "actionTitle",
444
+ "description": "The claim the slide proves: a sentence with a number or a verb, two lines at most. Longer titles step down to 24 then 22pt, then fail."
445
+ },
446
+ "tracker": {
447
+ "type": "string",
448
+ "oneLine": true,
449
+ "maxWords": 4,
450
+ "role": "tracker",
451
+ "description": "Section label, top right. Omit it and nothing is drawn."
452
+ },
453
+ "items": {
454
+ "type": "array",
455
+ "required": true,
456
+ "minItems": 2,
457
+ "maxItems": 4,
458
+ "items": {
459
+ "type": "object",
460
+ "properties": {
461
+ "value": {
462
+ "type": "string",
463
+ "required": true,
464
+ "maxLength": 7,
465
+ "description": "The headline figure, already formatted: 8.8, 94, +18."
466
+ },
467
+ "unit": {
468
+ "type": "string",
469
+ "maxLength": 5,
470
+ "description": "Suffix drawn after the figure in the muted colour: %, €m, pts."
471
+ },
472
+ "label": {
473
+ "type": "string",
474
+ "required": true,
475
+ "oneLine": true,
476
+ "maxWords": 6,
477
+ "description": "What the figure measures."
478
+ },
479
+ "delta": {
480
+ "type": "string",
481
+ "maxLength": 12,
482
+ "description": "Signed change shown under the figure: +3.2 pts, −0.4."
483
+ }
484
+ }
485
+ }
486
+ },
487
+ "source": {
488
+ "type": "string",
489
+ "maxWords": 24,
490
+ "role": "source",
491
+ "description": "Where the numbers come from. Omit it and its rule collapses too."
492
+ }
493
+ },
494
+ "body": [
495
+ {
496
+ "name": "group",
497
+ "props": {
498
+ "x": "3.75%",
499
+ "y": "4.5%",
500
+ "w": "92.5%",
501
+ "h": "91%"
502
+ },
503
+ "children": [
504
+ {
505
+ "$if": "/tracker",
506
+ "then": {
507
+ "name": "text",
508
+ "props": {
509
+ "text": {
510
+ "$slot": "/tracker"
511
+ },
512
+ "style": "tracker",
513
+ "fontSize": {
514
+ "$theme": "/styles/tracker/fontSize",
515
+ "default": 10
516
+ },
517
+ "x": "70%",
518
+ "y": "0%",
519
+ "w": "30%",
520
+ "h": "4.5%",
521
+ "align": "right"
522
+ }
523
+ }
524
+ },
525
+ {
526
+ "name": "text",
527
+ "props": {
528
+ "text": {
529
+ "$slot": "/title"
530
+ },
531
+ "style": "display",
532
+ "fontSize": {
533
+ "$theme": "/styles/display/fontSize",
534
+ "default": 28
535
+ },
536
+ "x": "0%",
537
+ "y": "5%",
538
+ "w": "100%",
539
+ "h": "19%",
540
+ "valign": "top",
541
+ "fit": {
542
+ "maxLines": 2,
543
+ "shrink": [24, 22]
544
+ }
545
+ }
546
+ },
547
+ {
548
+ "name": "shape",
549
+ "props": {
550
+ "type": "line",
551
+ "x": "0%",
552
+ "y": "26%",
553
+ "w": "100%",
554
+ "h": 0,
555
+ "line": {
556
+ "color": {
557
+ "$theme": "/palette/rule",
558
+ "default": "background2"
559
+ },
560
+ "width": 0.5
561
+ }
562
+ }
563
+ },
564
+ {
565
+ "name": "group",
566
+ "props": {
567
+ "x": "0%",
568
+ "y": "32%",
569
+ "w": "100%",
570
+ "h": "56%",
571
+ "direction": "row",
572
+ "gap": 0.35
573
+ },
574
+ "children": [
575
+ {
576
+ "$each": "/items",
577
+ "template": {
578
+ "name": "group",
579
+ "props": {},
580
+ "children": [
581
+ {
582
+ "name": "text",
583
+ "props": {
584
+ "runs": [
585
+ {
586
+ "text": {
587
+ "$item": "/value"
588
+ }
589
+ },
590
+ {
591
+ "$if": {
592
+ "$item": "/unit"
593
+ },
594
+ "then": {
595
+ "text": {
596
+ "$join": [
597
+ " ",
598
+ {
599
+ "$item": "/unit"
600
+ }
601
+ ],
602
+ "separator": ""
603
+ },
604
+ "color": "text2"
605
+ }
606
+ }
607
+ ],
608
+ "style": "stat",
609
+ "fontSize": {
610
+ "$if": "/items/3",
611
+ "then": 32,
612
+ "else": {
613
+ "$theme": "/styles/stat/fontSize",
614
+ "default": 40
615
+ }
616
+ },
617
+ "bold": true,
618
+ "x": "0%",
619
+ "y": "0%",
620
+ "w": "100%",
621
+ "h": "42%",
622
+ "valign": "bottom",
623
+ "fit": {
624
+ "maxLines": 1,
625
+ "shrink": [28, 24, 20]
626
+ }
627
+ }
628
+ },
629
+ {
630
+ "$if": {
631
+ "$item": "/delta"
632
+ },
633
+ "then": {
634
+ "name": "text",
635
+ "props": {
636
+ "text": {
637
+ "$item": "/delta"
638
+ },
639
+ "style": "label",
640
+ "fontSize": {
641
+ "$theme": "/styles/label/fontSize",
642
+ "default": 12
643
+ },
644
+ "color": "text2",
645
+ "x": "0%",
646
+ "y": "44%",
647
+ "w": "100%",
648
+ "h": "12%"
649
+ }
650
+ }
651
+ },
652
+ {
653
+ "name": "text",
654
+ "props": {
655
+ "text": {
656
+ "$item": "/label"
657
+ },
658
+ "style": "body",
659
+ "fontSize": {
660
+ "$theme": "/styles/body/fontSize",
661
+ "default": 14
662
+ },
663
+ "x": "0%",
664
+ "y": "60%",
665
+ "w": "100%",
666
+ "h": "20%",
667
+ "valign": "top",
668
+ "fit": {
669
+ "maxLines": 2,
670
+ "shrink": [12]
671
+ }
672
+ }
673
+ }
674
+ ]
675
+ }
676
+ }
677
+ ]
678
+ },
679
+ {
680
+ "$if": "/source",
681
+ "then": [
682
+ {
683
+ "name": "shape",
684
+ "props": {
685
+ "type": "line",
686
+ "x": "0%",
687
+ "y": "93.5%",
688
+ "w": "100%",
689
+ "h": 0,
690
+ "line": {
691
+ "color": {
692
+ "$theme": "/palette/rule",
693
+ "default": "background2"
694
+ },
695
+ "width": 0.5
696
+ }
697
+ }
698
+ },
699
+ {
700
+ "name": "text",
701
+ "props": {
702
+ "text": {
703
+ "$slot": "/source"
704
+ },
705
+ "style": "source",
706
+ "fontSize": {
707
+ "$theme": "/styles/source/fontSize",
708
+ "default": 9
709
+ },
710
+ "x": "0%",
711
+ "y": "94.5%",
712
+ "w": "75%",
713
+ "h": "5%"
714
+ }
715
+ }
716
+ ]
717
+ },
718
+ {
719
+ "name": "text",
720
+ "props": {
721
+ "text": "{PAGE_NUMBER} / {PAGE_COUNT}",
722
+ "style": "footer",
723
+ "fontSize": {
724
+ "$theme": "/styles/footer/fontSize",
725
+ "default": 9
726
+ },
727
+ "x": "88%",
728
+ "y": "96%",
729
+ "w": "12%",
730
+ "h": "4%",
731
+ "align": "right"
732
+ }
733
+ }
734
+ ]
735
+ }
736
+ ]
737
+ },
738
+ "two-column": {
739
+ "description": "An action title over a 1.1 : 1 split: prose or up to five bullets on the left, a chart, table or image on the right in the frame the definition owns; an optional source at the foot. Give `text` or `bullets`; with both, the prose wins. Copy and adapt this document-local example.",
740
+ "slots": {
741
+ "title": {
742
+ "type": "string",
743
+ "required": true,
744
+ "oneLine": true,
745
+ "maxWords": 24,
746
+ "role": "actionTitle",
747
+ "description": "The claim the slide proves: a sentence with a number or a verb, two lines at most. Longer titles step down to 24 then 22pt, then fail."
21
748
  },
22
749
  "tracker": {
23
750
  "type": "string",
@@ -26,22 +753,31 @@
26
753
  "role": "tracker",
27
754
  "description": "Section label, top right. Omit it and nothing is drawn."
28
755
  },
29
- "chart": {
756
+ "text": {
757
+ "type": "string",
758
+ "maxWords": 50,
759
+ "description": "Left column as prose, at most fifty words so the slide stays under the density the profiles allow; leave it out to use bullets."
760
+ },
761
+ "bullets": {
762
+ "type": "array",
763
+ "maxItems": 5,
764
+ "items": {
765
+ "type": "string",
766
+ "oneLine": true,
767
+ "maxWords": 10
768
+ },
769
+ "description": "Left column as up to five bullets of ten words; leave it out to use text."
770
+ },
771
+ "content": {
30
772
  "type": "component",
31
773
  "required": true,
32
- "description": "A chart or highcharts component with its data and units. The definition supplies its frame and the theme's series palette; both may be overridden except the frame."
33
- },
34
- "takeaway": {
35
- "type": "string",
36
- "maxWords": 40,
37
- "role": "takeaway",
38
- "description": "What the reader should conclude, set beside the chart under an accent rule."
774
+ "description": "A chart, highcharts, table or image for the right column; the definition owns its frame, the theme paints its series."
39
775
  },
40
776
  "source": {
41
777
  "type": "string",
42
778
  "maxWords": 24,
43
779
  "role": "source",
44
- "description": "Where the numbers come from, e.g. 'Source: company filings, 2026'. Omit it and its rule collapses too."
780
+ "description": "Where the numbers come from. Omit it and its rule collapses too."
45
781
  }
46
782
  },
47
783
  "body": [
@@ -115,82 +851,96 @@
115
851
  }
116
852
  },
117
853
  {
118
- "$slot": "/chart",
854
+ "name": "group",
119
855
  "props": {
120
856
  "x": "0%",
121
857
  "y": "29%",
122
- "w": "68%",
858
+ "w": "100%",
123
859
  "h": "62%",
124
- "chartColors": [
125
- "accent",
126
- "secondary",
127
- "accent4",
128
- "accent6",
129
- "accent5"
130
- ],
131
- "showLegend": true,
132
- "legendPos": "b"
133
- }
134
- },
135
- {
136
- "$if": "/takeaway",
137
- "then": [
860
+ "direction": "row",
861
+ "gap": 0.35,
862
+ "weights": [1.1, 1]
863
+ },
864
+ "children": [
138
865
  {
139
- "name": "shape",
140
- "props": {
141
- "type": "line",
142
- "x": "71%",
143
- "y": "29%",
144
- "w": "29%",
145
- "h": 0,
146
- "line": {
147
- "color": {
148
- "$theme": "/chrome/keyTakeaways/rule/color",
149
- "default": "accent"
866
+ "name": "group",
867
+ "props": {},
868
+ "children": [
869
+ {
870
+ "$if": "/text",
871
+ "then": {
872
+ "name": "text",
873
+ "props": {
874
+ "text": {
875
+ "$slot": "/text"
876
+ },
877
+ "style": "body",
878
+ "fontSize": {
879
+ "$theme": "/styles/body/fontSize",
880
+ "default": 14
881
+ },
882
+ "x": "0%",
883
+ "y": "0%",
884
+ "w": "100%",
885
+ "h": "100%",
886
+ "valign": "top",
887
+ "fit": {
888
+ "shrink": [12, 11]
889
+ }
890
+ }
150
891
  },
151
- "width": {
152
- "$theme": "/chrome/keyTakeaways/rule/weightPt",
153
- "default": 2
892
+ "else": {
893
+ "$if": "/bullets",
894
+ "then": {
895
+ "name": "text",
896
+ "props": {
897
+ "text": {
898
+ "$join": [
899
+ {
900
+ "$slot": "/bullets/0",
901
+ "default": ""
902
+ },
903
+ {
904
+ "$slot": "/bullets/1",
905
+ "default": ""
906
+ },
907
+ {
908
+ "$slot": "/bullets/2",
909
+ "default": ""
910
+ },
911
+ {
912
+ "$slot": "/bullets/3",
913
+ "default": ""
914
+ },
915
+ {
916
+ "$slot": "/bullets/4",
917
+ "default": ""
918
+ }
919
+ ],
920
+ "separator": "\n"
921
+ },
922
+ "style": "body",
923
+ "bullet": true,
924
+ "fontSize": {
925
+ "$theme": "/styles/body/fontSize",
926
+ "default": 14
927
+ },
928
+ "x": "0%",
929
+ "y": "0%",
930
+ "w": "100%",
931
+ "h": "100%",
932
+ "valign": "top",
933
+ "fit": {
934
+ "shrink": [12, 11]
935
+ }
936
+ }
937
+ }
154
938
  }
155
939
  }
156
- }
157
- },
158
- {
159
- "name": "text",
160
- "props": {
161
- "text": "Takeaway",
162
- "style": "eyebrow",
163
- "fontSize": {
164
- "$theme": "/styles/eyebrow/fontSize",
165
- "default": 10
166
- },
167
- "bold": true,
168
- "x": "71%",
169
- "y": "31%",
170
- "w": "29%",
171
- "h": "4.5%"
172
- }
940
+ ]
173
941
  },
174
942
  {
175
- "name": "text",
176
- "props": {
177
- "text": {
178
- "$slot": "/takeaway"
179
- },
180
- "style": "quote",
181
- "fontSize": {
182
- "$theme": "/styles/quote/fontSize",
183
- "default": 18
184
- },
185
- "x": "71%",
186
- "y": "37%",
187
- "w": "29%",
188
- "h": "54%",
189
- "valign": "top",
190
- "fit": {
191
- "shrink": [16, 14, 12]
192
- }
193
- }
943
+ "$slot": "/content"
194
944
  }
195
945
  ]
196
946
  },
@@ -252,6 +1002,146 @@
252
1002
  ]
253
1003
  }
254
1004
  ]
1005
+ },
1006
+ "statement": {
1007
+ "description": "One assertion in the display role, at most fourteen words, with up to thirty words of support beneath it in the quote role: a section divider or a closing slide. Copy and adapt this document-local example.",
1008
+ "slots": {
1009
+ "tracker": {
1010
+ "type": "string",
1011
+ "oneLine": true,
1012
+ "maxWords": 4,
1013
+ "role": "tracker",
1014
+ "description": "Section label, top right. Omit it and nothing is drawn."
1015
+ },
1016
+ "assertion": {
1017
+ "type": "string",
1018
+ "required": true,
1019
+ "maxWords": 14,
1020
+ "role": "actionTitle",
1021
+ "description": "The one sentence, at most fourteen words; steps down to 24 then 22pt."
1022
+ },
1023
+ "support": {
1024
+ "type": "string",
1025
+ "maxWords": 30,
1026
+ "description": "What backs the assertion, at most thirty words."
1027
+ }
1028
+ },
1029
+ "body": [
1030
+ {
1031
+ "name": "group",
1032
+ "props": {
1033
+ "x": "3.75%",
1034
+ "y": "4.5%",
1035
+ "w": "92.5%",
1036
+ "h": "91%"
1037
+ },
1038
+ "children": [
1039
+ {
1040
+ "$if": "/tracker",
1041
+ "then": {
1042
+ "name": "text",
1043
+ "props": {
1044
+ "text": {
1045
+ "$slot": "/tracker"
1046
+ },
1047
+ "style": "tracker",
1048
+ "fontSize": {
1049
+ "$theme": "/styles/tracker/fontSize",
1050
+ "default": 10
1051
+ },
1052
+ "x": "70%",
1053
+ "y": "0%",
1054
+ "w": "30%",
1055
+ "h": "4.5%",
1056
+ "align": "right"
1057
+ }
1058
+ }
1059
+ },
1060
+ {
1061
+ "name": "shape",
1062
+ "props": {
1063
+ "type": "line",
1064
+ "x": "0%",
1065
+ "y": "30%",
1066
+ "w": "16%",
1067
+ "h": 0,
1068
+ "line": {
1069
+ "color": {
1070
+ "$theme": "/chrome/keyTakeaways/rule/color",
1071
+ "default": "accent"
1072
+ },
1073
+ "width": {
1074
+ "$theme": "/chrome/keyTakeaways/rule/weightPt",
1075
+ "default": 2
1076
+ }
1077
+ }
1078
+ }
1079
+ },
1080
+ {
1081
+ "name": "text",
1082
+ "props": {
1083
+ "text": {
1084
+ "$slot": "/assertion"
1085
+ },
1086
+ "style": "display",
1087
+ "fontSize": {
1088
+ "$theme": "/styles/display/fontSize",
1089
+ "default": 28
1090
+ },
1091
+ "x": "0%",
1092
+ "y": "34%",
1093
+ "w": "92%",
1094
+ "h": "30%",
1095
+ "valign": "top",
1096
+ "fit": {
1097
+ "maxLines": 3,
1098
+ "shrink": [24, 22]
1099
+ }
1100
+ }
1101
+ },
1102
+ {
1103
+ "$if": "/support",
1104
+ "then": {
1105
+ "name": "text",
1106
+ "props": {
1107
+ "text": {
1108
+ "$slot": "/support"
1109
+ },
1110
+ "style": "quote",
1111
+ "fontSize": {
1112
+ "$theme": "/styles/quote/fontSize",
1113
+ "default": 18
1114
+ },
1115
+ "x": "0%",
1116
+ "y": "66%",
1117
+ "w": "75%",
1118
+ "h": "18%",
1119
+ "valign": "top",
1120
+ "fit": {
1121
+ "shrink": [16, 14]
1122
+ }
1123
+ }
1124
+ }
1125
+ },
1126
+ {
1127
+ "name": "text",
1128
+ "props": {
1129
+ "text": "{PAGE_NUMBER} / {PAGE_COUNT}",
1130
+ "style": "footer",
1131
+ "fontSize": {
1132
+ "$theme": "/styles/footer/fontSize",
1133
+ "default": 9
1134
+ },
1135
+ "x": "88%",
1136
+ "y": "96%",
1137
+ "w": "12%",
1138
+ "h": "4%",
1139
+ "align": "right"
1140
+ }
1141
+ }
1142
+ ]
1143
+ }
1144
+ ]
255
1145
  }
256
1146
  }
257
1147
  },
@@ -262,66 +1152,62 @@
262
1152
  "meta": {
263
1153
  "title": "Cover"
264
1154
  },
265
- "notes": "A coordinate-authored cover. The cover block itself is a later definition; direct authoring stays available beside blocks."
1155
+ "notes": "The cover block: client and date in the eyebrow, the conclusion as the title, an accent rule from the theme's cover recipe."
266
1156
  },
267
1157
  "children": [
268
1158
  {
269
- "name": "shape",
1159
+ "name": "block",
270
1160
  "props": {
271
- "type": "line",
272
- "x": 0.5,
273
- "y": 2.35,
274
- "w": 2,
275
- "h": 0,
276
- "line": {
277
- "color": "accent",
278
- "width": 3
1161
+ "ref": "cover",
1162
+ "slots": {
1163
+ "title": "Growth improved as delivery became more reliable",
1164
+ "subtitle": "Quarterly client performance review",
1165
+ "client": "Example client",
1166
+ "date": "September 2026",
1167
+ "confidentiality": "Confidential"
279
1168
  }
280
1169
  }
1170
+ }
1171
+ ]
1172
+ },
1173
+ {
1174
+ "name": "slide",
1175
+ "props": {
1176
+ "meta": {
1177
+ "title": "The quarter in four numbers"
281
1178
  },
1179
+ "notes": "A kpi-row block: two to four figures in equal cells, the delta under each."
1180
+ },
1181
+ "children": [
282
1182
  {
283
- "name": "text",
284
- "props": {
285
- "text": "Example client · September 2026",
286
- "style": "eyebrow",
287
- "x": 0.5,
288
- "y": 2.55,
289
- "w": 12,
290
- "h": 0.35
291
- }
292
- },
293
- {
294
- "name": "text",
295
- "props": {
296
- "text": "Growth improved as delivery became more reliable",
297
- "style": "title",
298
- "x": 0.5,
299
- "y": 3.0,
300
- "w": 11,
301
- "h": 1.7,
302
- "valign": "top"
303
- }
304
- },
305
- {
306
- "name": "text",
307
- "props": {
308
- "text": "Quarterly client performance review",
309
- "style": "subtitle",
310
- "x": 0.5,
311
- "y": 4.8,
312
- "w": 11,
313
- "h": 0.5
314
- }
315
- },
316
- {
317
- "name": "text",
1183
+ "name": "block",
318
1184
  "props": {
319
- "text": "Confidential",
320
- "style": "footer",
321
- "x": 0.5,
322
- "y": 6.9,
323
- "w": 4,
324
- "h": 0.3
1185
+ "ref": "kpi-row",
1186
+ "slots": {
1187
+ "title": "Revenue, retention and delivery all moved the right way this quarter",
1188
+ "tracker": "Summary",
1189
+ "items": [
1190
+ {
1191
+ "value": "8.8",
1192
+ "unit": "€m",
1193
+ "label": "Revenue year to date",
1194
+ "delta": "+16.9%"
1195
+ },
1196
+ {
1197
+ "value": "94",
1198
+ "unit": "%",
1199
+ "label": "Client retention",
1200
+ "delta": "+2 pts"
1201
+ },
1202
+ {
1203
+ "value": "11",
1204
+ "unit": "days",
1205
+ "label": "Median time to deliver",
1206
+ "delta": "−3 days"
1207
+ }
1208
+ ],
1209
+ "source": "Source: quarterly operating review, 2026."
1210
+ }
325
1211
  }
326
1212
  }
327
1213
  ]
@@ -409,44 +1295,59 @@
409
1295
  "name": "slide",
410
1296
  "props": {
411
1297
  "meta": {
412
- "title": "Next quarter"
1298
+ "title": "Delivery model"
413
1299
  },
414
- "notes": "A closing statement, coordinate-authored. Blocks and direct coordinates mix freely in one deck."
1300
+ "notes": "A two-column block: bullets on the left, a table on the right at a 1.1 : 1 split."
415
1301
  },
416
1302
  "children": [
417
1303
  {
418
- "name": "text",
419
- "props": {
420
- "text": "Next quarter: protect retention first, then scale delivery capacity",
421
- "style": "display",
422
- "x": 0.5,
423
- "y": 2.6,
424
- "w": 12.333,
425
- "h": 1.4,
426
- "valign": "top"
427
- }
428
- },
429
- {
430
- "name": "text",
1304
+ "name": "block",
431
1305
  "props": {
432
- "text": "Expansion now depends on delivery capacity, not on demand.",
433
- "style": "quote",
434
- "x": 0.5,
435
- "y": 4.1,
436
- "w": 9,
437
- "h": 0.8
1306
+ "ref": "two-column",
1307
+ "slots": {
1308
+ "title": "Weekly ownership closed the gap between promise and delivery",
1309
+ "tracker": "Delivery",
1310
+ "bullets": [
1311
+ "Every account has one named owner and a weekly review",
1312
+ "Late work is escalated on day one, not month end",
1313
+ "Scope changes are priced before they are agreed"
1314
+ ],
1315
+ "content": {
1316
+ "name": "table",
1317
+ "props": {
1318
+ "colW": [2.2, 1.4, 1.4],
1319
+ "rows": [
1320
+ ["Stage", "Before", "After"],
1321
+ ["Intake", "6 days", "2 days"],
1322
+ ["Delivery", "81%", "94%"],
1323
+ ["Renewal", "88%", "94%"]
1324
+ ]
1325
+ }
1326
+ },
1327
+ "source": "Source: delivery tracker, September 2026."
1328
+ }
438
1329
  }
1330
+ }
1331
+ ]
1332
+ },
1333
+ {
1334
+ "name": "slide",
1335
+ "props": {
1336
+ "meta": {
1337
+ "title": "Next quarter"
439
1338
  },
1339
+ "notes": "A statement block: one assertion, thirty words of support."
1340
+ },
1341
+ "children": [
440
1342
  {
441
- "name": "text",
1343
+ "name": "block",
442
1344
  "props": {
443
- "text": "{PAGE_NUMBER} / {PAGE_COUNT}",
444
- "style": "footer",
445
- "x": 11.333,
446
- "y": 6.9,
447
- "w": 1.5,
448
- "h": 0.3,
449
- "align": "right"
1345
+ "ref": "statement",
1346
+ "slots": {
1347
+ "tracker": "Next quarter",
1348
+ "assertion": "Next quarter: protect retention first, then scale delivery capacity",
1349
+ "support": "Expansion now depends on delivery capacity, not on demand; every new account needs a named owner before it is signed."
1350
+ }
450
1351
  }
451
1352
  }
452
1353
  ]