@openpresentation/opf 0.11.2 → 0.11.4

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 (236) hide show
  1. package/dist/{catalogs-DJ-B5ZyD.d.ts → catalogs-CUClB3nl.d.ts} +202 -5
  2. package/dist/catalogs.d.ts +1 -1
  3. package/dist/catalogs.js +1 -1
  4. package/dist/{chunk-BVLWFMDX.js → chunk-3H2U7FDR.js} +224 -26
  5. package/dist/{chunk-K7IWYODS.js → chunk-3OJN7QAW.js} +17 -4
  6. package/dist/{chunk-7LF37SG3.js → chunk-AEUSVEUY.js} +4915 -1640
  7. package/dist/{chunk-DJRZMGKY.js → chunk-FDCWQHWO.js} +143 -68
  8. package/dist/{chunk-SDETQV7Y.js → chunk-HJL64ETN.js} +505 -0
  9. package/dist/{chunk-LTSDDBNW.js → chunk-KJKASEPE.js} +262 -23
  10. package/dist/{chunk-SMYEM3HV.js → chunk-NSVVQ52O.js} +7 -6
  11. package/dist/{chunk-KZ6BT5UG.js → chunk-RXNFDGPC.js} +5 -5
  12. package/dist/{composition-DzLwY-Mi.d.ts → composition-Dl-d9FRj.d.ts} +93 -6
  13. package/dist/composition.d.ts +1 -1
  14. package/dist/composition.js +1 -1
  15. package/dist/docs.js +21 -15
  16. package/dist/examples.d.ts +1 -1
  17. package/dist/font-policy.js +1 -1
  18. package/dist/index.d.ts +4 -4
  19. package/dist/index.js +11 -11
  20. package/dist/lint.d.ts +2 -2
  21. package/dist/lint.js +5 -5
  22. package/dist/pagination.d.ts +1 -1
  23. package/dist/pagination.js +5 -5
  24. package/dist/{presentation-bceTClm8.d.ts → presentation-j5PVrqfV.d.ts} +41 -29
  25. package/dist/repo-readme.js +1 -1
  26. package/dist/schemas.js +1 -1
  27. package/dist/spec/README.md +3 -2
  28. package/dist/spec/catalogs/audiences/index.json +2 -0
  29. package/dist/spec/catalogs/chart-types/box-and-whisker.json +101 -49
  30. package/dist/spec/catalogs/chart-types/histogram.json +130 -108
  31. package/dist/spec/catalogs/chart-types/index.json +2 -0
  32. package/dist/spec/catalogs/chart-types/pareto.json +22 -106
  33. package/dist/spec/catalogs/color-schemes/black-and-white.json +10 -1
  34. package/dist/spec/catalogs/color-schemes/bold-red.json +10 -1
  35. package/dist/spec/catalogs/color-schemes/boost.json +10 -1
  36. package/dist/spec/catalogs/color-schemes/burnt-orange.json +10 -1
  37. package/dist/spec/catalogs/color-schemes/cool-horizon.json +10 -1
  38. package/dist/spec/catalogs/color-schemes/corporate-blue.json +10 -1
  39. package/dist/spec/catalogs/color-schemes/deep-purple.json +10 -1
  40. package/dist/spec/catalogs/color-schemes/forest-green.json +10 -1
  41. package/dist/spec/catalogs/color-schemes/golden-yellow.json +10 -1
  42. package/dist/spec/catalogs/color-schemes/index.json +2 -0
  43. package/dist/spec/catalogs/color-schemes/luxury.json +10 -1
  44. package/dist/spec/catalogs/color-schemes/pastel-red.json +10 -1
  45. package/dist/spec/catalogs/color-schemes/slate-gray.json +10 -1
  46. package/dist/spec/catalogs/color-schemes/steel-blue.json +10 -1
  47. package/dist/spec/catalogs/color-schemes/vibes.json +10 -1
  48. package/dist/spec/catalogs/font-schemes/angsana-new.json +2 -1
  49. package/dist/spec/catalogs/font-schemes/aparajita.json +2 -1
  50. package/dist/spec/catalogs/font-schemes/aptos.json +2 -1
  51. package/dist/spec/catalogs/font-schemes/arabic-typesetting.json +2 -1
  52. package/dist/spec/catalogs/font-schemes/arial.json +2 -1
  53. package/dist/spec/catalogs/font-schemes/batang.json +2 -1
  54. package/dist/spec/catalogs/font-schemes/bookman.json +2 -1
  55. package/dist/spec/catalogs/font-schemes/calibri.json +2 -1
  56. package/dist/spec/catalogs/font-schemes/century-schoolbook.json +2 -1
  57. package/dist/spec/catalogs/font-schemes/consolas.json +2 -1
  58. package/dist/spec/catalogs/font-schemes/constantia.json +2 -1
  59. package/dist/spec/catalogs/font-schemes/courier-new.json +2 -1
  60. package/dist/spec/catalogs/font-schemes/daunpenh.json +2 -1
  61. package/dist/spec/catalogs/font-schemes/david.json +2 -1
  62. package/dist/spec/catalogs/font-schemes/dilleniaupc.json +2 -1
  63. package/dist/spec/catalogs/font-schemes/fangsong.json +2 -1
  64. package/dist/spec/catalogs/font-schemes/garamond.json +2 -1
  65. package/dist/spec/catalogs/font-schemes/gautami.json +2 -1
  66. package/dist/spec/catalogs/font-schemes/georgia.json +2 -1
  67. package/dist/spec/catalogs/font-schemes/gisha.json +2 -1
  68. package/dist/spec/catalogs/font-schemes/grandview.json +2 -1
  69. package/dist/spec/catalogs/font-schemes/gungsuh.json +2 -1
  70. package/dist/spec/catalogs/font-schemes/impact.json +2 -1
  71. package/dist/spec/catalogs/font-schemes/index.json +236 -234
  72. package/dist/spec/catalogs/font-schemes/kalinga.json +2 -1
  73. package/dist/spec/catalogs/font-schemes/kartika.json +2 -1
  74. package/dist/spec/catalogs/font-schemes/khmer-ui.json +2 -1
  75. package/dist/spec/catalogs/font-schemes/latha.json +2 -1
  76. package/dist/spec/catalogs/font-schemes/lucida-sans.json +2 -1
  77. package/dist/spec/catalogs/font-schemes/malgun-gothic.json +2 -1
  78. package/dist/spec/catalogs/font-schemes/mangal.json +2 -1
  79. package/dist/spec/catalogs/font-schemes/meiryo.json +2 -1
  80. package/dist/spec/catalogs/font-schemes/microsoft-jhenghei.json +2 -1
  81. package/dist/spec/catalogs/font-schemes/microsoft-yahei.json +2 -1
  82. package/dist/spec/catalogs/font-schemes/mingliu.json +2 -1
  83. package/dist/spec/catalogs/font-schemes/miriam.json +2 -1
  84. package/dist/spec/catalogs/font-schemes/montserrat.json +2 -1
  85. package/dist/spec/catalogs/font-schemes/ms-mincho.json +2 -1
  86. package/dist/spec/catalogs/font-schemes/nirmala-ui.json +2 -1
  87. package/dist/spec/catalogs/font-schemes/noto-naksh-arabic.json +2 -1
  88. package/dist/spec/catalogs/font-schemes/noto-nastaliq-urdu.json +2 -1
  89. package/dist/spec/catalogs/font-schemes/noto-sans-arabic.json +2 -1
  90. package/dist/spec/catalogs/font-schemes/noto-sans-armenian.json +2 -1
  91. package/dist/spec/catalogs/font-schemes/noto-sans-bengali.json +2 -1
  92. package/dist/spec/catalogs/font-schemes/noto-sans-devangari.json +2 -1
  93. package/dist/spec/catalogs/font-schemes/noto-sans-ethiopic.json +2 -1
  94. package/dist/spec/catalogs/font-schemes/noto-sans-georgian.json +2 -1
  95. package/dist/spec/catalogs/font-schemes/noto-sans-gujarati.json +2 -1
  96. package/dist/spec/catalogs/font-schemes/noto-sans-gurmukhi.json +2 -1
  97. package/dist/spec/catalogs/font-schemes/noto-sans-hebrew.json +2 -1
  98. package/dist/spec/catalogs/font-schemes/noto-sans-jp.json +2 -1
  99. package/dist/spec/catalogs/font-schemes/noto-sans-kannada.json +2 -1
  100. package/dist/spec/catalogs/font-schemes/noto-sans-khmer.json +2 -1
  101. package/dist/spec/catalogs/font-schemes/noto-sans-kr.json +2 -1
  102. package/dist/spec/catalogs/font-schemes/noto-sans-malayalam.json +2 -1
  103. package/dist/spec/catalogs/font-schemes/noto-sans-mongolian.json +2 -1
  104. package/dist/spec/catalogs/font-schemes/noto-sans-oriya.json +2 -1
  105. package/dist/spec/catalogs/font-schemes/noto-sans-sc.json +2 -1
  106. package/dist/spec/catalogs/font-schemes/noto-sans-tamil.json +2 -1
  107. package/dist/spec/catalogs/font-schemes/noto-sans-tc.json +2 -1
  108. package/dist/spec/catalogs/font-schemes/noto-sans-telugu.json +2 -1
  109. package/dist/spec/catalogs/font-schemes/noto-sans-thai.json +2 -1
  110. package/dist/spec/catalogs/font-schemes/noto-sans.json +2 -1
  111. package/dist/spec/catalogs/font-schemes/nyala.json +2 -1
  112. package/dist/spec/catalogs/font-schemes/open-sans.json +2 -1
  113. package/dist/spec/catalogs/font-schemes/pmingliu.json +2 -1
  114. package/dist/spec/catalogs/font-schemes/poppins.json +2 -1
  115. package/dist/spec/catalogs/font-schemes/pt-serif.json +2 -1
  116. package/dist/spec/catalogs/font-schemes/raavi.json +2 -1
  117. package/dist/spec/catalogs/font-schemes/raleway.json +2 -1
  118. package/dist/spec/catalogs/font-schemes/roboto.json +2 -1
  119. package/dist/spec/catalogs/font-schemes/rockwell.json +2 -1
  120. package/dist/spec/catalogs/font-schemes/sakkal-majalla.json +2 -1
  121. package/dist/spec/catalogs/font-schemes/seaford.json +2 -1
  122. package/dist/spec/catalogs/font-schemes/segoe-ui-light.json +2 -1
  123. package/dist/spec/catalogs/font-schemes/segoe-ui.json +2 -1
  124. package/dist/spec/catalogs/font-schemes/shonar-bangla.json +2 -1
  125. package/dist/spec/catalogs/font-schemes/shruti.json +2 -1
  126. package/dist/spec/catalogs/font-schemes/simsun.json +2 -1
  127. package/dist/spec/catalogs/font-schemes/skeena.json +2 -1
  128. package/dist/spec/catalogs/font-schemes/sylfaen.json +2 -1
  129. package/dist/spec/catalogs/font-schemes/tahoma.json +2 -1
  130. package/dist/spec/catalogs/font-schemes/tenorite.json +2 -1
  131. package/dist/spec/catalogs/font-schemes/times-new-roman.json +2 -1
  132. package/dist/spec/catalogs/font-schemes/traditional-arabic.json +2 -1
  133. package/dist/spec/catalogs/font-schemes/trebuchet-ms.json +2 -1
  134. package/dist/spec/catalogs/font-schemes/tunga.json +2 -1
  135. package/dist/spec/catalogs/font-schemes/verdana.json +2 -1
  136. package/dist/spec/catalogs/font-schemes/vrinda.json +2 -1
  137. package/dist/spec/catalogs/font-schemes/yu-gothic.json +2 -1
  138. package/dist/spec/catalogs/languages/index.json +2 -0
  139. package/dist/spec/catalogs/layouts/action-plan.json +35 -0
  140. package/dist/spec/catalogs/layouts/agenda.json +35 -0
  141. package/dist/spec/catalogs/layouts/appendix-index.json +38 -0
  142. package/dist/spec/catalogs/layouts/architecture-stack.json +35 -0
  143. package/dist/spec/catalogs/layouts/assumptions-dependencies.json +35 -0
  144. package/dist/spec/catalogs/layouts/before-after.json +41 -0
  145. package/dist/spec/catalogs/layouts/benchmark-target-table.json +35 -0
  146. package/dist/spec/catalogs/layouts/bullet-list.json +38 -0
  147. package/dist/spec/catalogs/layouts/business-model-canvas.json +35 -0
  148. package/dist/spec/catalogs/layouts/capability-map.json +35 -0
  149. package/dist/spec/catalogs/layouts/case-study.json +35 -0
  150. package/dist/spec/catalogs/layouts/chapter-recap.json +35 -0
  151. package/dist/spec/catalogs/layouts/circular-lifecycle.json +35 -0
  152. package/dist/spec/catalogs/layouts/comparison.json +41 -0
  153. package/dist/spec/catalogs/layouts/competitive-landscape.json +35 -0
  154. package/dist/spec/catalogs/layouts/customer-journey.json +35 -0
  155. package/dist/spec/catalogs/layouts/customer-logos.json +38 -0
  156. package/dist/spec/catalogs/layouts/dashboard.json +41 -0
  157. package/dist/spec/catalogs/layouts/data-visualization.json +45 -0
  158. package/dist/spec/catalogs/layouts/decision-tree.json +35 -0
  159. package/dist/spec/catalogs/layouts/detailed-data-table.json +41 -0
  160. package/dist/spec/catalogs/layouts/ecosystem-map.json +35 -0
  161. package/dist/spec/catalogs/layouts/executive-decision.json +38 -0
  162. package/dist/spec/catalogs/layouts/executive-summary.json +38 -0
  163. package/dist/spec/catalogs/layouts/faq.json +35 -0
  164. package/dist/spec/catalogs/layouts/feature-comparison-matrix.json +35 -0
  165. package/dist/spec/catalogs/layouts/forecast-scenario.json +45 -0
  166. package/dist/spec/catalogs/layouts/funnel-pyramid.json +38 -0
  167. package/dist/spec/catalogs/layouts/gantt-project-plan.json +38 -0
  168. package/dist/spec/catalogs/layouts/geographic-map.json +35 -0
  169. package/dist/spec/catalogs/layouts/heatmap-cohort.json +38 -0
  170. package/dist/spec/catalogs/layouts/hub-and-spoke.json +35 -0
  171. package/dist/spec/catalogs/layouts/icon-grid.json +35 -0
  172. package/dist/spec/catalogs/layouts/image-focus.json +35 -0
  173. package/dist/spec/catalogs/layouts/index.json +352 -0
  174. package/dist/spec/catalogs/layouts/key-takeaway.json +32 -0
  175. package/dist/spec/catalogs/layouts/kpi-scorecard.json +44 -0
  176. package/dist/spec/catalogs/layouts/logic-tree.json +35 -0
  177. package/dist/spec/catalogs/layouts/market-size.json +35 -0
  178. package/dist/spec/catalogs/layouts/matrix-quadrant.json +48 -0
  179. package/dist/spec/catalogs/layouts/network-dependency-map.json +35 -0
  180. package/dist/spec/catalogs/layouts/one-column-explainer.json +35 -0
  181. package/dist/spec/catalogs/layouts/org-chart.json +45 -0
  182. package/dist/spec/catalogs/layouts/persona-grid.json +35 -0
  183. package/dist/spec/catalogs/layouts/photo-grid.json +48 -0
  184. package/dist/spec/catalogs/layouts/pricing-table.json +35 -0
  185. package/dist/spec/catalogs/layouts/process-flow.json +35 -0
  186. package/dist/spec/catalogs/layouts/product-feature.json +35 -0
  187. package/dist/spec/catalogs/layouts/pros-cons.json +41 -0
  188. package/dist/spec/catalogs/layouts/qa-discussion.json +38 -0
  189. package/dist/spec/catalogs/layouts/quote-highlight.json +35 -0
  190. package/dist/spec/catalogs/layouts/raci-matrix.json +35 -0
  191. package/dist/spec/catalogs/layouts/risk-heatmap.json +35 -0
  192. package/dist/spec/catalogs/layouts/roadmap.json +35 -0
  193. package/dist/spec/catalogs/layouts/screenshot-walkthrough.json +35 -0
  194. package/dist/spec/catalogs/layouts/section-divider.json +35 -0
  195. package/dist/spec/catalogs/layouts/single-message-statement.json +32 -0
  196. package/dist/spec/catalogs/layouts/stats-metrics.json +45 -0
  197. package/dist/spec/catalogs/layouts/status-rag.json +35 -0
  198. package/dist/spec/catalogs/layouts/swimlane-process.json +35 -0
  199. package/dist/spec/catalogs/layouts/swot-analysis.json +48 -0
  200. package/dist/spec/catalogs/layouts/team-bio.json +35 -0
  201. package/dist/spec/catalogs/layouts/testimonial-grid.json +44 -0
  202. package/dist/spec/catalogs/layouts/thank-you-cta.json +35 -0
  203. package/dist/spec/catalogs/layouts/three-column.json +45 -0
  204. package/dist/spec/catalogs/layouts/timeline.json +38 -0
  205. package/dist/spec/catalogs/layouts/title-slide.json +35 -0
  206. package/dist/spec/catalogs/layouts/two-column.json +42 -0
  207. package/dist/spec/catalogs/layouts/venn-overlap.json +35 -0
  208. package/dist/spec/catalogs/layouts/waterfall-bridge.json +45 -0
  209. package/dist/spec/catalogs/layouts/wheel-radial.json +35 -0
  210. package/dist/spec/catalogs/manifest.json +111 -0
  211. package/dist/spec/catalogs/narratives/index.json +746 -144
  212. package/dist/spec/catalogs/purposes/index.json +2 -0
  213. package/dist/spec/catalogs/social-platforms/index.json +2 -1
  214. package/dist/spec/catalogs/themes/index.json +10 -8
  215. package/dist/spec/catalogs/tones/index.json +2 -0
  216. package/dist/spec/reference/font-policy.json +5 -5
  217. package/dist/spec/schemas/audience.schema.json +21 -0
  218. package/dist/spec/schemas/catalog-index.schema.json +40 -3
  219. package/dist/spec/schemas/catalog-manifest.schema.json +83 -0
  220. package/dist/spec/schemas/chart-type.schema.json +5 -0
  221. package/dist/spec/schemas/color-scheme.schema.json +21 -0
  222. package/dist/spec/schemas/font-scheme.schema.json +21 -0
  223. package/dist/spec/schemas/language.schema.json +21 -0
  224. package/dist/spec/schemas/layout.schema.json +21 -0
  225. package/dist/spec/schemas/narrative.schema.json +21 -0
  226. package/dist/spec/schemas/opf.schema.json +22 -18
  227. package/dist/spec/schemas/purpose.schema.json +21 -0
  228. package/dist/spec/schemas/social-platform.schema.json +26 -5
  229. package/dist/spec/schemas/theme.schema.json +21 -0
  230. package/dist/spec/schemas/tone.schema.json +21 -0
  231. package/dist/spec-files.d.ts +2 -2
  232. package/dist/spec-files.js +1 -1
  233. package/dist/types.d.ts +2 -2
  234. package/dist/validator.d.ts +2 -2
  235. package/dist/validator.js +4 -4
  236. package/package.json +1 -1
