postext 1.46.4 → 1.48.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 (353) hide show
  1. package/dist/__tests__/bundle/designOverflowPin.test.js +1 -1
  2. package/dist/__tests__/bundle/gridBreakRulesPin.test.js +2 -2
  3. package/dist/__tests__/bundle/shapingLanguagePin.test.js +3 -3
  4. package/dist/__tests__/bundle/taskBoxPin.test.js +1 -1
  5. package/dist/__tests__/bundle.test.js +1 -1
  6. package/dist/__tests__/codeBlocks.test.js +1 -1
  7. package/dist/__tests__/comics/config.test.js +20 -0
  8. package/dist/__tests__/comics/config.test.js.map +1 -1
  9. package/dist/__tests__/composed/cardShapes.test.d.ts +2 -0
  10. package/dist/__tests__/composed/cardShapes.test.d.ts.map +1 -0
  11. package/dist/__tests__/composed/cardShapes.test.js +82 -0
  12. package/dist/__tests__/composed/cardShapes.test.js.map +1 -0
  13. package/dist/__tests__/composed/connectors.test.d.ts +2 -0
  14. package/dist/__tests__/composed/connectors.test.d.ts.map +1 -0
  15. package/dist/__tests__/composed/connectors.test.js +349 -0
  16. package/dist/__tests__/composed/connectors.test.js.map +1 -0
  17. package/dist/__tests__/composed/decorationSidePoints.test.d.ts +2 -0
  18. package/dist/__tests__/composed/decorationSidePoints.test.d.ts.map +1 -0
  19. package/dist/__tests__/composed/decorationSidePoints.test.js +164 -0
  20. package/dist/__tests__/composed/decorationSidePoints.test.js.map +1 -0
  21. package/dist/__tests__/composed/fit.test.js +2 -1
  22. package/dist/__tests__/composed/fit.test.js.map +1 -1
  23. package/dist/__tests__/composed/fixtures/connectors.d.ts +33 -0
  24. package/dist/__tests__/composed/fixtures/connectors.d.ts.map +1 -0
  25. package/dist/__tests__/composed/fixtures/connectors.js +142 -0
  26. package/dist/__tests__/composed/fixtures/connectors.js.map +1 -0
  27. package/dist/__tests__/composed/fixtures/grid.d.ts +32 -0
  28. package/dist/__tests__/composed/fixtures/grid.d.ts.map +1 -0
  29. package/dist/__tests__/composed/fixtures/grid.js +53 -0
  30. package/dist/__tests__/composed/fixtures/grid.js.map +1 -0
  31. package/dist/__tests__/composed/fixtures/legendMap.d.ts +24 -0
  32. package/dist/__tests__/composed/fixtures/legendMap.d.ts.map +1 -0
  33. package/dist/__tests__/composed/fixtures/legendMap.js +117 -0
  34. package/dist/__tests__/composed/fixtures/legendMap.js.map +1 -0
  35. package/dist/__tests__/composed/fixtures/mapParts.d.ts +58 -0
  36. package/dist/__tests__/composed/fixtures/mapParts.d.ts.map +1 -0
  37. package/dist/__tests__/composed/fixtures/mapParts.js +192 -0
  38. package/dist/__tests__/composed/fixtures/mapParts.js.map +1 -0
  39. package/dist/__tests__/composed/fixtures/modules.d.ts +55 -0
  40. package/dist/__tests__/composed/fixtures/modules.d.ts.map +1 -0
  41. package/dist/__tests__/composed/fixtures/modules.js +123 -0
  42. package/dist/__tests__/composed/fixtures/modules.js.map +1 -0
  43. package/dist/__tests__/composed/grid.test.d.ts +2 -0
  44. package/dist/__tests__/composed/grid.test.d.ts.map +1 -0
  45. package/dist/__tests__/composed/grid.test.js +357 -0
  46. package/dist/__tests__/composed/grid.test.js.map +1 -0
  47. package/dist/__tests__/composed/groups.test.js +6 -3
  48. package/dist/__tests__/composed/groups.test.js.map +1 -1
  49. package/dist/__tests__/composed/labelLegend.test.d.ts +2 -0
  50. package/dist/__tests__/composed/labelLegend.test.d.ts.map +1 -0
  51. package/dist/__tests__/composed/labelLegend.test.js +268 -0
  52. package/dist/__tests__/composed/labelLegend.test.js.map +1 -0
  53. package/dist/__tests__/composed/labelsChecks.test.js.map +1 -1
  54. package/dist/__tests__/composed/leaders.test.d.ts +2 -0
  55. package/dist/__tests__/composed/leaders.test.d.ts.map +1 -0
  56. package/dist/__tests__/composed/leaders.test.js +372 -0
  57. package/dist/__tests__/composed/leaders.test.js.map +1 -0
  58. package/dist/__tests__/composed/modules.test.d.ts +2 -0
  59. package/dist/__tests__/composed/modules.test.d.ts.map +1 -0
  60. package/dist/__tests__/composed/modules.test.js +352 -0
  61. package/dist/__tests__/composed/modules.test.js.map +1 -0
  62. package/dist/__tests__/composed/overConnectors.test.d.ts +2 -0
  63. package/dist/__tests__/composed/overConnectors.test.d.ts.map +1 -0
  64. package/dist/__tests__/composed/overConnectors.test.js +232 -0
  65. package/dist/__tests__/composed/overConnectors.test.js.map +1 -0
  66. package/dist/__tests__/composed/overlap.test.d.ts +2 -0
  67. package/dist/__tests__/composed/overlap.test.d.ts.map +1 -0
  68. package/dist/__tests__/composed/overlap.test.js +339 -0
  69. package/dist/__tests__/composed/overlap.test.js.map +1 -0
  70. package/dist/__tests__/composed/viewerLeaf.test.d.ts +2 -0
  71. package/dist/__tests__/composed/viewerLeaf.test.d.ts.map +1 -0
  72. package/dist/__tests__/composed/viewerLeaf.test.js +106 -0
  73. package/dist/__tests__/composed/viewerLeaf.test.js.map +1 -0
  74. package/dist/__tests__/composedTemplates.test.js +1 -1
  75. package/dist/__tests__/design/boxShape.test.d.ts +2 -0
  76. package/dist/__tests__/design/boxShape.test.d.ts.map +1 -0
  77. package/dist/__tests__/design/boxShape.test.js +126 -0
  78. package/dist/__tests__/design/boxShape.test.js.map +1 -0
  79. package/dist/__tests__/design/boxShapePaint.test.d.ts +2 -0
  80. package/dist/__tests__/design/boxShapePaint.test.d.ts.map +1 -0
  81. package/dist/__tests__/design/boxShapePaint.test.js +130 -0
  82. package/dist/__tests__/design/boxShapePaint.test.js.map +1 -0
  83. package/dist/__tests__/design/openerBottomAnchor.test.js.map +1 -1
  84. package/dist/__tests__/design/pathBlock.test.d.ts +2 -0
  85. package/dist/__tests__/design/pathBlock.test.d.ts.map +1 -0
  86. package/dist/__tests__/design/pathBlock.test.js +194 -0
  87. package/dist/__tests__/design/pathBlock.test.js.map +1 -0
  88. package/dist/__tests__/design/pathElement.test.d.ts +2 -0
  89. package/dist/__tests__/design/pathElement.test.d.ts.map +1 -0
  90. package/dist/__tests__/design/pathElement.test.js +257 -0
  91. package/dist/__tests__/design/pathElement.test.js.map +1 -0
  92. package/dist/__tests__/design/svgPath.test.d.ts +2 -0
  93. package/dist/__tests__/design/svgPath.test.d.ts.map +1 -0
  94. package/dist/__tests__/design/svgPath.test.js +144 -0
  95. package/dist/__tests__/design/svgPath.test.js.map +1 -0
  96. package/dist/__tests__/exports.test.js +53 -0
  97. package/dist/__tests__/exports.test.js.map +1 -1
  98. package/dist/__tests__/fontUsage.test.js +46 -0
  99. package/dist/__tests__/fontUsage.test.js.map +1 -1
  100. package/dist/__tests__/hardBreaks.test.js +1 -1
  101. package/dist/__tests__/headingInlineMarks.test.js +1 -1
  102. package/dist/__tests__/labelGlyphPaint.test.d.ts +2 -0
  103. package/dist/__tests__/labelGlyphPaint.test.d.ts.map +1 -0
  104. package/dist/__tests__/labelGlyphPaint.test.js +86 -0
  105. package/dist/__tests__/labelGlyphPaint.test.js.map +1 -0
  106. package/dist/__tests__/mathSizeMigration.test.js +2 -2
  107. package/dist/__tests__/migrate/labelsOnPictures.test.js +1 -1
  108. package/dist/__tests__/migrate/labelsOnPictures.test.js.map +1 -1
  109. package/dist/__tests__/parse/containers.test.js +1 -1
  110. package/dist/__tests__/parse/containers.test.js.map +1 -1
  111. package/dist/__tests__/pipeline/calloutInlineResourceGap.test.js +1 -1
  112. package/dist/__tests__/pipeline/calloutLabelGlyph.test.d.ts +2 -0
  113. package/dist/__tests__/pipeline/calloutLabelGlyph.test.d.ts.map +1 -0
  114. package/dist/__tests__/pipeline/calloutLabelGlyph.test.js +198 -0
  115. package/dist/__tests__/pipeline/calloutLabelGlyph.test.js.map +1 -0
  116. package/dist/__tests__/pipeline/calloutShapes.test.d.ts +2 -0
  117. package/dist/__tests__/pipeline/calloutShapes.test.d.ts.map +1 -0
  118. package/dist/__tests__/pipeline/calloutShapes.test.js +159 -0
  119. package/dist/__tests__/pipeline/calloutShapes.test.js.map +1 -0
  120. package/dist/__tests__/pipeline/calloutSplitMinLinesChild.test.js +1 -1
  121. package/dist/__tests__/pipeline/colonListRoom.test.js +1 -1
  122. package/dist/__tests__/pipeline/compoundBreaks.test.js +1 -1
  123. package/dist/__tests__/pipeline/dashBreaks.test.js +1 -1
  124. package/dist/__tests__/pipeline/headingSplitOrphans.test.js +1 -1
  125. package/dist/__tests__/pipeline/inlineFigureSpace.test.js +1 -1
  126. package/dist/__tests__/pipeline/paragraphContainerTail.test.js +1 -1
  127. package/dist/__tests__/pipeline/raggedOptimal.test.js +1 -1
  128. package/dist/__tests__/prepareFonts.test.js +8 -6
  129. package/dist/__tests__/prepareFonts.test.js.map +1 -1
  130. package/dist/__tests__/verseLines.test.js +1 -1
  131. package/dist/bundle/configVersion.d.ts +12 -3
  132. package/dist/bundle/configVersion.d.ts.map +1 -1
  133. package/dist/bundle/configVersion.js +16 -5
  134. package/dist/bundle/configVersion.js.map +1 -1
  135. package/dist/canvas-backend/blockRender.js +3 -3
  136. package/dist/canvas-backend/blockRender.js.map +1 -1
  137. package/dist/canvas-backend/composed.d.ts +4 -2
  138. package/dist/canvas-backend/composed.d.ts.map +1 -1
  139. package/dist/canvas-backend/composed.js +12 -7
  140. package/dist/canvas-backend/composed.js.map +1 -1
  141. package/dist/canvas-backend/headerFooter.d.ts +17 -1
  142. package/dist/canvas-backend/headerFooter.d.ts.map +1 -1
  143. package/dist/canvas-backend/headerFooter.js +64 -1
  144. package/dist/canvas-backend/headerFooter.js.map +1 -1
  145. package/dist/canvas-backend/index.d.ts.map +1 -1
  146. package/dist/canvas-backend/index.js +7 -1
  147. package/dist/canvas-backend/index.js.map +1 -1
  148. package/dist/canvas-backend/renderResourceBlock.d.ts.map +1 -1
  149. package/dist/canvas-backend/renderResourceBlock.js +17 -6
  150. package/dist/canvas-backend/renderResourceBlock.js.map +1 -1
  151. package/dist/canvas-backend/swatch.d.ts +20 -1
  152. package/dist/canvas-backend/swatch.d.ts.map +1 -1
  153. package/dist/canvas-backend/swatch.js +51 -1
  154. package/dist/canvas-backend/swatch.js.map +1 -1
  155. package/dist/comics/fonts.d.ts +19 -0
  156. package/dist/comics/fonts.d.ts.map +1 -1
  157. package/dist/comics/fonts.js +70 -17
  158. package/dist/comics/fonts.js.map +1 -1
  159. package/dist/comics/layoutPage.d.ts.map +1 -1
  160. package/dist/comics/layoutPage.js +6 -1
  161. package/dist/comics/layoutPage.js.map +1 -1
  162. package/dist/composed/continuation.d.ts +10 -2
  163. package/dist/composed/continuation.d.ts.map +1 -1
  164. package/dist/composed/continuation.js +10 -2
  165. package/dist/composed/continuation.js.map +1 -1
  166. package/dist/composed/document.d.ts +45 -1
  167. package/dist/composed/document.d.ts.map +1 -1
  168. package/dist/composed/document.js +76 -17
  169. package/dist/composed/document.js.map +1 -1
  170. package/dist/composed/labelText.d.ts +9 -1
  171. package/dist/composed/labelText.d.ts.map +1 -1
  172. package/dist/composed/labelText.js +23 -1
  173. package/dist/composed/labelText.js.map +1 -1
  174. package/dist/composed/labels.d.ts +57 -3
  175. package/dist/composed/labels.d.ts.map +1 -1
  176. package/dist/composed/labels.js +261 -12
  177. package/dist/composed/labels.js.map +1 -1
  178. package/dist/composed/modules.d.ts +30 -0
  179. package/dist/composed/modules.d.ts.map +1 -0
  180. package/dist/composed/modules.js +194 -0
  181. package/dist/composed/modules.js.map +1 -0
  182. package/dist/composed/overlap.d.ts +52 -0
  183. package/dist/composed/overlap.d.ts.map +1 -0
  184. package/dist/composed/overlap.js +611 -0
  185. package/dist/composed/overlap.js.map +1 -0
  186. package/dist/composed/paint.d.ts +28 -5
  187. package/dist/composed/paint.d.ts.map +1 -1
  188. package/dist/composed/paint.js +26 -5
  189. package/dist/composed/paint.js.map +1 -1
  190. package/dist/composed/reflowLog.d.ts +6 -1
  191. package/dist/composed/reflowLog.d.ts.map +1 -1
  192. package/dist/composed/reflowLog.js +43 -0
  193. package/dist/composed/reflowLog.js.map +1 -1
  194. package/dist/composed/repeat.d.ts +66 -0
  195. package/dist/composed/repeat.d.ts.map +1 -0
  196. package/dist/composed/repeat.js +217 -0
  197. package/dist/composed/repeat.js.map +1 -0
  198. package/dist/composed/slotChecks.d.ts +1 -1
  199. package/dist/composed/slotChecks.d.ts.map +1 -1
  200. package/dist/composed/slotChecks.js +114 -8
  201. package/dist/composed/slotChecks.js.map +1 -1
  202. package/dist/composed/sourceMap.d.ts.map +1 -1
  203. package/dist/composed/sourceMap.js +16 -4
  204. package/dist/composed/sourceMap.js.map +1 -1
  205. package/dist/composed/spread.d.ts.map +1 -1
  206. package/dist/composed/spread.js +6 -2
  207. package/dist/composed/spread.js.map +1 -1
  208. package/dist/composed/templates.d.ts +22 -2
  209. package/dist/composed/templates.d.ts.map +1 -1
  210. package/dist/composed/templates.js +159 -9
  211. package/dist/composed/templates.js.map +1 -1
  212. package/dist/composed/types.d.ts +140 -7
  213. package/dist/composed/types.d.ts.map +1 -1
  214. package/dist/composed/validate.d.ts +1 -1
  215. package/dist/composed/validate.d.ts.map +1 -1
  216. package/dist/composed/validate.js +101 -4
  217. package/dist/composed/validate.js.map +1 -1
  218. package/dist/composed/wrap.d.ts.map +1 -1
  219. package/dist/composed/wrap.js +95 -17
  220. package/dist/composed/wrap.js.map +1 -1
  221. package/dist/configWarnings.d.ts +7 -1
  222. package/dist/configWarnings.d.ts.map +1 -1
  223. package/dist/configWarnings.js +275 -4
  224. package/dist/configWarnings.js.map +1 -1
  225. package/dist/contrast.d.ts.map +1 -1
  226. package/dist/contrast.js +8 -0
  227. package/dist/contrast.js.map +1 -1
  228. package/dist/defaults/calloutStyles.d.ts +10 -1
  229. package/dist/defaults/calloutStyles.d.ts.map +1 -1
  230. package/dist/defaults/calloutStyles.js +46 -7
  231. package/dist/defaults/calloutStyles.js.map +1 -1
  232. package/dist/defaults/comics.d.ts +2 -1
  233. package/dist/defaults/comics.d.ts.map +1 -1
  234. package/dist/defaults/comics.js +18 -3
  235. package/dist/defaults/comics.js.map +1 -1
  236. package/dist/defaults/headerFooter.d.ts.map +1 -1
  237. package/dist/defaults/headerFooter.js +38 -0
  238. package/dist/defaults/headerFooter.js.map +1 -1
  239. package/dist/design/boxShape.d.ts +101 -0
  240. package/dist/design/boxShape.d.ts.map +1 -0
  241. package/dist/design/boxShape.js +398 -0
  242. package/dist/design/boxShape.js.map +1 -0
  243. package/dist/design/connector.d.ts +75 -0
  244. package/dist/design/connector.d.ts.map +1 -0
  245. package/dist/design/connector.js +325 -0
  246. package/dist/design/connector.js.map +1 -0
  247. package/dist/design/layout.d.ts +56 -3
  248. package/dist/design/layout.d.ts.map +1 -1
  249. package/dist/design/layout.js +214 -12
  250. package/dist/design/layout.js.map +1 -1
  251. package/dist/design/logicalEdges.d.ts +7 -0
  252. package/dist/design/logicalEdges.d.ts.map +1 -1
  253. package/dist/design/logicalEdges.js +28 -0
  254. package/dist/design/logicalEdges.js.map +1 -1
  255. package/dist/design/pathBlock.d.ts +69 -0
  256. package/dist/design/pathBlock.d.ts.map +1 -0
  257. package/dist/design/pathBlock.js +286 -0
  258. package/dist/design/pathBlock.js.map +1 -0
  259. package/dist/design/svgPath.d.ts +48 -0
  260. package/dist/design/svgPath.d.ts.map +1 -0
  261. package/dist/design/svgPath.js +402 -0
  262. package/dist/design/svgPath.js.map +1 -0
  263. package/dist/fonts/usage.d.ts +5 -0
  264. package/dist/fonts/usage.d.ts.map +1 -1
  265. package/dist/fonts/usage.js +81 -11
  266. package/dist/fonts/usage.js.map +1 -1
  267. package/dist/html-backend.d.ts.map +1 -1
  268. package/dist/html-backend.js +127 -22
  269. package/dist/html-backend.js.map +1 -1
  270. package/dist/index.d.ts +19 -9
  271. package/dist/index.d.ts.map +1 -1
  272. package/dist/index.js +13 -5
  273. package/dist/index.js.map +1 -1
  274. package/dist/measure/cache.js +1 -1
  275. package/dist/measure/cache.js.map +1 -1
  276. package/dist/measure/inlineIcon.d.ts +34 -0
  277. package/dist/measure/inlineIcon.d.ts.map +1 -0
  278. package/dist/measure/inlineIcon.js +89 -0
  279. package/dist/measure/inlineIcon.js.map +1 -0
  280. package/dist/measure/rich.d.ts +2 -1
  281. package/dist/measure/rich.d.ts.map +1 -1
  282. package/dist/measure/rich.js +6 -0
  283. package/dist/measure/rich.js.map +1 -1
  284. package/dist/migrate/pageDesign.d.ts.map +1 -1
  285. package/dist/migrate/pageDesign.js +4 -2
  286. package/dist/migrate/pageDesign.js.map +1 -1
  287. package/dist/migrate/textToMarkdown.js +2 -0
  288. package/dist/migrate/textToMarkdown.js.map +1 -1
  289. package/dist/parse/blockParser.d.ts.map +1 -1
  290. package/dist/parse/blockParser.js +171 -20
  291. package/dist/parse/blockParser.js.map +1 -1
  292. package/dist/parse/index.d.ts +1 -1
  293. package/dist/parse/index.d.ts.map +1 -1
  294. package/dist/parse/index.js.map +1 -1
  295. package/dist/parse/inlineFormatting.d.ts +11 -3
  296. package/dist/parse/inlineFormatting.d.ts.map +1 -1
  297. package/dist/parse/inlineFormatting.js +63 -5
  298. package/dist/parse/inlineFormatting.js.map +1 -1
  299. package/dist/parse/inlineSnippet.d.ts +2 -1
  300. package/dist/parse/inlineSnippet.d.ts.map +1 -1
  301. package/dist/parse/inlineSnippet.js +3 -2
  302. package/dist/parse/inlineSnippet.js.map +1 -1
  303. package/dist/parse/sourceMapping.d.ts.map +1 -1
  304. package/dist/parse/sourceMapping.js +8 -1
  305. package/dist/parse/sourceMapping.js.map +1 -1
  306. package/dist/parse/types.d.ts +71 -1
  307. package/dist/parse/types.d.ts.map +1 -1
  308. package/dist/pipeline/build.d.ts.map +1 -1
  309. package/dist/pipeline/build.js +67 -13
  310. package/dist/pipeline/build.js.map +1 -1
  311. package/dist/pipeline/buildHelpers.d.ts +10 -0
  312. package/dist/pipeline/buildHelpers.d.ts.map +1 -1
  313. package/dist/pipeline/buildHelpers.js +17 -0
  314. package/dist/pipeline/buildHelpers.js.map +1 -1
  315. package/dist/pipeline/buildMeasurement.d.ts.map +1 -1
  316. package/dist/pipeline/buildMeasurement.js +23 -11
  317. package/dist/pipeline/buildMeasurement.js.map +1 -1
  318. package/dist/pipeline/calloutLayout.d.ts.map +1 -1
  319. package/dist/pipeline/calloutLayout.js +142 -32
  320. package/dist/pipeline/calloutLayout.js.map +1 -1
  321. package/dist/pipeline/composedLayout.d.ts +1 -33
  322. package/dist/pipeline/composedLayout.d.ts.map +1 -1
  323. package/dist/pipeline/composedLayout.js +526 -36
  324. package/dist/pipeline/composedLayout.js.map +1 -1
  325. package/dist/pipeline/config.d.ts.map +1 -1
  326. package/dist/pipeline/config.js +12 -0
  327. package/dist/pipeline/config.js.map +1 -1
  328. package/dist/pipeline/contentWarnings.d.ts.map +1 -1
  329. package/dist/pipeline/contentWarnings.js +46 -1
  330. package/dist/pipeline/contentWarnings.js.map +1 -1
  331. package/dist/pipeline/continuation.d.ts.map +1 -1
  332. package/dist/pipeline/continuation.js +3 -2
  333. package/dist/pipeline/continuation.js.map +1 -1
  334. package/dist/pipeline/headerFooter.d.ts +19 -1
  335. package/dist/pipeline/headerFooter.d.ts.map +1 -1
  336. package/dist/pipeline/headerFooter.js +169 -17
  337. package/dist/pipeline/headerFooter.js.map +1 -1
  338. package/dist/pipeline/partPalette.d.ts.map +1 -1
  339. package/dist/pipeline/partPalette.js +40 -1
  340. package/dist/pipeline/partPalette.js.map +1 -1
  341. package/dist/pipeline/resourceLayout.d.ts +1 -1
  342. package/dist/pipeline/resourceLayout.d.ts.map +1 -1
  343. package/dist/pipeline/resourceLayout.js +44 -15
  344. package/dist/pipeline/resourceLayout.js.map +1 -1
  345. package/dist/preflight.d.ts.map +1 -1
  346. package/dist/preflight.js +36 -1
  347. package/dist/preflight.js.map +1 -1
  348. package/dist/types.d.ts +319 -22
  349. package/dist/types.d.ts.map +1 -1
  350. package/dist/vdt.d.ts +392 -12
  351. package/dist/vdt.d.ts.map +1 -1
  352. package/dist/vdt.js.map +1 -1
  353. package/package.json +1 -1
