@graphrefly/graphrefly 0.45.0 → 0.46.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 (714) hide show
  1. package/README.md +1 -2
  2. package/dist/_internal-B23BagFd.d.cts +33 -0
  3. package/dist/_internal-B23BagFd.d.ts +33 -0
  4. package/dist/adaptive-rate-limiter-Dch_xYIi.d.cts +111 -0
  5. package/dist/adaptive-rate-limiter-Dch_xYIi.d.ts +111 -0
  6. package/dist/agents-C0Ji9ldU.d.cts +629 -0
  7. package/dist/agents-C9zexT7I.d.ts +629 -0
  8. package/dist/audit-BAXb3VOg.d.ts +246 -0
  9. package/dist/audit-C_bPfkqS.d.cts +246 -0
  10. package/dist/backoff-7KIK3WQW.js +24 -0
  11. package/dist/backoff-7KIK3WQW.js.map +1 -0
  12. package/dist/backoff-Bnb9OoPh.d.cts +6 -0
  13. package/dist/backoff-Bnb9OoPh.d.ts +6 -0
  14. package/dist/base/composition/index.cjs +811 -0
  15. package/dist/base/composition/index.cjs.map +1 -0
  16. package/dist/base/composition/index.d.cts +469 -0
  17. package/dist/base/composition/index.d.ts +469 -0
  18. package/dist/base/composition/index.js +40 -0
  19. package/dist/base/composition/index.js.map +1 -0
  20. package/dist/base/index.cjs +6336 -0
  21. package/dist/base/index.cjs.map +1 -0
  22. package/dist/base/index.d.cts +22 -0
  23. package/dist/base/index.d.ts +22 -0
  24. package/dist/base/index.js +259 -0
  25. package/dist/base/index.js.map +1 -0
  26. package/dist/base/io/index.cjs +3270 -0
  27. package/dist/base/io/index.cjs.map +1 -0
  28. package/dist/base/io/index.d.cts +2245 -0
  29. package/dist/base/io/index.d.ts +2245 -0
  30. package/dist/base/io/index.js +117 -0
  31. package/dist/base/io/index.js.map +1 -0
  32. package/dist/base/meta/index.cjs +43 -0
  33. package/dist/base/meta/index.cjs.map +1 -0
  34. package/dist/base/meta/index.d.cts +45 -0
  35. package/dist/base/meta/index.d.ts +45 -0
  36. package/dist/base/meta/index.js +13 -0
  37. package/dist/base/meta/index.js.map +1 -0
  38. package/dist/base/mutation/index.cjs +200 -0
  39. package/dist/base/mutation/index.cjs.map +1 -0
  40. package/dist/base/mutation/index.d.cts +177 -0
  41. package/dist/base/mutation/index.d.ts +177 -0
  42. package/dist/base/mutation/index.js +22 -0
  43. package/dist/base/mutation/index.js.map +1 -0
  44. package/dist/base/render/index.cjs +1120 -0
  45. package/dist/base/render/index.cjs.map +1 -0
  46. package/dist/base/render/index.d.cts +227 -0
  47. package/dist/base/render/index.d.ts +227 -0
  48. package/dist/base/render/index.js +24 -0
  49. package/dist/base/render/index.js.map +1 -0
  50. package/dist/base/sources/browser/index.cjs +172 -0
  51. package/dist/base/sources/browser/index.cjs.map +1 -0
  52. package/dist/base/sources/browser/index.d.cts +84 -0
  53. package/dist/base/sources/browser/index.d.ts +84 -0
  54. package/dist/base/sources/browser/index.js +151 -0
  55. package/dist/base/sources/browser/index.js.map +1 -0
  56. package/dist/base/sources/event/index.cjs +98 -0
  57. package/dist/base/sources/event/index.cjs.map +1 -0
  58. package/dist/base/sources/event/index.d.cts +91 -0
  59. package/dist/base/sources/event/index.d.ts +91 -0
  60. package/dist/base/sources/event/index.js +13 -0
  61. package/dist/base/sources/event/index.js.map +1 -0
  62. package/dist/base/sources/index.cjs +755 -0
  63. package/dist/base/sources/index.cjs.map +1 -0
  64. package/dist/base/sources/index.d.cts +357 -0
  65. package/dist/base/sources/index.d.ts +357 -0
  66. package/dist/base/sources/index.js +42 -0
  67. package/dist/base/sources/index.js.map +1 -0
  68. package/dist/base/sources/node/index.cjs +320 -0
  69. package/dist/base/sources/node/index.cjs.map +1 -0
  70. package/dist/base/sources/node/index.d.cts +185 -0
  71. package/dist/base/sources/node/index.d.ts +185 -0
  72. package/dist/base/sources/node/index.js +306 -0
  73. package/dist/base/sources/node/index.js.map +1 -0
  74. package/dist/base/utils/index.cjs +37 -0
  75. package/dist/base/utils/index.cjs.map +1 -0
  76. package/dist/base/utils/index.d.cts +37 -0
  77. package/dist/base/utils/index.d.ts +37 -0
  78. package/dist/base/utils/index.js +11 -0
  79. package/dist/base/utils/index.js.map +1 -0
  80. package/dist/base/worker/index.cjs +548 -0
  81. package/dist/base/worker/index.cjs.map +1 -0
  82. package/dist/base/worker/index.d.cts +207 -0
  83. package/dist/base/worker/index.d.ts +207 -0
  84. package/dist/base/worker/index.js +20 -0
  85. package/dist/base/worker/index.js.map +1 -0
  86. package/dist/breaker-C9skL3d8.d.ts +175 -0
  87. package/dist/breaker-ugSdq54q.d.cts +175 -0
  88. package/dist/cascading-CSSbKGrJ.d.ts +199 -0
  89. package/dist/cascading-baGkiihI.d.cts +199 -0
  90. package/dist/chunk-255UCBG4.js +58 -0
  91. package/dist/chunk-255UCBG4.js.map +1 -0
  92. package/dist/chunk-2LO3EL4W.js +1 -0
  93. package/dist/chunk-2LO3EL4W.js.map +1 -0
  94. package/dist/chunk-2OB3CEJS.js +1065 -0
  95. package/dist/chunk-2OB3CEJS.js.map +1 -0
  96. package/dist/chunk-36NMM65U.js +144 -0
  97. package/dist/chunk-36NMM65U.js.map +1 -0
  98. package/dist/chunk-3CEXCBN6.js +1 -0
  99. package/dist/chunk-3CEXCBN6.js.map +1 -0
  100. package/dist/chunk-3MUSLI6E.js +105 -0
  101. package/dist/chunk-3MUSLI6E.js.map +1 -0
  102. package/dist/chunk-3PSLNJDU.js +884 -0
  103. package/dist/chunk-3PSLNJDU.js.map +1 -0
  104. package/dist/chunk-3QZY5BI7.js +92 -0
  105. package/dist/chunk-3QZY5BI7.js.map +1 -0
  106. package/dist/chunk-42FQ27MQ.js +594 -0
  107. package/dist/chunk-42FQ27MQ.js.map +1 -0
  108. package/dist/chunk-4GYMCUDZ.js +1085 -0
  109. package/dist/chunk-4GYMCUDZ.js.map +1 -0
  110. package/dist/chunk-4S53H2KR.js +382 -0
  111. package/dist/chunk-4S53H2KR.js.map +1 -0
  112. package/dist/chunk-4XCHZRUJ.js +128 -0
  113. package/dist/chunk-4XCHZRUJ.js.map +1 -0
  114. package/dist/chunk-5THCXDWY.js +725 -0
  115. package/dist/chunk-5THCXDWY.js.map +1 -0
  116. package/dist/chunk-6XZYT4SW.js +256 -0
  117. package/dist/chunk-6XZYT4SW.js.map +1 -0
  118. package/dist/chunk-7EGRP2VX.js +76 -0
  119. package/dist/chunk-7EGRP2VX.js.map +1 -0
  120. package/dist/chunk-A7KV5UK4.js +150 -0
  121. package/dist/chunk-A7KV5UK4.js.map +1 -0
  122. package/dist/chunk-APY2SS5X.js +156 -0
  123. package/dist/chunk-APY2SS5X.js.map +1 -0
  124. package/dist/chunk-AZDQPQ3V.js +66 -0
  125. package/dist/chunk-AZDQPQ3V.js.map +1 -0
  126. package/dist/chunk-BU3SEFA5.js +90 -0
  127. package/dist/chunk-BU3SEFA5.js.map +1 -0
  128. package/dist/chunk-BXGZFGZ4.js +189 -0
  129. package/dist/chunk-BXGZFGZ4.js.map +1 -0
  130. package/dist/chunk-CGHORL6G.js +579 -0
  131. package/dist/chunk-CGHORL6G.js.map +1 -0
  132. package/dist/chunk-CXANAIZU.js +530 -0
  133. package/dist/chunk-CXANAIZU.js.map +1 -0
  134. package/dist/chunk-CZQHCKKG.js +1 -0
  135. package/dist/chunk-CZQHCKKG.js.map +1 -0
  136. package/dist/chunk-DKNHAICT.js +133 -0
  137. package/dist/chunk-DKNHAICT.js.map +1 -0
  138. package/dist/chunk-DM4OMPWK.js +584 -0
  139. package/dist/chunk-DM4OMPWK.js.map +1 -0
  140. package/dist/chunk-DMSNO6ZB.js +452 -0
  141. package/dist/chunk-DMSNO6ZB.js.map +1 -0
  142. package/dist/chunk-E5OZPDIW.js +229 -0
  143. package/dist/chunk-E5OZPDIW.js.map +1 -0
  144. package/dist/chunk-EVYY4X5A.js +509 -0
  145. package/dist/chunk-EVYY4X5A.js.map +1 -0
  146. package/dist/chunk-FDFD67UO.js +1 -0
  147. package/dist/chunk-FDFD67UO.js.map +1 -0
  148. package/dist/chunk-FMPF42Q4.js +13 -0
  149. package/dist/chunk-FMPF42Q4.js.map +1 -0
  150. package/dist/chunk-FR6RGA3B.js +1277 -0
  151. package/dist/chunk-FR6RGA3B.js.map +1 -0
  152. package/dist/chunk-FW23JYNQ.js +454 -0
  153. package/dist/chunk-FW23JYNQ.js.map +1 -0
  154. package/dist/chunk-GBCENOLN.js +1575 -0
  155. package/dist/chunk-GBCENOLN.js.map +1 -0
  156. package/dist/chunk-HL7HUJIX.js +1 -0
  157. package/dist/chunk-HL7HUJIX.js.map +1 -0
  158. package/dist/chunk-HULCUY35.js +2508 -0
  159. package/dist/chunk-HULCUY35.js.map +1 -0
  160. package/dist/chunk-IHTWQEDR.js +169 -0
  161. package/dist/chunk-IHTWQEDR.js.map +1 -0
  162. package/dist/chunk-IJRR6YAI.js +128 -0
  163. package/dist/chunk-IJRR6YAI.js.map +1 -0
  164. package/dist/chunk-JGFRAFDL.js +221 -0
  165. package/dist/chunk-JGFRAFDL.js.map +1 -0
  166. package/dist/chunk-KIIXR252.js +211 -0
  167. package/dist/chunk-KIIXR252.js.map +1 -0
  168. package/dist/chunk-KN3H5CNT.js +11 -0
  169. package/dist/chunk-KN3H5CNT.js.map +1 -0
  170. package/dist/chunk-KPG3DGLA.js +1 -0
  171. package/dist/chunk-KPG3DGLA.js.map +1 -0
  172. package/dist/chunk-KRNQ6RGQ.js +1 -0
  173. package/dist/chunk-KRNQ6RGQ.js.map +1 -0
  174. package/dist/chunk-LBAJK24K.js +1071 -0
  175. package/dist/chunk-LBAJK24K.js.map +1 -0
  176. package/dist/chunk-MLTPJMH6.js +417 -0
  177. package/dist/chunk-MLTPJMH6.js.map +1 -0
  178. package/dist/chunk-N3SZ7BMH.js +95 -0
  179. package/dist/chunk-N3SZ7BMH.js.map +1 -0
  180. package/dist/chunk-NDUD3IMO.js +540 -0
  181. package/dist/chunk-NDUD3IMO.js.map +1 -0
  182. package/dist/chunk-NY2PYHNC.js +873 -0
  183. package/dist/chunk-NY2PYHNC.js.map +1 -0
  184. package/dist/chunk-O3MT7DYI.js +225 -0
  185. package/dist/chunk-O3MT7DYI.js.map +1 -0
  186. package/dist/chunk-OCUDSN63.js +2386 -0
  187. package/dist/chunk-OCUDSN63.js.map +1 -0
  188. package/dist/chunk-OIWU3NYV.js +199 -0
  189. package/dist/chunk-OIWU3NYV.js.map +1 -0
  190. package/dist/chunk-OO5BM6CJ.js +1153 -0
  191. package/dist/chunk-OO5BM6CJ.js.map +1 -0
  192. package/dist/chunk-OQUIJT7A.js +1 -0
  193. package/dist/chunk-OQUIJT7A.js.map +1 -0
  194. package/dist/chunk-P5LBT622.js +105 -0
  195. package/dist/chunk-P5LBT622.js.map +1 -0
  196. package/dist/chunk-PKGQG5QQ.js +519 -0
  197. package/dist/chunk-PKGQG5QQ.js.map +1 -0
  198. package/dist/chunk-PKPO3JTZ.js +561 -0
  199. package/dist/chunk-PKPO3JTZ.js.map +1 -0
  200. package/dist/chunk-PL5UDIQ5.js +118 -0
  201. package/dist/chunk-PL5UDIQ5.js.map +1 -0
  202. package/dist/chunk-PZWISPIQ.js +432 -0
  203. package/dist/chunk-PZWISPIQ.js.map +1 -0
  204. package/dist/chunk-Q3EYOCZB.js +510 -0
  205. package/dist/chunk-Q3EYOCZB.js.map +1 -0
  206. package/dist/chunk-QMBYUVRL.js +15 -0
  207. package/dist/chunk-QMBYUVRL.js.map +1 -0
  208. package/dist/chunk-RAGGHLCV.js +200 -0
  209. package/dist/chunk-RAGGHLCV.js.map +1 -0
  210. package/dist/chunk-RGL53X5G.js +574 -0
  211. package/dist/chunk-RGL53X5G.js.map +1 -0
  212. package/dist/chunk-RJOG4IJU.js +1039 -0
  213. package/dist/chunk-RJOG4IJU.js.map +1 -0
  214. package/dist/chunk-SOOKUYVM.js +403 -0
  215. package/dist/chunk-SOOKUYVM.js.map +1 -0
  216. package/dist/chunk-T5BN5KG7.js +1 -0
  217. package/dist/chunk-T5BN5KG7.js.map +1 -0
  218. package/dist/chunk-TP7244Y6.js +207 -0
  219. package/dist/chunk-TP7244Y6.js.map +1 -0
  220. package/dist/chunk-TSBFTJKM.js +57 -0
  221. package/dist/chunk-TSBFTJKM.js.map +1 -0
  222. package/dist/chunk-URQ2CBBF.js +143 -0
  223. package/dist/chunk-URQ2CBBF.js.map +1 -0
  224. package/dist/chunk-W2BOPXTI.js +1 -0
  225. package/dist/chunk-W2BOPXTI.js.map +1 -0
  226. package/dist/chunk-WKSWLSCX.js +207 -0
  227. package/dist/chunk-WKSWLSCX.js.map +1 -0
  228. package/dist/chunk-Y52CS6YA.js +88 -0
  229. package/dist/chunk-Y52CS6YA.js.map +1 -0
  230. package/dist/chunk-YCBUWK77.js +92 -0
  231. package/dist/chunk-YCBUWK77.js.map +1 -0
  232. package/dist/chunk-YJ4U2D2C.js +314 -0
  233. package/dist/chunk-YJ4U2D2C.js.map +1 -0
  234. package/dist/chunk-Z4YXAUDN.js +239 -0
  235. package/dist/chunk-Z4YXAUDN.js.map +1 -0
  236. package/dist/chunk-Z6EGP5D7.js +92 -0
  237. package/dist/chunk-Z6EGP5D7.js.map +1 -0
  238. package/dist/compat/index.cjs +3083 -2
  239. package/dist/compat/index.cjs.map +1 -1
  240. package/dist/compat/index.d.cts +116 -1
  241. package/dist/compat/index.d.ts +116 -1
  242. package/dist/compat/index.js +175 -2
  243. package/dist/compat/index.js.map +1 -1
  244. package/dist/compat/jotai/index.cjs +130 -2
  245. package/dist/compat/jotai/index.cjs.map +1 -1
  246. package/dist/compat/jotai/index.d.cts +2 -1
  247. package/dist/compat/jotai/index.d.ts +2 -1
  248. package/dist/compat/jotai/index.js +7 -2
  249. package/dist/compat/jotai/index.js.map +1 -1
  250. package/dist/compat/nanostores/index.cjs +186 -2
  251. package/dist/compat/nanostores/index.cjs.map +1 -1
  252. package/dist/compat/nanostores/index.d.cts +2 -1
  253. package/dist/compat/nanostores/index.d.ts +2 -1
  254. package/dist/compat/nanostores/index.js +21 -2
  255. package/dist/compat/nanostores/index.js.map +1 -1
  256. package/dist/compat/nestjs/index.cjs +2224 -2
  257. package/dist/compat/nestjs/index.cjs.map +1 -1
  258. package/dist/compat/nestjs/index.d.cts +10 -1
  259. package/dist/compat/nestjs/index.d.ts +10 -1
  260. package/dist/compat/nestjs/index.js +77 -2
  261. package/dist/compat/nestjs/index.js.map +1 -1
  262. package/dist/compat/react/index.cjs +95 -2
  263. package/dist/compat/react/index.cjs.map +1 -1
  264. package/dist/compat/react/index.d.cts +2 -1
  265. package/dist/compat/react/index.d.ts +2 -1
  266. package/dist/compat/react/index.js +11 -2
  267. package/dist/compat/react/index.js.map +1 -1
  268. package/dist/compat/solid/index.cjs +82 -2
  269. package/dist/compat/solid/index.cjs.map +1 -1
  270. package/dist/compat/solid/index.d.cts +2 -1
  271. package/dist/compat/solid/index.d.ts +2 -1
  272. package/dist/compat/solid/index.js +11 -2
  273. package/dist/compat/solid/index.js.map +1 -1
  274. package/dist/compat/svelte/index.cjs +85 -2
  275. package/dist/compat/svelte/index.cjs.map +1 -1
  276. package/dist/compat/svelte/index.d.cts +2 -1
  277. package/dist/compat/svelte/index.d.ts +2 -1
  278. package/dist/compat/svelte/index.js +11 -2
  279. package/dist/compat/svelte/index.js.map +1 -1
  280. package/dist/compat/vue/index.cjs +100 -2
  281. package/dist/compat/vue/index.cjs.map +1 -1
  282. package/dist/compat/vue/index.d.cts +3 -1
  283. package/dist/compat/vue/index.d.ts +3 -1
  284. package/dist/compat/vue/index.js +11 -2
  285. package/dist/compat/vue/index.js.map +1 -1
  286. package/dist/compat/zustand/index.cjs +50 -2
  287. package/dist/compat/zustand/index.cjs.map +1 -1
  288. package/dist/compat/zustand/index.d.cts +2 -1
  289. package/dist/compat/zustand/index.d.ts +2 -1
  290. package/dist/compat/zustand/index.js +7 -2
  291. package/dist/compat/zustand/index.js.map +1 -1
  292. package/dist/distill-De6Rnn15.d.cts +48 -0
  293. package/dist/distill-De6Rnn15.d.ts +48 -0
  294. package/dist/external-register-CWyroXb_.d.cts +138 -0
  295. package/dist/external-register-CWyroXb_.d.ts +138 -0
  296. package/dist/fallback-Bx46zqky.d.cts +243 -0
  297. package/dist/fallback-pIWW8A2d.d.ts +243 -0
  298. package/dist/guarded-execution-BcdtxeBk.d.ts +207 -0
  299. package/dist/guarded-execution-C-3hnP6A.d.cts +207 -0
  300. package/dist/index-5SU_O78r.d.cts +754 -0
  301. package/dist/index-B6pxYJzO.d.cts +36 -0
  302. package/dist/index-B6pxYJzO.d.ts +36 -0
  303. package/dist/index-BFsng6v1.d.cts +44 -0
  304. package/dist/index-BFsng6v1.d.ts +44 -0
  305. package/dist/index-Bg-LwEt-.d.cts +45 -0
  306. package/dist/index-Bg-LwEt-.d.ts +45 -0
  307. package/dist/index-Brp888t0.d.cts +127 -0
  308. package/dist/index-Brp888t0.d.ts +127 -0
  309. package/dist/index-CDfk6jHN.d.cts +37 -0
  310. package/dist/index-CDfk6jHN.d.ts +37 -0
  311. package/dist/index-CEXCtYYJ.d.ts +754 -0
  312. package/dist/index-DLAxYaN5.d.cts +169 -0
  313. package/dist/index-DLAxYaN5.d.ts +169 -0
  314. package/dist/index-DeWbQzMe.d.cts +34 -0
  315. package/dist/index-DeWbQzMe.d.ts +34 -0
  316. package/dist/index-dX9IzPqj.d.cts +86 -0
  317. package/dist/index-dX9IzPqj.d.ts +86 -0
  318. package/dist/index.cjs +25950 -0
  319. package/dist/index.cjs.map +1 -1
  320. package/dist/index.d.cts +56 -42
  321. package/dist/index.d.ts +56 -42
  322. package/dist/index.js +849 -0
  323. package/dist/index.js.map +1 -1
  324. package/dist/layout-types-B5aiHYgk.d.cts +72 -0
  325. package/dist/layout-types-B5aiHYgk.d.ts +72 -0
  326. package/dist/memory-composers-BryDrRBX.d.cts +529 -0
  327. package/dist/memory-composers-CVQqPYEV.d.ts +529 -0
  328. package/dist/observable-BXQoW1P-.d.cts +36 -0
  329. package/dist/observable-BXQoW1P-.d.ts +36 -0
  330. package/dist/pipeline-graph-Ce47CB6Y.d.cts +145 -0
  331. package/dist/pipeline-graph-DXCwY9vG.d.ts +145 -0
  332. package/dist/presets/ai/index.cjs +4377 -0
  333. package/dist/presets/ai/index.cjs.map +1 -0
  334. package/dist/presets/ai/index.d.cts +98 -0
  335. package/dist/presets/ai/index.d.ts +98 -0
  336. package/dist/presets/ai/index.js +54 -0
  337. package/dist/presets/ai/index.js.map +1 -0
  338. package/dist/presets/harness/index.cjs +5929 -0
  339. package/dist/presets/harness/index.cjs.map +1 -0
  340. package/dist/presets/harness/index.d.cts +566 -0
  341. package/dist/presets/harness/index.d.ts +566 -0
  342. package/dist/presets/harness/index.js +71 -0
  343. package/dist/presets/harness/index.js.map +1 -0
  344. package/dist/presets/index.cjs +9782 -0
  345. package/dist/presets/index.cjs.map +1 -0
  346. package/dist/presets/index.d.cts +28 -0
  347. package/dist/presets/index.d.ts +28 -0
  348. package/dist/presets/index.js +129 -0
  349. package/dist/presets/index.js.map +1 -0
  350. package/dist/presets/inspect/index.cjs +1087 -0
  351. package/dist/presets/inspect/index.cjs.map +1 -0
  352. package/dist/presets/inspect/index.d.cts +172 -0
  353. package/dist/presets/inspect/index.d.ts +172 -0
  354. package/dist/presets/inspect/index.js +21 -0
  355. package/dist/presets/inspect/index.js.map +1 -0
  356. package/dist/presets/resilience/index.cjs +1593 -0
  357. package/dist/presets/resilience/index.cjs.map +1 -0
  358. package/dist/presets/resilience/index.d.cts +205 -0
  359. package/dist/presets/resilience/index.d.ts +205 -0
  360. package/dist/presets/resilience/index.js +18 -0
  361. package/dist/presets/resilience/index.js.map +1 -0
  362. package/dist/rate-limiter-CEALq4N1.d.ts +559 -0
  363. package/dist/rate-limiter-DpVbSYdH.d.cts +559 -0
  364. package/dist/reactive-layout-fswlBUvX.d.cts +195 -0
  365. package/dist/reactive-layout-fswlBUvX.d.ts +195 -0
  366. package/dist/retry-BDbRZ_gx.d.ts +125 -0
  367. package/dist/retry-DWuhjvsA.d.cts +125 -0
  368. package/dist/solutions/index.cjs +8200 -0
  369. package/dist/solutions/index.cjs.map +1 -0
  370. package/dist/solutions/index.d.cts +23 -0
  371. package/dist/solutions/index.d.ts +23 -0
  372. package/dist/solutions/index.js +55 -0
  373. package/dist/solutions/index.js.map +1 -0
  374. package/dist/spawnable-5mDY501F.d.cts +746 -0
  375. package/dist/spawnable-D3lR0oQu.d.ts +746 -0
  376. package/dist/status-U-rUI79b.d.cts +84 -0
  377. package/dist/status-U-rUI79b.d.ts +84 -0
  378. package/dist/timeout-U5O4ESK3.js +12 -0
  379. package/dist/timeout-U5O4ESK3.js.map +1 -0
  380. package/dist/types-BB5Lw-pB.d.cts +442 -0
  381. package/dist/types-BB5Lw-pB.d.ts +442 -0
  382. package/dist/types-CJWIMJiZ.d.ts +548 -0
  383. package/dist/types-vCq7ShIm.d.cts +548 -0
  384. package/dist/utils/ai/browser.cjs +2169 -0
  385. package/dist/utils/ai/browser.cjs.map +1 -0
  386. package/dist/utils/ai/browser.d.cts +129 -0
  387. package/dist/utils/ai/browser.d.ts +129 -0
  388. package/dist/utils/ai/browser.js +255 -0
  389. package/dist/utils/ai/browser.js.map +1 -0
  390. package/dist/utils/ai/index.cjs +8468 -0
  391. package/dist/utils/ai/index.cjs.map +1 -0
  392. package/dist/utils/ai/index.d.cts +1777 -0
  393. package/dist/utils/ai/index.d.ts +1777 -0
  394. package/dist/utils/ai/index.js +173 -0
  395. package/dist/utils/ai/index.js.map +1 -0
  396. package/dist/utils/ai/node.cjs +648 -0
  397. package/dist/utils/ai/node.cjs.map +1 -0
  398. package/dist/utils/ai/node.d.cts +57 -0
  399. package/dist/utils/ai/node.d.ts +57 -0
  400. package/dist/utils/ai/node.js +84 -0
  401. package/dist/utils/ai/node.js.map +1 -0
  402. package/dist/utils/cqrs/index.cjs +1036 -0
  403. package/dist/utils/cqrs/index.cjs.map +1 -0
  404. package/dist/utils/cqrs/index.d.cts +438 -0
  405. package/dist/utils/cqrs/index.d.ts +438 -0
  406. package/dist/utils/cqrs/index.js +18 -0
  407. package/dist/utils/cqrs/index.js.map +1 -0
  408. package/dist/utils/demo-shell/index.cjs +865 -0
  409. package/dist/utils/demo-shell/index.cjs.map +1 -0
  410. package/dist/utils/demo-shell/index.d.cts +90 -0
  411. package/dist/utils/demo-shell/index.d.ts +90 -0
  412. package/dist/utils/demo-shell/index.js +13 -0
  413. package/dist/utils/demo-shell/index.js.map +1 -0
  414. package/dist/utils/domain-templates/index.cjs +732 -0
  415. package/dist/utils/domain-templates/index.cjs.map +1 -0
  416. package/dist/utils/domain-templates/index.d.cts +214 -0
  417. package/dist/utils/domain-templates/index.d.ts +214 -0
  418. package/dist/utils/domain-templates/index.js +17 -0
  419. package/dist/utils/domain-templates/index.js.map +1 -0
  420. package/dist/utils/graphspec/index.cjs +1174 -0
  421. package/dist/utils/graphspec/index.cjs.map +1 -0
  422. package/dist/utils/graphspec/index.d.cts +449 -0
  423. package/dist/utils/graphspec/index.d.ts +449 -0
  424. package/dist/utils/graphspec/index.js +35 -0
  425. package/dist/utils/graphspec/index.js.map +1 -0
  426. package/dist/utils/harness/index.cjs +656 -0
  427. package/dist/utils/harness/index.cjs.map +1 -0
  428. package/dist/utils/harness/index.d.cts +542 -0
  429. package/dist/utils/harness/index.d.ts +542 -0
  430. package/dist/utils/harness/index.js +56 -0
  431. package/dist/utils/harness/index.js.map +1 -0
  432. package/dist/utils/index.cjs +17609 -0
  433. package/dist/utils/index.cjs.map +1 -0
  434. package/dist/utils/index.d.cts +96 -0
  435. package/dist/utils/index.d.ts +96 -0
  436. package/dist/utils/index.js +514 -0
  437. package/dist/utils/index.js.map +1 -0
  438. package/dist/utils/inspect/index.cjs +807 -0
  439. package/dist/utils/inspect/index.cjs.map +1 -0
  440. package/dist/utils/inspect/index.d.cts +123 -0
  441. package/dist/utils/inspect/index.d.ts +123 -0
  442. package/dist/utils/inspect/index.js +30 -0
  443. package/dist/utils/inspect/index.js.map +1 -0
  444. package/dist/utils/job-queue/index.cjs +717 -0
  445. package/dist/utils/job-queue/index.cjs.map +1 -0
  446. package/dist/utils/job-queue/index.d.cts +200 -0
  447. package/dist/utils/job-queue/index.d.ts +200 -0
  448. package/dist/utils/job-queue/index.js +18 -0
  449. package/dist/utils/job-queue/index.js.map +1 -0
  450. package/dist/utils/memory/index.cjs +1451 -0
  451. package/dist/utils/memory/index.cjs.map +1 -0
  452. package/dist/utils/memory/index.d.cts +582 -0
  453. package/dist/utils/memory/index.d.ts +582 -0
  454. package/dist/utils/memory/index.js +19 -0
  455. package/dist/utils/memory/index.js.map +1 -0
  456. package/dist/utils/messaging/index.cjs +666 -0
  457. package/dist/utils/messaging/index.cjs.map +1 -0
  458. package/dist/utils/messaging/index.d.cts +562 -0
  459. package/dist/utils/messaging/index.d.ts +562 -0
  460. package/dist/utils/messaging/index.js +50 -0
  461. package/dist/utils/messaging/index.js.map +1 -0
  462. package/dist/utils/orchestration/index.cjs +876 -0
  463. package/dist/utils/orchestration/index.cjs.map +1 -0
  464. package/dist/utils/orchestration/index.d.cts +233 -0
  465. package/dist/utils/orchestration/index.d.ts +233 -0
  466. package/dist/utils/orchestration/index.js +19 -0
  467. package/dist/utils/orchestration/index.js.map +1 -0
  468. package/dist/utils/process/index.cjs +743 -0
  469. package/dist/utils/process/index.cjs.map +1 -0
  470. package/dist/utils/process/index.d.cts +411 -0
  471. package/dist/utils/process/index.d.ts +411 -0
  472. package/dist/utils/process/index.js +14 -0
  473. package/dist/utils/process/index.js.map +1 -0
  474. package/dist/utils/reactive-layout/index.cjs +1607 -0
  475. package/dist/utils/reactive-layout/index.cjs.map +1 -0
  476. package/dist/utils/reactive-layout/index.d.cts +492 -0
  477. package/dist/utils/reactive-layout/index.d.ts +492 -0
  478. package/dist/utils/reactive-layout/index.js +52 -0
  479. package/dist/utils/reactive-layout/index.js.map +1 -0
  480. package/dist/utils/reduction/index.cjs +203 -0
  481. package/dist/utils/reduction/index.cjs.map +1 -0
  482. package/dist/utils/reduction/index.d.cts +102 -0
  483. package/dist/utils/reduction/index.d.ts +102 -0
  484. package/dist/utils/reduction/index.js +14 -0
  485. package/dist/utils/reduction/index.js.map +1 -0
  486. package/dist/utils/resilience/index.cjs +1617 -0
  487. package/dist/utils/resilience/index.cjs.map +1 -0
  488. package/dist/utils/resilience/index.d.cts +9 -0
  489. package/dist/utils/resilience/index.d.ts +9 -0
  490. package/dist/utils/resilience/index.js +44 -0
  491. package/dist/utils/resilience/index.js.map +1 -0
  492. package/dist/utils/surface/index.cjs +1070 -0
  493. package/dist/utils/surface/index.cjs.map +1 -0
  494. package/dist/utils/surface/index.d.cts +240 -0
  495. package/dist/utils/surface/index.d.ts +240 -0
  496. package/dist/utils/surface/index.js +30 -0
  497. package/dist/utils/surface/index.js.map +1 -0
  498. package/dist/utils/topology-view/index.cjs +620 -0
  499. package/dist/utils/topology-view/index.cjs.map +1 -0
  500. package/dist/utils/topology-view/index.d.cts +68 -0
  501. package/dist/utils/topology-view/index.d.ts +68 -0
  502. package/dist/utils/topology-view/index.js +11 -0
  503. package/dist/utils/topology-view/index.js.map +1 -0
  504. package/package.json +293 -237
  505. package/dist/core/index.cjs +0 -21
  506. package/dist/core/index.cjs.map +0 -1
  507. package/dist/core/index.d.cts +0 -1
  508. package/dist/core/index.d.ts +0 -1
  509. package/dist/core/index.js +0 -3
  510. package/dist/core/index.js.map +0 -1
  511. package/dist/extra/browser.cjs +0 -21
  512. package/dist/extra/browser.cjs.map +0 -1
  513. package/dist/extra/browser.d.cts +0 -1
  514. package/dist/extra/browser.d.ts +0 -1
  515. package/dist/extra/browser.js +0 -3
  516. package/dist/extra/browser.js.map +0 -1
  517. package/dist/extra/index.cjs +0 -21
  518. package/dist/extra/index.cjs.map +0 -1
  519. package/dist/extra/index.d.cts +0 -1
  520. package/dist/extra/index.d.ts +0 -1
  521. package/dist/extra/index.js +0 -3
  522. package/dist/extra/index.js.map +0 -1
  523. package/dist/extra/node.cjs +0 -21
  524. package/dist/extra/node.cjs.map +0 -1
  525. package/dist/extra/node.d.cts +0 -1
  526. package/dist/extra/node.d.ts +0 -1
  527. package/dist/extra/node.js +0 -3
  528. package/dist/extra/node.js.map +0 -1
  529. package/dist/extra/operators.cjs +0 -21
  530. package/dist/extra/operators.cjs.map +0 -1
  531. package/dist/extra/operators.d.cts +0 -1
  532. package/dist/extra/operators.d.ts +0 -1
  533. package/dist/extra/operators.js +0 -3
  534. package/dist/extra/operators.js.map +0 -1
  535. package/dist/extra/reactive.cjs +0 -21
  536. package/dist/extra/reactive.cjs.map +0 -1
  537. package/dist/extra/reactive.d.cts +0 -1
  538. package/dist/extra/reactive.d.ts +0 -1
  539. package/dist/extra/reactive.js +0 -3
  540. package/dist/extra/reactive.js.map +0 -1
  541. package/dist/extra/render/index.cjs +0 -21
  542. package/dist/extra/render/index.cjs.map +0 -1
  543. package/dist/extra/render/index.d.cts +0 -1
  544. package/dist/extra/render/index.d.ts +0 -1
  545. package/dist/extra/render/index.js +0 -3
  546. package/dist/extra/render/index.js.map +0 -1
  547. package/dist/extra/sources.cjs +0 -21
  548. package/dist/extra/sources.cjs.map +0 -1
  549. package/dist/extra/sources.d.cts +0 -1
  550. package/dist/extra/sources.d.ts +0 -1
  551. package/dist/extra/sources.js +0 -3
  552. package/dist/extra/sources.js.map +0 -1
  553. package/dist/extra/storage-browser.cjs +0 -21
  554. package/dist/extra/storage-browser.cjs.map +0 -1
  555. package/dist/extra/storage-browser.d.cts +0 -1
  556. package/dist/extra/storage-browser.d.ts +0 -1
  557. package/dist/extra/storage-browser.js +0 -3
  558. package/dist/extra/storage-browser.js.map +0 -1
  559. package/dist/extra/storage-core.cjs +0 -21
  560. package/dist/extra/storage-core.cjs.map +0 -1
  561. package/dist/extra/storage-core.d.cts +0 -1
  562. package/dist/extra/storage-core.d.ts +0 -1
  563. package/dist/extra/storage-core.js +0 -3
  564. package/dist/extra/storage-core.js.map +0 -1
  565. package/dist/extra/storage-node.cjs +0 -21
  566. package/dist/extra/storage-node.cjs.map +0 -1
  567. package/dist/extra/storage-node.d.cts +0 -1
  568. package/dist/extra/storage-node.d.ts +0 -1
  569. package/dist/extra/storage-node.js +0 -3
  570. package/dist/extra/storage-node.js.map +0 -1
  571. package/dist/extra/storage-tiers-browser.cjs +0 -21
  572. package/dist/extra/storage-tiers-browser.cjs.map +0 -1
  573. package/dist/extra/storage-tiers-browser.d.cts +0 -1
  574. package/dist/extra/storage-tiers-browser.d.ts +0 -1
  575. package/dist/extra/storage-tiers-browser.js +0 -3
  576. package/dist/extra/storage-tiers-browser.js.map +0 -1
  577. package/dist/extra/storage-tiers-node.cjs +0 -21
  578. package/dist/extra/storage-tiers-node.cjs.map +0 -1
  579. package/dist/extra/storage-tiers-node.d.cts +0 -1
  580. package/dist/extra/storage-tiers-node.d.ts +0 -1
  581. package/dist/extra/storage-tiers-node.js +0 -3
  582. package/dist/extra/storage-tiers-node.js.map +0 -1
  583. package/dist/extra/storage-tiers.cjs +0 -21
  584. package/dist/extra/storage-tiers.cjs.map +0 -1
  585. package/dist/extra/storage-tiers.d.cts +0 -1
  586. package/dist/extra/storage-tiers.d.ts +0 -1
  587. package/dist/extra/storage-tiers.js +0 -3
  588. package/dist/extra/storage-tiers.js.map +0 -1
  589. package/dist/extra/storage-wal.cjs +0 -21
  590. package/dist/extra/storage-wal.cjs.map +0 -1
  591. package/dist/extra/storage-wal.d.cts +0 -1
  592. package/dist/extra/storage-wal.d.ts +0 -1
  593. package/dist/extra/storage-wal.js +0 -3
  594. package/dist/extra/storage-wal.js.map +0 -1
  595. package/dist/graph/index.cjs +0 -21
  596. package/dist/graph/index.cjs.map +0 -1
  597. package/dist/graph/index.d.cts +0 -1
  598. package/dist/graph/index.d.ts +0 -1
  599. package/dist/graph/index.js +0 -3
  600. package/dist/graph/index.js.map +0 -1
  601. package/dist/patterns/ai/browser.cjs +0 -21
  602. package/dist/patterns/ai/browser.cjs.map +0 -1
  603. package/dist/patterns/ai/browser.d.cts +0 -1
  604. package/dist/patterns/ai/browser.d.ts +0 -1
  605. package/dist/patterns/ai/browser.js +0 -3
  606. package/dist/patterns/ai/browser.js.map +0 -1
  607. package/dist/patterns/ai/index.cjs +0 -21
  608. package/dist/patterns/ai/index.cjs.map +0 -1
  609. package/dist/patterns/ai/index.d.cts +0 -1
  610. package/dist/patterns/ai/index.d.ts +0 -1
  611. package/dist/patterns/ai/index.js +0 -3
  612. package/dist/patterns/ai/index.js.map +0 -1
  613. package/dist/patterns/ai/node.cjs +0 -21
  614. package/dist/patterns/ai/node.cjs.map +0 -1
  615. package/dist/patterns/ai/node.d.cts +0 -1
  616. package/dist/patterns/ai/node.d.ts +0 -1
  617. package/dist/patterns/ai/node.js +0 -3
  618. package/dist/patterns/ai/node.js.map +0 -1
  619. package/dist/patterns/cqrs/index.cjs +0 -21
  620. package/dist/patterns/cqrs/index.cjs.map +0 -1
  621. package/dist/patterns/cqrs/index.d.cts +0 -1
  622. package/dist/patterns/cqrs/index.d.ts +0 -1
  623. package/dist/patterns/cqrs/index.js +0 -3
  624. package/dist/patterns/cqrs/index.js.map +0 -1
  625. package/dist/patterns/demo-shell/index.cjs +0 -21
  626. package/dist/patterns/demo-shell/index.cjs.map +0 -1
  627. package/dist/patterns/demo-shell/index.d.cts +0 -1
  628. package/dist/patterns/demo-shell/index.d.ts +0 -1
  629. package/dist/patterns/demo-shell/index.js +0 -3
  630. package/dist/patterns/demo-shell/index.js.map +0 -1
  631. package/dist/patterns/domain-templates/index.cjs +0 -21
  632. package/dist/patterns/domain-templates/index.cjs.map +0 -1
  633. package/dist/patterns/domain-templates/index.d.cts +0 -1
  634. package/dist/patterns/domain-templates/index.d.ts +0 -1
  635. package/dist/patterns/domain-templates/index.js +0 -3
  636. package/dist/patterns/domain-templates/index.js.map +0 -1
  637. package/dist/patterns/graphspec/index.cjs +0 -21
  638. package/dist/patterns/graphspec/index.cjs.map +0 -1
  639. package/dist/patterns/graphspec/index.d.cts +0 -1
  640. package/dist/patterns/graphspec/index.d.ts +0 -1
  641. package/dist/patterns/graphspec/index.js +0 -3
  642. package/dist/patterns/graphspec/index.js.map +0 -1
  643. package/dist/patterns/harness/index.cjs +0 -21
  644. package/dist/patterns/harness/index.cjs.map +0 -1
  645. package/dist/patterns/harness/index.d.cts +0 -1
  646. package/dist/patterns/harness/index.d.ts +0 -1
  647. package/dist/patterns/harness/index.js +0 -3
  648. package/dist/patterns/harness/index.js.map +0 -1
  649. package/dist/patterns/inspect/index.cjs +0 -21
  650. package/dist/patterns/inspect/index.cjs.map +0 -1
  651. package/dist/patterns/inspect/index.d.cts +0 -1
  652. package/dist/patterns/inspect/index.d.ts +0 -1
  653. package/dist/patterns/inspect/index.js +0 -3
  654. package/dist/patterns/inspect/index.js.map +0 -1
  655. package/dist/patterns/job-queue/index.cjs +0 -21
  656. package/dist/patterns/job-queue/index.cjs.map +0 -1
  657. package/dist/patterns/job-queue/index.d.cts +0 -1
  658. package/dist/patterns/job-queue/index.d.ts +0 -1
  659. package/dist/patterns/job-queue/index.js +0 -3
  660. package/dist/patterns/job-queue/index.js.map +0 -1
  661. package/dist/patterns/memory/index.cjs +0 -21
  662. package/dist/patterns/memory/index.cjs.map +0 -1
  663. package/dist/patterns/memory/index.d.cts +0 -1
  664. package/dist/patterns/memory/index.d.ts +0 -1
  665. package/dist/patterns/memory/index.js +0 -3
  666. package/dist/patterns/memory/index.js.map +0 -1
  667. package/dist/patterns/messaging/index.cjs +0 -21
  668. package/dist/patterns/messaging/index.cjs.map +0 -1
  669. package/dist/patterns/messaging/index.d.cts +0 -1
  670. package/dist/patterns/messaging/index.d.ts +0 -1
  671. package/dist/patterns/messaging/index.js +0 -3
  672. package/dist/patterns/messaging/index.js.map +0 -1
  673. package/dist/patterns/orchestration/index.cjs +0 -21
  674. package/dist/patterns/orchestration/index.cjs.map +0 -1
  675. package/dist/patterns/orchestration/index.d.cts +0 -1
  676. package/dist/patterns/orchestration/index.d.ts +0 -1
  677. package/dist/patterns/orchestration/index.js +0 -3
  678. package/dist/patterns/orchestration/index.js.map +0 -1
  679. package/dist/patterns/process/index.cjs +0 -21
  680. package/dist/patterns/process/index.cjs.map +0 -1
  681. package/dist/patterns/process/index.d.cts +0 -1
  682. package/dist/patterns/process/index.d.ts +0 -1
  683. package/dist/patterns/process/index.js +0 -3
  684. package/dist/patterns/process/index.js.map +0 -1
  685. package/dist/patterns/reactive-layout/index.cjs +0 -21
  686. package/dist/patterns/reactive-layout/index.cjs.map +0 -1
  687. package/dist/patterns/reactive-layout/index.d.cts +0 -1
  688. package/dist/patterns/reactive-layout/index.d.ts +0 -1
  689. package/dist/patterns/reactive-layout/index.js +0 -3
  690. package/dist/patterns/reactive-layout/index.js.map +0 -1
  691. package/dist/patterns/reduction/index.cjs +0 -21
  692. package/dist/patterns/reduction/index.cjs.map +0 -1
  693. package/dist/patterns/reduction/index.d.cts +0 -1
  694. package/dist/patterns/reduction/index.d.ts +0 -1
  695. package/dist/patterns/reduction/index.js +0 -3
  696. package/dist/patterns/reduction/index.js.map +0 -1
  697. package/dist/patterns/surface/index.cjs +0 -21
  698. package/dist/patterns/surface/index.cjs.map +0 -1
  699. package/dist/patterns/surface/index.d.cts +0 -1
  700. package/dist/patterns/surface/index.d.ts +0 -1
  701. package/dist/patterns/surface/index.js +0 -3
  702. package/dist/patterns/surface/index.js.map +0 -1
  703. package/dist/patterns/topology-view/index.cjs +0 -21
  704. package/dist/patterns/topology-view/index.cjs.map +0 -1
  705. package/dist/patterns/topology-view/index.d.cts +0 -1
  706. package/dist/patterns/topology-view/index.d.ts +0 -1
  707. package/dist/patterns/topology-view/index.js +0 -3
  708. package/dist/patterns/topology-view/index.js.map +0 -1
  709. package/dist/testing/index.cjs +0 -21
  710. package/dist/testing/index.cjs.map +0 -1
  711. package/dist/testing/index.d.cts +0 -1
  712. package/dist/testing/index.d.ts +0 -1
  713. package/dist/testing/index.js +0 -3
  714. package/dist/testing/index.js.map +0 -1
