@graphrefly/graphrefly 0.47.2 → 0.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 (266) hide show
  1. package/dist/base/composition/index.cjs +4 -3
  2. package/dist/base/composition/index.cjs.map +1 -1
  3. package/dist/base/composition/index.d.cts +14 -5
  4. package/dist/base/composition/index.d.ts +14 -5
  5. package/dist/base/composition/index.js +8 -8
  6. package/dist/base/index.cjs +152 -78
  7. package/dist/base/index.cjs.map +1 -1
  8. package/dist/base/index.d.cts +2 -2
  9. package/dist/base/index.d.ts +2 -2
  10. package/dist/base/index.js +75 -70
  11. package/dist/base/io/index.cjs +31 -17
  12. package/dist/base/io/index.cjs.map +1 -1
  13. package/dist/base/io/index.d.cts +32 -5
  14. package/dist/base/io/index.d.ts +32 -5
  15. package/dist/base/io/index.js +1 -1
  16. package/dist/base/mutation/index.cjs +21 -0
  17. package/dist/base/mutation/index.cjs.map +1 -1
  18. package/dist/base/mutation/index.d.cts +23 -1
  19. package/dist/base/mutation/index.d.ts +23 -1
  20. package/dist/base/mutation/index.js +3 -1
  21. package/dist/base/sources/browser/index.cjs +5 -3
  22. package/dist/base/sources/browser/index.cjs.map +1 -1
  23. package/dist/base/sources/browser/index.d.cts +20 -2
  24. package/dist/base/sources/browser/index.d.ts +20 -2
  25. package/dist/base/sources/browser/index.js +5 -3
  26. package/dist/base/sources/browser/index.js.map +1 -1
  27. package/dist/base/sources/event/index.cjs +28 -0
  28. package/dist/base/sources/event/index.cjs.map +1 -1
  29. package/dist/base/sources/event/index.d.cts +67 -3
  30. package/dist/base/sources/event/index.d.ts +67 -3
  31. package/dist/base/sources/event/index.js +4 -1
  32. package/dist/base/sources/index.cjs +75 -37
  33. package/dist/base/sources/index.cjs.map +1 -1
  34. package/dist/base/sources/index.d.cts +1 -1
  35. package/dist/base/sources/index.d.ts +1 -1
  36. package/dist/base/sources/index.js +5 -2
  37. package/dist/{chunk-R6ZCSXKX.js → chunk-23MAWVOJ.js} +3 -3
  38. package/dist/{chunk-MS3WPRJR.js → chunk-3REMCHSS.js} +6 -6
  39. package/dist/chunk-3REMCHSS.js.map +1 -0
  40. package/dist/{chunk-CEVNQ74M.js → chunk-3YGXPUHW.js} +2 -2
  41. package/dist/{chunk-CEVNQ74M.js.map → chunk-3YGXPUHW.js.map} +1 -1
  42. package/dist/{chunk-6ZLCPUXS.js → chunk-46X2EFQH.js} +15 -4
  43. package/dist/chunk-46X2EFQH.js.map +1 -0
  44. package/dist/{chunk-NY2PYHNC.js → chunk-5UY3PNFY.js} +12 -5
  45. package/dist/chunk-5UY3PNFY.js.map +1 -0
  46. package/dist/{chunk-FQSQONOU.js → chunk-65OM4XLQ.js} +49 -3
  47. package/dist/chunk-65OM4XLQ.js.map +1 -0
  48. package/dist/{chunk-3PSLNJDU.js → chunk-6DQYBIHW.js} +314 -49
  49. package/dist/chunk-6DQYBIHW.js.map +1 -0
  50. package/dist/{chunk-LDCSZ72P.js → chunk-6YBER5UP.js} +3 -3
  51. package/dist/{chunk-LDCSZ72P.js.map → chunk-6YBER5UP.js.map} +1 -1
  52. package/dist/{chunk-3O3NKZJW.js → chunk-7T7WLEPM.js} +24 -3
  53. package/dist/chunk-7T7WLEPM.js.map +1 -0
  54. package/dist/{chunk-PKPO3JTZ.js → chunk-AQAKDE7F.js} +29 -11
  55. package/dist/chunk-AQAKDE7F.js.map +1 -0
  56. package/dist/{chunk-6MRSX3YK.js → chunk-B5Y5GPD5.js} +2 -2
  57. package/dist/{chunk-BXGZFGZ4.js → chunk-C5QD5DQX.js} +22 -1
  58. package/dist/chunk-C5QD5DQX.js.map +1 -0
  59. package/dist/{chunk-4XCHZRUJ.js → chunk-D5YGR4TP.js} +58 -7
  60. package/dist/chunk-D5YGR4TP.js.map +1 -0
  61. package/dist/{chunk-NPRP3MCV.js → chunk-DHDCOOJU.js} +2 -2
  62. package/dist/chunk-DHDCOOJU.js.map +1 -0
  63. package/dist/{chunk-VP3TIUDF.js → chunk-DVTDF5OI.js} +2 -2
  64. package/dist/{chunk-OXD5LFQP.js → chunk-G7H6PN7P.js} +2 -2
  65. package/dist/{chunk-EL5VHUGK.js → chunk-GGKHHG5Y.js} +32 -18
  66. package/dist/chunk-GGKHHG5Y.js.map +1 -0
  67. package/dist/{chunk-446I4EGD.js → chunk-J5TBZFBD.js} +2 -2
  68. package/dist/{chunk-7AVQIGF6.js → chunk-K4ZYJ4EM.js} +554 -460
  69. package/dist/chunk-K4ZYJ4EM.js.map +1 -0
  70. package/dist/{chunk-QFE5BQH7.js → chunk-LTSI7ULC.js} +2 -2
  71. package/dist/{chunk-5GVURVIG.js → chunk-MMHGYX44.js} +12 -2
  72. package/dist/{chunk-5GVURVIG.js.map → chunk-MMHGYX44.js.map} +1 -1
  73. package/dist/{chunk-KRFGO5QH.js → chunk-MQMTRKY3.js} +118 -43
  74. package/dist/chunk-MQMTRKY3.js.map +1 -0
  75. package/dist/{chunk-42FQ27MQ.js → chunk-MTODGQBR.js} +44 -179
  76. package/dist/chunk-MTODGQBR.js.map +1 -0
  77. package/dist/{chunk-FVINAAKA.js → chunk-NBK6QQMG.js} +14 -13
  78. package/dist/{chunk-FVINAAKA.js.map → chunk-NBK6QQMG.js.map} +1 -1
  79. package/dist/{chunk-KNU73RZW.js → chunk-NSA5K5G2.js} +2 -2
  80. package/dist/{chunk-MLTPJMH6.js → chunk-QQYULEZL.js} +2 -2
  81. package/dist/chunk-QSW4DFKE.js +31 -0
  82. package/dist/chunk-QSW4DFKE.js.map +1 -0
  83. package/dist/{chunk-VAZXUK6G.js → chunk-SUNCHMML.js} +2 -2
  84. package/dist/{chunk-EP4WVQLX.js → chunk-T2U6N3FV.js} +6 -6
  85. package/dist/{chunk-T7SP3EYR.js → chunk-T5URUIIY.js} +33 -24
  86. package/dist/chunk-T5URUIIY.js.map +1 -0
  87. package/dist/{chunk-VNXAF2KE.js → chunk-TPTZZV25.js} +6 -6
  88. package/dist/chunk-TPTZZV25.js.map +1 -0
  89. package/dist/{chunk-IOJDYUA7.js → chunk-V46JWFGV.js} +6 -5
  90. package/dist/chunk-V46JWFGV.js.map +1 -0
  91. package/dist/{chunk-WGDEBIP4.js → chunk-X6ESZDR6.js} +5 -6
  92. package/dist/chunk-X6ESZDR6.js.map +1 -0
  93. package/dist/{chunk-N65E26UL.js → chunk-XEWV254I.js} +2 -2
  94. package/dist/{chunk-N65E26UL.js.map → chunk-XEWV254I.js.map} +1 -1
  95. package/dist/{chunk-PTWADEH3.js → chunk-YBJVKMTM.js} +34 -14
  96. package/dist/chunk-YBJVKMTM.js.map +1 -0
  97. package/dist/{chunk-DDTS7F5O.js → chunk-ZW32BPXV.js} +12 -3
  98. package/dist/chunk-ZW32BPXV.js.map +1 -0
  99. package/dist/compat/index.cjs +51 -4
  100. package/dist/compat/index.cjs.map +1 -1
  101. package/dist/compat/index.d.cts +1 -1
  102. package/dist/compat/index.d.ts +1 -1
  103. package/dist/compat/index.js +6 -6
  104. package/dist/compat/nestjs/index.cjs +51 -4
  105. package/dist/compat/nestjs/index.cjs.map +1 -1
  106. package/dist/compat/nestjs/index.d.cts +1 -1
  107. package/dist/compat/nestjs/index.d.ts +1 -1
  108. package/dist/compat/nestjs/index.js +3 -3
  109. package/dist/{fallback-Bx46zqky.d.cts → fallback-BROR6ZhO.d.cts} +1 -1
  110. package/dist/{fallback-pIWW8A2d.d.ts → fallback-DO80aM_3.d.ts} +1 -1
  111. package/dist/{index-B_p8tnvf.d.cts → index-D1z3XcF9.d.cts} +1 -0
  112. package/dist/{index-_HDSmPyp.d.ts → index-DZ6yua0Q.d.ts} +1 -0
  113. package/dist/index.cjs +2215 -1676
  114. package/dist/index.cjs.map +1 -1
  115. package/dist/index.d.cts +10 -10
  116. package/dist/index.d.ts +10 -10
  117. package/dist/index.js +169 -146
  118. package/dist/index.js.map +1 -1
  119. package/dist/presets/ai/index.cjs +46 -0
  120. package/dist/presets/ai/index.cjs.map +1 -1
  121. package/dist/presets/ai/index.js +12 -12
  122. package/dist/presets/harness/index.cjs +130 -18
  123. package/dist/presets/harness/index.cjs.map +1 -1
  124. package/dist/presets/harness/index.d.cts +15 -5
  125. package/dist/presets/harness/index.d.ts +15 -5
  126. package/dist/presets/harness/index.js +22 -22
  127. package/dist/presets/index.cjs +222 -53
  128. package/dist/presets/index.cjs.map +1 -1
  129. package/dist/presets/index.d.cts +2 -2
  130. package/dist/presets/index.d.ts +2 -2
  131. package/dist/presets/index.js +45 -45
  132. package/dist/presets/inspect/index.cjs +63 -14
  133. package/dist/presets/inspect/index.cjs.map +1 -1
  134. package/dist/presets/inspect/index.d.cts +1 -1
  135. package/dist/presets/inspect/index.d.ts +1 -1
  136. package/dist/presets/inspect/index.js +6 -6
  137. package/dist/presets/resilience/index.cjs +29 -21
  138. package/dist/presets/resilience/index.cjs.map +1 -1
  139. package/dist/presets/resilience/index.d.cts +12 -8
  140. package/dist/presets/resilience/index.d.ts +12 -8
  141. package/dist/presets/resilience/index.js +3 -3
  142. package/dist/{rate-limiter-DpVbSYdH.d.cts → rate-limiter-DC26FM8J.d.cts} +10 -1
  143. package/dist/{rate-limiter-CEALq4N1.d.ts → rate-limiter-DyWpwpQP.d.ts} +10 -1
  144. package/dist/{reactive-layout-fswlBUvX.d.ts → reactive-layout-BBBWH0V_.d.cts} +85 -4
  145. package/dist/{reactive-layout-fswlBUvX.d.cts → reactive-layout-BBBWH0V_.d.ts} +85 -4
  146. package/dist/solutions/index.cjs +168 -47
  147. package/dist/solutions/index.cjs.map +1 -1
  148. package/dist/solutions/index.d.cts +2 -2
  149. package/dist/solutions/index.d.ts +2 -2
  150. package/dist/solutions/index.js +28 -28
  151. package/dist/{spawnable-5mDY501F.d.cts → spawnable-B2IlW60f.d.cts} +23 -2
  152. package/dist/{spawnable-D3lR0oQu.d.ts → spawnable-tttFz2Nh.d.ts} +23 -2
  153. package/dist/testing/index.cjs +94 -0
  154. package/dist/testing/index.cjs.map +1 -0
  155. package/dist/testing/index.d.cts +59 -0
  156. package/dist/testing/index.d.ts +59 -0
  157. package/dist/testing/index.js +73 -0
  158. package/dist/testing/index.js.map +1 -0
  159. package/dist/utils/ai/browser.cjs.map +1 -1
  160. package/dist/utils/ai/browser.d.cts +2 -2
  161. package/dist/utils/ai/browser.d.ts +2 -2
  162. package/dist/utils/ai/browser.js +6 -6
  163. package/dist/utils/ai/browser.js.map +1 -1
  164. package/dist/utils/ai/index.cjs +250 -166
  165. package/dist/utils/ai/index.cjs.map +1 -1
  166. package/dist/utils/ai/index.d.cts +108 -12
  167. package/dist/utils/ai/index.d.ts +108 -12
  168. package/dist/utils/ai/index.js +21 -19
  169. package/dist/utils/ai/node.cjs.map +1 -1
  170. package/dist/utils/ai/node.d.cts +5 -5
  171. package/dist/utils/ai/node.d.ts +5 -5
  172. package/dist/utils/ai/node.js +2 -2
  173. package/dist/utils/ai/node.js.map +1 -1
  174. package/dist/utils/cqrs/index.cjs +29 -3
  175. package/dist/utils/cqrs/index.cjs.map +1 -1
  176. package/dist/utils/cqrs/index.d.cts +12 -7
  177. package/dist/utils/cqrs/index.d.ts +12 -7
  178. package/dist/utils/cqrs/index.js +2 -2
  179. package/dist/utils/demo-shell/index.cjs +45 -19
  180. package/dist/utils/demo-shell/index.cjs.map +1 -1
  181. package/dist/utils/demo-shell/index.d.cts +1 -1
  182. package/dist/utils/demo-shell/index.d.ts +1 -1
  183. package/dist/utils/demo-shell/index.js +2 -2
  184. package/dist/utils/domain-templates/index.cjs.map +1 -1
  185. package/dist/utils/domain-templates/index.js +3 -3
  186. package/dist/utils/graphspec/index.cjs.map +1 -1
  187. package/dist/utils/graphspec/index.js +3 -3
  188. package/dist/utils/index.cjs +1642 -1225
  189. package/dist/utils/index.cjs.map +1 -1
  190. package/dist/utils/index.d.cts +7 -7
  191. package/dist/utils/index.d.ts +7 -7
  192. package/dist/utils/index.js +72 -54
  193. package/dist/utils/inspect/index.cjs +52 -4
  194. package/dist/utils/inspect/index.cjs.map +1 -1
  195. package/dist/utils/inspect/index.d.cts +32 -3
  196. package/dist/utils/inspect/index.d.ts +32 -3
  197. package/dist/utils/inspect/index.js +4 -4
  198. package/dist/utils/job-queue/index.cjs +46 -9
  199. package/dist/utils/job-queue/index.cjs.map +1 -1
  200. package/dist/utils/job-queue/index.d.cts +33 -3
  201. package/dist/utils/job-queue/index.d.ts +33 -3
  202. package/dist/utils/job-queue/index.js +2 -2
  203. package/dist/utils/memory/index.cjs +556 -462
  204. package/dist/utils/memory/index.cjs.map +1 -1
  205. package/dist/utils/memory/index.d.cts +203 -24
  206. package/dist/utils/memory/index.d.ts +203 -24
  207. package/dist/utils/memory/index.js +10 -2
  208. package/dist/utils/messaging/index.cjs.map +1 -1
  209. package/dist/utils/messaging/index.d.cts +4 -3
  210. package/dist/utils/messaging/index.d.ts +4 -3
  211. package/dist/utils/messaging/index.js +2 -2
  212. package/dist/utils/orchestration/index.cjs +9 -0
  213. package/dist/utils/orchestration/index.cjs.map +1 -1
  214. package/dist/utils/orchestration/index.js +3 -3
  215. package/dist/utils/process/index.cjs +32 -2
  216. package/dist/utils/process/index.cjs.map +1 -1
  217. package/dist/utils/process/index.d.cts +4 -3
  218. package/dist/utils/process/index.d.ts +4 -3
  219. package/dist/utils/process/index.js +2 -2
  220. package/dist/utils/reactive-layout/index.cjs +184 -55
  221. package/dist/utils/reactive-layout/index.cjs.map +1 -1
  222. package/dist/utils/reactive-layout/index.d.cts +128 -3
  223. package/dist/utils/reactive-layout/index.d.ts +128 -3
  224. package/dist/utils/reactive-layout/index.js +16 -8
  225. package/dist/utils/reduction/index.cjs.map +1 -1
  226. package/dist/utils/reduction/index.js +2 -2
  227. package/dist/utils/resilience/index.cjs +29 -20
  228. package/dist/utils/resilience/index.cjs.map +1 -1
  229. package/dist/utils/resilience/index.d.cts +1 -1
  230. package/dist/utils/resilience/index.d.ts +1 -1
  231. package/dist/utils/resilience/index.js +2 -2
  232. package/dist/utils/surface/index.cjs.map +1 -1
  233. package/dist/utils/surface/index.js +4 -4
  234. package/package.json +15 -3
  235. package/dist/chunk-3O3NKZJW.js.map +0 -1
  236. package/dist/chunk-3PSLNJDU.js.map +0 -1
  237. package/dist/chunk-42FQ27MQ.js.map +0 -1
  238. package/dist/chunk-4XCHZRUJ.js.map +0 -1
  239. package/dist/chunk-6ZLCPUXS.js.map +0 -1
  240. package/dist/chunk-7AVQIGF6.js.map +0 -1
  241. package/dist/chunk-BXGZFGZ4.js.map +0 -1
  242. package/dist/chunk-DDTS7F5O.js.map +0 -1
  243. package/dist/chunk-EL5VHUGK.js.map +0 -1
  244. package/dist/chunk-FQSQONOU.js.map +0 -1
  245. package/dist/chunk-IOJDYUA7.js.map +0 -1
  246. package/dist/chunk-KRFGO5QH.js.map +0 -1
  247. package/dist/chunk-MS3WPRJR.js.map +0 -1
  248. package/dist/chunk-NPRP3MCV.js.map +0 -1
  249. package/dist/chunk-NY2PYHNC.js.map +0 -1
  250. package/dist/chunk-PKPO3JTZ.js.map +0 -1
  251. package/dist/chunk-PTWADEH3.js.map +0 -1
  252. package/dist/chunk-T7SP3EYR.js.map +0 -1
  253. package/dist/chunk-VNXAF2KE.js.map +0 -1
  254. package/dist/chunk-W2BOPXTI.js +0 -1
  255. package/dist/chunk-W2BOPXTI.js.map +0 -1
  256. package/dist/chunk-WGDEBIP4.js.map +0 -1
  257. /package/dist/{chunk-R6ZCSXKX.js.map → chunk-23MAWVOJ.js.map} +0 -0
  258. /package/dist/{chunk-6MRSX3YK.js.map → chunk-B5Y5GPD5.js.map} +0 -0
  259. /package/dist/{chunk-VP3TIUDF.js.map → chunk-DVTDF5OI.js.map} +0 -0
  260. /package/dist/{chunk-OXD5LFQP.js.map → chunk-G7H6PN7P.js.map} +0 -0
  261. /package/dist/{chunk-446I4EGD.js.map → chunk-J5TBZFBD.js.map} +0 -0
  262. /package/dist/{chunk-QFE5BQH7.js.map → chunk-LTSI7ULC.js.map} +0 -0
  263. /package/dist/{chunk-KNU73RZW.js.map → chunk-NSA5K5G2.js.map} +0 -0
  264. /package/dist/{chunk-MLTPJMH6.js.map → chunk-QQYULEZL.js.map} +0 -0
  265. /package/dist/{chunk-VAZXUK6G.js.map → chunk-SUNCHMML.js.map} +0 -0
  266. /package/dist/{chunk-EP4WVQLX.js.map → chunk-T2U6N3FV.js.map} +0 -0