@@ -1,11 +1,13 @@
1
1
  import { flowTextWidth, getMeasureWritingMode, lineBaselineOffset, withMeasureWritingMode } from '../measure/vertical';
2
- import { isLogicalEdge, physicalEdge, physicalPlacement } from './logicalEdges';
2
+ import { edgeSide, isLogicalEdge, physicalEdge, physicalPlacement, sideFraction } from './logicalEdges';
3
3
  import { bitmapLayoutSize } from '../bitmapResolution';
4
4
  import { comicArtCrop } from '../comics/art';
5
5
  import { dimensionToPx } from '../units';
6
+ import { borderSidesPx, cornerRadiiPx, isCornerRadii, normalizeBoxStyle, uniformRadius } from './boxShape';
6
7
  import { resolveTextDots } from '../textDots';
7
8
  import { resolveDesignLineHeight } from '../defaults/headerFooter';
8
9
  import { createBoundingBox, pictureTraits } from '../vdt';
10
+ import { mapPath, parseSvgPathCached, pathViewBox } from './svgPath';
9
11
  import { buildFontString } from '../measure';
10
12
  import { graphemeCount } from '../measure/graphemes';
11
13
  import { joiningScriptIn } from '../measure/joining';
@@ -15,6 +17,8 @@ import { withLineEndHyphen } from '../measure/geminate';
15
17
  import { BREAKING_SPACE_RUNS_SPLIT_RE, NO_BREAK_SPACES, isBreakingSpaceRun } from '../measure/spaces';
