postext 1.24.0 → 1.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (331) hide show
  1. package/dist/__tests__/bundle/cjkRulesPin.test.d.ts +2 -0
  2. package/dist/__tests__/bundle/cjkRulesPin.test.d.ts.map +1 -0
  3. package/dist/__tests__/bundle/cjkRulesPin.test.js +78 -0
  4. package/dist/__tests__/bundle/cjkRulesPin.test.js.map +1 -0
  5. package/dist/__tests__/bundle/designOverflowPin.test.js +4 -2
  6. package/dist/__tests__/bundle/designOverflowPin.test.js.map +1 -1
  7. package/dist/__tests__/bundle/flowColumnsPin.test.d.ts +2 -0
  8. package/dist/__tests__/bundle/flowColumnsPin.test.d.ts.map +1 -0
  9. package/dist/__tests__/bundle/flowColumnsPin.test.js +40 -0
  10. package/dist/__tests__/bundle/flowColumnsPin.test.js.map +1 -0
  11. package/dist/__tests__/bundle/gridBalancingPin.test.d.ts +2 -0
  12. package/dist/__tests__/bundle/gridBalancingPin.test.d.ts.map +1 -0
  13. package/dist/__tests__/bundle/gridBalancingPin.test.js +53 -0
  14. package/dist/__tests__/bundle/gridBalancingPin.test.js.map +1 -0
  15. package/dist/__tests__/bundle/inlineTableSplitPin.test.d.ts +2 -0
  16. package/dist/__tests__/bundle/inlineTableSplitPin.test.d.ts.map +1 -0
  17. package/dist/__tests__/bundle/inlineTableSplitPin.test.js +43 -0
  18. package/dist/__tests__/bundle/inlineTableSplitPin.test.js.map +1 -0
  19. package/dist/__tests__/bundle/openerHeadFloatsPin.test.d.ts +2 -0
  20. package/dist/__tests__/bundle/openerHeadFloatsPin.test.d.ts.map +1 -0
  21. package/dist/__tests__/bundle/openerHeadFloatsPin.test.js +50 -0
  22. package/dist/__tests__/bundle/openerHeadFloatsPin.test.js.map +1 -0
  23. package/dist/__tests__/bundle.test.js +11 -1
  24. package/dist/__tests__/bundle.test.js.map +1 -1
  25. package/dist/__tests__/cjk/annotationsRender.test.js +5 -2
  26. package/dist/__tests__/cjk/annotationsRender.test.js.map +1 -1
  27. package/dist/__tests__/cjk/circledNumbers.test.d.ts +2 -0
  28. package/dist/__tests__/cjk/circledNumbers.test.d.ts.map +1 -0
  29. package/dist/__tests__/cjk/circledNumbers.test.js +83 -0
  30. package/dist/__tests__/cjk/circledNumbers.test.js.map +1 -0
  31. package/dist/__tests__/cjk/gridBalancing.test.d.ts +2 -0
  32. package/dist/__tests__/cjk/gridBalancing.test.d.ts.map +1 -0
  33. package/dist/__tests__/cjk/gridBalancing.test.js +227 -0
  34. package/dist/__tests__/cjk/gridBalancing.test.js.map +1 -0
  35. package/dist/__tests__/cjk/justifyRender.test.js +2 -1
  36. package/dist/__tests__/cjk/justifyRender.test.js.map +1 -1
  37. package/dist/__tests__/cjk/titleBreaks.test.d.ts +2 -0
  38. package/dist/__tests__/cjk/titleBreaks.test.d.ts.map +1 -0
  39. package/dist/__tests__/cjk/titleBreaks.test.js +76 -0
  40. package/dist/__tests__/cjk/titleBreaks.test.js.map +1 -0
  41. package/dist/__tests__/cjk/wordJoiner.test.js +13 -4
  42. package/dist/__tests__/cjk/wordJoiner.test.js.map +1 -1
  43. package/dist/__tests__/codeBlocks.test.js +1 -1
  44. package/dist/__tests__/design/cjkDesignText.test.d.ts +2 -0
  45. package/dist/__tests__/design/cjkDesignText.test.d.ts.map +1 -0
  46. package/dist/__tests__/design/cjkDesignText.test.js +130 -0
  47. package/dist/__tests__/design/cjkDesignText.test.js.map +1 -0
  48. package/dist/__tests__/design/cjkDesignTextRender.test.d.ts +2 -0
  49. package/dist/__tests__/design/cjkDesignTextRender.test.d.ts.map +1 -0
  50. package/dist/__tests__/design/cjkDesignTextRender.test.js +100 -0
  51. package/dist/__tests__/design/cjkDesignTextRender.test.js.map +1 -0
  52. package/dist/__tests__/exports.test.js +49 -0
  53. package/dist/__tests__/exports.test.js.map +1 -1
  54. package/dist/__tests__/hardBreaks.test.js +1 -1
  55. package/dist/__tests__/headingInlineMarks.test.js +1 -1
  56. package/dist/__tests__/headingNumberSpans.test.d.ts +2 -0
  57. package/dist/__tests__/headingNumberSpans.test.d.ts.map +1 -0
  58. package/dist/__tests__/headingNumberSpans.test.js +96 -0
  59. package/dist/__tests__/headingNumberSpans.test.js.map +1 -0
  60. package/dist/__tests__/mathSizeMigration.test.js +2 -2
  61. package/dist/__tests__/multipleColumns.test.js +207 -0
  62. package/dist/__tests__/multipleColumns.test.js.map +1 -1
  63. package/dist/__tests__/parse/citations.test.js +29 -0
  64. package/dist/__tests__/parse/citations.test.js.map +1 -1
  65. package/dist/__tests__/pipeline/calloutInlineResourceGap.test.js +10 -6
  66. package/dist/__tests__/pipeline/calloutInlineResourceGap.test.js.map +1 -1
  67. package/dist/__tests__/pipeline/calloutOverflow.test.js +4 -2
  68. package/dist/__tests__/pipeline/calloutOverflow.test.js.map +1 -1
  69. package/dist/__tests__/pipeline/calloutSplitMinLinesChild.test.js +1 -1
  70. package/dist/__tests__/pipeline/calloutTallKeepTogether.test.js +6 -5
  71. package/dist/__tests__/pipeline/calloutTallKeepTogether.test.js.map +1 -1
  72. package/dist/__tests__/pipeline/colonListRoom.test.js +1 -1
  73. package/dist/__tests__/pipeline/compoundBreaks.test.js +1 -1
  74. package/dist/__tests__/pipeline/dashBreaks.test.js +1 -1
  75. package/dist/__tests__/pipeline/floatCitingPage.test.d.ts +2 -0
  76. package/dist/__tests__/pipeline/floatCitingPage.test.d.ts.map +1 -0
  77. package/dist/__tests__/pipeline/floatCitingPage.test.js +241 -0
  78. package/dist/__tests__/pipeline/floatCitingPage.test.js.map +1 -0
  79. package/dist/__tests__/pipeline/floatOverInlineResource.test.js +18 -6
  80. package/dist/__tests__/pipeline/floatOverInlineResource.test.js.map +1 -1
  81. package/dist/__tests__/pipeline/floatPlacement.test.js +3 -3
  82. package/dist/__tests__/pipeline/floatPlacement.test.js.map +1 -1
  83. package/dist/__tests__/pipeline/flowColumns.test.d.ts +2 -0
  84. package/dist/__tests__/pipeline/flowColumns.test.d.ts.map +1 -0
  85. package/dist/__tests__/pipeline/flowColumns.test.js +261 -0
  86. package/dist/__tests__/pipeline/flowColumns.test.js.map +1 -0
  87. package/dist/__tests__/pipeline/headingKeepFitEps.test.d.ts +2 -0
  88. package/dist/__tests__/pipeline/headingKeepFitEps.test.d.ts.map +1 -0
  89. package/dist/__tests__/pipeline/headingKeepFitEps.test.js +83 -0
  90. package/dist/__tests__/pipeline/headingKeepFitEps.test.js.map +1 -0
  91. package/dist/__tests__/pipeline/headingSplitOrphans.test.js +1 -1
  92. package/dist/__tests__/pipeline/inlineFigureSpace.test.js +1 -1
  93. package/dist/__tests__/pipeline/inlineTableSplit.test.d.ts +2 -0
  94. package/dist/__tests__/pipeline/inlineTableSplit.test.d.ts.map +1 -0
  95. package/dist/__tests__/pipeline/inlineTableSplit.test.js +238 -0
  96. package/dist/__tests__/pipeline/inlineTableSplit.test.js.map +1 -0
  97. package/dist/__tests__/pipeline/paragraphContainerTail.test.js +1 -1
  98. package/dist/__tests__/pipeline/raggedOptimal.test.js +1 -1
  99. package/dist/__tests__/pipeline/resolvedPaletteCopy.test.js +3 -2
  100. package/dist/__tests__/pipeline/resolvedPaletteCopy.test.js.map +1 -1
  101. package/dist/__tests__/pipeline/sideBoxAfterText.test.d.ts +2 -0
  102. package/dist/__tests__/pipeline/sideBoxAfterText.test.d.ts.map +1 -0
  103. package/dist/__tests__/pipeline/sideBoxAfterText.test.js +163 -0
  104. package/dist/__tests__/pipeline/sideBoxAfterText.test.js.map +1 -0
  105. package/dist/__tests__/prepareFonts.test.d.ts +2 -0
  106. package/dist/__tests__/prepareFonts.test.d.ts.map +1 -0
  107. package/dist/__tests__/prepareFonts.test.js +358 -0
  108. package/dist/__tests__/prepareFonts.test.js.map +1 -0
  109. package/dist/__tests__/svgFonts.test.d.ts +2 -0
  110. package/dist/__tests__/svgFonts.test.d.ts.map +1 -0
  111. package/dist/__tests__/svgFonts.test.js +286 -0
  112. package/dist/__tests__/svgFonts.test.js.map +1 -0
  113. package/dist/__tests__/verseLines.test.js +1 -1
  114. package/dist/__tests__/vertical/measurePaint.test.js +16 -0
  115. package/dist/__tests__/vertical/measurePaint.test.js.map +1 -1
  116. package/dist/bundle/adapters.d.ts +31 -7
  117. package/dist/bundle/adapters.d.ts.map +1 -1
  118. package/dist/bundle/adapters.js +113 -34
  119. package/dist/bundle/adapters.js.map +1 -1
  120. package/dist/bundle/codec.d.ts.map +1 -1
  121. package/dist/bundle/codec.js +1 -0
  122. package/dist/bundle/codec.js.map +1 -1
  123. package/dist/bundle/configVersion.d.ts +127 -10
  124. package/dist/bundle/configVersion.d.ts.map +1 -1
  125. package/dist/bundle/configVersion.js +260 -9
  126. package/dist/bundle/configVersion.js.map +1 -1
  127. package/dist/bundle/index.d.ts +3 -3
  128. package/dist/bundle/index.d.ts.map +1 -1
  129. package/dist/bundle/index.js +2 -2
  130. package/dist/bundle/index.js.map +1 -1
  131. package/dist/bundle/manifest.d.ts.map +1 -1
  132. package/dist/bundle/manifest.js +3 -2
  133. package/dist/bundle/manifest.js.map +1 -1
  134. package/dist/bundle/types.d.ts +4 -0
  135. package/dist/bundle/types.d.ts.map +1 -1
  136. package/dist/canvas-backend/headerFooter.d.ts.map +1 -1
  137. package/dist/canvas-backend/headerFooter.js +3 -1
  138. package/dist/canvas-backend/headerFooter.js.map +1 -1
  139. package/dist/columnRule.d.ts.map +1 -1
  140. package/dist/columnRule.js +5 -2
  141. package/dist/columnRule.js.map +1 -1
  142. package/dist/configWarnings.js +1 -1
  143. package/dist/configWarnings.js.map +1 -1
  144. package/dist/defaults/cjk.d.ts +2 -1
  145. package/dist/defaults/cjk.d.ts.map +1 -1
  146. package/dist/defaults/cjk.js +17 -1
  147. package/dist/defaults/cjk.js.map +1 -1
  148. package/dist/defaults/diagramStyle.d.ts.map +1 -1
  149. package/dist/defaults/diagramStyle.js +6 -0
  150. package/dist/defaults/diagramStyle.js.map +1 -1
  151. package/dist/defaults/headings.d.ts.map +1 -1
  152. package/dist/defaults/headings.js +3 -0
  153. package/dist/defaults/headings.js.map +1 -1
  154. package/dist/defaults/index.d.ts +1 -1
  155. package/dist/defaults/index.d.ts.map +1 -1
  156. package/dist/defaults/index.js +1 -1
  157. package/dist/defaults/index.js.map +1 -1
  158. package/dist/defaults/layout.d.ts +5 -0
  159. package/dist/defaults/layout.d.ts.map +1 -1
  160. package/dist/defaults/layout.js +32 -0
  161. package/dist/defaults/layout.js.map +1 -1
  162. package/dist/defaults/tableStyle.d.ts.map +1 -1
  163. package/dist/defaults/tableStyle.js +6 -0
  164. package/dist/defaults/tableStyle.js.map +1 -1
  165. package/dist/design/cjkText.d.ts +34 -0
  166. package/dist/design/cjkText.d.ts.map +1 -0
  167. package/dist/design/cjkText.js +82 -0
  168. package/dist/design/cjkText.js.map +1 -0
  169. package/dist/design/layout.d.ts.map +1 -1
  170. package/dist/design/layout.js +103 -5
  171. package/dist/design/layout.js.map +1 -1
  172. package/dist/design/richText.d.ts +24 -0
  173. package/dist/design/richText.d.ts.map +1 -1
  174. package/dist/design/richText.js +37 -1
  175. package/dist/design/richText.js.map +1 -1
  176. package/dist/fonts/buildWithFonts.d.ts +19 -0
  177. package/dist/fonts/buildWithFonts.d.ts.map +1 -0
  178. package/dist/fonts/buildWithFonts.js +16 -0
  179. package/dist/fonts/buildWithFonts.js.map +1 -0
  180. package/dist/fonts/faces.d.ts +88 -0
  181. package/dist/fonts/faces.d.ts.map +1 -0
  182. package/dist/fonts/faces.js +264 -0
  183. package/dist/fonts/faces.js.map +1 -0
  184. package/dist/fonts/fontSet.d.ts +34 -0
  185. package/dist/fonts/fontSet.d.ts.map +1 -0
  186. package/dist/fonts/fontSet.js +173 -0
  187. package/dist/fonts/fontSet.js.map +1 -0
  188. package/dist/fonts/prepare.d.ts +120 -0
  189. package/dist/fonts/prepare.d.ts.map +1 -0
  190. package/dist/fonts/prepare.js +375 -0
  191. package/dist/fonts/prepare.js.map +1 -0
  192. package/dist/html-backend.d.ts +17 -0
  193. package/dist/html-backend.d.ts.map +1 -1
  194. package/dist/html-backend.js +87 -3
  195. package/dist/html-backend.js.map +1 -1
  196. package/dist/index.d.ts +25 -5
  197. package/dist/index.d.ts.map +1 -1
  198. package/dist/index.js +18 -2
  199. package/dist/index.js.map +1 -1
  200. package/dist/measure/cache.d.ts.map +1 -1
  201. package/dist/measure/cache.js +32 -2
  202. package/dist/measure/cache.js.map +1 -1
  203. package/dist/measure/canvas.d.ts +15 -0
  204. package/dist/measure/canvas.d.ts.map +1 -1
  205. package/dist/measure/canvas.js +68 -4
  206. package/dist/measure/canvas.js.map +1 -1
  207. package/dist/measure/cjk.d.ts.map +1 -1
  208. package/dist/measure/cjk.js +4 -1
  209. package/dist/measure/cjk.js.map +1 -1
  210. package/dist/measure/cjkClasses.d.ts +17 -0
  211. package/dist/measure/cjkClasses.d.ts.map +1 -1
  212. package/dist/measure/cjkClasses.js +41 -1
  213. package/dist/measure/cjkClasses.js.map +1 -1
  214. package/dist/measure/cjkCompose.d.ts.map +1 -1
  215. package/dist/measure/cjkCompose.js +119 -7
  216. package/dist/measure/cjkCompose.js.map +1 -1
  217. package/dist/measure/cjkPunctuation.d.ts +18 -1
  218. package/dist/measure/cjkPunctuation.d.ts.map +1 -1
  219. package/dist/measure/cjkPunctuation.js +13 -1
  220. package/dist/measure/cjkPunctuation.js.map +1 -1
  221. package/dist/measure/font.d.ts +8 -0
  222. package/dist/measure/font.d.ts.map +1 -1
  223. package/dist/measure/font.js +13 -2
  224. package/dist/measure/font.js.map +1 -1
  225. package/dist/measure/fontString.d.ts +14 -0
  226. package/dist/measure/fontString.d.ts.map +1 -0
  227. package/dist/measure/fontString.js +55 -0
  228. package/dist/measure/fontString.js.map +1 -0
  229. package/dist/measure/index.d.ts +4 -1
  230. package/dist/measure/index.d.ts.map +1 -1
  231. package/dist/measure/index.js +3 -1
  232. package/dist/measure/index.js.map +1 -1
  233. package/dist/measure/types.d.ts +4 -0
  234. package/dist/measure/types.d.ts.map +1 -1
  235. package/dist/measure/types.js.map +1 -1
  236. package/dist/parse/citations.d.ts.map +1 -1
  237. package/dist/parse/citations.js +7 -3
  238. package/dist/parse/citations.js.map +1 -1
  239. package/dist/pipeline/build.d.ts +36 -0
  240. package/dist/pipeline/build.d.ts.map +1 -1
  241. package/dist/pipeline/build.js +1065 -193
  242. package/dist/pipeline/build.js.map +1 -1
  243. package/dist/pipeline/buildBlockKind.d.ts.map +1 -1
  244. package/dist/pipeline/buildBlockKind.js +20 -6
  245. package/dist/pipeline/buildBlockKind.js.map +1 -1
  246. package/dist/pipeline/buildMeasurement.d.ts +6 -0
  247. package/dist/pipeline/buildMeasurement.d.ts.map +1 -1
  248. package/dist/pipeline/buildMeasurement.js +3 -2
  249. package/dist/pipeline/buildMeasurement.js.map +1 -1
  250. package/dist/pipeline/calloutLayout.d.ts +59 -0
  251. package/dist/pipeline/calloutLayout.d.ts.map +1 -1
  252. package/dist/pipeline/calloutLayout.js +287 -65
  253. package/dist/pipeline/calloutLayout.js.map +1 -1
  254. package/dist/pipeline/columnBalancing.d.ts +20 -0
  255. package/dist/pipeline/columnBalancing.d.ts.map +1 -1
  256. package/dist/pipeline/columnBalancing.js +22 -4
  257. package/dist/pipeline/columnBalancing.js.map +1 -1
  258. package/dist/pipeline/columnsGroup.d.ts +61 -0
  259. package/dist/pipeline/columnsGroup.d.ts.map +1 -0
  260. package/dist/pipeline/columnsGroup.js +88 -0
  261. package/dist/pipeline/columnsGroup.js.map +1 -0
  262. package/dist/pipeline/config.d.ts +28 -0
  263. package/dist/pipeline/config.d.ts.map +1 -1
  264. package/dist/pipeline/config.js +67 -8
  265. package/dist/pipeline/config.js.map +1 -1
  266. package/dist/pipeline/contentWarnings.d.ts.map +1 -1
  267. package/dist/pipeline/contentWarnings.js +28 -0
  268. package/dist/pipeline/contentWarnings.js.map +1 -1
  269. package/dist/pipeline/floatPlacement.d.ts +16 -2
  270. package/dist/pipeline/floatPlacement.d.ts.map +1 -1
  271. package/dist/pipeline/floatPlacement.js +12 -4
  272. package/dist/pipeline/floatPlacement.js.map +1 -1
  273. package/dist/pipeline/floatSlots.d.ts +9 -3
  274. package/dist/pipeline/floatSlots.d.ts.map +1 -1
  275. package/dist/pipeline/floatSlots.js +15 -6
  276. package/dist/pipeline/floatSlots.js.map +1 -1
  277. package/dist/pipeline/flowColumns.d.ts +41 -0
  278. package/dist/pipeline/flowColumns.d.ts.map +1 -0
  279. package/dist/pipeline/flowColumns.js +116 -0
  280. package/dist/pipeline/flowColumns.js.map +1 -0
  281. package/dist/pipeline/measureContentBlock.d.ts +13 -1
  282. package/dist/pipeline/measureContentBlock.d.ts.map +1 -1
  283. package/dist/pipeline/measureContentBlock.js +20 -5
  284. package/dist/pipeline/measureContentBlock.js.map +1 -1
  285. package/dist/pipeline/partPalette.d.ts +3 -0
  286. package/dist/pipeline/partPalette.d.ts.map +1 -1
  287. package/dist/pipeline/partPalette.js +5 -0
  288. package/dist/pipeline/partPalette.js.map +1 -1
  289. package/dist/pipeline/placement.d.ts +19 -0
  290. package/dist/pipeline/placement.d.ts.map +1 -1
  291. package/dist/pipeline/placement.js +5 -2
  292. package/dist/pipeline/placement.js.map +1 -1
  293. package/dist/pipeline/resourceLayout.d.ts +26 -0
  294. package/dist/pipeline/resourceLayout.d.ts.map +1 -1
  295. package/dist/pipeline/resourceLayout.js +53 -3
  296. package/dist/pipeline/resourceLayout.js.map +1 -1
  297. package/dist/pipeline/toc.d.ts.map +1 -1
  298. package/dist/pipeline/toc.js +6 -1
  299. package/dist/pipeline/toc.js.map +1 -1
  300. package/dist/svg/fontRegistry.d.ts +66 -0
  301. package/dist/svg/fontRegistry.d.ts.map +1 -0
  302. package/dist/svg/fontRegistry.js +294 -0
  303. package/dist/svg/fontRegistry.js.map +1 -0
  304. package/dist/svg/fonts.d.ts +140 -0
  305. package/dist/svg/fonts.d.ts.map +1 -0
  306. package/dist/svg/fonts.js +642 -0
  307. package/dist/svg/fonts.js.map +1 -0
  308. package/dist/svg/image.d.ts +44 -0
  309. package/dist/svg/image.d.ts.map +1 -0
  310. package/dist/svg/image.js +67 -0
  311. package/dist/svg/image.js.map +1 -0
  312. package/dist/types.d.ts +138 -2
  313. package/dist/types.d.ts.map +1 -1
  314. package/dist/util/stableHash.d.ts +20 -0
  315. package/dist/util/stableHash.d.ts.map +1 -0
  316. package/dist/util/stableHash.js +59 -0
  317. package/dist/util/stableHash.js.map +1 -0
  318. package/dist/vdt.d.ts +118 -3
  319. package/dist/vdt.d.ts.map +1 -1
  320. package/dist/vdt.js.map +1 -1
  321. package/dist/worker/client.d.ts +8 -0
  322. package/dist/worker/client.d.ts.map +1 -1
  323. package/dist/worker/client.js +22 -0
  324. package/dist/worker/client.js.map +1 -1
  325. package/dist/worker/fonts.d.ts +1 -13
  326. package/dist/worker/fonts.d.ts.map +1 -1
  327. package/dist/worker/fonts.js +3 -61
  328. package/dist/worker/fonts.js.map +1 -1
  329. package/dist/worker/layout.worker.js +23 -16
  330. package/dist/worker/layout.worker.js.map +1 -1
  331. package/package.json +1 -1
