postext 1.34.0 → 1.35.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 (245) hide show
  1. package/dist/__tests__/bundle.test.js +33 -1
  2. package/dist/__tests__/bundle.test.js.map +1 -1
  3. package/dist/__tests__/codeBlocks.test.js +88 -0
  4. package/dist/__tests__/codeBlocks.test.js.map +1 -1
  5. package/dist/__tests__/composed/fixtures/page8.d.ts +20 -0
  6. package/dist/__tests__/composed/fixtures/page8.d.ts.map +1 -0
  7. package/dist/__tests__/composed/fixtures/page8.js +162 -0
  8. package/dist/__tests__/composed/fixtures/page8.js.map +1 -0
  9. package/dist/__tests__/composed/fixtures/timeline.d.ts +26 -0
  10. package/dist/__tests__/composed/fixtures/timeline.d.ts.map +1 -0
  11. package/dist/__tests__/composed/fixtures/timeline.js +153 -0
  12. package/dist/__tests__/composed/fixtures/timeline.js.map +1 -0
  13. package/dist/__tests__/composed/groups.test.d.ts +2 -0
  14. package/dist/__tests__/composed/groups.test.d.ts.map +1 -0
  15. package/dist/__tests__/composed/groups.test.js +361 -0
  16. package/dist/__tests__/composed/groups.test.js.map +1 -0
  17. package/dist/__tests__/composed/layout.test.d.ts +2 -0
  18. package/dist/__tests__/composed/layout.test.d.ts.map +1 -0
  19. package/dist/__tests__/composed/layout.test.js +387 -0
  20. package/dist/__tests__/composed/layout.test.js.map +1 -0
  21. package/dist/__tests__/composed/outsidePrint.test.d.ts +2 -0
  22. package/dist/__tests__/composed/outsidePrint.test.d.ts.map +1 -0
  23. package/dist/__tests__/composed/outsidePrint.test.js +116 -0
  24. package/dist/__tests__/composed/outsidePrint.test.js.map +1 -0
  25. package/dist/__tests__/composed/slotChecks.test.js +6 -3
  26. package/dist/__tests__/composed/slotChecks.test.js.map +1 -1
  27. package/dist/__tests__/composed/spread.test.d.ts +2 -0
  28. package/dist/__tests__/composed/spread.test.d.ts.map +1 -0
  29. package/dist/__tests__/composed/spread.test.js +475 -0
  30. package/dist/__tests__/composed/spread.test.js.map +1 -0
  31. package/dist/__tests__/composedPaint.test.d.ts +2 -0
  32. package/dist/__tests__/composedPaint.test.d.ts.map +1 -0
  33. package/dist/__tests__/composedPaint.test.js +199 -0
  34. package/dist/__tests__/composedPaint.test.js.map +1 -0
  35. package/dist/__tests__/defaults/stripRoundTrip.test.js +3 -2
  36. package/dist/__tests__/defaults/stripRoundTrip.test.js.map +1 -1
  37. package/dist/__tests__/exports.test.js +25 -0
  38. package/dist/__tests__/exports.test.js.map +1 -1
  39. package/dist/__tests__/highlightMarks.test.d.ts +2 -0
  40. package/dist/__tests__/highlightMarks.test.d.ts.map +1 -0
  41. package/dist/__tests__/highlightMarks.test.js +169 -0
  42. package/dist/__tests__/highlightMarks.test.js.map +1 -0
  43. package/dist/__tests__/tocPartLeader.test.d.ts +2 -0
  44. package/dist/__tests__/tocPartLeader.test.d.ts.map +1 -0
  45. package/dist/__tests__/tocPartLeader.test.js +133 -0
  46. package/dist/__tests__/tocPartLeader.test.js.map +1 -0
  47. package/dist/bundle/api.d.ts +8 -0
  48. package/dist/bundle/api.d.ts.map +1 -1
  49. package/dist/bundle/api.js +6 -3
  50. package/dist/bundle/api.js.map +1 -1
  51. package/dist/bundle/codec.d.ts +5 -0
  52. package/dist/bundle/codec.d.ts.map +1 -1
  53. package/dist/bundle/codec.js +4 -0
  54. package/dist/bundle/codec.js.map +1 -1
  55. package/dist/bundle/index.d.ts +2 -2
  56. package/dist/bundle/index.d.ts.map +1 -1
  57. package/dist/bundle/index.js +1 -1
  58. package/dist/bundle/index.js.map +1 -1
  59. package/dist/bundle/manifest.d.ts +14 -0
  60. package/dist/bundle/manifest.d.ts.map +1 -1
  61. package/dist/bundle/manifest.js +13 -0
  62. package/dist/bundle/manifest.js.map +1 -1
  63. package/dist/bundle/types.d.ts +7 -0
  64. package/dist/bundle/types.d.ts.map +1 -1
  65. package/dist/canvas-backend/annotations.d.ts +6 -0
  66. package/dist/canvas-backend/annotations.d.ts.map +1 -1
  67. package/dist/canvas-backend/annotations.js +39 -0
  68. package/dist/canvas-backend/annotations.js.map +1 -1
  69. package/dist/canvas-backend/blockRender.d.ts.map +1 -1
  70. package/dist/canvas-backend/blockRender.js +6 -1
  71. package/dist/canvas-backend/blockRender.js.map +1 -1
  72. package/dist/canvas-backend/composed.d.ts +19 -0
  73. package/dist/canvas-backend/composed.d.ts.map +1 -0
  74. package/dist/canvas-backend/composed.js +68 -0
  75. package/dist/canvas-backend/composed.js.map +1 -0
  76. package/dist/canvas-backend/index.d.ts.map +1 -1
  77. package/dist/canvas-backend/index.js +15 -1
  78. package/dist/canvas-backend/index.js.map +1 -1
  79. package/dist/canvas-backend/renderResourceBlock.d.ts.map +1 -1
  80. package/dist/canvas-backend/renderResourceBlock.js +4 -1
  81. package/dist/canvas-backend/renderResourceBlock.js.map +1 -1
  82. package/dist/composed/geometry.d.ts +108 -0
  83. package/dist/composed/geometry.d.ts.map +1 -0
  84. package/dist/composed/geometry.js +241 -0
  85. package/dist/composed/geometry.js.map +1 -0
  86. package/dist/composed/groups.d.ts +95 -0
  87. package/dist/composed/groups.d.ts.map +1 -0
  88. package/dist/composed/groups.js +359 -0
  89. package/dist/composed/groups.js.map +1 -0
  90. package/dist/composed/labelText.d.ts +15 -0
  91. package/dist/composed/labelText.d.ts.map +1 -0
  92. package/dist/composed/labelText.js +16 -0
  93. package/dist/composed/labelText.js.map +1 -0
  94. package/dist/composed/paint.d.ts +64 -0
  95. package/dist/composed/paint.d.ts.map +1 -0
  96. package/dist/composed/paint.js +128 -0
  97. package/dist/composed/paint.js.map +1 -0
  98. package/dist/composed/reflowLog.d.ts +39 -0
  99. package/dist/composed/reflowLog.d.ts.map +1 -0
  100. package/dist/composed/reflowLog.js +123 -0
  101. package/dist/composed/reflowLog.js.map +1 -0
  102. package/dist/composed/slotChecks.d.ts +7 -2
  103. package/dist/composed/slotChecks.d.ts.map +1 -1
  104. package/dist/composed/slotChecks.js +21 -0
  105. package/dist/composed/slotChecks.js.map +1 -1
  106. package/dist/composed/spread.d.ts +106 -0
  107. package/dist/composed/spread.d.ts.map +1 -0
  108. package/dist/composed/spread.js +178 -0
  109. package/dist/composed/spread.js.map +1 -0
  110. package/dist/composed/types.d.ts +1 -44
  111. package/dist/composed/types.d.ts.map +1 -1
  112. package/dist/composed/wrap.d.ts +52 -0
  113. package/dist/composed/wrap.d.ts.map +1 -0
  114. package/dist/composed/wrap.js +234 -0
  115. package/dist/composed/wrap.js.map +1 -0
  116. package/dist/configWarnings.js +1 -1
  117. package/dist/configWarnings.js.map +1 -1
  118. package/dist/defaults/codeStyle.d.ts.map +1 -1
  119. package/dist/defaults/codeStyle.js +1 -0
  120. package/dist/defaults/codeStyle.js.map +1 -1
  121. package/dist/defaults/headerFooter.d.ts.map +1 -1
  122. package/dist/defaults/headerFooter.js +4 -0
  123. package/dist/defaults/headerFooter.js.map +1 -1
  124. package/dist/defaults/index.d.ts +1 -0
  125. package/dist/defaults/index.d.ts.map +1 -1
  126. package/dist/defaults/index.js +9 -0
  127. package/dist/defaults/index.js.map +1 -1
  128. package/dist/defaults/markStyles.d.ts +23 -0
  129. package/dist/defaults/markStyles.d.ts.map +1 -0
  130. package/dist/defaults/markStyles.js +80 -0
  131. package/dist/defaults/markStyles.js.map +1 -0
  132. package/dist/defaults/shared.d.ts.map +1 -1
  133. package/dist/defaults/shared.js +12 -0
  134. package/dist/defaults/shared.js.map +1 -1
  135. package/dist/design/bidiText.d.ts +4 -1
  136. package/dist/design/bidiText.d.ts.map +1 -1
  137. package/dist/design/bidiText.js +5 -2
  138. package/dist/design/bidiText.js.map +1 -1
  139. package/dist/design/layout.d.ts +19 -0
  140. package/dist/design/layout.d.ts.map +1 -1
  141. package/dist/design/layout.js +110 -8
  142. package/dist/design/layout.js.map +1 -1
  143. package/dist/design/placeholders.d.ts +28 -2
  144. package/dist/design/placeholders.d.ts.map +1 -1
  145. package/dist/design/placeholders.js +24 -1
  146. package/dist/design/placeholders.js.map +1 -1
  147. package/dist/design/richText.d.ts +2 -0
  148. package/dist/design/richText.d.ts.map +1 -1
  149. package/dist/design/richText.js.map +1 -1
  150. package/dist/highlightMarks.d.ts +33 -0
  151. package/dist/highlightMarks.d.ts.map +1 -0
  152. package/dist/highlightMarks.js +209 -0
  153. package/dist/highlightMarks.js.map +1 -0
  154. package/dist/html-backend.d.ts.map +1 -1
  155. package/dist/html-backend.js +96 -9
  156. package/dist/html-backend.js.map +1 -1
  157. package/dist/htmlAnnotations.d.ts +5 -0
  158. package/dist/htmlAnnotations.d.ts.map +1 -1
  159. package/dist/htmlAnnotations.js +16 -0
  160. package/dist/htmlAnnotations.js.map +1 -1
  161. package/dist/index.d.ts +13 -4
  162. package/dist/index.d.ts.map +1 -1
  163. package/dist/index.js +12 -2
  164. package/dist/index.js.map +1 -1
  165. package/dist/knuthPlass/richAdapter.d.ts +3 -0
  166. package/dist/knuthPlass/richAdapter.d.ts.map +1 -1
  167. package/dist/knuthPlass/richAdapter.js +3 -2
  168. package/dist/knuthPlass/richAdapter.js.map +1 -1
  169. package/dist/measure/cache.js +3 -3
  170. package/dist/measure/cache.js.map +1 -1
  171. package/dist/measure/chipEdges.d.ts +13 -1
  172. package/dist/measure/chipEdges.d.ts.map +1 -1
  173. package/dist/measure/chipEdges.js +59 -1
  174. package/dist/measure/chipEdges.js.map +1 -1
  175. package/dist/measure/links.d.ts.map +1 -1
  176. package/dist/measure/links.js +78 -5
  177. package/dist/measure/links.js.map +1 -1
  178. package/dist/measure/rich.d.ts +3 -0
  179. package/dist/measure/rich.d.ts.map +1 -1
  180. package/dist/measure/rich.js +19 -4
  181. package/dist/measure/rich.js.map +1 -1
  182. package/dist/parse/inlineFormatting.d.ts +14 -0
  183. package/dist/parse/inlineFormatting.d.ts.map +1 -1
  184. package/dist/parse/inlineFormatting.js +104 -5
  185. package/dist/parse/inlineFormatting.js.map +1 -1
  186. package/dist/parse/links.js +1 -1
  187. package/dist/parse/links.js.map +1 -1
  188. package/dist/parse/softBreaks.js +1 -1
  189. package/dist/parse/softBreaks.js.map +1 -1
  190. package/dist/parse/sourceMapping.d.ts.map +1 -1
  191. package/dist/parse/sourceMapping.js +19 -3
  192. package/dist/parse/sourceMapping.js.map +1 -1
  193. package/dist/parse/types.d.ts +24 -0
  194. package/dist/parse/types.d.ts.map +1 -1
  195. package/dist/pipeline/build.d.ts.map +1 -1
  196. package/dist/pipeline/build.js +213 -301
  197. package/dist/pipeline/build.js.map +1 -1
  198. package/dist/pipeline/buildMeasurement.d.ts +4 -1
  199. package/dist/pipeline/buildMeasurement.d.ts.map +1 -1
  200. package/dist/pipeline/buildMeasurement.js +19 -1
  201. package/dist/pipeline/buildMeasurement.js.map +1 -1
  202. package/dist/pipeline/calloutLayout.d.ts +36 -1
  203. package/dist/pipeline/calloutLayout.d.ts.map +1 -1
  204. package/dist/pipeline/calloutLayout.js +93 -3
  205. package/dist/pipeline/calloutLayout.js.map +1 -1
  206. package/dist/pipeline/codeInline.d.ts +10 -1
  207. package/dist/pipeline/codeInline.d.ts.map +1 -1
  208. package/dist/pipeline/codeInline.js +96 -15
  209. package/dist/pipeline/codeInline.js.map +1 -1
  210. package/dist/pipeline/composedLayout.d.ts +93 -0
  211. package/dist/pipeline/composedLayout.d.ts.map +1 -0
  212. package/dist/pipeline/composedLayout.js +520 -0
  213. package/dist/pipeline/composedLayout.js.map +1 -0
  214. package/dist/pipeline/config.d.ts.map +1 -1
  215. package/dist/pipeline/config.js +2 -1
  216. package/dist/pipeline/config.js.map +1 -1
  217. package/dist/pipeline/contentWarnings.d.ts.map +1 -1
  218. package/dist/pipeline/contentWarnings.js +39 -2
  219. package/dist/pipeline/contentWarnings.js.map +1 -1
  220. package/dist/pipeline/floatSlots.js +1 -1
  221. package/dist/pipeline/floatSlots.js.map +1 -1
  222. package/dist/pipeline/frameLayout.d.ts +120 -0
  223. package/dist/pipeline/frameLayout.d.ts.map +1 -0
  224. package/dist/pipeline/frameLayout.js +279 -0
  225. package/dist/pipeline/frameLayout.js.map +1 -0
  226. package/dist/pipeline/headerFooter.d.ts.map +1 -1
  227. package/dist/pipeline/headerFooter.js +96 -3
  228. package/dist/pipeline/headerFooter.js.map +1 -1
  229. package/dist/pipeline/pageRoles.d.ts +1 -0
  230. package/dist/pipeline/pageRoles.d.ts.map +1 -1
  231. package/dist/pipeline/pageRoles.js +3 -0
  232. package/dist/pipeline/pageRoles.js.map +1 -1
  233. package/dist/pipeline/placement.js +1 -1
  234. package/dist/pipeline/placement.js.map +1 -1
  235. package/dist/pipeline/resourceLayout.d.ts.map +1 -1
  236. package/dist/pipeline/resourceLayout.js +5 -3
  237. package/dist/pipeline/resourceLayout.js.map +1 -1
  238. package/dist/pipeline/tabs.js +1 -1
  239. package/dist/pipeline/tabs.js.map +1 -1
  240. package/dist/types.d.ts +89 -3
  241. package/dist/types.d.ts.map +1 -1
  242. package/dist/vdt.d.ts +247 -1
  243. package/dist/vdt.d.ts.map +1 -1
  244. package/dist/vdt.js.map +1 -1
  245. package/package.json +1 -1
