@openpresentation/opf 0.11.1 → 0.11.3

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 (235) 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-BP6WMSSS.js → chunk-57NWIYX3.js} +17 -4
  5. package/dist/{chunk-7LF37SG3.js → chunk-AEUSVEUY.js} +4915 -1640
  6. package/dist/{chunk-6UPHKXI5.js → chunk-BVLWFMDX.js} +40 -4
  7. package/dist/{chunk-SDETQV7Y.js → chunk-HJL64ETN.js} +505 -0
  8. package/dist/{chunk-M4GTWRK7.js → chunk-JCXHSTSM.js} +143 -68
  9. package/dist/{chunk-LTSDDBNW.js → chunk-JTXCMVVP.js} +245 -10
  10. package/dist/{chunk-NPYN4TZ5.js → chunk-RXNFDGPC.js} +113 -38
  11. package/dist/{chunk-KWIOQ3QR.js → chunk-UDPSGTZI.js} +3 -3
  12. package/dist/composition.js +1 -1
  13. package/dist/docs.js +23 -17
  14. package/dist/examples.d.ts +1 -1
  15. package/dist/font-policy.d.ts +4 -0
  16. package/dist/font-policy.js +1 -1
  17. package/dist/index.d.ts +3 -3
  18. package/dist/index.js +11 -11
  19. package/dist/lint.d.ts +2 -2
  20. package/dist/lint.js +5 -5
  21. package/dist/pagination.js +5 -5
  22. package/dist/{presentation-bceTClm8.d.ts → presentation-Cn6vTOCP.d.ts} +13 -13
  23. package/dist/repo-readme.js +1 -1
  24. package/dist/schemas.js +1 -1
  25. package/dist/spec/README.md +3 -2
  26. package/dist/spec/catalogs/audiences/index.json +2 -0
  27. package/dist/spec/catalogs/chart-types/box-and-whisker.json +101 -49
  28. package/dist/spec/catalogs/chart-types/histogram.json +130 -108
  29. package/dist/spec/catalogs/chart-types/index.json +2 -0
  30. package/dist/spec/catalogs/chart-types/pareto.json +22 -106
  31. package/dist/spec/catalogs/color-schemes/black-and-white.json +10 -1
  32. package/dist/spec/catalogs/color-schemes/bold-red.json +10 -1
  33. package/dist/spec/catalogs/color-schemes/boost.json +10 -1
  34. package/dist/spec/catalogs/color-schemes/burnt-orange.json +10 -1
  35. package/dist/spec/catalogs/color-schemes/cool-horizon.json +10 -1
  36. package/dist/spec/catalogs/color-schemes/corporate-blue.json +10 -1
  37. package/dist/spec/catalogs/color-schemes/deep-purple.json +10 -1
  38. package/dist/spec/catalogs/color-schemes/forest-green.json +10 -1
  39. package/dist/spec/catalogs/color-schemes/golden-yellow.json +10 -1
  40. package/dist/spec/catalogs/color-schemes/index.json +2 -0
  41. package/dist/spec/catalogs/color-schemes/luxury.json +10 -1
  42. package/dist/spec/catalogs/color-schemes/pastel-red.json +10 -1
  43. package/dist/spec/catalogs/color-schemes/slate-gray.json +10 -1
  44. package/dist/spec/catalogs/color-schemes/steel-blue.json +10 -1
  45. package/dist/spec/catalogs/color-schemes/vibes.json +10 -1
  46. package/dist/spec/catalogs/font-schemes/angsana-new.json +2 -1
  47. package/dist/spec/catalogs/font-schemes/aparajita.json +2 -1
  48. package/dist/spec/catalogs/font-schemes/aptos.json +2 -1
  49. package/dist/spec/catalogs/font-schemes/arabic-typesetting.json +2 -1
  50. package/dist/spec/catalogs/font-schemes/arial.json +2 -1
  51. package/dist/spec/catalogs/font-schemes/batang.json +2 -1
  52. package/dist/spec/catalogs/font-schemes/bookman.json +2 -1
  53. package/dist/spec/catalogs/font-schemes/calibri.json +2 -1
  54. package/dist/spec/catalogs/font-schemes/century-schoolbook.json +2 -1
  55. package/dist/spec/catalogs/font-schemes/consolas.json +2 -1
  56. package/dist/spec/catalogs/font-schemes/constantia.json +2 -1
  57. package/dist/spec/catalogs/font-schemes/courier-new.json +2 -1
  58. package/dist/spec/catalogs/font-schemes/daunpenh.json +2 -1
  59. package/dist/spec/catalogs/font-schemes/david.json +2 -1
  60. package/dist/spec/catalogs/font-schemes/dilleniaupc.json +2 -1
  61. package/dist/spec/catalogs/font-schemes/fangsong.json +2 -1
  62. package/dist/spec/catalogs/font-schemes/garamond.json +2 -1
  63. package/dist/spec/catalogs/font-schemes/gautami.json +2 -1
  64. package/dist/spec/catalogs/font-schemes/georgia.json +2 -1
  65. package/dist/spec/catalogs/font-schemes/gisha.json +2 -1
  66. package/dist/spec/catalogs/font-schemes/grandview.json +2 -1
  67. package/dist/spec/catalogs/font-schemes/gungsuh.json +2 -1
  68. package/dist/spec/catalogs/font-schemes/impact.json +2 -1
  69. package/dist/spec/catalogs/font-schemes/index.json +236 -234
  70. package/dist/spec/catalogs/font-schemes/kalinga.json +2 -1
  71. package/dist/spec/catalogs/font-schemes/kartika.json +2 -1
  72. package/dist/spec/catalogs/font-schemes/khmer-ui.json +2 -1
  73. package/dist/spec/catalogs/font-schemes/latha.json +2 -1
  74. package/dist/spec/catalogs/font-schemes/lucida-sans.json +2 -1
  75. package/dist/spec/catalogs/font-schemes/malgun-gothic.json +2 -1
  76. package/dist/spec/catalogs/font-schemes/mangal.json +2 -1
  77. package/dist/spec/catalogs/font-schemes/meiryo.json +2 -1
  78. package/dist/spec/catalogs/font-schemes/microsoft-jhenghei.json +2 -1
  79. package/dist/spec/catalogs/font-schemes/microsoft-yahei.json +2 -1
  80. package/dist/spec/catalogs/font-schemes/mingliu.json +2 -1
  81. package/dist/spec/catalogs/font-schemes/miriam.json +2 -1
  82. package/dist/spec/catalogs/font-schemes/montserrat.json +2 -1
  83. package/dist/spec/catalogs/font-schemes/ms-mincho.json +2 -1
  84. package/dist/spec/catalogs/font-schemes/nirmala-ui.json +2 -1
  85. package/dist/spec/catalogs/font-schemes/noto-naksh-arabic.json +2 -1
  86. package/dist/spec/catalogs/font-schemes/noto-nastaliq-urdu.json +2 -1
  87. package/dist/spec/catalogs/font-schemes/noto-sans-arabic.json +2 -1
  88. package/dist/spec/catalogs/font-schemes/noto-sans-armenian.json +2 -1
  89. package/dist/spec/catalogs/font-schemes/noto-sans-bengali.json +2 -1
  90. package/dist/spec/catalogs/font-schemes/noto-sans-devangari.json +2 -1
  91. package/dist/spec/catalogs/font-schemes/noto-sans-ethiopic.json +2 -1
  92. package/dist/spec/catalogs/font-schemes/noto-sans-georgian.json +2 -1
  93. package/dist/spec/catalogs/font-schemes/noto-sans-gujarati.json +2 -1
  94. package/dist/spec/catalogs/font-schemes/noto-sans-gurmukhi.json +2 -1
  95. package/dist/spec/catalogs/font-schemes/noto-sans-hebrew.json +2 -1
  96. package/dist/spec/catalogs/font-schemes/noto-sans-jp.json +2 -1
  97. package/dist/spec/catalogs/font-schemes/noto-sans-kannada.json +2 -1
  98. package/dist/spec/catalogs/font-schemes/noto-sans-khmer.json +2 -1
  99. package/dist/spec/catalogs/font-schemes/noto-sans-kr.json +2 -1
  100. package/dist/spec/catalogs/font-schemes/noto-sans-malayalam.json +2 -1
  101. package/dist/spec/catalogs/font-schemes/noto-sans-mongolian.json +2 -1
  102. package/dist/spec/catalogs/font-schemes/noto-sans-oriya.json +2 -1
  103. package/dist/spec/catalogs/font-schemes/noto-sans-sc.json +2 -1
  104. package/dist/spec/catalogs/font-schemes/noto-sans-tamil.json +2 -1
  105. package/dist/spec/catalogs/font-schemes/noto-sans-tc.json +2 -1
  106. package/dist/spec/catalogs/font-schemes/noto-sans-telugu.json +2 -1
  107. package/dist/spec/catalogs/font-schemes/noto-sans-thai.json +2 -1
  108. package/dist/spec/catalogs/font-schemes/noto-sans.json +2 -1
  109. package/dist/spec/catalogs/font-schemes/nyala.json +2 -1
  110. package/dist/spec/catalogs/font-schemes/open-sans.json +2 -1
  111. package/dist/spec/catalogs/font-schemes/pmingliu.json +2 -1
  112. package/dist/spec/catalogs/font-schemes/poppins.json +2 -1
  113. package/dist/spec/catalogs/font-schemes/pt-serif.json +2 -1
  114. package/dist/spec/catalogs/font-schemes/raavi.json +2 -1
  115. package/dist/spec/catalogs/font-schemes/raleway.json +2 -1
  116. package/dist/spec/catalogs/font-schemes/roboto.json +2 -1
  117. package/dist/spec/catalogs/font-schemes/rockwell.json +2 -1
  118. package/dist/spec/catalogs/font-schemes/sakkal-majalla.json +2 -1
  119. package/dist/spec/catalogs/font-schemes/seaford.json +2 -1
  120. package/dist/spec/catalogs/font-schemes/segoe-ui-light.json +2 -1
  121. package/dist/spec/catalogs/font-schemes/segoe-ui.json +2 -1
  122. package/dist/spec/catalogs/font-schemes/shonar-bangla.json +2 -1
  123. package/dist/spec/catalogs/font-schemes/shruti.json +2 -1
  124. package/dist/spec/catalogs/font-schemes/simsun.json +2 -1
  125. package/dist/spec/catalogs/font-schemes/skeena.json +2 -1
  126. package/dist/spec/catalogs/font-schemes/sylfaen.json +2 -1
  127. package/dist/spec/catalogs/font-schemes/tahoma.json +2 -1
  128. package/dist/spec/catalogs/font-schemes/tenorite.json +2 -1
  129. package/dist/spec/catalogs/font-schemes/times-new-roman.json +2 -1
  130. package/dist/spec/catalogs/font-schemes/traditional-arabic.json +2 -1
  131. package/dist/spec/catalogs/font-schemes/trebuchet-ms.json +2 -1
  132. package/dist/spec/catalogs/font-schemes/tunga.json +2 -1
  133. package/dist/spec/catalogs/font-schemes/verdana.json +2 -1
  134. package/dist/spec/catalogs/font-schemes/vrinda.json +2 -1
  135. package/dist/spec/catalogs/font-schemes/yu-gothic.json +2 -1
  136. package/dist/spec/catalogs/languages/index.json +2 -0
  137. package/dist/spec/catalogs/layouts/action-plan.json +35 -0
  138. package/dist/spec/catalogs/layouts/agenda.json +35 -0
  139. package/dist/spec/catalogs/layouts/appendix-index.json +38 -0
  140. package/dist/spec/catalogs/layouts/architecture-stack.json +35 -0
  141. package/dist/spec/catalogs/layouts/assumptions-dependencies.json +35 -0
  142. package/dist/spec/catalogs/layouts/before-after.json +41 -0
  143. package/dist/spec/catalogs/layouts/benchmark-target-table.json +35 -0
  144. package/dist/spec/catalogs/layouts/bullet-list.json +38 -0
  145. package/dist/spec/catalogs/layouts/business-model-canvas.json +35 -0
  146. package/dist/spec/catalogs/layouts/capability-map.json +35 -0
  147. package/dist/spec/catalogs/layouts/case-study.json +35 -0
  148. package/dist/spec/catalogs/layouts/chapter-recap.json +35 -0
  149. package/dist/spec/catalogs/layouts/circular-lifecycle.json +35 -0
  150. package/dist/spec/catalogs/layouts/comparison.json +41 -0
  151. package/dist/spec/catalogs/layouts/competitive-landscape.json +35 -0
  152. package/dist/spec/catalogs/layouts/customer-journey.json +35 -0
  153. package/dist/spec/catalogs/layouts/customer-logos.json +38 -0
  154. package/dist/spec/catalogs/layouts/dashboard.json +41 -0
  155. package/dist/spec/catalogs/layouts/data-visualization.json +45 -0
  156. package/dist/spec/catalogs/layouts/decision-tree.json +35 -0
  157. package/dist/spec/catalogs/layouts/detailed-data-table.json +41 -0
  158. package/dist/spec/catalogs/layouts/ecosystem-map.json +35 -0
  159. package/dist/spec/catalogs/layouts/executive-decision.json +38 -0
  160. package/dist/spec/catalogs/layouts/executive-summary.json +38 -0
  161. package/dist/spec/catalogs/layouts/faq.json +35 -0
  162. package/dist/spec/catalogs/layouts/feature-comparison-matrix.json +35 -0
  163. package/dist/spec/catalogs/layouts/forecast-scenario.json +45 -0
  164. package/dist/spec/catalogs/layouts/funnel-pyramid.json +38 -0
  165. package/dist/spec/catalogs/layouts/gantt-project-plan.json +38 -0
  166. package/dist/spec/catalogs/layouts/geographic-map.json +35 -0
  167. package/dist/spec/catalogs/layouts/heatmap-cohort.json +38 -0
  168. package/dist/spec/catalogs/layouts/hub-and-spoke.json +35 -0
  169. package/dist/spec/catalogs/layouts/icon-grid.json +35 -0
  170. package/dist/spec/catalogs/layouts/image-focus.json +35 -0
  171. package/dist/spec/catalogs/layouts/index.json +352 -0
  172. package/dist/spec/catalogs/layouts/key-takeaway.json +32 -0
  173. package/dist/spec/catalogs/layouts/kpi-scorecard.json +44 -0
  174. package/dist/spec/catalogs/layouts/logic-tree.json +35 -0
  175. package/dist/spec/catalogs/layouts/market-size.json +35 -0
  176. package/dist/spec/catalogs/layouts/matrix-quadrant.json +48 -0
  177. package/dist/spec/catalogs/layouts/network-dependency-map.json +35 -0
  178. package/dist/spec/catalogs/layouts/one-column-explainer.json +35 -0
  179. package/dist/spec/catalogs/layouts/org-chart.json +45 -0
  180. package/dist/spec/catalogs/layouts/persona-grid.json +35 -0
  181. package/dist/spec/catalogs/layouts/photo-grid.json +48 -0
  182. package/dist/spec/catalogs/layouts/pricing-table.json +35 -0
  183. package/dist/spec/catalogs/layouts/process-flow.json +35 -0
  184. package/dist/spec/catalogs/layouts/product-feature.json +35 -0
  185. package/dist/spec/catalogs/layouts/pros-cons.json +41 -0
  186. package/dist/spec/catalogs/layouts/qa-discussion.json +38 -0
  187. package/dist/spec/catalogs/layouts/quote-highlight.json +35 -0
  188. package/dist/spec/catalogs/layouts/raci-matrix.json +35 -0
  189. package/dist/spec/catalogs/layouts/risk-heatmap.json +35 -0
  190. package/dist/spec/catalogs/layouts/roadmap.json +35 -0
  191. package/dist/spec/catalogs/layouts/screenshot-walkthrough.json +35 -0
  192. package/dist/spec/catalogs/layouts/section-divider.json +35 -0
  193. package/dist/spec/catalogs/layouts/single-message-statement.json +32 -0
  194. package/dist/spec/catalogs/layouts/stats-metrics.json +45 -0
  195. package/dist/spec/catalogs/layouts/status-rag.json +35 -0
  196. package/dist/spec/catalogs/layouts/swimlane-process.json +35 -0
  197. package/dist/spec/catalogs/layouts/swot-analysis.json +48 -0
  198. package/dist/spec/catalogs/layouts/team-bio.json +35 -0
  199. package/dist/spec/catalogs/layouts/testimonial-grid.json +44 -0
  200. package/dist/spec/catalogs/layouts/thank-you-cta.json +35 -0
  201. package/dist/spec/catalogs/layouts/three-column.json +45 -0
  202. package/dist/spec/catalogs/layouts/timeline.json +38 -0
  203. package/dist/spec/catalogs/layouts/title-slide.json +35 -0
  204. package/dist/spec/catalogs/layouts/two-column.json +42 -0
  205. package/dist/spec/catalogs/layouts/venn-overlap.json +35 -0
  206. package/dist/spec/catalogs/layouts/waterfall-bridge.json +45 -0
  207. package/dist/spec/catalogs/layouts/wheel-radial.json +35 -0
  208. package/dist/spec/catalogs/manifest.json +111 -0
  209. package/dist/spec/catalogs/narratives/index.json +746 -144
  210. package/dist/spec/catalogs/purposes/index.json +2 -0
  211. package/dist/spec/catalogs/social-platforms/index.json +2 -1
  212. package/dist/spec/catalogs/themes/index.json +10 -8
  213. package/dist/spec/catalogs/tones/index.json +2 -0
  214. package/dist/spec/reference/font-policy.json +113 -38
  215. package/dist/spec/reference/font-policy.schema.json +10 -0
  216. package/dist/spec/schemas/audience.schema.json +21 -0
  217. package/dist/spec/schemas/catalog-index.schema.json +40 -3
  218. package/dist/spec/schemas/catalog-manifest.schema.json +83 -0
  219. package/dist/spec/schemas/chart-type.schema.json +5 -0
  220. package/dist/spec/schemas/color-scheme.schema.json +21 -0
  221. package/dist/spec/schemas/font-scheme.schema.json +21 -0
  222. package/dist/spec/schemas/language.schema.json +21 -0
  223. package/dist/spec/schemas/layout.schema.json +21 -0
  224. package/dist/spec/schemas/narrative.schema.json +21 -0
  225. package/dist/spec/schemas/opf.schema.json +5 -5
  226. package/dist/spec/schemas/purpose.schema.json +21 -0
  227. package/dist/spec/schemas/social-platform.schema.json +26 -5
  228. package/dist/spec/schemas/theme.schema.json +21 -0
  229. package/dist/spec/schemas/tone.schema.json +21 -0
  230. package/dist/spec-files.d.ts +2 -2
  231. package/dist/spec-files.js +1 -1
  232. package/dist/types.d.ts +2 -2
  233. package/dist/validator.d.ts +2 -2
  234. package/dist/validator.js +4 -4
  235. package/package.json +1 -1