16
18
  import { LEADER_MARK, resolveDesignResourceId, resolveDesignText, } from './placeholders';
17
19
  import { fitLeader } from '../measure/leader';
20
+ import { layoutConnector } from './connector';
21
+ import { repeatInstance } from '../composed/templates';
18
22
  import { hasJoiningScript, joinsWithNext } from '../bidi';
19
23
  import { designBaseDirection, directRuns, directedTextWidth, measuresRunsAsPainted, paintedRunWidth } from './bidiText';
20
24
  import { composeCjkDesignParagraph, composesDesignAsCjk } from './cjkText';
@@ -94,13 +98,29 @@ function resolvePadding(padding, dpi, baseFontSizePx) {
94
98
  function resolveBox(style, dpi, baseFontSizePx) {
95
99
  if (!style)
96
100
  return undefined;
97
- return {
101
+ const padding = resolvePadding(style.padding, dpi, baseFontSizePx);
102
+ if (!isCornerRadii(style.borderRadius) && style.borderSides === undefined) {
103
+ return {
104
+ backgroundColor: style.backgroundColor?.hex,
105
+ borderColor: style.borderColor?.hex,
106
+ borderWidthPx: dimPx(style.borderWidth, dpi, baseFontSizePx),
107
+ borderRadiusPx: dimPx(uniformRadius(style.borderRadius), dpi, baseFontSizePx),
108
+ padding,
109
+ };
110
+ }
111
+ // Corners of their own and a border per side (#1059), folded back to
112
+ // the plain fields where they say no more.
113
+ const toPx = (d) => dimPx(d, dpi, baseFontSizePx);
114
+ const whole = { enabled: true, color: style.borderColor, width: style.borderWidth };
115
+ const shape = normalizeBoxStyle({
98
116
  backgroundColor: style.backgroundColor?.hex,
99
117
  borderColor: style.borderColor?.hex,
100
118
  borderWidthPx: dimPx(style.borderWidth, dpi, baseFontSizePx),
101
- borderRadiusPx: dimPx(style.borderRadius, dpi, baseFontSizePx),
102
- padding: resolvePadding(style.padding, dpi, baseFontSizePx),
103
- };
119
+ borderRadiusPx: 0,
120
+ borderRadiiPx: cornerRadiiPx(style.borderRadius, toPx),
121
+ ...(style.borderSides !== undefined ? { borderSides: borderSidesPx(whole, style.borderSides, toPx) } : {}),
122
+ });
123
+ return { ...shape, padding };
104
124
  }
105
125
  function colorHex(c) {
106
126
  return c?.hex ?? '#000000';
@@ -115,10 +135,17 @@ function overrideColor(c, overrides) {
115
135
  function overrideBoxStyle(style, overrides) {
116
136
  if (!style)
117
137
  return style;
138
+ const sides = style.borderSides;
118
139
  return {
119
140
  ...style,
120
141
  backgroundColor: overrideColor(style.backgroundColor, overrides),
121
142
  borderColor: overrideColor(style.borderColor, overrides),
143
+ // Each side's own colour too (#1059).
144
+ ...(sides && typeof sides === 'object'
145
+ ? {
146
+ borderSides: Object.fromEntries(Object.entries(sides).map(([k, v]) => [k, v && typeof v === 'object' && v.color ? { ...v, color: overrideColor(v.color, overrides) } : v])),
147
+ }
148
+ : {}),
122
149
  };
123
150
  }
124
151
  /** The element with every palette-linked colour (text colour, rule colour,
@@ -140,6 +167,14 @@ export function applyPaletteOverrides(el, overrides) {
140
167
  return { ...el, color: overrideColor(el.color, overrides) ?? el.color };
141
168
  case 'box':
142
169
  return { ...el, style: overrideBoxStyle(el.style, overrides) ?? el.style };
170
+ case 'path':
171
+ return {
172
+ ...el,
173
+ ...(el.fill ? { fill: overrideColor(el.fill, overrides) } : {}),
174
+ ...(el.stroke ? { stroke: overrideColor(el.stroke, overrides) } : {}),
175
+ };
176
+ case 'connector':
177
+ return { ...el, color: overrideColor(el.color, overrides) ?? el.color };
143
178
  default:
144
179
  return el;
145
180
  }
@@ -736,6 +771,25 @@ function edgeYFromPin(anchorY, pinY, height) {
736
771
  // ---------------------------------------------------------------------------
737
772
  // Main engine
738
773
  // ---------------------------------------------------------------------------
774
+ /**
775
+ * `anchor` (the point of `edge` on `ref`) moved along the side the edge
776
+ * stands on to `at` (#1055): from the side's start — the left of a top or
777
+ * bottom side, its right when the page starts on the right (`startRight`),
778
+ * the top of a left or right side — a fraction of its length. Along the
779
+ * side the element is centred on that point (a rule's thickness on a
780
+ * frame's middle); across it the edge's pin stays (`below` hangs under the
781
+ * side, `bottom` stands inside on it). `center`, and an `at` that is no
782
+ * side position, leave the anchor as it is.
783
+ */
784
+ function alongSide(anchor, edge, at, ref, startRight) {
785
+ const side = edgeSide(edge);
786
+ const f = sideFraction(at);
787
+ if (!side || f === undefined)
788
+ return anchor;
789
+ if (side === 'left' || side === 'right')
790
+ return { ...anchor, anchorY: ref.y + f * ref.height, pinY: 'middle' };
791
+ return { ...anchor, anchorX: ref.x + (startRight ? 1 - f : f) * ref.width, pinX: 'middle' };
792
+ }
739
793
  /** A size written as `{ to, edge }` (#928). */
740
794
  function isSizeTo(size) {
741
795
  return typeof size === 'object' && size !== null && 'to' in size && 'edge' in size;
@@ -752,11 +806,12 @@ function withSizesTo(el, pin, refOf) {
752
806
  return el;
753
807
  const along = (s, axis) => {
754
808
  const ref = refOf(s.to);
755
- const edges = axis === 'x' ? { left: 'start', right: 'end' } : { top: 'start', bottom: 'end' };
756
- const side = edges[s.edge];
757
- if (!ref || !side)
809
+ // `center` (#1055): the box's middle on the axis being sized.
810
+ const edges = axis === 'x' ? { left: 0, center: 0.5, right: 1 } : { top: 0, center: 0.5, bottom: 1 };
811
+ const side = Object.prototype.hasOwnProperty.call(edges, s.edge) ? edges[s.edge] : undefined;
812
+ if (!ref || side === undefined)
758
813
  return 'fill';
759
- const at = axis === 'x' ? (side === 'start' ? ref.x : ref.x + ref.width) : (side === 'start' ? ref.y : ref.y + ref.height);
814
+ const at = axis === 'x' ? ref.x + side * ref.width : ref.y + side * ref.height;
760
815
  const from = axis === 'x' ? pin.anchorX : pin.anchorY;
761
816
  const p = axis === 'x' ? pin.pinX : pin.pinY;
762
817
  const room = p === 'start' ? at - from : p === 'end' ? from - at : 2 * Math.abs(at - from);
@@ -771,6 +826,81 @@ function withSizesTo(el, pin, refOf) {
771
826
  out.maxWidth = along(size.maxWidth, 'x');
772
827
  return { ...el, placement: { ...el.placement, size: out } };
773
828
  }
829
+ /**
830
+ * A connector (#1056) between the boxes it names: another element of the
831
+ * slot, else a frame or group of the page (`frames.named`, or the declared
832
+ * boxes with `pin`). `#card[*]` in `to` is every instance of `card` the
833
+ * page has, in item order. An end on a box the page does not show (absent
834
+ * from `named`, or in `frames.absent`) is dropped with a
835
+ * `connectorDropped` issue; with no `from` or no `to` left nothing is
836
+ * drawn.
837
+ */
838
+ function layoutConnectorElement(el, resolvedGeo, frames, issues, dpi, startRight) {
839
+ const boxes = (el.pin ? frames.declared : undefined) ?? frames.named ?? {};
840
+ const boxOf = (name) => {
841
+ const dep = resolvedGeo.get(name);
842
+ if (dep)
843
+ return { x: dep.x, y: dep.y, width: dep.width, height: dep.height };
844
+ if (frames.absent?.has(name))
845
+ return undefined;
846
+ return Object.prototype.hasOwnProperty.call(boxes, name) ? boxes[name] : undefined;
847
+ };
848
+ const endOf = (end) => {
849
+ const to = end?.to;
850
+ if (typeof to !== 'string' || !to.startsWith('#'))
851
+ return null;
852
+ const name = to.slice(1);
853
+ const box = boxOf(name);
854
+ if (!box) {
855
+ issues.push({ kind: 'connectorDropped', elementId: el.id, targetId: name });
856
+ return undefined;
857
+ }
858
+ const anchor = end.anchor;
859
+ if (typeof anchor === 'string' && anchor !== '' && !resolvedGeo.has(name)) {
860
+ // An anchor of the frame's picture (#1057): the end is that point, a
861
+ // box of no size the line arrives at.
862
+ const at = frames.anchorPoint?.(name, anchor) ?? { known: [] };
863
+ if ('hidden' in at) {
864
+ // The point is cut off by its frame (a picture past the frame's
865
+ // foot): nothing to point at on this page.
866
+ issues.push({ kind: 'connectorDropped', elementId: el.id, targetId: name });
867
+ return undefined;
868
+ }
869
+ if (!('x' in at)) {
870
+ issues.push({ kind: 'connectorAnchorUnknown', elementId: el.id, targetId: name, anchor, ...(at.resourceId !== undefined ? { resourceId: at.resourceId } : {}), known: at.known });
871
+ return undefined;
872
+ }
873
+ return { name, box: { x: at.x, y: at.y, width: 0, height: 0 }, end: end };
874
+ }
875
+ return { name, box, end: end };
876
+ };
877
+ const from = endOf(el.from);
878
+ if (!from)
879
+ return undefined;
880
+ const written = Array.isArray(el.to) ? el.to : el.to ? [el.to] : [];
881
+ const ends = [];
882
+ for (const end of written) {
883
+ const to = end?.to;
884
+ if (typeof to === 'string' && to.endsWith('[*]')) {
885
+ // Every instance of the frame the page has (#1061), in item order.
886
+ const frame = to.slice(1, -3);
887
+ const items = Object.keys(boxes)
888
+ .map((n) => ({ n, at: repeatInstance(n) }))
889
+ .filter((x) => x.at?.frame === frame)
890
+ .sort((a, b) => a.at.item - b.at.item);
891
+ for (const { n } of items) {
892
+ const e = endOf({ ...end, to: `#${n}` });
893
+ if (e)
894
+ ends.push(e);
895
+ }
896
+ continue;
897
+ }
898
+ const e = endOf(end);
899
+ if (e)
900
+ ends.push(e);
901
+ }
902
+ return layoutConnector(el, from, ends, { dpi, startRight });
903
+ }
774
904
  /** Layout one design slot against its container. */
775
905
  export function layoutDesignSlot(slot, context, pageIndex) {
776
906
  const issues = [];
@@ -787,10 +917,14 @@ export function layoutDesignSlot(slot, context, pageIndex) {
787
917
  .filter((el) => pageMatchesParity(pageIndex, el.parity) && pageMatchesRole(el.pages, context.pageRole))
788
918
  .map((el) => (overrides && Object.keys(overrides).length > 0 ? applyPaletteOverrides(el, overrides) : el))
789
919
  // Start and end edges read as the physical ones of this page (#936).
790
- .map((el) => (isLogicalEdge(el.placement.anchor.edge) ? { ...el, placement: physicalPlacement(el.placement, context.startRight === true) } : el));
920
+ .map((el) => (el.kind !== 'connector' && isLogicalEdge(el.placement.anchor.edge) ? { ...el, placement: physicalPlacement(el.placement, context.startRight === true) } : el));
921
+ // Connectors (#1056) are laid after every placed element, between the
922
+ // boxes they join; only where there are frames to join (a composed
923
+ // page's decoration).
924
+ const placed = candidates.filter((el) => el.kind !== 'connector');
791
925
  // Topologically sort (dependencies first) to resolve geometry; paint
792
926
  // order is still the array order (first = back), restored below.
793
- const ordered = topoSort(candidates, issues, context.frames?.named);
927
+ const ordered = topoSort(placed, issues, context.frames?.named);
794
928
  // Precompute: resolved text contents (placeholder-expanded), with the
795
929
  // `\n` escape of the template and of attribute values turned into a
796
930
  // newline before any case transform (which would make it `\N`).
@@ -847,9 +981,13 @@ export function layoutDesignSlot(slot, context, pageIndex) {
847
981
  fillRef = refGeo;
848
982
  }
849
983
  }
850
- const anchor = useElementEdge
984
+ const onEdge = useElementEdge
851
985
  ? resolveElementAnchor(given.placement.anchor.edge, refGeo)
852
986
  : resolveContainerAnchor(given.placement.anchor.edge, refGeo);
987
+ // A point along a side of another element, a frame or a group (#1055).
988
+ const anchor = target && !frame && refGeo !== containerRef && given.placement.anchor.at !== undefined
989
+ ? alongSide(onEdge, given.placement.anchor.edge, given.placement.anchor.at, refGeo, context.startRight === true)
990
+ : onEdge;
853
991
  // A text element's offset may be written in ems of its own size (a
854
992
  // running head four characters below the type area).
855
993
  const emPx = given.kind === 'text' ? dimPx(given.fontSize, context.dpi) : undefined;
@@ -903,6 +1041,14 @@ export function layoutDesignSlot(slot, context, pageIndex) {
903
1041
  resolvedGeo.set(el.id, prim);
904
1042
  primsByElement.set(given, [prim]);
905
1043
  }
1044
+ else if (el.kind === 'path') {
1045
+ // Data that cannot be read draws nothing; the box still stands for
1046
+ // the elements anchored to it.
1047
+ const prim = layoutPathElement(el, { anchorX, anchorY, pinX: anchor.pinX, pinY: anchor.pinY }, fillRef, context.dpi);
1048
+ resolvedGeo.set(el.id, prim);
1049
+ if (prim.subpaths.length > 0)
1050
+ primsByElement.set(given, [prim]);
1051
+ }
906
1052
  else if (el.kind === 'image') {
907
1053
  const prim = layoutImageElement(el, {
908
1054
  anchorX,
@@ -926,6 +1072,15 @@ export function layoutDesignSlot(slot, context, pageIndex) {
926
1072
  primsByElement.set(given, [prim]);
927
1073
  }
928
1074
  }
1075
+ if (context.frames?.named) {
1076
+ for (const el of candidates) {
1077
+ if (el.kind !== 'connector')
1078
+ continue;
1079
+ const prim = layoutConnectorElement(el, resolvedGeo, context.frames, issues, context.dpi, context.startRight === true);
1080
+ if (prim)
1081
+ primsByElement.set(el, [prim]);
1082
+ }
1083
+ }
929
1084
  const primitives = [];
930
1085
  const elementIds = [];
931
1086
  for (const el of candidates) {
@@ -1788,6 +1943,53 @@ function altTextOf(el, resource) {
1788
1943
  const altText = designImageAltText(resource);
1789
1944
  return altText ? { altText } : {};
1790
1945
  }
1946
+ /** The black of a path that sets neither a fill nor an outline (an SVG
1947
+ * path's default fill). */
1948
+ const DEFAULT_PATH_FILL = '#000000';
1949
+ /** An outline's width when the element gives none: 0.5 pt, a rule's. */
1950
+ const DEFAULT_PATH_STROKE_WIDTH = { value: 0.5, unit: 'pt' };
1951
+ /** A path element (#1060): its box sized and pinned as a box's, its
1952
+ * `viewBox` stretched to the box (`'none'`) or fitted inside it, centred
1953
+ * (`'meet'`), the outline in page px. Path data that cannot be read, or a
1954
+ * `viewBox` with no area, gives no outline. */
1955
+ function layoutPathElement(el, pin, container, dpi) {
1956
+ const widthSize = resolveFixedSize(el.placement.size?.width, dpi);
1957
+ const heightSize = resolveFixedSize(el.placement.size?.height, dpi);
1958
+ const width = typeof widthSize === 'number' ? widthSize : Math.max(0, fillToContainerEdge(pin.anchorX, pin.pinX, container));
1959
+ const height = typeof heightSize === 'number' ? heightSize : Math.max(0, fillToContainerEdgeY(pin.anchorY, pin.pinY, container));
1960
+ const x = edgeXFromPin(pin.anchorX, pin.pinX, width);
1961
+ const y = edgeYFromPin(pin.anchorY, pin.pinY, height);
1962
+ const prim = { kind: 'path', id: el.id, x, y, width, height, subpaths: [] };
1963
+ const vb = pathViewBox(el.viewBox);
1964
+ const parsed = typeof el.d === 'string' ? parseSvgPathCached(el.d) : undefined;
1965
+ if (!vb || !parsed?.ok)
1966
+ return prim;
1967
+ let sx = width / vb[0];
1968
+ let sy = height / vb[1];
1969
+ let ox = x;
1970
+ let oy = y;
1971
+ if (el.preserveAspectRatio === 'meet') {
1972
+ const k = Math.min(sx, sy);
1973
+ ox += (width - vb[0] * k) / 2;
1974
+ oy += (height - vb[1] * k) / 2;
1975
+ sx = k;
1976
+ sy = k;
1977
+ }
1978
+ prim.subpaths = mapPath(parsed.subpaths, ox, oy, sx, sy);
1979
+ const fill = el.fill?.hex ?? (el.stroke ? undefined : DEFAULT_PATH_FILL);
1980
+ if (fill)
1981
+ prim.fill = fill;
1982
+ if (el.stroke?.hex) {
1983
+ const widthPx = dimPx(el.width ?? DEFAULT_PATH_STROKE_WIDTH, dpi);
1984
+ const dash = (Array.isArray(el.dash) ? el.dash : []).map((d) => Math.max(0, dimPx(d, dpi)));
1985
+ prim.stroke = {
1986
+ color: el.stroke.hex,
1987
+ widthPx: Math.max(0, widthPx),
1988
+ ...(dash.length > 0 && dash.some((v) => v > 0) ? { dash } : {}),
1989
+ };
1990
+ }
1991
+ return prim;
1992
+ }
1791
1993
  function layoutBoxElement(el, pin, container, dpi) {
1792
1994
  const widthSize = resolveFixedSize(el.placement.size?.width, dpi);
1793
1995
  const heightSize = resolveFixedSize(el.placement.size?.height, dpi);