@openpresentation/opf 0.1.0 → 0.2.2

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 (499) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +146 -103
  3. package/dist/catalogs.d.ts +11 -1531
  4. package/dist/catalogs.js +5 -613
  5. package/dist/catalogs.js.map +1 -1
  6. package/dist/index.d.ts +3 -1
  7. package/dist/index.js +3862 -662
  8. package/dist/index.js.map +1 -1
  9. package/dist/previews.d.ts +40 -0
  10. package/dist/previews.js +447 -0
  11. package/dist/previews.js.map +1 -0
  12. package/dist/schemas.d.ts +153 -141
  13. package/dist/schemas.js +57 -48
  14. package/dist/schemas.js.map +1 -1
  15. package/dist/spec/catalogs/audiences/all-hands.json +23 -23
  16. package/dist/spec/catalogs/audiences/board.json +22 -22
  17. package/dist/spec/catalogs/audiences/candidates.json +23 -23
  18. package/dist/spec/catalogs/audiences/customers.json +23 -23
  19. package/dist/spec/catalogs/audiences/engineering-team.json +23 -23
  20. package/dist/spec/catalogs/audiences/executives.json +23 -23
  21. package/dist/spec/catalogs/audiences/index.json +67 -67
  22. package/dist/spec/catalogs/audiences/investors.json +23 -23
  23. package/dist/spec/catalogs/audiences/marketing-team.json +23 -23
  24. package/dist/spec/catalogs/audiences/regulators.json +23 -23
  25. package/dist/spec/catalogs/audiences/sales-team.json +23 -23
  26. package/dist/spec/catalogs/chart-types/100pct-bullet-bar-2x.json +86 -90
  27. package/dist/spec/catalogs/chart-types/100pct-bullet-bar-3x.json +98 -102
  28. package/dist/spec/catalogs/chart-types/100pct-bullet-bar.json +74 -78
  29. package/dist/spec/catalogs/chart-types/100pct-bullet-column-2x.json +86 -90
  30. package/dist/spec/catalogs/chart-types/100pct-bullet-column-3x.json +98 -102
  31. package/dist/spec/catalogs/chart-types/100pct-bullet-column.json +74 -78
  32. package/dist/spec/catalogs/chart-types/100pct-progress-bar.json +95 -99
  33. package/dist/spec/catalogs/chart-types/100pct-stacked-area-2x.json +96 -100
  34. package/dist/spec/catalogs/chart-types/100pct-stacked-area-3x.json +118 -122
  35. package/dist/spec/catalogs/chart-types/100pct-stacked-bar-2x.json +79 -83
  36. package/dist/spec/catalogs/chart-types/100pct-stacked-bar-3x.json +95 -99
  37. package/dist/spec/catalogs/chart-types/100pct-stacked-column-2x.json +85 -89
  38. package/dist/spec/catalogs/chart-types/100pct-stacked-column-3x.json +103 -107
  39. package/dist/spec/catalogs/chart-types/area.json +73 -77
  40. package/dist/spec/catalogs/chart-types/australia.json +66 -70
  41. package/dist/spec/catalogs/chart-types/bar.json +63 -67
  42. package/dist/spec/catalogs/chart-types/box-and-whisker-2x.json +126 -130
  43. package/dist/spec/catalogs/chart-types/box-and-whisker-3x.json +158 -162
  44. package/dist/spec/catalogs/chart-types/box-and-whisker.json +94 -98
  45. package/dist/spec/catalogs/chart-types/bullet-bar-2x.json +84 -88
  46. package/dist/spec/catalogs/chart-types/bullet-bar-3x.json +96 -100
  47. package/dist/spec/catalogs/chart-types/bullet-bar.json +72 -76
  48. package/dist/spec/catalogs/chart-types/bullet-column-2x.json +84 -88
  49. package/dist/spec/catalogs/chart-types/bullet-column-3x.json +96 -100
  50. package/dist/spec/catalogs/chart-types/bullet-column.json +72 -76
  51. package/dist/spec/catalogs/chart-types/canada.json +76 -80
  52. package/dist/spec/catalogs/chart-types/clustered-bar-2x.json +79 -83
  53. package/dist/spec/catalogs/chart-types/clustered-column.json +85 -89
  54. package/dist/spec/catalogs/chart-types/column.json +67 -71
  55. package/dist/spec/catalogs/chart-types/dot-plot-2x.json +94 -98
  56. package/dist/spec/catalogs/chart-types/dot-plot-3x.json +119 -123
  57. package/dist/spec/catalogs/chart-types/dot-plot-4x.json +144 -148
  58. package/dist/spec/catalogs/chart-types/dot-plot-5x.json +169 -173
  59. package/dist/spec/catalogs/chart-types/dot-plot-6x.json +194 -198
  60. package/dist/spec/catalogs/chart-types/dot-plot.json +69 -73
  61. package/dist/spec/catalogs/chart-types/doughnut.json +53 -57
  62. package/dist/spec/catalogs/chart-types/dumbbell.json +115 -119
  63. package/dist/spec/catalogs/chart-types/filled-radar.json +66 -70
  64. package/dist/spec/catalogs/chart-types/funnel.json +60 -64
  65. package/dist/spec/catalogs/chart-types/histogram.json +141 -145
  66. package/dist/spec/catalogs/chart-types/index.json +539 -843
  67. package/dist/spec/catalogs/chart-types/line-2x.json +95 -99
  68. package/dist/spec/catalogs/chart-types/line-3x.json +117 -121
  69. package/dist/spec/catalogs/chart-types/line-with-high-low-and-markers.json +139 -143
  70. package/dist/spec/catalogs/chart-types/line-with-high-low.json +139 -143
  71. package/dist/spec/catalogs/chart-types/line-with-markers-2x.json +96 -100
  72. package/dist/spec/catalogs/chart-types/line-with-markers-3x.json +118 -122
  73. package/dist/spec/catalogs/chart-types/line-with-markers.json +74 -78
  74. package/dist/spec/catalogs/chart-types/line.json +73 -77
  75. package/dist/spec/catalogs/chart-types/pareto.json +159 -163
  76. package/dist/spec/catalogs/chart-types/pie.json +53 -57
  77. package/dist/spec/catalogs/chart-types/radar-with-markers.json +66 -70
  78. package/dist/spec/catalogs/chart-types/radar.json +66 -70
  79. package/dist/spec/catalogs/chart-types/scatter.json +87 -91
  80. package/dist/spec/catalogs/chart-types/sparkline-2x.json +133 -137
  81. package/dist/spec/catalogs/chart-types/sparkline-3x.json +169 -173
  82. package/dist/spec/catalogs/chart-types/sparkline-4x.json +205 -209
  83. package/dist/spec/catalogs/chart-types/sparkline-5x.json +241 -245
  84. package/dist/spec/catalogs/chart-types/sparkline-6x.json +277 -281
  85. package/dist/spec/catalogs/chart-types/sparkline.json +97 -101
  86. package/dist/spec/catalogs/chart-types/stacked-area-2x.json +96 -100
  87. package/dist/spec/catalogs/chart-types/stacked-area-3x.json +118 -122
  88. package/dist/spec/catalogs/chart-types/stacked-bar-2x.json +79 -83
  89. package/dist/spec/catalogs/chart-types/stacked-bar-3x.json +95 -99
  90. package/dist/spec/catalogs/chart-types/stacked-column-2x.json +85 -89
  91. package/dist/spec/catalogs/chart-types/stacked-column-3x.json +103 -107
  92. package/dist/spec/catalogs/chart-types/stacked-line-2x.json +96 -100
  93. package/dist/spec/catalogs/chart-types/stacked-line-3x.json +118 -122
  94. package/dist/spec/catalogs/chart-types/stacked-line-with-markers-2x.json +97 -101
  95. package/dist/spec/catalogs/chart-types/stacked-line-with-markers-3x.json +119 -123
  96. package/dist/spec/catalogs/chart-types/treemap-2x.json +91 -95
  97. package/dist/spec/catalogs/chart-types/treemap-3x.json +112 -116
  98. package/dist/spec/catalogs/chart-types/treemap.json +62 -66
  99. package/dist/spec/catalogs/chart-types/{united-kindom.json → united-kingdom.json} +58 -62
  100. package/dist/spec/catalogs/chart-types/united-states.json +72 -76
  101. package/dist/spec/catalogs/chart-types/waterfall.json +66 -70
  102. package/dist/spec/catalogs/chart-types/world.json +78 -82
  103. package/dist/spec/catalogs/color-schemes/black-and-white.json +17 -17
  104. package/dist/spec/catalogs/color-schemes/bold-red.json +17 -17
  105. package/dist/spec/catalogs/color-schemes/boost.json +17 -17
  106. package/dist/spec/catalogs/color-schemes/burnt-orange.json +17 -17
  107. package/dist/spec/catalogs/color-schemes/cool-horizon.json +17 -17
  108. package/dist/spec/catalogs/color-schemes/corporate-blue.json +17 -17
  109. package/dist/spec/catalogs/color-schemes/deep-purple.json +17 -17
  110. package/dist/spec/catalogs/color-schemes/forest-green.json +17 -17
  111. package/dist/spec/catalogs/color-schemes/golden-yellow.json +17 -17
  112. package/dist/spec/catalogs/color-schemes/index.json +77 -77
  113. package/dist/spec/catalogs/color-schemes/luxury.json +17 -17
  114. package/dist/spec/catalogs/color-schemes/pastel-red.json +17 -17
  115. package/dist/spec/catalogs/color-schemes/slate-gray.json +17 -17
  116. package/dist/spec/catalogs/color-schemes/steel-blue.json +17 -17
  117. package/dist/spec/catalogs/color-schemes/vibes.json +17 -17
  118. package/dist/spec/catalogs/font-schemes/angsana-new.json +14 -14
  119. package/dist/spec/catalogs/font-schemes/aparajita.json +15 -15
  120. package/dist/spec/catalogs/font-schemes/aptos.json +12 -12
  121. package/dist/spec/catalogs/font-schemes/arabic-typesetting.json +14 -14
  122. package/dist/spec/catalogs/font-schemes/arial.json +12 -12
  123. package/dist/spec/catalogs/font-schemes/batang.json +14 -14
  124. package/dist/spec/catalogs/font-schemes/bookman.json +12 -12
  125. package/dist/spec/catalogs/font-schemes/calibri.json +12 -12
  126. package/dist/spec/catalogs/font-schemes/century-schoolbook.json +12 -12
  127. package/dist/spec/catalogs/font-schemes/consolas.json +12 -12
  128. package/dist/spec/catalogs/font-schemes/constantia.json +12 -12
  129. package/dist/spec/catalogs/font-schemes/courier-new.json +12 -12
  130. package/dist/spec/catalogs/font-schemes/daunpenh.json +14 -14
  131. package/dist/spec/catalogs/font-schemes/david.json +14 -14
  132. package/dist/spec/catalogs/font-schemes/dilleniaupc.json +14 -14
  133. package/dist/spec/catalogs/font-schemes/fangsong.json +14 -14
  134. package/dist/spec/catalogs/font-schemes/garamond.json +12 -12
  135. package/dist/spec/catalogs/font-schemes/gautami.json +14 -14
  136. package/dist/spec/catalogs/font-schemes/georgia.json +12 -12
  137. package/dist/spec/catalogs/font-schemes/gisha.json +15 -15
  138. package/dist/spec/catalogs/font-schemes/grandview.json +12 -12
  139. package/dist/spec/catalogs/font-schemes/gungsuh.json +14 -14
  140. package/dist/spec/catalogs/font-schemes/impact.json +12 -12
  141. package/dist/spec/catalogs/font-schemes/index.json +452 -452
  142. package/dist/spec/catalogs/font-schemes/kalinga.json +14 -14
  143. package/dist/spec/catalogs/font-schemes/kartika.json +14 -14
  144. package/dist/spec/catalogs/font-schemes/khmer-ui.json +14 -14
  145. package/dist/spec/catalogs/font-schemes/latha.json +14 -14
  146. package/dist/spec/catalogs/font-schemes/lucida-sans.json +12 -12
  147. package/dist/spec/catalogs/font-schemes/malgun-gothic.json +14 -14
  148. package/dist/spec/catalogs/font-schemes/mangal.json +17 -17
  149. package/dist/spec/catalogs/font-schemes/meiryo.json +14 -14
  150. package/dist/spec/catalogs/font-schemes/microsoft-jhenghei.json +14 -14
  151. package/dist/spec/catalogs/font-schemes/microsoft-yahei.json +17 -17
  152. package/dist/spec/catalogs/font-schemes/mingliu.json +14 -14
  153. package/dist/spec/catalogs/font-schemes/miriam.json +14 -14
  154. package/dist/spec/catalogs/font-schemes/montserrat.json +12 -12
  155. package/dist/spec/catalogs/font-schemes/ms-mincho.json +14 -14
  156. package/dist/spec/catalogs/font-schemes/nirmala-ui.json +14 -14
  157. package/dist/spec/catalogs/font-schemes/noto-naksh-arabic.json +14 -14
  158. package/dist/spec/catalogs/font-schemes/noto-nastaliq-urdu.json +15 -15
  159. package/dist/spec/catalogs/font-schemes/noto-sans-arabic.json +16 -16
  160. package/dist/spec/catalogs/font-schemes/noto-sans-armenian.json +14 -14
  161. package/dist/spec/catalogs/font-schemes/noto-sans-bengali.json +15 -15
  162. package/dist/spec/catalogs/font-schemes/noto-sans-devangari.json +15 -15
  163. package/dist/spec/catalogs/font-schemes/noto-sans-ethiopic.json +14 -14
  164. package/dist/spec/catalogs/font-schemes/noto-sans-georgian.json +14 -14
  165. package/dist/spec/catalogs/font-schemes/noto-sans-gujarati.json +14 -14
  166. package/dist/spec/catalogs/font-schemes/noto-sans-gurmukhi.json +14 -14
  167. package/dist/spec/catalogs/font-schemes/noto-sans-hebrew.json +14 -14
  168. package/dist/spec/catalogs/font-schemes/noto-sans-jp.json +14 -14
  169. package/dist/spec/catalogs/font-schemes/noto-sans-kannada.json +14 -14
  170. package/dist/spec/catalogs/font-schemes/noto-sans-khmer.json +14 -14
  171. package/dist/spec/catalogs/font-schemes/noto-sans-kr.json +14 -14
  172. package/dist/spec/catalogs/font-schemes/noto-sans-malayalam.json +14 -14
  173. package/dist/spec/catalogs/font-schemes/noto-sans-mongolian.json +14 -14
  174. package/dist/spec/catalogs/font-schemes/noto-sans-oriya.json +14 -14
  175. package/dist/spec/catalogs/font-schemes/noto-sans-sc.json +17 -17
  176. package/dist/spec/catalogs/font-schemes/noto-sans-tamil.json +14 -14
  177. package/dist/spec/catalogs/font-schemes/noto-sans-tc.json +14 -14
  178. package/dist/spec/catalogs/font-schemes/noto-sans-telugu.json +14 -14
  179. package/dist/spec/catalogs/font-schemes/noto-sans-thai.json +14 -14
  180. package/dist/spec/catalogs/font-schemes/noto-sans.json +17 -17
  181. package/dist/spec/catalogs/font-schemes/nyala.json +14 -14
  182. package/dist/spec/catalogs/font-schemes/open-sans.json +12 -12
  183. package/dist/spec/catalogs/font-schemes/pmingliu.json +14 -14
  184. package/dist/spec/catalogs/font-schemes/poppins.json +12 -12
  185. package/dist/spec/catalogs/font-schemes/pt-serif.json +12 -12
  186. package/dist/spec/catalogs/font-schemes/raavi.json +14 -14
  187. package/dist/spec/catalogs/font-schemes/raleway.json +12 -12
  188. package/dist/spec/catalogs/font-schemes/roboto.json +12 -12
  189. package/dist/spec/catalogs/font-schemes/rockwell.json +12 -12
  190. package/dist/spec/catalogs/font-schemes/sakkal-majalla.json +16 -16
  191. package/dist/spec/catalogs/font-schemes/seaford.json +12 -12
  192. package/dist/spec/catalogs/font-schemes/segoe-ui-light.json +12 -12
  193. package/dist/spec/catalogs/font-schemes/segoe-ui.json +12 -12
  194. package/dist/spec/catalogs/font-schemes/shonar-bangla.json +15 -15
  195. package/dist/spec/catalogs/font-schemes/shruti.json +14 -14
  196. package/dist/spec/catalogs/font-schemes/simsun.json +14 -14
  197. package/dist/spec/catalogs/font-schemes/skeena.json +12 -12
  198. package/dist/spec/catalogs/font-schemes/sylfaen.json +15 -15
  199. package/dist/spec/catalogs/font-schemes/tahoma.json +12 -12
  200. package/dist/spec/catalogs/font-schemes/tenorite.json +12 -12
  201. package/dist/spec/catalogs/font-schemes/times-new-roman.json +12 -12
  202. package/dist/spec/catalogs/font-schemes/traditional-arabic.json +16 -16
  203. package/dist/spec/catalogs/font-schemes/trebuchet-ms.json +12 -12
  204. package/dist/spec/catalogs/font-schemes/tunga.json +14 -14
  205. package/dist/spec/catalogs/font-schemes/verdana.json +12 -12
  206. package/dist/spec/catalogs/font-schemes/vrinda.json +14 -14
  207. package/dist/spec/catalogs/font-schemes/yu-gothic.json +14 -14
  208. package/dist/spec/catalogs/languages/afrikaans.json +9 -9
  209. package/dist/spec/catalogs/languages/albanian.json +9 -9
  210. package/dist/spec/catalogs/languages/amharic.json +9 -9
  211. package/dist/spec/catalogs/languages/arabic.json +9 -9
  212. package/dist/spec/catalogs/languages/armenian.json +9 -9
  213. package/dist/spec/catalogs/languages/aymara.json +9 -9
  214. package/dist/spec/catalogs/languages/azerbaijani.json +9 -9
  215. package/dist/spec/catalogs/languages/bengali.json +9 -9
  216. package/dist/spec/catalogs/languages/berber-latin.json +9 -9
  217. package/dist/spec/catalogs/languages/bosnian-latin.json +9 -9
  218. package/dist/spec/catalogs/languages/bulgarian.json +9 -9
  219. package/dist/spec/catalogs/languages/catalan.json +9 -9
  220. package/dist/spec/catalogs/languages/cebuano.json +9 -9
  221. package/dist/spec/catalogs/languages/chinese-simplified.json +9 -9
  222. package/dist/spec/catalogs/languages/chinese-traditional.json +9 -9
  223. package/dist/spec/catalogs/languages/chittagonian.json +9 -9
  224. package/dist/spec/catalogs/languages/croatian.json +9 -9
  225. package/dist/spec/catalogs/languages/czech.json +9 -9
  226. package/dist/spec/catalogs/languages/danish.json +9 -9
  227. package/dist/spec/catalogs/languages/dutch.json +9 -9
  228. package/dist/spec/catalogs/languages/english-au.json +9 -9
  229. package/dist/spec/catalogs/languages/english-ca.json +9 -9
  230. package/dist/spec/catalogs/languages/english-gb.json +9 -9
  231. package/dist/spec/catalogs/languages/english-in.json +9 -9
  232. package/dist/spec/catalogs/languages/english-us.json +9 -9
  233. package/dist/spec/catalogs/languages/english.json +9 -9
  234. package/dist/spec/catalogs/languages/estonian.json +9 -9
  235. package/dist/spec/catalogs/languages/filipino.json +9 -9
  236. package/dist/spec/catalogs/languages/finnish.json +9 -9
  237. package/dist/spec/catalogs/languages/french.json +9 -9
  238. package/dist/spec/catalogs/languages/fulfulde.json +9 -9
  239. package/dist/spec/catalogs/languages/galician.json +9 -9
  240. package/dist/spec/catalogs/languages/georgian.json +9 -9
  241. package/dist/spec/catalogs/languages/german.json +9 -9
  242. package/dist/spec/catalogs/languages/greek.json +9 -9
  243. package/dist/spec/catalogs/languages/gujarati.json +9 -9
  244. package/dist/spec/catalogs/languages/hausa.json +9 -9
  245. package/dist/spec/catalogs/languages/hebrew.json +9 -9
  246. package/dist/spec/catalogs/languages/hindi.json +9 -9
  247. package/dist/spec/catalogs/languages/hungarian.json +9 -9
  248. package/dist/spec/catalogs/languages/igbo.json +9 -9
  249. package/dist/spec/catalogs/languages/index.json +565 -565
  250. package/dist/spec/catalogs/languages/indonesian.json +9 -9
  251. package/dist/spec/catalogs/languages/italian.json +9 -9
  252. package/dist/spec/catalogs/languages/japanese.json +9 -9
  253. package/dist/spec/catalogs/languages/kannada.json +9 -9
  254. package/dist/spec/catalogs/languages/kazakh.json +9 -9
  255. package/dist/spec/catalogs/languages/khmer.json +9 -9
  256. package/dist/spec/catalogs/languages/kinyarwanda.json +9 -9
  257. package/dist/spec/catalogs/languages/korean.json +9 -9
  258. package/dist/spec/catalogs/languages/kurmanji.json +9 -9
  259. package/dist/spec/catalogs/languages/latvian.json +9 -9
  260. package/dist/spec/catalogs/languages/lithuanian.json +9 -9
  261. package/dist/spec/catalogs/languages/macedonian.json +9 -9
  262. package/dist/spec/catalogs/languages/malagasy.json +9 -9
  263. package/dist/spec/catalogs/languages/malay.json +9 -9
  264. package/dist/spec/catalogs/languages/malayalam.json +9 -9
  265. package/dist/spec/catalogs/languages/maori.json +9 -9
  266. package/dist/spec/catalogs/languages/marathi.json +9 -9
  267. package/dist/spec/catalogs/languages/mongolian.json +9 -9
  268. package/dist/spec/catalogs/languages/nepali.json +9 -9
  269. package/dist/spec/catalogs/languages/norwegian.json +9 -9
  270. package/dist/spec/catalogs/languages/odia.json +9 -9
  271. package/dist/spec/catalogs/languages/oromo.json +9 -9
  272. package/dist/spec/catalogs/languages/pashto.json +9 -9
  273. package/dist/spec/catalogs/languages/persian.json +9 -9
  274. package/dist/spec/catalogs/languages/polish.json +9 -9
  275. package/dist/spec/catalogs/languages/portuguese.json +9 -9
  276. package/dist/spec/catalogs/languages/punjabi-gurmukhi.json +9 -9
  277. package/dist/spec/catalogs/languages/punjabi-shahmukhi.json +9 -9
  278. package/dist/spec/catalogs/languages/romanian.json +9 -9
  279. package/dist/spec/catalogs/languages/russian.json +9 -9
  280. package/dist/spec/catalogs/languages/serbian-cyrillic.json +9 -9
  281. package/dist/spec/catalogs/languages/serbian-latin.json +9 -9
  282. package/dist/spec/catalogs/languages/shona.json +9 -9
  283. package/dist/spec/catalogs/languages/slovak.json +9 -9
  284. package/dist/spec/catalogs/languages/slovenian.json +9 -9
  285. package/dist/spec/catalogs/languages/somali.json +9 -9
  286. package/dist/spec/catalogs/languages/spanish.json +9 -9
  287. package/dist/spec/catalogs/languages/swahili.json +9 -9
  288. package/dist/spec/catalogs/languages/swedish.json +9 -9
  289. package/dist/spec/catalogs/languages/tagalog.json +9 -9
  290. package/dist/spec/catalogs/languages/tajik.json +9 -9
  291. package/dist/spec/catalogs/languages/tamil.json +9 -9
  292. package/dist/spec/catalogs/languages/telugu.json +9 -9
  293. package/dist/spec/catalogs/languages/thai.json +9 -9
  294. package/dist/spec/catalogs/languages/turkish.json +9 -9
  295. package/dist/spec/catalogs/languages/ukrainian.json +9 -9
  296. package/dist/spec/catalogs/languages/urdu.json +9 -9
  297. package/dist/spec/catalogs/languages/uzbek-latin.json +9 -9
  298. package/dist/spec/catalogs/languages/vietnamese-quoc-ngu.json +9 -9
  299. package/dist/spec/catalogs/languages/xhosa.json +9 -9
  300. package/dist/spec/catalogs/languages/yoruba.json +9 -9
  301. package/dist/spec/catalogs/languages/zulu.json +9 -9
  302. package/dist/spec/catalogs/layouts/blank.json +6 -6
  303. package/dist/spec/catalogs/layouts/chart-1x.json +16 -16
  304. package/dist/spec/catalogs/layouts/chart-2x.json +22 -22
  305. package/dist/spec/catalogs/layouts/chart-3x.json +28 -28
  306. package/dist/spec/catalogs/layouts/code-1x.json +16 -16
  307. package/dist/spec/catalogs/layouts/extract/canonical.json +487 -487
  308. package/dist/spec/catalogs/layouts/image-1x.json +16 -16
  309. package/dist/spec/catalogs/layouts/image-2x.json +22 -22
  310. package/dist/spec/catalogs/layouts/image-3x.json +28 -28
  311. package/dist/spec/catalogs/layouts/image-bleed.json +10 -10
  312. package/dist/spec/catalogs/layouts/index.json +147 -147
  313. package/dist/spec/catalogs/layouts/list-1x.json +13 -13
  314. package/dist/spec/catalogs/layouts/list-2x.json +16 -16
  315. package/dist/spec/catalogs/layouts/list-3x.json +19 -19
  316. package/dist/spec/catalogs/layouts/list-4x.json +22 -22
  317. package/dist/spec/catalogs/layouts/list-5x.json +25 -25
  318. package/dist/spec/catalogs/layouts/list-6x.json +28 -28
  319. package/dist/spec/catalogs/layouts/media-1x.json +16 -16
  320. package/dist/spec/catalogs/layouts/number-1x.json +13 -13
  321. package/dist/spec/catalogs/layouts/number-2x.json +16 -16
  322. package/dist/spec/catalogs/layouts/number-3x.json +19 -19
  323. package/dist/spec/catalogs/layouts/number-4x.json +22 -22
  324. package/dist/spec/catalogs/layouts/number-5x.json +25 -25
  325. package/dist/spec/catalogs/layouts/number-6x.json +28 -28
  326. package/dist/spec/catalogs/layouts/table-1x.json +16 -16
  327. package/dist/spec/catalogs/layouts/text-1x.json +13 -13
  328. package/dist/spec/catalogs/layouts/text-2x.json +16 -16
  329. package/dist/spec/catalogs/layouts/text-3x.json +19 -19
  330. package/dist/spec/catalogs/layouts/title-subtitle.json +13 -13
  331. package/dist/spec/catalogs/layouts/title.json +10 -10
  332. package/dist/spec/catalogs/narratives/board-meeting.json +192 -192
  333. package/dist/spec/catalogs/narratives/business-narrative.json +87 -87
  334. package/dist/spec/catalogs/narratives/business-review.json +119 -119
  335. package/dist/spec/catalogs/narratives/capacity-planning.json +88 -88
  336. package/dist/spec/catalogs/narratives/challenge-resolution.json +80 -80
  337. package/dist/spec/catalogs/narratives/classic-story.json +78 -78
  338. package/dist/spec/catalogs/narratives/company-intro.json +96 -96
  339. package/dist/spec/catalogs/narratives/conference-talk.json +54 -54
  340. package/dist/spec/catalogs/narratives/early-startup-pitch.json +119 -119
  341. package/dist/spec/catalogs/narratives/educate.json +95 -95
  342. package/dist/spec/catalogs/narratives/employee-review.json +87 -87
  343. package/dist/spec/catalogs/narratives/failure-analysis.json +104 -104
  344. package/dist/spec/catalogs/narratives/focus.json +120 -120
  345. package/dist/spec/catalogs/narratives/golden-circle.json +50 -50
  346. package/dist/spec/catalogs/narratives/index.json +358 -358
  347. package/dist/spec/catalogs/narratives/innovation.json +96 -96
  348. package/dist/spec/catalogs/narratives/justice.json +112 -112
  349. package/dist/spec/catalogs/narratives/marketing-strategy.json +111 -111
  350. package/dist/spec/catalogs/narratives/performance-improvement-plan.json +87 -87
  351. package/dist/spec/catalogs/narratives/performance-review.json +111 -111
  352. package/dist/spec/catalogs/narratives/persuade.json +94 -94
  353. package/dist/spec/catalogs/narratives/persuasive-sales.json +87 -87
  354. package/dist/spec/catalogs/narratives/pitch-deck.json +107 -107
  355. package/dist/spec/catalogs/narratives/problem-solution.json +61 -61
  356. package/dist/spec/catalogs/narratives/product-launch.json +104 -104
  357. package/dist/spec/catalogs/narratives/project-proposal.json +104 -104
  358. package/dist/spec/catalogs/narratives/qbr.json +85 -85
  359. package/dist/spec/catalogs/narratives/rags-to-riches.json +80 -80
  360. package/dist/spec/catalogs/narratives/reveal.json +87 -87
  361. package/dist/spec/catalogs/narratives/scqa.json +55 -55
  362. package/dist/spec/catalogs/narratives/status-update.json +72 -72
  363. package/dist/spec/catalogs/narratives/strategic-advisory.json +85 -85
  364. package/dist/spec/catalogs/narratives/strategic-narrative.json +61 -61
  365. package/dist/spec/catalogs/narratives/survey-analysis.json +104 -104
  366. package/dist/spec/catalogs/narratives/survival-story.json +103 -103
  367. package/dist/spec/catalogs/narratives/transformation-arc.json +50 -50
  368. package/dist/spec/catalogs/narratives/trend-analysis.json +79 -79
  369. package/dist/spec/catalogs/narratives/underdog-victory.json +87 -87
  370. package/dist/spec/catalogs/narratives/venture-pitch.json +109 -109
  371. package/dist/spec/catalogs/narratives/weekly-progress.json +103 -103
  372. package/dist/spec/catalogs/purposes/align.json +16 -16
  373. package/dist/spec/catalogs/purposes/decide.json +16 -16
  374. package/dist/spec/catalogs/purposes/educate.json +16 -16
  375. package/dist/spec/catalogs/purposes/index.json +61 -61
  376. package/dist/spec/catalogs/purposes/inform.json +16 -16
  377. package/dist/spec/catalogs/purposes/persuade.json +16 -16
  378. package/dist/spec/catalogs/purposes/pitch.json +16 -16
  379. package/dist/spec/catalogs/purposes/plan.json +16 -16
  380. package/dist/spec/catalogs/purposes/report.json +16 -16
  381. package/dist/spec/catalogs/purposes/sell.json +16 -16
  382. package/dist/spec/catalogs/social-platforms/bluesky.json +14 -14
  383. package/dist/spec/catalogs/social-platforms/facebook.json +14 -14
  384. package/dist/spec/catalogs/social-platforms/github.json +15 -15
  385. package/dist/spec/catalogs/social-platforms/index.json +68 -68
  386. package/dist/spec/catalogs/social-platforms/instagram.json +13 -13
  387. package/dist/spec/catalogs/social-platforms/linkedin.json +15 -15
  388. package/dist/spec/catalogs/social-platforms/mastodon.json +14 -14
  389. package/dist/spec/catalogs/social-platforms/threads.json +13 -13
  390. package/dist/spec/catalogs/social-platforms/tiktok.json +14 -14
  391. package/dist/spec/catalogs/social-platforms/x.json +14 -14
  392. package/dist/spec/catalogs/social-platforms/youtube.json +14 -14
  393. package/dist/spec/catalogs/themes/bold.json +13 -13
  394. package/dist/spec/catalogs/themes/classic.json +13 -13
  395. package/dist/spec/catalogs/themes/dark.json +13 -13
  396. package/dist/spec/catalogs/themes/index.json +31 -31
  397. package/dist/spec/catalogs/themes/minimal.json +13 -13
  398. package/dist/spec/catalogs/tones/authoritative.json +31 -31
  399. package/dist/spec/catalogs/tones/casual.json +31 -31
  400. package/dist/spec/catalogs/tones/conversational.json +31 -31
  401. package/dist/spec/catalogs/tones/formal.json +31 -31
  402. package/dist/spec/catalogs/tones/index.json +49 -49
  403. package/dist/spec/catalogs/tones/inspirational.json +31 -31
  404. package/dist/spec/catalogs/tones/persuasive.json +32 -32
  405. package/dist/spec/catalogs/tones/technical.json +31 -31
  406. package/dist/spec/openapi.yaml +776 -776
  407. package/dist/spec/previews/layouts/action-plan.html +1 -0
  408. package/dist/spec/previews/layouts/agenda.html +1 -0
  409. package/dist/spec/previews/layouts/appendix-index.html +1 -0
  410. package/dist/spec/previews/layouts/architecture-stack.html +1 -0
  411. package/dist/spec/previews/layouts/assumptions-dependencies.html +1 -0
  412. package/dist/spec/previews/layouts/before-after.html +1 -0
  413. package/dist/spec/previews/layouts/benchmark-target-table.html +1 -0
  414. package/dist/spec/previews/layouts/bullet-list.html +1 -0
  415. package/dist/spec/previews/layouts/business-model-canvas.html +1 -0
  416. package/dist/spec/previews/layouts/capability-map.html +1 -0
  417. package/dist/spec/previews/layouts/case-study.html +1 -0
  418. package/dist/spec/previews/layouts/chapter-recap.html +1 -0
  419. package/dist/spec/previews/layouts/circular-lifecycle.html +1 -0
  420. package/dist/spec/previews/layouts/comparison.html +1 -0
  421. package/dist/spec/previews/layouts/competitive-landscape.html +1 -0
  422. package/dist/spec/previews/layouts/customer-journey.html +1 -0
  423. package/dist/spec/previews/layouts/customer-logos.html +1 -0
  424. package/dist/spec/previews/layouts/dashboard.html +1 -0
  425. package/dist/spec/previews/layouts/data-visualization.html +1 -0
  426. package/dist/spec/previews/layouts/decision-tree.html +1 -0
  427. package/dist/spec/previews/layouts/detailed-data-table.html +1 -0
  428. package/dist/spec/previews/layouts/ecosystem-map.html +1 -0
  429. package/dist/spec/previews/layouts/executive-decision.html +1 -0
  430. package/dist/spec/previews/layouts/executive-summary.html +1 -0
  431. package/dist/spec/previews/layouts/faq.html +1 -0
  432. package/dist/spec/previews/layouts/feature-comparison-matrix.html +1 -0
  433. package/dist/spec/previews/layouts/forecast-scenario.html +1 -0
  434. package/dist/spec/previews/layouts/funnel-pyramid.html +1 -0
  435. package/dist/spec/previews/layouts/gantt-project-plan.html +1 -0
  436. package/dist/spec/previews/layouts/geographic-map.html +1 -0
  437. package/dist/spec/previews/layouts/heatmap-cohort.html +1 -0
  438. package/dist/spec/previews/layouts/hub-and-spoke.html +1 -0
  439. package/dist/spec/previews/layouts/icon-grid.html +1 -0
  440. package/dist/spec/previews/layouts/image-focus.html +1 -0
  441. package/dist/spec/previews/layouts/index.json +357 -0
  442. package/dist/spec/previews/layouts/key-takeaway.html +1 -0
  443. package/dist/spec/previews/layouts/kpi-scorecard.html +1 -0
  444. package/dist/spec/previews/layouts/logic-tree.html +1 -0
  445. package/dist/spec/previews/layouts/market-size.html +1 -0
  446. package/dist/spec/previews/layouts/matrix-quadrant.html +1 -0
  447. package/dist/spec/previews/layouts/network-dependency-map.html +1 -0
  448. package/dist/spec/previews/layouts/one-column-explainer.html +1 -0
  449. package/dist/spec/previews/layouts/org-chart.html +1 -0
  450. package/dist/spec/previews/layouts/persona-grid.html +1 -0
  451. package/dist/spec/previews/layouts/photo-grid.html +1 -0
  452. package/dist/spec/previews/layouts/pricing-table.html +1 -0
  453. package/dist/spec/previews/layouts/process-flow.html +1 -0
  454. package/dist/spec/previews/layouts/product-feature.html +1 -0
  455. package/dist/spec/previews/layouts/pros-cons.html +1 -0
  456. package/dist/spec/previews/layouts/qa-discussion.html +1 -0
  457. package/dist/spec/previews/layouts/quote-highlight.html +1 -0
  458. package/dist/spec/previews/layouts/raci-matrix.html +1 -0
  459. package/dist/spec/previews/layouts/risk-heatmap.html +1 -0
  460. package/dist/spec/previews/layouts/roadmap.html +1 -0
  461. package/dist/spec/previews/layouts/screenshot-walkthrough.html +1 -0
  462. package/dist/spec/previews/layouts/section-divider.html +1 -0
  463. package/dist/spec/previews/layouts/single-message-statement.html +1 -0
  464. package/dist/spec/previews/layouts/stats-metrics.html +1 -0
  465. package/dist/spec/previews/layouts/status-rag.html +1 -0
  466. package/dist/spec/previews/layouts/swimlane-process.html +1 -0
  467. package/dist/spec/previews/layouts/swot-analysis.html +1 -0
  468. package/dist/spec/previews/layouts/team-bio.html +1 -0
  469. package/dist/spec/previews/layouts/testimonial-grid.html +1 -0
  470. package/dist/spec/previews/layouts/thank-you-cta.html +1 -0
  471. package/dist/spec/previews/layouts/three-column.html +1 -0
  472. package/dist/spec/previews/layouts/timeline.html +1 -0
  473. package/dist/spec/previews/layouts/title-slide.html +1 -0
  474. package/dist/spec/previews/layouts/two-column.html +1 -0
  475. package/dist/spec/previews/layouts/venn-overlap.html +1 -0
  476. package/dist/spec/previews/layouts/waterfall-bridge.html +1 -0
  477. package/dist/spec/previews/layouts/wheel-radial.html +1 -0
  478. package/dist/spec/reference/engine-defaults.json +35 -35
  479. package/dist/spec/schemas/audience.schema.json +156 -156
  480. package/dist/spec/schemas/chart-type.schema.json +537 -537
  481. package/dist/spec/schemas/color-scheme.schema.json +200 -200
  482. package/dist/spec/schemas/font-scheme.schema.json +174 -174
  483. package/dist/spec/schemas/language.schema.json +158 -158
  484. package/dist/spec/schemas/layout.schema.json +280 -280
  485. package/dist/spec/schemas/narrative.schema.json +207 -207
  486. package/dist/spec/schemas/opf.schema.json +2543 -2537
  487. package/dist/spec/schemas/purpose.schema.json +92 -92
  488. package/dist/spec/schemas/social-platform.schema.json +183 -184
  489. package/dist/spec/schemas/theme.schema.json +168 -168
  490. package/dist/spec/schemas/tone.schema.json +146 -146
  491. package/dist/spec-files.d.ts +2388 -0
  492. package/dist/spec-files.js +3349 -0
  493. package/dist/spec-files.js.map +1 -0
  494. package/dist/types.d.ts +5 -5
  495. package/dist/{validator-Be5EzqAt.d.ts → validator-MwlR2F56.d.ts} +22 -24
  496. package/dist/validator.d.ts +1 -1
  497. package/dist/validator.js +66 -48
  498. package/dist/validator.js.map +1 -1
  499. package/package.json +91 -80