@@ -1,7 +1,9 @@
1
1
  {
2
2
  "$schema": "https://openpresentation.org/schema/opf-catalog-index/v1",
3
+ "kind": "purposes",
3
4
  "version": "1",
4
5
  "description": "Catalog of presentation purposes available in the openpresentation.org catalog. Each entry is a lightweight summary; full purpose records live in the per-id JSON files alongside this index. Purposes are referenced from OPF documents via purpose.",
6
+ "contentSha256": "43d9ba617491fe1d98b527d24032d5da9bc6763a01b0ea41da421c5ec27e649c",
5
7
  "records": [
6
8
  {
7
9
  "id": "inform",
@@ -1,7 +1,9 @@
1
1
  {
2
2
  "$schema": "https://openpresentation.org/schema/opf-catalog-index/v1",
3
+ "kind": "social-platforms",
3
4
  "version": "1",
4
5
  "description": "Catalog of social-media platforms available in the openpresentation.org catalog. Each entry is a lightweight summary; full platform records live in the per-id JSON files alongside this index. The property keys of any Socials object on Organization or Speaker resolve to ids in this catalog.",
6
+ "contentSha256": "22292ed144ac3caf37a86c9e644f9b648cda51ed670cbc3c0ed64915d251b375",
5
7
  "records": [
6
8
  {
7
9
  "id": "linkedin",
@@ -65,4 +67,3 @@
65
67
  }
66
68
  ]
67
69
  }
68
-
@@ -1,13 +1,15 @@
1
1
  {
2
2
  "$schema": "https://openpresentation.org/schema/opf-catalog-index/v1",
3
+ "kind": "themes",
3
4
  "version": "1",
4
5
  "description": "Catalog of themes available in the openpresentation.org catalog. Each entry is a lightweight summary; full theme records live in the per-id JSON files alongside this index.",
6
+ "contentSha256": "5af95e3e353857bb49a2c303e66b99d74d884210070baac0b68291aad90fa8d5",
5
7
  "records": [
6
8
  {
7
- "id": "bold",
8
- "name": "Bold",
9
- "description": "A vibrant, high-energy theme with bold colors and a dynamic, attention-grabbing style. Great for presentations that need to stand out.",
10
- "file": "bold.json"
9
+ "id": "minimal",
10
+ "name": "Minimal",
11
+ "description": "A clean, minimalistic theme with a focus on simplicity and readability. Ideal for professional, straightforward presentations.",
12
+ "file": "minimal.json"
11
13
  },
12
14
  {
13
15
  "id": "classic",
@@ -22,10 +24,10 @@
22
24
  "file": "dark.json"
23
25
  },
24
26
  {
25
- "id": "minimal",
26
- "name": "Minimal",
27
- "description": "A clean, minimalistic theme with a focus on simplicity and readability. Ideal for professional, straightforward presentations.",
28
- "file": "minimal.json"
27
+ "id": "bold",
28
+ "name": "Bold",
29
+ "description": "A vibrant, high-energy theme with bold colors and a dynamic, attention-grabbing style. Great for presentations that need to stand out.",
30
+ "file": "bold.json"
29
31
  }
30
32
  ]
31
33
  }
@@ -1,7 +1,9 @@
1
1
  {
2
2
  "$schema": "https://openpresentation.org/schema/opf-catalog-index/v1",
3
+ "kind": "tones",
3
4
  "version": "1",
4
5
  "description": "Catalog of presentation tones available in the openpresentation.org catalog. Each entry is a lightweight summary; full tone records (voice cues, anti-patterns, sample phrases) live in the per-id JSON files alongside this index. Tones are referenced from OPF documents via tone.",
6
+ "contentSha256": "b5a8d0933f494d09cd3b9a399c8de2032c43d253fcf432974135e841fcc9e703",
5
7
  "records": [
6
8
  {
7
9
  "id": "formal",
@@ -5,9 +5,9 @@
5
5
  "note": "Owner decisions resolved provisionally with the recommended defaults. Changing a decision here is the whole edit: every row whose replacement names this decision takes its family and compatibility from it. A recorded measurement for a different family is ignored (treated as unmeasured) until scripts/measure-font-replacements.mjs is re-run.",
6
6
  "decisions": {
7
7
  "aptos-preview": {
8
- "replacement": "Roboto",
9
- "compatibility": "visual",
10
- "note": "Default scheme aptos previews with Roboto; the PPTX still names Aptos."
8
+ "replacement": "Intos",
9
+ "compatibility": "metric",
10
+ "note": "Owner policy 2026-09-29: a licensed font the user selects previews with an open replacement that looks similar and has the same size on screen; the PPTX keeps the selected name. Aptos previews with Intos (metric, OFL-1.1, vendored in opf-render); Roboto and Carlito are alternates for registries built without the Intos faces (they are in the opf-render office pack)."
11
11
  },
12
12
  "segoe-ui-preview": {
13
13
  "replacement": "Red Hat Display",
@@ -25,7 +25,7 @@
25
25
  "description": "OPF font policy (font-fidelity-everywhere FF-31). One row per font family that OPF catalogs, defaults or renderer rules name. Renderers preview a proprietary family with its openly licensed replacement for measurement and drawing only. Exporters always write the chosen family, never write a replacement, and never embed a proprietary family. Open families may be bundled for rendering and reach a PPTX only through an explicit embed path. See docs/font-fidelity.md.",
26
26
  "version": 1,
27
27
  "measurement": {
28
- "tool": "fontkit 2.0.4 shaping with default features (kerning, ligatures), as opf-render measures text",
28
+ "tool": "fontkit 2.0.4 shaping with default features (kerning, ligatures), as opf-render measures text; a replacement that lists disabledFeatures (Georgia -> Gelasio) is shaped with those features off",
29
29
  "corpus": "300 Latin title/body strings sampled from the 126 bundled example decks",
30
30
  "evidence": "docs/evidence/font-replacements-20260923/README.md",
31
31
  "definition": "For each style both fonts have (regular, bold, italic, bold italic, or the weight the family name encodes), the shaped advance width of every corpus string in the replacement is divided by the width in the real font. meanAbsWidthDelta averages |ratio - 1| over strings and styles; meanWidthDelta averages the signed value; maxAbsWidthDelta is the largest single-string |ratio - 1|. Reference fonts were read in place from a licensed Windows 11 + Microsoft 365 host and never copied."
@@ -106,16 +106,18 @@
106
106
  "embeddableByOpf": false,
107
107
  "replacement": {
108
108
  "decision": "aptos-preview",
109
+ "source": "https://github.com/muglug/intos/tree/fef9315c14da9e4b23b4c3cac8e718998d4e4736",
109
110
  "measured": {
110
- "replacement": "Roboto",
111
- "meanAbsWidthDelta": 0.0215,
112
- "meanWidthDelta": 0.0008,
113
- "maxAbsWidthDelta": 0.0739,
111
+ "replacement": "Intos",
112
+ "meanAbsWidthDelta": 0,
113
+ "meanWidthDelta": 0,
114
+ "maxAbsWidthDelta": 0,
114
115
  "styles": 4,
115
116
  "reference": "Aptos 2.01;O365"
116
117
  }
117
118
  },
118
119
  "alternates": [
120
+ "Roboto",
119
121
  "Carlito"
120
122
  ],
121
123
  "sources": [
@@ -126,7 +128,7 @@
126
128
  "https://microsoft.design/articles/a-change-of-typeface-microsoft-s-new-default-font-has-arrived/",
127
129
  "https://www.microsoft.com/en-us/download/details.aspx?id=106087"
128
130
  ],
129
- "note": "Microsoft 365 cloud font; not redistributable. Roboto is the closest measured open face with all four styles already in the base pack. Carlito (the previous substitute) measured 7.1% narrower. Not in the Windows 10/11 font lists; delivered as a Microsoft 365 cloud font. Microsoft also offers a standalone download (Download Center id=106087) under Microsoft terms, not an open license."
131
+ "note": "Microsoft 365 cloud font; not redistributable. Intos is metric-compatible (OFL, Inter-derived outlines with Aptos advances, kerning and vertical metrics) and previews it in the default opf-render office pack; Roboto and Carlito are the visual fallbacks for registries built without the Intos faces. Not in the Windows 10/11 font lists; delivered as a Microsoft 365 cloud font. Microsoft also offers a standalone download (Download Center id=106087) under Microsoft terms, not an open license."
130
132
  },
131
133
  {
132
134
  "family": "Aptos Display",
@@ -137,18 +139,20 @@
137
139
  ],
138
140
  "embeddableByOpf": false,
139
141
  "replacement": {
140
- "family": "Carlito",
141
- "compatibility": "visual",
142
+ "family": "Intos Display",
143
+ "compatibility": "metric",
144
+ "source": "https://github.com/muglug/intos/tree/fef9315c14da9e4b23b4c3cac8e718998d4e4736",
142
145
  "measured": {
143
- "replacement": "Carlito",
144
- "meanAbsWidthDelta": 0.0184,
145
- "meanWidthDelta": -0.0057,
146
- "maxAbsWidthDelta": 0.0691,
146
+ "replacement": "Intos Display",
147
+ "meanAbsWidthDelta": 0,
148
+ "meanWidthDelta": 0,
149
+ "maxAbsWidthDelta": 0,
147
150
  "styles": 4,
148
151
  "reference": "Aptos Display 2.01;O365"
149
152
  }
150
153
  },
151
154
  "alternates": [
155
+ "Carlito",
152
156
  "Roboto"
153
157
  ],
154
158
  "sources": [
@@ -158,7 +162,7 @@
158
162
  "https://support.apple.com/en-us/122869",
159
163
  "https://microsoft.design/articles/a-change-of-typeface-microsoft-s-new-default-font-has-arrived/"
160
164
  ],
161
- "note": "Part of the Aptos family; cloud font list has Aptos Display (+Bold/Italic/Bold Italic)."
165
+ "note": "Part of the Aptos family; cloud font list has Aptos Display (+Bold/Italic/Bold Italic). Intos Display is its metric-compatible preview replacement."
162
166
  },
163
167
  {
164
168
  "family": "Aptos Mono",
@@ -194,13 +198,14 @@
194
198
  ],
195
199
  "embeddableByOpf": false,
196
200
  "replacement": {
197
- "family": "Carlito",
198
- "compatibility": "visual",
201
+ "family": "Intos Narrow",
202
+ "compatibility": "metric",
203
+ "source": "https://github.com/muglug/intos/tree/fef9315c14da9e4b23b4c3cac8e718998d4e4736",
199
204
  "measured": {
200
- "replacement": "Carlito",
201
- "meanAbsWidthDelta": 0.0233,
202
- "meanWidthDelta": 0.0222,
203
- "maxAbsWidthDelta": 0.0786,
205
+ "replacement": "Intos Narrow",
206
+ "meanAbsWidthDelta": 0,
207
+ "meanWidthDelta": 0,
208
+ "maxAbsWidthDelta": 0,
204
209
  "styles": 4,
205
210
  "reference": "Aptos Narrow 2.01;O365"
206
211
  }
@@ -212,7 +217,10 @@
212
217
  "https://support.apple.com/en-us/122869",
213
218
  "https://microsoft.design/articles/a-change-of-typeface-microsoft-s-new-default-font-has-arrived/"
214
219
  ],
215
- "note": "Part of the Aptos family; cloud font list has Aptos Narrow (+Bold/Italic/Bold Italic)."
220
+ "note": "Part of the Aptos family; cloud font list has Aptos Narrow (+Bold/Italic/Bold Italic). Intos Narrow is its metric-compatible preview replacement.",
221
+ "alternates": [
222
+ "Carlito"
223
+ ]
216
224
  },
217
225
  {
218
226
  "family": "Aptos Serif",
@@ -223,9 +231,17 @@
223
231
  ],
224
232
  "embeddableByOpf": false,
225
233
  "replacement": {
226
- "family": "Tinos",
227
- "compatibility": "visual",
228
- "measured": null
234
+ "family": "Intos Serif",
235
+ "compatibility": "metric",
236
+ "source": "https://github.com/muglug/intos/tree/fef9315c14da9e4b23b4c3cac8e718998d4e4736",
237
+ "measured": {
238
+ "replacement": "Intos Serif",
239
+ "meanAbsWidthDelta": 0,
240
+ "meanWidthDelta": 0,
241
+ "maxAbsWidthDelta": 0,
242
+ "styles": 4,
243
+ "reference": "Aptos Serif 2.01;240513210638;O365"
244
+ }
229
245
  },
230
246
  "sources": [
231
247
  "https://learn.microsoft.com/en-us/typography/fonts/windows_11_font_list",
@@ -233,7 +249,10 @@
233
249
  "https://learn.microsoft.com/en-us/typography/font-list/aptos",
234
250
  "https://support.apple.com/en-us/122869"
235
251
  ],
236
- "note": "Reference not available to the measuring host. Aptos family member; cloud list has Aptos Serif, Bold, Italic and Bold Italic."
252
+ "note": "Part of the Aptos family; cloud list has Aptos Serif, Bold, Italic and Bold Italic. Intos Serif (Gelasio-derived outlines, Aptos Serif metrics) is its metric-compatible preview replacement. Not installed on the measuring host: measured from the files in Microsoft's Aptos Fonts download (Download Center id=106087).",
253
+ "alternates": [
254
+ "Tinos"
255
+ ]
237
256
  },
238
257
  {
239
258
  "family": "Arabic Typesetting",
@@ -909,8 +928,8 @@
909
928
  "compatibility": "visual",
910
929
  "measured": {
911
930
  "replacement": "Source Sans 3",
912
- "meanAbsWidthDelta": 0.0157,
913
- "meanWidthDelta": 0.0151,
931
+ "meanAbsWidthDelta": 0.0158,
932
+ "meanWidthDelta": 0.0152,
914
933
  "maxAbsWidthDelta": 0.0521,
915
934
  "styles": 4,
916
935
  "reference": "Corbel 6.01"
@@ -1301,12 +1320,16 @@
1301
1320
  "embeddableByOpf": false,
1302
1321
  "replacement": {
1303
1322
  "family": "Gelasio",
1304
- "compatibility": "visual",
1323
+ "compatibility": "metric",
1324
+ "disabledFeatures": [
1325
+ "liga",
1326
+ "clig"
1327
+ ],
1305
1328
  "measured": {
1306
1329
  "replacement": "Gelasio",
1307
- "meanAbsWidthDelta": 0.0002,
1308
- "meanWidthDelta": -0.0002,
1309
- "maxAbsWidthDelta": 0.0102,
1330
+ "meanAbsWidthDelta": 0,
1331
+ "meanWidthDelta": 0,
1332
+ "maxAbsWidthDelta": 0,
1310
1333
  "styles": 4,
1311
1334
  "reference": "Georgia 5.59"
1312
1335
  },
@@ -1319,7 +1342,7 @@
1319
1342
  "https://learn.microsoft.com/en-us/typography/font-list/georgia",
1320
1343
  "https://support.apple.com/en-us/122869"
1321
1344
  ],
1322
- "note": "Gelasio is designed to Georgia metrics and every basic-Latin advance matches Georgia 5.59, but opf-render shapes with default features, and runs where Gelasio applies optional ligatures differ by up to 1.02%. OPF classes it as visual."
1345
+ "note": "Gelasio is designed to Georgia metrics and every basic-Latin advance matches Georgia 5.59. With default features Gelasio applies fi/fl/ffi/ffl ligatures that Georgia does not, which changes runs by up to 1.02%. Renderers therefore turn liga and clig off in Gelasio (disabledFeatures); the measurement below shapes Gelasio that way. Georgia has no liga or clig feature, so its default shaping is unchanged. The metric claim holds only with those features off."
1323
1346
  },
1324
1347
  {
1325
1348
  "family": "Gill Sans MT",
@@ -1334,9 +1357,9 @@
1334
1357
  "compatibility": "visual",
1335
1358
  "measured": {
1336
1359
  "replacement": "Source Sans 3",
1337
- "meanAbsWidthDelta": 0.051,
1338
- "meanWidthDelta": 0.0038,
1339
- "maxAbsWidthDelta": 0.1456,
1360
+ "meanAbsWidthDelta": 0.0511,
1361
+ "meanWidthDelta": 0.0039,
1362
+ "maxAbsWidthDelta": 0.1459,
1340
1363
  "styles": 4,
1341
1364
  "reference": "Gill Sans MT 1.65"
1342
1365
  }
@@ -1502,6 +1525,58 @@
1502
1525
  "https://support.apple.com/en-us/122869"
1503
1526
  ]
1504
1527
  },
1528
+ {
1529
+ "family": "Intos",
1530
+ "licenseClass": "open",
1531
+ "license": "OFL-1.1",
1532
+ "availability": [],
1533
+ "embeddableByOpf": true,
1534
+ "replacement": null,
1535
+ "sources": [
1536
+ "https://github.com/muglug/intos/tree/fef9315c14da9e4b23b4c3cac8e718998d4e4736",
1537
+ "https://github.com/muglug/intos/blob/fef9315c14da9e4b23b4c3cac8e718998d4e4736/LICENSE.txt"
1538
+ ],
1539
+ "note": "Metric-compatible with Aptos (Aptos advance widths, kerning and vertical metrics on Inter-derived outlines). Vendored in opf-render at the pinned commit; single-maintainer project created September 2026, so Roboto and Carlito stay as fallbacks."
1540
+ },
1541
+ {
1542
+ "family": "Intos Display",
1543
+ "licenseClass": "open",
1544
+ "license": "OFL-1.1",
1545
+ "availability": [],
1546
+ "embeddableByOpf": true,
1547
+ "replacement": null,
1548
+ "sources": [
1549
+ "https://github.com/muglug/intos/tree/fef9315c14da9e4b23b4c3cac8e718998d4e4736",
1550
+ "https://github.com/muglug/intos/blob/fef9315c14da9e4b23b4c3cac8e718998d4e4736/LICENSE.txt"
1551
+ ],
1552
+ "note": "Metric-compatible with Aptos Display (Aptos advance widths, kerning and vertical metrics on Inter-derived outlines). Vendored in opf-render at the pinned commit; single-maintainer project created September 2026, so Roboto and Carlito stay as fallbacks."
1553
+ },
1554
+ {
1555
+ "family": "Intos Narrow",
1556
+ "licenseClass": "open",
1557
+ "license": "OFL-1.1",
1558
+ "availability": [],
1559
+ "embeddableByOpf": true,
1560
+ "replacement": null,
1561
+ "sources": [
1562
+ "https://github.com/muglug/intos/tree/fef9315c14da9e4b23b4c3cac8e718998d4e4736",
1563
+ "https://github.com/muglug/intos/blob/fef9315c14da9e4b23b4c3cac8e718998d4e4736/LICENSE.txt"
1564
+ ],
1565
+ "note": "Metric-compatible with Aptos Narrow (Aptos advance widths, kerning and vertical metrics on Inter-derived outlines). Vendored in opf-render at the pinned commit; single-maintainer project created September 2026, so Roboto and Carlito stay as fallbacks."
1566
+ },
1567
+ {
1568
+ "family": "Intos Serif",
1569
+ "licenseClass": "open",
1570
+ "license": "OFL-1.1",
1571
+ "availability": [],
1572
+ "embeddableByOpf": true,
1573
+ "replacement": null,
1574
+ "sources": [
1575
+ "https://github.com/muglug/intos/tree/fef9315c14da9e4b23b4c3cac8e718998d4e4736",
1576
+ "https://github.com/muglug/intos/blob/fef9315c14da9e4b23b4c3cac8e718998d4e4736/LICENSE.txt"
1577
+ ],
1578
+ "note": "Metric-compatible with Aptos Serif (Aptos Serif advance widths, kerning and vertical metrics on Gelasio-derived outlines). Vendored in opf-render at the pinned commit; Tinos stays as the visual fallback."
1579
+ },
1505
1580
  {
1506
1581
  "family": "Kalinga",
1507
1582
  "licenseClass": "proprietary-standard",
@@ -2721,7 +2796,7 @@
2721
2796
  "https://learn.microsoft.com/en-us/typography/font-list/segoe-ui",
2722
2797
  "https://support.apple.com/en-us/122869"
2723
2798
  ],
2724
- "note": "Microsoft's OFL Selawik is the documented Segoe UI fallback but is not published as a pinned package; Red Hat Display is the closest measured shipped face. MS Learn lists vendor as Agfa Monotype but copyright Microsoft."
2799
+ "note": "Microsoft's OFL Selawik 1.01 was measured and rejected as a metric replacement: 0.16% mean and 2.5% maximum in regular, no italic faces (2.65% mean), and Semibold is 1.75% off. Red Hat Display remains the closest shipped face with all four styles; see docs/programs/font-fidelity-everywhere/font-licensing.md."
2725
2800
  },
2726
2801
  {
2727
2802
  "family": "Segoe UI Emoji",
@@ -182,6 +182,16 @@
182
182
  "minimum": 100,
183
183
  "maximum": 900
184
184
  },
185
+ "disabledFeatures": {
186
+ "description": "OpenType feature tags a renderer must turn off when it shapes and draws this replacement (for example liga and clig for Gelasio, which ligates fi and fl where Georgia does not). The measurement below is taken with them off, and a metric claim holds only with them off.",
187
+ "type": "array",
188
+ "minItems": 1,
189
+ "uniqueItems": true,
190
+ "items": {
191
+ "type": "string",
192
+ "pattern": "^[A-Za-z0-9 ]{4}$"
193
+ }
194
+ },
185
195
  "measured": {
186
196
  "oneOf": [
187
197
  {
@@ -48,6 +48,27 @@
48
48
  "Regulators"
49
49
  ]
50
50
  },
51
+ "deprecation": {
52
+ "type": "object",
53
+ "additionalProperties": false,
54
+ "required": ["replacedBy"],
55
+ "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.",
56
+ "properties": {
57
+ "replacedBy": {
58
+ "type": "string",
59
+ "pattern": "^[a-z][a-z0-9-]*$",
60
+ "description": "Id of the non-deprecated audience record that documents should reference instead."
61
+ },
62
+ "reason": {
63
+ "type": "string",
64
+ "description": "Why the record is deprecated."
65
+ },
66
+ "removal": {
67
+ "type": "string",
68
+ "description": "Package version in which the record is scheduled for removal from the bundled catalog, if any."
69
+ }
70
+ }
71
+ },
51
72
  "summary": {
52
73
  "type": "string",
53
74
  "description": "One-sentence positioning of the audience — who they are and what they care about.",
@@ -2,15 +2,37 @@
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "$id": "https://openpresentation.org/schema/opf-catalog-index/v1",
4
4
  "title": "Catalog Index",
5
- "description": "Generic shape shared by every `spec/catalogs/<kind>/index.json` file in the OPF repo. An index is a lightweight, ordered summary of the full-record JSON files that live alongside it: each entry names the record's stable id, a human-readable name, and the record's filename, plus whatever extra summary fields are useful for picker UIs (e.g. `summary`, `tags`, `bcp47`, `durationRange`). This schema describes the repo-internal catalog index files themselves, not OPF documents or individual catalog records — it is not part of the OPF document contract and is intentionally excluded from the package's published/typed schema surface.",
5
+ "description": "Generic shape shared by every `spec/catalogs/<kind>/index.json` file in the OPF repo and by the default-catalog index that pptx.gallery publishes at `https://www.pptx.gallery/<kind>/index.json` (spec/catalogs is a pinned snapshot of that catalog; see docs/default-catalog.md). An index is a lightweight, ordered summary of the full-record JSON files that live alongside it: each entry names the record's stable id, a human-readable name, and the record's filename, plus whatever extra summary fields are useful for picker UIs (e.g. `summary`, `tags`, `bcp47`, `durationRange`). This schema describes catalog index files themselves, not OPF documents or individual catalog records — it is not part of the OPF document contract and is intentionally excluded from the package's published/typed schema surface.",
6
6
  "type": "object",
7
7
  "required": ["$schema", "version", "description", "records"],
8
8
  "additionalProperties": false,
9
+ "patternProperties": {
10
+ "^x-": {
11
+ "description": "Publisher extension member, such as pptx.gallery's `x-gallery` reconciliation status. Consumers ignore top-level `x-*` members, and the pinned snapshot in spec/catalogs never carries them."
12
+ }
13
+ },
9
14
  "properties": {
10
15
  "$schema": {
11
16
  "type": "string",
12
17
  "const": "https://openpresentation.org/schema/opf-catalog-index/v1"
13
18
  },
19
+ "kind": {
20
+ "type": "string",
21
+ "description": "Catalog kind, as the URL segment of the default catalog (`https://www.pptx.gallery/<kind>`) and the `spec/catalogs/<kind>` directory name.",
22
+ "enum": [
23
+ "audiences",
24
+ "chart-types",
25
+ "color-schemes",
26
+ "font-schemes",
27
+ "languages",
28
+ "layouts",
29
+ "narratives",
30
+ "purposes",
31
+ "social-platforms",
32
+ "themes",
33
+ "tones"
34
+ ]
35
+ },
14
36
  "version": {
15
37
  "type": "string",
16
38
  "description": "Index format version, as a string.",
@@ -20,6 +42,11 @@
20
42
  "type": "string",
21
43
  "description": "Human-readable description of what this catalog kind holds and how entries are ordered."
22
44
  },
45
+ "contentSha256": {
46
+ "type": "string",
47
+ "description": "SHA-256 (lowercase hex) of the canonical JSON of the full records this index lists, in index order, with every top-level `x-*` member removed. Canonical JSON sorts object keys and has no insignificant whitespace. Lets a consumer prove it holds exactly the published content.",
48
+ "pattern": "^[0-9a-f]{64}$"
49
+ },
23
50
  "records": {
24
51
  "type": "array",
25
52
  "description": "Ordered list of lightweight record summaries. Order defines the catalog's canonical/display order; full record data lives in the sibling JSON file named by `file`.",
@@ -35,8 +62,8 @@
35
62
  "properties": {
36
63
  "id": {
37
64
  "type": "string",
38
- "description": "Stable identifier, matching the `id` field inside the record file named by `file`.",
39
- "pattern": "^[a-z][a-z0-9-]*$"
65
+ "description": "Stable identifier, matching the `id` field inside the record file named by `file`. Lowercase kebab-case; chart-type ids may start with a digit (e.g. '100pct-stacked-bar').",
66
+ "pattern": "^[a-z0-9][a-z0-9-]*$"
40
67
  },
41
68
  "name": {
42
69
  "type": "string",
@@ -46,6 +73,16 @@
46
73
  "type": "string",
47
74
  "description": "Filename of the full record, relative to this index file's directory.",
48
75
  "pattern": "^[^/]+\\.json$"
76
+ },
77
+ "deprecated": {
78
+ "type": "boolean",
79
+ "const": true,
80
+ "description": "Present on the entry of a record that carries `deprecation`. Pickers and default listings hide deprecated entries; the id keeps resolving."
81
+ },
82
+ "replacedBy": {
83
+ "type": "string",
84
+ "description": "The deprecated record's `deprecation.replacedBy`, repeated so a picker can offer the replacement without loading the record.",
85
+ "pattern": "^[a-z0-9][a-z0-9-]*$"
49
86
  }
50
87
  }
51
88
  }
@@ -0,0 +1,83 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://openpresentation.org/schema/opf-catalog-manifest/v1",
4
+ "title": "Catalog Snapshot Manifest",
5
+ "description": "Shape of `spec/catalogs/manifest.json`, which pins the bundled catalogs to the default OPF catalog published by pptx.gallery. It records the gallery commit the snapshot came from and, per kind, how the snapshot relates to the published catalog plus a content hash of the bundled records. Written by scripts/sync-gallery-catalog.mjs and checked by scripts/check-spec-integrity.mjs; see docs/default-catalog.md. This schema describes a repo-internal file, not an OPF document or a catalog record; it is intentionally excluded from the package's published/typed schema surface.",
6
+ "type": "object",
7
+ "required": ["$schema", "description", "publisher", "source", "kinds"],
8
+ "additionalProperties": false,
9
+ "properties": {
10
+ "$schema": {
11
+ "type": "string",
12
+ "const": "https://openpresentation.org/schema/opf-catalog-manifest/v1"
13
+ },
14
+ "description": {
15
+ "type": "string"
16
+ },
17
+ "publisher": {
18
+ "type": "string",
19
+ "description": "Base URL of the default-catalog publisher. Each kind is published at `<publisher>/<kind>/index.json`.",
20
+ "format": "uri"
21
+ },
22
+ "source": {
23
+ "type": "object",
24
+ "description": "The published catalog files the snapshot was taken from.",
25
+ "required": ["repository", "commit", "path"],
26
+ "additionalProperties": false,
27
+ "properties": {
28
+ "repository": {
29
+ "type": "string",
30
+ "description": "Git repository of the publisher.",
31
+ "format": "uri"
32
+ },
33
+ "commit": {
34
+ "type": "string",
35
+ "description": "Full commit SHA of the publisher checkout whose published files the snapshot matches."
36
+ },
37
+ "path": {
38
+ "type": "string",
39
+ "description": "Directory in that repository holding `<kind>/index.json` and `<kind>/<id>.json`."
40
+ }
41
+ }
42
+ },
43
+ "kinds": {
44
+ "type": "object",
45
+ "description": "One entry per catalog kind, keyed by the kind's URL segment.",
46
+ "additionalProperties": { "$ref": "#/$defs/KindEntry" }
47
+ }
48
+ },
49
+ "$defs": {
50
+ "KindEntry": {
51
+ "type": "object",
52
+ "required": ["mode", "records", "contentSha256", "gallery"],
53
+ "additionalProperties": false,
54
+ "properties": {
55
+ "mode": {
56
+ "type": "string",
57
+ "description": "'mirror': the snapshot holds every published record. 'subset': the snapshot keeps its existing ids (their content comes from the publisher) while the publisher also serves records that are not reconciled for bundling yet.",
58
+ "enum": ["mirror", "subset"]
59
+ },
60
+ "records": {
61
+ "type": "integer",
62
+ "description": "Number of records bundled for this kind.",
63
+ "minimum": 0
64
+ },
65
+ "contentSha256": {
66
+ "type": "string",
67
+ "description": "contentSha256 of the bundled records, as defined by the catalog index schema.",
68
+ "pattern": "^[0-9a-f]{64}$"
69
+ },
70
+ "gallery": {
71
+ "type": "object",
72
+ "description": "The published catalog for this kind at the pinned commit.",
73
+ "required": ["records", "contentSha256"],
74
+ "additionalProperties": false,
75
+ "properties": {
76
+ "records": { "type": "integer", "minimum": 0 },
77
+ "contentSha256": { "type": "string", "pattern": "^[0-9a-f]{64}$" }
78
+ }
79
+ }
80
+ }
81
+ }
82
+ }
83
+ }
@@ -5,6 +5,11 @@
5
5
  "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.",
6
6
  "type": "object",
7
7
  "additionalProperties": false,
8
+ "patternProperties": {
9
+ "^x-": {
10
+ "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."
11
+ }
12
+ },
8
13
  "required": [
9
14
  "$schema",
10
15
  "id",
@@ -36,6 +36,27 @@
36
36
  "Forest Green"
37
37
  ]
38
38
  },
39
+ "deprecation": {
40
+ "type": "object",
41
+ "additionalProperties": false,
42
+ "required": ["replacedBy"],
43
+ "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.",
44
+ "properties": {
45
+ "replacedBy": {
46
+ "type": "string",
47
+ "pattern": "^[a-z][a-z0-9-]*$",
48
+ "description": "Id of the non-deprecated color scheme record that documents should reference instead."
49
+ },
50
+ "reason": {
51
+ "type": "string",
52
+ "description": "Why the record is deprecated."
53
+ },
54
+ "removal": {
55
+ "type": "string",
56
+ "description": "Package version in which the record is scheduled for removal from the bundled catalog, if any."
57
+ }
58
+ }
59
+ },
39
60
  "summary": {
40
61
  "type": "string",
41
62
  "description": "One-sentence positioning of the palette — what mood it evokes and where to use it.",
@@ -40,6 +40,27 @@
40
40
  "Microsoft Yahei"
41
41
  ]
42
42
  },
43
+ "deprecation": {
44
+ "type": "object",
45
+ "additionalProperties": false,
46
+ "required": ["replacedBy"],
47
+ "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.",
48
+ "properties": {
49
+ "replacedBy": {
50
+ "type": "string",
51
+ "pattern": "^[a-z][a-z0-9-]*$",
52
+ "description": "Id of the non-deprecated font scheme record that documents should reference instead."
53
+ },
54
+ "reason": {
55
+ "type": "string",
56
+ "description": "Why the record is deprecated."
57
+ },
58
+ "removal": {
59
+ "type": "string",
60
+ "description": "Package version in which the record is scheduled for removal from the bundled catalog, if any."
61
+ }
62
+ }
63
+ },
43
64
  "major": {
44
65
  "type": "string",
45
66
  "description": "Heading (major) font family — mirrors the OOXML majorFont entry.",