@openpresentation/opf 0.11.0 → 0.11.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (240) hide show
  1. package/dist/{catalogs-atkOF4Vy.d.ts → catalogs-DJ-B5ZyD.d.ts} +78 -8
  2. package/dist/catalogs.d.ts +2 -2
  3. package/dist/catalogs.js +1 -1
  4. package/dist/{chunk-6FU2KICU.js → chunk-7LF37SG3.js} +7084 -5106
  5. package/dist/{chunk-FTWNWFIV.js → chunk-BVLWFMDX.js} +348 -36
  6. package/dist/{chunk-CHKJ4QHQ.js → chunk-DJRZMGKY.js} +113 -32
  7. package/dist/{chunk-EQHZ3ZO4.js → chunk-K7IWYODS.js} +3 -3
  8. package/dist/chunk-KZ6BT5UG.js +3591 -0
  9. package/dist/{chunk-GN52EE3P.js → chunk-LTSDDBNW.js} +425 -40
  10. package/dist/{chunk-RS5GZ5RW.js → chunk-SDETQV7Y.js} +161 -0
  11. package/dist/{chunk-FWA5XB45.js → chunk-SMYEM3HV.js} +45 -25
  12. package/dist/{composition-Tv9Wm3Oh.d.ts → composition-DzLwY-Mi.d.ts} +200 -4
  13. package/dist/composition.d.ts +1 -1
  14. package/dist/composition.js +1 -1
  15. package/dist/docs.js +50 -20
  16. package/dist/examples.d.ts +1 -1
  17. package/dist/examples.js +11 -11
  18. package/dist/font-policy.d.ts +127 -0
  19. package/dist/font-policy.js +1 -0
  20. package/dist/index.d.ts +129 -10
  21. package/dist/index.js +280 -12
  22. package/dist/lint.d.ts +3 -3
  23. package/dist/lint.js +5 -5
  24. package/dist/pagination.d.ts +5 -1
  25. package/dist/pagination.js +5 -5
  26. package/dist/{presentation-Ct42Mitb.d.ts → presentation-bceTClm8.d.ts} +246 -22
  27. package/dist/repo-readme.js +1 -1
  28. package/dist/{schemas-CiVmUT2p.d.ts → schemas-X_NniU4A.d.ts} +2 -0
  29. package/dist/schemas.d.ts +1 -1
  30. package/dist/schemas.js +1 -1
  31. package/dist/spec/catalogs/audiences/academic.json +24 -0
  32. package/dist/spec/catalogs/audiences/all-hands.json +3 -1
  33. package/dist/spec/catalogs/audiences/board.json +3 -1
  34. package/dist/spec/catalogs/audiences/customer.json +25 -0
  35. package/dist/spec/catalogs/audiences/executive.json +24 -0
  36. package/dist/spec/catalogs/audiences/general-public.json +25 -0
  37. package/dist/spec/catalogs/audiences/index.json +73 -1
  38. package/dist/spec/catalogs/audiences/internal-team.json +25 -0
  39. package/dist/spec/catalogs/audiences/investor.json +25 -0
  40. package/dist/spec/catalogs/audiences/marketing.json +25 -0
  41. package/dist/spec/catalogs/audiences/media.json +24 -0
  42. package/dist/spec/catalogs/audiences/partner.json +25 -0
  43. package/dist/spec/catalogs/audiences/regulatory.json +25 -0
  44. package/dist/spec/catalogs/audiences/sales.json +25 -0
  45. package/dist/spec/catalogs/audiences/technical.json +25 -0
  46. package/dist/spec/catalogs/chart-types/100pct-bullet-bar-2x.json +5 -0
  47. package/dist/spec/catalogs/chart-types/100pct-bullet-bar-3x.json +5 -0
  48. package/dist/spec/catalogs/chart-types/100pct-bullet-bar.json +5 -0
  49. package/dist/spec/catalogs/chart-types/100pct-bullet-column-2x.json +5 -0
  50. package/dist/spec/catalogs/chart-types/100pct-bullet-column-3x.json +5 -0
  51. package/dist/spec/catalogs/chart-types/100pct-bullet-column.json +5 -0
  52. package/dist/spec/catalogs/chart-types/100pct-progress-bar.json +10 -0
  53. package/dist/spec/catalogs/chart-types/100pct-stacked-area-2x.json +10 -0
  54. package/dist/spec/catalogs/chart-types/100pct-stacked-area-3x.json +6 -1
  55. package/dist/spec/catalogs/chart-types/100pct-stacked-bar-2x.json +10 -0
  56. package/dist/spec/catalogs/chart-types/100pct-stacked-bar-3x.json +6 -1
  57. package/dist/spec/catalogs/chart-types/100pct-stacked-column-2x.json +10 -0
  58. package/dist/spec/catalogs/chart-types/100pct-stacked-column-3x.json +6 -1
  59. package/dist/spec/catalogs/chart-types/area.json +5 -0
  60. package/dist/spec/catalogs/chart-types/australia.json +10 -0
  61. package/dist/spec/catalogs/chart-types/bar.json +5 -0
  62. package/dist/spec/catalogs/chart-types/box-and-whisker-2x.json +10 -0
  63. package/dist/spec/catalogs/chart-types/box-and-whisker-3x.json +10 -0
  64. package/dist/spec/catalogs/chart-types/box-and-whisker.json +5 -0
  65. package/dist/spec/catalogs/chart-types/bullet-bar-2x.json +5 -0
  66. package/dist/spec/catalogs/chart-types/bullet-bar-3x.json +5 -0
  67. package/dist/spec/catalogs/chart-types/bullet-bar.json +5 -0
  68. package/dist/spec/catalogs/chart-types/bullet-column-2x.json +5 -0
  69. package/dist/spec/catalogs/chart-types/bullet-column-3x.json +5 -0
  70. package/dist/spec/catalogs/chart-types/bullet-column.json +5 -0
  71. package/dist/spec/catalogs/chart-types/canada.json +10 -0
  72. package/dist/spec/catalogs/chart-types/clustered-bar-2x.json +10 -0
  73. package/dist/spec/catalogs/chart-types/clustered-column.json +10 -0
  74. package/dist/spec/catalogs/chart-types/column.json +5 -0
  75. package/dist/spec/catalogs/chart-types/dot-plot-2x.json +5 -0
  76. package/dist/spec/catalogs/chart-types/dot-plot-3x.json +5 -0
  77. package/dist/spec/catalogs/chart-types/dot-plot-4x.json +5 -0
  78. package/dist/spec/catalogs/chart-types/dot-plot-5x.json +5 -0
  79. package/dist/spec/catalogs/chart-types/dot-plot-6x.json +5 -0
  80. package/dist/spec/catalogs/chart-types/dot-plot.json +5 -0
  81. package/dist/spec/catalogs/chart-types/doughnut.json +5 -0
  82. package/dist/spec/catalogs/chart-types/dumbbell.json +5 -0
  83. package/dist/spec/catalogs/chart-types/filled-radar.json +5 -0
  84. package/dist/spec/catalogs/chart-types/funnel.json +5 -0
  85. package/dist/spec/catalogs/chart-types/histogram.json +5 -0
  86. package/dist/spec/catalogs/chart-types/index.json +333 -233
  87. package/dist/spec/catalogs/chart-types/line-2x.json +10 -0
  88. package/dist/spec/catalogs/chart-types/line-3x.json +10 -0
  89. package/dist/spec/catalogs/chart-types/line-with-high-low-and-markers.json +5 -0
  90. package/dist/spec/catalogs/chart-types/line-with-high-low.json +5 -0
  91. package/dist/spec/catalogs/chart-types/line-with-markers-2x.json +10 -0
  92. package/dist/spec/catalogs/chart-types/line-with-markers-3x.json +10 -0
  93. package/dist/spec/catalogs/chart-types/line-with-markers.json +5 -0
  94. package/dist/spec/catalogs/chart-types/line.json +5 -0
  95. package/dist/spec/catalogs/chart-types/pareto.json +9 -14
  96. package/dist/spec/catalogs/chart-types/pie.json +5 -0
  97. package/dist/spec/catalogs/chart-types/radar-with-markers.json +5 -0
  98. package/dist/spec/catalogs/chart-types/radar.json +5 -0
  99. package/dist/spec/catalogs/chart-types/scatter.json +5 -0
  100. package/dist/spec/catalogs/chart-types/sparkline-2x.json +5 -0
  101. package/dist/spec/catalogs/chart-types/sparkline-3x.json +5 -0
  102. package/dist/spec/catalogs/chart-types/sparkline-4x.json +5 -0
  103. package/dist/spec/catalogs/chart-types/sparkline-5x.json +5 -0
  104. package/dist/spec/catalogs/chart-types/sparkline-6x.json +5 -0
  105. package/dist/spec/catalogs/chart-types/sparkline.json +5 -0
  106. package/dist/spec/catalogs/chart-types/stacked-area-2x.json +10 -0
  107. package/dist/spec/catalogs/chart-types/stacked-area-3x.json +6 -1
  108. package/dist/spec/catalogs/chart-types/stacked-bar-2x.json +10 -0
  109. package/dist/spec/catalogs/chart-types/stacked-bar-3x.json +6 -1
  110. package/dist/spec/catalogs/chart-types/stacked-column-2x.json +10 -0
  111. package/dist/spec/catalogs/chart-types/stacked-column-3x.json +6 -1
  112. package/dist/spec/catalogs/chart-types/stacked-line-2x.json +10 -0
  113. package/dist/spec/catalogs/chart-types/stacked-line-3x.json +6 -1
  114. package/dist/spec/catalogs/chart-types/stacked-line-with-markers-2x.json +10 -0
  115. package/dist/spec/catalogs/chart-types/stacked-line-with-markers-3x.json +6 -1
  116. package/dist/spec/catalogs/chart-types/treemap-2x.json +10 -0
  117. package/dist/spec/catalogs/chart-types/treemap-3x.json +10 -0
  118. package/dist/spec/catalogs/chart-types/treemap.json +5 -0
  119. package/dist/spec/catalogs/chart-types/united-kingdom.json +10 -0
  120. package/dist/spec/catalogs/chart-types/united-states.json +10 -0
  121. package/dist/spec/catalogs/chart-types/waterfall.json +5 -0
  122. package/dist/spec/catalogs/chart-types/world.json +6 -1
  123. package/dist/spec/catalogs/font-schemes/consolas.json +3 -0
  124. package/dist/spec/catalogs/font-schemes/courier-new.json +3 -0
  125. package/dist/spec/catalogs/languages/afrikaans.json +3 -0
  126. package/dist/spec/catalogs/languages/albanian.json +3 -0
  127. package/dist/spec/catalogs/languages/amharic.json +3 -0
  128. package/dist/spec/catalogs/languages/arabic.json +3 -0
  129. package/dist/spec/catalogs/languages/armenian.json +3 -0
  130. package/dist/spec/catalogs/languages/aymara.json +3 -0
  131. package/dist/spec/catalogs/languages/azerbaijani.json +3 -0
  132. package/dist/spec/catalogs/languages/bengali.json +3 -0
  133. package/dist/spec/catalogs/languages/berber-latin.json +3 -0
  134. package/dist/spec/catalogs/languages/bosnian-latin.json +3 -0
  135. package/dist/spec/catalogs/languages/bulgarian.json +3 -0
  136. package/dist/spec/catalogs/languages/catalan.json +3 -0
  137. package/dist/spec/catalogs/languages/cebuano.json +3 -0
  138. package/dist/spec/catalogs/languages/chinese-simplified.json +3 -0
  139. package/dist/spec/catalogs/languages/chinese-traditional.json +3 -0
  140. package/dist/spec/catalogs/languages/chittagonian.json +3 -0
  141. package/dist/spec/catalogs/languages/croatian.json +3 -0
  142. package/dist/spec/catalogs/languages/czech.json +3 -0
  143. package/dist/spec/catalogs/languages/danish.json +3 -0
  144. package/dist/spec/catalogs/languages/dutch.json +3 -0
  145. package/dist/spec/catalogs/languages/english-au.json +3 -0
  146. package/dist/spec/catalogs/languages/english-ca.json +3 -0
  147. package/dist/spec/catalogs/languages/english-gb.json +3 -0
  148. package/dist/spec/catalogs/languages/english-in.json +3 -0
  149. package/dist/spec/catalogs/languages/english-us.json +3 -0
  150. package/dist/spec/catalogs/languages/english.json +3 -0
  151. package/dist/spec/catalogs/languages/estonian.json +3 -0
  152. package/dist/spec/catalogs/languages/filipino.json +3 -0
  153. package/dist/spec/catalogs/languages/finnish.json +3 -0
  154. package/dist/spec/catalogs/languages/french.json +3 -0
  155. package/dist/spec/catalogs/languages/fulfulde.json +3 -0
  156. package/dist/spec/catalogs/languages/galician.json +3 -0
  157. package/dist/spec/catalogs/languages/georgian.json +3 -0
  158. package/dist/spec/catalogs/languages/german.json +3 -0
  159. package/dist/spec/catalogs/languages/greek.json +3 -0
  160. package/dist/spec/catalogs/languages/gujarati.json +3 -0
  161. package/dist/spec/catalogs/languages/hausa.json +3 -0
  162. package/dist/spec/catalogs/languages/hebrew.json +3 -0
  163. package/dist/spec/catalogs/languages/hindi.json +3 -0
  164. package/dist/spec/catalogs/languages/hungarian.json +3 -0
  165. package/dist/spec/catalogs/languages/igbo.json +3 -0
  166. package/dist/spec/catalogs/languages/indonesian.json +3 -0
  167. package/dist/spec/catalogs/languages/italian.json +3 -0
  168. package/dist/spec/catalogs/languages/japanese.json +3 -0
  169. package/dist/spec/catalogs/languages/kannada.json +3 -0
  170. package/dist/spec/catalogs/languages/kazakh.json +3 -0
  171. package/dist/spec/catalogs/languages/khmer.json +3 -0
  172. package/dist/spec/catalogs/languages/kinyarwanda.json +3 -0
  173. package/dist/spec/catalogs/languages/korean.json +3 -0
  174. package/dist/spec/catalogs/languages/kurmanji.json +3 -0
  175. package/dist/spec/catalogs/languages/latvian.json +3 -0
  176. package/dist/spec/catalogs/languages/lithuanian.json +3 -0
  177. package/dist/spec/catalogs/languages/macedonian.json +3 -0
  178. package/dist/spec/catalogs/languages/malagasy.json +3 -0
  179. package/dist/spec/catalogs/languages/malay.json +3 -0
  180. package/dist/spec/catalogs/languages/malayalam.json +3 -0
  181. package/dist/spec/catalogs/languages/maori.json +3 -0
  182. package/dist/spec/catalogs/languages/marathi.json +3 -0
  183. package/dist/spec/catalogs/languages/mongolian.json +3 -0
  184. package/dist/spec/catalogs/languages/nepali.json +3 -0
  185. package/dist/spec/catalogs/languages/norwegian.json +3 -0
  186. package/dist/spec/catalogs/languages/odia.json +3 -0
  187. package/dist/spec/catalogs/languages/oromo.json +3 -0
  188. package/dist/spec/catalogs/languages/pashto.json +3 -0
  189. package/dist/spec/catalogs/languages/persian.json +3 -0
  190. package/dist/spec/catalogs/languages/polish.json +3 -0
  191. package/dist/spec/catalogs/languages/portuguese.json +3 -0
  192. package/dist/spec/catalogs/languages/punjabi-gurmukhi.json +3 -0
  193. package/dist/spec/catalogs/languages/punjabi-shahmukhi.json +3 -0
  194. package/dist/spec/catalogs/languages/romanian.json +3 -0
  195. package/dist/spec/catalogs/languages/russian.json +3 -0
  196. package/dist/spec/catalogs/languages/serbian-cyrillic.json +3 -0
  197. package/dist/spec/catalogs/languages/serbian-latin.json +3 -0
  198. package/dist/spec/catalogs/languages/shona.json +3 -0
  199. package/dist/spec/catalogs/languages/slovak.json +3 -0
  200. package/dist/spec/catalogs/languages/slovenian.json +3 -0
  201. package/dist/spec/catalogs/languages/somali.json +3 -0
  202. package/dist/spec/catalogs/languages/spanish.json +3 -0
  203. package/dist/spec/catalogs/languages/swahili.json +3 -0
  204. package/dist/spec/catalogs/languages/swedish.json +3 -0
  205. package/dist/spec/catalogs/languages/tagalog.json +3 -0
  206. package/dist/spec/catalogs/languages/tajik.json +3 -0
  207. package/dist/spec/catalogs/languages/tamil.json +3 -0
  208. package/dist/spec/catalogs/languages/telugu.json +3 -0
  209. package/dist/spec/catalogs/languages/thai.json +3 -0
  210. package/dist/spec/catalogs/languages/turkish.json +3 -0
  211. package/dist/spec/catalogs/languages/ukrainian.json +3 -0
  212. package/dist/spec/catalogs/languages/urdu.json +3 -0
  213. package/dist/spec/catalogs/languages/uzbek-latin.json +3 -0
  214. package/dist/spec/catalogs/languages/vietnamese-quoc-ngu.json +3 -0
  215. package/dist/spec/catalogs/languages/xhosa.json +3 -0
  216. package/dist/spec/catalogs/languages/yoruba.json +3 -0
  217. package/dist/spec/catalogs/languages/zulu.json +3 -0
  218. package/dist/spec/catalogs/narratives/change-story.json +64 -0
  219. package/dist/spec/catalogs/narratives/data-story.json +66 -0
  220. package/dist/spec/catalogs/narratives/heros-journey.json +64 -0
  221. package/dist/spec/catalogs/narratives/index.json +81 -0
  222. package/dist/spec/catalogs/narratives/pyramid-principle.json +48 -0
  223. package/dist/spec/catalogs/narratives/situation-complication-resolution.json +56 -0
  224. package/dist/spec/catalogs/narratives/sparkline.json +56 -0
  225. package/dist/spec/catalogs/narratives/star-method.json +56 -0
  226. package/dist/spec/catalogs/narratives/vision-roadmap.json +65 -0
  227. package/dist/spec/catalogs/narratives/what-so-what-now-what.json +48 -0
  228. package/dist/spec/reference/engine-defaults.json +2 -2
  229. package/dist/spec/reference/font-policy.json +3510 -0
  230. package/dist/spec/reference/font-policy.schema.json +338 -0
  231. package/dist/spec/schemas/chart-type.schema.json +51 -11
  232. package/dist/spec/schemas/font-scheme.schema.json +91 -1
  233. package/dist/spec/schemas/language.schema.json +10 -5
  234. package/dist/spec/schemas/opf.schema.json +158 -20
  235. package/dist/spec-files.d.ts +1 -1
  236. package/dist/spec-files.js +1 -1
  237. package/dist/types.d.ts +3 -3
  238. package/dist/validator.d.ts +3 -3
  239. package/dist/validator.js +4 -4
  240. package/package.json +6 -2