@@ -0,0 +1,1607 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/utils/reactive-layout/index.ts
21
+ var reactive_layout_exports = {};
22
+ __export(reactive_layout_exports, {
23
+ CanvasMeasureAdapter: () => CanvasMeasureAdapter,
24
+ CliMeasureAdapter: () => CliMeasureAdapter,
25
+ ImageSizeAdapter: () => ImageSizeAdapter,
26
+ NodeCanvasMeasureAdapter: () => NodeCanvasMeasureAdapter,
27
+ PrecomputedAdapter: () => PrecomputedAdapter,
28
+ SvgBoundsAdapter: () => SvgBoundsAdapter,
29
+ analyzeAndMeasure: () => analyzeAndMeasure,
30
+ carveTextLineSlots: () => carveTextLineSlots,
31
+ circleIntervalForBand: () => circleIntervalForBand,
32
+ computeBlockFlow: () => computeBlockFlow,
33
+ computeCharPositions: () => computeCharPositions,
34
+ computeFlowLines: () => computeFlowLines,
35
+ computeLineBreaks: () => computeLineBreaks,
36
+ computeTotalHeight: () => computeTotalHeight,
37
+ layoutNextLine: () => layoutNextLine,
38
+ measureBlock: () => measureBlock,
39
+ measureBlocks: () => measureBlocks,
40
+ reactiveBlockLayout: () => reactiveBlockLayout,
41
+ reactiveFlowLayout: () => reactiveFlowLayout,
42
+ reactiveLayout: () => reactiveLayout,
43
+ rectIntervalForBand: () => rectIntervalForBand
44
+ });
45
+ module.exports = __toCommonJS(reactive_layout_exports);
46
+
47
+ // src/base/render/_ascii-width.ts
48
+ function cellWidth(code) {
49
+ if (code >= 768 && code <= 879 || // Combining Diacritical Marks
50
+ code >= 1155 && code <= 1161 || // Cyrillic combining marks
51
+ code >= 1425 && code <= 1469 || // Hebrew combining marks
52
+ code >= 1552 && code <= 1562 || // Arabic combining marks
53
+ code >= 1611 && code <= 1631 || // Arabic combining marks
54
+ code >= 1648 && code === 1648 || // Arabic superscript alef
55
+ code >= 1750 && code <= 1756 || // Arabic combining marks
56
+ code >= 1759 && code <= 1764 || // Arabic combining marks
57
+ code >= 1767 && code <= 1768 || // Arabic combining marks
58
+ code >= 1770 && code <= 1773 || // Arabic combining marks
59
+ code >= 1840 && code <= 1866 || // Syriac combining marks
60
+ code >= 1958 && code <= 1968 || // Thaana combining marks
61
+ code >= 2304 && code <= 2307 || // Devanagari combining marks
62
+ code >= 2362 && code <= 2383 || // Devanagari combining marks
63
+ code >= 2385 && code <= 2391 || // Devanagari combining marks
64
+ code >= 2402 && code <= 2403 || // Devanagari combining marks
65
+ code >= 2433 && code <= 2435 || // Bengali combining marks
66
+ code >= 2492 && code <= 2509 || // Bengali combining marks
67
+ code >= 2561 && code <= 2563 || // Gurmukhi combining marks
68
+ code >= 2620 && code <= 2641 || // Gurmukhi combining marks
69
+ code >= 2672 && code <= 2673 || // Gurmukhi combining marks
70
+ code >= 2677 && code === 2677 || // Gurmukhi combining mark
71
+ code >= 3633 && code === 3633 || // Thai combining mark
72
+ code >= 3636 && code <= 3642 || // Thai combining marks
73
+ code >= 3655 && code <= 3662 || // Thai combining marks
74
+ code >= 3761 && code === 3761 || // Lao combining mark
75
+ code >= 3764 && code <= 3772 || // Lao combining marks
76
+ code >= 3784 && code <= 3790 || // Lao combining marks
77
+ code >= 7616 && code <= 7679 || // Combining Diacritical Marks Supplement
78
+ code >= 8400 && code <= 8447 || // Combining Diacritical Marks for Symbols
79
+ code >= 65024 && code <= 65039 || // Variation Selectors
80
+ code >= 65056 && code <= 65071 || // Combining Half Marks
81
+ code === 8205) {
82
+ return 0;
83
+ }
84
+ if (code >= 4352 && code <= 4447 || // Hangul Jamo
85
+ code >= 8986 && code <= 8987 || // Watch, Hourglass
86
+ code >= 9001 && code <= 9002 || // Angle brackets
87
+ code >= 9193 && code <= 9203 || // Media control symbols
88
+ code >= 9208 && code <= 9210 || // Media control symbols
89
+ code >= 9725 && code <= 9726 || // Medium squares
90
+ code >= 9748 && code <= 9749 || // Umbrella, Hot Beverage
91
+ code >= 9800 && code <= 9811 || // Zodiac symbols
92
+ code === 9855 || // Wheelchair
93
+ code === 9875 || // Anchor
94
+ code === 9889 || // High Voltage
95
+ code >= 9898 && code <= 9899 || // Medium circles
96
+ code >= 9917 && code <= 9918 || // Soccer, Baseball
97
+ code >= 9924 && code <= 9925 || // Snowman, Sun behind cloud
98
+ code === 9934 || // Ophiuchus
99
+ code === 9940 || // No Entry
100
+ code === 9962 || // Church
101
+ code >= 9970 && code <= 9971 || // Fountain, Golf
102
+ code === 9973 || // Sailboat
103
+ code === 9978 || // Tent
104
+ code === 9981 || // Fuel Pump
105
+ code === 9986 || // Scissors
106
+ code === 9989 || // Check Mark
107
+ code >= 9992 && code <= 9997 || // Airplane...Writing Hand
108
+ code === 9999 || // Pencil
109
+ code >= 10067 && code <= 10069 || // Question marks
110
+ code === 10071 || // Exclamation
111
+ code >= 10133 && code <= 10135 || // Plus, Minus, Divide
112
+ code === 10160 || // Curly Loop
113
+ code === 10175 || // Double Curly Loop
114
+ code >= 10548 && code <= 10549 || // Arrows
115
+ code >= 11013 && code <= 11015 || // Arrows
116
+ code >= 11035 && code <= 11036 || // Squares
117
+ code === 11088 || // Star
118
+ code === 11093 || // Circle
119
+ code >= 11904 && code <= 12350 || // CJK Radicals, Symbols, Punctuation
120
+ code >= 12352 && code <= 12447 || // Hiragana
121
+ code >= 12448 && code <= 12543 || // Katakana
122
+ code >= 12549 && code <= 12591 || // Bopomofo
123
+ code >= 12593 && code <= 12686 || // Hangul Compatibility Jamo
124
+ code >= 12688 && code <= 12771 || // Kanbun, CJK Strokes
125
+ code >= 12784 && code <= 12830 || // Katakana Phonetic Extensions
126
+ code >= 12832 && code <= 12871 || // Enclosed CJK
127
+ code >= 12880 && code <= 19903 || // CJK Extensions + Unified block
128
+ code >= 19968 && code <= 40959 || // CJK Unified Ideographs
129
+ code >= 43360 && code <= 43388 || // Hangul Jamo Extended-A
130
+ code >= 44032 && code <= 55203 || // Hangul Syllables
131
+ code >= 63744 && code <= 64255 || // CJK Compatibility Ideographs
132
+ code >= 65040 && code <= 65049 || // Vertical forms
133
+ code >= 65072 && code <= 65131 || // CJK Compatibility Forms
134
+ code >= 65281 && code <= 65376 || // Fullwidth Forms (excl. halfwidth)
135
+ code >= 65504 && code <= 65510 || // Fullwidth Signs
136
+ code >= 126980 && code === 126980 || // Mahjong Red Dragon
137
+ code === 127183 || // Joker
138
+ code >= 127344 && code <= 127345 || // A/B buttons
139
+ code === 127358 || // O button
140
+ code === 127359 || // P button
141
+ code === 127374 || // AB button
142
+ code >= 127377 && code <= 127386 || // Squared symbols
143
+ code >= 127456 && code <= 127487 || // Regional Indicator Symbols
144
+ code >= 127488 && code <= 127490 || // Enclosed ideographic
145
+ code === 127514 || // Squared CJK
146
+ code === 127535 || // Squared CJK
147
+ code >= 127538 && code <= 127546 || // Squared CJK
148
+ code >= 127568 && code <= 127569 || // Circled ideographic
149
+ code >= 127744 && code <= 129535 || // Misc Symbols / Emoticons / Emoji
150
+ code >= 129536 && code <= 129791 || // Chess, Symbols Extended-A
151
+ code >= 129792 && code <= 130047 || // Symbols for Legacy Computing
152
+ code >= 131072 && code <= 196605 || // CJK Extension B-F (excl. nonchars)
153
+ code >= 196608 && code <= 262141) {
154
+ return 2;
155
+ }
156
+ return 1;
157
+ }
158
+ function countCells(text) {
159
+ let cells = 0;
160
+ for (const ch of text) {
161
+ cells += cellWidth(ch.codePointAt(0));
162
+ }
163
+ return cells;
164
+ }
165
+
166
+ // src/utils/reactive-layout/measurement-adapters.ts
167
+ var CliMeasureAdapter = class {
168
+ cellPx;
169
+ constructor(opts) {
170
+ this.cellPx = opts?.cellPx ?? 8;
171
+ }
172
+ measureSegment(text, _font) {
173
+ return { width: countCells(text) * this.cellPx };
174
+ }
175
+ };
176
+ var PrecomputedAdapterKeyError = class extends Error {
177
+ name = "KeyError";
178
+ };
179
+ var PrecomputedAdapter = class {
180
+ metrics;
181
+ fallback;
182
+ constructor(opts) {
183
+ this.metrics = opts.metrics;
184
+ const fb = opts.fallback ?? "per-char";
185
+ if (fb !== "per-char" && fb !== "error") {
186
+ throw new Error(
187
+ `fallback must be 'per-char' or 'error', got ${JSON.stringify(opts.fallback)}`
188
+ );
189
+ }
190
+ this.fallback = fb;
191
+ }
192
+ measureSegment(text, font) {
193
+ const fontMap = this.metrics[font];
194
+ if (fontMap) {
195
+ const w = fontMap[text];
196
+ if (w !== void 0) return { width: w };
197
+ }
198
+ if (this.fallback === "error") {
199
+ throw new PrecomputedAdapterKeyError(
200
+ `PrecomputedAdapter: no metrics for segment ${JSON.stringify(text)} in font ${JSON.stringify(font)}`
201
+ );
202
+ }
203
+ let total = 0;
204
+ if (fontMap) {
205
+ for (const ch of text) {
206
+ const cw = fontMap[ch];
207
+ if (cw !== void 0) {
208
+ total += cw;
209
+ }
210
+ }
211
+ }
212
+ return { width: total };
213
+ }
214
+ };
215
+ var CanvasMeasureAdapter = class {
216
+ ctx = null;
217
+ currentFont = "";
218
+ emojiCorrection;
219
+ constructor(opts) {
220
+ this.emojiCorrection = opts?.emojiCorrection ?? 1;
221
+ }
222
+ getContext() {
223
+ if (!this.ctx) {
224
+ if (typeof OffscreenCanvas === "undefined") {
225
+ throw new Error(
226
+ "CanvasMeasureAdapter requires a browser environment with OffscreenCanvas support. Use CliMeasureAdapter or NodeCanvasMeasureAdapter for Node.js."
227
+ );
228
+ }
229
+ const canvas = new OffscreenCanvas(0, 0);
230
+ const ctx = canvas.getContext("2d");
231
+ if (!ctx) throw new Error("CanvasMeasureAdapter: failed to get 2d context");
232
+ this.ctx = ctx;
233
+ }
234
+ return this.ctx;
235
+ }
236
+ measureSegment(text, font) {
237
+ const ctx = this.getContext();
238
+ if (font !== this.currentFont) {
239
+ ctx.font = font;
240
+ this.currentFont = font;
241
+ }
242
+ let width = ctx.measureText(text).width;
243
+ if (this.emojiCorrection !== 1 && /\p{Emoji_Presentation}/u.test(text)) {
244
+ width *= this.emojiCorrection;
245
+ }
246
+ return { width };
247
+ }
248
+ clearCache() {
249
+ this.currentFont = "";
250
+ }
251
+ };
252
+ var NodeCanvasMeasureAdapter = class {
253
+ ctx = null;
254
+ currentFont = "";
255
+ canvasModule;
256
+ constructor(canvasModule) {
257
+ this.canvasModule = canvasModule;
258
+ }
259
+ getContext() {
260
+ if (!this.ctx) {
261
+ const canvas = this.canvasModule.createCanvas(0, 0);
262
+ const ctx = canvas.getContext("2d");
263
+ if (!ctx) throw new Error("NodeCanvasMeasureAdapter: failed to get 2d context");
264
+ this.ctx = ctx;
265
+ }
266
+ return this.ctx;
267
+ }
268
+ measureSegment(text, font) {
269
+ const ctx = this.getContext();
270
+ if (font !== this.currentFont) {
271
+ ctx.font = font;
272
+ this.currentFont = font;
273
+ }
274
+ return { width: ctx.measureText(text).width };
275
+ }
276
+ clearCache() {
277
+ this.currentFont = "";
278
+ }
279
+ };
280
+ var SvgBoundsAdapter = class {
281
+ measureSvg(content) {
282
+ const viewBoxMatch = content.match(/viewBox\s*=\s*["']([^"']+)["']/);
283
+ if (viewBoxMatch) {
284
+ const parts = viewBoxMatch[1].trim().split(/[\s,]+/);
285
+ if (parts.length >= 4) {
286
+ const w = Number.parseFloat(parts[2]);
287
+ const h = Number.parseFloat(parts[3]);
288
+ if (Number.isFinite(w) && Number.isFinite(h) && w > 0 && h > 0) {
289
+ return { width: w, height: h };
290
+ }
291
+ throw new Error(
292
+ "SvgBoundsAdapter: viewBox width/height are missing, non-finite, or not positive"
293
+ );
294
+ }
295
+ }
296
+ const widthMatch = content.match(/<svg[^>]*\bwidth\s*=\s*["']?([\d.]+)/);
297
+ const heightMatch = content.match(/<svg[^>]*\bheight\s*=\s*["']?([\d.]+)/);
298
+ if (widthMatch && heightMatch) {
299
+ const w = Number.parseFloat(widthMatch[1]);
300
+ const h = Number.parseFloat(heightMatch[1]);
301
+ if (Number.isFinite(w) && Number.isFinite(h) && w > 0 && h > 0) {
302
+ return { width: w, height: h };
303
+ }
304
+ throw new Error(
305
+ "SvgBoundsAdapter: svg width/height attributes are non-finite or not positive"
306
+ );
307
+ }
308
+ throw new Error(
309
+ "SvgBoundsAdapter: cannot determine dimensions \u2014 SVG has no viewBox or width/height attributes"
310
+ );
311
+ }
312
+ };
313
+ var ImageSizeAdapter = class {
314
+ sizes;
315
+ constructor(sizes) {
316
+ this.sizes = new Map(Object.entries(sizes));
317
+ }
318
+ measureImage(src) {
319
+ const dims = this.sizes.get(src);
320
+ if (!dims) {
321
+ throw new Error(`ImageSizeAdapter: no dimensions registered for ${JSON.stringify(src)}`);
322
+ }
323
+ return { width: dims.width, height: dims.height };
324
+ }
325
+ };
326
+
327
+ // src/utils/reactive-layout/reactive-block-layout.ts
328
+ var import_core3 = require("@graphrefly/pure-ts/core");
329
+ var import_graph2 = require("@graphrefly/pure-ts/graph");
330
+
331
+ // src/base/meta/emit-to-meta.ts
332
+ var import_core = require("@graphrefly/pure-ts/core");
333
+ function emitToMeta(metaNode, value) {
334
+ if (metaNode == null) return;
335
+ (0, import_core.downWithBatch)((msgs) => metaNode.down(msgs), [[import_core.DATA, value]], import_core.defaultConfig.tierOf);
336
+ }
337
+
338
+ // src/utils/reactive-layout/reactive-layout.ts
339
+ var import_core2 = require("@graphrefly/pure-ts/core");
340
+ var import_graph = require("@graphrefly/pure-ts/graph");
341
+ function isCJK(s) {
342
+ for (const ch of s) {
343
+ const c = ch.codePointAt(0);
344
+ if (c >= 19968 && c <= 40959 || // CJK Unified Ideographs
345
+ c >= 13312 && c <= 19903 || // CJK Extension A
346
+ c >= 12288 && c <= 12351 || // CJK Symbols and Punctuation
347
+ c >= 12352 && c <= 12447 || // Hiragana
348
+ c >= 12448 && c <= 12543 || // Katakana
349
+ c >= 44032 && c <= 55215 || // Hangul
350
+ c >= 65280 && c <= 65519) {
351
+ return true;
352
+ }
353
+ }
354
+ return false;
355
+ }
356
+ var kinsokuStart = /* @__PURE__ */ new Set([
357
+ "\uFF0C",
358
+ "\uFF0E",
359
+ "\uFF01",
360
+ "\uFF1A",
361
+ "\uFF1B",
362
+ "\uFF1F",
363
+ "\u3001",
364
+ "\u3002",
365
+ "\u30FB",
366
+ "\uFF09",
367
+ "\u3015",
368
+ "\u3009",
369
+ "\u300B",
370
+ "\u300D",
371
+ "\u300F",
372
+ "\u3011"
373
+ ]);
374
+ var leftStickyPunctuation = /* @__PURE__ */ new Set([
375
+ ".",
376
+ ",",
377
+ "!",
378
+ "?",
379
+ ":",
380
+ ";",
381
+ ")",
382
+ "]",
383
+ "}",
384
+ "%",
385
+ '"',
386
+ "\u201D",
387
+ "\u2019",
388
+ "\xBB",
389
+ "\u203A",
390
+ "\u2026"
391
+ ]);
392
+ function normalizeWhitespace(text) {
393
+ return text.replace(/[\t\n\r\f ]+/g, " ").replace(/^ | $/g, "");
394
+ }
395
+ function segmentText(normalized) {
396
+ const wordSegmenter = new Intl.Segmenter(void 0, { granularity: "word" });
397
+ const pieces = [];
398
+ for (const s of wordSegmenter.segment(normalized)) {
399
+ const text = s.segment;
400
+ const isWordLike = s.isWordLike ?? false;
401
+ const texts = [];
402
+ const wordLikes = [];
403
+ const kinds = [];
404
+ let currentText = "";
405
+ let currentKind = null;
406
+ for (const ch of text) {
407
+ let kind;
408
+ if (ch === " ") kind = "space";
409
+ else if (ch === "\u200B") kind = "zero-width-break";
410
+ else if (ch === "\xAD") kind = "soft-hyphen";
411
+ else if (ch === "\n") kind = "hard-break";
412
+ else kind = "text";
413
+ if (currentKind !== null && kind === currentKind) {
414
+ currentText += ch;
415
+ } else {
416
+ if (currentKind !== null) {
417
+ texts.push(currentText);
418
+ wordLikes.push(currentKind === "text" && isWordLike);
419
+ kinds.push(currentKind);
420
+ }
421
+ currentText = ch;
422
+ currentKind = kind;
423
+ }
424
+ }
425
+ if (currentKind !== null) {
426
+ texts.push(currentText);
427
+ wordLikes.push(currentKind === "text" && isWordLike);
428
+ kinds.push(currentKind);
429
+ }
430
+ pieces.push({ texts, isWordLike: wordLikes, kinds });
431
+ }
432
+ return pieces;
433
+ }
434
+ function analyzeAndMeasure(text, font, adapter, cache, stats) {
435
+ const normalized = normalizeWhitespace(text);
436
+ if (normalized.length === 0) return [];
437
+ const pieces = segmentText(normalized);
438
+ const graphemeSegmenter2 = new Intl.Segmenter(void 0, {
439
+ granularity: "grapheme"
440
+ });
441
+ const rawTexts = [];
442
+ const rawKinds = [];
443
+ const rawWordLike = [];
444
+ for (const piece of pieces) {
445
+ for (let i = 0; i < piece.texts.length; i++) {
446
+ rawTexts.push(piece.texts[i]);
447
+ rawKinds.push(piece.kinds[i]);
448
+ rawWordLike.push(piece.isWordLike[i]);
449
+ }
450
+ }
451
+ const mergedTexts = [];
452
+ const mergedKinds = [];
453
+ const mergedWordLike = [];
454
+ for (let i = 0; i < rawTexts.length; i++) {
455
+ const t = rawTexts[i];
456
+ const k = rawKinds[i];
457
+ const wl = rawWordLike[i];
458
+ if (k === "text" && !wl && mergedTexts.length > 0 && mergedKinds[mergedKinds.length - 1] === "text") {
459
+ const isSticky = t.length === 1 && (leftStickyPunctuation.has(t) || kinsokuStart.has(t));
460
+ if (isSticky) {
461
+ mergedTexts[mergedTexts.length - 1] += t;
462
+ continue;
463
+ }
464
+ }
465
+ if (t === "-" && mergedTexts.length > 0 && mergedKinds[mergedKinds.length - 1] === "text" && mergedWordLike[mergedWordLike.length - 1]) {
466
+ mergedTexts[mergedTexts.length - 1] += t;
467
+ continue;
468
+ }
469
+ mergedTexts.push(t);
470
+ mergedKinds.push(k);
471
+ mergedWordLike.push(wl);
472
+ }
473
+ let fontCache = cache.get(font);
474
+ if (!fontCache) {
475
+ fontCache = /* @__PURE__ */ new Map();
476
+ cache.set(font, fontCache);
477
+ }
478
+ function measureCached(seg) {
479
+ let w = fontCache.get(seg);
480
+ if (w === void 0) {
481
+ if (stats) stats.misses += 1;
482
+ const raw = adapter.measureSegment(seg, font).width;
483
+ w = Number.isFinite(raw) && raw >= 0 ? raw : 0;
484
+ fontCache.set(seg, w);
485
+ } else if (stats) {
486
+ stats.hits += 1;
487
+ }
488
+ return w;
489
+ }
490
+ const segments = [];
491
+ for (let i = 0; i < mergedTexts.length; i++) {
492
+ const t = mergedTexts[i];
493
+ const k = mergedKinds[i];
494
+ if (k !== "text") {
495
+ segments.push({
496
+ text: t,
497
+ width: k === "space" ? measureCached(" ") * t.length : 0,
498
+ kind: k,
499
+ graphemeWidths: null
500
+ });
501
+ continue;
502
+ }
503
+ if (isCJK(t)) {
504
+ let unitText = "";
505
+ for (const gs of graphemeSegmenter2.segment(t)) {
506
+ const grapheme = gs.segment;
507
+ if (unitText.length > 0 && kinsokuStart.has(grapheme)) {
508
+ unitText += grapheme;
509
+ continue;
510
+ }
511
+ if (unitText.length > 0) {
512
+ const w2 = measureCached(unitText);
513
+ segments.push({
514
+ text: unitText,
515
+ width: w2,
516
+ kind: "text",
517
+ graphemeWidths: null
518
+ });
519
+ }
520
+ unitText = grapheme;
521
+ }
522
+ if (unitText.length > 0) {
523
+ const w2 = measureCached(unitText);
524
+ segments.push({
525
+ text: unitText,
526
+ width: w2,
527
+ kind: "text",
528
+ graphemeWidths: null
529
+ });
530
+ }
531
+ continue;
532
+ }
533
+ const w = measureCached(t);
534
+ let graphemeWidths = null;
535
+ if (mergedWordLike[i] && t.length > 1) {
536
+ const gWidths = [];
537
+ for (const gs of graphemeSegmenter2.segment(t)) {
538
+ gWidths.push(measureCached(gs.segment));
539
+ }
540
+ if (gWidths.length > 1) {
541
+ graphemeWidths = gWidths;
542
+ }
543
+ }
544
+ segments.push({ text: t, width: w, kind: "text", graphemeWidths });
545
+ }
546
+ return segments;
547
+ }
548
+ function computeLineBreaks(segments, maxWidth, adapter, font, cache) {
549
+ if (segments.length === 0) {
550
+ return { lines: [], lineCount: 0 };
551
+ }
552
+ const lines = [];
553
+ let lineW = 0;
554
+ let hasContent = false;
555
+ let lineStartSeg = 0;
556
+ let lineStartGrapheme = 0;
557
+ let lineEndSeg = 0;
558
+ let lineEndGrapheme = 0;
559
+ let pendingBreakSeg = -1;
560
+ let pendingBreakWidth = 0;
561
+ let fontCache = cache.get(font);
562
+ if (!fontCache) {
563
+ fontCache = /* @__PURE__ */ new Map();
564
+ cache.set(font, fontCache);
565
+ }
566
+ let hyphenWidth = fontCache.get("-");
567
+ if (hyphenWidth === void 0) {
568
+ hyphenWidth = adapter.measureSegment("-", font).width;
569
+ fontCache.set("-", hyphenWidth);
570
+ }
571
+ function flushLine(endSeg = lineEndSeg, endGrapheme = lineEndGrapheme, width = lineW) {
572
+ let text = "";
573
+ for (let i = lineStartSeg; i < endSeg; i++) {
574
+ const seg = segments[i];
575
+ if (seg.kind === "soft-hyphen" || seg.kind === "hard-break") continue;
576
+ 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);
581
+ text += graphemes.slice(lineStartGrapheme).join("");
582
+ } else {
583
+ text += seg.text;
584
+ }
585
+ }
586
+ if (endGrapheme > 0 && endSeg < segments.length) {
587
+ 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);
592
+ const startG = lineStartSeg === endSeg ? lineStartGrapheme : 0;
593
+ text += graphemes.slice(startG, endGrapheme).join("");
594
+ }
595
+ if (endSeg > 0 && segments[endSeg - 1]?.kind === "soft-hyphen" && !(lineStartSeg === endSeg && lineStartGrapheme > 0)) {
596
+ text += "-";
597
+ }
598
+ lines.push({
599
+ text,
600
+ width,
601
+ startSegment: lineStartSeg,
602
+ startGrapheme: lineStartGrapheme,
603
+ endSegment: endSeg,
604
+ endGrapheme
605
+ });
606
+ lineW = 0;
607
+ hasContent = false;
608
+ pendingBreakSeg = -1;
609
+ pendingBreakWidth = 0;
610
+ }
611
+ function canBreakAfter2(kind) {
612
+ return kind === "space" || kind === "zero-width-break" || kind === "soft-hyphen";
613
+ }
614
+ function startLine(segIdx, graphemeIdx, width) {
615
+ hasContent = true;
616
+ lineStartSeg = segIdx;
617
+ lineStartGrapheme = graphemeIdx;
618
+ lineEndSeg = segIdx + 1;
619
+ lineEndGrapheme = 0;
620
+ lineW = width;
621
+ }
622
+ function startLineAtGrapheme(segIdx, graphemeIdx, width) {
623
+ hasContent = true;
624
+ lineStartSeg = segIdx;
625
+ lineStartGrapheme = graphemeIdx;
626
+ lineEndSeg = segIdx;
627
+ lineEndGrapheme = graphemeIdx + 1;
628
+ lineW = width;
629
+ }
630
+ for (let i = 0; i < segments.length; i++) {
631
+ const seg = segments[i];
632
+ if (seg.kind === "hard-break") {
633
+ if (hasContent) {
634
+ flushLine();
635
+ } else {
636
+ lines.push({
637
+ text: "",
638
+ width: 0,
639
+ startSegment: i,
640
+ startGrapheme: 0,
641
+ endSegment: i,
642
+ endGrapheme: 0
643
+ });
644
+ }
645
+ lineStartSeg = i + 1;
646
+ lineStartGrapheme = 0;
647
+ continue;
648
+ }
649
+ const w = seg.width;
650
+ if (!hasContent) {
651
+ if (w > maxWidth && seg.graphemeWidths) {
652
+ appendBreakableSegment(i, 0, seg.graphemeWidths);
653
+ } else {
654
+ startLine(i, 0, w);
655
+ }
656
+ if (canBreakAfter2(seg.kind)) {
657
+ pendingBreakSeg = i + 1;
658
+ pendingBreakWidth = seg.kind === "space" ? lineW - w : lineW;
659
+ }
660
+ continue;
661
+ }
662
+ const newW = lineW + w;
663
+ if (newW > maxWidth + 5e-3) {
664
+ if (canBreakAfter2(seg.kind)) {
665
+ lineW += w;
666
+ lineEndSeg = i + 1;
667
+ lineEndGrapheme = 0;
668
+ flushLine(i + 1, 0, seg.kind === "space" ? lineW - w : lineW);
669
+ continue;
670
+ }
671
+ if (pendingBreakSeg >= 0) {
672
+ flushLine(pendingBreakSeg, 0, pendingBreakWidth);
673
+ i--;
674
+ continue;
675
+ }
676
+ if (w > maxWidth && seg.graphemeWidths) {
677
+ flushLine();
678
+ appendBreakableSegment(i, 0, seg.graphemeWidths);
679
+ continue;
680
+ }
681
+ flushLine();
682
+ i--;
683
+ continue;
684
+ }
685
+ lineW = newW;
686
+ lineEndSeg = i + 1;
687
+ lineEndGrapheme = 0;
688
+ if (canBreakAfter2(seg.kind)) {
689
+ pendingBreakSeg = i + 1;
690
+ pendingBreakWidth = seg.kind === "space" ? lineW - w : lineW;
691
+ }
692
+ }
693
+ if (hasContent) {
694
+ flushLine();
695
+ }
696
+ return { lines, lineCount: lines.length };
697
+ function appendBreakableSegment(segIdx, startG, gWidths) {
698
+ for (let g = startG; g < gWidths.length; g++) {
699
+ const gw = gWidths[g];
700
+ if (!hasContent) {
701
+ startLineAtGrapheme(segIdx, g, gw);
702
+ continue;
703
+ }
704
+ if (lineW + gw > maxWidth + 5e-3) {
705
+ flushLine();
706
+ startLineAtGrapheme(segIdx, g, gw);
707
+ } else {
708
+ lineW += gw;
709
+ lineEndSeg = segIdx;
710
+ lineEndGrapheme = g + 1;
711
+ }
712
+ }
713
+ if (hasContent && lineEndSeg === segIdx && lineEndGrapheme === gWidths.length) {
714
+ lineEndSeg = segIdx + 1;
715
+ lineEndGrapheme = 0;
716
+ }
717
+ }
718
+ }
719
+ function canBreakAfter(kind) {
720
+ return kind === "space" || kind === "zero-width-break" || kind === "soft-hyphen";
721
+ }
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) {
730
+ if (startG === 0 && endG < 0) return seg.text;
731
+ const graphemes = [...graphemeSegmenter().segment(seg.text)].map((g) => g.segment);
732
+ const stop = endG < 0 ? graphemes.length : endG;
733
+ return graphemes.slice(startG, stop).join("");
734
+ }
735
+ function buildLineText(segments, startSeg, startG, endSeg, endG, appendHyphen) {
736
+ let text = "";
737
+ for (let i = startSeg; i < endSeg; i++) {
738
+ const seg = segments[i];
739
+ if (seg.kind === "soft-hyphen" || seg.kind === "hard-break") continue;
740
+ if (i === startSeg && startG > 0) {
741
+ text += sliceSegmentText(seg, startG, -1);
742
+ } else {
743
+ text += seg.text;
744
+ }
745
+ }
746
+ if (endG > 0 && endSeg < segments.length) {
747
+ const seg = segments[endSeg];
748
+ const from = startSeg === endSeg ? startG : 0;
749
+ text += sliceSegmentText(seg, from, endG);
750
+ }
751
+ if (appendHyphen) text += "-";
752
+ return text;
753
+ }
754
+ function resolveHyphenWidth(ctx) {
755
+ if (!ctx?.adapter || !ctx.font) return 0;
756
+ const cache = ctx.cache;
757
+ if (cache) {
758
+ let fc = cache.get(ctx.font);
759
+ if (!fc) {
760
+ fc = /* @__PURE__ */ new Map();
761
+ cache.set(ctx.font, fc);
762
+ }
763
+ let hw = fc.get("-");
764
+ if (hw === void 0) {
765
+ hw = ctx.adapter.measureSegment("-", ctx.font).width;
766
+ fc.set("-", hw);
767
+ }
768
+ return hw;
769
+ }
770
+ return ctx.adapter.measureSegment("-", ctx.font).width;
771
+ }
772
+ function layoutNextLine(segments, cursor, slotWidth, ctx) {
773
+ let i = cursor.segmentIndex;
774
+ const initialG = cursor.graphemeIndex;
775
+ if (i >= segments.length) return null;
776
+ if (initialG === 0) {
777
+ while (i < segments.length) {
778
+ const seg = segments[i];
779
+ if (seg.kind === "hard-break") {
780
+ return {
781
+ text: "",
782
+ width: 0,
783
+ start: { segmentIndex: cursor.segmentIndex, graphemeIndex: 0 },
784
+ end: { segmentIndex: i + 1, graphemeIndex: 0 }
785
+ };
786
+ }
787
+ if (seg.kind === "space" || seg.kind === "zero-width-break" || seg.kind === "soft-hyphen") {
788
+ i += 1;
789
+ continue;
790
+ }
791
+ break;
792
+ }
793
+ if (i >= segments.length) return null;
794
+ }
795
+ const hyphenWidth = resolveHyphenWidth(ctx);
796
+ const startSeg = i;
797
+ const startG = i === cursor.segmentIndex ? initialG : 0;
798
+ let lineW = 0;
799
+ let lineEndSeg = startSeg;
800
+ let lineEndG = 0;
801
+ let hasContent = false;
802
+ let pendingBreakSeg = -1;
803
+ let pendingBreakG = 0;
804
+ let pendingBreakWidth = 0;
805
+ let pendingBreakSoftHyphen = false;
806
+ const recordPending = (sIdx, gIdx, widthAtBreak, kind) => {
807
+ pendingBreakSeg = sIdx;
808
+ pendingBreakG = gIdx;
809
+ pendingBreakWidth = widthAtBreak;
810
+ pendingBreakSoftHyphen = kind === "soft-hyphen";
811
+ };
812
+ const consumeBreakable = (segIdx, gStart, gWidths) => {
813
+ for (let g = gStart; g < gWidths.length; g++) {
814
+ const gw = gWidths[g];
815
+ if (!hasContent) {
816
+ lineW = gw;
817
+ lineEndSeg = segIdx;
818
+ lineEndG = g + 1;
819
+ hasContent = true;
820
+ continue;
821
+ }
822
+ if (lineW + gw > slotWidth + 5e-3) {
823
+ return true;
824
+ }
825
+ lineW += gw;
826
+ lineEndSeg = segIdx;
827
+ lineEndG = g + 1;
828
+ }
829
+ if (lineEndSeg === segIdx && lineEndG === gWidths.length) {
830
+ lineEndSeg = segIdx + 1;
831
+ lineEndG = 0;
832
+ }
833
+ return false;
834
+ };
835
+ if (startG > 0 && startSeg < segments.length) {
836
+ const seg = segments[startSeg];
837
+ if (seg.graphemeWidths) {
838
+ const overflowed = consumeBreakable(startSeg, startG, seg.graphemeWidths);
839
+ if (overflowed) {
840
+ const text2 = buildLineText(segments, startSeg, startG, lineEndSeg, lineEndG, false);
841
+ return {
842
+ text: text2,
843
+ width: lineW,
844
+ start: { segmentIndex: startSeg, graphemeIndex: startG },
845
+ end: { segmentIndex: lineEndSeg, graphemeIndex: lineEndG }
846
+ };
847
+ }
848
+ i = lineEndSeg;
849
+ } else {
850
+ }
851
+ }
852
+ for (; i < segments.length; ) {
853
+ const seg = segments[i];
854
+ if (seg.kind === "hard-break") {
855
+ if (hasContent) {
856
+ const endsAtSoftHyphen2 = lineEndSeg > 0 && segments[lineEndSeg - 1]?.kind === "soft-hyphen";
857
+ const text2 = buildLineText(
858
+ segments,
859
+ startSeg,
860
+ startG,
861
+ lineEndSeg,
862
+ lineEndG,
863
+ endsAtSoftHyphen2
864
+ );
865
+ return {
866
+ text: text2,
867
+ width: lineW + (endsAtSoftHyphen2 ? hyphenWidth : 0),
868
+ start: { segmentIndex: startSeg, graphemeIndex: startG },
869
+ end: { segmentIndex: lineEndSeg, graphemeIndex: lineEndG }
870
+ };
871
+ }
872
+ return {
873
+ text: "",
874
+ width: 0,
875
+ start: { segmentIndex: startSeg, graphemeIndex: startG },
876
+ end: { segmentIndex: i + 1, graphemeIndex: 0 }
877
+ };
878
+ }
879
+ const w = seg.width;
880
+ if (!hasContent) {
881
+ if (w > slotWidth && seg.graphemeWidths) {
882
+ const overflowed = consumeBreakable(i, 0, seg.graphemeWidths);
883
+ if (overflowed) {
884
+ const text2 = buildLineText(segments, startSeg, startG, lineEndSeg, lineEndG, false);
885
+ return {
886
+ text: text2,
887
+ width: lineW,
888
+ start: { segmentIndex: startSeg, graphemeIndex: startG },
889
+ end: { segmentIndex: lineEndSeg, graphemeIndex: lineEndG }
890
+ };
891
+ }
892
+ i = lineEndSeg;
893
+ continue;
894
+ }
895
+ lineW = w;
896
+ lineEndSeg = i + 1;
897
+ lineEndG = 0;
898
+ hasContent = true;
899
+ if (canBreakAfter(seg.kind)) {
900
+ recordPending(i + 1, 0, seg.kind === "space" ? lineW - w : lineW, seg.kind);
901
+ }
902
+ i += 1;
903
+ continue;
904
+ }
905
+ const newW = lineW + w;
906
+ if (newW > slotWidth + 5e-3) {
907
+ if (canBreakAfter(seg.kind)) {
908
+ lineEndSeg = i + 1;
909
+ lineEndG = 0;
910
+ const endsAtSoftHyphen2 = seg.kind === "soft-hyphen";
911
+ const finalWidth = seg.kind === "space" ? lineW : lineW + (endsAtSoftHyphen2 ? hyphenWidth : 0);
912
+ const text3 = buildLineText(
913
+ segments,
914
+ startSeg,
915
+ startG,
916
+ lineEndSeg,
917
+ lineEndG,
918
+ endsAtSoftHyphen2
919
+ );
920
+ return {
921
+ text: text3,
922
+ width: finalWidth,
923
+ start: { segmentIndex: startSeg, graphemeIndex: startG },
924
+ end: { segmentIndex: lineEndSeg, graphemeIndex: lineEndG }
925
+ };
926
+ }
927
+ if (pendingBreakSeg >= 0) {
928
+ const text3 = buildLineText(
929
+ segments,
930
+ startSeg,
931
+ startG,
932
+ pendingBreakSeg,
933
+ pendingBreakG,
934
+ pendingBreakSoftHyphen
935
+ );
936
+ return {
937
+ text: text3,
938
+ width: pendingBreakWidth + (pendingBreakSoftHyphen ? hyphenWidth : 0),
939
+ start: { segmentIndex: startSeg, graphemeIndex: startG },
940
+ end: { segmentIndex: pendingBreakSeg, graphemeIndex: pendingBreakG }
941
+ };
942
+ }
943
+ if (w > slotWidth && seg.graphemeWidths) {
944
+ const text3 = buildLineText(segments, startSeg, startG, lineEndSeg, lineEndG, false);
945
+ return {
946
+ text: text3,
947
+ width: lineW,
948
+ start: { segmentIndex: startSeg, graphemeIndex: startG },
949
+ end: { segmentIndex: lineEndSeg, graphemeIndex: lineEndG }
950
+ };
951
+ }
952
+ const text2 = buildLineText(segments, startSeg, startG, lineEndSeg, lineEndG, false);
953
+ return {
954
+ text: text2,
955
+ width: lineW,
956
+ start: { segmentIndex: startSeg, graphemeIndex: startG },
957
+ end: { segmentIndex: lineEndSeg, graphemeIndex: lineEndG }
958
+ };
959
+ }
960
+ lineW = newW;
961
+ lineEndSeg = i + 1;
962
+ lineEndG = 0;
963
+ if (canBreakAfter(seg.kind)) {
964
+ recordPending(i + 1, 0, seg.kind === "space" ? lineW - w : lineW, seg.kind);
965
+ }
966
+ i += 1;
967
+ }
968
+ if (!hasContent) return null;
969
+ const endsAtSoftHyphen = lineEndSeg > 0 && segments[lineEndSeg - 1]?.kind === "soft-hyphen";
970
+ const text = buildLineText(segments, startSeg, startG, lineEndSeg, lineEndG, endsAtSoftHyphen);
971
+ return {
972
+ text,
973
+ width: lineW + (endsAtSoftHyphen ? hyphenWidth : 0),
974
+ start: { segmentIndex: startSeg, graphemeIndex: startG },
975
+ end: { segmentIndex: lineEndSeg, graphemeIndex: lineEndG }
976
+ };
977
+ }
978
+ function carveTextLineSlots(base, blocked, minSlotWidth = 0) {
979
+ let slots = [base];
980
+ for (let bi = 0; bi < blocked.length; bi++) {
981
+ const block = blocked[bi];
982
+ const next = [];
983
+ for (let si = 0; si < slots.length; si++) {
984
+ const slot = slots[si];
985
+ if (block.right <= slot.left || block.left >= slot.right) {
986
+ next.push(slot);
987
+ continue;
988
+ }
989
+ if (block.left > slot.left) next.push({ left: slot.left, right: block.left });
990
+ if (block.right < slot.right) next.push({ left: block.right, right: slot.right });
991
+ }
992
+ slots = next;
993
+ }
994
+ if (minSlotWidth > 0) {
995
+ return slots.filter((s) => s.right - s.left >= minSlotWidth);
996
+ }
997
+ return slots;
998
+ }
999
+ function computeCharPositions(lineBreaks, segments, lineHeight) {
1000
+ const positions = [];
1001
+ const graphemeSegmenter2 = new Intl.Segmenter(void 0, {
1002
+ granularity: "grapheme"
1003
+ });
1004
+ for (let lineIdx = 0; lineIdx < lineBreaks.lines.length; lineIdx++) {
1005
+ const line = lineBreaks.lines[lineIdx];
1006
+ const y = lineIdx * lineHeight;
1007
+ let x = 0;
1008
+ for (let si = line.startSegment; si < segments.length; si++) {
1009
+ const seg = segments[si];
1010
+ if (seg.kind === "soft-hyphen" || seg.kind === "hard-break") {
1011
+ if (si >= line.endSegment && line.endGrapheme === 0) break;
1012
+ continue;
1013
+ }
1014
+ const graphemes = [...graphemeSegmenter2.segment(seg.text)].map((g) => g.segment);
1015
+ if (graphemes.length === 0) continue;
1016
+ const startG = si === line.startSegment ? line.startGrapheme : 0;
1017
+ let endG;
1018
+ if (si < line.endSegment) {
1019
+ endG = graphemes.length;
1020
+ } else if (si === line.endSegment && line.endGrapheme > 0) {
1021
+ endG = line.endGrapheme;
1022
+ } else {
1023
+ break;
1024
+ }
1025
+ for (let g = startG; g < endG; g++) {
1026
+ const gWidth = seg.graphemeWidths ? seg.graphemeWidths[g] : seg.width / graphemes.length;
1027
+ positions.push({ x, y, width: gWidth, height: lineHeight, line: lineIdx });
1028
+ x += gWidth;
1029
+ }
1030
+ }
1031
+ }
1032
+ return positions;
1033
+ }
1034
+ function reactiveLayout(opts) {
1035
+ const { adapter, name = "reactive-layout" } = opts;
1036
+ const g = new import_graph.Graph(name);
1037
+ const measureCache = /* @__PURE__ */ new Map();
1038
+ const textNode = (0, import_core2.node)([], { name: "text", initial: opts.text ?? "" });
1039
+ const fontNode = (0, import_core2.node)([], {
1040
+ name: "font",
1041
+ initial: opts.font ?? "16px sans-serif"
1042
+ });
1043
+ const lineHeightNode = (0, import_core2.node)([], {
1044
+ name: "line-height",
1045
+ initial: opts.lineHeight ?? 20
1046
+ });
1047
+ const maxWidthNode = (0, import_core2.node)([], {
1048
+ name: "max-width",
1049
+ initial: Math.max(0, opts.maxWidth ?? 800)
1050
+ });
1051
+ function graphemeWidthsEqual(a, b) {
1052
+ if (a === null || b === null) return a === b;
1053
+ if (a.length !== b.length) return false;
1054
+ for (let i = 0; i < a.length; i++) {
1055
+ if (a[i] !== b[i]) return false;
1056
+ }
1057
+ return true;
1058
+ }
1059
+ const segmentsNode = (0, import_core2.node)(
1060
+ [textNode, fontNode],
1061
+ (data, actions, ctx) => {
1062
+ const b0 = data[0];
1063
+ const textVal = b0 != null && b0.length > 0 ? b0.at(-1) : ctx.prevData[0];
1064
+ const b1 = data[1];
1065
+ const fontVal = b1 != null && b1.length > 0 ? b1.at(-1) : ctx.prevData[1];
1066
+ const t0 = (0, import_core2.monotonicNs)();
1067
+ const measureStats = { hits: 0, misses: 0 };
1068
+ const result = analyzeAndMeasure(
1069
+ textVal,
1070
+ fontVal,
1071
+ adapter,
1072
+ measureCache,
1073
+ measureStats
1074
+ );
1075
+ const elapsed = (0, import_core2.monotonicNs)() - t0;
1076
+ const lookups = measureStats.hits + measureStats.misses;
1077
+ const hitRate = lookups === 0 ? 1 : measureStats.hits / lookups;
1078
+ const meta = segmentsNode.meta;
1079
+ if (meta) {
1080
+ emitToMeta(meta["cache-hit-rate"], hitRate);
1081
+ emitToMeta(meta["segment-count"], result.length);
1082
+ emitToMeta(meta["layout-time-ns"], elapsed);
1083
+ }
1084
+ actions.emit(result);
1085
+ const flush = () => {
1086
+ measureCache.clear();
1087
+ adapter.clearCache?.();
1088
+ };
1089
+ return { onDeactivation: flush, onInvalidate: flush };
1090
+ },
1091
+ {
1092
+ name: "segments",
1093
+ describeKind: "derived",
1094
+ meta: {
1095
+ "cache-hit-rate": 0,
1096
+ "segment-count": 0,
1097
+ "layout-time-ns": 0
1098
+ },
1099
+ equals: (a, b) => {
1100
+ const sa = a;
1101
+ const sb = b;
1102
+ if (sa == null || sb == null) return sa === sb;
1103
+ if (sa.length !== sb.length) return false;
1104
+ for (let i = 0; i < sa.length; i++) {
1105
+ const pa = sa[i];
1106
+ const pb = sb[i];
1107
+ if (pa.text !== pb.text || pa.width !== pb.width || pa.kind !== pb.kind || !graphemeWidthsEqual(pa.graphemeWidths ?? null, pb.graphemeWidths ?? null))
1108
+ return false;
1109
+ }
1110
+ return true;
1111
+ }
1112
+ }
1113
+ );
1114
+ const lineBreaksNode = (0, import_core2.node)(
1115
+ [segmentsNode, maxWidthNode, fontNode],
1116
+ (batchData, actions, ctx) => {
1117
+ const data = batchData.map(
1118
+ (batch, i) => batch != null && batch.length > 0 ? batch.at(-1) : ctx.prevData[i]
1119
+ );
1120
+ actions.emit(
1121
+ computeLineBreaks(
1122
+ data[0],
1123
+ data[1],
1124
+ adapter,
1125
+ data[2],
1126
+ measureCache
1127
+ )
1128
+ );
1129
+ },
1130
+ {
1131
+ name: "line-breaks",
1132
+ describeKind: "derived",
1133
+ equals: (a, b) => {
1134
+ const la = a;
1135
+ const lb = b;
1136
+ if (la == null || lb == null) return la === lb;
1137
+ if (la.lineCount !== lb.lineCount) return false;
1138
+ for (let i = 0; i < la.lines.length; i++) {
1139
+ const lineA = la.lines[i];
1140
+ const lineB = lb.lines[i];
1141
+ if (lineA.text !== lineB.text || lineA.width !== lineB.width || lineA.startSegment !== lineB.startSegment || lineA.startGrapheme !== lineB.startGrapheme || lineA.endSegment !== lineB.endSegment || lineA.endGrapheme !== lineB.endGrapheme)
1142
+ return false;
1143
+ }
1144
+ return true;
1145
+ }
1146
+ }
1147
+ );
1148
+ const heightNode = (0, import_core2.node)(
1149
+ [lineBreaksNode, lineHeightNode],
1150
+ (batchData, actions, ctx) => {
1151
+ const data = batchData.map(
1152
+ (batch, i) => batch != null && batch.length > 0 ? batch.at(-1) : ctx.prevData[i]
1153
+ );
1154
+ actions.emit(data[0].lineCount * data[1]);
1155
+ },
1156
+ { describeKind: "derived", name: "height" }
1157
+ );
1158
+ const charPositionsNode = (0, import_core2.node)(
1159
+ [lineBreaksNode, segmentsNode, lineHeightNode],
1160
+ (batchData, actions, ctx) => {
1161
+ const data = batchData.map(
1162
+ (batch, i) => batch != null && batch.length > 0 ? batch.at(-1) : ctx.prevData[i]
1163
+ );
1164
+ actions.emit(
1165
+ computeCharPositions(
1166
+ data[0],
1167
+ data[1],
1168
+ data[2]
1169
+ )
1170
+ );
1171
+ },
1172
+ {
1173
+ name: "char-positions",
1174
+ describeKind: "derived",
1175
+ equals: (a, b) => {
1176
+ const ca = a;
1177
+ const cb = b;
1178
+ if (ca == null || cb == null) return ca === cb;
1179
+ if (ca.length !== cb.length) return false;
1180
+ for (let i = 0; i < ca.length; i++) {
1181
+ if (ca[i].x !== cb[i].x || ca[i].y !== cb[i].y || ca[i].width !== cb[i].width)
1182
+ return false;
1183
+ }
1184
+ return true;
1185
+ }
1186
+ }
1187
+ );
1188
+ g.add(textNode, { name: "text" });
1189
+ g.add(fontNode, { name: "font" });
1190
+ g.add(lineHeightNode, { name: "line-height" });
1191
+ g.add(maxWidthNode, { name: "max-width" });
1192
+ g.add(segmentsNode, { name: "segments" });
1193
+ g.add(lineBreaksNode, { name: "line-breaks" });
1194
+ g.add(heightNode, { name: "height" });
1195
+ g.add(charPositionsNode, { name: "char-positions" });
1196
+ return {
1197
+ graph: g,
1198
+ setText: (text) => g.set("text", text),
1199
+ setFont: (font) => g.set("font", font),
1200
+ setLineHeight: (lh) => g.set("line-height", lh),
1201
+ setMaxWidth: (mw) => g.set("max-width", Math.max(0, mw)),
1202
+ segments: segmentsNode,
1203
+ lineBreaks: lineBreaksNode,
1204
+ height: heightNode,
1205
+ charPositions: charPositionsNode
1206
+ };
1207
+ }
1208
+
1209
+ // src/utils/reactive-layout/reactive-block-layout.ts
1210
+ function measureBlock(block, maxWidth, adapters, measureCache, defaultFont, defaultLineHeight, index) {
1211
+ switch (block.type) {
1212
+ case "text": {
1213
+ const font = block.font ?? defaultFont;
1214
+ 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);
1218
+ const height = lineBreaks.lineCount * lineHeight;
1219
+ let width = 0;
1220
+ for (const line of lineBreaks.lines) {
1221
+ if (line.width > width) width = line.width;
1222
+ }
1223
+ return {
1224
+ index,
1225
+ type: "text",
1226
+ width: Math.min(width, maxWidth),
1227
+ height,
1228
+ textSegments: segments,
1229
+ textLineBreaks: lineBreaks,
1230
+ textCharPositions: charPositions
1231
+ };
1232
+ }
1233
+ case "image": {
1234
+ let w;
1235
+ let h;
1236
+ if (block.naturalWidth != null && block.naturalHeight != null) {
1237
+ w = block.naturalWidth;
1238
+ h = block.naturalHeight;
1239
+ } else if (adapters.image) {
1240
+ const dims = adapters.image.measureImage(block.src);
1241
+ w = dims.width;
1242
+ h = dims.height;
1243
+ } else {
1244
+ throw new Error(
1245
+ `Image block at index ${index} has no naturalWidth/naturalHeight and no ImageMeasurer adapter`
1246
+ );
1247
+ }
1248
+ if (w > maxWidth) {
1249
+ h = h * maxWidth / w;
1250
+ w = maxWidth;
1251
+ }
1252
+ return { index, type: "image", width: w, height: h };
1253
+ }
1254
+ case "svg": {
1255
+ let w;
1256
+ let h;
1257
+ if (block.viewBox) {
1258
+ w = block.viewBox.width;
1259
+ h = block.viewBox.height;
1260
+ } else if (adapters.svg) {
1261
+ const dims = adapters.svg.measureSvg(block.content);
1262
+ w = dims.width;
1263
+ h = dims.height;
1264
+ } else {
1265
+ throw new Error(`SVG block at index ${index} has no viewBox and no SvgMeasurer adapter`);
1266
+ }
1267
+ if (w > maxWidth) {
1268
+ h = h * maxWidth / w;
1269
+ w = maxWidth;
1270
+ }
1271
+ return { index, type: "svg", width: w, height: h };
1272
+ }
1273
+ }
1274
+ }
1275
+ function measureBlocks(blocks, maxWidth, adapters, measureCache, defaultFont, defaultLineHeight) {
1276
+ return blocks.map(
1277
+ (block, i) => measureBlock(block, maxWidth, adapters, measureCache, defaultFont, defaultLineHeight, i)
1278
+ );
1279
+ }
1280
+ function computeBlockFlow(measured, gap) {
1281
+ const result = [];
1282
+ let y = 0;
1283
+ for (let i = 0; i < measured.length; i++) {
1284
+ const m = measured[i];
1285
+ result.push({ ...m, x: 0, y });
1286
+ y += m.height + (i < measured.length - 1 ? gap : 0);
1287
+ }
1288
+ return result;
1289
+ }
1290
+ function computeTotalHeight(flow) {
1291
+ if (flow.length === 0) return 0;
1292
+ const last = flow[flow.length - 1];
1293
+ return last.y + last.height;
1294
+ }
1295
+ function reactiveBlockLayout(opts) {
1296
+ const {
1297
+ adapters,
1298
+ name = "reactive-block-layout",
1299
+ defaultFont = "16px sans-serif",
1300
+ defaultLineHeight = 20
1301
+ } = opts;
1302
+ const g = new import_graph2.Graph(name);
1303
+ const measureCache = /* @__PURE__ */ new Map();
1304
+ const blocksNode = (0, import_core3.node)([], { name: "blocks", initial: opts.blocks ?? [] });
1305
+ const maxWidthNode = (0, import_core3.node)([], {
1306
+ name: "max-width",
1307
+ initial: Math.max(0, opts.maxWidth ?? 800)
1308
+ });
1309
+ const gapNode = (0, import_core3.node)([], { name: "gap", initial: opts.gap ?? 0 });
1310
+ const measuredBlocksNode = (0, import_core3.node)(
1311
+ [blocksNode, maxWidthNode],
1312
+ (data, actions, ctx) => {
1313
+ const blocksVal = data[0] != null && data[0].length > 0 ? data[0].at(-1) : ctx.prevData[0];
1314
+ const mwVal = data[1] != null && data[1].length > 0 ? data[1].at(-1) : ctx.prevData[1];
1315
+ const t0 = (0, import_core3.monotonicNs)();
1316
+ const result = measureBlocks(
1317
+ blocksVal,
1318
+ mwVal,
1319
+ adapters,
1320
+ measureCache,
1321
+ defaultFont,
1322
+ defaultLineHeight
1323
+ );
1324
+ const elapsed = (0, import_core3.monotonicNs)() - t0;
1325
+ const meta = measuredBlocksNode.meta;
1326
+ if (meta) {
1327
+ emitToMeta(meta["block-count"], result.length);
1328
+ emitToMeta(meta["layout-time-ns"], elapsed);
1329
+ }
1330
+ actions.emit(result);
1331
+ const flush = () => {
1332
+ measureCache.clear();
1333
+ adapters.text.clearCache?.();
1334
+ };
1335
+ return { onDeactivation: flush, onInvalidate: flush };
1336
+ },
1337
+ {
1338
+ name: "measured-blocks",
1339
+ describeKind: "derived",
1340
+ meta: { "block-count": 0, "layout-time-ns": 0 },
1341
+ equals: (a, b) => {
1342
+ const ma = a;
1343
+ const mb = b;
1344
+ if (ma == null || mb == null) return ma === mb;
1345
+ if (ma.length !== mb.length) return false;
1346
+ for (let i = 0; i < ma.length; i++) {
1347
+ const ba = ma[i];
1348
+ const bb = mb[i];
1349
+ if (ba.type !== bb.type || ba.width !== bb.width || ba.height !== bb.height || ba.index !== bb.index)
1350
+ return false;
1351
+ }
1352
+ return true;
1353
+ }
1354
+ }
1355
+ );
1356
+ const blockFlowNode = (0, import_core3.node)(
1357
+ [measuredBlocksNode, gapNode],
1358
+ (batchData, actions, ctx) => {
1359
+ const data = batchData.map(
1360
+ (batch, i) => batch != null && batch.length > 0 ? batch.at(-1) : ctx.prevData[i]
1361
+ );
1362
+ actions.emit(computeBlockFlow(data[0], data[1]));
1363
+ },
1364
+ {
1365
+ name: "block-flow",
1366
+ describeKind: "derived",
1367
+ equals: (a, b) => {
1368
+ const fa = a;
1369
+ const fb = b;
1370
+ if (fa == null || fb == null) return fa === fb;
1371
+ if (fa.length !== fb.length) return false;
1372
+ for (let i = 0; i < fa.length; i++) {
1373
+ const pa = fa[i];
1374
+ const pb = fb[i];
1375
+ if (pa.x !== pb.x || pa.y !== pb.y || pa.width !== pb.width || pa.height !== pb.height)
1376
+ return false;
1377
+ }
1378
+ return true;
1379
+ }
1380
+ }
1381
+ );
1382
+ const totalHeightNode = (0, import_core3.node)(
1383
+ [blockFlowNode],
1384
+ (batchData, actions, ctx) => {
1385
+ const data = batchData.map(
1386
+ (batch, i) => batch != null && batch.length > 0 ? batch.at(-1) : ctx.prevData[i]
1387
+ );
1388
+ actions.emit(computeTotalHeight(data[0]));
1389
+ },
1390
+ { describeKind: "derived", name: "total-height" }
1391
+ );
1392
+ g.add(blocksNode, { name: "blocks" });
1393
+ g.add(maxWidthNode, { name: "max-width" });
1394
+ g.add(gapNode, { name: "gap" });
1395
+ g.add(measuredBlocksNode, { name: "measured-blocks" });
1396
+ g.add(blockFlowNode, { name: "block-flow" });
1397
+ g.add(totalHeightNode, { name: "total-height" });
1398
+ return {
1399
+ graph: g,
1400
+ setBlocks: (blocks) => g.set("blocks", blocks),
1401
+ setMaxWidth: (mw) => g.set("max-width", Math.max(0, mw)),
1402
+ setGap: (gap) => g.set("gap", gap),
1403
+ measuredBlocks: measuredBlocksNode,
1404
+ blockFlow: blockFlowNode,
1405
+ totalHeight: totalHeightNode
1406
+ };
1407
+ }
1408
+
1409
+ // src/utils/reactive-layout/reactive-flow-layout.ts
1410
+ var import_core4 = require("@graphrefly/pure-ts/core");
1411
+ var import_graph3 = require("@graphrefly/pure-ts/graph");
1412
+ function circleIntervalForBand(o, bandTop, bandBottom) {
1413
+ const hPad = o.hPad ?? 0;
1414
+ const vPad = o.vPad ?? 0;
1415
+ const top = bandTop - vPad;
1416
+ const bottom = bandBottom + vPad;
1417
+ if (top >= o.cy + o.r || bottom <= o.cy - o.r) return null;
1418
+ const minDy = o.cy >= top && o.cy <= bottom ? 0 : o.cy < top ? top - o.cy : o.cy - bottom;
1419
+ if (minDy >= o.r) return null;
1420
+ const maxDx = Math.sqrt(o.r * o.r - minDy * minDy);
1421
+ return { left: o.cx - maxDx - hPad, right: o.cx + maxDx + hPad };
1422
+ }
1423
+ function rectIntervalForBand(o, bandTop, bandBottom) {
1424
+ const hPad = o.hPad ?? 0;
1425
+ const vPad = o.vPad ?? 0;
1426
+ if (bandBottom <= o.y - vPad) return null;
1427
+ if (bandTop >= o.y + o.h + vPad) return null;
1428
+ return { left: o.x - hPad, right: o.x + o.w + hPad };
1429
+ }
1430
+ function obstacleIntervalForBand(o, bandTop, bandBottom) {
1431
+ return o.kind === "circle" ? circleIntervalForBand(o, bandTop, bandBottom) : rectIntervalForBand(o, bandTop, bandBottom);
1432
+ }
1433
+ function computeFlowLines(segments, container, columns, obstacles, lineHeight, minSlotWidth, opts) {
1434
+ const paragraphSpacing = opts?.paragraphSpacing ?? lineHeight;
1435
+ const lines = [];
1436
+ let cursor = { segmentIndex: 0, graphemeIndex: 0 };
1437
+ if (segments.length === 0 || columns.count <= 0 || lineHeight <= 0) {
1438
+ return { lines, cursor };
1439
+ }
1440
+ const padX = container.paddingX ?? 0;
1441
+ const padY = container.paddingY ?? 0;
1442
+ const availWidth = Math.max(0, container.width - padX * 2);
1443
+ const availHeight = Math.max(0, container.height - padY * 2);
1444
+ const gapTotal = columns.gap * Math.max(0, columns.count - 1);
1445
+ const colWidth = Math.max(0, (availWidth - gapTotal) / columns.count);
1446
+ if (colWidth <= 0) return { lines, cursor };
1447
+ outerCol: for (let col = 0; col < columns.count; col++) {
1448
+ const colLeft = padX + col * (colWidth + columns.gap);
1449
+ const colRight = colLeft + colWidth;
1450
+ let bandTop = padY;
1451
+ while (bandTop + lineHeight <= padY + availHeight) {
1452
+ const bandBottom = bandTop + lineHeight;
1453
+ const blocked = [];
1454
+ for (let oi = 0; oi < obstacles.length; oi++) {
1455
+ const iv = obstacleIntervalForBand(obstacles[oi], bandTop, bandBottom);
1456
+ if (iv !== null) blocked.push(iv);
1457
+ }
1458
+ const slots = carveTextLineSlots({ left: colLeft, right: colRight }, blocked, minSlotWidth);
1459
+ if (slots.length === 0) {
1460
+ bandTop += lineHeight;
1461
+ continue;
1462
+ }
1463
+ let hardBreakThisBand = false;
1464
+ for (let si = 0; si < slots.length; si++) {
1465
+ const slot = slots[si];
1466
+ const slotW = slot.right - slot.left;
1467
+ const line = layoutNextLine(segments, cursor, slotW);
1468
+ if (line === null) {
1469
+ return { lines, cursor };
1470
+ }
1471
+ if (line.text.length === 0 && line.width === 0) {
1472
+ cursor = line.end;
1473
+ hardBreakThisBand = true;
1474
+ break;
1475
+ }
1476
+ lines.push({
1477
+ x: slot.left,
1478
+ y: bandTop,
1479
+ width: line.width,
1480
+ slotWidth: slotW,
1481
+ text: line.text,
1482
+ columnIndex: col,
1483
+ flushToRight: slot.right < colRight - 0.5
1484
+ });
1485
+ cursor = line.end;
1486
+ }
1487
+ if (hardBreakThisBand) {
1488
+ bandTop += paragraphSpacing;
1489
+ continue;
1490
+ }
1491
+ bandTop += lineHeight;
1492
+ if (cursor.segmentIndex >= segments.length) break outerCol;
1493
+ }
1494
+ if (cursor.segmentIndex >= segments.length) break;
1495
+ }
1496
+ return { lines, cursor };
1497
+ }
1498
+ function reactiveFlowLayout(opts) {
1499
+ const { adapter, name = "reactive-flow-layout", minSlotWidth = 20 } = opts;
1500
+ const g = new import_graph3.Graph(name);
1501
+ const measureCache = /* @__PURE__ */ new Map();
1502
+ const textNode = (0, import_core4.node)([], { name: "text", initial: opts.text ?? "" });
1503
+ const fontNode = (0, import_core4.node)([], { name: "font", initial: opts.font ?? "16px sans-serif" });
1504
+ const lineHeightNode = (0, import_core4.node)([], { name: "line-height", initial: opts.lineHeight ?? 20 });
1505
+ const containerNode = (0, import_core4.node)([], {
1506
+ name: "container",
1507
+ initial: opts.container ?? { width: 800, height: 600, paddingX: 0, paddingY: 0 }
1508
+ });
1509
+ const columnsNode = (0, import_core4.node)([], {
1510
+ name: "columns",
1511
+ initial: opts.columns ?? { count: 1, gap: 0 }
1512
+ });
1513
+ const obstaclesNode = (0, import_core4.node)([], { name: "obstacles", initial: opts.obstacles ?? [] });
1514
+ const paragraphSpacingNode = (0, import_core4.node)([], {
1515
+ name: "paragraph-spacing",
1516
+ initial: opts.paragraphSpacing ?? null
1517
+ });
1518
+ const segmentsNode = (0, import_core4.node)(
1519
+ [textNode, fontNode],
1520
+ (data, actions, ctx) => {
1521
+ const b0 = data[0];
1522
+ const textVal = b0 != null && b0.length > 0 ? b0.at(-1) : ctx.prevData[0];
1523
+ const b1 = data[1];
1524
+ const fontVal = b1 != null && b1.length > 0 ? b1.at(-1) : ctx.prevData[1];
1525
+ const result = analyzeAndMeasure(textVal, fontVal, adapter, measureCache);
1526
+ actions.emit(result);
1527
+ const flush = () => {
1528
+ measureCache.clear();
1529
+ adapter.clearCache?.();
1530
+ };
1531
+ return { onDeactivation: flush, onInvalidate: flush };
1532
+ },
1533
+ { name: "segments", describeKind: "derived" }
1534
+ );
1535
+ const flowLinesNode = (0, import_core4.node)(
1536
+ [segmentsNode, containerNode, columnsNode, obstaclesNode, lineHeightNode, paragraphSpacingNode],
1537
+ (batchData, actions, ctx) => {
1538
+ const data = batchData.map(
1539
+ (batch, i) => batch != null && batch.length > 0 ? batch.at(-1) : ctx.prevData[i]
1540
+ );
1541
+ const segments = data[0];
1542
+ const t0 = (0, import_core4.monotonicNs)();
1543
+ const effectiveSpacing = data[5] ?? data[4];
1544
+ const { lines: result, cursor } = computeFlowLines(
1545
+ segments,
1546
+ data[1],
1547
+ data[2],
1548
+ data[3],
1549
+ data[4],
1550
+ minSlotWidth,
1551
+ { paragraphSpacing: effectiveSpacing }
1552
+ );
1553
+ const elapsed = (0, import_core4.monotonicNs)() - t0;
1554
+ const overflow = Math.max(0, segments.length - cursor.segmentIndex);
1555
+ const meta = flowLinesNode.meta;
1556
+ if (meta) {
1557
+ emitToMeta(meta["line-count"], result.length);
1558
+ emitToMeta(meta["layout-time-ns"], elapsed);
1559
+ emitToMeta(meta["overflow-segments"], overflow);
1560
+ }
1561
+ actions.emit(result);
1562
+ },
1563
+ {
1564
+ describeKind: "derived",
1565
+ name: "flow-lines",
1566
+ meta: {
1567
+ "line-count": 0,
1568
+ "layout-time-ns": 0,
1569
+ "overflow-segments": 0
1570
+ },
1571
+ equals: (a, b) => {
1572
+ const la = a;
1573
+ const lb = b;
1574
+ if (la.length !== lb.length) return false;
1575
+ for (let i = 0; i < la.length; i++) {
1576
+ const pa = la[i];
1577
+ const pb = lb[i];
1578
+ if (pa.x !== pb.x || pa.y !== pb.y || pa.width !== pb.width || pa.slotWidth !== pb.slotWidth || pa.text !== pb.text || pa.columnIndex !== pb.columnIndex || pa.flushToRight !== pb.flushToRight)
1579
+ return false;
1580
+ }
1581
+ return true;
1582
+ }
1583
+ }
1584
+ );
1585
+ g.add(textNode, { name: "text" });
1586
+ g.add(fontNode, { name: "font" });
1587
+ g.add(lineHeightNode, { name: "line-height" });
1588
+ g.add(containerNode, { name: "container" });
1589
+ g.add(columnsNode, { name: "columns" });
1590
+ g.add(obstaclesNode, { name: "obstacles" });
1591
+ g.add(paragraphSpacingNode, { name: "paragraph-spacing" });
1592
+ g.add(segmentsNode, { name: "segments" });
1593
+ g.add(flowLinesNode, { name: "flow-lines" });
1594
+ return {
1595
+ graph: g,
1596
+ setText: (t) => g.set("text", t),
1597
+ setFont: (f) => g.set("font", f),
1598
+ setLineHeight: (lh) => g.set("line-height", lh),
1599
+ setContainer: (c) => g.set("container", c),
1600
+ setColumns: (c) => g.set("columns", c),
1601
+ setObstacles: (o) => g.set("obstacles", o),
1602
+ setParagraphSpacing: (ps) => g.set("paragraph-spacing", ps),
1603
+ segments: segmentsNode,
1604
+ flowLines: flowLinesNode
1605
+ };
1606
+ }
1607
+ //# sourceMappingURL=index.cjs.map