@pibbl/core 0.0.2 → 0.0.3-alpha.109.1

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 (549) hide show
  1. package/THIRD_PARTY_NOTICES.txt +81 -0
  2. package/dist/features/physics/2d-testing.d.ts +1 -1
  3. package/dist/features/physics/2d-testing.js +2 -2
  4. package/dist/features/physics/2d-testing.js.map +2 -2
  5. package/dist/features/physics/lib/2d/canvas/components.js +25 -21
  6. package/dist/features/physics/lib/2d/canvas/components.js.map +2 -2
  7. package/dist/features/physics/lib/2d/canvas/presentation.js +1 -2
  8. package/dist/features/physics/lib/2d/canvas/presentation.js.map +2 -2
  9. package/dist/features/physics/lib/2d/collision/casts.js +4 -2
  10. package/dist/features/physics/lib/2d/collision/casts.js.map +2 -2
  11. package/dist/features/physics/lib/2d/runtime/controller.js +1 -1
  12. package/dist/features/physics/lib/2d/runtime/controller.js.map +2 -2
  13. package/dist/features/physics/lib/2d/runtime/obstacles.js +9 -11
  14. package/dist/features/physics/lib/2d/runtime/obstacles.js.map +2 -2
  15. package/dist/features/physics/lib/2d/shapes.js +8 -9
  16. package/dist/features/physics/lib/2d/shapes.js.map +2 -2
  17. package/dist/features/physics/lib/2d/world/rapier.js +22 -26
  18. package/dist/features/physics/lib/2d/world/rapier.js.map +2 -2
  19. package/dist/features/sprites/loader.js +6 -3
  20. package/dist/features/sprites/loader.js.map +2 -2
  21. package/dist/features/textures/index.d.ts +12 -2
  22. package/dist/features/textures/index.js +33 -1
  23. package/dist/features/textures/index.js.map +2 -2
  24. package/dist/features/textures/lib/chemical-field.d.ts +56 -0
  25. package/dist/features/textures/lib/chemical-field.js +154 -0
  26. package/dist/features/textures/lib/chemical-field.js.map +7 -0
  27. package/dist/features/textures/lib/chemical-recipes.d.ts +119 -0
  28. package/dist/features/textures/lib/chemical-recipes.js +275 -0
  29. package/dist/features/textures/lib/chemical-recipes.js.map +7 -0
  30. package/dist/features/textures/lib/definitions.d.ts +3 -18
  31. package/dist/features/textures/lib/definitions.js +17 -24
  32. package/dist/features/textures/lib/definitions.js.map +2 -2
  33. package/dist/features/textures/lib/geometric-patterns.d.ts +149 -0
  34. package/dist/features/textures/lib/geometric-patterns.js +305 -0
  35. package/dist/features/textures/lib/geometric-patterns.js.map +7 -0
  36. package/dist/features/textures/lib/gray-scott.d.ts +55 -0
  37. package/dist/features/textures/lib/gray-scott.js +37 -0
  38. package/dist/features/textures/lib/gray-scott.js.map +7 -0
  39. package/dist/features/textures/lib/palette.js +1 -3
  40. package/dist/features/textures/lib/palette.js.map +2 -2
  41. package/dist/features/textures/lib/patterns.d.ts +123 -0
  42. package/dist/features/textures/lib/patterns.js +344 -0
  43. package/dist/features/textures/lib/patterns.js.map +7 -0
  44. package/dist/features/textures/lib/rain-drops.js +2 -1
  45. package/dist/features/textures/lib/rain-drops.js.map +2 -2
  46. package/dist/features/textures/lib/reaction-diffusion.d.ts +3 -2
  47. package/dist/features/textures/lib/reaction-diffusion.js +9 -20
  48. package/dist/features/textures/lib/reaction-diffusion.js.map +2 -2
  49. package/dist/features/textures/lib/simulation.d.ts +10 -4
  50. package/dist/features/textures/lib/simulation.js +23 -13
  51. package/dist/features/textures/lib/simulation.js.map +2 -2
  52. package/dist/features/textures/lib/wasm/electric.js +8 -1
  53. package/dist/features/textures/lib/wasm/electric.js.map +2 -2
  54. package/dist/features/textures/lib/water-surface.js +1 -3
  55. package/dist/features/textures/lib/water-surface.js.map +2 -2
  56. package/dist/features/viz/index.d.ts +68 -6
  57. package/dist/features/viz/index.js +164 -2
  58. package/dist/features/viz/index.js.map +2 -2
  59. package/dist/features/viz/inspection/bar.d.ts +79 -0
  60. package/dist/features/viz/inspection/bar.js +49 -0
  61. package/dist/features/viz/inspection/bar.js.map +7 -0
  62. package/dist/features/viz/inspection/candle.d.ts +156 -0
  63. package/dist/features/viz/inspection/candle.js +120 -0
  64. package/dist/features/viz/inspection/candle.js.map +7 -0
  65. package/dist/features/viz/inspection/capture-types.d.ts +65 -0
  66. package/dist/features/viz/inspection/capture.d.ts +16 -0
  67. package/dist/features/viz/inspection/capture.js +49 -0
  68. package/dist/features/viz/inspection/capture.js.map +7 -0
  69. package/dist/features/viz/inspection/handler.d.ts +36 -0
  70. package/dist/features/viz/inspection/handler.js +91 -0
  71. package/dist/features/viz/inspection/handler.js.map +7 -0
  72. package/dist/features/viz/inspection/ohlc-bar.d.ts +132 -0
  73. package/dist/features/viz/inspection/ohlc-bar.js +118 -0
  74. package/dist/features/viz/inspection/ohlc-bar.js.map +7 -0
  75. package/dist/features/viz/inspection/owned-ref.d.ts +16 -0
  76. package/dist/features/viz/inspection/owned-ref.js +99 -0
  77. package/dist/features/viz/inspection/owned-ref.js.map +7 -0
  78. package/dist/features/viz/inspection/painted-point.d.ts +22 -0
  79. package/dist/features/viz/inspection/painted-point.js +29 -0
  80. package/dist/features/viz/inspection/painted-point.js.map +7 -0
  81. package/dist/features/viz/inspection/queries.d.ts +100 -0
  82. package/dist/features/viz/inspection/queries.js +192 -0
  83. package/dist/features/viz/inspection/queries.js.map +7 -0
  84. package/dist/features/viz/inspection/query-types.d.ts +177 -0
  85. package/dist/features/viz/inspection/volume.d.ts +104 -0
  86. package/dist/features/viz/inspection/volume.js +95 -0
  87. package/dist/features/viz/inspection/volume.js.map +7 -0
  88. package/dist/features/viz/inspection.d.ts +19 -0
  89. package/dist/features/viz/inspection.js +54 -0
  90. package/dist/features/viz/inspection.js.map +7 -0
  91. package/dist/features/viz/inspection.mjs +1 -0
  92. package/dist/features/viz/lib/area-series.d.ts +62 -0
  93. package/dist/features/viz/lib/area-series.js +120 -0
  94. package/dist/features/viz/lib/area-series.js.map +7 -0
  95. package/dist/features/viz/lib/axis-title.js +2 -1
  96. package/dist/features/viz/lib/axis-title.js.map +2 -2
  97. package/dist/features/viz/lib/axis.js +1 -1
  98. package/dist/features/viz/lib/axis.js.map +2 -2
  99. package/dist/features/viz/lib/bar-series.d.ts +3 -1
  100. package/dist/features/viz/lib/bar-series.js +16 -1
  101. package/dist/features/viz/lib/bar-series.js.map +2 -2
  102. package/dist/features/viz/lib/baseline-series.d.ts +55 -0
  103. package/dist/features/viz/lib/baseline-series.js +136 -0
  104. package/dist/features/viz/lib/baseline-series.js.map +7 -0
  105. package/dist/features/viz/lib/candlestick-series.d.ts +62 -0
  106. package/dist/features/viz/lib/candlestick-series.js +150 -0
  107. package/dist/features/viz/lib/candlestick-series.js.map +7 -0
  108. package/dist/features/viz/lib/censored-point-series.d.ts +71 -0
  109. package/dist/features/viz/lib/censored-point-series.js +129 -0
  110. package/dist/features/viz/lib/censored-point-series.js.map +7 -0
  111. package/dist/features/viz/lib/color-context.d.ts +4 -0
  112. package/dist/features/viz/lib/color-context.js +41 -0
  113. package/dist/features/viz/lib/color-context.js.map +7 -0
  114. package/dist/features/viz/lib/color-math.d.ts +4 -0
  115. package/dist/features/viz/lib/color-math.js +31 -0
  116. package/dist/features/viz/lib/color-math.js.map +7 -0
  117. package/dist/features/viz/lib/color-types.d.ts +53 -0
  118. package/dist/features/viz/lib/curve-definition.d.ts +49 -0
  119. package/dist/features/viz/lib/curve-definition.js +142 -0
  120. package/dist/features/viz/lib/curve-definition.js.map +7 -0
  121. package/dist/features/viz/lib/diverging-color-scale.d.ts +11 -0
  122. package/dist/features/viz/lib/diverging-color-scale.js +51 -0
  123. package/dist/features/viz/lib/diverging-color-scale.js.map +7 -0
  124. package/dist/features/viz/lib/domain-navigation.d.ts +40 -0
  125. package/dist/features/viz/lib/domain-navigation.js +77 -0
  126. package/dist/features/viz/lib/domain-navigation.js.map +7 -0
  127. package/dist/features/viz/lib/editable-chart-elements.d.ts +178 -0
  128. package/dist/features/viz/lib/editable-chart-elements.js +733 -0
  129. package/dist/features/viz/lib/editable-chart-elements.js.map +7 -0
  130. package/dist/features/viz/lib/financial-aggregation.d.ts +127 -0
  131. package/dist/features/viz/lib/financial-aggregation.js +116 -0
  132. package/dist/features/viz/lib/financial-aggregation.js.map +7 -0
  133. package/dist/features/viz/lib/financial-autoscale.d.ts +64 -0
  134. package/dist/features/viz/lib/financial-autoscale.js +61 -0
  135. package/dist/features/viz/lib/financial-autoscale.js.map +7 -0
  136. package/dist/features/viz/lib/financial-comparison.d.ts +62 -0
  137. package/dist/features/viz/lib/financial-comparison.js +98 -0
  138. package/dist/features/viz/lib/financial-comparison.js.map +7 -0
  139. package/dist/features/viz/lib/financial-geometry.d.ts +77 -0
  140. package/dist/features/viz/lib/financial-geometry.js +67 -0
  141. package/dist/features/viz/lib/financial-geometry.js.map +7 -0
  142. package/dist/features/viz/lib/financial-indicators.d.ts +114 -0
  143. package/dist/features/viz/lib/financial-indicators.js +135 -0
  144. package/dist/features/viz/lib/financial-indicators.js.map +7 -0
  145. package/dist/features/viz/lib/financial-oscillators.d.ts +171 -0
  146. package/dist/features/viz/lib/financial-oscillators.js +265 -0
  147. package/dist/features/viz/lib/financial-oscillators.js.map +7 -0
  148. package/dist/features/viz/lib/graph/bipartite.d.ts +14 -0
  149. package/dist/features/viz/lib/graph/bipartite.js +250 -0
  150. package/dist/features/viz/lib/graph/bipartite.js.map +7 -0
  151. package/dist/features/viz/lib/graph/chord.d.ts +44 -0
  152. package/dist/features/viz/lib/graph/chord.js +348 -0
  153. package/dist/features/viz/lib/graph/chord.js.map +7 -0
  154. package/dist/features/viz/lib/graph/dependency.d.ts +26 -0
  155. package/dist/features/viz/lib/graph/dependency.js +140 -0
  156. package/dist/features/viz/lib/graph/dependency.js.map +7 -0
  157. package/dist/features/viz/lib/graph/force.d.ts +28 -0
  158. package/dist/features/viz/lib/graph/force.js +580 -0
  159. package/dist/features/viz/lib/graph/force.js.map +7 -0
  160. package/dist/features/viz/lib/graph/hierarchy.d.ts +21 -0
  161. package/dist/features/viz/lib/graph/hierarchy.js +112 -0
  162. package/dist/features/viz/lib/graph/hierarchy.js.map +7 -0
  163. package/dist/features/viz/lib/graph/icicle.d.ts +16 -0
  164. package/dist/features/viz/lib/graph/icicle.js +153 -0
  165. package/dist/features/viz/lib/graph/icicle.js.map +7 -0
  166. package/dist/features/viz/lib/graph/matrix.d.ts +30 -0
  167. package/dist/features/viz/lib/graph/matrix.js +243 -0
  168. package/dist/features/viz/lib/graph/matrix.js.map +7 -0
  169. package/dist/features/viz/lib/graph/neighborhood.d.ts +11 -0
  170. package/dist/features/viz/lib/graph/neighborhood.js +281 -0
  171. package/dist/features/viz/lib/graph/neighborhood.js.map +7 -0
  172. package/dist/features/viz/lib/graph/routes.d.ts +35 -0
  173. package/dist/features/viz/lib/graph/routes.js +101 -0
  174. package/dist/features/viz/lib/graph/routes.js.map +7 -0
  175. package/dist/features/viz/lib/graph/sankey.d.ts +44 -0
  176. package/dist/features/viz/lib/graph/sankey.js +341 -0
  177. package/dist/features/viz/lib/graph/sankey.js.map +7 -0
  178. package/dist/features/viz/lib/graph/shared.d.ts +59 -0
  179. package/dist/features/viz/lib/graph/shared.js +301 -0
  180. package/dist/features/viz/lib/graph/shared.js.map +7 -0
  181. package/dist/features/viz/lib/graph/tree.d.ts +11 -0
  182. package/dist/features/viz/lib/graph/tree.js +232 -0
  183. package/dist/features/viz/lib/graph/tree.js.map +7 -0
  184. package/dist/features/viz/lib/graph/treemap.d.ts +20 -0
  185. package/dist/features/viz/lib/graph/treemap.js +227 -0
  186. package/dist/features/viz/lib/graph/treemap.js.map +7 -0
  187. package/dist/features/viz/lib/graph/types.d.ts +1097 -0
  188. package/dist/features/viz/lib/hover-card.js +8 -9
  189. package/dist/features/viz/lib/hover-card.js.map +2 -2
  190. package/dist/features/viz/lib/hover-data.d.ts +1 -1
  191. package/dist/features/viz/lib/hover-data.js +5 -2
  192. package/dist/features/viz/lib/hover-data.js.map +2 -2
  193. package/dist/features/viz/lib/interval-band-series.d.ts +49 -0
  194. package/dist/features/viz/lib/interval-band-series.js +136 -0
  195. package/dist/features/viz/lib/interval-band-series.js.map +7 -0
  196. package/dist/features/viz/lib/interval-diamond-series.d.ts +43 -0
  197. package/dist/features/viz/lib/interval-diamond-series.js +122 -0
  198. package/dist/features/viz/lib/interval-diamond-series.js.map +7 -0
  199. package/dist/features/viz/lib/interval-series.d.ts +79 -0
  200. package/dist/features/viz/lib/interval-series.js +158 -0
  201. package/dist/features/viz/lib/interval-series.js.map +7 -0
  202. package/dist/features/viz/lib/layout-pie.js +9 -13
  203. package/dist/features/viz/lib/layout-pie.js.map +2 -2
  204. package/dist/features/viz/lib/line-series.d.ts +1 -1
  205. package/dist/features/viz/lib/line-series.js +47 -28
  206. package/dist/features/viz/lib/line-series.js.map +2 -2
  207. package/dist/features/viz/lib/linear-scale.js +1 -1
  208. package/dist/features/viz/lib/linear-scale.js.map +2 -2
  209. package/dist/features/viz/lib/monotone-curve.d.ts +11 -0
  210. package/dist/features/viz/lib/monotone-curve.js +63 -0
  211. package/dist/features/viz/lib/monotone-curve.js.map +7 -0
  212. package/dist/features/viz/lib/numeric-range-interpolation.d.ts +15 -0
  213. package/dist/features/viz/lib/numeric-range-interpolation.js +36 -0
  214. package/dist/features/viz/lib/numeric-range-interpolation.js.map +7 -0
  215. package/dist/features/viz/lib/ohlc-bar-series.d.ts +55 -0
  216. package/dist/features/viz/lib/ohlc-bar-series.js +168 -0
  217. package/dist/features/viz/lib/ohlc-bar-series.js.map +7 -0
  218. package/dist/features/viz/lib/paired-series.d.ts +44 -0
  219. package/dist/features/viz/lib/paired-series.js +93 -0
  220. package/dist/features/viz/lib/paired-series.js.map +7 -0
  221. package/dist/features/viz/lib/pie-layout.js +2 -1
  222. package/dist/features/viz/lib/pie-layout.js.map +2 -2
  223. package/dist/features/viz/lib/plot-series.js +11 -6
  224. package/dist/features/viz/lib/plot-series.js.map +2 -2
  225. package/dist/features/viz/lib/plot-types.d.ts +4 -3
  226. package/dist/features/viz/lib/point-series.d.ts +1 -1
  227. package/dist/features/viz/lib/point-series.js +36 -9
  228. package/dist/features/viz/lib/point-series.js.map +2 -2
  229. package/dist/features/viz/lib/point-types.d.ts +5 -2
  230. package/dist/features/viz/lib/reference-band.js +4 -1
  231. package/dist/features/viz/lib/reference-band.js.map +2 -2
  232. package/dist/features/viz/lib/scale-context.d.ts +1 -1
  233. package/dist/features/viz/lib/scale-ticks.js +21 -6
  234. package/dist/features/viz/lib/scale-ticks.js.map +2 -2
  235. package/dist/features/viz/lib/sequential-color-scale.d.ts +11 -0
  236. package/dist/features/viz/lib/sequential-color-scale.js +49 -0
  237. package/dist/features/viz/lib/sequential-color-scale.js.map +7 -0
  238. package/dist/features/viz/lib/series-position.d.ts +12 -0
  239. package/dist/features/viz/lib/series-position.js +44 -0
  240. package/dist/features/viz/lib/series-position.js.map +7 -0
  241. package/dist/features/viz/lib/step-curves.d.ts +19 -0
  242. package/dist/features/viz/lib/step-curves.js +53 -0
  243. package/dist/features/viz/lib/step-curves.js.map +7 -0
  244. package/dist/features/viz/lib/threshold-color-scale.d.ts +43 -0
  245. package/dist/features/viz/lib/threshold-color-scale.js +59 -0
  246. package/dist/features/viz/lib/threshold-color-scale.js.map +7 -0
  247. package/dist/features/viz/lib/trading-time-mapping.d.ts +32 -0
  248. package/dist/features/viz/lib/trading-time-mapping.js +89 -0
  249. package/dist/features/viz/lib/trading-time-mapping.js.map +7 -0
  250. package/dist/features/viz/lib/trading-time-scale.d.ts +83 -0
  251. package/dist/features/viz/lib/trading-time-scale.js +96 -0
  252. package/dist/features/viz/lib/trading-time-scale.js.map +7 -0
  253. package/dist/features/viz/lib/trajectory-series.d.ts +71 -0
  254. package/dist/features/viz/lib/trajectory-series.js +111 -0
  255. package/dist/features/viz/lib/trajectory-series.js.map +7 -0
  256. package/dist/features/viz/lib/types.d.ts +20 -4
  257. package/dist/features/viz/lib/use-continuous-scale.js +6 -1
  258. package/dist/features/viz/lib/use-continuous-scale.js.map +2 -2
  259. package/dist/features/viz/lib/utc-scale.js +11 -10
  260. package/dist/features/viz/lib/utc-scale.js.map +2 -2
  261. package/dist/features/viz/lib/volume-series.d.ts +59 -0
  262. package/dist/features/viz/lib/volume-series.js +117 -0
  263. package/dist/features/viz/lib/volume-series.js.map +7 -0
  264. package/dist/features/viz/lib/weighted-point-series.d.ts +71 -0
  265. package/dist/features/viz/lib/weighted-point-series.js +169 -0
  266. package/dist/features/viz/lib/weighted-point-series.js.map +7 -0
  267. package/dist/filters/backdrop-contrast-gpu.d.ts +5 -0
  268. package/dist/filters/backdrop-contrast-gpu.js +33 -0
  269. package/dist/filters/backdrop-contrast-gpu.js.map +7 -0
  270. package/dist/filters/backdrop-contrast.d.ts +21 -0
  271. package/dist/filters/backdrop-contrast.js +61 -0
  272. package/dist/filters/backdrop-contrast.js.map +7 -0
  273. package/dist/filters/displacement.js +1 -1
  274. package/dist/filters/displacement.js.map +2 -2
  275. package/dist/filters/emboss-gpu.d.ts +4 -0
  276. package/dist/filters/emboss-gpu.js +39 -0
  277. package/dist/filters/emboss-gpu.js.map +7 -0
  278. package/dist/filters/emboss.d.ts +32 -0
  279. package/dist/filters/emboss.js +104 -0
  280. package/dist/filters/emboss.js.map +7 -0
  281. package/dist/filters/filter-executor.d.ts +11 -4
  282. package/dist/filters/filter-executor.js +104 -49
  283. package/dist/filters/filter-executor.js.map +2 -2
  284. package/dist/filters/reflected-light.js +1 -1
  285. package/dist/filters/reflected-light.js.map +2 -2
  286. package/dist/filters/reflection-gpu.d.ts +3 -1
  287. package/dist/filters/reflection-gpu.js +5 -2
  288. package/dist/filters/reflection-gpu.js.map +2 -2
  289. package/dist/filters/render-backdrop-contrast-boundary.d.ts +31 -0
  290. package/dist/filters/render-backdrop-contrast-boundary.js +116 -0
  291. package/dist/filters/render-backdrop-contrast-boundary.js.map +7 -0
  292. package/dist/filters/render-emboss-boundary.d.ts +13 -0
  293. package/dist/filters/render-emboss-boundary.js +131 -0
  294. package/dist/filters/render-emboss-boundary.js.map +7 -0
  295. package/dist/filters.d.ts +9 -5
  296. package/dist/filters.js +4 -0
  297. package/dist/filters.js.map +2 -2
  298. package/dist/index.d.ts +9 -5
  299. package/dist/index.js +18 -2
  300. package/dist/index.js.map +2 -2
  301. package/dist/internal.d.ts +4 -0
  302. package/dist/internal.js +6 -0
  303. package/dist/internal.js.map +2 -2
  304. package/dist/layout-kernel.d.ts +12 -0
  305. package/dist/layout-kernel.js +11 -0
  306. package/dist/layout-kernel.js.map +7 -0
  307. package/dist/layout-kernel.mjs +1 -0
  308. package/dist/lib/backend/types.d.ts +13 -1
  309. package/dist/lib/backend/types.js.map +2 -2
  310. package/dist/lib/components/arc-geometry.js +2 -1
  311. package/dist/lib/components/arc-geometry.js.map +2 -2
  312. package/dist/lib/components/g.js +2 -0
  313. package/dist/lib/components/g.js.map +2 -2
  314. package/dist/lib/components/html-box.js +2 -1
  315. package/dist/lib/components/html-box.js.map +2 -2
  316. package/dist/lib/components/img.js +3 -3
  317. package/dist/lib/components/img.js.map +2 -2
  318. package/dist/lib/components/layer.js +98 -16
  319. package/dist/lib/components/layer.js.map +3 -3
  320. package/dist/lib/components/text.d.ts +16 -0
  321. package/dist/lib/components/text.js +131 -24
  322. package/dist/lib/components/text.js.map +2 -2
  323. package/dist/lib/define-primitive.d.ts +4 -2
  324. package/dist/lib/define-primitive.js +3 -1
  325. package/dist/lib/define-primitive.js.map +2 -2
  326. package/dist/lib/element/metadata.d.ts +9 -0
  327. package/dist/lib/element/metadata.js +19 -0
  328. package/dist/lib/element/metadata.js.map +2 -2
  329. package/dist/lib/element/resolve-primitive-inputs.d.ts +2 -0
  330. package/dist/lib/element/resolve-primitive-inputs.js +17 -4
  331. package/dist/lib/element/resolve-primitive-inputs.js.map +2 -2
  332. package/dist/lib/events/event-facade.d.ts +18 -0
  333. package/dist/lib/events/event-facade.js +28 -2
  334. package/dist/lib/events/event-facade.js.map +2 -2
  335. package/dist/lib/events/hit-test.js +2 -1
  336. package/dist/lib/events/hit-test.js.map +2 -2
  337. package/dist/lib/events/propagation.d.ts +2 -1
  338. package/dist/lib/events/propagation.js +22 -16
  339. package/dist/lib/events/propagation.js.map +2 -2
  340. package/dist/lib/events/registrations.d.ts +10 -0
  341. package/dist/lib/events/registrations.js +160 -5
  342. package/dist/lib/events/registrations.js.map +2 -2
  343. package/dist/lib/execute-render.js +25 -1
  344. package/dist/lib/execute-render.js.map +2 -2
  345. package/dist/lib/filter/filter-region.js +3 -10
  346. package/dist/lib/filter/filter-region.js.map +2 -2
  347. package/dist/lib/focus/focus-manager.d.ts +8 -1
  348. package/dist/lib/focus/focus-manager.js +87 -43
  349. package/dist/lib/focus/focus-manager.js.map +2 -2
  350. package/dist/lib/focus/geometry.d.ts +2 -0
  351. package/dist/lib/focus/geometry.js +6 -0
  352. package/dist/lib/focus/geometry.js.map +2 -2
  353. package/dist/lib/geometry/path-bend-guide.js +1 -1
  354. package/dist/lib/geometry/path-bend-guide.js.map +2 -2
  355. package/dist/lib/geometry/path-geometry.js +12 -11
  356. package/dist/lib/geometry/path-geometry.js.map +2 -2
  357. package/dist/lib/geometry/path-transforms.js +17 -21
  358. package/dist/lib/geometry/path-transforms.js.map +2 -2
  359. package/dist/lib/geometry/path-warp-bezier.js +3 -1
  360. package/dist/lib/geometry/path-warp-bezier.js.map +2 -2
  361. package/dist/lib/geometry/path-warp.js +1 -1
  362. package/dist/lib/geometry/path-warp.js.map +2 -2
  363. package/dist/lib/global-state.js +2 -0
  364. package/dist/lib/global-state.js.map +2 -2
  365. package/dist/lib/html/html-events.d.ts +32 -0
  366. package/dist/lib/html/html-events.js +179 -0
  367. package/dist/lib/html/html-events.js.map +7 -0
  368. package/dist/lib/html/html-service.d.ts +8 -2
  369. package/dist/lib/html/html-service.js +198 -65
  370. package/dist/lib/html/html-service.js.map +2 -2
  371. package/dist/lib/html/overlay-config.js +7 -6
  372. package/dist/lib/html/overlay-config.js.map +2 -2
  373. package/dist/lib/html/types.d.ts +29 -2
  374. package/dist/lib/layout/absolute.d.ts +11 -5
  375. package/dist/lib/layout/absolute.js +329 -55
  376. package/dist/lib/layout/absolute.js.map +3 -3
  377. package/dist/lib/layout/allocation-checkpoint-owner.d.ts +11 -0
  378. package/dist/lib/layout/allocation-checkpoint-owner.js +86 -0
  379. package/dist/lib/layout/allocation-checkpoint-owner.js.map +7 -0
  380. package/dist/lib/layout/allocation-checkpoint.d.ts +53 -0
  381. package/dist/lib/layout/allocation-checkpoint.js +463 -0
  382. package/dist/lib/layout/allocation-checkpoint.js.map +7 -0
  383. package/dist/lib/layout/allocation-dependencies.d.ts +30 -0
  384. package/dist/lib/layout/allocation-dependencies.js +90 -0
  385. package/dist/lib/layout/allocation-dependencies.js.map +7 -0
  386. package/dist/lib/layout/allocation-revision.d.ts +13 -0
  387. package/dist/lib/layout/allocation-revision.js +67 -0
  388. package/dist/lib/layout/allocation-revision.js.map +7 -0
  389. package/dist/lib/layout/box-insets.d.ts +17 -0
  390. package/dist/lib/layout/box-insets.js +138 -0
  391. package/dist/lib/layout/box-insets.js.map +7 -0
  392. package/dist/lib/layout/box-sizing.d.ts +16 -0
  393. package/dist/lib/layout/box-sizing.js +77 -0
  394. package/dist/lib/layout/box-sizing.js.map +7 -0
  395. package/dist/lib/layout/box.js +42 -12
  396. package/dist/lib/layout/box.js.map +2 -2
  397. package/dist/lib/layout/canvas-measurement.d.ts +13 -0
  398. package/dist/lib/layout/canvas-measurement.js +57 -0
  399. package/dist/lib/layout/canvas-measurement.js.map +7 -0
  400. package/dist/lib/layout/context.d.ts +35 -6
  401. package/dist/lib/layout/context.js +72 -3
  402. package/dist/lib/layout/context.js.map +2 -2
  403. package/dist/lib/layout/define-layout-component.d.ts +23 -0
  404. package/dist/lib/layout/define-layout-component.js +84 -0
  405. package/dist/lib/layout/define-layout-component.js.map +7 -0
  406. package/dist/lib/layout/flex-allocation-cache.d.ts +42 -0
  407. package/dist/lib/layout/flex-baseline-mode.d.ts +2 -0
  408. package/dist/lib/layout/flex-baseline-mode.js +7 -0
  409. package/dist/lib/layout/flex-baseline-mode.js.map +7 -0
  410. package/dist/lib/layout/flex.d.ts +50 -15
  411. package/dist/lib/layout/flex.js +2124 -195
  412. package/dist/lib/layout/flex.js.map +3 -3
  413. package/dist/lib/layout/flow.js +225 -49
  414. package/dist/lib/layout/flow.js.map +2 -2
  415. package/dist/lib/layout/geometry-publication.d.ts +53 -0
  416. package/dist/lib/layout/geometry-publication.js +244 -0
  417. package/dist/lib/layout/geometry-publication.js.map +7 -0
  418. package/dist/lib/layout/grid-kernel.d.ts +63 -0
  419. package/dist/lib/layout/grid-kernel.js +168 -0
  420. package/dist/lib/layout/grid-kernel.js.map +7 -0
  421. package/dist/lib/layout/grid.d.ts +63 -4
  422. package/dist/lib/layout/grid.js +767 -171
  423. package/dist/lib/layout/grid.js.map +3 -3
  424. package/dist/lib/layout/measure.d.ts +55 -3
  425. package/dist/lib/layout/measure.js +448 -15
  426. package/dist/lib/layout/measure.js.map +2 -2
  427. package/dist/lib/layout/overlay.js +81 -23
  428. package/dist/lib/layout/overlay.js.map +2 -2
  429. package/dist/lib/layout/participation.d.ts +27 -0
  430. package/dist/lib/layout/participation.js +188 -0
  431. package/dist/lib/layout/participation.js.map +7 -0
  432. package/dist/lib/layout/place-child.js +1 -1
  433. package/dist/lib/layout/place-child.js.map +2 -2
  434. package/dist/lib/layout/positioning-diagnostics.d.ts +1 -1
  435. package/dist/lib/layout/positioning-diagnostics.js +13 -2
  436. package/dist/lib/layout/positioning-diagnostics.js.map +2 -2
  437. package/dist/lib/layout/prepared-root.d.ts +121 -0
  438. package/dist/lib/layout/prepared-root.js +360 -0
  439. package/dist/lib/layout/prepared-root.js.map +7 -0
  440. package/dist/lib/layout/standalone-kernel.d.ts +60 -0
  441. package/dist/lib/layout/standalone-kernel.js +722 -0
  442. package/dist/lib/layout/standalone-kernel.js.map +7 -0
  443. package/dist/lib/layout/topology.d.ts +21 -0
  444. package/dist/lib/layout/topology.js +113 -0
  445. package/dist/lib/layout/topology.js.map +7 -0
  446. package/dist/lib/layout/types.d.ts +5 -0
  447. package/dist/lib/layout/wasm/artifact.d.ts +1 -0
  448. package/dist/lib/layout/wasm/artifact.js +5 -0
  449. package/dist/lib/layout/wasm/artifact.js.map +7 -0
  450. package/dist/lib/layout/wasm/bytes.d.ts +1 -0
  451. package/dist/lib/layout/wasm/bytes.js +5 -0
  452. package/dist/lib/layout/wasm/bytes.js.map +7 -0
  453. package/dist/lib/layout/wasm/embedded.d.ts +2 -0
  454. package/dist/lib/layout/wasm/embedded.js +12 -0
  455. package/dist/lib/layout/wasm/embedded.js.map +7 -0
  456. package/dist/lib/layout/wasm/layout.wasm +0 -0
  457. package/dist/lib/layout/wasm/module.d.ts +8 -0
  458. package/dist/lib/layout/wasm/module.js +70 -0
  459. package/dist/lib/layout/wasm/module.js.map +7 -0
  460. package/dist/lib/layout/wasm/region.d.ts +267 -0
  461. package/dist/lib/layout/wasm/region.js +1018 -0
  462. package/dist/lib/layout/wasm/region.js.map +7 -0
  463. package/dist/lib/manipulation/controller.js +4 -7
  464. package/dist/lib/manipulation/controller.js.map +2 -2
  465. package/dist/lib/manipulation/frame.js +1 -1
  466. package/dist/lib/manipulation/frame.js.map +2 -2
  467. package/dist/lib/manipulation/handles.js +32 -33
  468. package/dist/lib/manipulation/handles.js.map +2 -2
  469. package/dist/lib/manipulation/solve.js +12 -10
  470. package/dist/lib/manipulation/solve.js.map +2 -2
  471. package/dist/lib/mount-pibbl.js +1 -0
  472. package/dist/lib/mount-pibbl.js.map +2 -2
  473. package/dist/lib/mount-prepared-pibbl.d.ts +5 -0
  474. package/dist/lib/mount-prepared-pibbl.js +29 -0
  475. package/dist/lib/mount-prepared-pibbl.js.map +7 -0
  476. package/dist/lib/mount-request.d.ts +8 -0
  477. package/dist/lib/mount-request.js +41 -0
  478. package/dist/lib/mount-request.js.map +7 -0
  479. package/dist/lib/pibbl.d.ts +21 -13
  480. package/dist/lib/pibbl.js +18 -16
  481. package/dist/lib/pibbl.js.map +2 -2
  482. package/dist/lib/recording/recording.d.ts +43 -0
  483. package/dist/lib/recording/recording.js +555 -0
  484. package/dist/lib/recording/recording.js.map +7 -0
  485. package/dist/lib/recording/types.d.ts +118 -0
  486. package/dist/lib/recording/wasm-bytes.d.ts +1 -0
  487. package/dist/lib/recording/wasm-bytes.js +5 -0
  488. package/dist/lib/recording/wasm-bytes.js.map +7 -0
  489. package/dist/lib/recording/worker-source.d.ts +1 -0
  490. package/dist/lib/recording/worker-source.js +5 -0
  491. package/dist/lib/recording/worker-source.js.map +7 -0
  492. package/dist/lib/render-layer/controller.d.ts +9 -3
  493. package/dist/lib/render-layer/controller.js +259 -110
  494. package/dist/lib/render-layer/controller.js.map +2 -2
  495. package/dist/lib/render-transaction.d.ts +12 -2
  496. package/dist/lib/render-transaction.js +69 -1
  497. package/dist/lib/render-transaction.js.map +2 -2
  498. package/dist/lib/render.js +32 -8
  499. package/dist/lib/render.js.map +2 -2
  500. package/dist/lib/scheduler/realm-scheduler.d.ts +2 -0
  501. package/dist/lib/scheduler/realm-scheduler.js +55 -26
  502. package/dist/lib/scheduler/realm-scheduler.js.map +2 -2
  503. package/dist/lib/scheduler/renderer-participant.js +1 -0
  504. package/dist/lib/scheduler/renderer-participant.js.map +2 -2
  505. package/dist/lib/series-inspection-frame.d.ts +18 -0
  506. package/dist/lib/series-inspection-frame.js +70 -0
  507. package/dist/lib/series-inspection-frame.js.map +7 -0
  508. package/dist/lib/signals/edge.d.ts +7 -4
  509. package/dist/lib/signals/edge.js +25 -3
  510. package/dist/lib/signals/edge.js.map +2 -2
  511. package/dist/lib/signals/graph.d.ts +16 -2
  512. package/dist/lib/signals/graph.js +54 -12
  513. package/dist/lib/signals/graph.js.map +2 -2
  514. package/dist/lib/signals/input-provision.d.ts +15 -0
  515. package/dist/lib/signals/input-provision.js +53 -3
  516. package/dist/lib/signals/input-provision.js.map +2 -2
  517. package/dist/lib/signals/render-consumer.d.ts +3 -0
  518. package/dist/lib/signals/render-consumer.js +22 -14
  519. package/dist/lib/signals/render-consumer.js.map +2 -2
  520. package/dist/lib/style/positioning.d.ts +50 -2
  521. package/dist/lib/style/positioning.js +28 -4
  522. package/dist/lib/style/positioning.js.map +2 -2
  523. package/dist/lib/style/resolve-built-in.d.ts +4 -3
  524. package/dist/lib/style/resolve-built-in.js +17 -3
  525. package/dist/lib/style/resolve-built-in.js.map +2 -2
  526. package/dist/lib/style/resolve-dispatch.d.ts +3 -0
  527. package/dist/lib/style/resolve-dispatch.js +77 -4
  528. package/dist/lib/style/resolve-dispatch.js.map +2 -2
  529. package/dist/lib/style/resolve-length.d.ts +2 -0
  530. package/dist/lib/style/resolve-length.js +13 -9
  531. package/dist/lib/style/resolve-length.js.map +2 -2
  532. package/dist/lib/style/sizing-length.d.ts +51 -0
  533. package/dist/lib/style/sizing-length.js +77 -0
  534. package/dist/lib/style/sizing-length.js.map +7 -0
  535. package/dist/lib/style/types.d.ts +63 -25
  536. package/dist/lib/surface/root-surface.js +10 -6
  537. package/dist/lib/surface/root-surface.js.map +2 -2
  538. package/dist/lib/textures/texture.js +10 -8
  539. package/dist/lib/textures/texture.js.map +2 -2
  540. package/dist/lib/transitions/capture.js +4 -1
  541. package/dist/lib/transitions/capture.js.map +2 -2
  542. package/dist/lib/transitions/embers-physics.js +17 -10
  543. package/dist/lib/transitions/embers-physics.js.map +2 -2
  544. package/dist/lib/types.d.ts +110 -1
  545. package/dist/sync.d.ts +16 -0
  546. package/dist/sync.js +13 -0
  547. package/dist/sync.js.map +7 -0
  548. package/dist/sync.mjs +1 -0
  549. package/package.json +26 -3
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/features/viz/lib/graph/matrix.tsx"],
4
+ "sourcesContent": ["import { Group, Rectangle, resolveSignalValue } from \"@pibbl/core\";\nimport type { PibblNode } from \"@pibbl/core\";\nimport type {\n Accessor,\n AdjacencyMatrixProps,\n MatrixCellGeometry,\n MatrixCellProps,\n MatrixData,\n MatrixLayout,\n MatrixOptions,\n NodeStyle,\n VizKey,\n} from \"./types.js\";\nimport {\n defaultGraphLabelStyle,\n GraphLabel,\n resolveMarkStyle,\n useGraphFrame,\n} from \"./shared.js\";\n\nfunction value<D, V>(accessor: Accessor<D, V>, datum: D): V {\n return typeof accessor === \"function\"\n ? accessor(datum)\n : (datum as Record<PropertyKey, V>)[accessor];\n}\nfunction finite(input: number, name: string, nonnegative = false): number {\n if (!Number.isFinite(input) || (nonnegative && input < 0))\n throw new RangeError(\n `layoutMatrix: ${name} must be finite${nonnegative ? \" and nonnegative\" : \"\"}.`,\n );\n return input;\n}\nfunction bounds(\n input: MatrixOptions<unknown, unknown, unknown>[\"bounds\"],\n): void {\n finite(input.x, \"bounds.x\");\n finite(input.y, \"bounds.y\");\n finite(input.width, \"bounds.width\", true);\n finite(input.height, \"bounds.height\", true);\n}\nfunction label(\n text: string,\n x: number,\n y: number,\n width: number,\n height: number,\n rotationDegrees = 0,\n) {\n return Object.freeze({\n text,\n bounds: Object.freeze({ x, y, width, height }),\n rotationDegrees,\n });\n}\n\n/** Computes ordered cells for an explicit row/column relation matrix.\n * @param data - Explicit rows, columns, and ordered relations. See {@link MatrixData}.\n * @param options - Typed accessors, dimensions, labels, and unit. See {@link MatrixOptions}.\n * @returns Immutable cell and label geometry. See {@link MatrixLayout}.\n */\nexport function layoutMatrix<R, C, E>(\n data: MatrixData<R, C, E>,\n options: MatrixOptions<R, C, E>,\n): MatrixLayout<R, C, E> {\n bounds(options.bounds as MatrixOptions<unknown, unknown, unknown>[\"bounds\"]);\n const gap = finite(options.cellGap ?? 2, \"cellGap\", true);\n const rowLabelWidth = finite(\n options.rowLabelWidth ?? 96,\n \"rowLabelWidth\",\n true,\n );\n const columnLabelHeight = finite(\n options.columnLabelHeight ?? 54,\n \"columnLabelHeight\",\n true,\n );\n const rowKeys = new Map<VizKey, R>(),\n columnKeys = new Map<VizKey, C>();\n for (const row of data.rows) {\n const key = value(options.rowKey, row);\n if (rowKeys.has(key))\n throw new Error(`layoutMatrix: duplicate row key ${String(key)}.`);\n rowKeys.set(key, row);\n }\n for (const column of data.columns) {\n const key = value(options.columnKey, column);\n if (columnKeys.has(key))\n throw new Error(`layoutMatrix: duplicate column key ${String(key)}.`);\n columnKeys.set(key, column);\n }\n const width = Math.max(\n 0,\n (options.bounds.width -\n rowLabelWidth -\n Math.max(0, data.columns.length - 1) * gap) /\n Math.max(1, data.columns.length),\n );\n const height = Math.max(\n 0,\n (options.bounds.height -\n columnLabelHeight -\n Math.max(0, data.rows.length - 1) * gap) /\n Math.max(1, data.rows.length),\n );\n const grouped = new Map<string, E[]>();\n for (const relation of data.relations) {\n const source = value(options.source, relation),\n target = value(options.target, relation);\n if (!rowKeys.has(source))\n throw new RangeError(\n `layoutMatrix: source ${String(source)} is not a row key.`,\n );\n if (!columnKeys.has(target))\n throw new RangeError(\n `layoutMatrix: target ${String(target)} is not a column key.`,\n );\n const amount = value(options.value, relation);\n finite(amount, \"relation value\");\n const key = `${typeof source}:${String(source)}\\u0000${typeof target}:${String(target)}`;\n const records = grouped.get(key);\n if (records) records.push(relation);\n else grouped.set(key, [relation]);\n }\n const cells: MatrixCellGeometry<R, C, E>[] = [];\n const rowLabels = data.rows.map((row, index) =>\n label(\n options.rowLabel\n ? value(options.rowLabel, row)\n : String(value(options.rowKey, row)),\n options.bounds.x,\n options.bounds.y + columnLabelHeight + index * (height + gap),\n rowLabelWidth - gap,\n height,\n ),\n );\n const columnLabels = data.columns.map((column, index) =>\n label(\n options.columnLabel\n ? value(options.columnLabel, column)\n : String(value(options.columnKey, column)),\n options.bounds.x + rowLabelWidth + index * (width + gap),\n options.bounds.y,\n width,\n columnLabelHeight - gap,\n ),\n );\n for (let r = 0; r < data.rows.length; r++)\n for (let c = 0; c < data.columns.length; c++) {\n const row = data.rows[r],\n column = data.columns[c],\n rowKey = value(options.rowKey, row),\n columnKey = value(options.columnKey, column);\n const records =\n grouped.get(\n `${typeof rowKey}:${String(rowKey)}\\u0000${typeof columnKey}:${String(columnKey)}`,\n ) ?? [];\n const total = records.reduce(\n (sum, record) => sum + value(options.value, record),\n 0,\n );\n finite(total, \"cell aggregate\");\n const cellBounds = Object.freeze({\n x: options.bounds.x + rowLabelWidth + c * (width + gap),\n y: options.bounds.y + columnLabelHeight + r * (height + gap),\n width,\n height,\n });\n cells.push(\n Object.freeze({\n row,\n column,\n rowKey,\n columnKey,\n records: Object.freeze(records),\n value: records.length ? total : null,\n bounds: cellBounds,\n label: records.length\n ? label(\n options.formatValue\n ? options.formatValue(total)\n : `${total} ${options.unit}`,\n cellBounds.x,\n cellBounds.y,\n width,\n height,\n )\n : null,\n }),\n );\n }\n return Object.freeze({\n bounds: Object.freeze({ ...options.bounds }),\n unit: options.unit,\n cells: Object.freeze(cells),\n rowLabels: Object.freeze(rowLabels),\n columnLabels: Object.freeze(columnLabels),\n });\n}\n\n/** Default cell paint for custom matrix compositions.\n * @param cell - Cell geometry.\n * @param range - Observed numeric extent.\n * @returns Resolved cell paint.\n * @see {@link MatrixCell}\n */\nexport function defaultMatrixCellStyle<R, C, E>(\n cell: MatrixCellGeometry<R, C, E>,\n range: Readonly<{ minimum: number; maximum: number }>,\n): NodeStyle {\n const value = cell.value ?? 0,\n span = range.maximum - range.minimum;\n const alpha =\n cell.value === null\n ? 0.05\n : span <= 0\n ? 0.8\n : 0.16 +\n 0.74 * Math.max(0, Math.min(1, (value - range.minimum) / span));\n return { fill: `rgba(15, 118, 110, ${alpha})`, cornerRadius: 2 };\n}\n\n/** Draw one supplied matrix cell geometry.\n * @param argument - Cell props.\n * @returns Canvas node.\n * @see {@link MatrixCellProps}\n */\nexport function MatrixCell<R, C, E>({\n cell,\n style: input,\n children,\n ...events\n}: MatrixCellProps<R, C, E>): PibblNode {\n const style = resolveSignalValue(input) ?? {};\n return (\n <Group>\n <Rectangle\n {...events}\n style={{\n ...style,\n left: cell.bounds.x,\n top: cell.bounds.y,\n width: cell.bounds.width,\n height: cell.bounds.height,\n }}\n />\n {children}\n </Group>\n );\n}\n\n/** Render an ordered relation matrix with default marks and labels.\n * @param props - Matrix data and presentation.\n * @returns Canvas node.\n * @see {@link layoutMatrix}\n */\nexport function AdjacencyMatrix<R, C, E>(\n props: AdjacencyMatrixProps<R, C, E>,\n): PibblNode {\n const frame = useGraphFrame(props.style);\n if (!frame.bounds.width || !frame.bounds.height)\n return <Group style={frame.groupStyle}>{null}</Group>;\n const data = resolveSignalValue(props.data);\n const style = frame.style;\n const layout = layoutMatrix(data, {\n ...props,\n bounds: frame.bounds,\n cellGap: style.cellGap,\n rowLabelWidth: style.rowLabelWidth,\n columnLabelHeight: style.columnLabelHeight,\n });\n const values = layout.cells\n .map((cell) => cell.value)\n .filter((entry): entry is number => entry !== null);\n const minimum = Math.min(...values, 0),\n maximum = Math.max(...values, 1);\n return (\n <Group style={frame.groupStyle}>\n {layout.cells.map((cell) => (\n <Group\n key={JSON.stringify([cell.rowKey, cell.columnKey])}\n onClick={(event) => props.onCellClick?.(cell, event)}\n >\n {props.renderCell ? (\n props.renderCell(cell)\n ) : (\n <Group>\n <MatrixCell\n cell={cell}\n keyboardFocusable={Boolean(props.onCellClick)}\n style={{\n ...defaultMatrixCellStyle(cell, { minimum, maximum }),\n ...resolveMarkStyle(cell, props.cellStyle),\n }}\n />\n {cell.label && (\n <GraphLabel\n label={cell.label}\n style={{\n ...defaultGraphLabelStyle(cell.label),\n fill:\n cell.value !== null &&\n (cell.value - minimum) / (maximum - minimum || 1) >= 0.5\n ? \"#ffffff\"\n : \"#123c34\",\n textAlign: \"center\",\n ...resolveSignalValue(props.labelStyle),\n }}\n />\n )}\n </Group>\n )}\n </Group>\n ))}\n {layout.rowLabels.concat(layout.columnLabels).map((entry, index) => (\n <GraphLabel\n key={`axis-${index}`}\n label={entry}\n style={{\n ...defaultGraphLabelStyle(entry),\n ...resolveSignalValue(props.labelStyle),\n }}\n />\n ))}\n </Group>\n );\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["value"]
7
+ }
@@ -0,0 +1,11 @@
1
+ import { type PibblNode } from "@pibbl/core";
2
+ import type { GraphData, NeighborhoodLayout, NeighborhoodOptions, RadialNeighborhoodProps } from "./types.js";
3
+ /** Lay out the reachable neighborhood around one stable key in concentric rings.
4
+ * @param graph - Nodes and edges in source order.
5
+ * @param options - Accessors, center, hops, and finite bounds.
6
+ * @returns Immutable neighborhood geometry. @see {@link NeighborhoodLayout} */
7
+ export declare function layoutNeighborhood<N, E>(graph: GraphData<N, E>, options: NeighborhoodOptions<N, E>): NeighborhoodLayout<N, E>;
8
+ /** Render an interactive radial neighborhood from ordinary graph records.
9
+ * @param props - Reactive graph, center, presentation, and frame style.
10
+ * @returns Canvas composition. @see {@link layoutNeighborhood} */
11
+ export declare function RadialNeighborhood<N, E>(props: RadialNeighborhoodProps<N, E>): PibblNode;
@@ -0,0 +1,281 @@
1
+ import { jsx, jsxs } from "@pibbl/core/jsx-runtime";
2
+ import { Group, resolveSignalValue } from "@pibbl/core";
3
+ import {
4
+ defaultGraphEdgeStyle,
5
+ defaultGraphLabelStyle,
6
+ defaultGraphNodeStyle,
7
+ GraphEdge,
8
+ GraphLabel,
9
+ GraphNode,
10
+ resolveMarkStyle,
11
+ useGraphFrame
12
+ } from "./shared.js";
13
+ import {
14
+ checkedBounds,
15
+ finiteGap,
16
+ finiteSize,
17
+ hierarchyLabel
18
+ } from "./hierarchy.js";
19
+ import { readAccessor } from "./shared.js";
20
+ function key(value, name) {
21
+ if (typeof value === "string" || typeof value === "number" && Number.isFinite(value))
22
+ return value;
23
+ throw new TypeError(`${name}: key must be a string or finite number.`);
24
+ }
25
+ function layoutNeighborhood(graph, options) {
26
+ const bounds = checkedBounds(options.bounds, "layoutNeighborhood");
27
+ const hops = options.hops ?? 2;
28
+ if (!Number.isSafeInteger(hops) || hops < 0)
29
+ throw new RangeError(
30
+ "layoutNeighborhood: hops must be a nonnegative safe integer."
31
+ );
32
+ const ringGap = finiteGap(options.ringGap, 120, "layoutNeighborhood ringGap");
33
+ const nodeGap = finiteGap(options.nodeGap, 12, "layoutNeighborhood nodeGap");
34
+ const nodes = /* @__PURE__ */ new Map();
35
+ const order = /* @__PURE__ */ new Map();
36
+ graph.nodes.forEach((node, index) => {
37
+ const id = key(
38
+ readAccessor(node, options.nodeKey),
39
+ "layoutNeighborhood nodeKey"
40
+ );
41
+ if (nodes.has(id))
42
+ throw new Error(`layoutNeighborhood: duplicate node key ${String(id)}.`);
43
+ nodes.set(id, node);
44
+ order.set(id, index);
45
+ });
46
+ if (!nodes.has(options.centerKey))
47
+ throw new Error(
48
+ `layoutNeighborhood: unknown centerKey ${String(options.centerKey)}.`
49
+ );
50
+ const edges = graph.edges.map((edge) => {
51
+ const sourceKey = key(
52
+ readAccessor(edge, options.source),
53
+ "layoutNeighborhood source"
54
+ );
55
+ const targetKey = key(
56
+ readAccessor(edge, options.target),
57
+ "layoutNeighborhood target"
58
+ );
59
+ const edgeKey = key(
60
+ readAccessor(edge, options.edgeKey),
61
+ "layoutNeighborhood edgeKey"
62
+ );
63
+ if (!nodes.has(sourceKey) || !nodes.has(targetKey))
64
+ throw new Error(
65
+ `layoutNeighborhood: edge ${String(edgeKey)} references an unknown node.`
66
+ );
67
+ return { edge, edgeKey, sourceKey, targetKey };
68
+ });
69
+ const direction = options.direction ?? "outbound";
70
+ const adjacency = /* @__PURE__ */ new Map();
71
+ for (const { sourceKey, targetKey } of edges) {
72
+ const add = (a, b) => {
73
+ const list = adjacency.get(a) ?? [];
74
+ list.push(b);
75
+ adjacency.set(a, list);
76
+ };
77
+ if (direction !== "inbound") add(sourceKey, targetKey);
78
+ if (direction !== "outbound") add(targetKey, sourceKey);
79
+ }
80
+ const hop = /* @__PURE__ */ new Map([[options.centerKey, 0]]);
81
+ const queue = [options.centerKey];
82
+ for (let index = 0; index < queue.length; index++) {
83
+ const current = queue[index];
84
+ const depth = hop.get(current);
85
+ if (depth === hops) continue;
86
+ for (const next of adjacency.get(current) ?? [])
87
+ if (!hop.has(next)) {
88
+ hop.set(next, depth + 1);
89
+ queue.push(next);
90
+ }
91
+ }
92
+ const rings = Array.from({ length: hops + 1 }, () => []);
93
+ for (const [id, depth] of hop) rings[depth].push(id);
94
+ for (const ring of rings) ring.sort((a, b) => order.get(a) - order.get(b));
95
+ const sizes = /* @__PURE__ */ new Map();
96
+ let maxFootprint = 0;
97
+ for (const id of hop.keys()) {
98
+ const size = finiteSize(
99
+ nodes.get(id),
100
+ options.nodeSize ?? { width: 48, height: 48 },
101
+ "layoutNeighborhood"
102
+ );
103
+ sizes.set(id, size);
104
+ maxFootprint = Math.max(maxFootprint, Math.hypot(size.width, size.height));
105
+ }
106
+ const center = {
107
+ x: bounds.x + bounds.width / 2,
108
+ y: bounds.y + bounds.height / 2
109
+ };
110
+ const usedHops = Math.max(0, ...hop.values());
111
+ const outer = usedHops === 0 ? maxFootprint / 2 : maxFootprint + usedHops * ringGap;
112
+ if (outer * 2 > Math.min(bounds.width, bounds.height))
113
+ throw new RangeError(
114
+ "layoutNeighborhood: bounds are too small for the requested rings."
115
+ );
116
+ const geometry = [];
117
+ for (let depth = 0; depth < rings.length; depth++) {
118
+ const ring = rings[depth];
119
+ const radius = depth === 0 ? 0 : maxFootprint / 2 + depth * ringGap;
120
+ if (depth > 0 && ring.length > 1 && 2 * radius * Math.sin(Math.PI / ring.length) < maxFootprint + nodeGap)
121
+ throw new RangeError(
122
+ "layoutNeighborhood: ring is too crowded for nodeGap and nodeSize."
123
+ );
124
+ ring.forEach((id, index) => {
125
+ const angle = depth === 0 ? -Math.PI / 2 : -Math.PI / 2 + Math.PI * 2 * index / ring.length;
126
+ const size = sizes.get(id);
127
+ const x = center.x + Math.cos(angle) * radius - size.width / 2;
128
+ const y = center.y + Math.sin(angle) * radius - size.height / 2;
129
+ const datum = nodes.get(id);
130
+ const box = Object.freeze({
131
+ x,
132
+ y,
133
+ width: size.width,
134
+ height: size.height
135
+ });
136
+ geometry.push(
137
+ Object.freeze({
138
+ key: id,
139
+ datum,
140
+ bounds: box,
141
+ label: hierarchyLabel(
142
+ datum,
143
+ options.label,
144
+ {
145
+ x,
146
+ y: y + size.height + 4,
147
+ width: size.width,
148
+ height: 18
149
+ },
150
+ String(id)
151
+ ),
152
+ detail: options.detail === void 0 ? null : hierarchyLabel(datum, options.detail, {
153
+ x,
154
+ y: y + size.height + 22,
155
+ width: size.width,
156
+ height: 16
157
+ }),
158
+ hop: depth
159
+ })
160
+ );
161
+ });
162
+ }
163
+ const byKey = new Map(geometry.map((node) => [node.key, node]));
164
+ const resultEdges = [];
165
+ for (const entry of edges)
166
+ if (byKey.has(entry.sourceKey) && byKey.has(entry.targetKey)) {
167
+ const source = byKey.get(entry.sourceKey);
168
+ const target = byKey.get(entry.targetKey);
169
+ const sourceAnchor = {
170
+ x: source.bounds.x + source.bounds.width / 2,
171
+ y: source.bounds.y + source.bounds.height / 2
172
+ };
173
+ const targetAnchor = {
174
+ x: target.bounds.x + target.bounds.width / 2,
175
+ y: target.bounds.y + target.bounds.height / 2
176
+ };
177
+ const segments = Object.freeze([
178
+ { type: "move", ...sourceAnchor },
179
+ { type: "line", ...targetAnchor }
180
+ ]);
181
+ resultEdges.push(
182
+ Object.freeze({
183
+ key: entry.edgeKey,
184
+ datum: entry.edge,
185
+ sourceKey: entry.sourceKey,
186
+ targetKey: entry.targetKey,
187
+ route: Object.freeze({
188
+ sourceAnchor: Object.freeze(sourceAnchor),
189
+ targetAnchor: Object.freeze(targetAnchor),
190
+ segments,
191
+ arrowSegments: null
192
+ }),
193
+ path: `M ${sourceAnchor.x} ${sourceAnchor.y} L ${targetAnchor.x} ${targetAnchor.y}`,
194
+ arrowPath: null
195
+ })
196
+ );
197
+ }
198
+ return Object.freeze({
199
+ bounds,
200
+ centerKey: options.centerKey,
201
+ nodes: Object.freeze(geometry),
202
+ edges: Object.freeze(resultEdges),
203
+ omittedKeys: Object.freeze([...nodes.keys()].filter((id) => !hop.has(id)))
204
+ });
205
+ }
206
+ function RadialNeighborhood(props) {
207
+ const frame = useGraphFrame(props.style);
208
+ const graph = resolveSignalValue(props.graph);
209
+ const centerKey = resolveSignalValue(props.centerKey);
210
+ const hops = props.hops === void 0 ? void 0 : resolveSignalValue(props.hops);
211
+ if (frame.bounds.width === 0 || frame.bounds.height === 0)
212
+ return /* @__PURE__ */ jsx(Group, { style: frame.groupStyle, children: null });
213
+ const layout = layoutNeighborhood(graph, {
214
+ ...props,
215
+ bounds: frame.bounds,
216
+ centerKey,
217
+ hops,
218
+ ringGap: frame.style.ringGap,
219
+ nodeGap: frame.style.nodeGap
220
+ });
221
+ return /* @__PURE__ */ jsxs(Group, { style: frame.groupStyle, children: [
222
+ layout.edges.map(
223
+ (edge) => props.renderEdge ? /* @__PURE__ */ jsx(
224
+ Group,
225
+ {
226
+ onClick: (event) => props.onEdgeClick?.(edge, event),
227
+ children: props.renderEdge(edge)
228
+ },
229
+ edge.key
230
+ ) : /* @__PURE__ */ jsx(
231
+ GraphEdge,
232
+ {
233
+ edge,
234
+ style: {
235
+ ...defaultGraphEdgeStyle(edge),
236
+ ...resolveMarkStyle(edge, props.edgeStyle)
237
+ },
238
+ onClick: (event) => props.onEdgeClick?.(edge, event)
239
+ },
240
+ edge.key
241
+ )
242
+ ),
243
+ layout.nodes.map(
244
+ (node) => props.renderNode ? /* @__PURE__ */ jsx(
245
+ Group,
246
+ {
247
+ onClick: (event) => props.onNodeClick?.(node, event),
248
+ children: props.renderNode(node)
249
+ },
250
+ node.key
251
+ ) : /* @__PURE__ */ jsxs(Group, { children: [
252
+ /* @__PURE__ */ jsx(
253
+ GraphNode,
254
+ {
255
+ node,
256
+ style: {
257
+ ...defaultGraphNodeStyle(node),
258
+ ...resolveMarkStyle(node, props.nodeStyle)
259
+ },
260
+ onClick: (event) => props.onNodeClick?.(node, event)
261
+ }
262
+ ),
263
+ /* @__PURE__ */ jsx(
264
+ GraphLabel,
265
+ {
266
+ label: node.label,
267
+ style: {
268
+ ...defaultGraphLabelStyle(node.label),
269
+ ...resolveMarkStyle(node, props.labelStyle)
270
+ }
271
+ }
272
+ )
273
+ ] }, node.key)
274
+ )
275
+ ] });
276
+ }
277
+ export {
278
+ RadialNeighborhood,
279
+ layoutNeighborhood
280
+ };
281
+ //# sourceMappingURL=neighborhood.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/features/viz/lib/graph/neighborhood.tsx"],
4
+ "sourcesContent": ["import { Group, resolveSignalValue, type PibblNode } from \"@pibbl/core\";\nimport {\n defaultGraphEdgeStyle,\n defaultGraphLabelStyle,\n defaultGraphNodeStyle,\n GraphEdge,\n GraphLabel,\n GraphNode,\n resolveMarkStyle,\n useGraphFrame,\n} from \"./shared.js\";\nimport type {\n GraphData,\n GraphEdgeGeometry,\n NeighborhoodLayout,\n NeighborhoodNodeGeometry,\n NeighborhoodOptions,\n NeighborhoodStyle,\n RadialNeighborhoodProps,\n VizKey,\n} from \"./types.js\";\nimport {\n checkedBounds,\n finiteGap,\n finiteSize,\n hierarchyLabel,\n} from \"./hierarchy.js\";\nimport { readAccessor } from \"./shared.js\";\n\nfunction key(value: unknown, name: string): VizKey {\n if (\n typeof value === \"string\" ||\n (typeof value === \"number\" && Number.isFinite(value))\n )\n return value;\n throw new TypeError(`${name}: key must be a string or finite number.`);\n}\n\n/** Lay out the reachable neighborhood around one stable key in concentric rings.\n * @param graph - Nodes and edges in source order.\n * @param options - Accessors, center, hops, and finite bounds.\n * @returns Immutable neighborhood geometry. @see {@link NeighborhoodLayout} */\nexport function layoutNeighborhood<N, E>(\n graph: GraphData<N, E>,\n options: NeighborhoodOptions<N, E>,\n): NeighborhoodLayout<N, E> {\n const bounds = checkedBounds(options.bounds, \"layoutNeighborhood\");\n const hops = options.hops ?? 2;\n if (!Number.isSafeInteger(hops) || hops < 0)\n throw new RangeError(\n \"layoutNeighborhood: hops must be a nonnegative safe integer.\",\n );\n const ringGap = finiteGap(options.ringGap, 120, \"layoutNeighborhood ringGap\");\n const nodeGap = finiteGap(options.nodeGap, 12, \"layoutNeighborhood nodeGap\");\n const nodes = new Map<VizKey, N>();\n const order = new Map<VizKey, number>();\n graph.nodes.forEach((node, index) => {\n const id = key(\n readAccessor(node, options.nodeKey),\n \"layoutNeighborhood nodeKey\",\n );\n if (nodes.has(id))\n throw new Error(`layoutNeighborhood: duplicate node key ${String(id)}.`);\n nodes.set(id, node);\n order.set(id, index);\n });\n if (!nodes.has(options.centerKey))\n throw new Error(\n `layoutNeighborhood: unknown centerKey ${String(options.centerKey)}.`,\n );\n const edges = graph.edges.map((edge) => {\n const sourceKey = key(\n readAccessor(edge, options.source),\n \"layoutNeighborhood source\",\n );\n const targetKey = key(\n readAccessor(edge, options.target),\n \"layoutNeighborhood target\",\n );\n const edgeKey = key(\n readAccessor(edge, options.edgeKey),\n \"layoutNeighborhood edgeKey\",\n );\n if (!nodes.has(sourceKey) || !nodes.has(targetKey))\n throw new Error(\n `layoutNeighborhood: edge ${String(edgeKey)} references an unknown node.`,\n );\n return { edge, edgeKey, sourceKey, targetKey };\n });\n const direction = options.direction ?? \"outbound\";\n const adjacency = new Map<VizKey, VizKey[]>();\n for (const { sourceKey, targetKey } of edges) {\n const add = (a: VizKey, b: VizKey) => {\n const list = adjacency.get(a) ?? [];\n list.push(b);\n adjacency.set(a, list);\n };\n if (direction !== \"inbound\") add(sourceKey, targetKey);\n if (direction !== \"outbound\") add(targetKey, sourceKey);\n }\n const hop = new Map<VizKey, number>([[options.centerKey, 0]]);\n const queue = [options.centerKey];\n for (let index = 0; index < queue.length; index++) {\n const current = queue[index];\n const depth = hop.get(current)!;\n if (depth === hops) continue;\n for (const next of adjacency.get(current) ?? [])\n if (!hop.has(next)) {\n hop.set(next, depth + 1);\n queue.push(next);\n }\n }\n const rings = Array.from({ length: hops + 1 }, () => [] as VizKey[]);\n for (const [id, depth] of hop) rings[depth].push(id);\n for (const ring of rings) ring.sort((a, b) => order.get(a)! - order.get(b)!);\n const sizes = new Map<VizKey, ReturnType<typeof finiteSize>>();\n let maxFootprint = 0;\n for (const id of hop.keys()) {\n const size = finiteSize(\n nodes.get(id)!,\n options.nodeSize ?? { width: 48, height: 48 },\n \"layoutNeighborhood\",\n );\n sizes.set(id, size);\n maxFootprint = Math.max(maxFootprint, Math.hypot(size.width, size.height));\n }\n const center = {\n x: bounds.x + bounds.width / 2,\n y: bounds.y + bounds.height / 2,\n };\n const usedHops = Math.max(0, ...hop.values());\n const outer =\n usedHops === 0 ? maxFootprint / 2 : maxFootprint + usedHops * ringGap;\n if (outer * 2 > Math.min(bounds.width, bounds.height))\n throw new RangeError(\n \"layoutNeighborhood: bounds are too small for the requested rings.\",\n );\n const geometry: NeighborhoodNodeGeometry<N>[] = [];\n for (let depth = 0; depth < rings.length; depth++) {\n const ring = rings[depth];\n const radius = depth === 0 ? 0 : maxFootprint / 2 + depth * ringGap;\n if (\n depth > 0 &&\n ring.length > 1 &&\n 2 * radius * Math.sin(Math.PI / ring.length) < maxFootprint + nodeGap\n )\n throw new RangeError(\n \"layoutNeighborhood: ring is too crowded for nodeGap and nodeSize.\",\n );\n ring.forEach((id, index) => {\n const angle =\n depth === 0\n ? -Math.PI / 2\n : -Math.PI / 2 + (Math.PI * 2 * index) / ring.length;\n const size = sizes.get(id)!;\n const x = center.x + Math.cos(angle) * radius - size.width / 2;\n const y = center.y + Math.sin(angle) * radius - size.height / 2;\n const datum = nodes.get(id)!;\n const box = Object.freeze({\n x,\n y,\n width: size.width,\n height: size.height,\n });\n geometry.push(\n Object.freeze({\n key: id,\n datum,\n bounds: box,\n label: hierarchyLabel(\n datum,\n options.label,\n {\n x,\n y: y + size.height + 4,\n width: size.width,\n height: 18,\n },\n String(id),\n ),\n detail:\n options.detail === undefined\n ? null\n : hierarchyLabel(datum, options.detail, {\n x,\n y: y + size.height + 22,\n width: size.width,\n height: 16,\n }),\n hop: depth,\n }),\n );\n });\n }\n const byKey = new Map(geometry.map((node) => [node.key, node]));\n const resultEdges: GraphEdgeGeometry<E>[] = [];\n for (const entry of edges)\n if (byKey.has(entry.sourceKey) && byKey.has(entry.targetKey)) {\n const source = byKey.get(entry.sourceKey)!;\n const target = byKey.get(entry.targetKey)!;\n const sourceAnchor = {\n x: source.bounds.x + source.bounds.width / 2,\n y: source.bounds.y + source.bounds.height / 2,\n };\n const targetAnchor = {\n x: target.bounds.x + target.bounds.width / 2,\n y: target.bounds.y + target.bounds.height / 2,\n };\n const segments = Object.freeze([\n { type: \"move\" as const, ...sourceAnchor },\n { type: \"line\" as const, ...targetAnchor },\n ]);\n resultEdges.push(\n Object.freeze({\n key: entry.edgeKey,\n datum: entry.edge,\n sourceKey: entry.sourceKey,\n targetKey: entry.targetKey,\n route: Object.freeze({\n sourceAnchor: Object.freeze(sourceAnchor),\n targetAnchor: Object.freeze(targetAnchor),\n segments,\n arrowSegments: null,\n }),\n path: `M ${sourceAnchor.x} ${sourceAnchor.y} L ${targetAnchor.x} ${targetAnchor.y}`,\n arrowPath: null,\n }),\n );\n }\n return Object.freeze({\n bounds,\n centerKey: options.centerKey,\n nodes: Object.freeze(geometry),\n edges: Object.freeze(resultEdges),\n omittedKeys: Object.freeze([...nodes.keys()].filter((id) => !hop.has(id))),\n });\n}\n\n/** Render an interactive radial neighborhood from ordinary graph records.\n * @param props - Reactive graph, center, presentation, and frame style.\n * @returns Canvas composition. @see {@link layoutNeighborhood} */\nexport function RadialNeighborhood<N, E>(\n props: RadialNeighborhoodProps<N, E>,\n): PibblNode {\n const frame = useGraphFrame<NeighborhoodStyle>(props.style);\n const graph = resolveSignalValue(props.graph);\n const centerKey = resolveSignalValue(props.centerKey);\n const hops =\n props.hops === undefined ? undefined : resolveSignalValue(props.hops);\n if (frame.bounds.width === 0 || frame.bounds.height === 0)\n return <Group style={frame.groupStyle}>{null}</Group>;\n const layout = layoutNeighborhood(graph, {\n ...props,\n bounds: frame.bounds,\n centerKey,\n hops,\n ringGap: frame.style.ringGap,\n nodeGap: frame.style.nodeGap,\n });\n return (\n <Group style={frame.groupStyle}>\n {layout.edges.map((edge) =>\n props.renderEdge ? (\n <Group\n key={edge.key}\n onClick={(event) => props.onEdgeClick?.(edge, event)}\n >\n {props.renderEdge(edge)}\n </Group>\n ) : (\n <GraphEdge\n key={edge.key}\n edge={edge}\n style={{\n ...defaultGraphEdgeStyle(edge),\n ...resolveMarkStyle(edge, props.edgeStyle),\n }}\n onClick={(event) => props.onEdgeClick?.(edge, event)}\n />\n ),\n )}\n {layout.nodes.map((node) =>\n props.renderNode ? (\n <Group\n key={node.key}\n onClick={(event) => props.onNodeClick?.(node, event)}\n >\n {props.renderNode(node)}\n </Group>\n ) : (\n <Group key={node.key}>\n <GraphNode\n node={node}\n style={{\n ...defaultGraphNodeStyle(node),\n ...resolveMarkStyle(node, props.nodeStyle),\n }}\n onClick={(event) => props.onNodeClick?.(node, event)}\n />\n <GraphLabel\n label={node.label}\n style={{\n ...defaultGraphLabelStyle(node.label),\n ...resolveMarkStyle(node, props.labelStyle),\n }}\n />\n </Group>\n ),\n )}\n </Group>\n );\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,35 @@
1
+ import type { GraphRoute, Point } from "./types.js";
2
+ type Endpoints = Readonly<{
3
+ sourceAnchor: Point;
4
+ targetAnchor: Point;
5
+ }>;
6
+ /**
7
+ * Build an independent straight graph route in local logical units.
8
+ * @param endpoints - Finite named source and target anchor points. See {@link GraphRoute}.
9
+ * @param options - Optional nonnegative arrowLength (default zero).
10
+ * @returns Named anchors and independently editable core path segments. See {@link GraphRoute}.
11
+ */
12
+ export declare function straightGraphRoute(endpoints: Endpoints, options?: Readonly<{
13
+ arrowLength?: number;
14
+ }>): GraphRoute;
15
+ /**
16
+ * Build an independent horizontal orthogonal graph route in local logical units.
17
+ * @param endpoints - Finite named source and target anchor points. See {@link GraphRoute}.
18
+ * @param options - Optional nonnegative arrowLength (default zero).
19
+ * @returns Named anchors and independently editable core path segments. See {@link GraphRoute}.
20
+ */
21
+ export declare function orthogonalGraphRoute(endpoints: Endpoints, options?: Readonly<{
22
+ arrowLength?: number;
23
+ }>): GraphRoute;
24
+ /**
25
+ * Build an independent horizontal cubic graph route in local logical units.
26
+ * @param endpoints - Finite named source and target anchor points. See {@link GraphRoute}.
27
+ * @param options - Optional nonnegative arrowLength (default zero); curvature defaults to 0.5 and must be in [0, 1].
28
+ * @returns Named anchors and independently editable core path segments. See {@link GraphRoute}.
29
+ */
30
+ export declare function curvedGraphRoute(endpoints: Endpoints, options?: Readonly<{
31
+ curvature?: number;
32
+ arrowLength?: number;
33
+ }>): GraphRoute;
34
+ export declare function routePath(segments: GraphRoute["segments"]): string;
35
+ export {};
@@ -0,0 +1,101 @@
1
+ import { PathGeometry, toSvgPathData } from "@pibbl/core";
2
+ function route(endpoints, segments, arrowLength = 0) {
3
+ const { sourceAnchor: a, targetAnchor: b } = endpoints;
4
+ if (!Number.isFinite(a.x) || !Number.isFinite(a.y) || (!Number.isFinite(b.x) || !Number.isFinite(b.y)))
5
+ throw new RangeError("Route anchors must be finite.");
6
+ if (!Number.isFinite(arrowLength) || arrowLength < 0)
7
+ throw new RangeError("arrowLength must be finite and nonnegative.");
8
+ const angle = Math.atan2(b.y - a.y, b.x - a.x), c = Math.cos(angle), s = Math.sin(angle);
9
+ return {
10
+ ...endpoints,
11
+ segments,
12
+ arrowSegments: arrowLength === 0 ? null : [
13
+ { type: "move", x: b.x, y: b.y },
14
+ {
15
+ type: "line",
16
+ x: b.x - arrowLength * c - arrowLength * s / 2,
17
+ y: b.y - arrowLength * s + arrowLength * c / 2
18
+ },
19
+ {
20
+ type: "line",
21
+ x: b.x - arrowLength * c + arrowLength * s / 2,
22
+ y: b.y - arrowLength * s - arrowLength * c / 2
23
+ },
24
+ { type: "close" }
25
+ ]
26
+ };
27
+ }
28
+ function straightGraphRoute(endpoints, options = {}) {
29
+ const { sourceAnchor: a, targetAnchor: b } = endpoints;
30
+ return route(
31
+ endpoints,
32
+ [
33
+ { type: "move", x: a.x, y: a.y },
34
+ { type: "line", x: b.x, y: b.y }
35
+ ],
36
+ options.arrowLength
37
+ );
38
+ }
39
+ function orthogonalGraphRoute(endpoints, options = {}) {
40
+ const { sourceAnchor: a, targetAnchor: b } = endpoints, middle = (a.x + b.x) / 2;
41
+ const result = route(
42
+ endpoints,
43
+ [
44
+ { type: "move", x: a.x, y: a.y },
45
+ { type: "line", x: middle, y: a.y },
46
+ { type: "line", x: middle, y: b.y },
47
+ { type: "line", x: b.x, y: b.y }
48
+ ],
49
+ options.arrowLength
50
+ );
51
+ if (options.arrowLength)
52
+ return {
53
+ ...result,
54
+ arrowSegments: straightGraphRoute(
55
+ { sourceAnchor: { x: middle, y: b.y }, targetAnchor: b },
56
+ options
57
+ ).arrowSegments
58
+ };
59
+ return result;
60
+ }
61
+ function curvedGraphRoute(endpoints, options = {}) {
62
+ const { sourceAnchor: a, targetAnchor: b } = endpoints, curvature = options.curvature ?? 0.5;
63
+ if (!Number.isFinite(curvature) || curvature < 0 || curvature > 1)
64
+ throw new RangeError("curvature must be between 0 and 1.");
65
+ const dx = (b.x - a.x) * curvature;
66
+ const result = route(
67
+ endpoints,
68
+ [
69
+ { type: "move", x: a.x, y: a.y },
70
+ {
71
+ type: "cubic",
72
+ cp1x: a.x + dx,
73
+ cp1y: a.y,
74
+ cp2x: b.x - dx,
75
+ cp2y: b.y,
76
+ x: b.x,
77
+ y: b.y
78
+ }
79
+ ],
80
+ options.arrowLength
81
+ );
82
+ return options.arrowLength && dx !== 0 ? {
83
+ ...result,
84
+ arrowSegments: straightGraphRoute(
85
+ { sourceAnchor: { x: b.x - dx, y: b.y }, targetAnchor: b },
86
+ options
87
+ ).arrowSegments
88
+ } : result;
89
+ }
90
+ function routePath(segments) {
91
+ const path = new PathGeometry();
92
+ path.spliceSegments(0, 0, segments);
93
+ return toSvgPathData(path);
94
+ }
95
+ export {
96
+ curvedGraphRoute,
97
+ orthogonalGraphRoute,
98
+ routePath,
99
+ straightGraphRoute
100
+ };
101
+ //# sourceMappingURL=routes.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/features/viz/lib/graph/routes.ts"],
4
+ "sourcesContent": ["import { PathGeometry, toSvgPathData } from \"@pibbl/core\";\nimport type { GraphRoute, Point } from \"./types.js\";\ntype Endpoints = Readonly<{ sourceAnchor: Point; targetAnchor: Point }>;\nfunction route(\n endpoints: Endpoints,\n segments: GraphRoute[\"segments\"],\n arrowLength = 0,\n): GraphRoute {\n const { sourceAnchor: a, targetAnchor: b } = endpoints;\n if ((!Number.isFinite(a.x) || !Number.isFinite(a.y)) || (!Number.isFinite(b.x) || !Number.isFinite(b.y)))\n throw new RangeError(\"Route anchors must be finite.\");\n if (!Number.isFinite(arrowLength) || arrowLength < 0)\n throw new RangeError(\"arrowLength must be finite and nonnegative.\");\n const angle = Math.atan2(b.y - a.y, b.x - a.x),\n c = Math.cos(angle),\n s = Math.sin(angle);\n return {\n ...endpoints,\n segments,\n arrowSegments:\n arrowLength === 0\n ? null\n : [\n { type: \"move\", x: b.x, y: b.y },\n {\n type: \"line\",\n x: b.x - arrowLength * c - (arrowLength * s) / 2,\n y: b.y - arrowLength * s + (arrowLength * c) / 2,\n },\n {\n type: \"line\",\n x: b.x - arrowLength * c + (arrowLength * s) / 2,\n y: b.y - arrowLength * s - (arrowLength * c) / 2,\n },\n { type: \"close\" },\n ],\n };\n}\n/**\n * Build an independent straight graph route in local logical units.\n * @param endpoints - Finite named source and target anchor points. See {@link GraphRoute}.\n * @param options - Optional nonnegative arrowLength (default zero).\n * @returns Named anchors and independently editable core path segments. See {@link GraphRoute}.\n */\nexport function straightGraphRoute(\n endpoints: Endpoints,\n options: Readonly<{ arrowLength?: number }> = {},\n): GraphRoute {\n const { sourceAnchor: a, targetAnchor: b } = endpoints;\n return route(\n endpoints,\n [\n { type: \"move\", x: a.x, y: a.y },\n { type: \"line\", x: b.x, y: b.y },\n ],\n options.arrowLength,\n );\n}\n/**\n * Build an independent horizontal orthogonal graph route in local logical units.\n * @param endpoints - Finite named source and target anchor points. See {@link GraphRoute}.\n * @param options - Optional nonnegative arrowLength (default zero).\n * @returns Named anchors and independently editable core path segments. See {@link GraphRoute}.\n */\nexport function orthogonalGraphRoute(\n endpoints: Endpoints,\n options: Readonly<{ arrowLength?: number }> = {},\n): GraphRoute {\n const { sourceAnchor: a, targetAnchor: b } = endpoints,\n middle = (a.x + b.x) / 2;\n const result = route(\n endpoints,\n [\n { type: \"move\", x: a.x, y: a.y },\n { type: \"line\", x: middle, y: a.y },\n { type: \"line\", x: middle, y: b.y },\n { type: \"line\", x: b.x, y: b.y },\n ],\n options.arrowLength,\n );\n if (options.arrowLength)\n return {\n ...result,\n arrowSegments: straightGraphRoute(\n { sourceAnchor: { x: middle, y: b.y }, targetAnchor: b },\n options,\n ).arrowSegments,\n };\n return result;\n}\n/**\n * Build an independent horizontal cubic graph route in local logical units.\n * @param endpoints - Finite named source and target anchor points. See {@link GraphRoute}.\n * @param options - Optional nonnegative arrowLength (default zero); curvature defaults to 0.5 and must be in [0, 1].\n * @returns Named anchors and independently editable core path segments. See {@link GraphRoute}.\n */\nexport function curvedGraphRoute(\n endpoints: Endpoints,\n options: Readonly<{ curvature?: number; arrowLength?: number }> = {},\n): GraphRoute {\n const { sourceAnchor: a, targetAnchor: b } = endpoints,\n curvature = options.curvature ?? 0.5;\n if (!Number.isFinite(curvature) || curvature < 0 || curvature > 1)\n throw new RangeError(\"curvature must be between 0 and 1.\");\n const dx = (b.x - a.x) * curvature;\n const result = route(\n endpoints,\n [\n { type: \"move\", x: a.x, y: a.y },\n {\n type: \"cubic\",\n cp1x: a.x + dx,\n cp1y: a.y,\n cp2x: b.x - dx,\n cp2y: b.y,\n x: b.x,\n y: b.y,\n },\n ],\n options.arrowLength,\n );\n return options.arrowLength && dx !== 0\n ? {\n ...result,\n arrowSegments: straightGraphRoute(\n { sourceAnchor: { x: b.x - dx, y: b.y }, targetAnchor: b },\n options,\n ).arrowSegments,\n }\n : result;\n}\nexport function routePath(segments: GraphRoute[\"segments\"]): string {\n const path = new PathGeometry();\n path.spliceSegments(0, 0, segments);\n return toSvgPathData(path);\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,44 @@
1
+ import type { NodeStyle } from "./types.js";
2
+ import type { PibblNode } from "@pibbl/core";
3
+ import type { GraphData, GraphNodeProps, MarkInteraction, SankeyFlowGeometry, SankeyLayout, SankeyNodeGeometry, SankeyOptions, SankeyProps, Style, EdgeStyle } from "./types.js";
4
+ /** Places an acyclic weighted flow graph in deterministic left-to-right ranks.
5
+ * @param graph - Nodes and acyclic weighted edges. See {@link GraphData}.
6
+ * @param options - Accessors, bounds, and display unit. See {@link SankeyOptions}.
7
+ * @returns Immutable nodes and proportional flow geometry. See {@link SankeyLayout}.
8
+ */
9
+ export declare function layoutSankey<N, E>(graph: GraphData<N, E>, options: SankeyOptions<N, E>): SankeyLayout<N, E>;
10
+ /** Default node paint for custom Sankey compositions.
11
+ * @param _node - Node geometry.
12
+ * @returns Resolved node paint.
13
+ * @see {@link SankeyNode}
14
+ */
15
+ export declare function defaultSankeyNodeStyle<N>(_node: SankeyNodeGeometry<N>): NodeStyle;
16
+ /** Default flow paint for custom Sankey compositions.
17
+ * @param _flow - Flow geometry.
18
+ * @returns Resolved flow paint.
19
+ * @see {@link SankeyFlow}
20
+ */
21
+ export declare function defaultSankeyFlowStyle<E>(_flow: SankeyFlowGeometry<E>): EdgeStyle;
22
+ /** Draw one supplied Sankey node.
23
+ * @param argument - Node props.
24
+ * @returns Canvas node.
25
+ * @see {@link SankeyNodeGeometry}
26
+ */
27
+ export declare function SankeyNode<N>({ node, style: input, children, ...events }: GraphNodeProps<N> & {
28
+ readonly node: SankeyNodeGeometry<N>;
29
+ }): PibblNode;
30
+ /** Draw one supplied Sankey flow.
31
+ * @param argument - Flow props.
32
+ * @returns Canvas node.
33
+ * @see {@link SankeyFlowGeometry}
34
+ */
35
+ export declare function SankeyFlow<E>({ flow, style: input, ...events }: MarkInteraction & {
36
+ readonly flow: SankeyFlowGeometry<E>;
37
+ readonly style?: Style<EdgeStyle>;
38
+ }): PibblNode;
39
+ /** Render a weighted acyclic flow graph.
40
+ * @param props - Graph data and presentation.
41
+ * @returns Canvas node.
42
+ * @see {@link layoutSankey}
43
+ */
44
+ export declare function Sankey<N, E>(props: SankeyProps<N, E>): PibblNode;