package/dist/index.js CHANGED
@@ -1,14 +1,16 @@
1
- export { specFileEntries, specFileKinds, specFilePaths } from './chunk-RS5GZ5RW.js';
1
+ export { specFileEntries, specFileKinds, specFilePaths } from './chunk-SDETQV7Y.js';
2
2
  export { getLayoutPreview, hasLayoutPreview, layoutPreviewIndex, layoutPreviewSlugs, layoutPreviews } from './chunk-PIQXLBBJ.js';
3
- export { lintPresentation, lintSource } from './chunk-EQHZ3ZO4.js';
3
+ export { lintPresentation, lintSource } from './chunk-K7IWYODS.js';
4
+ export { FONT_POLICY, applyFontPolicyDecisions, fontAvailabilityDiagnostics, fontPolicyFor } from './chunk-KZ6BT5UG.js';
4
5
  export { OPFDataImportError, createDataContent, parseTabularData } from './chunk-SOSOBKQ2.js';
5
- export { OPFPaginationError, paginatePresentation, paginateSlide } from './chunk-FWA5XB45.js';
6
- import { isRecord, visitContentPayloads, bareIdPattern } from './chunk-CHKJ4QHQ.js';
7
- export { OPFValidationError, assertValid, assertValidCatalogRecord, assertValidPresentation, validate, validateCatalogRecord, validatePresentation } from './chunk-CHKJ4QHQ.js';
8
- export { MAX_COMPOSITION_DEPTH, OPFCompositionError, chartColorForFill, colorContrast, composeSlide, fitList, fitRichText, fitText, layoutCode, layoutFurniture, layoutMetric, layoutQuote, layoutTimeline, measureText, measureTextOutline, normalizeHexColor, placeTextLines, resolveCanvasDimensions, resolveColorRef, resolveFontFamilies, resolveTextStyle, textColorForFill, textWidthMeasurer, wrapText } from './chunk-FTWNWFIV.js';
9
- export { audience, chartType, colorScheme, fontScheme, language, layout, narrative, presentation, purpose, schemaEntries, schemaNames, schemas, socialPlatform, theme, tone } from './chunk-GN52EE3P.js';
10
- import { catalogEntries } from './chunk-6FU2KICU.js';
11
- export { audiences, catalogEntries, catalogIndexes, catalogKinds, catalogSchemaNames, catalogs, chartTypes, colorSchemes, fontSchemes, languages, layouts, narratives, purposes, socialPlatforms, themes, tones } from './chunk-6FU2KICU.js';
6
+ export { OPFPaginationError, paginatePresentation, paginateSlide } from './chunk-SMYEM3HV.js';
7
+ import { isRecord, visitContentPayloads, bareIdPattern } from './chunk-DJRZMGKY.js';
8
+ export { OPFValidationError, assertValid, assertValidCatalogRecord, assertValidPresentation, validate, validateCatalogRecord, validatePresentation } from './chunk-DJRZMGKY.js';
9
+ import { resolveFontSchemeReference, DEFAULT_FONT_SCHEME, resolveFontFamilies } from './chunk-BVLWFMDX.js';
10
+ export { DEFAULT_FONT_SCHEME, DEFAULT_FURNITURE_DATE_FORMAT, DEFAULT_SLIDE_NUMBER_FORMAT, MAX_COMPOSITION_DEPTH, OPFCompositionError, chartColorForFill, colorContrast, composeSlide, fitList, fitRichText, fitText, formatFurnitureDate, formatSlideNumber, layoutCode, layoutFurniture, layoutMetric, layoutQuote, layoutTimeline, measureText, measureTextOutline, normalizeHexColor, placeTextLines, resolveCanvasDimensions, resolveColorRef, resolveFontFamilies, resolveFontSchemeReference, resolveSocialProfile, resolveTextStyle, textColorForFill, textWidthMeasurer, wrapText } from './chunk-BVLWFMDX.js';
11
+ export { audience, chartType, colorScheme, fontScheme, language, layout, narrative, presentation, purpose, schemaEntries, schemaNames, schemas, socialPlatform, theme, tone } from './chunk-LTSDDBNW.js';
12
+ import { catalogs, catalogEntries } from './chunk-7LF37SG3.js';
13
+ export { audiences, catalogEntries, catalogIndexes, catalogKinds, catalogSchemaNames, catalogs, chartTypes, colorSchemes, fontSchemes, languages, layouts, narratives, purposes, socialPlatforms, themes, tones } from './chunk-7LF37SG3.js';
12
14
 