@@ -3,7 +3,7 @@ var presentation = {
3
3
  "$schema": "https://json-schema.org/draft/2020-12/schema",
4
4
  "$id": "https://openpresentation.org/schema/opf/v1",
5
5
  "title": "Presentation",
6
- "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, and content color fields (rich-text runs, styled table cells) accept hex values, color-scheme slot/role names, or 'var:<id>' references into the top-level variables map.",
6
+ "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>. The default catalog is published by pptx.gallery: the index at https://www.pptx.gallery/<kind>/index.json (also GET https://www.pptx.gallery/<kind> with Accept: application/json) and each record at https://www.pptx.gallery/<kind>/<id>.json. Engines resolve it from the pinned snapshot bundled in @openpresentation/opf (spec/catalogs, pinned by spec/catalogs/manifest.json) and never fetch it at run time; fetching a document's catalogs.<kind>.source is an explicit opt-in by the caller. 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, and content color fields (rich-text runs, styled table cells) accept hex values, color-scheme slot/role names, or 'var:<id>' references into the top-level variables map.",
7
7
  "type": "object",
8
8
  "required": [
9
9
  "slides"
@@ -847,7 +847,7 @@ Deck-level concerns that aren't part of the storyline (audience, tone, takeaway,
847
847
  },
848
848
  "logo": {
849
849
  "$ref": "#/$defs/Asset",
850
- "description": "Source for the organization's logo image. Accepts an HTTPS URL, data URI, relative path (resolved against the OPF file location), local path, or 'asset:<id>' reference. Common formats are SVG (preferred for vector logos), PNG (with transparency), or JPG. The primary organization's logo is used by default for cover-slide and footer branding; design.logo overrides the source.",
850
+ "description": "Source for the organization's logo image. Accepts an HTTPS URL, data URI, relative path (resolved against the OPF file location), local path, or 'asset:<id>' reference. Common formats are SVG (preferred for vector logos), PNG (with transparency), or JPG. The primary organization's logo (role 'primary', else the first organization) is the fallback source wherever the deck logo is drawn: a slide's design.logo, then design.logo, then this value. It is therefore drawn on cover and section slides and by header/footer zones with logo: true, exactly as design.logo would be (see design.logo and docs/design-resolution.md).",
851
851
  "examples": [
852
852
  "https://cdn.acme.com/logo.svg",
853
853
  "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9V3iWggAAAAASUVORK5CYII=",
@@ -947,7 +947,7 @@ Deck-level concerns that aren't part of the storyline (audience, tone, takeaway,
947
947
  },
948
948
  "photo": {
949
949
  "$ref": "#/$defs/Asset",
950
- "description": "Source for the speaker's headshot image. Accepts an HTTPS URL, data URI, relative path (resolved against the OPF file location), local path, or 'asset:<id>' reference. Common formats are JPG or PNG; SVG is not appropriate for photographic content. Used on cover and bio slides.",
950
+ "description": "Source for the speaker's headshot image. Accepts an HTTPS URL, data URI, relative path (resolved against the OPF file location), local path, or 'asset:<id>' reference. Common formats are JPG or PNG; SVG is not appropriate for photographic content. Authoring metadata for hosts and layouts (cover and bio slides built by a host): the reference renderer and exporter do not draw it, because no slide field or layout slot places a speaker; it round-trips through PPTX provenance.",
951
951
  "examples": [
952
952
  "https://cdn.acme.com/headshots/alice.jpg",
953
953
  "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAABAAEDASIAAhEBAxEB/8QAFQABAQAAAAAAAAAAAAAAAAAAAAr/xAAUEAEAAAAAAAAAAAAAAAAAAAAA/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/EABQRAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhEDEQA/AJ//2Q==",
@@ -996,7 +996,7 @@ Deck-level concerns that aren't part of the storyline (audience, tone, takeaway,
996
996
  },
997
997
  "Socials": {
998
998
  "type": "object",
999
- "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.",
999
+ "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 and handle prefix that engines use to render and link the profile URL, plus brand color and themed icons as catalog metadata for authoring UIs (engines render the profile URL, not icons or brand colors).\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.",
1000
1000
  "additionalProperties": {
1001
1001
  "type": "string",
1002
1002
  "description": "Handle or URL for the platform identified by the property key."
@@ -1355,7 +1355,7 @@ Resolution order: inline catalogs.fontSchemes.records[] -> catalogs.fontSchemes.
1355
1355
  "$ref": "#/$defs/LogoSet"
1356
1356
  }
1357
1357
  ],
1358
- "description": "Deck logo assets used by layouts, covers, section dividers, headers, and footers. A string is the default logo source; object form provides light/dark, stacked, icon, and wordmark variants. When omitted, the renderer falls back to the primary organization logo.",
1358
+ "description": "Deck logo assets used by covers, section dividers, headers, footers and picture bullets. A string or Asset object is the default logo source; the LogoSet object form provides light/dark, stacked, icon, and wordmark variants (see LogoSet for the selection order). Source precedence: a slide's design.logo, then this value, then the primary organization's logo; absence inherits. Placement (reference engines, vetoable): on a cover or section slide (no body payload on a heading-only layout such as title, title-subtitle or section-divider, or no layout) the lockup variant is drawn at the top-left of the free area, inside the slide padding and below any header furniture, in a box 56 reference pixels tall and at most four times as wide; the tag/title/subtitle group then centers in the remaining span. Content slides never get an automatic logo. Header and footer zones draw the icon variant when they set logo: true, and design.listBullet 'image' draws it as the picture bullet. composeSlide returns the cover box as geometry.logo.",
1359
1359
  "examples": [
1360
1360
  "asset:acme-logo",
1361
1361
  {
@@ -1634,7 +1634,7 @@ Resolution order: inline catalogs.fontSchemes.records[] -> catalogs.fontSchemes.
1634
1634
  "horizontal",
1635
1635
  "vertical"
1636
1636
  ],
1637
- "description": "Axis along which parallel body/content regions are arranged."
1637
+ "description": "Axis along which parallel body content is arranged. Sets the root arrangement mode of blocks and root payloads when no composition.mode is set on the slide or on its layout record: 'vertical' is column, 'horizontal' is row. Precedence: composition.mode (the slide's own, else the layout record's geometry contract), then this value (slide design, then deck design), then the layout record's slideLayoutDirection, then automatic selection. A layout that carries a composition.mode keeps its grid or direction whatever this value says. Promoted regions (left, top:left, ...) keep their explicit geometry and nested groups keep their own composition."
1638
1638
  },
1639
1639
  "chartPrimary": {
1640
1640
  "type": "string",
@@ -1645,7 +1645,7 @@ Resolution order: inline catalogs.fontSchemes.records[] -> catalogs.fontSchemes.
1645
1645
  "left",
1646
1646
  "right"
1647
1647
  ],
1648
- "description": "For chart layouts, where the primary chart sits relative to supporting content. 'none' means chart regions have equal weight."
1648
+ "description": "Where the primary chart sits relative to supporting content. Effective value: slide design, then deck design, then the layout record's contentTypeChartPrimary. When the slide has no promoted regions and no composition.mode of its own, and its root nodes mix at least one chart with other content, the first chart becomes a primary track and the other nodes form one synthetic sub-grid: 'left'/'right' is a two-track row and 'top'/'bottom' a two-track column, weighted 3:2 in favor of the chart; explicit root columns and weights are ignored while it applies. 'none' (the default) keeps the ordinary automatic grid with equal weight."
1649
1649
  },
1650
1650
  "imageFill": {
1651
1651
  "type": "string",
@@ -1661,7 +1661,7 @@ Resolution order: inline catalogs.fontSchemes.records[] -> catalogs.fontSchemes.
1661
1661
  "character",
1662
1662
  "image"
1663
1663
  ],
1664
- "description": "Default bullet rendering style for list layouts."
1664
+ "description": "Marker style for items and bullets lists. 'character' (the default) draws the glyph marker. 'image' draws the deck's icon logo (a slide's design.logo, then design.logo, then the primary organization's logo; light variants on dark backgrounds) as a picture bullet: a square of the marker's font size whose bottom sits on the marker baseline, so list geometry does not change. Without a logo the glyph is drawn and the engine reports unresolved-content at this field."
1665
1665
  }
1666
1666
  }