@@ -2,8 +2,8 @@ import {
2
2
  processInstanceKeyOf,
3
3
  processManager,
4
4
  processStateKeyOf
5
- } from "../../chunk-6ZLCPUXS.js";
6
- import "../../chunk-BXGZFGZ4.js";
5
+ } from "../../chunk-46X2EFQH.js";
6
+ import "../../chunk-C5QD5DQX.js";
7
7
  import "../../chunk-N6MNJNHB.js";
8
8
  import "../../chunk-AZDQPQ3V.js";
9
9
  export {
@@ -23,9 +23,12 @@ __export(reactive_layout_exports, {
23
23
  CanvasMeasureAdapter: () => CanvasMeasureAdapter,
24
24
  CliMeasureAdapter: () => CliMeasureAdapter,
25
25
  ImageSizeAdapter: () => ImageSizeAdapter,
26
+ InjectedMeasureAdapter: () => InjectedMeasureAdapter,
27
+ IntlSegmentAdapter: () => IntlSegmentAdapter,
26
28
  NodeCanvasMeasureAdapter: () => NodeCanvasMeasureAdapter,
27
29
  PrecomputedAdapter: () => PrecomputedAdapter,
28
30
  SvgBoundsAdapter: () => SvgBoundsAdapter,
31
+ _resetDefaultSegmentAdapterForTests: () => _resetDefaultSegmentAdapterForTests,
29
32
  analyzeAndMeasure: () => analyzeAndMeasure,
30
33
  carveTextLineSlots: () => carveTextLineSlots,
31
34
  circleIntervalForBand: () => circleIntervalForBand,
@@ -34,6 +37,7 @@ __export(reactive_layout_exports, {
34
37
  computeFlowLines: () => computeFlowLines,
35
38
  computeLineBreaks: () => computeLineBreaks,
36
39
  computeTotalHeight: () => computeTotalHeight,
40
+ getDefaultSegmentAdapter: () => getDefaultSegmentAdapter,
37
41
  layoutNextLine: () => layoutNextLine,
38
42
  measureBlock: () => measureBlock,
39
43
  measureBlocks: () => measureBlocks,
@@ -164,6 +168,39 @@ function countCells(text) {
164
168
  }
165
169
 
166
170
  // src/utils/reactive-layout/measurement-adapters.ts
171
+ var IntlSegmentAdapter = class {
172
+ wordSeg = null;
173
+ graphemeSeg = null;
174
+ constructor() {
175
+ if (typeof Intl === "undefined" || typeof Intl.Segmenter !== "function") {
176
+ throw new TypeError(
177
+ "IntlSegmentAdapter: Intl.Segmenter is not available in this runtime (Hermes / older embedded JS engines). Pass a custom SegmentAdapter via `reactiveLayout({ segmentAdapter })` \u2014 see the SegmentAdapter JSDoc for the polyfill recipe (e.g. `intl-segmenter-polyfill` or `@formatjs/intl-segmenter`)."
178
+ );
179
+ }
180
+ }
181
+ segmentWords(text) {
182
+ if (this.wordSeg === null) {
183
+ this.wordSeg = new Intl.Segmenter(void 0, { granularity: "word" });
184
+ }
185
+ return this.wordSeg.segment(text);
186
+ }
187
+ segmentGraphemes(text) {
188
+ if (this.graphemeSeg === null) {
189
+ this.graphemeSeg = new Intl.Segmenter(void 0, { granularity: "grapheme" });
190
+ }
191
+ return this.graphemeSeg.segment(text);
192
+ }
193
+ };
194
+ var _defaultSegmentAdapter = null;
195
+ function getDefaultSegmentAdapter() {
196
+ if (_defaultSegmentAdapter === null) {
197
+ _defaultSegmentAdapter = new IntlSegmentAdapter();
198
+ }
199
+ return _defaultSegmentAdapter;
200
+ }
201
+ function _resetDefaultSegmentAdapterForTests() {
202
+ _defaultSegmentAdapter = null;
203
+ }
167
204
  var CliMeasureAdapter = class {
168
205
  cellPx;
169
206
  constructor(opts) {
@@ -173,6 +210,33 @@ var CliMeasureAdapter = class {
173
210
  return { width: countCells(text) * this.cellPx };
174
211
  }
175
212
  };
213
+ var InjectedMeasureAdapter = class {
214
+ fn;
215
+ cache;
216
+ constructor(fn, opts) {
217
+ if (typeof fn !== "function") {
218
+ throw new TypeError(
219
+ "InjectedMeasureAdapter: a synchronous (text, font) => widthPx function is required"
220
+ );
221
+ }
222
+ this.fn = fn;
223
+ this.cache = opts?.cache ? /* @__PURE__ */ new Map() : null;
224
+ }
225
+ measureSegment(text, font) {
226
+ if (this.cache) {
227
+ const key = `${font}\0${text}`;
228
+ const hit = this.cache.get(key);
229
+ if (hit !== void 0) return { width: hit };
230
+ const w = this.fn(text, font);
231
+ this.cache.set(key, w);
232
+ return { width: w };
233
+ }
234
+ return { width: this.fn(text, font) };
235
+ }
236
+ clearCache() {
237
+ this.cache?.clear();
238
+ }
239
+ };
176
240
  var PrecomputedAdapterKeyError = class extends Error {
177
241
  name = "KeyError";
178
242
  };
@@ -392,10 +456,9 @@ var leftStickyPunctuation = /* @__PURE__ */ new Set([
392
456
  function normalizeWhitespace(text) {
393
457
  return text.replace(/[\t\n\r\f ]+/g, " ").replace(/^ | $/g, "");
394
458
  }
395
- function segmentText(normalized) {
396
- const wordSegmenter = new Intl.Segmenter(void 0, { granularity: "word" });
459
+ function segmentText(normalized, segmentAdapter) {
397
460
  const pieces = [];
398
- for (const s of wordSegmenter.segment(normalized)) {
461
+ for (const s of segmentAdapter.segmentWords(normalized)) {
399
462
  const text = s.segment;
400
463
  const isWordLike = s.isWordLike ?? false;
401
464
  const texts = [];
@@ -431,13 +494,11 @@ function segmentText(normalized) {
431
494
  }
432
495
  return pieces;
433
496
  }
434
- function analyzeAndMeasure(text, font, adapter, cache, stats) {
497
+ function analyzeAndMeasure(text, font, adapter, cache, stats, segmentAdapter) {
435
498
  const normalized = normalizeWhitespace(text);
436
499
  if (normalized.length === 0) return [];
437
- const pieces = segmentText(normalized);
438
- const graphemeSegmenter2 = new Intl.Segmenter(void 0, {
439
- granularity: "grapheme"
440
- });
500
+ const segAdapter = segmentAdapter ?? getDefaultSegmentAdapter();
501
+ const pieces = segmentText(normalized, segAdapter);
441
502
  const rawTexts = [];
442
503
  const rawKinds = [];
443
504
  const rawWordLike = [];
@@ -502,7 +563,7 @@ function analyzeAndMeasure(text, font, adapter, cache, stats) {
502
563
  }
503
564
  if (isCJK(t)) {
504
565
  let unitText = "";
505
- for (const gs of graphemeSegmenter2.segment(t)) {
566
+ for (const gs of segAdapter.segmentGraphemes(t)) {
506
567
  const grapheme = gs.segment;
507
568
  if (unitText.length > 0 && kinsokuStart.has(grapheme)) {
508
569
  unitText += grapheme;
@@ -534,7 +595,7 @@ function analyzeAndMeasure(text, font, adapter, cache, stats) {
534
595
  let graphemeWidths = null;
535
596
  if (mergedWordLike[i] && t.length > 1) {
536
597
  const gWidths = [];
537
- for (const gs of graphemeSegmenter2.segment(t)) {
598
+ for (const gs of segAdapter.segmentGraphemes(t)) {
538
599
  gWidths.push(measureCached(gs.segment));
539
600
  }
540
601
  if (gWidths.length > 1) {
@@ -545,10 +606,11 @@ function analyzeAndMeasure(text, font, adapter, cache, stats) {
545
606
  }
546
607
  return segments;
547
608
  }
548
- function computeLineBreaks(segments, maxWidth, adapter, font, cache) {
609
+ function computeLineBreaks(segments, maxWidth, adapter, font, cache, segmentAdapter) {
549
610
  if (segments.length === 0) {
550
611
  return { lines: [], lineCount: 0 };
551
612
  }
613
+ const segAdapter = segmentAdapter ?? getDefaultSegmentAdapter();
552
614
  const lines = [];
553
615
  let lineW = 0;
554
616
  let hasContent = false;
@@ -574,10 +636,7 @@ function computeLineBreaks(segments, maxWidth, adapter, font, cache) {
574
636
  const seg = segments[i];
575
637
  if (seg.kind === "soft-hyphen" || seg.kind === "hard-break") continue;
576
638
  if (i === lineStartSeg && lineStartGrapheme > 0 && seg.graphemeWidths) {
577
- const graphemeSegmenter2 = new Intl.Segmenter(void 0, {
578
- granularity: "grapheme"
579
- });
580
- const graphemes = [...graphemeSegmenter2.segment(seg.text)].map((g) => g.segment);
639
+ const graphemes = [...segAdapter.segmentGraphemes(seg.text)].map((g) => g.segment);
581
640
  text += graphemes.slice(lineStartGrapheme).join("");
582
641
  } else {
583
642
  text += seg.text;
@@ -585,10 +644,7 @@ function computeLineBreaks(segments, maxWidth, adapter, font, cache) {
585
644
  }
586
645
  if (endGrapheme > 0 && endSeg < segments.length) {
587
646
  const seg = segments[endSeg];
588
- const graphemeSegmenter2 = new Intl.Segmenter(void 0, {
589
- granularity: "grapheme"
590
- });
591
- const graphemes = [...graphemeSegmenter2.segment(seg.text)].map((g) => g.segment);
647
+ const graphemes = [...segAdapter.segmentGraphemes(seg.text)].map((g) => g.segment);
592
648
  const startG = lineStartSeg === endSeg ? lineStartGrapheme : 0;
593
649
  text += graphemes.slice(startG, endGrapheme).join("");
594
650
  }
@@ -719,26 +775,19 @@ function computeLineBreaks(segments, maxWidth, adapter, font, cache) {
719
775
  function canBreakAfter(kind) {
720
776
  return kind === "space" || kind === "zero-width-break" || kind === "soft-hyphen";
721
777
  }
722
- var _graphemeSegmenter = null;
723
- function graphemeSegmenter() {
724
- if (_graphemeSegmenter === null) {
725
- _graphemeSegmenter = new Intl.Segmenter(void 0, { granularity: "grapheme" });
726
- }
727
- return _graphemeSegmenter;
728
- }
729
- function sliceSegmentText(seg, startG, endG) {
778
+ function sliceSegmentText(seg, startG, endG, segmentAdapter) {
730
779
  if (startG === 0 && endG < 0) return seg.text;
731
- const graphemes = [...graphemeSegmenter().segment(seg.text)].map((g) => g.segment);
780
+ const graphemes = [...segmentAdapter.segmentGraphemes(seg.text)].map((g) => g.segment);
732
781
  const stop = endG < 0 ? graphemes.length : endG;
733
782
  return graphemes.slice(startG, stop).join("");
734
783
  }
735
- function buildLineText(segments, startSeg, startG, endSeg, endG, appendHyphen) {
784
+ function buildLineText(segments, startSeg, startG, endSeg, endG, appendHyphen, segmentAdapter) {
736
785
  let text = "";
737
786
  for (let i = startSeg; i < endSeg; i++) {
738
787
  const seg = segments[i];
739
788
  if (seg.kind === "soft-hyphen" || seg.kind === "hard-break") continue;
740
789
  if (i === startSeg && startG > 0) {
741
- text += sliceSegmentText(seg, startG, -1);
790
+ text += sliceSegmentText(seg, startG, -1, segmentAdapter);
742
791
  } else {
743
792
  text += seg.text;
744
793
  }
@@ -746,7 +795,7 @@ function buildLineText(segments, startSeg, startG, endSeg, endG, appendHyphen) {
746
795
  if (endG > 0 && endSeg < segments.length) {
747
796
  const seg = segments[endSeg];
748
797
  const from = startSeg === endSeg ? startG : 0;
749
- text += sliceSegmentText(seg, from, endG);
798
+ text += sliceSegmentText(seg, from, endG, segmentAdapter);
750
799
  }
751
800
  if (appendHyphen) text += "-";
752
801
  return text;
@@ -772,6 +821,7 @@ function resolveHyphenWidth(ctx) {
772
821
  function layoutNextLine(segments, cursor, slotWidth, ctx) {
773
822
  let i = cursor.segmentIndex;
774
823
  const initialG = cursor.graphemeIndex;
824
+ const segAdapter = ctx?.segmentAdapter ?? getDefaultSegmentAdapter();
775
825
  if (i >= segments.length) return null;
776
826
  if (initialG === 0) {
777
827
  while (i < segments.length) {
@@ -837,7 +887,15 @@ function layoutNextLine(segments, cursor, slotWidth, ctx) {
837
887
  if (seg.graphemeWidths) {
838
888
  const overflowed = consumeBreakable(startSeg, startG, seg.graphemeWidths);
839
889
  if (overflowed) {
840
- const text2 = buildLineText(segments, startSeg, startG, lineEndSeg, lineEndG, false);
890
+ const text2 = buildLineText(
891
+ segments,
892
+ startSeg,
893
+ startG,
894
+ lineEndSeg,
895
+ lineEndG,
896
+ false,
897
+ segAdapter
898
+ );
841
899
  return {
842
900
  text: text2,
843
901
  width: lineW,
@@ -860,7 +918,8 @@ function layoutNextLine(segments, cursor, slotWidth, ctx) {
860
918
  startG,
861
919
  lineEndSeg,
862
920
  lineEndG,
863
- endsAtSoftHyphen2
921
+ endsAtSoftHyphen2,
922
+ segAdapter
864
923
  );
865
924
  return {
866
925
  text: text2,
@@ -881,7 +940,15 @@ function layoutNextLine(segments, cursor, slotWidth, ctx) {
881
940
  if (w > slotWidth && seg.graphemeWidths) {
882
941
  const overflowed = consumeBreakable(i, 0, seg.graphemeWidths);
883
942
  if (overflowed) {
884
- const text2 = buildLineText(segments, startSeg, startG, lineEndSeg, lineEndG, false);
943
+ const text2 = buildLineText(
944
+ segments,
945
+ startSeg,
946
+ startG,
947
+ lineEndSeg,
948
+ lineEndG,
949
+ false,
950
+ segAdapter
951
+ );
885
952
  return {
886
953
  text: text2,
887
954
  width: lineW,
@@ -915,7 +982,8 @@ function layoutNextLine(segments, cursor, slotWidth, ctx) {
915
982
  startG,
916
983
  lineEndSeg,
917
984
  lineEndG,
918
- endsAtSoftHyphen2
985
+ endsAtSoftHyphen2,
986
+ segAdapter
919
987
  );
920
988
  return {
921
989
  text: text3,
@@ -931,7 +999,8 @@ function layoutNextLine(segments, cursor, slotWidth, ctx) {
931
999
  startG,
932
1000
  pendingBreakSeg,
933
1001
  pendingBreakG,
934
- pendingBreakSoftHyphen
1002
+ pendingBreakSoftHyphen,
1003
+ segAdapter
935
1004
  );
936
1005
  return {
937
1006
  text: text3,
@@ -941,7 +1010,15 @@ function layoutNextLine(segments, cursor, slotWidth, ctx) {
941
1010
  };
942
1011
  }
943
1012
  if (w > slotWidth && seg.graphemeWidths) {
944
- const text3 = buildLineText(segments, startSeg, startG, lineEndSeg, lineEndG, false);
1013
+ const text3 = buildLineText(
1014
+ segments,
1015
+ startSeg,
1016
+ startG,
1017
+ lineEndSeg,
1018
+ lineEndG,
1019
+ false,
1020
+ segAdapter
1021
+ );
945
1022
  return {
946
1023
  text: text3,
947
1024
  width: lineW,
@@ -949,7 +1026,15 @@ function layoutNextLine(segments, cursor, slotWidth, ctx) {
949
1026
  end: { segmentIndex: lineEndSeg, graphemeIndex: lineEndG }
950
1027
  };
951
1028
  }
952
- const text2 = buildLineText(segments, startSeg, startG, lineEndSeg, lineEndG, false);
1029
+ const text2 = buildLineText(
1030
+ segments,
1031
+ startSeg,
1032
+ startG,
1033
+ lineEndSeg,
1034
+ lineEndG,
1035
+ false,
1036
+ segAdapter
1037
+ );
953
1038
  return {
954
1039
  text: text2,
955
1040
  width: lineW,
@@ -967,7 +1052,15 @@ function layoutNextLine(segments, cursor, slotWidth, ctx) {
967
1052
  }
968
1053
  if (!hasContent) return null;
969
1054
  const endsAtSoftHyphen = lineEndSeg > 0 && segments[lineEndSeg - 1]?.kind === "soft-hyphen";
970
- const text = buildLineText(segments, startSeg, startG, lineEndSeg, lineEndG, endsAtSoftHyphen);
1055
+ const text = buildLineText(
1056
+ segments,
1057
+ startSeg,
1058
+ startG,
1059
+ lineEndSeg,
1060
+ lineEndG,
1061
+ endsAtSoftHyphen,
1062
+ segAdapter
1063
+ );
971
1064
  return {
972
1065
  text,
973
1066
  width: lineW + (endsAtSoftHyphen ? hyphenWidth : 0),
@@ -996,11 +1089,9 @@ function carveTextLineSlots(base, blocked, minSlotWidth = 0) {
996
1089
  }
997
1090
  return slots;
998
1091
  }
999
- function computeCharPositions(lineBreaks, segments, lineHeight) {
1092
+ function computeCharPositions(lineBreaks, segments, lineHeight, segmentAdapter) {
1000
1093
  const positions = [];
1001
- const graphemeSegmenter2 = new Intl.Segmenter(void 0, {
1002
- granularity: "grapheme"
1003
- });
1094
+ const segAdapter = segmentAdapter ?? getDefaultSegmentAdapter();
1004
1095
  for (let lineIdx = 0; lineIdx < lineBreaks.lines.length; lineIdx++) {
1005
1096
  const line = lineBreaks.lines[lineIdx];
1006
1097
  const y = lineIdx * lineHeight;
@@ -1011,7 +1102,7 @@ function computeCharPositions(lineBreaks, segments, lineHeight) {
1011
1102
  if (si >= line.endSegment && line.endGrapheme === 0) break;
1012
1103
  continue;
1013
1104
  }
1014
- const graphemes = [...graphemeSegmenter2.segment(seg.text)].map((g) => g.segment);
1105
+ const graphemes = [...segAdapter.segmentGraphemes(seg.text)].map((g) => g.segment);
1015
1106
  if (graphemes.length === 0) continue;
1016
1107
  const startG = si === line.startSegment ? line.startGrapheme : 0;
1017
1108
  let endG;
@@ -1032,7 +1123,8 @@ function computeCharPositions(lineBreaks, segments, lineHeight) {
1032
1123
  return positions;
1033
1124
  }
1034
1125
  function reactiveLayout(opts) {
1035
- const { adapter, name = "reactive-layout" } = opts;
1126
+ const { adapter, segmentAdapter: segmentAdapterOpt, name = "reactive-layout" } = opts;
1127
+ const segmentAdapter = segmentAdapterOpt ?? getDefaultSegmentAdapter();
1036
1128
  const g = new import_graph.Graph(name);
1037
1129
  const measureCache = /* @__PURE__ */ new Map();
1038
1130
  const textNode = (0, import_core2.node)([], { name: "text", initial: opts.text ?? "" });
@@ -1070,7 +1162,8 @@ function reactiveLayout(opts) {
1070
1162
  fontVal,
1071
1163
  adapter,
1072
1164
  measureCache,
1073
- measureStats
1165
+ measureStats,
1166
+ segmentAdapter
1074
1167
  );
1075
1168
  const elapsed = (0, import_core2.monotonicNs)() - t0;
1076
1169
  const lookups = measureStats.hits + measureStats.misses;
@@ -1123,7 +1216,8 @@ function reactiveLayout(opts) {
1123
1216
  data[1],
1124
1217
  adapter,
1125
1218
  data[2],
1126
- measureCache
1219
+ measureCache,
1220
+ segmentAdapter
1127
1221
  )
1128
1222
  );
1129
1223
  },
@@ -1165,7 +1259,8 @@ function reactiveLayout(opts) {
1165
1259
  computeCharPositions(
1166
1260
  data[0],
1167
1261
  data[1],
1168
- data[2]
1262
+ data[2],
1263
+ segmentAdapter
1169
1264
  )
1170
1265
  );
1171
1266
  },
@@ -1212,9 +1307,24 @@ function measureBlock(block, maxWidth, adapters, measureCache, defaultFont, defa
1212
1307
  case "text": {
1213
1308
  const font = block.font ?? defaultFont;
1214
1309
  const lineHeight = block.lineHeight ?? defaultLineHeight;
1215
- const segments = analyzeAndMeasure(block.text, font, adapters.text, measureCache);
1216
- const lineBreaks = computeLineBreaks(segments, maxWidth, adapters.text, font, measureCache);
1217
- const charPositions = computeCharPositions(lineBreaks, segments, lineHeight);
1310
+ const segAdapter = adapters.segment ?? getDefaultSegmentAdapter();
1311
+ const segments = analyzeAndMeasure(
1312
+ block.text,
1313
+ font,
1314
+ adapters.text,
1315
+ measureCache,
1316
+ void 0,
1317
+ segAdapter
1318
+ );
1319
+ const lineBreaks = computeLineBreaks(
1320
+ segments,
1321
+ maxWidth,
1322
+ adapters.text,
1323
+ font,
1324
+ measureCache,
1325
+ segAdapter
1326
+ );
1327
+ const charPositions = computeCharPositions(lineBreaks, segments, lineHeight, segAdapter);
1218
1328
  const height = lineBreaks.lineCount * lineHeight;
1219
1329
  let width = 0;
1220
1330
  for (const line of lineBreaks.lines) {
@@ -1432,6 +1542,7 @@ function obstacleIntervalForBand(o, bandTop, bandBottom) {
1432
1542
  }
1433
1543
  function computeFlowLines(segments, container, columns, obstacles, lineHeight, minSlotWidth, opts) {
1434
1544
  const paragraphSpacing = opts?.paragraphSpacing ?? lineHeight;
1545
+ const segmentAdapterCtx = opts?.segmentAdapter;
1435
1546
  const lines = [];
1436
1547
  let cursor = { segmentIndex: 0, graphemeIndex: 0 };
1437
1548
  if (segments.length === 0 || columns.count <= 0 || lineHeight <= 0) {
@@ -1464,7 +1575,12 @@ function computeFlowLines(segments, container, columns, obstacles, lineHeight, m
1464
1575
  for (let si = 0; si < slots.length; si++) {
1465
1576
  const slot = slots[si];
1466
1577
  const slotW = slot.right - slot.left;
1467
- const line = layoutNextLine(segments, cursor, slotW);
1578
+ const line = layoutNextLine(
1579
+ segments,
1580
+ cursor,
1581
+ slotW,
1582
+ segmentAdapterCtx ? { segmentAdapter: segmentAdapterCtx } : void 0
1583
+ );
1468
1584
  if (line === null) {
1469
1585
  return { lines, cursor };
1470
1586
  }
@@ -1496,7 +1612,13 @@ function computeFlowLines(segments, container, columns, obstacles, lineHeight, m
1496
1612
  return { lines, cursor };
1497
1613
  }
1498
1614
  function reactiveFlowLayout(opts) {
1499
- const { adapter, name = "reactive-flow-layout", minSlotWidth = 20 } = opts;
1615
+ const {
1616
+ adapter,
1617
+ segmentAdapter: segmentAdapterOpt,
1618
+ name = "reactive-flow-layout",
1619
+ minSlotWidth = 20
1620
+ } = opts;
1621
+ const segmentAdapter = segmentAdapterOpt ?? getDefaultSegmentAdapter();
1500
1622
  const g = new import_graph3.Graph(name);
1501
1623
  const measureCache = /* @__PURE__ */ new Map();
1502
1624
  const textNode = (0, import_core4.node)([], { name: "text", initial: opts.text ?? "" });
@@ -1522,7 +1644,14 @@ function reactiveFlowLayout(opts) {
1522
1644
  const textVal = b0 != null && b0.length > 0 ? b0.at(-1) : ctx.prevData[0];
1523
1645
  const b1 = data[1];
1524
1646
  const fontVal = b1 != null && b1.length > 0 ? b1.at(-1) : ctx.prevData[1];
1525
- const result = analyzeAndMeasure(textVal, fontVal, adapter, measureCache);
1647
+ const result = analyzeAndMeasure(
1648
+ textVal,
1649
+ fontVal,
1650
+ adapter,
1651
+ measureCache,
1652
+ void 0,
1653
+ segmentAdapter
1654
+ );
1526
1655
  actions.emit(result);
1527
1656
  const flush = () => {
1528
1657
  measureCache.clear();
@@ -1548,7 +1677,7 @@ function reactiveFlowLayout(opts) {
1548
1677
  data[3],
1549
1678
  data[4],
1550
1679
  minSlotWidth,
1551
- { paragraphSpacing: effectiveSpacing }
1680
+ { paragraphSpacing: effectiveSpacing, segmentAdapter }
1552
1681
  );
1553
1682
  const elapsed = (0, import_core4.monotonicNs)() - t0;
1554
1683
  const overflow = Math.max(0, segments.length - cursor.segmentIndex);