package/dist/types.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export { P as Presentation, V as ValidationIssue, a as ValidationResult } from './validator-Be5EzqAt.js';
1
+ export { P as Presentation, V as ValidationIssue, a as ValidationResult } from './validator-MwlR2F56.js';
2
2
  export { CatalogKind } from './catalogs.js';
3
3
  export { SchemaName } from './schemas.js';
4
4
 
@@ -766,7 +766,7 @@ interface Beat {
766
766
  }
767
767
 
768
768
  /**
769
- * Schema for social-platform records in the pptx.gallery library. Each record describes a single social-media platform — its base URL, profile-URL pattern, handle prefix, brand color, and themed icons. Records are referenced from OPF documents indirectly: the property keys of any Socials object (Organization.socials, Speaker.socials) match record ids, and renderers use the catalog record to format URLs and pick icons. The engine resolves references against catalogs.socialPlatforms (inline) → catalogs.socialPlatforms.source → the default catalog at https://www.pptx.gallery/social-platforms.
769
+ * Schema for social-platform records in the pptx.gallery library. Each record describes a single social-media platform — its base URL, profile-URL pattern, handle prefix, brand color, and themed icons. Records are referenced from OPF documents indirectly: the property keys of any Socials object (Organization.socials, Speaker.socials) match record ids, and renderers use the catalog record to format URLs and pick icons. The engine resolves references against catalogs.socialPlatforms (inline) → catalogs.socialPlatforms.source → the default catalog at https://www.pptx.gallery/social-platforms.
770
770
  */