1667
1667
  },
@@ -2098,7 +2098,7 @@ Resolution order: inline catalogs.fontSchemes.records[] -> catalogs.fontSchemes.
2098
2098
  },
2099
2099
  "accent": {
2100
2100
  "$ref": "#/$defs/Font",
2101
- "description": "Abstract role: font used for accent text such as quotes or callouts. No direct OOXML slot."
2101
+ "description": "Abstract role: font used for accent text. When set, the slide tag (eyebrow) and the quote body use this family instead of the body and heading families; nothing else changes. resolveFontFamilies() returns it as accent only when the scheme defines it. No direct OOXML slot: PPTX export writes it on those runs, and the theme fonts stay major/minor."
2102
2102
  },
2103
2103
  "code": {
2104
2104
  "$ref": "#/$defs/Font",
@@ -2365,7 +2365,7 @@ Resolution order: inline catalogs.fontSchemes.records[] -> catalogs.fontSchemes.
2365
2365
  },
2366
2366
  "color": {
2367
2367
  "type": "string",
2368
- "description": "Fixed solid fill color, usually a hex string. Use { type: 'theme', slot: ... } for PowerPoint's four theme-controlled background choices.",
2368
+ "description": "Fixed solid fill color: a hex string, a color-scheme slot or role name, or a var:<id> variable reference (a ColorRef, resolved against the effective color scheme and the deck variables). Use { type: 'theme', slot: ... } for PowerPoint's four theme-controlled background choices.",
2369
2369
  "examples": [
2370
2370
  "#FFFFFF",
2371
2371
  "#0F172A",
@@ -2414,7 +2414,7 @@ Resolution order: inline catalogs.fontSchemes.records[] -> catalogs.fontSchemes.
2414
2414
  "properties": {
2415
2415
  "color": {
2416
2416
  "type": "string",
2417
- "description": "Stop color as a hex string.",
2417
+ "description": "Stop color: a hex string, a color-scheme slot or role name, or a var:<id> variable reference (a ColorRef).",
2418
2418
  "examples": [
2419
2419
  "#1E40AF",
2420
2420
  "#22D3EE"
@@ -2519,14 +2519,14 @@ Resolution order: inline catalogs.fontSchemes.records[] -> catalogs.fontSchemes.
2519
2519
  },
2520
2520
  "foregroundColor": {
2521
2521
  "type": "string",
2522
- "description": "Foreground color for the pattern, usually a hex string.",
2522
+ "description": "Foreground color for the pattern: a hex string, a color-scheme slot or role name, or a var:<id> variable reference (a ColorRef).",
2523
2523
  "examples": [
2524
2524
  "#0F172A"
2525
2525
  ]
2526
2526
  },
2527
2527
  "backgroundColor": {
2528
2528
  "type": "string",
2529
- "description": "Background color behind the pattern, usually a hex string.",
2529
+ "description": "Background color behind the pattern: a hex string, a color-scheme slot or role name, or a var:<id> variable reference (a ColorRef).",
2530
2530
  "examples": [
2531
2531
  "#FFFFFF"
2532
2532
  ]
@@ -2543,7 +2543,7 @@ Resolution order: inline catalogs.fontSchemes.records[] -> catalogs.fontSchemes.
2543
2543
  },
2544
2544
  "LogoSet": {
2545
2545
  "type": "object",
2546
- "description": "Deck logo variants surfaced by layouts, covers, section dividers, headers, and footers. Organization identity lives in organization; this object only controls visual rendering assets. Renderer convention: on dark backgrounds prefer the 'light' variant, on light backgrounds prefer the 'dark' variant, and in square/vertical slots prefer the stacked family when present.",
2546
+ "description": "Deck logo variants surfaced by covers, section dividers, headers, footers and picture bullets. Organization identity lives in organization; this object only controls visual rendering assets. Engines select one variant per slot and background tone (resolveLogo in @openpresentation/opf): same-tone variants first, neutral ones next, the opposite tone last. Lockup on a dark background: light, default, stackedLight, stacked, wordmarkLight, wordmark, iconLight, icon, then dark, stackedDark, wordmarkDark, iconDark; on a light background: dark, default, stackedDark, stacked, wordmarkDark, wordmark, iconDark, icon, then light, stackedLight, wordmarkLight, iconLight. The icon slot (headers, footers, picture bullets) tries iconLight or iconDark for the tone, then icon, then the lockup chain; the stacked slot tries stackedLight or stackedDark, then stacked, then the lockup chain.",
2547
2547
  "additionalProperties": false,
2548
2548
  "properties": {
2549
2549
  "default": {
@@ -2636,8 +2636,12 @@ Resolution order: inline catalogs.fontSchemes.records[] -> catalogs.fontSchemes.
2636
2636
  },
2637
2637
  "HeaderFooterItem": {
2638
2638
  "type": "object",
2639
- "description": "One header/footer zone. Every configured field renders; fields in one zone stack top to bottom in the order image, text, organization, section, slide number, date. Put a date and a slide number in different zones to keep each on the zone's single line.",
2639
+ "description": "One header/footer zone. Every configured field renders; fields in one zone stack top to bottom in the order logo, image, text, organization, socials, section, slide number, date. Put a date and a slide number in different zones to keep each on the zone's single line.",
2640
2640
  "properties": {
2641
+ "logo": {
2642
+ "type": "boolean",
2643
+ "description": "Whether to render the deck's icon logo in this zone: a slide's design.logo, then design.logo, then the primary organization's logo (LogoSet icon variants first, light ones on dark backgrounds). It is a generated image part in the same box as image; without a logo the engine reports unresolved-content at this field. Use image for a literal picture that is not the deck logo."
2644
+ },
2641
2645
  "text": {
2642
2646
  "type": "string",
2643
2647
  "description": "Literal text rendered in this zone.",
@@ -4403,7 +4407,7 @@ Resolution order: inline catalogs.fontSchemes.records[] -> catalogs.fontSchemes.
4403
4407
  },
4404
4408
  "Catalogs": {
4405
4409
  "type": "object",
4406
- "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.",
4410
+ "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). pptx.gallery is its canonical publisher: GET https://www.pptx.gallery/<kind>/index.json (or https://www.pptx.gallery/<kind> with Accept: application/json) returns a catalog index (https://openpresentation.org/schema/opf-catalog-index/v1) and https://www.pptx.gallery/<kind>/<id>.json returns one record that validates against the kind's companion schema; publisher metadata sits in top-level 'x-*' members that consumers ignore. Engines resolve the default catalog from the pinned snapshot bundled in @openpresentation/opf (spec/catalogs, pinned to a publisher commit and content hash by spec/catalogs/manifest.json), so resolution is deterministic offline and in the cloud; they do not fetch pptx.gallery at run time. 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.",
4407
4411
  "properties": {
4408
4412
  "narratives": {
4409
4413
  "$ref": "#/$defs/CatalogEntry",
@@ -4469,7 +4473,7 @@ Resolution order: inline catalogs.fontSchemes.records[] -> catalogs.fontSchemes.
4469
4473
  "description": "Ordered search path of sources. The engine tries each in order; first match wins. The default catalog for the kind is appended implicitly at the end."
4470
4474
  }
4471
4475
  ],
4472
- "description": "Single source or an ordered search path of sources. When omitted, the engine falls back to https://www.pptx.gallery/<kind>."
4476
+ "description": "Single source or an ordered search path of sources. When omitted, the engine falls back to the default catalog at https://www.pptx.gallery/<kind>, resolved from its bundled snapshot. Fetching a declared source is an explicit opt-in: the engine or its caller performs that fetch."
4473
4477
  },
4474
4478
  "records": {
4475
4479
  "type": "array",
@@ -4482,7 +4486,7 @@ Resolution order: inline catalogs.fontSchemes.records[] -> catalogs.fontSchemes.
4482
4486
  },
4483
4487
  "CatalogSource": {
4484
4488
  "type": "string",
4485
- "description": "Catalog source location. Accepts:\n- A bare URL pointing at a catalog directory (e.g. 'https://acme.com/decks/narratives'); record ids resolve to '<base>/<id>.json'.\n- A URL pointing at an index file (e.g. 'https://acme.com/decks/narratives/index.json'); records are resolved relative to the index file's directory and the index entries describe what's available.\n- A package reference of the form 'pkg:<package>[/<subpath>]'; resolved through a locally-installed package on the engine's package path.",
4489
+ "description": "Catalog source location. Accepts:\n- A bare URL pointing at a catalog directory (e.g. 'https://acme.com/decks/narratives'); record ids resolve to '<base>/<id>.json'.\n- A URL pointing at an index file (e.g. 'https://acme.com/decks/narratives/index.json'); records are resolved relative to the index file's directory and the index entries describe what's available. Index files follow https://openpresentation.org/schema/opf-catalog-index/v1; the default catalog's index is https://www.pptx.gallery/<kind>/index.json.\n- A package reference of the form 'pkg:<package>[/<subpath>]'; resolved through a locally-installed package on the engine's package path.",
4486
4490
  "examples": [
4487
4491
  "https://www.pptx.gallery/narratives",
4488
4492
  "https://acme.com/decks/narratives/index.json",
@@ -4602,6 +4606,29 @@ var audience = {
4602
4606
  "Regulators"
4603
4607
  ]
4604
4608
  },
4609
+ "deprecation": {
4610
+ "type": "object",
4611
+ "additionalProperties": false,
4612
+ "required": [
4613
+ "replacedBy"
4614
+ ],
4615
+ "description": "Present when this audience is deprecated, for example an alias kept for backward compatibility. Deprecated records stay resolvable so existing documents keep validating and rendering unchanged, but pickers and default listings exclude them and validators warn when a document references them. Same shape as the chart-type deprecation.",
4616
+ "properties": {
4617
+ "replacedBy": {
4618
+ "type": "string",
4619
+ "pattern": "^[a-z][a-z0-9-]*$",
4620
+ "description": "Id of the non-deprecated audience record that documents should reference instead."
4621
+ },
4622
+ "reason": {
4623
+ "type": "string",
4624
+ "description": "Why the record is deprecated."
4625
+ },
4626
+ "removal": {
4627
+ "type": "string",
4628
+ "description": "Package version in which the record is scheduled for removal from the bundled catalog, if any."
4629
+ }
4630
+ }
4631
+ },
4605
4632
  "summary": {
4606
4633
  "type": "string",
4607
4634
  "description": "One-sentence positioning of the audience \u2014 who they are and what they care about.",
@@ -4767,6 +4794,29 @@ var purpose = {
4767
4794
  "Persuade"
4768
4795
  ]
4769
4796
  },
4797
+ "deprecation": {
4798
+ "type": "object",
4799
+ "additionalProperties": false,
4800
+ "required": [
4801
+ "replacedBy"
4802
+ ],
4803
+ "description": "Present when this purpose is deprecated, for example an alias kept for backward compatibility. Deprecated records stay resolvable so existing documents keep validating and rendering unchanged, but pickers and default listings exclude them and validators warn when a document references them. Same shape as the chart-type deprecation.",
4804
+ "properties": {
4805
+ "replacedBy": {
4806
+ "type": "string",
4807
+ "pattern": "^[a-z][a-z0-9-]*$",
4808
+ "description": "Id of the non-deprecated purpose record that documents should reference instead."
4809
+ },
4810
+ "reason": {
4811
+ "type": "string",
4812
+ "description": "Why the record is deprecated."
4813
+ },
4814
+ "removal": {
4815
+ "type": "string",
4816
+ "description": "Package version in which the record is scheduled for removal from the bundled catalog, if any."
4817
+ }
4818
+ }
4819
+ },
4770
4820
  "summary": {
4771
4821
  "type": "string",
4772
4822
  "description": "One-sentence positioning of the purpose \u2014 what this deck is trying to accomplish."
@@ -4879,6 +4929,29 @@ var tone = {
4879
4929
  "Conversational"
4880
4930
  ]
4881
4931
  },
4932
+ "deprecation": {
4933
+ "type": "object",
4934
+ "additionalProperties": false,
4935
+ "required": [
4936
+ "replacedBy"
4937
+ ],
4938
+ "description": "Present when this tone is deprecated, for example an alias kept for backward compatibility. Deprecated records stay resolvable so existing documents keep validating and rendering unchanged, but pickers and default listings exclude them and validators warn when a document references them. Same shape as the chart-type deprecation.",
4939
+ "properties": {
4940
+ "replacedBy": {
4941
+ "type": "string",
4942
+ "pattern": "^[a-z][a-z0-9-]*$",
4943
+ "description": "Id of the non-deprecated tone record that documents should reference instead."
4944
+ },
4945
+ "reason": {
4946
+ "type": "string",
4947
+ "description": "Why the record is deprecated."
4948
+ },
4949
+ "removal": {
4950
+ "type": "string",
4951
+ "description": "Package version in which the record is scheduled for removal from the bundled catalog, if any."
4952
+ }
4953
+ }
4954
+ },
4882
4955
  "summary": {
4883
4956
  "type": "string",
4884
4957
  "description": "One-sentence positioning of the tone \u2014 when to reach for it.",
@@ -5032,6 +5105,29 @@ var theme = {
5032
5105
  "Bold"
5033
5106
  ]
5034
5107
  },
5108
+ "deprecation": {
5109
+ "type": "object",
5110
+ "additionalProperties": false,
5111
+ "required": [
5112
+ "replacedBy"
5113
+ ],
5114
+ "description": "Present when this theme is deprecated, for example an alias kept for backward compatibility. Deprecated records stay resolvable so existing documents keep validating and rendering unchanged, but pickers and default listings exclude them and validators warn when a document references them. Same shape as the chart-type deprecation.",
5115
+ "properties": {
5116
+ "replacedBy": {
5117
+ "type": "string",
5118
+ "pattern": "^[a-z][a-z0-9-]*$",
5119
+ "description": "Id of the non-deprecated theme record that documents should reference instead."
5120
+ },
5121
+ "reason": {
5122
+ "type": "string",
5123
+ "description": "Why the record is deprecated."
5124
+ },
5125
+ "removal": {
5126
+ "type": "string",
5127
+ "description": "Package version in which the record is scheduled for removal from the bundled catalog, if any."
5128
+ }
5129
+ }
5130
+ },
5035
5131
  "summary": {
5036
5132
  "type": "string",
5037
5133
  "description": "One-sentence positioning of the theme \u2014 when to reach for it.",
@@ -5208,6 +5304,29 @@ var layout = {
5208
5304
  "Image Bleed"
5209
5305
  ]
5210
5306
  },
5307
+ "deprecation": {
5308
+ "type": "object",
5309
+ "additionalProperties": false,
5310
+ "required": [
5311
+ "replacedBy"
5312
+ ],
5313
+ "description": "Present when this layout is deprecated, for example an alias kept for backward compatibility. Deprecated records stay resolvable so existing documents keep validating and rendering unchanged, but pickers and default listings exclude them and validators warn when a document references them. Same shape as the chart-type deprecation.",
5314
+ "properties": {
5315
+ "replacedBy": {
5316
+ "type": "string",
5317
+ "pattern": "^[a-z][a-z0-9-]*$",
5318
+ "description": "Id of the non-deprecated layout record that documents should reference instead."
5319
+ },
5320
+ "reason": {
5321
+ "type": "string",
5322
+ "description": "Why the record is deprecated."
5323
+ },
5324
+ "removal": {
5325
+ "type": "string",
5326
+ "description": "Package version in which the record is scheduled for removal from the bundled catalog, if any."
5327
+ }
5328
+ }
5329
+ },
5211
5330
  "summary": {
5212
5331
  "type": "string",
5213
5332
  "description": "One-sentence positioning of the layout \u2014 when to reach for it.",
@@ -5531,6 +5650,11 @@ var chartType = {
5531
5650
  "description": 'Schema for chart-type records in the pptx.gallery catalog. The bundled catalog holds one record per chart type that Aspose.Slides officially supports (see mappings.renderers["aspose-slides"].chartType). 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.',
5532
5651
  "type": "object",
5533
5652
  "additionalProperties": false,
5653
+ "patternProperties": {
5654
+ "^x-": {
5655
+ "description": "Publisher extension member, such as the `x-gallery` presentation metadata that pptx.gallery adds to the records it publishes. Engines and validators ignore top-level `x-*` members, and the pinned snapshot in spec/catalogs never carries them."
5656
+ }
5657
+ },
5534
5658
  "required": [
5535
5659
  "$schema",
5536
5660
  "id",
@@ -6127,6 +6251,29 @@ var narrative = {
6127
6251
  "type": "string",
6128
6252
  "description": "Human-readable template name, e.g. 'Problem \u2192 Solution'."
6129
6253
  },
6254
+ "deprecation": {
6255
+ "type": "object",
6256
+ "additionalProperties": false,
6257
+ "required": [
6258
+ "replacedBy"
6259
+ ],
6260
+ "description": "Present when this narrative is deprecated, for example an alias kept for backward compatibility. Deprecated records stay resolvable so existing documents keep validating and rendering unchanged, but pickers and default listings exclude them and validators warn when a document references them. Same shape as the chart-type deprecation.",
6261
+ "properties": {
6262
+ "replacedBy": {
6263
+ "type": "string",
6264
+ "pattern": "^[a-z][a-z0-9-]*$",
6265
+ "description": "Id of the non-deprecated narrative record that documents should reference instead."
6266
+ },
6267
+ "reason": {
6268
+ "type": "string",
6269
+ "description": "Why the record is deprecated."
6270
+ },
6271
+ "removal": {
6272
+ "type": "string",
6273
+ "description": "Package version in which the record is scheduled for removal from the bundled catalog, if any."
6274
+ }
6275
+ }
6276
+ },
6130
6277
  "summary": {
6131
6278
  "type": "string",
6132
6279
  "description": "One-sentence description of when and why to use this narrative."
@@ -6312,7 +6459,7 @@ var socialPlatform = {
6312
6459
  "$schema": "https://json-schema.org/draft/2020-12/schema",
6313
6460
  "$id": "https://openpresentation.org/schema/opf-social-platform/v1",
6314
6461
  "title": "Social Platform",
6315
- "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.",
6462
+ "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 engines use the catalog record's URL patterns and handle prefix to format and link the profile URL. The brand color and the themed icons are catalog metadata for authoring UIs: engines (opf-render, opf-pptx) render the profile URL, not icons or brand colors. The engine resolves references against catalogs.socialPlatforms (inline) \u2192 catalogs.socialPlatforms.source \u2192 the default catalog at https://www.pptx.gallery/social-platforms.",
6316
6463
  "type": "object",
6317
6464
  "required": [
6318
6465
  "$schema",
@@ -6358,6 +6505,29 @@ var socialPlatform = {
6358
6505
  "Bluesky"
6359
6506
  ]
6360
6507
  },
6508
+ "deprecation": {
6509
+ "type": "object",
6510
+ "additionalProperties": false,
6511
+ "required": [
6512
+ "replacedBy"
6513
+ ],
6514
+ "description": "Present when this social platform is deprecated, for example an alias kept for backward compatibility. Deprecated records stay resolvable so existing documents keep validating and rendering unchanged, but pickers and default listings exclude them and validators warn when a document references them. Same shape as the chart-type deprecation.",
6515
+ "properties": {
6516
+ "replacedBy": {
6517
+ "type": "string",
6518
+ "pattern": "^[a-z][a-z0-9-]*$",
6519
+ "description": "Id of the non-deprecated social platform record that documents should reference instead."
6520
+ },
6521
+ "reason": {
6522
+ "type": "string",
6523
+ "description": "Why the record is deprecated."
6524
+ },
6525
+ "removal": {
6526
+ "type": "string",
6527
+ "description": "Package version in which the record is scheduled for removal from the bundled catalog, if any."
6528
+ }
6529
+ }
6530
+ },
6361
6531
  "summary": {
6362
6532
  "type": "string",
6363
6533
  "description": "One-sentence positioning of the platform \u2014 what it's used for and who's on it.",
@@ -6424,7 +6594,7 @@ var socialPlatform = {
6424
6594
  },
6425
6595
  "brandColor": {
6426
6596
  "type": "string",
6427
- "description": "Brand color (hex) used for branded icon chips, link styling, or section accents.",
6597
+ "description": "Brand color (hex) for branded icon chips, link styling, or section accents in authoring UIs. Catalog metadata: engines do not draw it.",
6428
6598
  "examples": [
6429
6599
  "#0A66C2",
6430
6600
  "#000000",
@@ -6434,7 +6604,7 @@ var socialPlatform = {
6434
6604
  },
6435
6605
  "icon": {
6436
6606
  "type": "string",
6437
- "description": "Default icon source. Accepts an HTTPS URL, data URI, relative path, or asset reference. Used as the fallback when a themed (Light/Dark) variant isn't set.",
6607
+ "description": "Default icon source. Accepts an HTTPS URL, data URI, relative path, or asset reference. Used as the fallback when a themed (Light/Dark) variant isn't set. Catalog metadata for authoring UIs: engines do not draw icons.",
6438
6608
  "examples": [
6439
6609
  "https://www.pptx.gallery/social-platforms/linkedin.svg",
6440
6610
  "./assets/social-platforms/linkedin.svg",
@@ -6443,7 +6613,7 @@ var socialPlatform = {
6443
6613
  },
6444
6614
  "iconLight": {
6445
6615
  "type": "string",
6446
- "description": "Light-colored icon variant intended for rendering on dark backgrounds.",
6616
+ "description": "Light-colored icon variant intended for authoring UIs that draw the icon on dark backgrounds (engines do not draw icons).",
6447
6617
  "examples": [
6448
6618
  "https://www.pptx.gallery/social-platforms/linkedin-light.svg",
6449
6619
  "./assets/social-platforms/linkedin-light.svg"
@@ -6451,7 +6621,7 @@ var socialPlatform = {
6451
6621
  },
6452
6622
  "iconDark": {
6453
6623
  "type": "string",
6454
- "description": "Dark-colored icon variant intended for rendering on light backgrounds.",
6624
+ "description": "Dark-colored icon variant intended for authoring UIs that draw the icon on light backgrounds (engines do not draw icons).",
6455
6625
  "examples": [
6456
6626
  "https://www.pptx.gallery/social-platforms/linkedin-dark.svg",
6457
6627
  "./assets/social-platforms/linkedin-dark.svg"
@@ -6546,6 +6716,29 @@ var language = {
6546
6716
  "Chinese (simplified)"
6547
6717
  ]
6548
6718
  },
6719
+ "deprecation": {
6720
+ "type": "object",
6721
+ "additionalProperties": false,
6722
+ "required": [
6723
+ "replacedBy"
6724
+ ],
6725
+ "description": "Present when this language is deprecated, for example an alias kept for backward compatibility. Deprecated records stay resolvable so existing documents keep validating and rendering unchanged, but pickers and default listings exclude them and validators warn when a document references them. Same shape as the chart-type deprecation.",
6726
+ "properties": {
6727
+ "replacedBy": {
6728
+ "type": "string",
6729
+ "pattern": "^[a-z][a-z0-9-]*$",
6730
+ "description": "Id of the non-deprecated language record that documents should reference instead."
6731
+ },
6732
+ "reason": {
6733
+ "type": "string",
6734
+ "description": "Why the record is deprecated."
6735
+ },
6736
+ "removal": {
6737
+ "type": "string",
6738
+ "description": "Package version in which the record is scheduled for removal from the bundled catalog, if any."
6739
+ }
6740
+ }
6741
+ },
6549
6742
  "code": {
6550
6743
  "type": "string",
6551
6744
  "description": "ISO 639-3 (or 639-2) three-letter language code. Carried for engines that prefer ISO codes.",
@@ -6733,6 +6926,29 @@ var colorScheme = {
6733
6926
  "Forest Green"
6734
6927
  ]
6735
6928
  },
6929
+ "deprecation": {
6930
+ "type": "object",
6931
+ "additionalProperties": false,
6932
+ "required": [
6933
+ "replacedBy"
6934
+ ],
6935
+ "description": "Present when this color scheme is deprecated, for example an alias kept for backward compatibility. Deprecated records stay resolvable so existing documents keep validating and rendering unchanged, but pickers and default listings exclude them and validators warn when a document references them. Same shape as the chart-type deprecation.",
6936
+ "properties": {
6937
+ "replacedBy": {
6938
+ "type": "string",
6939
+ "pattern": "^[a-z][a-z0-9-]*$",
6940
+ "description": "Id of the non-deprecated color scheme record that documents should reference instead."
6941
+ },
6942
+ "reason": {
6943
+ "type": "string",
6944
+ "description": "Why the record is deprecated."
6945
+ },
6946
+ "removal": {
6947
+ "type": "string",
6948
+ "description": "Package version in which the record is scheduled for removal from the bundled catalog, if any."
6949
+ }
6950
+ }
6951
+ },
6736
6952
  "summary": {
6737
6953
  "type": "string",
6738
6954
  "description": "One-sentence positioning of the palette \u2014 what mood it evokes and where to use it.",
@@ -6937,6 +7153,29 @@ var fontScheme = {
6937
7153
  "Microsoft Yahei"
6938
7154
  ]
6939
7155
  },
7156
+ "deprecation": {
7157
+ "type": "object",
7158
+ "additionalProperties": false,
7159
+ "required": [
7160
+ "replacedBy"
7161
+ ],
7162
+ "description": "Present when this font scheme is deprecated, for example an alias kept for backward compatibility. Deprecated records stay resolvable so existing documents keep validating and rendering unchanged, but pickers and default listings exclude them and validators warn when a document references them. Same shape as the chart-type deprecation.",
7163
+ "properties": {
7164
+ "replacedBy": {
7165
+ "type": "string",
7166
+ "pattern": "^[a-z][a-z0-9-]*$",
7167
+ "description": "Id of the non-deprecated font scheme record that documents should reference instead."
7168
+ },
7169
+ "reason": {
7170
+ "type": "string",
7171
+ "description": "Why the record is deprecated."
7172
+ },
7173
+ "removal": {
7174
+ "type": "string",
7175
+ "description": "Package version in which the record is scheduled for removal from the bundled catalog, if any."
7176
+ }
7177
+ }
7178
+ },
6940
7179
  "major": {
6941
7180
  "type": "string",
6942
7181
  "description": "Heading (major) font family \u2014 mirrors the OOXML majorFont entry.",
@@ -1,6 +1,6 @@
1
- import { assertValidPresentation, visitContentPayloads } from './chunk-DJRZMGKY.js';
2
- import { DEFAULT_FONT_SCHEME, resolveFontSchemeReference, resolveFontFamilies, resolveCanvasDimensions, composeSlide, tableRowBoundaries } from './chunk-BVLWFMDX.js';
3
- import { catalogs } from './chunk-7LF37SG3.js';
1
+ import { assertValidPresentation, visitContentPayloads } from './chunk-FDCWQHWO.js';
2
+ import { DEFAULT_FONT_SCHEME, resolveFontSchemeReference, resolveFontFamilies, resolveCanvasDimensions, composeSlide, tableRowBoundaries } from './chunk-3H2U7FDR.js';
3
+ import { catalogs } from './chunk-AEUSVEUY.js';
4
4
 
5
5
  // src/pagination.ts
6
6
  var OPFPaginationError = class extends Error {
@@ -95,6 +95,7 @@ function paginateSlide(input, options = {}) {
95
95
  return composeSlide(withReadability(slide, true), { ...options, slideNumber: (options.slideNumber ?? sourceIndex + 1) + pageIndex });
96
96
  };
97
97
  const initial = geometry(source);
98
+ const fit = (diagnostics) => diagnostics.filter((issue) => issue.code === "text-overflow" || issue.code === "small-cell" || !!initial.furniture?.diagnostics.includes(issue));
98
99
  const repeatedMappings = (pageIndex) => {
99
100
  if (!initial.furniture) return [];
100
101
  const paths = new Set(initial.items.filter((item) => headingFields.has(item.field)).map((item) => item.path));
@@ -104,7 +105,7 @@ function paginateSlide(input, options = {}) {
104
105
  }
105
106
  return [...paths].map((sourcePath) => ({ sourcePath, outputPath: sourcePath.startsWith(`${sourceBase}.`) ? `slides.${sourceIndex + pageIndex}${sourcePath.slice(sourceBase.length)}` : sourcePath }));
106
107
  };
107
- if (!initial.diagnostics.length) return { slides: [source], pages: [{ slideIndex: sourceIndex, mappings: initial.items.map((item) => ({ sourcePath: item.path, outputPath: item.path })), ...initial.furniture ? { repeatedMappings: repeatedMappings(0) } : {} }] };
108
+ if (!fit(initial.diagnostics).length) return { slides: [source], pages: [{ slideIndex: sourceIndex, mappings: initial.items.map((item) => ({ sourcePath: item.path, outputPath: item.path })), ...initial.furniture ? { repeatedMappings: repeatedMappings(0) } : {} }] };
108
109
  const headerIssues = initial.diagnostics.filter((issue) => headingFields.has(issue.path.slice(sourceBase.length + 1)) || initial.furniture?.diagnostics.includes(issue));
109
110
  if (headerIssues.length) throw new OPFPaginationError("Repeated headings or header/footer content cannot fit or resolve. Change the repeated content or slide design before pagination.", headerIssues);
110
111
  const leaves = initial.items.filter((item) => !headingFields.has(item.field)).map((item) => leafFor(item.path, item.field, item.value));
@@ -170,12 +171,12 @@ function paginateSlide(input, options = {}) {
170
171
  if (pageIndex > 0) delete slide.notes;
171
172
  return { slide, mappings };
172
173
  };
173
- const diagnosticsFor = (portions) => geometry(project(portions, slides.length).slide, slides.length).diagnostics;
174
+ const diagnosticsFor = (portions) => fit(geometry(project(portions, slides.length).slide, slides.length).diagnostics);
174
175
  const finish = () => {
175
176
  if (!selected.size) return;
176
177
  if (slides.length >= maxSlides) throw new OPFPaginationError(`Pagination needs more than ${maxSlides} slides. No partial result was returned.`);
177
178
  const { slide, mappings } = project(selected, slides.length);
178
- const issues = geometry(slide, slides.length).diagnostics;
179
+ const issues = fit(geometry(slide, slides.length).diagnostics);
179
180
  if (issues.length) throw new OPFPaginationError("A continuation page does not fit at its final page number. No partial result was returned.", issues);
180
181
  assignPageIds(slide, slides.length);
181
182
  assertValidPresentation({ slides: [slide] });
@@ -929,8 +929,8 @@ var fontPolicySource = {
929
929
  "compatibility": "visual",
930
930
  "measured": {
931
931
  "replacement": "Source Sans 3",
932
- "meanAbsWidthDelta": 0.0157,
933
- "meanWidthDelta": 0.0151,
932
+ "meanAbsWidthDelta": 0.0158,
933
+ "meanWidthDelta": 0.0152,
934
934
  "maxAbsWidthDelta": 0.0521,
935
935
  "styles": 4,
936
936
  "reference": "Corbel 6.01"
@@ -1358,9 +1358,9 @@ var fontPolicySource = {
1358
1358
  "compatibility": "visual",
1359
1359
  "measured": {
1360
1360
  "replacement": "Source Sans 3",
1361
- "meanAbsWidthDelta": 0.051,
1362
- "meanWidthDelta": 38e-4,
1363
- "maxAbsWidthDelta": 0.1456,
1361
+ "meanAbsWidthDelta": 0.0511,
1362
+ "meanWidthDelta": 39e-4,
1363
+ "maxAbsWidthDelta": 0.1459,
1364
1364
  "styles": 4,
1365
1365
  "reference": "Gill Sans MT 1.65"
1366
1366
  }