@@ -0,0 +1,359 @@
1
+ import { anchorTarget } from './templates';
2
+ import { nextFrameOf } from './geometry';
3
+ const EPS = 0.5;
4
+ const clamp = (v, min, max) => Math.max(min, Math.min(v, max));
5
+ /** Share `amount` among `items` in proportion to `weight`, none past its
6
+ * `room`; what an item cannot take goes to the others. Returns each one's
7
+ * share, in `items` order. */
8
+ export function shareOut(amount, items) {
9
+ const out = items.map(() => 0);
10
+ let left = amount;
11
+ let open = items.map((it, i) => (it.weight > 0 && it.room > EPS ? i : -1)).filter((i) => i >= 0);
12
+ while (left > EPS && open.length > 0) {
13
+ const total = open.reduce((s, i) => s + items[i].weight, 0);
14
+ let used = 0;
15
+ const still = [];
16
+ for (const i of open) {
17
+ const want = (left * items[i].weight) / total;
18
+ const room = items[i].room - out[i];
19
+ const take = Math.min(want, room);
20
+ out[i] += take;
21
+ used += take;
22
+ if (room - take > EPS)
23
+ still.push(i);
24
+ }
25
+ left -= used;
26
+ if (still.length === open.length)
27
+ break;
28
+ open = still;
29
+ }
30
+ return out;
31
+ }
32
+ /** Tiers of the frames that yield, lowest priority first. */
33
+ function yieldTiers(items) {
34
+ const by = new Map();
35
+ for (const it of items)
36
+ if (it.shrink > 0)
37
+ (by.get(it.priority) ?? by.set(it.priority, []).get(it.priority)).push(it);
38
+ return [...by.keys()].sort((a, b) => a - b).map((k) => by.get(k));
39
+ }
40
+ const overlapsX = (a, b) => a.x < b.x + b.width && b.x < a.x + a.width;
41
+ const overlapsY = (a, b) => a.y < b.y + b.height && b.y < a.y + a.height;
42
+ /** The boxes of a group's frames, by name. */
43
+ export function layoutGroup(input) {
44
+ return input.kind === 'row' ? layoutRow(input) : layoutStack(input);
45
+ }
46
+ function layoutStack(input) {
47
+ const { box, gap } = input;
48
+ const flow = input.items.filter((i) => !i.pin);
49
+ const pins = input.items.filter((i) => i.pin).map((i) => i.own);
50
+ const obstacles = [...(input.obstacles ?? []), ...pins];
51
+ const heights = flow.map((i) => clamp(i.want, i.min, i.max));
52
+ const place = (hs, lead = 0, extraGap = 0) => {
53
+ const out = [];
54
+ let cursor = box.y + lead;
55
+ flow.forEach((it, k) => {
56
+ let y = cursor;
57
+ const h = hs[k];
58
+ // Skip the band of every pinned frame the box would meet.
59
+ for (let moved = true, guard = 0; moved && guard < obstacles.length + 1; guard++) {
60
+ moved = false;
61
+ for (const o of obstacles) {
62
+ if (overlapsX(it.own, o) && overlapsY({ y: y - gap, height: h + 2 * gap }, o) && o.y + o.height + gap > y) {
63
+ y = o.y + o.height + gap;
64
+ moved = true;
65
+ }
66
+ }
67
+ }
68
+ out.push({ x: it.own.x, y, width: it.own.width, height: h });
69
+ cursor = y + h + gap + extraGap;
70
+ });
71
+ return out;
72
+ };
73
+ const bottomOf = (rs) => (rs.length > 0 ? Math.max(...rs.map((r) => r.y + r.height)) : box.y);
74
+ const foot = input.elastic ? Math.max(input.limit.y + input.limit.height, box.y) : box.y + box.height;
75
+ let rects = place(heights);
76
+ // Too tall: the frames that yield give space back, lowest priority
77
+ // first, in proportion to `shrink` within a priority, down to their
78
+ // minimum (their content may then run past their foot).
79
+ for (const tier of yieldTiers(flow.map((it, k) => ({ ...it, k })))) {
80
+ const excess = bottomOf(rects) - foot;
81
+ if (excess <= EPS)
82
+ break;
83
+ const shares = shareOut(excess, tier.map((t) => ({ weight: t.shrink, room: heights[t.k] - t.min })));
84
+ tier.forEach((t, j) => (heights[t.k] = heights[t.k] - shares[j]));
85
+ rects = place(heights);
86
+ }
87
+ if (bottomOf(rects) - foot > EPS) {
88
+ // Nothing more yields: no frame runs past the group's foot.
89
+ rects = rects.map((r) => ({ ...r, height: Math.max(0, Math.min(r.height, foot - r.y)) }));
90
+ return named(flow, rects, input.items);
91
+ }
92
+ if (input.elastic)
93
+ return named(flow, rects, input.items);
94
+ // Spare space: to the frames that grow, in proportion to `grow`, up to
95
+ // their maximum; what is left follows `align`.
96
+ const spare = foot - bottomOf(rects);
97
+ if (spare > EPS) {
98
+ const shares = shareOut(spare, flow.map((it, k) => ({ weight: it.grow, room: it.max - heights[k] })));
99
+ if (shares.some((s) => s > 0)) {
100
+ shares.forEach((s, k) => (heights[k] = heights[k] + s));
101
+ rects = place(heights);
102
+ }
103
+ const rest = foot - bottomOf(rects);
104
+ // Pinned frames hold their place: spare space then stays at the foot.
105
+ if (rest > EPS && obstacles.length === 0 && flow.length > 0) {
106
+ if (input.align === 'end')
107
+ rects = place(heights, rest);
108
+ else if (input.align === 'center')
109
+ rects = place(heights, rest / 2);
110
+ else if (input.align === 'space-between' && flow.length > 1)
111
+ rects = place(heights, 0, rest / (flow.length - 1));
112
+ }
113
+ }
114
+ return named(flow, rects, input.items);
115
+ }
116
+ function layoutRow(input) {
117
+ const { box, gap, mmPx } = input;
118
+ const flow = input.items.filter((i) => !i.pin);
119
+ const pins = input.items.filter((i) => i.pin).map((i) => i.own);
120
+ const obstacles = [...(input.obstacles ?? []), ...pins];
121
+ const widths = flow.map((i) => clamp(i.own.width, i.minWidth, i.maxWidth));
122
+ const declaredH = flow.map((i) => clamp(i.fixedHeight ? i.own.height : i.want, i.min, i.max));
123
+ /** The row's height: its box's, or the tallest frame's. */
124
+ const rowH = input.elastic ? Math.max(0, ...declaredH) : box.height;
125
+ /** The height a frame has in the row: a fixed one its own, the others
126
+ * the row's. */
127
+ const heightIn = (k, h) => (flow[k].fixedHeight ? Math.min(declaredH[k], h) : clamp(h, flow[k].min, flow[k].max));
128
+ const fits = (k, w) => !flow[k].need || flow[k].need(w) <= heightIn(k, rowH) + EPS;
129
+ const used = () => widths.reduce((s, w) => s + w, 0) + gap * Math.max(0, flow.length - 1);
130
+ let spare = input.elastic ? 0 : box.width - used();
131
+ if (input.negotiate) {
132
+ /** The narrowest width, in whole mm below `w`, at which frame `k`'s
133
+ * content still fits the row (`w` itself when no narrower one does). */
134
+ const narrowest = (k, w) => {
135
+ const floor = Math.max(flow[k].minWidth, mmPx);
136
+ let hi = Math.floor((w - floor) / mmPx); // millimetres it may give
137
+ if (hi <= 0 || !fits(k, w))
138
+ return w;
139
+ let lo = 0;
140
+ while (lo < hi) {
141
+ const mid = Math.ceil((lo + hi) / 2);
142
+ if (fits(k, w - mid * mmPx))
143
+ lo = mid;
144
+ else
145
+ hi = mid - 1;
146
+ }
147
+ return w - lo * mmPx;
148
+ };
149
+ flow.forEach((it, k) => {
150
+ if (fits(k, widths[k]))
151
+ return;
152
+ const rooms = flow.map((s, j) => (j === k || s.shrink <= 0 ? 0 : widths[j] - narrowest(j, widths[j])));
153
+ const free = Math.max(0, spare) + rooms.reduce((s, r) => s + r, 0);
154
+ const cap = Math.min(it.maxWidth, widths[k] + free);
155
+ const most = Math.floor((cap - widths[k] + EPS) / mmPx);
156
+ // The fewest whole millimetres that make the content fit, by
157
+ // bisection; none when even all the room does not.
158
+ if (most <= 0 || !fits(k, widths[k] + most * mmPx))
159
+ return;
160
+ let lo = 1;
161
+ let hi = most;
162
+ while (lo < hi) {
163
+ const mid = Math.floor((lo + hi) / 2);
164
+ if (fits(k, widths[k] + mid * mmPx))
165
+ hi = mid;
166
+ else
167
+ lo = mid + 1;
168
+ }
169
+ let need = lo * mmPx;
170
+ widths[k] += need;
171
+ const fromSpare = Math.min(Math.max(0, spare), need);
172
+ spare -= fromSpare;
173
+ need -= fromSpare;
174
+ // The rest from the siblings that yield, lowest priority first, in
175
+ // whole millimetres, in proportion to `shrink` within a priority.
176
+ for (const tier of yieldTiers(flow.map((s, j) => ({ ...s, j })).filter((s) => s.j !== k && rooms[s.j] > EPS))) {
177
+ if (need <= EPS)
178
+ break;
179
+ const shares = shareOut(need, tier.map((t) => ({ weight: t.shrink, room: rooms[t.j] })));
180
+ let mmLeft = Math.ceil(need / mmPx - 1e-6);
181
+ const whole = shares.map((s) => Math.min(Math.floor((s + EPS) / mmPx), mmLeft));
182
+ mmLeft -= whole.reduce((s, v) => s + v, 0);
183
+ // Rounding: the remaining millimetres from the last frames first.
184
+ for (let j = tier.length - 1; j >= 0 && mmLeft > 0; j--) {
185
+ const roomMm = Math.floor((rooms[tier[j].j] + EPS) / mmPx) - whole[j];
186
+ const add = Math.min(roomMm, mmLeft);
187
+ whole[j] += add;
188
+ mmLeft -= add;
189
+ }
190
+ tier.forEach((t, j) => {
191
+ widths[t.j] -= whole[j] * mmPx;
192
+ need -= whole[j] * mmPx;
193
+ });
194
+ }
195
+ // Whole millimetres may give a little more than the frame took.
196
+ if (need < 0)
197
+ spare -= need;
198
+ });
199
+ }
200
+ // Spare width: to the frames that grow, then `align`.
201
+ if (!input.elastic && spare > EPS) {
202
+ const shares = shareOut(spare, flow.map((it, k) => ({ weight: it.grow, room: it.maxWidth - widths[k] })));
203
+ shares.forEach((s, k) => (widths[k] += s));
204
+ spare -= shares.reduce((s, v) => s + v, 0);
205
+ }
206
+ // An elastic row grows as tall as its tallest frame now needs.
207
+ let height = rowH;
208
+ if (input.elastic && input.negotiate) {
209
+ const tallest = Math.max(rowH, ...flow.map((it, k) => (it.fixedHeight || !it.need ? 0 : clamp(it.need(widths[k]), it.min, it.max))));
210
+ height = Math.min(tallest, Math.max(rowH, input.limit.y + input.limit.height - box.y));
211
+ }
212
+ let lead = 0;
213
+ let extraGap = 0;
214
+ if (spare > EPS && obstacles.length === 0 && flow.length > 0) {
215
+ if (input.align === 'end')
216
+ lead = spare;
217
+ else if (input.align === 'center')
218
+ lead = spare / 2;
219
+ else if (input.align === 'space-between' && flow.length > 1)
220
+ extraGap = spare / (flow.length - 1);
221
+ }
222
+ const rects = [];
223
+ let cursor = box.x + lead;
224
+ flow.forEach((_it, k) => {
225
+ const w = widths[k];
226
+ const h = heightIn(k, height);
227
+ let x = cursor;
228
+ for (let moved = true, guard = 0; moved && guard < obstacles.length + 1; guard++) {
229
+ moved = false;
230
+ for (const o of obstacles) {
231
+ if (overlapsY({ y: box.y, height: h }, o) && overlapsX({ x: x - gap, width: w + 2 * gap }, o) && o.x + o.width + gap > x) {
232
+ x = o.x + o.width + gap;
233
+ moved = true;
234
+ }
235
+ }
236
+ }
237
+ rects.push({ x, y: box.y, width: w, height: h });
238
+ cursor = x + w + gap + extraGap;
239
+ });
240
+ return named(flow, rects, input.items);
241
+ }
242
+ function named(flow, rects, all) {
243
+ const out = new Map();
244
+ for (const it of all) {
245
+ const k = flow.indexOf(it);
246
+ out.set(it.name, k >= 0 ? rects[k] : { ...it.own });
247
+ }
248
+ return out;
249
+ }
250
+ /** The group each frame belongs to (its first, when validation found it
251
+ * in two). Groups with no frame are left out. */
252
+ export function groupOfFrames(template) {
253
+ const names = new Set(template.frames.map((f) => f.name));
254
+ const out = new Map();
255
+ for (const g of template.groups)
256
+ for (const m of g.frames)
257
+ if (names.has(m) && !out.has(m))
258
+ out.set(m, g);
259
+ return out;
260
+ }
261
+ /**
262
+ * The order a composed page is placed and filled in: P4's
263
+ * {@link frameOrder} rules (a frame after what it anchors to and after the
264
+ * frame its chain comes from, frames that push text first, else template
265
+ * order), with each group a single step. A group comes after everything
266
+ * its frames and its own box anchor to; anything anchored to the group or
267
+ * to one of its frames comes after it. Its frames are filled in group
268
+ * order. Loops (a group's frame anchored to a frame anchored back into the
269
+ * group) are broken where they close, as P4 breaks anchor loops.
270
+ */
271
+ export function composedOrder(template) {
272
+ const byName = new Map(template.frames.map((f) => [f.name, f]));
273
+ const groupOf = groupOfFrames(template);
274
+ const groups = new Map(template.groups.map((g) => [g.name, g]));
275
+ const prev = new Map();
276
+ for (const f of template.frames) {
277
+ const n = nextFrameOf(f);
278
+ if (n && byName.has(n) && !prev.has(n))
279
+ prev.set(n, f.name);
280
+ }
281
+ /** The step a frame or group name is placed in. */
282
+ const stepKey = (name) => {
283
+ if (byName.has(name)) {
284
+ const g = groupOf.get(name);
285
+ return g ? `g:${g.name}` : `f:${name}`;
286
+ }
287
+ const g = groups.get(name);
288
+ if (!g)
289
+ return undefined;
290
+ if (g.frames.some((m) => groupOf.get(m) === g))
291
+ return `g:${g.name}`;
292
+ return undefined;
293
+ };
294
+ /** Steps a group with no frame stands for: its own anchor. */
295
+ const targetKeys = (target, seen) => {
296
+ if (!target)
297
+ return [];
298
+ const k = stepKey(target);
299
+ if (k)
300
+ return [k];
301
+ const g = groups.get(target);
302
+ if (!g || seen.has(g.name))
303
+ return [];
304
+ seen.add(g.name);
305
+ if (g.grid)
306
+ return [];
307
+ if (g.placement)
308
+ return targetKeys(anchorTarget(g.placement), seen);
309
+ return g.frames.flatMap((m) => targetKeys(m, seen));
310
+ };
311
+ const frameDeps = (f) => {
312
+ const out = f.grid ? [] : targetKeys(anchorTarget(f.placement), new Set());
313
+ const p = prev.get(f.name);
314
+ if (p)
315
+ out.push(...targetKeys(p, new Set()));
316
+ return out;
317
+ };
318
+ const steps = new Map();
319
+ const deps = new Map();
320
+ for (const f of template.frames) {
321
+ const g = groupOf.get(f.name);
322
+ const key = g ? `g:${g.name}` : `f:${f.name}`;
323
+ if (!steps.has(key)) {
324
+ steps.set(key, g
325
+ ? { kind: 'group', group: g, frames: g.frames.filter((m) => groupOf.get(m) === g).map((m) => byName.get(m)) }
326
+ : { kind: 'frame', frame: f });
327
+ deps.set(key, []);
328
+ }
329
+ deps.get(key).push(...frameDeps(f).filter((d) => d !== key));
330
+ }
331
+ for (const [key, step] of steps) {
332
+ if (step.kind !== 'group' || step.group.grid)
333
+ continue;
334
+ deps.get(key).push(...targetKeys(anchorTarget(step.group.placement), new Set([step.group.name])).filter((d) => d !== key));
335
+ }
336
+ const out = [];
337
+ const state = new Map();
338
+ const visit = (key) => {
339
+ if (state.has(key))
340
+ return;
341
+ state.set(key, 'visiting');
342
+ for (const d of deps.get(key) ?? [])
343
+ if (steps.has(d))
344
+ visit(d);
345
+ state.set(key, 'done');
346
+ out.push(steps.get(key));
347
+ };
348
+ const keyOf = (f) => {
349
+ const g = groupOf.get(f.name);
350
+ return g ? `g:${g.name}` : `f:${f.name}`;
351
+ };
352
+ for (const f of template.frames)
353
+ if (f.exclude === 'push')
354
+ visit(keyOf(f));
355
+ for (const f of template.frames)
356
+ visit(keyOf(f));
357
+ return out;
358
+ }
359
+ //# sourceMappingURL=groups.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"groups.js","sourceRoot":"","sources":["../../src/composed/groups.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * A figure's labels as text (#862): what the outputs that do not draw a
3
+ * `:::figure`'s `::label` lines on its picture read instead. The tagged
4
+ * PDF's `Alt` and the HTML viewer's `alt` give the picture's alternative
5
+ * text followed by its labels; the reflowable EPUB lists them after the
6
+ * picture.
7
+ */
8
+ import type { VDTFigureLabel } from '../vdt';
9
+ /** A figure's alternative text followed by its labels, in the order
10
+ * written: `Alt (Label, Label)`; the full-width brackets and the
11
+ * enumeration comma for Chinese and Japanese labels, the Arabic comma for
12
+ * Arabic ones. The labels alone when there is no alternative text; the
13
+ * text as it is when there are no labels. */
14
+ export declare function altWithLabels(alt: string, labels: readonly Pick<VDTFigureLabel, 'text'>[] | undefined): string;
15
+ //# sourceMappingURL=labelText.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"labelText.d.ts","sourceRoot":"","sources":["../../src/composed/labelText.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAE7C;;;;8CAI8C;AAC9C,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,EAAE,GAAG,SAAS,GAAG,MAAM,CAO9G"}
@@ -0,0 +1,16 @@
1
+ /** A figure's alternative text followed by its labels, in the order
2
+ * written: `Alt (Label, Label)`; the full-width brackets and the
3
+ * enumeration comma for Chinese and Japanese labels, the Arabic comma for
4
+ * Arabic ones. The labels alone when there is no alternative text; the
5
+ * text as it is when there are no labels. */
6
+ export function altWithLabels(alt, labels) {
7
+ const texts = (labels ?? []).map((l) => l.text.replace(/\s+/g, ' ').trim()).filter(Boolean);
8
+ if (texts.length === 0)
9
+ return alt;
10
+ const all = texts.join('');
11
+ if (/[぀-ヿ㐀-鿿]/.test(all))
12
+ return alt ? `${alt}(${texts.join('、')})` : texts.join('、');
13
+ const list = texts.join(/[؀-ۿ]/.test(all) ? '، ' : ', ');
14
+ return alt ? `${alt} (${list})` : list;
15
+ }
16
+ //# sourceMappingURL=labelText.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"labelText.js","sourceRoot":"","sources":["../../src/composed/labelText.ts"],"names":[],"mappings":"AASA;;;;8CAI8C;AAC9C,MAAM,UAAU,aAAa,CAAC,GAAW,EAAE,MAA2D;IACpG,MAAM,KAAK,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC5F,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC;IACnC,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3B,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACtF,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACzD,OAAO,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AACzC,CAAC"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * How the backends paint a composed page (#855, DESIGN §4): the frames in
3
+ * layer order with the template's decoration at layer 0, each frame's
4
+ * blocks turned by its matrix and clipped to its box when its content
5
+ * overflows; on a page of a spread (#861) all of it clipped to the page's
6
+ * share of the sheet. Shared by canvas, PDF and HTML so the three agree.
7
+ */
8
+ import type { VDTBlock, VDTComposedPage, VDTFrame, VDTPage } from '../vdt';
9
+ /** One step of a composed page's paint order. */
10
+ export type ComposedPaintItem =
11
+ /** `facing`: the half of a frame read on the facing page of a spread
12
+ * (`VDTFrame.facingBlocks`, #861): painted, never read. */
13
+ {
14
+ kind: 'frame';
15
+ frame: VDTFrame;
16
+ blocks: VDTBlock[];
17
+ facing: boolean;
18
+ } | {
19
+ kind: 'decoration';
20
+ };
21
+ /** Ids of the floats a composed page's frames hold: the backends paint
22
+ * them with their frames ({@link composedPaintOrder}), not with the
23
+ * page's other floats. Empty for any other page. */
24
+ export declare function composedFrameBlockIds(page: VDTPage): Set<string>;
25
+ /** The paint order of a composed page: frames of a layer below 0, the
26
+ * decoration (layer 0), then the frames of layer 0 and up; frames of
27
+ * one layer in template order. Each frame comes with its blocks, in
28
+ * `page.floats` order (its box first). */
29
+ export declare function composedPaintOrder(page: VDTPage): ComposedPaintItem[];
30
+ /** The items of a paint order (`composedPaintOrder`) in reading order
31
+ * (#862): the decoration first, then the frames by the Markdown order of
32
+ * their content (the lowest content index of their blocks; a frame with
33
+ * no content keeps its place after those that have some). The pieces of
34
+ * one story (`next`) follow each other, as their content does. What the
35
+ * HTML writes in this order and paints by `z-index`; the tagged PDF reads
36
+ * the same order (`readFloat`'s `readAt`). */
37
+ export declare function composedReadingOrder(paint: readonly ComposedPaintItem[]): ComposedPaintItem[];
38
+ /** On a page of a spread (#861): the box the page's frames and decoration
39
+ * are painted clipped to (`VDTComposedPage.sheetClip`), so what crosses
40
+ * the spine shows its own half on each page; undefined on any other
41
+ * page. */
42
+ export declare function composedSheetClip(page: Pick<VDTPage, 'composed'>): {
43
+ x: number;
44
+ y: number;
45
+ width: number;
46
+ height: number;
47
+ } | undefined;
48
+ /** The affine matrix `[a, b, c, d, e, f]` (canvas `transform` order,
49
+ * y down) that turns a frame `rotate` degrees clockwise about the centre
50
+ * of its box; undefined for an upright frame. */
51
+ export declare function frameMatrix(frame: Pick<VDTFrame, 'rect' | 'rotate'>): [number, number, number, number, number, number] | undefined;
52
+ /** Whether a frame's content is clipped to its box: some of it runs past
53
+ * the frame's foot. */
54
+ export declare function frameClips(frame: Pick<VDTFrame, 'overflowPx'>): boolean;
55
+ /** The axis-aligned box a frame covers on the page once turned. */
56
+ export declare function frameBounds(frame: Pick<VDTFrame, 'rect' | 'rotate'>): {
57
+ x: number;
58
+ y: number;
59
+ width: number;
60
+ height: number;
61
+ };
62
+ /** The frame of `composed` holding block `id`, if any. */
63
+ export declare function frameOfBlock(composed: VDTComposedPage | undefined, id: string): VDTFrame | undefined;
64
+ //# sourceMappingURL=paint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paint.d.ts","sourceRoot":"","sources":["../../src/composed/paint.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAE3E,iDAAiD;AACjD,MAAM,MAAM,iBAAiB;AAC3B;4DAC4D;AAC1D;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,QAAQ,EAAE,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GACvE;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,CAAC;AAE3B;;qDAEqD;AACrD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,CAIhE;AAED;;;2CAG2C;AAC3C,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,GAAG,iBAAiB,EAAE,CA4BrE;AAED;;;;;;+CAM+C;AAC/C,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,SAAS,iBAAiB,EAAE,GAAG,iBAAiB,EAAE,CAoB7F;AAED;;;YAGY;AACZ,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAEtI;AAED;;kDAEkD;AAClD,wBAAgB,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CASlI;AAED;wBACwB;AACxB,wBAAgB,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,GAAG,OAAO,CAEvE;AAED,mEAAmE;AACnE,wBAAgB,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAAC,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAa7H;AAED,0DAA0D;AAC1D,wBAAgB,YAAY,CAAC,QAAQ,EAAE,eAAe,GAAG,SAAS,EAAE,EAAE,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAEpG"}
@@ -0,0 +1,128 @@
1
+ /** Ids of the floats a composed page's frames hold: the backends paint
2
+ * them with their frames ({@link composedPaintOrder}), not with the
3
+ * page's other floats. Empty for any other page. */
4
+ export function composedFrameBlockIds(page) {
5
+ const ids = new Set();
6
+ for (const f of page.composed?.frames ?? [])
7
+ for (const id of f.blockIds)
8
+ ids.add(id);
9
+ return ids;
10
+ }
11
+ /** The paint order of a composed page: frames of a layer below 0, the
12
+ * decoration (layer 0), then the frames of layer 0 and up; frames of
13
+ * one layer in template order. Each frame comes with its blocks, in
14
+ * `page.floats` order (its box first). */
15
+ export function composedPaintOrder(page) {
16
+ const composed = page.composed;
17
+ if (!composed)
18
+ return [];
19
+ const byId = new Map();
20
+ for (const b of page.floats ?? [])
21
+ byId.set(b.id, b);
22
+ const frames = composed.frames
23
+ .map((frame, order) => ({ frame, order }))
24
+ .sort((a, b) => a.frame.layer - b.frame.layer || a.order - b.order);
25
+ const out = [];
26
+ let decorated = false;
27
+ for (const { frame } of frames) {
28
+ if (!decorated && frame.layer >= 0) {
29
+ out.push({ kind: 'decoration' });
30
+ decorated = true;
31
+ }
32
+ if (frame.facingBlocks) {
33
+ out.push({ kind: 'frame', frame, blocks: frame.facingBlocks, facing: true });
34
+ continue;
35
+ }
36
+ const blocks = [];
37
+ for (const id of frame.blockIds) {
38
+ const b = byId.get(id);
39
+ if (b)
40
+ blocks.push(b);
41
+ }
42
+ out.push({ kind: 'frame', frame, blocks, facing: false });
43
+ }
44
+ if (!decorated)
45
+ out.push({ kind: 'decoration' });
46
+ return out;
47
+ }
48
+ /** The items of a paint order (`composedPaintOrder`) in reading order
49
+ * (#862): the decoration first, then the frames by the Markdown order of
50
+ * their content (the lowest content index of their blocks; a frame with
51
+ * no content keeps its place after those that have some). The pieces of
52
+ * one story (`next`) follow each other, as their content does. What the
53
+ * HTML writes in this order and paints by `z-index`; the tagged PDF reads
54
+ * the same order (`readFloat`'s `readAt`). */
55
+ export function composedReadingOrder(paint) {
56
+ const byId = new Map();
57
+ for (const item of paint)
58
+ if (item.kind === 'frame')
59
+ byId.set(item.frame.id, item.frame);
60
+ /** How many frames a chain passes through before this one: a piece of a
61
+ * paragraph cut at a frame's foot has the head's content index. */
62
+ const depth = (frame) => {
63
+ let n = 0;
64
+ for (let f = frame.continuedFrom ? byId.get(frame.continuedFrom) : undefined; f && n < byId.size; f = f.continuedFrom ? byId.get(f.continuedFrom) : undefined)
65
+ n++;
66
+ return n;
67
+ };
68
+ const firstIndex = (item) => {
69
+ if (item.kind === 'decoration')
70
+ return -Infinity;
71
+ let min = Infinity;
72
+ for (const b of item.blocks)
73
+ if (b.contentIndex !== undefined && b.contentIndex < min)
74
+ min = b.contentIndex;
75
+ return min + depth(item.frame) / 1000;
76
+ };
77
+ return paint
78
+ .map((item, order) => ({ item, order, at: firstIndex(item) }))
79
+ .sort((a, b) => (a.at === b.at ? a.order - b.order : a.at - b.at))
80
+ .map((e) => e.item);
81
+ }
82
+ /** On a page of a spread (#861): the box the page's frames and decoration
83
+ * are painted clipped to (`VDTComposedPage.sheetClip`), so what crosses
84
+ * the spine shows its own half on each page; undefined on any other
85
+ * page. */
86
+ export function composedSheetClip(page) {
87
+ return page.composed?.sheetClip;
88
+ }
89
+ /** The affine matrix `[a, b, c, d, e, f]` (canvas `transform` order,
90
+ * y down) that turns a frame `rotate` degrees clockwise about the centre
91
+ * of its box; undefined for an upright frame. */
92
+ export function frameMatrix(frame) {
93
+ const deg = frame.rotate % 360;
94
+ if (!Number.isFinite(deg) || Math.abs(deg) < 1e-9)
95
+ return undefined;
96
+ const t = (deg * Math.PI) / 180;
97
+ const cos = Math.cos(t);
98
+ const sin = Math.sin(t);
99
+ const cx = frame.rect.x + frame.rect.width / 2;
100
+ const cy = frame.rect.y + frame.rect.height / 2;
101
+ return [cos, sin, -sin, cos, cx - cos * cx + sin * cy, cy - sin * cx - cos * cy];
102
+ }
103
+ /** Whether a frame's content is clipped to its box: some of it runs past
104
+ * the frame's foot. */
105
+ export function frameClips(frame) {
106
+ return frame.overflowPx > 0.5;
107
+ }
108
+ /** The axis-aligned box a frame covers on the page once turned. */
109
+ export function frameBounds(frame) {
110
+ const m = frameMatrix(frame);
111
+ const r = frame.rect;
112
+ if (!m)
113
+ return { ...r };
114
+ const pts = [[r.x, r.y], [r.x + r.width, r.y], [r.x, r.y + r.height], [r.x + r.width, r.y + r.height]].map(([x, y]) => [
115
+ m[0] * x + m[2] * y + m[4],
116
+ m[1] * x + m[3] * y + m[5],
117
+ ]);
118
+ const xs = pts.map((p) => p[0]);
119
+ const ys = pts.map((p) => p[1]);
120
+ const x = Math.min(...xs);
121
+ const y = Math.min(...ys);
122
+ return { x, y, width: Math.max(...xs) - x, height: Math.max(...ys) - y };
123
+ }
124
+ /** The frame of `composed` holding block `id`, if any. */
125
+ export function frameOfBlock(composed, id) {
126
+ return composed?.frames.find((f) => f.blockIds.includes(id));
127
+ }
128
+ //# sourceMappingURL=paint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paint.js","sourceRoot":"","sources":["../../src/composed/paint.ts"],"names":[],"mappings":"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"}