771
771
  interface SocialPlatform {
772
772
  /**
@@ -774,7 +774,7 @@ interface SocialPlatform {
774
774
  */
775
775
  $schema: "https://openpresentation.org/schema/opf-social-platform/v1";
776
776
  /**
777
- * Stable slug used by OPF documents to reference this platform — appears as a property key on Socials objects. Lowercase kebab-case.
777
+ * Stable slug used by OPF documents to reference this platform — appears as a property key on Socials objects. Lowercase kebab-case.
778
778
  */
779
779
  id: string;
780
780
  /**
@@ -782,7 +782,7 @@ interface SocialPlatform {
782
782
  */
783
783
  name: string;
784
784
  /**
785
- * One-sentence positioning of the platform — what it's used for and who's on it.
785
+ * One-sentence positioning of the platform — what it's used for and who's on it.
786
786
  */
787
787
  summary?: string;
788
788
  /**
@@ -790,7 +790,7 @@ interface SocialPlatform {
790
790
  */
791
791
  description?: string;
792
792
  /**
793
- * Canonical base URL of the platform — used as the prefix when normalizing handles to full URLs.
793
+ * Canonical base URL of the platform — used as the prefix when normalizing handles to full URLs.
794
794
  */
795
795
  baseUrl?: string;
796
796
  /**
@@ -514,9 +514,9 @@ type ContentPayload = ({
514
514
  */
515
515
  type CatalogSource = string;
516
516
  /**
517
- * Open-source JSON format for describing PowerPoint presentations. Agents describe narratives, content, audience, reusable assets, and design — the engine handles OOXML complexity.
517
+ * Open-source JSON format for describing PowerPoint presentations. Agents describe narratives, content, audience, reusable assets, and design — the engine handles OOXML complexity.
518
518
  *
519
- * Fields that reference catalog records (narrative, language, tone, audience, purpose, design.theme / design.theme.id, design.colorScheme / design.colorScheme.id, design.fontScheme / design.fontScheme.id, Slide.layout, Chart.type, Organization.socials / Speaker.socials) resolve through the catalog system: inline 'catalogs.<kind>.records[]' on the document → 'catalogs.<kind>.source' on the document → engine defaults → the default catalog at https://www.pptx.gallery/<kind>. Every reference resolves to the catalog record's 'id' field. When an OPF document omits a reference entirely, the engine falls back to engine defaults (see /spec/reference/engine-defaults.json for a reference example). The defaults file is engine configuration; it is not part of the OPF document contract and has no JSON Schema.
519
+ * Fields that reference catalog records (narrative, language, tone, audience, purpose, design.theme / design.theme.id, design.colorScheme / design.colorScheme.id, design.fontScheme / design.fontScheme.id, Slide.layout, Chart.type, Organization.socials / Speaker.socials) resolve through the catalog system: inline 'catalogs.<kind>.records[]' on the document → 'catalogs.<kind>.source' on the document → engine defaults → the default catalog at https://www.pptx.gallery/<kind>. Every reference resolves to the catalog record's 'id' field. When an OPF document omits a reference entirely, the engine falls back to engine defaults (see /spec/reference/engine-defaults.json for a reference example). The defaults file is engine configuration; it is not part of the OPF document contract and has no JSON Schema.
520
520
  *
521
521
  * Most catalog references accept the bare 'id' as a string for the common case (e.g. narrative = 'classic-story', design.colorScheme = 'cool-horizon'). Audience, purpose, tone, design, and language object forms use 'id' as a base catalog reference plus inline overrides. Asset references use 'asset:<id>' strings that point into the top-level assets registry.
522
522
  */
@@ -530,7 +530,7 @@ interface Presentation {
530
530
  */
531
531
  name?: string;
532
532
  /**
533
- * Free-form prose describing what this presentation is about. Used by agents and humans as a deck-level summary; complements purpose (the goal) and narrative (the structured storyline). Round-trips to OOXML 'docProps/core.xml' as '<dc:description>' (PowerPoint surfaces this as the 'Comments' field in File → Properties).
533
+ * Free-form prose describing what this presentation is about. Used by agents and humans as a deck-level summary; complements purpose (the goal) and narrative (the structured storyline). Round-trips to OOXML 'docProps/core.xml' as '<dc:description>' (PowerPoint surfaces this as the 'Comments' field in File → Properties).
534
534
  */
535
535
  description?: string;
536
536
  /**
@@ -550,21 +550,19 @@ interface Presentation {
550
550
  */
551
551
  author?: (string | [string, ...(string)[]]);
552
552
  /**
553
- * Intended audiences for the presentation. Each item accepts either:
554
- * - A string shorthand: free-form description ('Series B investors'), an audiences catalog id ('executives'), an HTTPS URL, or a 'pkg:' reference.
555
- * - An inline Audience object for custom audience metadata or catalog-backed overrides. Object form mirrors https://openpresentation.org/schema/opf-audience/v1 without '$schema'.
553
+ * Intended audiences for the presentation. Accepts either:
554
+ * - A single string shorthand: free-form description ('Series B investors'), an audiences catalog id ('executives'), an HTTPS URL, or a 'pkg:' reference.
555
+ * - An array of string shorthands and/or inline Audience objects for custom audience metadata or catalog-backed overrides. Object form mirrors https://openpresentation.org/schema/opf-audience/v1 without '$schema'.
556
556
  *
557
- * Resolution order for catalog ids and references: inline catalogs.audiences.records[] → catalogs.audiences.source → default catalog at https://www.pptx.gallery/audiences.
558
- *
559
- * @minItems 1
557
+ * Resolution order for catalog ids and references: inline catalogs.audiences.records[] → catalogs.audiences.source → default catalog at https://www.pptx.gallery/audiences.
560
558
  */
561
- audience?: [(string | Audience), ...((string | Audience))[]];
559
+ audience?: (string | [(string | Audience), ...((string | Audience))[]]);
562
560
  /**
563
561
  * Primary goal of the presentation. Accepts either:
564
562
  * - A string shorthand: free-form goal ('Raise a Series B round of $30M'), a purposes catalog id ('decide', 'align'), an HTTPS URL, or a 'pkg:' reference.
565
563
  * - An inline Purpose object for custom purpose metadata or catalog-backed overrides. Object form mirrors https://openpresentation.org/schema/opf-purpose/v1 without '$schema'.
566
564
  *
567
- * Resolution order for catalog ids and references: inline catalogs.purposes.records[] → catalogs.purposes.source → default catalog at https://www.pptx.gallery/purposes.
565
+ * Resolution order for catalog ids and references: inline catalogs.purposes.records[] → catalogs.purposes.source → default catalog at https://www.pptx.gallery/purposes.
568
566
  */
569
567
  purpose?: (string | Purpose);
570
568
  /**
@@ -572,7 +570,7 @@ interface Presentation {
572
570
  * - A string shorthand: a BCP-47 language tag ('en-US', 'en-GB', 'ja-JP', 'fr'), a languages catalog id ('english', 'japanese'), an HTTPS URL, or a 'pkg:' reference.
573
571
  * - An inline Language object for custom language metadata or catalog-backed overrides. Object form mirrors https://openpresentation.org/schema/opf-language/v1 without '$schema'.
574
572
  *
575
- * Resolution order for catalog ids and references: inline catalogs.languages.records[] → catalogs.languages.source → default catalog at https://www.pptx.gallery/languages.
573
+ * Resolution order for catalog ids and references: inline catalogs.languages.records[] → catalogs.languages.source → default catalog at https://www.pptx.gallery/languages.
576
574
  */
577
575
  language?: (string | Language);
578
576
  /**
@@ -580,7 +578,7 @@ interface Presentation {
580
578
  * - A string shorthand: a tones catalog id ('formal'), an HTTPS URL, or a 'pkg:' reference.
581
579
  * - An inline Tone object for custom tone metadata or catalog-backed overrides. Object form mirrors https://openpresentation.org/schema/opf-tone/v1 without '$schema'.
582
580
  *
583
- * Resolution order for catalog ids and references: inline catalogs.tones.records[] → catalogs.tones.source → default catalog at https://www.pptx.gallery/tones.
581
+ * Resolution order for catalog ids and references: inline catalogs.tones.records[] → catalogs.tones.source → default catalog at https://www.pptx.gallery/tones.
584
582
  */
585
583
  tone?: (string | Tone);
586
584
  /**
@@ -603,7 +601,7 @@ interface Presentation {
603
601
  * - String shorthand for the common case: 'narrative = "classic-story"'. Accepts a bare id (lowercase kebab-case), an HTTPS URL pointing at a record file, or a 'pkg:' reference to a locally-installed package.
604
602
  * - Object form for inline overrides or fully custom narratives: 'narrative = { id: "classic-story", beats: [...] }'. The object shape mirrors https://openpresentation.org/schema/opf-narrative/v1 (sans '$schema'), so a library record and an inline narrative are interchangeable.
605
603
  *
606
- * Resolution order: inline catalogs.narratives.records[] → catalogs.narratives.source → default catalog at https://www.pptx.gallery/narratives. Unknown ids produce a validation warning, not an error.
604
+ * Resolution order: inline catalogs.narratives.records[] → catalogs.narratives.source → default catalog at https://www.pptx.gallery/narratives. Unknown ids produce a validation warning, not an error.
607
605
  *
608
606
  * Deck-level concerns that aren't part of the storyline (audience, tone, takeaway, duration) live as siblings on the presentation root rather than inside the narrative object.
609
607
  */
@@ -624,7 +622,7 @@ interface Presentation {
624
622
  };
625
623
  }
626
624
  /**
627
- * An organization associated with the presentation — typically the presenting company, but also hosts, partners, clients, or sponsors. Surfaced on cover slides, footers, and brand bars; the primary organization's logo is the default deck logo unless overridden by design.logo.
625
+ * An organization associated with the presentation — typically the presenting company, but also hosts, partners, clients, or sponsors. Surfaced on cover slides, footers, and brand bars; the primary organization's logo is the default deck logo unless overridden by design.logo.
628
626
  *
629
627
  * This interface was referenced by `Presentation`'s JSON-Schema
630
628
  * via the `definition` "Organization".
@@ -1046,11 +1044,11 @@ interface FontScheme {
1046
1044
  */
1047
1045
  id?: string;
1048
1046
  /**
1049
- * Heading (major) font family — mirrors the OOXML majorFont entry. Pairs with 'minor'.
1047
+ * Heading (major) font family — mirrors the OOXML majorFont entry. Pairs with 'minor'.
1050
1048
  */
1051
1049
  major?: string;
1052
1050
  /**
1053
- * Body (minor) font family — mirrors the OOXML minorFont entry. Pairs with 'major'.
1051
+ * Body (minor) font family — mirrors the OOXML minorFont entry. Pairs with 'major'.
1054
1052
  */
1055
1053
  minor?: string;
1056
1054
  /**
@@ -1871,7 +1869,7 @@ interface HeaderFooterItem2 {
1871
1869
  /**
1872
1870
  * Structured storyline used by AI to shape generated content. Mirrors the OPF Narrative Template record at https://openpresentation.org/schema/opf-narrative/v1 (sans '$schema'), so a library record and an inline narrative are interchangeable.
1873
1871
  *
1874
- * Narrative declares the deck's intended story arc; slides may opt into beats via Slide.beat. The narrative does not constrain slide structure — validators warn on drift (orphan slides, unused beats) but never error. Slides are the source of truth; narrative is intent that travels with the deck.
1872
+ * Narrative declares the deck's intended story arc; slides may opt into beats via Slide.beat. The narrative does not constrain slide structure — validators warn on drift (orphan slides, unused beats) but never error. Slides are the source of truth; narrative is intent that travels with the deck.
1875
1873
  *
1876
1874
  * When 'id' matches a record in the resolved 'narratives' catalog, the inline fields override matching fields on the catalog record (beats merge by beat 'id'). When 'id' doesn't match, this object defines a fully custom inline narrative.
1877
1875
  *
@@ -1938,7 +1936,7 @@ interface Narrative {
1938
1936
  [k: string]: unknown;
1939
1937
  }
1940
1938
  /**
1941
- * A single narrative beat — a labeled segment of the story arc with a specific dramatic purpose (e.g. 'hook', 'problem', 'evidence', 'ask'). Slides reference beats via Slide.beat. Beats may also carry slide-blueprint hints (slideType, layoutHint, thoughtCues, instructions) that guide the assigned slide.
1939
+ * A single narrative beat — a labeled segment of the story arc with a specific dramatic purpose (e.g. 'hook', 'problem', 'evidence', 'ask'). Slides reference beats via Slide.beat. Beats may also carry slide-blueprint hints (slideType, layoutHint, thoughtCues, instructions) that guide the assigned slide.
1942
1940
  *
1943
1941
  * Mirrors the Beat definition in narrative.schema.json (https://openpresentation.org/schema/opf-narrative/v1) so library entries and inline OPF beats are interchangeable.
1944
1942
  *
@@ -1959,7 +1957,7 @@ interface NarrativeBeat {
1959
1957
  */
1960
1958
  description?: string;
1961
1959
  /**
1962
- * Short author-facing instruction for the beat — typically one phrase. Complements 'description' with a concise directive.
1960
+ * Short author-facing instruction for the beat — typically one phrase. Complements 'description' with a concise directive.
1963
1961
  */
1964
1962
  instructions?: string;
1965
1963
  /**
@@ -1971,7 +1969,7 @@ interface NarrativeBeat {
1971
1969
  */
1972
1970
  slideType?: ("text" | "list" | "image" | "chart" | "table" | "video" | "code" | "metric" | "quote" | "timeline");
1973
1971
  /**
1974
- * Suggested layout id for the beat's opening slide. Resolves the same way as Slide.layout — against catalogs.layouts and the default catalog at https://www.pptx.gallery/layouts.
1972
+ * Suggested layout id for the beat's opening slide. Resolves the same way as Slide.layout — against catalogs.layouts and the default catalog at https://www.pptx.gallery/layouts.
1975
1973
  */
1976
1974
  layoutHint?: string;
1977
1975
  /**
@@ -2002,7 +2000,7 @@ interface Slide {
2002
2000
  /**
2003
2001
  * Optional slide layout reference. Resolves to the 'id' of a 'layouts' catalog record. When omitted, engines infer a layout from the slide's root payload or promoted region keys. Accepts a bare id (lowercase kebab-case, e.g. 'title-subtitle'), an HTTPS URL pointing at a record file, or a 'pkg:' reference. Free-form custom layout names that don't resolve through any catalog fall through to engine-defined layouts.
2004
2002
  *
2005
- * Resolution order: inline catalogs.layouts.records[] → catalogs.layouts.source → default catalog at https://www.pptx.gallery/layouts.
2003
+ * Resolution order: inline catalogs.layouts.records[] → catalogs.layouts.source → default catalog at https://www.pptx.gallery/layouts.
2006
2004
  */
2007
2005
  layout?: string;
2008
2006
  /**
@@ -2022,7 +2020,7 @@ interface Slide {
2022
2020
  */
2023
2021
  text?: (string | TextRun[]);
2024
2022
  /**
2025
- * Full-slide generic list payload. Presence of this field infers type 'list'.
2023
+ * Full-slide generic list payload. Presence of this field infers type 'list'. At slide root, multiple content payload kinds with no explicit type, blocks, or regions are accepted as shorthand for layout-agnostic blocks.
2026
2024
  */
2027
2025
  items?: ListItem[];
2028
2026
  /**
@@ -2121,7 +2119,7 @@ interface Slide {
2121
2119
  events: [TimelineEvent, ...(TimelineEvent)[]];
2122
2120
  });
2123
2121
  /**
2124
- * Layout-agnostic content blocks rendered together as a composed payload when exact placement is unspecified.
2122
+ * Layout-agnostic content blocks rendered together as a composed payload when exact placement is unspecified. At slide root, multiple content payload kinds with no explicit type, blocks, or regions are accepted as shorthand for equivalent blocks.
2125
2123
  */
2126
2124
  blocks?: ContentPayload[];
2127
2125
  design?: Design1;
@@ -1,3 +1,3 @@
1
1
  import './catalogs.js';
2
- export { O as OPFValidationError, S as SchemaOrKind, V as ValidationIssue, a as ValidationResult, b as assertValid, c as assertValidCatalogRecord, d as assertValidPresentation, v as validate, e as validateCatalogRecord, f as validatePresentation } from './validator-Be5EzqAt.js';
2
+ export { O as OPFValidationError, S as SchemaOrKind, V as ValidationIssue, a as ValidationResult, b as assertValid, c as assertValidCatalogRecord, d as assertValidPresentation, v as validate, e as validateCatalogRecord, f as validatePresentation } from './validator-MwlR2F56.js';
3
3
  import './schemas.js';
package/dist/validator.js CHANGED
@@ -20,8 +20,8 @@ var catalogSchemaNames = {
20
20
  var presentation = {
21
21
  "$schema": "https://json-schema.org/draft/2020-12/schema",
22
22
  "$id": "https://openpresentation.org/schema/opf/v1",
23
- "title": "OPF \xC3\xA2\xE2\u201A\xAC\xE2\u20AC\x9D Open Presentation Format",
24
- "description": "Open-source JSON format for describing PowerPoint presentations. Agents describe narratives, content, audience, reusable assets, and design \xC3\xA2\xE2\u201A\xAC\xE2\u20AC\x9D the engine handles OOXML complexity.\n\nFields that reference catalog records (narrative, language, tone, audience, purpose, design.theme / design.theme.id, design.colorScheme / design.colorScheme.id, design.fontScheme / design.fontScheme.id, Slide.layout, Chart.type, Organization.socials / Speaker.socials) resolve through the catalog system: inline 'catalogs.<kind>.records[]' on the document \xC3\xA2\xE2\u20AC\xA0\xE2\u20AC\u2122 'catalogs.<kind>.source' on the document \xC3\xA2\xE2\u20AC\xA0\xE2\u20AC\u2122 engine defaults \xC3\xA2\xE2\u20AC\xA0\xE2\u20AC\u2122 the default catalog at https://www.pptx.gallery/<kind>. Every reference resolves to the catalog record's 'id' field. When an OPF document omits a reference entirely, the engine falls back to engine defaults (see /spec/reference/engine-defaults.json for a reference example). The defaults file is engine configuration; it is not part of the OPF document contract and has no JSON Schema.\n\nMost catalog references accept the bare 'id' as a string for the common case (e.g. narrative = 'classic-story', design.colorScheme = 'cool-horizon'). Audience, purpose, tone, design, and language object forms use 'id' as a base catalog reference plus inline overrides. Asset references use 'asset:<id>' strings that point into the top-level assets registry.",
23
+ "title": "Presentation",
24
+ "description": "Open-source JSON format for describing PowerPoint presentations. Agents describe narratives, content, audience, reusable assets, and design \u2014 the engine handles OOXML complexity.\n\nFields that reference catalog records (narrative, language, tone, audience, purpose, design.theme / design.theme.id, design.colorScheme / design.colorScheme.id, design.fontScheme / design.fontScheme.id, Slide.layout, Chart.type, Organization.socials / Speaker.socials) resolve through the catalog system: inline 'catalogs.<kind>.records[]' on the document \u2192 'catalogs.<kind>.source' on the document \u2192 engine defaults \u2192 the default catalog at https://www.pptx.gallery/<kind>. Every reference resolves to the catalog record's 'id' field. When an OPF document omits a reference entirely, the engine falls back to engine defaults (see /spec/reference/engine-defaults.json for a reference example). The defaults file is engine configuration; it is not part of the OPF document contract and has no JSON Schema.\n\nMost catalog references accept the bare 'id' as a string for the common case (e.g. narrative = 'classic-story', design.colorScheme = 'cool-horizon'). Audience, purpose, tone, design, and language object forms use 'id' as a base catalog reference plus inline overrides. Asset references use 'asset:<id>' strings that point into the top-level assets registry.",
25
25
  "type": "object",
26
26
  "required": [
27
27
  "slides"
@@ -38,13 +38,13 @@ var presentation = {
38
38
  "description": "Display name of the presentation for GUI/TUI lists, library/search indexing, OS-level metadata, and default export filenames. This is deck identity, not slide content. Use slides[].title and slides[].subtitle for text that should appear on presented slides.",
39
39
  "examples": [
40
40
  "Q4 2026 Business Review",
41
- "Series B Pitch \xC3\xA2\xE2\u201A\xAC\xE2\u20AC\x9D Acme",
41
+ "Series B Pitch \u2014 Acme",
42
42
  "The Future of Agentic Workflows"
43
43
  ]
44
44
  },
45
45
  "description": {
46
46
  "type": "string",
47
- "description": "Free-form prose describing what this presentation is about. Used by agents and humans as a deck-level summary; complements purpose (the goal) and narrative (the structured storyline). Round-trips to OOXML 'docProps/core.xml' as '<dc:description>' (PowerPoint surfaces this as the 'Comments' field in File \xC3\xA2\xE2\u20AC\xA0\xE2\u20AC\u2122 Properties).",
47
+ "description": "Free-form prose describing what this presentation is about. Used by agents and humans as a deck-level summary; complements purpose (the goal) and narrative (the structured storyline). Round-trips to OOXML 'docProps/core.xml' as '<dc:description>' (PowerPoint surfaces this as the 'Comments' field in File \u2192 Properties).",
48
48
  "examples": [
49
49
  "Quarterly business review covering revenue, product, and hiring milestones for the executive team."
50
50
  ]
@@ -110,20 +110,29 @@ var presentation = {
110
110
  ]
111
111
  },
112
112
  "audience": {
113
- "type": "array",
114
- "items": {
115
- "oneOf": [
116
- {
117
- "type": "string"
113
+ "oneOf": [
114
+ {
115
+ "type": "string"
116
+ },
117
+ {
118
+ "type": "array",
119
+ "items": {
120
+ "oneOf": [
121
+ {
122
+ "type": "string"
123
+ },
124
+ {
125
+ "$ref": "#/$defs/Audience"
126
+ }
127
+ ]
118
128
  },
119
- {
120
- "$ref": "#/$defs/Audience"
121
- }
122
- ]
123
- },
124
- "minItems": 1,
125
- "description": "Intended audiences for the presentation. Each item accepts either:\n- A string shorthand: free-form description ('Series B investors'), an audiences catalog id ('executives'), an HTTPS URL, or a 'pkg:' reference.\n- An inline Audience object for custom audience metadata or catalog-backed overrides. Object form mirrors https://openpresentation.org/schema/opf-audience/v1 without '$schema'.\n\nResolution order for catalog ids and references: inline catalogs.audiences.records[] \xC3\xA2\xE2\u20AC\xA0\xE2\u20AC\u2122 catalogs.audiences.source \xC3\xA2\xE2\u20AC\xA0\xE2\u20AC\u2122 default catalog at https://www.pptx.gallery/audiences.",
129
+ "minItems": 1
130
+ }
131
+ ],
132
+ "description": "Intended audiences for the presentation. Accepts either:\n- A single string shorthand: free-form description ('Series B investors'), an audiences catalog id ('executives'), an HTTPS URL, or a 'pkg:' reference.\n- An array of string shorthands and/or inline Audience objects for custom audience metadata or catalog-backed overrides. Object form mirrors https://openpresentation.org/schema/opf-audience/v1 without '$schema'.\n\nResolution order for catalog ids and references: inline catalogs.audiences.records[] \u2192 catalogs.audiences.source \u2192 default catalog at https://www.pptx.gallery/audiences.",
126
133
  "examples": [
134
+ "executives",
135
+ "Biology Students and Wildlife Enthusiasts",
127
136
  [
128
137
  "executives"
129
138
  ],
@@ -158,7 +167,7 @@ var presentation = {
158
167
  "$ref": "#/$defs/Purpose"
159
168
  }
160
169
  ],
161
- "description": "Primary goal of the presentation. Accepts either:\n- A string shorthand: free-form goal ('Raise a Series B round of $30M'), a purposes catalog id ('decide', 'align'), an HTTPS URL, or a 'pkg:' reference.\n- An inline Purpose object for custom purpose metadata or catalog-backed overrides. Object form mirrors https://openpresentation.org/schema/opf-purpose/v1 without '$schema'.\n\nResolution order for catalog ids and references: inline catalogs.purposes.records[] \xC3\xA2\xE2\u20AC\xA0\xE2\u20AC\u2122 catalogs.purposes.source \xC3\xA2\xE2\u20AC\xA0\xE2\u20AC\u2122 default catalog at https://www.pptx.gallery/purposes.",
170
+ "description": "Primary goal of the presentation. Accepts either:\n- A string shorthand: free-form goal ('Raise a Series B round of $30M'), a purposes catalog id ('decide', 'align'), an HTTPS URL, or a 'pkg:' reference.\n- An inline Purpose object for custom purpose metadata or catalog-backed overrides. Object form mirrors https://openpresentation.org/schema/opf-purpose/v1 without '$schema'.\n\nResolution order for catalog ids and references: inline catalogs.purposes.records[] \u2192 catalogs.purposes.source \u2192 default catalog at https://www.pptx.gallery/purposes.",
162
171
  "examples": [
163
172
  "Raise a Series B round of $30M",
164
173
  "align",
@@ -184,7 +193,7 @@ var presentation = {
184
193
  "$ref": "#/$defs/Language"
185
194
  }
186
195
  ],
187
- "description": "Language for the presentation content. Accepts either:\n- A string shorthand: a BCP-47 language tag ('en-US', 'en-GB', 'ja-JP', 'fr'), a languages catalog id ('english', 'japanese'), an HTTPS URL, or a 'pkg:' reference.\n- An inline Language object for custom language metadata or catalog-backed overrides. Object form mirrors https://openpresentation.org/schema/opf-language/v1 without '$schema'.\n\nResolution order for catalog ids and references: inline catalogs.languages.records[] \xC3\xA2\xE2\u20AC\xA0\xE2\u20AC\u2122 catalogs.languages.source \xC3\xA2\xE2\u20AC\xA0\xE2\u20AC\u2122 default catalog at https://www.pptx.gallery/languages.",
196
+ "description": "Language for the presentation content. Accepts either:\n- A string shorthand: a BCP-47 language tag ('en-US', 'en-GB', 'ja-JP', 'fr'), a languages catalog id ('english', 'japanese'), an HTTPS URL, or a 'pkg:' reference.\n- An inline Language object for custom language metadata or catalog-backed overrides. Object form mirrors https://openpresentation.org/schema/opf-language/v1 without '$schema'.\n\nResolution order for catalog ids and references: inline catalogs.languages.records[] \u2192 catalogs.languages.source \u2192 default catalog at https://www.pptx.gallery/languages.",
188
197
  "examples": [
189
198
  "en-US",
190
199
  "en-GB",
@@ -218,7 +227,7 @@ var presentation = {
218
227
  "$ref": "#/$defs/Tone"
219
228
  }
220
229
  ],
221
- "description": "Desired tone for the presentation. Accepts either:\n- A string shorthand: a tones catalog id ('formal'), an HTTPS URL, or a 'pkg:' reference.\n- An inline Tone object for custom tone metadata or catalog-backed overrides. Object form mirrors https://openpresentation.org/schema/opf-tone/v1 without '$schema'.\n\nResolution order for catalog ids and references: inline catalogs.tones.records[] \xC3\xA2\xE2\u20AC\xA0\xE2\u20AC\u2122 catalogs.tones.source \xC3\xA2\xE2\u20AC\xA0\xE2\u20AC\u2122 default catalog at https://www.pptx.gallery/tones.",
230
+ "description": "Desired tone for the presentation. Accepts either:\n- A string shorthand: a tones catalog id ('formal'), an HTTPS URL, or a 'pkg:' reference.\n- An inline Tone object for custom tone metadata or catalog-backed overrides. Object form mirrors https://openpresentation.org/schema/opf-tone/v1 without '$schema'.\n\nResolution order for catalog ids and references: inline catalogs.tones.records[] \u2192 catalogs.tones.source \u2192 default catalog at https://www.pptx.gallery/tones.",
222
231
  "examples": [
223
232
  "formal",
224
233
  "casual",
@@ -308,7 +317,7 @@ Accepts two forms:
308
317
  - String shorthand for the common case: 'narrative = "classic-story"'. Accepts a bare id (lowercase kebab-case), an HTTPS URL pointing at a record file, or a 'pkg:' reference to a locally-installed package.
309
318
  - Object form for inline overrides or fully custom narratives: 'narrative = { id: "classic-story", beats: [...] }'. The object shape mirrors https://openpresentation.org/schema/opf-narrative/v1 (sans '$schema'), so a library record and an inline narrative are interchangeable.
310
319
 
311
- Resolution order: inline catalogs.narratives.records[] \xC3\xA2\xE2\u20AC\xA0\xE2\u20AC\u2122 catalogs.narratives.source \xC3\xA2\xE2\u20AC\xA0\xE2\u20AC\u2122 default catalog at https://www.pptx.gallery/narratives. Unknown ids produce a validation warning, not an error.
320
+ Resolution order: inline catalogs.narratives.records[] \u2192 catalogs.narratives.source \u2192 default catalog at https://www.pptx.gallery/narratives. Unknown ids produce a validation warning, not an error.
312
321
 
313
322
  Deck-level concerns that aren't part of the storyline (audience, tone, takeaway, duration) live as siblings on the presentation root rather than inside the narrative object.`,
314
323
  "examples": [
@@ -799,7 +808,7 @@ Deck-level concerns that aren't part of the storyline (audience, tone, takeaway,
799
808
  },
800
809
  "Organization": {
801
810
  "type": "object",
802
- "description": "An organization associated with the presentation \xC3\xA2\xE2\u201A\xAC\xE2\u20AC\x9D typically the presenting company, but also hosts, partners, clients, or sponsors. Surfaced on cover slides, footers, and brand bars; the primary organization's logo is the default deck logo unless overridden by design.logo.",
811
+ "description": "An organization associated with the presentation \u2014 typically the presenting company, but also hosts, partners, clients, or sponsors. Surfaced on cover slides, footers, and brand bars; the primary organization's logo is the default deck logo unless overridden by design.logo.",
803
812
  "required": [
804
813
  "id",
805
814
  "name"
@@ -983,7 +992,7 @@ Deck-level concerns that aren't part of the storyline (audience, tone, takeaway,
983
992
  },
984
993
  "Socials": {
985
994
  "type": "object",
986
- "description": "Social media handles or URLs, keyed by platform id from the 'socialPlatforms' catalog. Each value is a string \xC3\xA2\xE2\u201A\xAC\xE2\u20AC\x9D either a full URL or a platform handle (e.g., '@acme'). The catalog record for each platform carries the URL pattern, handle prefix, brand color, and themed icons used by renderers.\n\nKeys resolve to the 'id' of a 'socialPlatforms' catalog record. Resolution order: inline catalogs.socialPlatforms.records[] \xC3\xA2\xE2\u20AC\xA0\xE2\u20AC\u2122 catalogs.socialPlatforms.source \xC3\xA2\xE2\u20AC\xA0\xE2\u20AC\u2122 default catalog at https://www.pptx.gallery/social-platforms. Unknown platform keys render with engine fallbacks (the raw value as text). Used both for organization and speaker records.",
995
+ "description": "Social media handles or URLs, keyed by platform id from the 'socialPlatforms' catalog. Each value is a string \u2014 either a full URL or a platform handle (e.g., '@acme'). The catalog record for each platform carries the URL pattern, handle prefix, brand color, and themed icons used by renderers.\n\nKeys resolve to the 'id' of a 'socialPlatforms' catalog record. Resolution order: inline catalogs.socialPlatforms.records[] \u2192 catalogs.socialPlatforms.source \u2192 default catalog at https://www.pptx.gallery/social-platforms. Unknown platform keys render with engine fallbacks (the raw value as text). Used both for organization and speaker records.",
987
996
  "additionalProperties": {
988
997
  "type": "string",
989
998
  "description": "Handle or URL for the platform identified by the property key."
@@ -1007,7 +1016,7 @@ Deck-level concerns that aren't part of the storyline (audience, tone, takeaway,
1007
1016
  },
1008
1017
  "Narrative": {
1009
1018
  "type": "object",
1010
- "description": "Structured storyline used by AI to shape generated content. Mirrors the OPF Narrative Template record at https://openpresentation.org/schema/opf-narrative/v1 (sans '$schema'), so a library record and an inline narrative are interchangeable.\n\nNarrative declares the deck's intended story arc; slides may opt into beats via Slide.beat. The narrative does not constrain slide structure \xC3\xA2\xE2\u201A\xAC\xE2\u20AC\x9D validators warn on drift (orphan slides, unused beats) but never error. Slides are the source of truth; narrative is intent that travels with the deck.\n\nWhen 'id' matches a record in the resolved 'narratives' catalog, the inline fields override matching fields on the catalog record (beats merge by beat 'id'). When 'id' doesn't match, this object defines a fully custom inline narrative.\n\nDeck-level concerns that aren't part of the storyline (audience, tone, takeaway, duration) live as siblings on the presentation root rather than inside this object.",
1019
+ "description": "Structured storyline used by AI to shape generated content. Mirrors the OPF Narrative Template record at https://openpresentation.org/schema/opf-narrative/v1 (sans '$schema'), so a library record and an inline narrative are interchangeable.\n\nNarrative declares the deck's intended story arc; slides may opt into beats via Slide.beat. The narrative does not constrain slide structure \u2014 validators warn on drift (orphan slides, unused beats) but never error. Slides are the source of truth; narrative is intent that travels with the deck.\n\nWhen 'id' matches a record in the resolved 'narratives' catalog, the inline fields override matching fields on the catalog record (beats merge by beat 'id'). When 'id' doesn't match, this object defines a fully custom inline narrative.\n\nDeck-level concerns that aren't part of the storyline (audience, tone, takeaway, duration) live as siblings on the presentation root rather than inside this object.",
1011
1020
  "properties": {
1012
1021
  "id": {
1013
1022
  "type": "string",
@@ -1028,7 +1037,7 @@ Deck-level concerns that aren't part of the storyline (audience, tone, takeaway,
1028
1037
  "description": "Human-readable narrative name.",
1029
1038
  "examples": [
1030
1039
  "Classic Story",
1031
- "Problem \xC3\xA2\xE2\u20AC\xA0\xE2\u20AC\u2122 Solution",
1040
+ "Problem \u2192 Solution",
1032
1041
  "SCQA",
1033
1042
  "Founder Pitch"
1034
1043
  ]
@@ -1118,7 +1127,7 @@ Deck-level concerns that aren't part of the storyline (audience, tone, takeaway,
1118
1127
  },
1119
1128
  "NarrativeBeat": {
1120
1129
  "type": "object",
1121
- "description": "A single narrative beat \xE2\u20AC\u201D a labeled segment of the story arc with a specific dramatic purpose (e.g. 'hook', 'problem', 'evidence', 'ask'). Slides reference beats via Slide.beat. Beats may also carry slide-blueprint hints (slideType, layoutHint, thoughtCues, instructions) that guide the assigned slide.\n\nMirrors the Beat definition in narrative.schema.json (https://openpresentation.org/schema/opf-narrative/v1) so library entries and inline OPF beats are interchangeable.",
1130
+ "description": "A single narrative beat \u2014 a labeled segment of the story arc with a specific dramatic purpose (e.g. 'hook', 'problem', 'evidence', 'ask'). Slides reference beats via Slide.beat. Beats may also carry slide-blueprint hints (slideType, layoutHint, thoughtCues, instructions) that guide the assigned slide.\n\nMirrors the Beat definition in narrative.schema.json (https://openpresentation.org/schema/opf-narrative/v1) so library entries and inline OPF beats are interchangeable.",
1122
1131
  "required": [
1123
1132
  "id",
1124
1133
  "name"
@@ -1155,7 +1164,7 @@ Deck-level concerns that aren't part of the storyline (audience, tone, takeaway,
1155
1164
  },
1156
1165
  "instructions": {
1157
1166
  "type": "string",
1158
- "description": "Short author-facing instruction for the beat \xE2\u20AC\u201D typically one phrase. Complements 'description' with a concise directive.",
1167
+ "description": "Short author-facing instruction for the beat \u2014 typically one phrase. Complements 'description' with a concise directive.",
1159
1168
  "examples": [
1160
1169
  "Capture audience attention",
1161
1170
  "Introduce problem",
@@ -1186,7 +1195,7 @@ Deck-level concerns that aren't part of the storyline (audience, tone, takeaway,
1186
1195
  },
1187
1196
  "layoutHint": {
1188
1197
  "type": "string",
1189
- "description": "Suggested layout id for the beat's opening slide. Resolves the same way as Slide.layout \xC3\xA2\xE2\u201A\xAC\xE2\u20AC\x9D against catalogs.layouts and the default catalog at https://www.pptx.gallery/layouts.",
1198
+ "description": "Suggested layout id for the beat's opening slide. Resolves the same way as Slide.layout \u2014 against catalogs.layouts and the default catalog at https://www.pptx.gallery/layouts.",
1190
1199
  "examples": [
1191
1200
  "section-divider",
1192
1201
  "title-slide",
@@ -1842,7 +1851,7 @@ Resolution order: inline catalogs.fontSchemes.records[] -> catalogs.fontSchemes.
1842
1851
  },
1843
1852
  "major": {
1844
1853
  "type": "string",
1845
- "description": "Heading (major) font family \xC3\xA2\xE2\u201A\xAC\xE2\u20AC\x9D mirrors the OOXML majorFont entry. Pairs with 'minor'.",
1854
+ "description": "Heading (major) font family \u2014 mirrors the OOXML majorFont entry. Pairs with 'minor'.",
1846
1855
  "examples": [
1847
1856
  "Aptos Display",
1848
1857
  "Calibri",
@@ -1852,7 +1861,7 @@ Resolution order: inline catalogs.fontSchemes.records[] -> catalogs.fontSchemes.
1852
1861
  },
1853
1862
  "minor": {
1854
1863
  "type": "string",
1855
- "description": "Body (minor) font family \xC3\xA2\xE2\u201A\xAC\xE2\u20AC\x9D mirrors the OOXML minorFont entry. Pairs with 'major'.",
1864
+ "description": "Body (minor) font family \u2014 mirrors the OOXML minorFont entry. Pairs with 'major'.",
1856
1865
  "examples": [
1857
1866
  "Aptos",
1858
1867
  "Calibri",
@@ -2421,7 +2430,7 @@ Resolution order: inline catalogs.fontSchemes.records[] -> catalogs.fontSchemes.
2421
2430
  },
2422
2431
  "layout": {
2423
2432
  "type": "string",
2424
- "description": "Optional slide layout reference. Resolves to the 'id' of a 'layouts' catalog record. When omitted, engines infer a layout from the slide's root payload or promoted region keys. Accepts a bare id (lowercase kebab-case, e.g. 'title-subtitle'), an HTTPS URL pointing at a record file, or a 'pkg:' reference. Free-form custom layout names that don't resolve through any catalog fall through to engine-defined layouts.\n\nResolution order: inline catalogs.layouts.records[] \xC3\xA2\xE2\u20AC\xA0\xE2\u20AC\u2122 catalogs.layouts.source \xC3\xA2\xE2\u20AC\xA0\xE2\u20AC\u2122 default catalog at https://www.pptx.gallery/layouts.",
2433
+ "description": "Optional slide layout reference. Resolves to the 'id' of a 'layouts' catalog record. When omitted, engines infer a layout from the slide's root payload or promoted region keys. Accepts a bare id (lowercase kebab-case, e.g. 'title-subtitle'), an HTTPS URL pointing at a record file, or a 'pkg:' reference. Free-form custom layout names that don't resolve through any catalog fall through to engine-defined layouts.\n\nResolution order: inline catalogs.layouts.records[] \u2192 catalogs.layouts.source \u2192 default catalog at https://www.pptx.gallery/layouts.",
2425
2434
  "examples": [
2426
2435
  "title",
2427
2436
  "title-subtitle",
@@ -2478,7 +2487,7 @@ Resolution order: inline catalogs.fontSchemes.records[] -> catalogs.fontSchemes.
2478
2487
  "items": {
2479
2488
  "$ref": "#/$defs/ListItem"
2480
2489
  },
2481
- "description": "Full-slide generic list payload. Presence of this field infers type 'list'."
2490
+ "description": "Full-slide generic list payload. Presence of this field infers type 'list'. At slide root, multiple content payload kinds with no explicit type, blocks, or regions are accepted as shorthand for layout-agnostic blocks."
2482
2491
  },
2483
2492
  "bullets": {
2484
2493
  "type": "array",
@@ -2548,7 +2557,7 @@ Resolution order: inline catalogs.fontSchemes.records[] -> catalogs.fontSchemes.
2548
2557
  "items": {
2549
2558
  "$ref": "#/$defs/ContentPayload"
2550
2559
  },
2551
- "description": "Layout-agnostic content blocks rendered together as a composed payload when exact placement is unspecified."
2560
+ "description": "Layout-agnostic content blocks rendered together as a composed payload when exact placement is unspecified. At slide root, multiple content payload kinds with no explicit type, blocks, or regions are accepted as shorthand for equivalent blocks."
2552
2561
  },
2553
2562
  "design": {
2554
2563
  "$ref": "#/$defs/Design",
@@ -3760,7 +3769,7 @@ Resolution order: inline catalogs.fontSchemes.records[] -> catalogs.fontSchemes.
3760
3769
  },
3761
3770
  "Catalogs": {
3762
3771
  "type": "object",
3763
- "description": "Catalog overrides for the in-document references. Every property is optional. The default catalog for a kind lives at https://www.pptx.gallery/<kind> (e.g. https://www.pptx.gallery/narratives, https://www.pptx.gallery/themes). For each kind, declaring a 'source' replaces the default registry and/or 'records' adds inline records that take precedence over anything fetched from a source.\n\nResolution order for any reference (e.g. narrative, design.theme): inline catalogs.<kind>.records[] \xC3\xA2\xE2\u20AC\xA0\xE2\u20AC\u2122 catalogs.<kind>.source \xC3\xA2\xE2\u20AC\xA0\xE2\u20AC\u2122 default catalog at https://www.pptx.gallery/<kind>. Every reference resolves to the catalog record's 'id' field. References that are themselves URLs or 'pkg:' references skip the catalog lookup and resolve directly.",
3772
+ "description": "Catalog overrides for the in-document references. Every property is optional. The default catalog for a kind lives at https://www.pptx.gallery/<kind> (e.g. https://www.pptx.gallery/narratives, https://www.pptx.gallery/themes). For each kind, declaring a 'source' replaces the default registry and/or 'records' adds inline records that take precedence over anything fetched from a source.\n\nResolution order for any reference (e.g. narrative, design.theme): inline catalogs.<kind>.records[] \u2192 catalogs.<kind>.source \u2192 default catalog at https://www.pptx.gallery/<kind>. Every reference resolves to the catalog record's 'id' field. References that are themselves URLs or 'pkg:' references skip the catalog lookup and resolve directly.",
3764
3773
  "properties": {
3765
3774
  "narratives": {
3766
3775
  "$ref": "#/$defs/CatalogEntry",
@@ -3852,7 +3861,7 @@ Resolution order: inline catalogs.fontSchemes.records[] -> catalogs.fontSchemes.
3852
3861
  var audience = {
3853
3862
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3854
3863
  "$id": "https://openpresentation.org/schema/opf-audience/v1",
3855
- "title": "OPF Audience",
3864
+ "title": "Audience",
3856
3865
  "description": "Schema for audience records in the pptx.gallery library. Each record names an audience archetype (e.g. 'executives', 'engineering-team', 'investors') and carries seniority, technical-fluency, decision-power, and attention-budget hints used by AI-driven generation. Audiences are referenced from OPF documents via audience; the engine resolves the reference against catalogs.audiences (inline) \u2192 catalogs.audiences.source \u2192 the default catalog at https://www.pptx.gallery/audiences. The audience field also accepts free-form strings; this catalog is for engine-aware audience archetypes that carry generation hints.",
3857
3866
  "type": "object",
3858
3867
  "required": [
@@ -4024,7 +4033,7 @@ var audience = {
4024
4033
  var purpose = {
4025
4034
  "$schema": "https://json-schema.org/draft/2020-12/schema",
4026
4035
  "$id": "https://openpresentation.org/schema/opf-purpose/v1",
4027
- "title": "OPF Purpose",
4036
+ "title": "Purpose",
4028
4037
  "description": "Schema for purpose records in the pptx.gallery library. Each record names a presentation objective such as informing, aligning, persuading, driving a decision, or selling. Purposes are referenced from OPF documents via purpose; the engine resolves the reference against catalogs.purposes (inline) \u2192 catalogs.purposes.source \u2192 the default catalog at https://www.pptx.gallery/purposes. The purpose field also accepts free-form strings and inline Purpose objects.",
4029
4038
  "type": "object",
4030
4039
  "required": [
@@ -4135,7 +4144,7 @@ var purpose = {
4135
4144
  var tone = {
4136
4145
  "$schema": "https://json-schema.org/draft/2020-12/schema",
4137
4146
  "$id": "https://openpresentation.org/schema/opf-tone/v1",
4138
- "title": "OPF Tone",
4147
+ "title": "Tone",
4139
4148
  "description": "Schema for tone records in the pptx.gallery library. Each record names a presentation tone (e.g. 'formal', 'casual', 'inspirational') and carries voice cues, anti-patterns, and sample phrases that AI-driven generation uses to shape output. Tones are referenced from OPF documents via tone; the engine resolves the reference against catalogs.tones (inline) \u2192 catalogs.tones.source \u2192 the default catalog at https://www.pptx.gallery/tones.",
4140
4149
  "type": "object",
4141
4150
  "required": [
@@ -4294,7 +4303,7 @@ var tone = {
4294
4303
  var theme = {
4295
4304
  "$schema": "https://json-schema.org/draft/2020-12/schema",
4296
4305
  "$id": "https://openpresentation.org/schema/opf-theme/v1",
4297
- "title": "OPF Theme",
4306
+ "title": "Theme",
4298
4307
  "description": "Schema for theme records in the pptx.gallery library. Each theme is a small, named bundle that pairs a color scheme, a font scheme, a default theme-controlled background, and a slide size. Themes are referenced from OPF documents via design.theme or design.theme.id; the engine resolves the reference against catalogs.themes (inline) \u2192 catalogs.themes.source \u2192 the default catalog at https://www.pptx.gallery/themes. Inline overrides on design.colorScheme / design.fontScheme / design.background / design.dimensions take precedence over a resolved theme.",
4299
4308
  "type": "object",
4300
4309
  "required": [
@@ -4470,7 +4479,7 @@ var theme = {
4470
4479
  var layout = {
4471
4480
  "$schema": "https://json-schema.org/draft/2020-12/schema",
4472
4481
  "$id": "https://openpresentation.org/schema/opf-layout/v1",
4473
- "title": "OPF Slide Layout",
4482
+ "title": "Slide Layout",
4474
4483
  "description": "Schema for slide-layout records in the pptx.gallery library. Each record describes a semantic slide layout \u2014 what regions it exposes and what content kinds those regions are intended to hold. Layouts are referenced from OPF documents via Slide.layout; the engine resolves the reference against catalogs.layouts (inline) \u2192 catalogs.layouts.source \u2192 the default catalog at https://www.pptx.gallery/layouts. Free-form custom layout names that don't resolve through any catalog fall through to engine-defined layouts.",
4475
4484
  "type": "object",
4476
4485
  "required": [
@@ -4752,7 +4761,7 @@ var layout = {
4752
4761
  var chartType = {
4753
4762
  "$schema": "https://json-schema.org/draft/2020-12/schema",
4754
4763
  "$id": "https://openpresentation.org/schema/opf-chart-type/v1",
4755
- "title": "OPF Chart Type",
4764
+ "title": "Chart Type",
4756
4765
  "description": "Schema for chart-type records in the pptx.gallery catalog. Each record describes a named chart variant, its Open XML mapping, its series/category cardinality, the column structure of the underlying workbook, and a small sample dataset suitable for previews. Chart types are referenced from OPF chart content payloads; the engine resolves the reference against catalogs.chartTypes (inline) -> catalogs.chartTypes.source -> the default catalog at https://www.pptx.gallery/chart-types.",
4757
4766
  "type": "object",
4758
4767
  "additionalProperties": false,
@@ -5289,7 +5298,7 @@ var chartType = {
5289
5298
  var narrative = {
5290
5299
  "$schema": "https://json-schema.org/draft/2020-12/schema",
5291
5300
  "$id": "https://openpresentation.org/schema/opf-narrative/v1",
5292
- "title": "OPF Narrative Template",
5301
+ "title": "Narrative Template",
5293
5302
  "description": "Schema for narrative template files in the openpresentation.org catalog. Each template describes a named story arc (e.g. 'problem-solution', 'scqa') as an ordered list of beats. Templates are referenced from OPF documents via narrative \u2014 either as a bare id string (e.g. 'classic-story') or as an inline object whose shape matches this schema (sans '$schema').",
5294
5303
  "type": "object",
5295
5304
  "required": [
@@ -5496,8 +5505,8 @@ var narrative = {
5496
5505
  var socialPlatform = {
5497
5506
  "$schema": "https://json-schema.org/draft/2020-12/schema",
5498
5507
  "$id": "https://openpresentation.org/schema/opf-social-platform/v1",
5499
- "title": "OPF Social Platform",
5500
- "description": "Schema for social-platform records in the pptx.gallery library. Each record describes a single social-media platform \xE2\u20AC\u201D its base URL, profile-URL pattern, handle prefix, brand color, and themed icons. Records are referenced from OPF documents indirectly: the property keys of any Socials object (Organization.socials, Speaker.socials) match record ids, and renderers use the catalog record to format URLs and pick icons. The engine resolves references against catalogs.socialPlatforms (inline) \xE2\u2020\u2019 catalogs.socialPlatforms.source \xE2\u2020\u2019 the default catalog at https://www.pptx.gallery/social-platforms.",
5508
+ "title": "Social Platform",
5509
+ "description": "Schema for social-platform records in the pptx.gallery library. Each record describes a single social-media platform \u2014 its base URL, profile-URL pattern, handle prefix, brand color, and themed icons. Records are referenced from OPF documents indirectly: the property keys of any Socials object (Organization.socials, Speaker.socials) match record ids, and renderers use the catalog record to format URLs and pick icons. The engine resolves references against catalogs.socialPlatforms (inline) \u2192 catalogs.socialPlatforms.source \u2192 the default catalog at https://www.pptx.gallery/social-platforms.",
5501
5510
  "type": "object",
5502
5511
  "required": [
5503
5512
  "$schema",
@@ -5513,7 +5522,7 @@ var socialPlatform = {
5513
5522
  "id": {
5514
5523
  "type": "string",
5515
5524
  "pattern": "^[a-z][a-z0-9-]*$",
5516
- "description": "Stable slug used by OPF documents to reference this platform \xE2\u20AC\u201D appears as a property key on Socials objects. Lowercase kebab-case.",
5525
+ "description": "Stable slug used by OPF documents to reference this platform \u2014 appears as a property key on Socials objects. Lowercase kebab-case.",
5517
5526
  "examples": [
5518
5527
  "linkedin",
5519
5528
  "x",
@@ -5545,7 +5554,7 @@ var socialPlatform = {
5545
5554
  },
5546
5555
  "summary": {
5547
5556
  "type": "string",
5548
- "description": "One-sentence positioning of the platform \xE2\u20AC\u201D what it's used for and who's on it.",
5557
+ "description": "One-sentence positioning of the platform \u2014 what it's used for and who's on it.",
5549
5558
  "examples": [
5550
5559
  "Professional social network for individuals and companies.",
5551
5560
  "Real-time microblog for news, opinions, and discussion."
@@ -5561,7 +5570,7 @@ var socialPlatform = {
5561
5570
  "baseUrl": {
5562
5571
  "type": "string",
5563
5572
  "format": "uri",
5564
- "description": "Canonical base URL of the platform \xE2\u20AC\u201D used as the prefix when normalizing handles to full URLs.",
5573
+ "description": "Canonical base URL of the platform \u2014 used as the prefix when normalizing handles to full URLs.",
5565
5574
  "examples": [
5566
5575
  "https://linkedin.com",
5567
5576
  "https://x.com",
@@ -5695,7 +5704,7 @@ var socialPlatform = {
5695
5704
  var language = {
5696
5705
  "$schema": "https://json-schema.org/draft/2020-12/schema",
5697
5706
  "$id": "https://openpresentation.org/schema/opf-language/v1",
5698
- "title": "OPF Language",
5707
+ "title": "Language",
5699
5708
  "description": "Schema for language records in the pptx.gallery library. Each record names a presentation language, carries a BCP-47 language tag, and pairs it with sensible default font schemes for PowerPoint and Google Slides output. Languages are referenced from OPF documents via language; the engine resolves the reference against catalogs.languages (inline) \u2192 catalogs.languages.source \u2192 the default catalog at https://www.pptx.gallery/languages. The presentation language field also accepts BCP-47 tags directly or inline Language objects for engine-aware language records that carry default-font hints.",
5700
5709
  "type": "object",
5701
5710
  "required": [
@@ -5865,7 +5874,7 @@ var language = {
5865
5874
  var colorScheme = {
5866
5875
  "$schema": "https://json-schema.org/draft/2020-12/schema",
5867
5876
  "$id": "https://openpresentation.org/schema/opf-color-scheme/v1",
5868
- "title": "OPF Color Scheme",
5877
+ "title": "Color Scheme",
5869
5878
  "description": "Schema for color-scheme records in the pptx.gallery library. Each scheme is a named palette with the twelve PowerPoint color slots (six accents, two darks, two lights, plus hyperlink and followed-hyperlink), suitable for being mapped directly into OOXML theme XML. Color schemes are referenced from OPF documents via design.colorScheme or design.colorScheme.id; the engine resolves the reference against catalogs.colorSchemes (inline) -> catalogs.colorSchemes.source -> the default catalog at https://www.pptx.gallery/color-schemes. Slot overrides on design.colorScheme take precedence over the resolved scheme.\n\nThe slot fields here mirror the inline-override fields on the in-document ColorScheme type (in opf.schema.json), so library entries and inline OPF overrides are interchangeable.",
5870
5879
  "type": "object",
5871
5880
  "required": [
@@ -6065,7 +6074,7 @@ var colorScheme = {
6065
6074
  var fontScheme = {
6066
6075
  "$schema": "https://json-schema.org/draft/2020-12/schema",
6067
6076
  "$id": "https://openpresentation.org/schema/opf-font-scheme/v1",
6068
- "title": "OPF Font Scheme",
6077
+ "title": "Font Scheme",
6069
6078
  "description": "Schema for font-scheme records in the pptx.gallery library. Each scheme pairs a major (heading) and minor (body) font family in the OOXML majorFont/minorFont sense, scoped to a target app (PowerPoint or Google Slides) and a language family (Latin, East Asian, or Complex Script). Font schemes are referenced from OPF documents via design.fontScheme or design.fontScheme.id; the engine resolves the reference against catalogs.fontSchemes (inline) \u2192 catalogs.fontSchemes.source \u2192 the default catalog at https://www.pptx.gallery/font-schemes. Role overrides on design.fontScheme (heading, body, accent, code) take precedence over the resolved scheme.",
6070
6079
  "type": "object",
6071
6080
  "required": [
@@ -6484,6 +6493,12 @@ function inferredKinds(value) {
6484
6493
  if (hasOwn(value, "timeline")) kinds.push("timeline");
6485
6494
  return kinds;
6486
6495
  }
6496
+ function isImplicitBlocksComposition(value, inferred, options) {
6497
+ if (options.allowBlocks !== true || hasOwn(value, "blocks")) {
6498
+ return false;
6499
+ }
6500
+ return inferred.length > 1;
6501
+ }
6487
6502
  function validateContentPayload(value, path, options = {}) {
6488
6503
  const issues = [];
6489
6504
  const explicitType = value.type;
@@ -6510,6 +6525,9 @@ function validateContentPayload(value, path, options = {}) {
6510
6525
  return issues;
6511
6526
  }
6512
6527
  if (!kind && inferred.length > 1) {
6528
+ if (isImplicitBlocksComposition(value, inferred, options)) {
6529
+ return issues;
6530
+ }
6513
6531
  issues.push(semanticIssue(path, "content payload mixes fields from incompatible content types", {
6514
6532
  inferredTypes: inferred
6515
6533
  }));