@@ -0,0 +1,88 @@
1
+ import type { VDTDocument } from '../vdt';
2
+ import { type FontFaceRequest } from '../measure/fontString';
3
+ export type { FontFaceRequest } from '../measure/fontString';
4
+ /** The part of a `FontFace` the engine reads. */
5
+ export interface FontFaceLike {
6
+ family: string;
7
+ /** `'400'`, `'bold'`, or a variable range `'100 900'`. */
8
+ weight: string;
9
+ /** `'normal'`, `'italic'` or `'oblique …'`. */
10
+ style: string;
11
+ status: 'unloaded' | 'loading' | 'loaded' | 'error' | string;
12
+ unicodeRange?: string;
13
+ load?(): Promise<FontFaceLike>;
14
+ }
15
+ /** The part of a `FontFaceSet` (`document.fonts`, a worker's `self.fonts`)
16
+ * the engine uses. Tests pass a fake. */
17
+ export interface FontFaceSetLike extends Iterable<FontFaceLike> {
18
+ readonly size?: number;
19
+ load(font: string, text?: string): Promise<FontFaceLike[]>;
20
+ add(face: FontFaceLike): unknown;
21
+ addEventListener?(type: 'loadingdone', listener: (event: {
22
+ fontfaces?: readonly FontFaceLike[];
23
+ }) => void): void;
24
+ removeEventListener?(type: 'loadingdone', listener: (event: {
25
+ fontfaces?: readonly FontFaceLike[];
26
+ }) => void): void;
27
+ }
28
+ /** The page's font set (`document.fonts`), a worker's (`self.fonts`), or
29
+ * undefined where there is none (Node). */
30
+ export declare function defaultFontSet(): FontFaceSetLike | undefined;
31
+ export declare function isGenericFamily(family: string): boolean;
32
+ /** A face of the font set, read once. */
33
+ export interface IndexedFace {
34
+ weight: [number, number];
35
+ style: 'normal' | 'italic';
36
+ status: string;
37
+ }
38
+ /** The faces of `fontSet`, by family (lower case); only the families in
39
+ * `families` when given. */
40
+ export declare function indexFontSet(fontSet: Iterable<FontFaceLike>, families?: ReadonlySet<string>): Map<string, IndexedFace[]>;
41
+ /** How `faces` (loaded ones) answer for a weight and slant: the face CSS
42
+ * matching picks, and whether the browser draws it bolder or slanted
43
+ * (a bold of 600 or more set from a face of 500 or less; an italic set
44
+ * from an upright face). Undefined when `faces` is empty. */
45
+ export declare function matchFace(faces: readonly IndexedFace[], weight: number, style: 'normal' | 'italic'): {
46
+ face: IndexedFace;
47
+ synthesized: boolean;
48
+ } | undefined;
49
+ /** A key per face request. */
50
+ export declare function faceRequestKey(f: FontFaceRequest): string;
51
+ /** The faces (family, weight, slant) the text of a laid-out document is
52
+ * set in: its blocks' lines and segments, list markers, drop caps,
53
+ * captions, notes and table cells, running heads, folios and design
54
+ * texts, line numbers and the lettering of comic pages. */
55
+ export declare function documentFontFaces(doc: VDTDocument): FontFaceRequest[];
56
+ /** The font families the text of a laid-out document is set in. */
57
+ export declare function documentFontFamilies(doc: VDTDocument): string[];
58
+ /**
59
+ * The families no font answers for — neither registered nor installed — so
60
+ * their text was measured with a generic fallback. A family is there when
61
+ * naming it in front of a generic family changes the width of a probe
62
+ * string for at least one of three generics.
63
+ */
64
+ export declare function unavailableFontFamilies(families: string[], measureWidth: (font: string, text: string) => number): string[];
65
+ /** Why a face fell back: no face of the family answered (`missing`), or
66
+ * the browser drew the weight or slant from another face
67
+ * (`synthesized`). */
68
+ export type FontFallbackReason = 'missing' | 'synthesized';
69
+ export interface FontFallback extends FontFaceRequest {
70
+ reason: FontFallbackReason;
71
+ }
72
+ export interface FontFallbackOptions {
73
+ /** Width of `text` in `font`, for the probe that tells an installed
74
+ * family from a missing one. Default: the engine's measuring canvas,
75
+ * when there is one. Null: no probe (a family with no face in the set
76
+ * is missing). */
77
+ measureWidth?: ((font: string, text: string) => number) | null;
78
+ }
79
+ /** Forget the probe's answers (the faces changed). */
80
+ export declare function forgetInstalledFamilies(): void;
81
+ /**
82
+ * The faces of `faces` that `fontSet` could not give: a family with no
83
+ * loaded face (and not installed, by the width probe) is `missing`; a
84
+ * weight or slant matched by a face the browser has to draw bolder or
85
+ * slanted is `synthesized`. Generic families are never reported.
86
+ */
87
+ export declare function fontFallbacks(faces: readonly FontFaceRequest[], fontSet: Iterable<FontFaceLike>, options?: FontFallbackOptions): FontFallback[];
88
+ //# sourceMappingURL=faces.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"faces.d.ts","sourceRoot":"","sources":["../../src/fonts/faces.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,264 @@
1
+ // The faces a laid-out document set its text in, and which of them the
2
+ // font set could not give (#629): a family no face answers for, or a weight
3
+ // or slant the browser makes up from another face (bold drawn heavier,
4
+ // italic slanted). Shared by the main thread and the layout worker.
5
+ import { quoteFamily } from '../measure/font';
6
+ import { measureTextWidth } from '../measure/canvas';
7
+ import { parseFontString } from '../measure/fontString';
8
+ /** The page's font set (`document.fonts`), a worker's (`self.fonts`), or
9
+ * undefined where there is none (Node). */
10
+ export function defaultFontSet() {
11
+ const g = globalThis;
12
+ return g.document?.fonts ?? g.fonts;
13
+ }
14
+ /** CSS generic families: always there, never reported. */
15
+ const GENERIC_FAMILIES = new Set([
16
+ 'serif', 'sans-serif', 'monospace', 'cursive', 'fantasy', 'system-ui', 'ui-serif', 'ui-sans-serif',
17
+ 'ui-monospace', 'ui-rounded', 'emoji', 'math', 'fangsong', '-apple-system',
18
+ ]);
19
+ export function isGenericFamily(family) {
20
+ return GENERIC_FAMILIES.has(family.trim().toLowerCase());
21
+ }
22
+ function unquote(family) {
23
+ const f = family.trim();
24
+ return /^(["']).*\1$/.test(f) ? f.slice(1, -1) : f;
25
+ }
26
+ function weightRange(weight) {
27
+ const parts = (weight ?? '400').trim().split(/\s+/).map((w) => (w === 'bold' ? 700 : w === 'normal' ? 400 : Number(w)));
28
+ const lo = Number.isFinite(parts[0]) ? parts[0] : 400;
29
+ const hi = Number.isFinite(parts[1]) ? parts[1] : lo;
30
+ return [Math.min(lo, hi), Math.max(lo, hi)];
31
+ }
32
+ /** The faces of `fontSet`, by family (lower case); only the families in
33
+ * `families` when given. */
34
+ export function indexFontSet(fontSet, families) {
35
+ const out = new Map();
36
+ for (const face of fontSet) {
37
+ const family = unquote(face.family).toLowerCase();
38
+ if (families && !families.has(family))
39
+ continue;
40
+ let list = out.get(family);
41
+ if (!list)
42
+ out.set(family, (list = []));
43
+ list.push({ weight: weightRange(face.weight), style: /italic|oblique/i.test(face.style ?? '') ? 'italic' : 'normal', status: face.status });
44
+ }
45
+ return out;
46
+ }
47
+ function distance(range, target) {
48
+ return target < range[0] ? range[0] - target : target > range[1] ? target - range[1] : 0;
49
+ }
50
+ /** The weight CSS font matching settles on among `faces` for `target`
51
+ * (CSS Fonts 4, §5.2): between 400 and 500 the weights up to 500 first,
52
+ * then lighter, then heavier; below 400 lighter first; above 500 heavier
53
+ * first. */
54
+ function matchWeight(faces, target) {
55
+ const exact = faces.find((f) => distance(f.weight, target) === 0);
56
+ if (exact)
57
+ return exact;
58
+ const lighter = faces.filter((f) => f.weight[1] < target).sort((a, b) => b.weight[1] - a.weight[1]);
59
+ const heavier = faces.filter((f) => f.weight[0] > target).sort((a, b) => a.weight[0] - b.weight[0]);
60
+ if (target >= 400 && target <= 500) {
61
+ const upTo500 = heavier.filter((f) => f.weight[0] <= 500);
62
+ return upTo500[0] ?? lighter[0] ?? heavier[0];
63
+ }
64
+ return target < 400 ? lighter[0] ?? heavier[0] : heavier[0] ?? lighter[0];
65
+ }
66
+ /** How `faces` (loaded ones) answer for a weight and slant: the face CSS
67
+ * matching picks, and whether the browser draws it bolder or slanted
68
+ * (a bold of 600 or more set from a face of 500 or less; an italic set
69
+ * from an upright face). Undefined when `faces` is empty. */
70
+ export function matchFace(faces, weight, style) {
71
+ if (faces.length === 0)
72
+ return undefined;
73
+ const sameStyle = faces.filter((f) => f.style === style);
74
+ const pool = sameStyle.length > 0 ? sameStyle : faces;
75
+ const face = matchWeight(pool, weight);
76
+ const syntheticBold = weight >= 600 && face.weight[1] <= 500;
77
+ const syntheticItalic = style === 'italic' && face.style !== 'italic';
78
+ return { face, synthesized: syntheticBold || syntheticItalic };
79
+ }
80
+ /** A key per face request. */
81
+ export function faceRequestKey(f) {
82
+ return `${f.family.toLowerCase()}|${f.weight}|${f.style}`;
83
+ }
84
+ /** The faces of a group of lines, as the renderers pick them: a segment's
85
+ * own font, else the variant of its bold and italic flags. */
86
+ function addLines(lines, normal, bold, italic, boldItalic, add) {
87
+ if (!lines || lines.length === 0)
88
+ return;
89
+ for (const line of lines) {
90
+ const segments = line.segments;
91
+ if (!segments || segments.length === 0) {
92
+ add(normal);
93
+ continue;
94
+ }
95
+ for (const seg of segments) {
96
+ add(seg.fontString ?? (seg.bold ? (seg.italic ? boldItalic ?? bold ?? italic ?? normal : bold ?? normal) : seg.italic ? italic ?? normal : normal));
97
+ // Annotations set in faces of their own (ruby, warichu, kunten, chips).
98
+ if (seg.ruby !== undefined)
99
+ walkFonts(seg.ruby, add);
100
+ if (seg.warichu !== undefined)
101
+ walkFonts(seg.warichu, add);
102
+ if (seg.kunten !== undefined)
103
+ walkFonts(seg.kunten, add);
104
+ if (seg.chip !== undefined)
105
+ walkFonts(seg.chip, add);
106
+ }
107
+ }
108
+ }
109
+ /** Keys whose object holds no font of its own (geometry, raw data,
110
+ * pictures), skipped by the walk. */
111
+ const SKIP_KEYS = new Set(['sourceMap', 'attrSources', 'bbox', 'rect', 'resource', 'config', 'svg', 'mathRender', 'math', 'path', 'paths', 'columns', 'floats', 'palette']);
112
+ /** Every `fontString`, `bulletFontString`, `separatorFontString`… under
113
+ * `node` (the variant sets `boldFontString`, `italicFontString`… are
114
+ * what a renderer may pick, not what was set: lines say which). */
115
+ function walkFonts(node, add, depth = 0) {
116
+ if (!node || typeof node !== 'object' || depth > 12)
117
+ return;
118
+ if (Array.isArray(node)) {
119
+ // Arrays of numbers (source maps, break lists) hold no font.
120
+ if (node.length > 0 && (node[0] === null || typeof node[0] !== 'object'))
121
+ return;
122
+ for (const item of node)
123
+ walkFonts(item, add, depth + 1);
124
+ return;
125
+ }
126
+ const rec = node;
127
+ for (const key in rec) {
128
+ const value = rec[key];
129
+ if (typeof value === 'string') {
130
+ if (key === 'fontString' || ((key.endsWith('FontString')) && !/(?:bold|italic|Bold|Italic)FontString$/.test(key)))
131
+ add(value);
132
+ }
133
+ else if (value && typeof value === 'object' && !SKIP_KEYS.has(key)) {
134
+ walkFonts(value, add, depth + 1);
135
+ }
136
+ }
137
+ }
138
+ /** The faces (family, weight, slant) the text of a laid-out document is
139
+ * set in: its blocks' lines and segments, list markers, drop caps,
140
+ * captions, notes and table cells, running heads, folios and design
141
+ * texts, line numbers and the lettering of comic pages. */
142
+ export function documentFontFaces(doc) {
143
+ const fonts = new Set();
144
+ let last;
145
+ const add = (font) => {
146
+ if (font === last || !font)
147
+ return;
148
+ last = font;
149
+ fonts.add(font);
150
+ };
151
+ // The blocks of the flow, and floats a page holds outside it.
152
+ const blocks = new Set(doc.blocks);
153
+ for (const page of doc.pages)
154
+ for (const b of page.floats ?? [])
155
+ blocks.add(b);
156
+ for (const block of blocks) {
157
+ addLines(block.lines, block.fontString, block.boldFontString, block.italicFontString, block.boldItalicFontString, add);
158
+ const rb = block.resourceBlock;
159
+ if (rb) {
160
+ addLines(rb.captionLines, rb.captionFontString, rb.captionBoldFontString, rb.captionItalicFontString, rb.captionBoldItalicFontString, add);
161
+ addLines(rb.noteLines, rb.noteFontString, rb.noteBoldFontString, rb.noteItalicFontString, rb.noteBoldItalicFontString, add);
162
+ const t = rb.table;
163
+ if (t) {
164
+ for (const cell of t.cells) {
165
+ if (cell.isHeader)
166
+ addLines(cell.lines, t.headerFontString, t.headerBoldFontString, t.headerItalicFontString, t.headerBoldItalicFontString, add);
167
+ else
168
+ addLines(cell.lines, t.fontString, t.boldFontString, t.italicFontString, t.boldItalicFontString, add);
169
+ }
170
+ }
171
+ walkFonts(rb, add);
172
+ }
173
+ // Markers, drop caps, heading designs and whatever else the block
174
+ // sets beside its lines (its own `fontString` only when it has lines).
175
+ for (const key in block) {
176
+ if (key === 'fontString' || key === 'lines' || key === 'resourceBlock' || SKIP_KEYS.has(key))
177
+ continue;
178
+ const value = block[key];
179
+ if (typeof value === 'string') {
180
+ if (key.endsWith('FontString') && !/(?:bold|italic|Bold|Italic)FontString$/.test(key) && block.lines.length > 0)
181
+ add(value);
182
+ }
183
+ else if (value && typeof value === 'object') {
184
+ walkFonts(value, add);
185
+ }
186
+ }
187
+ }
188
+ // Running heads, folios, opener bands, line numbers, comic lettering.
189
+ for (const page of doc.pages)
190
+ walkFonts(page, add);
191
+ const out = new Map();
192
+ for (const font of fonts) {
193
+ const face = parseFontString(font);
194
+ if (!face || isGenericFamily(face.family))
195
+ continue;
196
+ const key = faceRequestKey(face);
197
+ if (!out.has(key))
198
+ out.set(key, face);
199
+ }
200
+ return [...out.values()];
201
+ }
202
+ /** The font families the text of a laid-out document is set in. */
203
+ export function documentFontFamilies(doc) {
204
+ return [...new Set(documentFontFaces(doc).map((f) => f.family))];
205
+ }
206
+ const PROBE = 'mmmmmmmmmmlliWWQq@#0123';
207
+ const GENERICS = ['monospace', 'serif', 'sans-serif'];
208
+ /**
209
+ * The families no font answers for — neither registered nor installed — so
210
+ * their text was measured with a generic fallback. A family is there when
211
+ * naming it in front of a generic family changes the width of a probe
212
+ * string for at least one of three generics.
213
+ */
214
+ export function unavailableFontFamilies(families, measureWidth) {
215
+ return families.filter((family) => GENERICS.every((generic) => measureWidth(`72px ${quoteFamily(family)}, ${generic}`, PROBE) === measureWidth(`72px ${generic}`, PROBE)));
216
+ }
217
+ function canMeasure() {
218
+ const g = globalThis;
219
+ return typeof g.OffscreenCanvas !== 'undefined' || typeof g.document?.createElement === 'function';
220
+ }
221
+ /** Whether an installed family answered the probe, per family (lower
222
+ * case); reset when the font set changes (`fontSetChanged`). */
223
+ const installed = new Map();
224
+ /** Forget the probe's answers (the faces changed). */
225
+ export function forgetInstalledFamilies() {
226
+ installed.clear();
227
+ }
228
+ /**
229
+ * The faces of `faces` that `fontSet` could not give: a family with no
230
+ * loaded face (and not installed, by the width probe) is `missing`; a
231
+ * weight or slant matched by a face the browser has to draw bolder or
232
+ * slanted is `synthesized`. Generic families are never reported.
233
+ */
234
+ export function fontFallbacks(faces, fontSet, options) {
235
+ const wanted = faces.filter((f) => !isGenericFamily(f.family));
236
+ if (wanted.length === 0)
237
+ return [];
238
+ const index = indexFontSet(fontSet, new Set(wanted.map((f) => f.family.toLowerCase())));
239
+ const measure = options?.measureWidth === undefined ? (canMeasure() ? (font, text) => measureTextWidth(text, font) : null) : options.measureWidth;
240
+ const out = [];
241
+ for (const f of wanted) {
242
+ const lower = f.family.toLowerCase();
243
+ const declared = index.get(lower) ?? [];
244
+ const loaded = declared.filter((d) => d.status === 'loaded');
245
+ if (loaded.length === 0) {
246
+ // A family nobody declared may be installed on the system.
247
+ if (declared.length === 0 && measure) {
248
+ let there = installed.get(lower);
249
+ if (there === undefined) {
250
+ there = unavailableFontFamilies([f.family], measure).length === 0;
251
+ installed.set(lower, there);
252
+ }
253
+ if (there)
254
+ continue;
255
+ }
256
+ out.push({ ...f, reason: 'missing' });
257
+ continue;
258
+ }
259
+ if (matchFace(loaded, f.weight, f.style)?.synthesized)
260
+ out.push({ ...f, reason: 'synthesized' });
261
+ }
262
+ return out;
263
+ }
264
+ //# sourceMappingURL=faces.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"faces.js","sourceRoot":"","sources":["../../src/fonts/faces.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import { type FontFaceSetLike } from './faces';
2
+ /** Whether the engine has looked at `fontSet` before. */
3
+ export declare function isFontSetTracked(fontSet: FontFaceSetLike): boolean;
4
+ /**
5
+ * Look at `fontSet` again: the families whose loaded faces changed since
6
+ * the last look get their measurements dropped (`evictFontFamilies`) and
7
+ * are returned. The first look only records the set. Cheap when nothing
8
+ * happened: the set is walked only when its size changed or a face
9
+ * finished loading. `evict: false` records the set without dropping
10
+ * anything (the caller drops what it knows changed).
11
+ */
12
+ export declare function syncFontSet(fontSet?: FontFaceSetLike | null | undefined, options?: {
13
+ evict?: boolean;
14
+ }): string[];
15
+ /** Told which families' faces changed (lower case). */
16
+ export type FontsChangedListener = (families: readonly string[]) => void;
17
+ /**
18
+ * Call `listener` whenever faces of a watched font set arrive or leave
19
+ * (see {@link watchFonts}), after the engine has dropped what it measured
20
+ * in their families: the host lays out again. Returns the unsubscribe.
21
+ */
22
+ export declare function onFontsChanged(listener: FontsChangedListener): () => void;
23
+ /**
24
+ * Watch `fontSet` (by default `document.fonts`, or `self.fonts` in a
25
+ * worker): when faces finish loading, the measurements of their families
26
+ * are dropped — at most once per animation frame, however many slices a
27
+ * burst brings — and the {@link onFontsChanged} listeners are told.
28
+ * Calls nest; the returned function stops this watch. `prepareFonts`
29
+ * starts one on the set it loads into.
30
+ */
31
+ export declare function watchFonts(fontSet?: FontFaceSetLike | null | undefined): () => void;
32
+ /** Whether `fontSet` is watched. */
33
+ export declare function isWatchingFonts(fontSet?: FontFaceSetLike | null | undefined): boolean;
34
+ //# sourceMappingURL=fontSet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fontSet.d.ts","sourceRoot":"","sources":["../../src/fonts/fontSet.ts"],"names":[],"mappings":"AAUA,OAAO,EAA8D,KAAK,eAAe,EAAE,MAAM,SAAS,CAAC;AAmD3G,yDAAyD;AACzD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAElE;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,OAAO,GAAE,eAAe,GAAG,IAAI,GAAG,SAA4B,EAAE,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,EAAE,CAqBnI;AAED,uDAAuD;AACvD,MAAM,MAAM,oBAAoB,GAAG,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,KAAK,IAAI,CAAC;AAIzE;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,oBAAoB,GAAG,MAAM,IAAI,CAKzE;AAkBD;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,OAAO,GAAE,eAAe,GAAG,IAAI,GAAG,SAA4B,GAAG,MAAM,IAAI,CA0CrG;AAED,oCAAoC;AACpC,wBAAgB,eAAe,CAAC,OAAO,GAAE,eAAe,GAAG,IAAI,GAAG,SAA4B,GAAG,OAAO,CAEvG"}
@@ -0,0 +1,173 @@
1
+ // Faces that arrive after text was measured (#629). The engine keeps, per
2
+ // font set, which faces of each family were loaded when it last looked;
3
+ // a build looks again at its start (cheaply: only when the set grew or
4
+ // shrank, or a face finished loading), and drops the widths of the
5
+ // families whose faces changed, so nothing measured with a fallback face
6
+ // outlives the face's arrival. `watchFonts` does the same as faces load,
7
+ // once per animation frame, and tells hosts (`onFontsChanged`) to lay out
8
+ // again.
9
+ import { evictFontFamilies } from '../measure/font';
10
+ import { defaultFontSet, forgetInstalledFamilies } from './faces';
11
+ const tracked = new WeakMap();
12
+ function unquote(family) {
13
+ const f = family.trim();
14
+ return /^(["']).*\1$/.test(f) ? f.slice(1, -1) : f;
15
+ }
16
+ /** The loaded faces of every family of `fontSet`. */
17
+ function signatureOf(fontSet) {
18
+ const parts = new Map();
19
+ for (const face of fontSet) {
20
+ if (face.status !== 'loaded')
21
+ continue;
22
+ const family = unquote(face.family).toLowerCase();
23
+ let list = parts.get(family);
24
+ if (!list)
25
+ parts.set(family, (list = []));
26
+ list.push(`${face.weight}/${face.style}/${face.unicodeRange ?? ''}`);
27
+ }
28
+ const out = new Map();
29
+ for (const [family, list] of parts)
30
+ out.set(family, list.sort().join(';'));
31
+ return out;
32
+ }
33
+ function track(fontSet) {
34
+ let t = tracked.get(fontSet);
35
+ if (t)
36
+ return t;
37
+ const entry = {
38
+ size: fontSet.size ?? -1,
39
+ signature: signatureOf(fontSet),
40
+ dirty: false,
41
+ onLoadingDone: () => {
42
+ entry.dirty = true;
43
+ },
44
+ };
45
+ fontSet.addEventListener?.('loadingdone', entry.onLoadingDone);
46
+ tracked.set(fontSet, entry);
47
+ t = entry;
48
+ return t;
49
+ }
50
+ /** Whether the engine has looked at `fontSet` before. */
51
+ export function isFontSetTracked(fontSet) {
52
+ return tracked.has(fontSet);
53
+ }
54
+ /**
55
+ * Look at `fontSet` again: the families whose loaded faces changed since
56
+ * the last look get their measurements dropped (`evictFontFamilies`) and
57
+ * are returned. The first look only records the set. Cheap when nothing
58
+ * happened: the set is walked only when its size changed or a face
59
+ * finished loading. `evict: false` records the set without dropping
60
+ * anything (the caller drops what it knows changed).
61
+ */
62
+ export function syncFontSet(fontSet = defaultFontSet(), options) {
63
+ if (!fontSet)
64
+ return [];
65
+ if (!tracked.has(fontSet)) {
66
+ track(fontSet);
67
+ return [];
68
+ }
69
+ const t = track(fontSet);
70
+ const size = fontSet.size ?? -1;
71
+ if (!t.dirty && size === t.size && size !== -1)
72
+ return [];
73
+ const signature = signatureOf(fontSet);
74
+ const changed = [];
75
+ for (const [family, sig] of signature)
76
+ if (t.signature.get(family) !== sig)
77
+ changed.push(family);
78
+ for (const family of t.signature.keys())
79
+ if (!signature.has(family))
80
+ changed.push(family);
81
+ t.signature = signature;
82
+ t.size = size;
83
+ t.dirty = false;
84
+ if (changed.length > 0) {
85
+ forgetInstalledFamilies();
86
+ if (options?.evict !== false)
87
+ evictFontFamilies(changed);
88
+ }
89
+ return changed;
90
+ }
91
+ const listeners = new Set();
92
+ /**
93
+ * Call `listener` whenever faces of a watched font set arrive or leave
94
+ * (see {@link watchFonts}), after the engine has dropped what it measured
95
+ * in their families: the host lays out again. Returns the unsubscribe.
96
+ */
97
+ export function onFontsChanged(listener) {
98
+ listeners.add(listener);
99
+ return () => {
100
+ listeners.delete(listener);
101
+ };
102
+ }
103
+ const watches = new WeakMap();
104
+ function nextFrame(run) {
105
+ const g = globalThis;
106
+ // A hidden page runs no animation frames: a timer stands in.
107
+ if (typeof g.requestAnimationFrame === 'function' && !g.document?.hidden)
108
+ g.requestAnimationFrame(run);
109
+ else
110
+ setTimeout(run, 16);
111
+ }
112
+ /**
113
+ * Watch `fontSet` (by default `document.fonts`, or `self.fonts` in a
114
+ * worker): when faces finish loading, the measurements of their families
115
+ * are dropped — at most once per animation frame, however many slices a
116
+ * burst brings — and the {@link onFontsChanged} listeners are told.
117
+ * Calls nest; the returned function stops this watch. `prepareFonts`
118
+ * starts one on the set it loads into.
119
+ */
120
+ export function watchFonts(fontSet = defaultFontSet()) {
121
+ if (!fontSet || !fontSet.addEventListener)
122
+ return () => { };
123
+ const set = fontSet;
124
+ track(set);
125
+ let w = watches.get(set);
126
+ if (!w) {
127
+ const watch = {
128
+ count: 0,
129
+ pending: new Set(),
130
+ scheduled: false,
131
+ listener: (event) => {
132
+ for (const face of event.fontfaces ?? [])
133
+ watch.pending.add(unquote(face.family).toLowerCase());
134
+ if (watch.scheduled)
135
+ return;
136
+ watch.scheduled = true;
137
+ nextFrame(() => {
138
+ watch.scheduled = false;
139
+ const changed = syncFontSet(set);
140
+ // A build between the event and this frame may have dropped
141
+ // them already: the faces still arrived.
142
+ const families = [...new Set([...changed, ...watch.pending])];
143
+ watch.pending.clear();
144
+ if (families.length === 0)
145
+ return;
146
+ for (const l of [...listeners])
147
+ l(families);
148
+ });
149
+ },
150
+ };
151
+ set.addEventListener('loadingdone', watch.listener);
152
+ watches.set(set, watch);
153
+ w = watch;
154
+ }
155
+ w.count++;
156
+ let stopped = false;
157
+ const current = w;
158
+ return () => {
159
+ if (stopped)
160
+ return;
161
+ stopped = true;
162
+ current.count--;
163
+ if (current.count === 0) {
164
+ set.removeEventListener?.('loadingdone', current.listener);
165
+ watches.delete(set);
166
+ }
167
+ };
168
+ }
169
+ /** Whether `fontSet` is watched. */
170
+ export function isWatchingFonts(fontSet = defaultFontSet()) {
171
+ return !!fontSet && watches.has(fontSet);
172
+ }
173
+ //# sourceMappingURL=fontSet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fontSet.js","sourceRoot":"","sources":["../../src/fonts/fontSet.ts"],"names":[],"mappings":"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"}