@json-to-office/core-pptx 4.0.0 → 5.3.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.
package/dist/index.js CHANGED
@@ -4588,6 +4588,547 @@ var consulting_pptx_theme_default = {
4588
4588
  // src/themes/consulting.ts
4589
4589
  var CONSULTING_PPTX_THEME = consulting_pptx_theme_default;
4590
4590
 
4591
+ // src/themes/vermilion.pptx.theme.json
4592
+ var vermilion_pptx_theme_default = {
4593
+ name: "vermilion",
4594
+ displayName: "Vermilion Editorial",
4595
+ description: "Poster-red editorial deck \u2014 vermilion display titles, ink text, warm creams and hairline rules; the twin of the DOCX vermilion theme",
4596
+ whenToUse: "Talks and readouts that want a strong red display voice beside a vermilion report: a few large titles, one figure per slide. Not for a dense data deck.",
4597
+ version: "1.0.0",
4598
+ colors: {
4599
+ primary: "#282829",
4600
+ secondary: "#58595B",
4601
+ accent: "#EF4130",
4602
+ background: "#FFFFFF",
4603
+ text: "#282829",
4604
+ text2: "#58595B",
4605
+ background2: "#FAF7F5",
4606
+ accent4: "#F4857A",
4607
+ accent5: "#F9C4BE",
4608
+ accent6: "#939598"
4609
+ },
4610
+ palette: {
4611
+ rule: "#C7C8CA",
4612
+ textMuted: "#939598",
4613
+ onPrimary: "#FFFFFF",
4614
+ surfaceInverse: "#282829",
4615
+ positive: "#2E7D4F",
4616
+ negative: "#B42318",
4617
+ chart: ["accent", "primary", "textMuted", "accent4", "rule", "accent5"]
4618
+ },
4619
+ fonts: {
4620
+ heading: "Arial",
4621
+ body: "Calibri",
4622
+ mono: "Courier New"
4623
+ },
4624
+ defaults: {
4625
+ fontSize: 14,
4626
+ fontColor: "#282829"
4627
+ },
4628
+ styles: {
4629
+ title: {
4630
+ fontSize: 32,
4631
+ bold: true,
4632
+ fontColor: "accent",
4633
+ align: "left"
4634
+ },
4635
+ subtitle: {
4636
+ fontSize: 16,
4637
+ fontColor: "text2",
4638
+ align: "left"
4639
+ },
4640
+ heading1: {
4641
+ fontSize: 24,
4642
+ bold: true,
4643
+ fontColor: "accent"
4644
+ },
4645
+ heading2: {
4646
+ fontSize: 18,
4647
+ bold: true,
4648
+ fontColor: "text"
4649
+ },
4650
+ heading3: {
4651
+ fontSize: 14,
4652
+ bold: true,
4653
+ fontColor: "text2"
4654
+ },
4655
+ body: {
4656
+ fontSize: 14,
4657
+ fontColor: "text"
4658
+ },
4659
+ caption: {
4660
+ fontSize: 10,
4661
+ fontColor: "text2"
4662
+ }
4663
+ },
4664
+ typography: {
4665
+ roles: {
4666
+ eyebrow: {
4667
+ face: "heading",
4668
+ size: 10,
4669
+ weight: 700,
4670
+ case: "upper",
4671
+ tracking: 8,
4672
+ color: "accent"
4673
+ },
4674
+ display: {
4675
+ face: "heading",
4676
+ size: 28,
4677
+ weight: 700,
4678
+ color: "accent",
4679
+ lineHeight: 1.1
4680
+ },
4681
+ stat: {
4682
+ face: "heading",
4683
+ size: 40,
4684
+ weight: 700,
4685
+ color: "accent",
4686
+ lineHeight: 1
4687
+ },
4688
+ quote: {
4689
+ face: "body",
4690
+ size: 18,
4691
+ color: "text2",
4692
+ lineHeight: 1.3
4693
+ },
4694
+ label: {
4695
+ face: "body",
4696
+ size: 12,
4697
+ weight: 700,
4698
+ color: "text2"
4699
+ },
4700
+ footer: {
4701
+ face: "body",
4702
+ size: 9,
4703
+ color: "text2"
4704
+ },
4705
+ tableHeader: {
4706
+ face: "body",
4707
+ size: 12,
4708
+ weight: 700,
4709
+ color: "accent"
4710
+ },
4711
+ tableCell: {
4712
+ face: "body",
4713
+ size: 12,
4714
+ color: "text"
4715
+ },
4716
+ chartLabel: {
4717
+ face: "body",
4718
+ size: 11,
4719
+ weight: 400,
4720
+ color: "text2"
4721
+ },
4722
+ tracker: {
4723
+ face: "body",
4724
+ size: 10,
4725
+ case: "upper",
4726
+ tracking: 6,
4727
+ color: "text2"
4728
+ },
4729
+ source: {
4730
+ face: "body",
4731
+ size: 9,
4732
+ color: "text2"
4733
+ }
4734
+ },
4735
+ scale: {
4736
+ wide169: {
4737
+ base: 14,
4738
+ ratio: 1.2,
4739
+ baselinePt: 2
4740
+ },
4741
+ standard43: {
4742
+ base: 14,
4743
+ ratio: 1.2,
4744
+ baselinePt: 2
4745
+ }
4746
+ }
4747
+ },
4748
+ spacing: {
4749
+ basePt: 8,
4750
+ blockGap: {
4751
+ tight: 4,
4752
+ normal: 8,
4753
+ loose: 16
4754
+ },
4755
+ canvas: {
4756
+ wide169: {
4757
+ safeAreaIn: 0.5,
4758
+ gutterIn: 0.2,
4759
+ columns: 12,
4760
+ rows: 8
4761
+ },
4762
+ standard43: {
4763
+ safeAreaIn: 0.5,
4764
+ gutterIn: 0.2,
4765
+ columns: 12,
4766
+ rows: 8
4767
+ }
4768
+ }
4769
+ },
4770
+ chrome: {
4771
+ runningHead: {
4772
+ type: "tracker",
4773
+ color: "text2",
4774
+ rule: {
4775
+ weightPt: 0.5,
4776
+ color: "rule"
4777
+ },
4778
+ alignment: "right"
4779
+ },
4780
+ tracker: {
4781
+ type: "tracker",
4782
+ color: "text2",
4783
+ alignment: "right"
4784
+ },
4785
+ actionTitle: {
4786
+ type: "display",
4787
+ color: "primary"
4788
+ },
4789
+ keyTakeaways: {
4790
+ type: "label",
4791
+ color: "primary",
4792
+ rule: {
4793
+ weightPt: 1.5,
4794
+ color: "accent"
4795
+ },
4796
+ padPt: 8
4797
+ },
4798
+ sourceLine: {
4799
+ type: "source",
4800
+ color: "text2"
4801
+ },
4802
+ confidentialFooter: {
4803
+ type: "footer",
4804
+ color: "text2",
4805
+ rule: {
4806
+ weightPt: 0.5,
4807
+ color: "rule"
4808
+ },
4809
+ alignment: "left"
4810
+ },
4811
+ logoSlot: {
4812
+ alignment: "right"
4813
+ },
4814
+ cover: {
4815
+ type: "display",
4816
+ color: "primary",
4817
+ rule: {
4818
+ weightPt: 4,
4819
+ color: "accent"
4820
+ }
4821
+ }
4822
+ },
4823
+ motif: {
4824
+ kind: "rule",
4825
+ color: "accent",
4826
+ weightPt: 4,
4827
+ placement: "top"
4828
+ },
4829
+ componentDefaults: {
4830
+ table: {
4831
+ border: {
4832
+ type: "solid",
4833
+ pt: 0.5,
4834
+ color: "#C7C8CA"
4835
+ },
4836
+ headerRow: true,
4837
+ fontSize: 12
4838
+ },
4839
+ chart: {
4840
+ showLegend: true,
4841
+ legendPos: "b",
4842
+ legendFontSize: 11,
4843
+ catAxisLabelFontSize: 11,
4844
+ valAxisLabelFontSize: 11,
4845
+ catGridLine: {
4846
+ style: "none"
4847
+ },
4848
+ valGridLine: {
4849
+ style: "solid",
4850
+ size: 0.5,
4851
+ color: "#EFEAE4"
4852
+ },
4853
+ valAxisLineShow: false
4854
+ }
4855
+ }
4856
+ };
4857
+
4858
+ // src/themes/devportal.pptx.theme.json
4859
+ var devportal_pptx_theme_default = {
4860
+ name: "devportal",
4861
+ displayName: "Field Editorial",
4862
+ description: "Compact editorial deck \u2014 Helvetica in near-black ink with a burnt-orange accent, tight titles, letterspaced labels, warm tinted fills and hairline rules; the twin of the DOCX devportal theme",
4863
+ whenToUse: "Product and engineering readouts, API and platform reviews: dense text, code and tables beside a devportal report. Not for a client's decision deck.",
4864
+ version: "1.0.0",
4865
+ colors: {
4866
+ primary: "#12191F",
4867
+ secondary: "#172028",
4868
+ accent: "#E35B3F",
4869
+ background: "#FFFFFF",
4870
+ text: "#232323",
4871
+ text2: "#46494C",
4872
+ background2: "#F7ECE7",
4873
+ accent4: "#46494C",
4874
+ accent5: "#8A9299",
4875
+ accent6: "#E8A18D"
4876
+ },
4877
+ palette: {
4878
+ rule: "#D8D5D1",
4879
+ textMuted: "#737373",
4880
+ onPrimary: "#FFFFFF",
4881
+ surfaceInverse: "#12191F",
4882
+ positive: "#2E7D4F",
4883
+ negative: "#B42318",
4884
+ chart: ["accent", "primary", "accent4", "accent5", "accent6", "rule"]
4885
+ },
4886
+ fonts: {
4887
+ heading: "Helvetica",
4888
+ body: "Helvetica",
4889
+ mono: "Courier New"
4890
+ },
4891
+ defaults: {
4892
+ fontSize: 14,
4893
+ fontColor: "#232323"
4894
+ },
4895
+ styles: {
4896
+ title: {
4897
+ fontSize: 30,
4898
+ bold: true,
4899
+ fontColor: "text",
4900
+ align: "left"
4901
+ },
4902
+ subtitle: {
4903
+ fontSize: 16,
4904
+ fontColor: "text2",
4905
+ align: "left"
4906
+ },
4907
+ heading1: {
4908
+ fontSize: 24,
4909
+ bold: true,
4910
+ fontColor: "primary"
4911
+ },
4912
+ heading2: {
4913
+ fontSize: 18,
4914
+ bold: true,
4915
+ fontColor: "secondary"
4916
+ },
4917
+ heading3: {
4918
+ fontSize: 14,
4919
+ bold: true,
4920
+ fontColor: "text2"
4921
+ },
4922
+ body: {
4923
+ fontSize: 14,
4924
+ fontColor: "text"
4925
+ },
4926
+ caption: {
4927
+ fontSize: 10,
4928
+ fontColor: "text2"
4929
+ }
4930
+ },
4931
+ typography: {
4932
+ roles: {
4933
+ eyebrow: {
4934
+ face: "heading",
4935
+ size: 10,
4936
+ weight: 700,
4937
+ case: "upper",
4938
+ tracking: 10,
4939
+ color: "accent"
4940
+ },
4941
+ display: {
4942
+ face: "heading",
4943
+ size: 28,
4944
+ weight: 700,
4945
+ color: "primary",
4946
+ lineHeight: 1.1,
4947
+ tracking: -2
4948
+ },
4949
+ stat: {
4950
+ face: "heading",
4951
+ size: 40,
4952
+ weight: 700,
4953
+ color: "accent",
4954
+ lineHeight: 1
4955
+ },
4956
+ quote: {
4957
+ face: "body",
4958
+ size: 18,
4959
+ color: "text2",
4960
+ lineHeight: 1.3
4961
+ },
4962
+ label: {
4963
+ face: "body",
4964
+ size: 12,
4965
+ weight: 700,
4966
+ color: "text2",
4967
+ case: "upper",
4968
+ tracking: 6
4969
+ },
4970
+ footer: {
4971
+ face: "body",
4972
+ size: 9,
4973
+ color: "text2"
4974
+ },
4975
+ tableHeader: {
4976
+ face: "body",
4977
+ size: 12,
4978
+ weight: 700,
4979
+ color: "secondary"
4980
+ },
4981
+ tableCell: {
4982
+ face: "body",
4983
+ size: 12,
4984
+ color: "text"
4985
+ },
4986
+ chartLabel: {
4987
+ face: "body",
4988
+ size: 11,
4989
+ weight: 400,
4990
+ color: "text2"
4991
+ },
4992
+ tracker: {
4993
+ face: "body",
4994
+ size: 10,
4995
+ case: "upper",
4996
+ tracking: 6,
4997
+ color: "text2"
4998
+ },
4999
+ source: {
5000
+ face: "body",
5001
+ size: 9,
5002
+ color: "text2"
5003
+ }
5004
+ },
5005
+ scale: {
5006
+ wide169: {
5007
+ base: 14,
5008
+ ratio: 1.2,
5009
+ baselinePt: 2
5010
+ },
5011
+ standard43: {
5012
+ base: 14,
5013
+ ratio: 1.2,
5014
+ baselinePt: 2
5015
+ }
5016
+ }
5017
+ },
5018
+ spacing: {
5019
+ basePt: 8,
5020
+ blockGap: {
5021
+ tight: 4,
5022
+ normal: 8,
5023
+ loose: 16
5024
+ },
5025
+ canvas: {
5026
+ wide169: {
5027
+ safeAreaIn: 0.5,
5028
+ gutterIn: 0.2,
5029
+ columns: 12,
5030
+ rows: 8
5031
+ },
5032
+ standard43: {
5033
+ safeAreaIn: 0.5,
5034
+ gutterIn: 0.2,
5035
+ columns: 12,
5036
+ rows: 8
5037
+ }
5038
+ }
5039
+ },
5040
+ chrome: {
5041
+ runningHead: {
5042
+ type: "tracker",
5043
+ color: "text2",
5044
+ rule: {
5045
+ weightPt: 0.5,
5046
+ color: "rule"
5047
+ },
5048
+ alignment: "right"
5049
+ },
5050
+ tracker: {
5051
+ type: "tracker",
5052
+ color: "text2",
5053
+ alignment: "right"
5054
+ },
5055
+ actionTitle: {
5056
+ type: "display",
5057
+ color: "primary"
5058
+ },
5059
+ keyTakeaways: {
5060
+ type: "label",
5061
+ color: "primary",
5062
+ rule: {
5063
+ weightPt: 1,
5064
+ color: "accent"
5065
+ },
5066
+ padPt: 8
5067
+ },
5068
+ sourceLine: {
5069
+ type: "source",
5070
+ color: "text2"
5071
+ },
5072
+ confidentialFooter: {
5073
+ type: "footer",
5074
+ color: "text2",
5075
+ rule: {
5076
+ weightPt: 0.5,
5077
+ color: "rule"
5078
+ },
5079
+ alignment: "left"
5080
+ },
5081
+ logoSlot: {
5082
+ alignment: "right"
5083
+ },
5084
+ cover: {
5085
+ type: "display",
5086
+ color: "primary",
5087
+ rule: {
5088
+ weightPt: 3,
5089
+ color: "accent"
5090
+ }
5091
+ }
5092
+ },
5093
+ motif: {
5094
+ kind: "rule",
5095
+ color: "accent",
5096
+ weightPt: 2,
5097
+ placement: "top"
5098
+ },
5099
+ componentDefaults: {
5100
+ table: {
5101
+ border: {
5102
+ type: "solid",
5103
+ pt: 0.5,
5104
+ color: "#D8D5D1"
5105
+ },
5106
+ headerRow: true,
5107
+ fontSize: 12
5108
+ },
5109
+ chart: {
5110
+ showLegend: true,
5111
+ legendPos: "b",
5112
+ legendFontSize: 11,
5113
+ catAxisLabelFontSize: 11,
5114
+ valAxisLabelFontSize: 11,
5115
+ catGridLine: {
5116
+ style: "none"
5117
+ },
5118
+ valGridLine: {
5119
+ style: "solid",
5120
+ size: 0.5,
5121
+ color: "#F2F3F3"
5122
+ },
5123
+ valAxisLineShow: false
5124
+ }
5125
+ }
5126
+ };
5127
+
5128
+ // src/themes/alternates.ts
5129
+ var VERMILION_PPTX_THEME = vermilion_pptx_theme_default;
5130
+ var DEVPORTAL_PPTX_THEME = devportal_pptx_theme_default;
5131
+
4591
5132
  // src/themes/defaults.ts
4592
5133
  var DEFAULT_TABLE = {
4593
5134
  border: { type: "solid", pt: 1, color: "background2" },
@@ -4633,6 +5174,8 @@ var DEFAULT_PPTX_THEME = {
4633
5174
  var PPTX_THEMES = {
4634
5175
  default: DEFAULT_PPTX_THEME,
4635
5176
  consulting: CONSULTING_PPTX_THEME,
5177
+ vermilion: VERMILION_PPTX_THEME,
5178
+ devportal: DEVPORTAL_PPTX_THEME,
4636
5179
  dark: {
4637
5180
  name: "dark",
4638
5181
  displayName: "Dark",
@@ -6258,8 +6801,8 @@ async function generateAndSaveFromJson(jsonConfig, outputPath, options) {
6258
6801
  writeFileSync(outputPath, buffer);
6259
6802
  }
6260
6803
  async function generateFromFile(filePath, outputPath, options) {
6261
- const { readFileSync } = await import("fs");
6262
- const json = readFileSync(filePath, "utf-8");
6804
+ const { readFileSync: readFileSync2 } = await import("fs");
6805
+ const json = readFileSync2(filePath, "utf-8");
6263
6806
  await generateAndSaveFromJson(json, outputPath, options);
6264
6807
  }
6265
6808
  var PresentationGenerator = {
@@ -6274,6 +6817,616 @@ var PresentationGenerator = {
6274
6817
  init_finalizePackage();
6275
6818
  init_warn();
6276
6819
 
6820
+ // src/blueprints/index.ts
6821
+ import { existsSync, readdirSync, readFileSync } from "fs";
6822
+ import { fileURLToPath } from "url";
6823
+ import { dirname, join } from "path";
6824
+ import {
6825
+ instantiateBlueprint,
6826
+ registerBlueprints
6827
+ } from "@json-to-office/shared";
6828
+ import { collectPlaceholders as collectPlaceholders2 } from "@json-to-office/quality";
6829
+
6830
+ // src/templates/blueprints/consulting-deck.pptx.blueprint.json
6831
+ var consulting_deck_pptx_blueprint_default = {
6832
+ id: "consulting-deck",
6833
+ format: "pptx",
6834
+ title: "Consulting deck",
6835
+ description: "A decision deck for a client readout: a cover, the quarter in numbers, one action-chart per finding with its takeaway and source, a two-column slide for the evidence that is a table or a list, a closing statement; every slide invokes one of the five consulting blocks on the house theme.",
6836
+ whenToUse: "A client readout, a board update or a steering-committee deck: one message per slide, a chart or table that carries it, a source under it. Not for a talk track or a training deck.",
6837
+ theme: "consulting",
6838
+ profile: "consulting-deck",
6839
+ definitions: "consulting-deck-blocks.pptx.json",
6840
+ numbering: "none",
6841
+ toc: false,
6842
+ variants: {
6843
+ "data-heavy": {
6844
+ description: "Evidence-led: cover, a KPI row, three action-charts, a two-column table slide, a closing statement.",
6845
+ whenToUse: "The brief comes with numbers the audience will check: performance, finance, operations.",
6846
+ pages: {
6847
+ min: 6,
6848
+ max: 9
6849
+ },
6850
+ metadata: {
6851
+ title: "{{Title: as on the cover}}",
6852
+ author: "{{Author or team}}",
6853
+ company: "{{Client name}}"
6854
+ },
6855
+ children: [
6856
+ {
6857
+ name: "slide",
6858
+ children: [
6859
+ {
6860
+ name: "block",
6861
+ props: {
6862
+ ref: "cover",
6863
+ slots: {
6864
+ title: "{{Title: the deck's conclusion in one sentence}}",
6865
+ subtitle: "{{Subtitle: what the deck answers, for whom}}",
6866
+ client: "{{Client name}}",
6867
+ date: "{{Month YYYY}}",
6868
+ confidentiality: "{{Confidentiality: Confidential, or For internal use}}"
6869
+ }
6870
+ }
6871
+ }
6872
+ ]
6873
+ },
6874
+ {
6875
+ name: "slide",
6876
+ children: [
6877
+ {
6878
+ name: "block",
6879
+ props: {
6880
+ ref: "kpi-row",
6881
+ slots: {
6882
+ title: "{{Action title: the claim this slide proves, with its number, two lines at most}}",
6883
+ tracker: "{{Tracker: the section, one or two words}}",
6884
+ items: [
6885
+ {
6886
+ value: "{{0.0}}",
6887
+ unit: "{{unit}}",
6888
+ label: "{{What it measures}}",
6889
+ delta: "{{+0.0}}"
6890
+ },
6891
+ {
6892
+ value: "{{0.0}}",
6893
+ unit: "{{unit}}",
6894
+ label: "{{What it measures}}",
6895
+ delta: "{{+0.0}}"
6896
+ },
6897
+ {
6898
+ value: "{{0.0}}",
6899
+ unit: "{{unit}}",
6900
+ label: "{{What it measures}}",
6901
+ delta: "{{+0.0}}"
6902
+ }
6903
+ ],
6904
+ source: "{{Source: system or document, date}}"
6905
+ }
6906
+ }
6907
+ }
6908
+ ]
6909
+ },
6910
+ {
6911
+ name: "slide",
6912
+ children: [
6913
+ {
6914
+ name: "block",
6915
+ props: {
6916
+ ref: "action-chart",
6917
+ slots: {
6918
+ title: "{{Action title: the claim this slide proves, with its number, two lines at most}}",
6919
+ tracker: "{{Tracker: the section, one or two words}}",
6920
+ chart: {
6921
+ name: "chart",
6922
+ props: {
6923
+ type: "bar",
6924
+ valAxisTitle: "{{Measure (unit)}}",
6925
+ data: [
6926
+ {
6927
+ name: "{{Series name}}",
6928
+ labels: [
6929
+ "{{Period 1}}",
6930
+ "{{Period 2}}",
6931
+ "{{Period 3}}"
6932
+ ],
6933
+ values: [0, 0, 0]
6934
+ }
6935
+ ],
6936
+ chartColors: [
6937
+ "accent",
6938
+ "secondary",
6939
+ "accent4",
6940
+ "accent6",
6941
+ "accent5"
6942
+ ]
6943
+ }
6944
+ },
6945
+ takeaway: "{{Takeaway: what the reader should conclude, one or two sentences}}",
6946
+ source: "{{Source: system or document, date}}"
6947
+ }
6948
+ }
6949
+ }
6950
+ ]
6951
+ },
6952
+ {
6953
+ name: "slide",
6954
+ children: [
6955
+ {
6956
+ name: "block",
6957
+ props: {
6958
+ ref: "action-chart",
6959
+ slots: {
6960
+ title: "{{Action title: the claim this slide proves, with its number, two lines at most}}",
6961
+ tracker: "{{Tracker: the section, one or two words}}",
6962
+ chart: {
6963
+ name: "chart",
6964
+ props: {
6965
+ type: "bar",
6966
+ valAxisTitle: "{{Measure (unit)}}",
6967
+ data: [
6968
+ {
6969
+ name: "{{Series name}}",
6970
+ labels: [
6971
+ "{{Period 1}}",
6972
+ "{{Period 2}}",
6973
+ "{{Period 3}}"
6974
+ ],
6975
+ values: [0, 0, 0]
6976
+ }
6977
+ ],
6978
+ chartColors: [
6979
+ "accent",
6980
+ "secondary",
6981
+ "accent4",
6982
+ "accent6",
6983
+ "accent5"
6984
+ ]
6985
+ }
6986
+ },
6987
+ takeaway: "{{Takeaway: what the reader should conclude, one or two sentences}}",
6988
+ source: "{{Source: system or document, date}}"
6989
+ }
6990
+ }
6991
+ }
6992
+ ]
6993
+ },
6994
+ {
6995
+ name: "slide",
6996
+ children: [
6997
+ {
6998
+ name: "block",
6999
+ props: {
7000
+ ref: "action-chart",
7001
+ slots: {
7002
+ title: "{{Action title: the claim this slide proves, with its number, two lines at most}}",
7003
+ tracker: "{{Tracker: the section, one or two words}}",
7004
+ chart: {
7005
+ name: "chart",
7006
+ props: {
7007
+ type: "bar",
7008
+ valAxisTitle: "{{Measure (unit)}}",
7009
+ data: [
7010
+ {
7011
+ name: "{{Series name}}",
7012
+ labels: [
7013
+ "{{Period 1}}",
7014
+ "{{Period 2}}",
7015
+ "{{Period 3}}"
7016
+ ],
7017
+ values: [0, 0, 0]
7018
+ }
7019
+ ],
7020
+ chartColors: [
7021
+ "accent",
7022
+ "secondary",
7023
+ "accent4",
7024
+ "accent6",
7025
+ "accent5"
7026
+ ]
7027
+ }
7028
+ },
7029
+ takeaway: "{{Takeaway: what the reader should conclude, one or two sentences}}",
7030
+ source: "{{Source: system or document, date}}"
7031
+ }
7032
+ }
7033
+ }
7034
+ ]
7035
+ },
7036
+ {
7037
+ name: "slide",
7038
+ children: [
7039
+ {
7040
+ name: "block",
7041
+ props: {
7042
+ ref: "two-column",
7043
+ slots: {
7044
+ title: "{{Action title: the claim this slide proves, with its number, two lines at most}}",
7045
+ tracker: "{{Tracker: the section, one or two words}}",
7046
+ bullets: [
7047
+ "{{Bullet 1: one claim, ten words}}",
7048
+ "{{Bullet 2: one claim, ten words}}",
7049
+ "{{Bullet 3: one claim, ten words}}"
7050
+ ],
7051
+ content: {
7052
+ name: "table",
7053
+ props: {
7054
+ rows: [
7055
+ [
7056
+ "{{Row label}}",
7057
+ {
7058
+ text: "{{Column (unit)}}",
7059
+ align: "right"
7060
+ },
7061
+ {
7062
+ text: "{{Column (unit)}}",
7063
+ align: "right"
7064
+ }
7065
+ ],
7066
+ [
7067
+ "{{Row 1}}",
7068
+ {
7069
+ text: "{{0.0}}",
7070
+ align: "right"
7071
+ },
7072
+ {
7073
+ text: "{{0.0}}",
7074
+ align: "right"
7075
+ }
7076
+ ],
7077
+ [
7078
+ "{{Row 2}}",
7079
+ {
7080
+ text: "{{0.0}}",
7081
+ align: "right"
7082
+ },
7083
+ {
7084
+ text: "{{0.0}}",
7085
+ align: "right"
7086
+ }
7087
+ ],
7088
+ [
7089
+ "{{Row 3}}",
7090
+ {
7091
+ text: "{{0.0}}",
7092
+ align: "right"
7093
+ },
7094
+ {
7095
+ text: "{{0.0}}",
7096
+ align: "right"
7097
+ }
7098
+ ]
7099
+ ]
7100
+ }
7101
+ },
7102
+ source: "{{Source: system or document, date}}"
7103
+ }
7104
+ }
7105
+ }
7106
+ ]
7107
+ },
7108
+ {
7109
+ name: "slide",
7110
+ children: [
7111
+ {
7112
+ name: "block",
7113
+ props: {
7114
+ ref: "statement",
7115
+ slots: {
7116
+ tracker: "{{Tracker: the section, one or two words}}",
7117
+ assertion: "{{Assertion: what to do next, in one sentence}}",
7118
+ support: "{{Support: what backs the assertion, under thirty words}}"
7119
+ }
7120
+ }
7121
+ }
7122
+ ]
7123
+ }
7124
+ ]
7125
+ },
7126
+ narrative: {
7127
+ description: "Argument-led: cover, the position as a statement, two two-column slides that argue it beside a chart, one action-chart, a two-column table, a closing statement.",
7128
+ whenToUse: "The brief is a position or a recommendation with few numbers; the audience follows an argument.",
7129
+ pages: {
7130
+ min: 6,
7131
+ max: 8
7132
+ },
7133
+ metadata: {
7134
+ title: "{{Title: as on the cover}}",
7135
+ author: "{{Author or team}}",
7136
+ company: "{{Client name}}"
7137
+ },
7138
+ children: [
7139
+ {
7140
+ name: "slide",
7141
+ children: [
7142
+ {
7143
+ name: "block",
7144
+ props: {
7145
+ ref: "cover",
7146
+ slots: {
7147
+ title: "{{Title: the deck's conclusion in one sentence}}",
7148
+ subtitle: "{{Subtitle: what the deck answers, for whom}}",
7149
+ client: "{{Client name}}",
7150
+ date: "{{Month YYYY}}",
7151
+ confidentiality: "{{Confidentiality: Confidential, or For internal use}}"
7152
+ }
7153
+ }
7154
+ }
7155
+ ]
7156
+ },
7157
+ {
7158
+ name: "slide",
7159
+ children: [
7160
+ {
7161
+ name: "block",
7162
+ props: {
7163
+ ref: "statement",
7164
+ slots: {
7165
+ tracker: "{{Tracker: the section, one or two words}}",
7166
+ assertion: "{{Assertion: the position, in one sentence}}",
7167
+ support: "{{Support: what backs the assertion, under thirty words}}"
7168
+ }
7169
+ }
7170
+ }
7171
+ ]
7172
+ },
7173
+ {
7174
+ name: "slide",
7175
+ children: [
7176
+ {
7177
+ name: "block",
7178
+ props: {
7179
+ ref: "two-column",
7180
+ slots: {
7181
+ title: "{{Action title: the claim this slide proves, with its number, two lines at most}}",
7182
+ tracker: "{{Tracker: the section, one or two words}}",
7183
+ text: "{{Body: the argument this slide makes, under fifty words}}",
7184
+ content: {
7185
+ name: "chart",
7186
+ props: {
7187
+ type: "bar",
7188
+ valAxisTitle: "{{Measure (unit)}}",
7189
+ data: [
7190
+ {
7191
+ name: "{{Series name}}",
7192
+ labels: [
7193
+ "{{Period 1}}",
7194
+ "{{Period 2}}",
7195
+ "{{Period 3}}"
7196
+ ],
7197
+ values: [0, 0, 0]
7198
+ }
7199
+ ],
7200
+ chartColors: [
7201
+ "accent",
7202
+ "secondary",
7203
+ "accent4",
7204
+ "accent6",
7205
+ "accent5"
7206
+ ]
7207
+ }
7208
+ },
7209
+ source: "{{Source: system or document, date}}"
7210
+ }
7211
+ }
7212
+ }
7213
+ ]
7214
+ },
7215
+ {
7216
+ name: "slide",
7217
+ children: [
7218
+ {
7219
+ name: "block",
7220
+ props: {
7221
+ ref: "two-column",
7222
+ slots: {
7223
+ title: "{{Action title: the claim this slide proves, with its number, two lines at most}}",
7224
+ tracker: "{{Tracker: the section, one or two words}}",
7225
+ text: "{{Body: the argument this slide makes, under fifty words}}",
7226
+ content: {
7227
+ name: "chart",
7228
+ props: {
7229
+ type: "bar",
7230
+ valAxisTitle: "{{Measure (unit)}}",
7231
+ data: [
7232
+ {
7233
+ name: "{{Series name}}",
7234
+ labels: [
7235
+ "{{Period 1}}",
7236
+ "{{Period 2}}",
7237
+ "{{Period 3}}"
7238
+ ],
7239
+ values: [0, 0, 0]
7240
+ }
7241
+ ],
7242
+ chartColors: [
7243
+ "accent",
7244
+ "secondary",
7245
+ "accent4",
7246
+ "accent6",
7247
+ "accent5"
7248
+ ]
7249
+ }
7250
+ },
7251
+ source: "{{Source: system or document, date}}"
7252
+ }
7253
+ }
7254
+ }
7255
+ ]
7256
+ },
7257
+ {
7258
+ name: "slide",
7259
+ children: [
7260
+ {
7261
+ name: "block",
7262
+ props: {
7263
+ ref: "action-chart",
7264
+ slots: {
7265
+ title: "{{Action title: the claim this slide proves, with its number, two lines at most}}",
7266
+ tracker: "{{Tracker: the section, one or two words}}",
7267
+ chart: {
7268
+ name: "chart",
7269
+ props: {
7270
+ type: "bar",
7271
+ valAxisTitle: "{{Measure (unit)}}",
7272
+ data: [
7273
+ {
7274
+ name: "{{Series name}}",
7275
+ labels: [
7276
+ "{{Period 1}}",
7277
+ "{{Period 2}}",
7278
+ "{{Period 3}}"
7279
+ ],
7280
+ values: [0, 0, 0]
7281
+ }
7282
+ ],
7283
+ chartColors: [
7284
+ "accent",
7285
+ "secondary",
7286
+ "accent4",
7287
+ "accent6",
7288
+ "accent5"
7289
+ ]
7290
+ }
7291
+ },
7292
+ takeaway: "{{Takeaway: what the reader should conclude, one or two sentences}}",
7293
+ source: "{{Source: system or document, date}}"
7294
+ }
7295
+ }
7296
+ }
7297
+ ]
7298
+ },
7299
+ {
7300
+ name: "slide",
7301
+ children: [
7302
+ {
7303
+ name: "block",
7304
+ props: {
7305
+ ref: "two-column",
7306
+ slots: {
7307
+ title: "{{Action title: the claim this slide proves, with its number, two lines at most}}",
7308
+ tracker: "{{Tracker: the section, one or two words}}",
7309
+ bullets: [
7310
+ "{{Bullet 1: one claim, ten words}}",
7311
+ "{{Bullet 2: one claim, ten words}}",
7312
+ "{{Bullet 3: one claim, ten words}}"
7313
+ ],
7314
+ content: {
7315
+ name: "table",
7316
+ props: {
7317
+ rows: [
7318
+ [
7319
+ "{{Row label}}",
7320
+ {
7321
+ text: "{{Column (unit)}}",
7322
+ align: "right"
7323
+ },
7324
+ {
7325
+ text: "{{Column (unit)}}",
7326
+ align: "right"
7327
+ }
7328
+ ],
7329
+ [
7330
+ "{{Row 1}}",
7331
+ {
7332
+ text: "{{0.0}}",
7333
+ align: "right"
7334
+ },
7335
+ {
7336
+ text: "{{0.0}}",
7337
+ align: "right"
7338
+ }
7339
+ ],
7340
+ [
7341
+ "{{Row 2}}",
7342
+ {
7343
+ text: "{{0.0}}",
7344
+ align: "right"
7345
+ },
7346
+ {
7347
+ text: "{{0.0}}",
7348
+ align: "right"
7349
+ }
7350
+ ],
7351
+ [
7352
+ "{{Row 3}}",
7353
+ {
7354
+ text: "{{0.0}}",
7355
+ align: "right"
7356
+ },
7357
+ {
7358
+ text: "{{0.0}}",
7359
+ align: "right"
7360
+ }
7361
+ ]
7362
+ ]
7363
+ }
7364
+ },
7365
+ source: "{{Source: system or document, date}}"
7366
+ }
7367
+ }
7368
+ }
7369
+ ]
7370
+ },
7371
+ {
7372
+ name: "slide",
7373
+ children: [
7374
+ {
7375
+ name: "block",
7376
+ props: {
7377
+ ref: "statement",
7378
+ slots: {
7379
+ tracker: "{{Tracker: the section, one or two words}}",
7380
+ assertion: "{{Assertion: what to do next, in one sentence}}",
7381
+ support: "{{Support: what backs the assertion, under thirty words}}"
7382
+ }
7383
+ }
7384
+ }
7385
+ ]
7386
+ }
7387
+ ]
7388
+ }
7389
+ }
7390
+ };
7391
+
7392
+ // src/blueprints/index.ts
7393
+ function scanned(known) {
7394
+ let here;
7395
+ try {
7396
+ here = dirname(fileURLToPath(import.meta.url));
7397
+ } catch {
7398
+ return [];
7399
+ }
7400
+ const directory = [
7401
+ join(here, "../templates/blueprints"),
7402
+ join(here, "templates/blueprints")
7403
+ ].find((path4) => existsSync(path4));
7404
+ if (!directory) return [];
7405
+ return readdirSync(directory).filter((file) => file.endsWith(".pptx.blueprint.json")).map((file) => JSON.parse(readFileSync(join(directory, file), "utf8"))).filter((candidate) => {
7406
+ const id = candidate?.id;
7407
+ return !(typeof id === "string" && id in known);
7408
+ });
7409
+ }
7410
+ var bundled = registerBlueprints("pptx", [consulting_deck_pptx_blueprint_default]);
7411
+ var PPTX_BLUEPRINTS = {
7412
+ ...bundled,
7413
+ ...registerBlueprints("pptx", scanned(bundled))
7414
+ };
7415
+ function pptxBlueprint(id) {
7416
+ return PPTX_BLUEPRINTS[id];
7417
+ }
7418
+ var CANVAS = { slideWidth: 13.333, slideHeight: 7.5 };
7419
+ function instantiatePptxBlueprint(blueprint, options) {
7420
+ return instantiateBlueprint(blueprint, options, {
7421
+ format: "pptx",
7422
+ props: CANVAS,
7423
+ metadataPointer: "/props",
7424
+ markers: (document) => collectPlaceholders2(document).filter(
7425
+ (occurrence) => occurrence.match.kind === "scaffold-marker"
7426
+ )
7427
+ });
7428
+ }
7429
+
6277
7430
  // src/quality/preflight.ts
6278
7431
  import {
6279
7432
  assertValidQualityPolicy,
@@ -7613,13 +8766,16 @@ export {
7613
8766
  DEFAULT_GENERATED_AT,
7614
8767
  DEFAULT_PPTX_RENDERER_ID,
7615
8768
  DEFAULT_PPTX_THEME,
8769
+ DEVPORTAL_PPTX_THEME,
7616
8770
  DuplicateComponentError,
8771
+ PPTX_BLUEPRINTS,
7617
8772
  PPTX_DEFAULT_QUALITY_PROFILE,
7618
8773
  PPTX_QUALITY_PROFILES,
7619
8774
  PPTX_QUALITY_RULES,
7620
8775
  PresentationGenerator,
7621
8776
  PresentationValidationError,
7622
8777
  UncompiledComponentError,
8778
+ VERMILION_PPTX_THEME,
7623
8779
  W as WarningCodes,
7624
8780
  analyzePptxQuality,
7625
8781
  blockSlotBudgets,
@@ -7639,10 +8795,12 @@ export {
7639
8795
  getPptxCoreVersion,
7640
8796
  getPptxTheme,
7641
8797
  hasPptxTheme,
8798
+ instantiatePptxBlueprint,
7642
8799
  isPptxRendererId,
7643
8800
  isPresentationComponent,
7644
8801
  isPresentationComponentDefinition,
7645
8802
  isSlideComponent,
8803
+ pptxBlueprint,
7646
8804
  pptxQualityEngine,
7647
8805
  pptxRendererIds,
7648
8806
  pptxRendererStatuses,