13
15
  // src/bundle.ts
14
16
  function reportKey(kind, id) {
@@ -71,8 +73,11 @@ function collectDocumentReferences(collector, document) {
71
73
  addReference(collector, "tones", document.tone, false);
72
74
  addReference(collector, "purposes", document.purpose, false);
73
75
  collectLanguageReferences(collector, document.language);
74
- const audiences2 = Array.isArray(document.audience) ? document.audience : [document.audience];
75
- for (const entry of audiences2) addReference(collector, "audiences", entry, false);
76
+ if (Array.isArray(document.audience)) {
77
+ for (const entry of document.audience) addReference(collector, "audiences", entry, true);
78
+ } else {
79
+ addReference(collector, "audiences", document.audience, typeof document.audience === "string");
80
+ }
76
81
  collectDesignReferences(collector, document.design);
77
82
  collectSocialReferences(collector, document.organization);
78
83
  collectSocialReferences(collector, document.speaker);
@@ -204,4 +209,267 @@ function bundlePresentation(value) {
204
209
  return { presentation: presentation2, report };
205
210
  }
206
211
 
207
- export { bundlePresentation };
212
+ // src/script-fonts.ts
213
+ var eastAsianScripts = /* @__PURE__ */ new Set(["Hani", "Hans", "Hant", "Hanb", "Jpan", "Kore", "Hang", "Jamo", "Hira", "Kana", "Hrkt", "Bopo", "Yiii"]);
214
+ var complexScripts = /* @__PURE__ */ new Set([
215
+ "Arab",
216
+ "Hebr",
217
+ "Syrc",
218
+ "Thaa",
219
+ "Nkoo",
220
+ "Adlm",
221
+ "Rohg",
222
+ "Mand",
223
+ "Samr",
224
+ "Deva",
225
+ "Beng",
226
+ "Guru",
227
+ "Gujr",
228
+ "Orya",
229
+ "Taml",
230
+ "Telu",
231
+ "Knda",
232
+ "Mlym",
233
+ "Sinh",
234
+ "Thai",
235
+ "Laoo",
236
+ "Tibt",
237
+ "Mymr",
238
+ "Khmr",
239
+ "Mong",
240
+ "Bali",
241
+ "Java",
242
+ "Lana",
243
+ "Tale",
244
+ "Talu",
245
+ "Cakm",
246
+ "Olck"
247
+ ]);
248
+ var rtlScripts = /* @__PURE__ */ new Set(["Arab", "Hebr", "Syrc", "Thaa", "Nkoo", "Adlm", "Rohg", "Mand", "Samr"]);
249
+ var latinSlotScripts = /* @__PURE__ */ new Set(["Latn", "Cyrl", "Grek", "Zyyy", "Zzzz"]);
250
+ var deprecatedLanguages = { iw: "he", in: "id", ji: "yi" };
251
+ var matchingLanguages = { ...deprecatedLanguages, no: "nb", zsm: "ms", ku: "kmr" };
252
+ var likelyScripts = {
253
+ zh: { script: "Hans", regions: { TW: "Hant", HK: "Hant", MO: "Hant" } },
254
+ sr: { script: "Cyrl", regions: { ME: "Latn" } },
255
+ pa: { script: "Guru", regions: { PK: "Arab" } },
256
+ az: { script: "Latn", regions: { IR: "Arab" } },
257
+ uz: { script: "Latn", regions: { AF: "Arab" } },
258
+ bs: { script: "Latn" },
259
+ mn: { script: "Cyrl", regions: { CN: "Mong" } },
260
+ ms: { script: "Latn" }
261
+ };
262
+ var bareLanguageId = /^[a-z][a-z0-9-]*$/;
263
+ var strongRtl = /[\u200F\u061C]|(?=\p{L})[\p{Script=Arabic}\p{Script=Hebrew}\p{Script=Syriac}\p{Script=Thaana}\p{Script=Nko}\p{Script=Adlam}\p{Script=Hanifi_Rohingya}\p{Script=Mandaic}\p{Script=Samaritan}\p{Script=Mende_Kikakui}\p{Script=Imperial_Aramaic}\p{Script=Phoenician}\p{Script=Kharoshthi}\p{Script=Old_South_Arabian}\p{Script=Old_North_Arabian}\p{Script=Avestan}\p{Script=Inscriptional_Parthian}\p{Script=Inscriptional_Pahlavi}\p{Script=Psalter_Pahlavi}\p{Script=Old_Turkic}\p{Script=Old_Hungarian}\p{Script=Nabataean}\p{Script=Palmyrene}\p{Script=Hatran}\p{Script=Manichaean}\p{Script=Sogdian}\p{Script=Old_Sogdian}\p{Script=Elymaic}\p{Script=Chorasmian}\p{Script=Yezidi}\p{Script=Cypriot}\p{Script=Lydian}\p{Script=Meroitic_Cursive}\p{Script=Meroitic_Hieroglyphs}\u{10F70}-\u{10FAF}\u{10D40}-\u{10D8F}]/u;
264
+ var strongLtr = /[\u200E\p{L}\p{Nl}]/u;
265
+ function paragraphDirection(text2, deckDirection) {
266
+ if (deckDirection !== "rtl") return "ltr";
267
+ let isolates = 0;
268
+ for (const char of String(text2 ?? "")) {
269
+ if (char === "\u2066" || char === "\u2067" || char === "\u2068") isolates += 1;
270
+ else if (char === "\u2069") isolates = Math.max(0, isolates - 1);
271
+ else if (isolates === 0) {
272
+ if (strongRtl.test(char)) return "rtl";
273
+ if (strongLtr.test(char)) return "ltr";
274
+ }
275
+ }
276
+ return "rtl";
277
+ }
278
+ function scriptFontRole(script) {
279
+ const code = normalizeScript(script);
280
+ if (code && eastAsianScripts.has(code)) return "eastAsian";
281
+ if (code && complexScripts.has(code)) return "complexScript";
282
+ return "latin";
283
+ }
284
+ function normalizeScript(value) {
285
+ if (typeof value !== "string" || !/^[A-Za-z]{4}$/.test(value)) return void 0;
286
+ return value.slice(0, 1).toUpperCase() + value.slice(1).toLowerCase();
287
+ }
288
+ function text(value) {
289
+ return typeof value === "string" && value.trim() !== "" ? value.trim() : void 0;
290
+ }
291
+ var tagSyntax = /^[A-Za-z]{2,8}(?:-[A-Za-z0-9]{1,8})*$/;
292
+ function splitTag(tag) {
293
+ if (!tagSyntax.test(tag)) return void 0;
294
+ const [first = "", ...rest] = tag.split("-");
295
+ const language2 = first.toLowerCase();
296
+ if (language2 === "und") return void 0;
297
+ let script;
298
+ let region;
299
+ for (const subtag of rest) {
300
+ if (subtag.length === 1) break;
301
+ if (!script && !region && /^[A-Za-z]{4}$/.test(subtag)) script = normalizeScript(subtag);
302
+ else if (!region && /^(?:[A-Za-z]{2}|\d{3})$/.test(subtag)) region = subtag.toUpperCase();
303
+ }
304
+ return { language: language2, script, region };
305
+ }
306
+ function canonicalTag(tag) {
307
+ let extension = false;
308
+ return tag.split("-").map((subtag, index) => {
309
+ const lower = subtag.toLowerCase();
310
+ if (index === 0) return deprecatedLanguages[lower] ?? lower;
311
+ if (extension) return lower;
312
+ if (subtag.length === 1) {
313
+ extension = true;
314
+ return lower;
315
+ }
316
+ if (/^[A-Za-z]{4}$/.test(subtag)) return normalizeScript(subtag);
317
+ if (/^[A-Za-z]{2}$/.test(subtag)) return subtag.toUpperCase();
318
+ return lower;
319
+ }).join("-");
320
+ }
321
+ function vendoredScript(language2, region) {
322
+ const entry = likelyScripts[language2];
323
+ return entry ? (region && entry.regions?.[region]) ?? entry.script : void 0;
324
+ }
325
+ function inferScript(tag) {
326
+ const parts = splitTag(tag);
327
+ if (!parts) return void 0;
328
+ const known = parts.script ?? vendoredScript(matchingLanguages[parts.language] ?? parts.language, parts.region);
329
+ if (known) return known;
330
+ try {
331
+ return normalizeScript(new Intl.Locale(tag).maximize().script);
332
+ } catch {
333
+ return void 0;
334
+ }
335
+ }
336
+ function inlineRecords(document, kind) {
337
+ const kinds = isRecord(document.catalogs) ? document.catalogs : {};
338
+ const entry = kinds[kind];
339
+ return isRecord(entry) && Array.isArray(entry.records) ? entry.records.filter(isRecord) : [];
340
+ }
341
+ function allRecords(document, kind) {
342
+ return [...inlineRecords(document, kind), ...catalogs[kind]];
343
+ }
344
+ function resolveReference(lookup, kind, reference) {
345
+ if (typeof reference === "string") return lookup(kind, reference);
346
+ if (!isRecord(reference)) return void 0;
347
+ const base = typeof reference.id === "string" ? lookup(kind, reference.id) : void 0;
348
+ return { ...base, ...reference };
349
+ }
350
+ function matchLanguageTag(document, tag) {
351
+ const wanted = splitTag(tag);
352
+ if (!wanted) return void 0;
353
+ const records = allRecords(document, "languages").filter((record) => typeof record.bcp47 === "string");
354
+ const key = canonicalTag(tag).toLowerCase();
355
+ const exact = records.find((record) => canonicalTag(record.bcp47).toLowerCase() === key);
356
+ if (exact) return exact;
357
+ const language2 = matchingLanguages[wanted.language] ?? wanted.language;
358
+ const script = wanted.script ?? vendoredScript(language2, wanted.region);
359
+ const candidates = records.flatMap((record) => {
360
+ const parts = splitTag(record.bcp47);
361
+ if (!parts || (matchingLanguages[parts.language] ?? parts.language) !== language2) return [];
362
+ const recordScript = normalizeScript(record.script) ?? parts.script ?? vendoredScript(language2, parts.region);
363
+ if (script && recordScript && script !== recordScript) return [];
364
+ return [{ record, region: parts.region }];
365
+ });
366
+ return candidates.find((candidate) => wanted.region && candidate.region === wanted.region)?.record ?? candidates.find((candidate) => !candidate.region)?.record ?? candidates[0]?.record;
367
+ }
368
+ function resolveLanguage(document, lookup, reference) {
369
+ if (typeof reference === "string") {
370
+ const value = reference.trim();
371
+ const byId = bareLanguageId.test(value) ? lookup("languages", value) : void 0;
372
+ if (byId) return { record: byId, languageId: value };
373
+ if (/^[a-z][a-z0-9+.-]*:/i.test(value) || !splitTag(value)) return void 0;
374
+ const matched = matchLanguageTag(document, value);
375
+ if (matched) return { record: matched, authoredTag: value, languageId: text(matched.id) };
376
+ return inferScript(value) ? { record: {}, authoredTag: value } : void 0;
377
+ }
378
+ if (!isRecord(reference)) return void 0;
379
+ const authoredTag = text(reference.bcp47);
380
+ if (authoredTag !== void 0 && !splitTag(authoredTag)) return void 0;
381
+ const base = typeof reference.id === "string" ? lookup("languages", reference.id) : authoredTag ? matchLanguageTag(document, authoredTag) : void 0;
382
+ const record = { ...base, ...reference };
383
+ const tag = text(record.bcp47);
384
+ if (!tag || !splitTag(tag)) return void 0;
385
+ return { record, authoredTag, authoredOoxmlLang: text(reference.ooxmlLang), languageId: text(base?.id) };
386
+ }
387
+ function pairFamilies(value) {
388
+ if (!isRecord(value)) return void 0;
389
+ const major = text(value.major);
390
+ const minor = text(value.minor);
391
+ const heading = major ?? minor;
392
+ const body = minor ?? major;
393
+ return heading && body ? { heading, body } : void 0;
394
+ }
395
+ function schemeServesLanguage(scheme, language2) {
396
+ const entries = Array.isArray(scheme.languages) ? scheme.languages.filter((entry) => typeof entry === "string") : [];
397
+ if (entries.length === 0) return true;
398
+ const name = text(language2.name)?.toLowerCase();
399
+ if (!name) return false;
400
+ const base = name.replace(/\s*\([^)]*\)\s*$/, "");
401
+ return entries.some((entry) => {
402
+ const value = entry.trim().toLowerCase();
403
+ return value === name || value === base;
404
+ });
405
+ }
406
+ function resolveScriptFonts(input, options = {}) {
407
+ const document = isRecord(input) ? input : {};
408
+ const lookup = (kind, id) => inlineRecords(document, kind).find((record2) => record2.id === id) ?? catalogs[kind].find((record2) => record2.id === id);
409
+ let design = isRecord(document.design) ? document.design : {};
410
+ if (options.slideIndex !== void 0) {
411
+ const slides = Array.isArray(document.slides) ? document.slides : [];
412
+ if (!Number.isInteger(options.slideIndex) || options.slideIndex < 0 || options.slideIndex >= slides.length) {
413
+ throw new RangeError(`slideIndex must be an integer between 0 and ${slides.length - 1}.`);
414
+ }
415
+ const slide = slides[options.slideIndex];
416
+ if (isRecord(slide) && isRecord(slide.design)) design = { ...design, ...slide.design };
417
+ }
418
+ const theme2 = resolveReference(lookup, "themes", design.theme ?? "minimal") ?? {};
419
+ const scheme = resolveFontSchemeReference(design.fontScheme ?? theme2.fontScheme ?? DEFAULT_FONT_SCHEME, (id) => lookup("fontSchemes", id)).scheme;
420
+ const latin = resolveFontFamilies(scheme);
421
+ const fromOption = options.language !== void 0 ? resolveLanguage(document, lookup, options.language) : void 0;
422
+ const fromDocument = fromOption ? void 0 : resolveLanguage(document, lookup, document.language);
423
+ const requestedDefault = text(options.defaultLanguage);
424
+ const fallbackTag = requestedDefault && splitTag(requestedDefault) ? requestedDefault : "en-US";
425
+ const language2 = fromOption ?? fromDocument ?? resolveLanguage(document, lookup, fallbackTag) ?? { record: {}, authoredTag: fallbackTag };
426
+ const languageSource = fromOption ? "option" : fromDocument ? "document" : "default";
427
+ const record = language2.record;
428
+ const bcp47 = canonicalTag(language2.authoredTag ?? text(record.bcp47) ?? fallbackTag);
429
+ const curated = text(record.ooxmlLang);
430
+ const lang = language2.authoredOoxmlLang ? canonicalTag(language2.authoredOoxmlLang) : language2.authoredTag && splitTag(language2.authoredTag)?.region ? canonicalTag(language2.authoredTag) : curated ? canonicalTag(curated) : bcp47;
431
+ const parts = splitTag(bcp47);
432
+ const script = normalizeScript(record.script) ?? (language2.languageId ? parts?.script ?? (parts ? vendoredScript(matchingLanguages[parts.language] ?? parts.language, parts.region) : void 0) ?? normalizeScript(matchLanguageTag({}, bcp47)?.script) : inferScript(bcp47)) ?? "Zzzz";
433
+ const scriptRole = scriptFontRole(script);
434
+ const declaredDirection = record.direction;
435
+ const direction = declaredDirection === "rtl" || declaredDirection === "ltr" ? declaredDirection : rtlScripts.has(script) ? "rtl" : "ltr";
436
+ const app = options.app ?? "PowerPoint";
437
+ const preferred = app === "Google Slides" ? record.googleFontScheme : record.fontScheme;
438
+ const alternate = app === "Google Slides" ? record.fontScheme : record.googleFontScheme;
439
+ const languageScheme = resolveReference(lookup, "fontSchemes", preferred) ?? resolveReference(lookup, "fontSchemes", alternate);
440
+ const languageFamilies = pairFamilies(languageScheme);
441
+ const schemeAdmitsLanguage = schemeServesLanguage(scheme, record);
442
+ const slot = (role, family) => {
443
+ const explicit = pairFamilies(scheme[role]);
444
+ if (explicit) return { ...explicit, source: "fontScheme" };
445
+ if (scheme.languageFamily === family && schemeAdmitsLanguage) return { ...latin, source: "schemeFamily" };
446
+ if (scriptRole === role && languageFamilies) return { ...languageFamilies, source: "language" };
447
+ return { heading: latin.heading, body: latin.body, source: "latin" };
448
+ };
449
+ const eastAsian = slot("eastAsian", "ea");
450
+ const complexScript = slot("complexScript", "cs");
451
+ const heading = { latin: latin.heading, eastAsian: eastAsian.heading, complexScript: complexScript.heading };
452
+ const body = { latin: latin.body, eastAsian: eastAsian.body, complexScript: complexScript.body };
453
+ let supplement;
454
+ if (!latinSlotScripts.has(script)) {
455
+ const families = scriptRole === "latin" ? languageFamilies : (scriptRole === "eastAsian" ? eastAsian : complexScript).source === "latin" ? void 0 : { heading: heading[scriptRole], body: body[scriptRole] };
456
+ if (families) supplement = { script: script === "Kore" ? "Hang" : script, heading: families.heading, body: families.body };
457
+ }
458
+ return {
459
+ ...body,
460
+ lang,
461
+ bcp47,
462
+ ...language2.languageId ? { languageId: language2.languageId } : {},
463
+ languageSource,
464
+ script,
465
+ scriptRole,
466
+ direction,
467
+ rtl: direction === "rtl",
468
+ heading,
469
+ body,
470
+ ...supplement ? { supplement } : {},
471
+ sources: { eastAsian: eastAsian.source, complexScript: complexScript.source }
472
+ };
473
+ }
474
+
475
+ export { bundlePresentation, paragraphDirection, resolveScriptFonts, scriptFontRole };
package/dist/lint.d.ts CHANGED
@@ -1,7 +1,7 @@
1
- import { C as CatalogKind } from './catalogs-atkOF4Vy.js';
1
+ import { C as CatalogKind } from './catalogs-DJ-B5ZyD.js';
2
2
  import { ValidationIssue } from './validator.js';
3
- import { J as JsonPrimitive } from './schemas-CiVmUT2p.js';
4
- import './presentation-Ct42Mitb.js';
3
+ import { J as JsonPrimitive } from './schemas-X_NniU4A.js';
4
+ import './presentation-bceTClm8.js';
5
5
 
6
6
  type LintSeverity = 'error' | 'warning' | 'info';
7
7
  interface LintLocation {
package/dist/lint.js CHANGED
@@ -1,5 +1,5 @@
1
- export { lintPresentation, lintSource } from './chunk-EQHZ3ZO4.js';
2
- import './chunk-CHKJ4QHQ.js';
3
- import './chunk-FTWNWFIV.js';
4
- import './chunk-GN52EE3P.js';
5
- import './chunk-6FU2KICU.js';
1
+ export { lintPresentation, lintSource } from './chunk-K7IWYODS.js';
2
+ import './chunk-DJRZMGKY.js';
3
+ import './chunk-BVLWFMDX.js';
4
+ import './chunk-LTSDDBNW.js';
5
+ import './chunk-7LF37SG3.js';
@@ -1,4 +1,4 @@
1
- import { w as LayoutDiagnostic, h as ComposeSlideOptions, a1 as TextMeasurement } from './composition-Tv9Wm3Oh.js';
1
+ import { L as LayoutDiagnostic, C as ComposeSlideOptions, T as TextMeasurement, F as FontSchemeDiagnostic } from './composition-DzLwY-Mi.js';
2
2
 
3
3
  interface PaginationOptions extends ComposeSlideOptions {
4
4
  /** Readability floor used while choosing page breaks. Default 24 reference pixels. */
@@ -41,8 +41,12 @@ interface PresentationPaginationOptions {
41
41
  textRasterPadding?: number;
42
42
  minFontSize?: number;
43
43
  maxSlides?: number;
44
+ /** Host-supplied current calendar date (ISO YYYY-MM-DD) for `date: true` header/footer fields. */
45
+ date?: string;
44
46
  /** Optional host-resolved layout/canvas overrides for each source slide. */
45
47
  slideOptions?: (slide: Record<string, any>, index: number) => ComposeSlideOptions;
48
+ /** Receives `unresolved-font-scheme` once per reference path when a font-scheme id matches no record. */
49
+ onDiagnostic?: (diagnostic: FontSchemeDiagnostic) => void;
46
50
  }
47
51
  interface PresentationPaginationResult {
48
52
  presentation: Record<string, any>;
@@ -1,5 +1,5 @@
1
- export { OPFPaginationError, paginatePresentation, paginateSlide } from './chunk-FWA5XB45.js';
2
- import './chunk-CHKJ4QHQ.js';
3
- import './chunk-FTWNWFIV.js';
4
- import './chunk-GN52EE3P.js';
5
- import './chunk-6FU2KICU.js';
1
+ export { OPFPaginationError, paginatePresentation, paginateSlide } from './chunk-SMYEM3HV.js';
2
+ import './chunk-DJRZMGKY.js';
3
+ import './chunk-BVLWFMDX.js';
4
+ import './chunk-LTSDDBNW.js';
5
+ import './chunk-7LF37SG3.js';