@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,250 @@
1
+ import { jsx, jsxs } from "@pibbl/core/jsx-runtime";
2
+ import { Group, SvgPath, resolveSignalValue } from "@pibbl/core";
3
+ import {
4
+ defaultGraphEdgeStyle,
5
+ defaultGraphLabelStyle,
6
+ defaultGraphNodeStyle,
7
+ GraphLabel,
8
+ GraphNode,
9
+ resolveMarkStyle,
10
+ useGraphFrame
11
+ } from "./shared.js";
12
+ function access(input, datum) {
13
+ return typeof input === "function" ? input(datum) : datum[input];
14
+ }
15
+ function finite(value, name, zero = false) {
16
+ if (!Number.isFinite(value) || zero && value < 0)
17
+ throw new RangeError(
18
+ `layoutBipartite: ${name} must be finite${zero ? " and nonnegative" : ""}.`
19
+ );
20
+ return value;
21
+ }
22
+ function label(text, bounds) {
23
+ return Object.freeze({
24
+ text,
25
+ bounds: Object.freeze(bounds),
26
+ rotationDegrees: 0
27
+ });
28
+ }
29
+ function route(a, b) {
30
+ const middle = (a.x + b.x) / 2;
31
+ const segments = Object.freeze([
32
+ { type: "move", x: a.x, y: a.y },
33
+ {
34
+ type: "cubic",
35
+ cp1x: middle,
36
+ cp1y: a.y,
37
+ cp2x: middle,
38
+ cp2y: b.y,
39
+ x: b.x,
40
+ y: b.y
41
+ }
42
+ ]);
43
+ return Object.freeze({
44
+ sourceAnchor: Object.freeze(a),
45
+ targetAnchor: Object.freeze(b),
46
+ segments,
47
+ arrowSegments: null
48
+ });
49
+ }
50
+ function path(route2) {
51
+ return route2.segments.map(
52
+ (segment) => segment.type === "move" ? `M ${segment.x} ${segment.y}` : segment.type === "cubic" ? `C ${segment.cp1x} ${segment.cp1y} ${segment.cp2x} ${segment.cp2y} ${segment.x} ${segment.y}` : ""
53
+ ).join(" ");
54
+ }
55
+ function placed(data, keyBy, labelBy, atX, bounds, size, gap) {
56
+ const total = data.reduce((sum, datum) => sum + (size?.(datum).height ?? 34), 0) + Math.max(0, data.length - 1) * gap;
57
+ let y = bounds.y + Math.max(0, (bounds.height - total) / 2);
58
+ const seen = /* @__PURE__ */ new Set();
59
+ return Object.freeze(
60
+ data.map((datum) => {
61
+ const key = access(keyBy, datum);
62
+ if (seen.has(key))
63
+ throw new Error(
64
+ `layoutBipartite: duplicate node key ${String(key)} on one side.`
65
+ );
66
+ seen.add(key);
67
+ const dimensions = size?.(datum) ?? { width: 150, height: 34 };
68
+ const box = {
69
+ x: atX,
70
+ y,
71
+ width: dimensions.width,
72
+ height: dimensions.height
73
+ };
74
+ y += dimensions.height + gap;
75
+ return Object.freeze({
76
+ key,
77
+ datum,
78
+ bounds: Object.freeze(box),
79
+ label: label(labelBy ? access(labelBy, datum) : String(key), box),
80
+ detail: null
81
+ });
82
+ })
83
+ );
84
+ }
85
+ function layoutBipartite(graph, options) {
86
+ const b = options.bounds;
87
+ finite(b.x, "bounds.x");
88
+ finite(b.y, "bounds.y");
89
+ finite(b.width, "bounds.width", true);
90
+ finite(b.height, "bounds.height", true);
91
+ const gap = finite(options.nodeGap ?? 12, "nodeGap", true), columnGap = finite(options.columnGap ?? 120, "columnGap", true);
92
+ const leftSize = options.leftSize, leftResolver = typeof leftSize === "function" ? leftSize : leftSize === void 0 ? void 0 : () => leftSize;
93
+ const rightSize = options.rightSize, rightResolver = typeof rightSize === "function" ? rightSize : rightSize === void 0 ? void 0 : () => rightSize;
94
+ const left = placed(
95
+ graph.left,
96
+ options.leftKey,
97
+ options.leftLabel,
98
+ b.x,
99
+ b,
100
+ leftResolver,
101
+ gap
102
+ );
103
+ const rightWidth = typeof rightSize === "function" ? 150 : rightSize?.width ?? 150;
104
+ const right = placed(
105
+ graph.right,
106
+ options.rightKey,
107
+ options.rightLabel,
108
+ Math.max(b.x, b.x + b.width - rightWidth),
109
+ b,
110
+ rightResolver,
111
+ gap
112
+ );
113
+ const leftByKey = new Map(left.map((node) => [node.key, node])), rightByKey = new Map(right.map((node) => [node.key, node]));
114
+ const edgeKeys = /* @__PURE__ */ new Set();
115
+ const edges = graph.edges.map((edge) => {
116
+ const key = access(options.edgeKey, edge);
117
+ if (edgeKeys.has(key))
118
+ throw new Error(`layoutBipartite: duplicate edge key ${String(key)}.`);
119
+ edgeKeys.add(key);
120
+ const source = access(options.source, edge), target = access(options.target, edge), leftNode = leftByKey.get(source), rightNode = rightByKey.get(target);
121
+ if (!leftNode || !rightNode)
122
+ throw new RangeError(
123
+ "layoutBipartite: every edge must point from a known left key to a known right key."
124
+ );
125
+ const r = route(
126
+ {
127
+ x: leftNode.bounds.x + leftNode.bounds.width,
128
+ y: leftNode.bounds.y + leftNode.bounds.height / 2
129
+ },
130
+ {
131
+ x: rightNode.bounds.x,
132
+ y: rightNode.bounds.y + rightNode.bounds.height / 2
133
+ }
134
+ );
135
+ return Object.freeze({
136
+ key,
137
+ datum: edge,
138
+ sourceKey: source,
139
+ targetKey: target,
140
+ left: leftNode,
141
+ right: rightNode,
142
+ route: r,
143
+ path: path(r),
144
+ arrowPath: null
145
+ });
146
+ });
147
+ if (left.length && right.length && right[0].bounds.x - (left[0].bounds.x + left[0].bounds.width) < columnGap)
148
+ throw new RangeError(
149
+ "layoutBipartite: bounds are too narrow for node sizes and columnGap."
150
+ );
151
+ return Object.freeze({
152
+ bounds: Object.freeze({ ...b }),
153
+ left,
154
+ right,
155
+ edges: Object.freeze(edges)
156
+ });
157
+ }
158
+ function BipartiteGraph(props) {
159
+ const frame = useGraphFrame(props.style), style = frame.style;
160
+ if (!frame.bounds.width || !frame.bounds.height)
161
+ return /* @__PURE__ */ jsx(Group, { style: frame.groupStyle, children: null });
162
+ const layout = layoutBipartite(resolveSignalValue(props.graph), {
163
+ ...props,
164
+ bounds: frame.bounds,
165
+ columnGap: style.columnGap,
166
+ nodeGap: style.nodeGap
167
+ });
168
+ return /* @__PURE__ */ jsxs(Group, { style: frame.groupStyle, children: [
169
+ layout.edges.map((edge) => /* @__PURE__ */ jsx(
170
+ Group,
171
+ {
172
+ onClick: (event) => props.onEdgeClick?.(edge, event),
173
+ children: props.renderEdge ? props.renderEdge(edge) : /* @__PURE__ */ jsx(
174
+ SvgPath,
175
+ {
176
+ style: {
177
+ ...defaultGraphEdgeStyle(edge),
178
+ ...resolveMarkStyle(edge, props.edgeStyle),
179
+ d: edge.path
180
+ }
181
+ }
182
+ )
183
+ },
184
+ String(edge.key)
185
+ )),
186
+ layout.left.map((node) => /* @__PURE__ */ jsx(
187
+ Group,
188
+ {
189
+ onClick: (event) => props.onLeftNodeClick?.(node, event),
190
+ children: props.renderLeftNode ? props.renderLeftNode(node) : /* @__PURE__ */ jsxs(Group, { children: [
191
+ /* @__PURE__ */ jsx(
192
+ GraphNode,
193
+ {
194
+ node,
195
+ style: {
196
+ ...defaultGraphNodeStyle(node),
197
+ ...resolveMarkStyle(node, props.leftNodeStyle)
198
+ }
199
+ }
200
+ ),
201
+ /* @__PURE__ */ jsx(
202
+ GraphLabel,
203
+ {
204
+ label: node.label,
205
+ style: {
206
+ ...defaultGraphLabelStyle(node.label),
207
+ ...resolveSignalValue(props.labelStyle)
208
+ }
209
+ }
210
+ )
211
+ ] })
212
+ },
213
+ `left-${String(node.key)}`
214
+ )),
215
+ layout.right.map((node) => /* @__PURE__ */ jsx(
216
+ Group,
217
+ {
218
+ onClick: (event) => props.onRightNodeClick?.(node, event),
219
+ children: props.renderRightNode ? props.renderRightNode(node) : /* @__PURE__ */ jsxs(Group, { children: [
220
+ /* @__PURE__ */ jsx(
221
+ GraphNode,
222
+ {
223
+ node,
224
+ style: {
225
+ ...defaultGraphNodeStyle(node),
226
+ ...resolveMarkStyle(node, props.rightNodeStyle)
227
+ }
228
+ }
229
+ ),
230
+ /* @__PURE__ */ jsx(
231
+ GraphLabel,
232
+ {
233
+ label: node.label,
234
+ style: {
235
+ ...defaultGraphLabelStyle(node.label),
236
+ ...resolveSignalValue(props.labelStyle)
237
+ }
238
+ }
239
+ )
240
+ ] })
241
+ },
242
+ `right-${String(node.key)}`
243
+ ))
244
+ ] });
245
+ }
246
+ export {
247
+ BipartiteGraph,
248
+ layoutBipartite
249
+ };
250
+ //# sourceMappingURL=bipartite.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/features/viz/lib/graph/bipartite.tsx"],
4
+ "sourcesContent": ["import { Group, SvgPath, resolveSignalValue } from \"@pibbl/core\";\nimport type { PathSegment, PibblNode } from \"@pibbl/core\";\nimport type {\n Accessor,\n BipartiteData,\n BipartiteGraphProps,\n BipartiteLayout,\n BipartiteOptions,\n GraphNodeGeometry,\n Size,\n VizKey,\n} from \"./types.js\";\nimport {\n defaultGraphEdgeStyle,\n defaultGraphLabelStyle,\n defaultGraphNodeStyle,\n GraphLabel,\n GraphNode,\n resolveMarkStyle,\n useGraphFrame,\n} from \"./shared.js\";\n\nfunction access<D, V>(input: Accessor<D, V>, datum: D): V {\n return typeof input === \"function\"\n ? input(datum)\n : (datum as Record<PropertyKey, V>)[input];\n}\nfunction finite(value: number, name: string, zero = false) {\n if (!Number.isFinite(value) || (zero && value < 0))\n throw new RangeError(\n `layoutBipartite: ${name} must be finite${zero ? \" and nonnegative\" : \"\"}.`,\n );\n return value;\n}\nfunction label(\n text: string,\n bounds: { x: number; y: number; width: number; height: number },\n) {\n return Object.freeze({\n text,\n bounds: Object.freeze(bounds),\n rotationDegrees: 0,\n });\n}\nfunction route(a: { x: number; y: number }, b: { x: number; y: number }) {\n const middle = (a.x + b.x) / 2;\n const segments = Object.freeze([\n { type: \"move\" as const, x: a.x, y: a.y },\n {\n type: \"cubic\" as const,\n cp1x: middle,\n cp1y: a.y,\n cp2x: middle,\n cp2y: b.y,\n x: b.x,\n y: b.y,\n },\n ]);\n return Object.freeze({\n sourceAnchor: Object.freeze(a),\n targetAnchor: Object.freeze(b),\n segments,\n arrowSegments: null,\n });\n}\nfunction path(route: { segments: readonly PathSegment[] }) {\n return route.segments\n .map((segment) =>\n segment.type === \"move\"\n ? `M ${segment.x} ${segment.y}`\n : segment.type === \"cubic\"\n ? `C ${segment.cp1x} ${segment.cp1y} ${segment.cp2x} ${segment.cp2y} ${segment.x} ${segment.y}`\n : \"\",\n )\n .join(\" \");\n}\nfunction placed<D>(\n data: readonly D[],\n keyBy: Accessor<D, VizKey>,\n labelBy: Accessor<D, string> | undefined,\n atX: number,\n bounds: { y: number; height: number },\n size: ((datum: D) => Size) | undefined,\n gap: number,\n): readonly GraphNodeGeometry<D>[] {\n const total =\n data.reduce((sum, datum) => sum + (size?.(datum).height ?? 34), 0) +\n Math.max(0, data.length - 1) * gap;\n let y = bounds.y + Math.max(0, (bounds.height - total) / 2);\n const seen = new Set<VizKey>();\n return Object.freeze(\n data.map((datum) => {\n const key = access(keyBy, datum);\n if (seen.has(key))\n throw new Error(\n `layoutBipartite: duplicate node key ${String(key)} on one side.`,\n );\n seen.add(key);\n const dimensions = size?.(datum) ?? { width: 150, height: 34 };\n const box = {\n x: atX,\n y,\n width: dimensions.width,\n height: dimensions.height,\n };\n y += dimensions.height + gap;\n return Object.freeze({\n key,\n datum,\n bounds: Object.freeze(box),\n label: label(labelBy ? access(labelBy, datum) : String(key), box),\n detail: null,\n });\n }),\n );\n}\n\n/** Arranges two explicit entity sets in columns, retaining side-qualified identity.\n * @param graph - Explicit left and right entities with cross-set edges. See {@link BipartiteData}.\n * @param options - Accessors, dimensions, and column spacing. See {@link BipartiteOptions}.\n * @returns Immutable side-aware nodes and routed edges. See {@link BipartiteLayout}.\n */\nexport function layoutBipartite<L, R, E>(\n graph: BipartiteData<L, R, E>,\n options: BipartiteOptions<L, R, E>,\n): BipartiteLayout<L, R, E> {\n const b = options.bounds;\n finite(b.x, \"bounds.x\");\n finite(b.y, \"bounds.y\");\n finite(b.width, \"bounds.width\", true);\n finite(b.height, \"bounds.height\", true);\n const gap = finite(options.nodeGap ?? 12, \"nodeGap\", true),\n columnGap = finite(options.columnGap ?? 120, \"columnGap\", true);\n const leftSize = options.leftSize,\n leftResolver: ((datum: L) => Size) | undefined =\n typeof leftSize === \"function\"\n ? leftSize\n : leftSize === undefined\n ? undefined\n : () => leftSize;\n const rightSize = options.rightSize,\n rightResolver: ((datum: R) => Size) | undefined =\n typeof rightSize === \"function\"\n ? rightSize\n : rightSize === undefined\n ? undefined\n : () => rightSize;\n const left = placed(\n graph.left,\n options.leftKey,\n options.leftLabel,\n b.x,\n b,\n leftResolver,\n gap,\n );\n const rightWidth =\n typeof rightSize === \"function\" ? 150 : (rightSize?.width ?? 150);\n const right = placed(\n graph.right,\n options.rightKey,\n options.rightLabel,\n Math.max(b.x, b.x + b.width - rightWidth),\n b,\n rightResolver,\n gap,\n );\n const leftByKey = new Map(left.map((node) => [node.key, node])),\n rightByKey = new Map(right.map((node) => [node.key, node]));\n const edgeKeys = new Set<VizKey>();\n const edges = graph.edges.map((edge) => {\n const key = access(options.edgeKey, edge);\n if (edgeKeys.has(key))\n throw new Error(`layoutBipartite: duplicate edge key ${String(key)}.`);\n edgeKeys.add(key);\n const source = access(options.source, edge),\n target = access(options.target, edge),\n leftNode = leftByKey.get(source),\n rightNode = rightByKey.get(target);\n if (!leftNode || !rightNode)\n throw new RangeError(\n \"layoutBipartite: every edge must point from a known left key to a known right key.\",\n );\n const r = route(\n {\n x: leftNode.bounds.x + leftNode.bounds.width,\n y: leftNode.bounds.y + leftNode.bounds.height / 2,\n },\n {\n x: rightNode.bounds.x,\n y: rightNode.bounds.y + rightNode.bounds.height / 2,\n },\n );\n return Object.freeze({\n key,\n datum: edge,\n sourceKey: source,\n targetKey: target,\n left: leftNode,\n right: rightNode,\n route: r,\n path: path(r),\n arrowPath: null,\n });\n });\n if (\n left.length &&\n right.length &&\n right[0].bounds.x - (left[0].bounds.x + left[0].bounds.width) < columnGap\n )\n throw new RangeError(\n \"layoutBipartite: bounds are too narrow for node sizes and columnGap.\",\n );\n return Object.freeze({\n bounds: Object.freeze({ ...b }),\n left,\n right,\n edges: Object.freeze(edges),\n });\n}\n\n/** Render left/right entity sets and their cross-set relationships.\n * @param props - Entity data and presentation.\n * @returns Canvas node.\n * @see {@link layoutBipartite}\n */\nexport function BipartiteGraph<L, R, E>(\n props: BipartiteGraphProps<L, R, E>,\n): PibblNode {\n const frame = useGraphFrame(props.style),\n style = frame.style;\n if (!frame.bounds.width || !frame.bounds.height)\n return <Group style={frame.groupStyle}>{null}</Group>;\n const layout = layoutBipartite(resolveSignalValue(props.graph), {\n ...props,\n bounds: frame.bounds,\n columnGap: style.columnGap,\n nodeGap: style.nodeGap,\n });\n return (\n <Group style={frame.groupStyle}>\n {layout.edges.map((edge) => (\n <Group\n key={String(edge.key)}\n onClick={(event) => props.onEdgeClick?.(edge, event)}\n >\n {props.renderEdge ? (\n props.renderEdge(edge)\n ) : (\n <SvgPath\n style={{\n ...defaultGraphEdgeStyle(edge),\n ...resolveMarkStyle(edge, props.edgeStyle),\n d: edge.path,\n }}\n />\n )}\n </Group>\n ))}\n {layout.left.map((node) => (\n <Group\n key={`left-${String(node.key)}`}\n onClick={(event) => props.onLeftNodeClick?.(node, event)}\n >\n {props.renderLeftNode ? (\n props.renderLeftNode(node)\n ) : (\n <Group>\n <GraphNode\n node={node}\n style={{\n ...defaultGraphNodeStyle(node),\n ...resolveMarkStyle(node, props.leftNodeStyle),\n }}\n />\n <GraphLabel\n label={node.label}\n style={{\n ...defaultGraphLabelStyle(node.label),\n ...resolveSignalValue(props.labelStyle),\n }}\n />\n </Group>\n )}\n </Group>\n ))}\n {layout.right.map((node) => (\n <Group\n key={`right-${String(node.key)}`}\n onClick={(event) => props.onRightNodeClick?.(node, event)}\n >\n {props.renderRightNode ? (\n props.renderRightNode(node)\n ) : (\n <Group>\n <GraphNode\n node={node}\n style={{\n ...defaultGraphNodeStyle(node),\n ...resolveMarkStyle(node, props.rightNodeStyle),\n }}\n />\n <GraphLabel\n label={node.label}\n style={{\n ...defaultGraphLabelStyle(node.label),\n ...resolveSignalValue(props.labelStyle),\n }}\n />\n </Group>\n )}\n </Group>\n ))}\n </Group>\n );\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["route"]
7
+ }
@@ -0,0 +1,44 @@
1
+ import type { PibblNode } from "@pibbl/core";
2
+ import type { ChordBandGeometry, ChordData, ChordDiagramProps, ChordLayout, ChordOptions, ChordRibbonGeometry, EdgeStyle, MarkInteraction, Style } from "./types.js";
3
+ /** Computes a directed chord layout, aggregating repeated ordered transfer pairs.
4
+ * @param data - Ordered category transfers. See {@link ChordData}.
5
+ * @param options - Accessors, bounds, angular spacing, and unit. See {@link ChordOptions}.
6
+ * @returns Immutable bands and directed ribbon geometry. See {@link ChordLayout}.
7
+ */
8
+ export declare function layoutChords<C, T>(data: ChordData<C, T>, options: ChordOptions<C, T>): ChordLayout<C, T>;
9
+ /** Default outer-band paint for custom chord compositions.
10
+ * @param _band - Band geometry.
11
+ * @returns Resolved band paint.
12
+ * @see {@link ChordBand}
13
+ */
14
+ export declare function defaultChordBandStyle<C>(_band: ChordBandGeometry<C>): EdgeStyle;
15
+ /** Default directed-ribbon paint for custom chord compositions.
16
+ * @param _ribbon - Ribbon geometry.
17
+ * @returns Resolved ribbon paint.
18
+ * @see {@link ChordRibbon}
19
+ */
20
+ export declare function defaultChordRibbonStyle<T>(_ribbon: ChordRibbonGeometry<T>): EdgeStyle;
21
+ /** Draw one supplied category band.
22
+ * @param argument - Band props.
23
+ * @returns Canvas node.
24
+ * @see {@link ChordBandGeometry}
25
+ */
26
+ export declare function ChordBand<C>({ band, style: input, ...events }: MarkInteraction & {
27
+ readonly band: ChordBandGeometry<C>;
28
+ readonly style?: Style<EdgeStyle>;
29
+ }): PibblNode;
30
+ /** Draw one supplied directed ribbon.
31
+ * @param argument - Ribbon props.
32
+ * @returns Canvas node.
33
+ * @see {@link ChordRibbonGeometry}
34
+ */
35
+ export declare function ChordRibbon<T>({ ribbon, style: input, ...events }: MarkInteraction & {
36
+ readonly ribbon: ChordRibbonGeometry<T>;
37
+ readonly style?: Style<EdgeStyle>;
38
+ }): PibblNode;
39
+ /** Render a directed transfer chord diagram.
40
+ * @param props - Transfer data and presentation.
41
+ * @returns Canvas node.
42
+ * @see {@link layoutChords}
43
+ */
44
+ export declare function ChordDiagram<C, T>(props: ChordDiagramProps<C, T>): PibblNode;
@@ -0,0 +1,348 @@
1
+ import { jsx, jsxs } from "@pibbl/core/jsx-runtime";
2
+ import {
3
+ Group,
4
+ SvgPath,
5
+ resolveSignalValue,
6
+ PathGeometry,
7
+ toSvgPathData
8
+ } from "@pibbl/core";
9
+ import {
10
+ defaultGraphLabelStyle,
11
+ GraphLabel,
12
+ resolveMarkStyle,
13
+ useGraphFrame
14
+ } from "./shared.js";
15
+ function access(input, datum) {
16
+ return typeof input === "function" ? input(datum) : datum[input];
17
+ }
18
+ function finite(value, name, zero = false) {
19
+ if (!Number.isFinite(value) || zero && value < 0)
20
+ throw new RangeError(
21
+ `layoutChords: ${name} must be finite${zero ? " and nonnegative" : ""}.`
22
+ );
23
+ return value;
24
+ }
25
+ function point(cx, cy, radius, degrees) {
26
+ const radians = (degrees - 90) * Math.PI / 180;
27
+ return {
28
+ x: cx + Math.cos(radians) * radius,
29
+ y: cy + Math.sin(radians) * radius
30
+ };
31
+ }
32
+ function svg(segments) {
33
+ const geometry = new PathGeometry();
34
+ geometry.spliceSegments(0, 0, segments);
35
+ return toSvgPathData(geometry);
36
+ }
37
+ function bandSegments(cx, cy, outer, inner, start, end) {
38
+ const first = point(cx, cy, outer, start), last = point(cx, cy, inner, end), radians = Math.PI / 180;
39
+ return Object.freeze([
40
+ { type: "move", ...first },
41
+ {
42
+ type: "arc",
43
+ cx,
44
+ cy,
45
+ ux: outer,
46
+ uy: 0,
47
+ vx: 0,
48
+ vy: outer,
49
+ startAngle: (start - 90) * radians,
50
+ sweep: (end - start) * radians
51
+ },
52
+ { type: "line", ...last },
53
+ {
54
+ type: "arc",
55
+ cx,
56
+ cy,
57
+ ux: inner,
58
+ uy: 0,
59
+ vx: 0,
60
+ vy: inner,
61
+ startAngle: (end - 90) * radians,
62
+ sweep: (start - end) * radians
63
+ },
64
+ { type: "close" }
65
+ ]);
66
+ }
67
+ function layoutChords(data, options) {
68
+ const b = options.bounds;
69
+ finite(b.x, "bounds.x");
70
+ finite(b.y, "bounds.y");
71
+ finite(b.width, "bounds.width", true);
72
+ finite(b.height, "bounds.height", true);
73
+ const width = finite(options.bandWidth ?? 20, "bandWidth", true), pad = finite(options.padAngle ?? 2, "padAngle", true), start = finite(options.startAngle ?? 0, "startAngle");
74
+ if (data.categories.length * pad >= 360 && data.categories.length)
75
+ throw new RangeError(
76
+ "layoutChords: total padAngle must be less than 360 degrees."
77
+ );
78
+ const categories = /* @__PURE__ */ new Map();
79
+ for (const category of data.categories) {
80
+ const key = access(options.categoryKey, category);
81
+ if (categories.has(key))
82
+ throw new Error(`layoutChords: duplicate category key ${String(key)}.`);
83
+ categories.set(key, category);
84
+ }
85
+ const groups = /* @__PURE__ */ new Map();
86
+ const incoming = /* @__PURE__ */ new Map(), outgoing = /* @__PURE__ */ new Map();
87
+ for (const key of categories.keys()) {
88
+ incoming.set(key, 0);
89
+ outgoing.set(key, 0);
90
+ }
91
+ for (const transfer of data.transfers) {
92
+ const source = access(options.source, transfer), target = access(options.target, transfer), amount = finite(access(options.value, transfer), "transfer value", true);
93
+ if (!categories.has(source) || !categories.has(target))
94
+ throw new RangeError(
95
+ "layoutChords: transfer endpoint is not a category key."
96
+ );
97
+ incoming.set(
98
+ target,
99
+ finite(incoming.get(target) + amount, "incoming total", true)
100
+ );
101
+ outgoing.set(
102
+ source,
103
+ finite(outgoing.get(source) + amount, "outgoing total", true)
104
+ );
105
+ const id = `chord:${typeof source}:${String(source)}\0${typeof target}:${String(target)}`;
106
+ const prior = groups.get(id);
107
+ if (prior) {
108
+ prior.records.push(transfer);
109
+ prior.value = finite(prior.value + amount, "transfer total", true);
110
+ } else
111
+ groups.set(id, { source, target, records: [transfer], value: amount });
112
+ }
113
+ const total = Array.from(groups.values()).reduce(
114
+ (sum2, entry) => sum2 + entry.value,
115
+ 0
116
+ );
117
+ const cx = b.x + b.width / 2, cy = b.y + b.height / 2, radius = Math.max(0, Math.min(b.width, b.height) / 2 - 28), inner = Math.max(0, radius - width);
118
+ const weight = Array.from(categories.keys()).map(
119
+ (key) => incoming.get(key) + outgoing.get(key)
120
+ );
121
+ const sum = weight.reduce((a, n) => a + n, 0);
122
+ finite(total, "transfer total", true);
123
+ finite(sum, "incident total", true);
124
+ const usable = 360 - data.categories.length * pad;
125
+ let angle = start;
126
+ const bands = [];
127
+ const arcs = /* @__PURE__ */ new Map();
128
+ for (let index = 0; index < data.categories.length; index++) {
129
+ const datum = data.categories[index], key = access(options.categoryKey, datum), span = sum === 0 ? 0 : weight[index] / sum * usable, arc = Object.freeze({
130
+ center: Object.freeze({ x: cx, y: cy }),
131
+ radius,
132
+ startAngleDegrees: angle,
133
+ endAngleDegrees: angle + span
134
+ });
135
+ const segments = bandSegments(cx, cy, radius, inner, angle, angle + span);
136
+ const mid = angle + span / 2, labelPoint = point(cx, cy, radius + 18, mid);
137
+ const label = Object.freeze({
138
+ text: options.label ? access(options.label, datum) : String(key),
139
+ bounds: Object.freeze({
140
+ x: labelPoint.x - 45,
141
+ y: labelPoint.y - 10,
142
+ width: 90,
143
+ height: 20
144
+ }),
145
+ rotationDegrees: 0
146
+ });
147
+ bands.push(
148
+ Object.freeze({
149
+ key,
150
+ datum,
151
+ incomingValue: incoming.get(key),
152
+ outgoingValue: outgoing.get(key),
153
+ arc,
154
+ innerRadius: inner,
155
+ segments,
156
+ path: svg(segments),
157
+ label
158
+ })
159
+ );
160
+ arcs.set(key, { start: angle, end: angle + span, cursor: angle });
161
+ angle += span + pad;
162
+ }
163
+ const ribbons = [];
164
+ for (const entry of groups.values()) {
165
+ if (entry.value === 0) continue;
166
+ const source = arcs.get(entry.source), target = arcs.get(entry.target);
167
+ const sourceWeight = incoming.get(entry.source) + outgoing.get(entry.source), targetWeight = incoming.get(entry.target) + outgoing.get(entry.target);
168
+ const sourceSpan = sourceWeight === 0 ? 0 : (source.end - source.start) * entry.value / sourceWeight, targetSpan = targetWeight === 0 ? 0 : (target.end - target.start) * entry.value / targetWeight;
169
+ const sourceArc = Object.freeze({
170
+ center: Object.freeze({ x: cx, y: cy }),
171
+ radius: inner,
172
+ startAngleDegrees: source.cursor,
173
+ endAngleDegrees: source.cursor + sourceSpan
174
+ });
175
+ source.cursor += sourceSpan;
176
+ const targetStart = target.cursor;
177
+ const targetArc = Object.freeze({
178
+ center: Object.freeze({ x: cx, y: cy }),
179
+ radius: inner,
180
+ startAngleDegrees: targetStart,
181
+ endAngleDegrees: targetStart + targetSpan
182
+ });
183
+ target.cursor += targetSpan;
184
+ const a = point(cx, cy, inner, sourceArc.startAngleDegrees), d = point(cx, cy, inner, targetArc.startAngleDegrees);
185
+ const segments = Object.freeze([
186
+ { type: "move", ...a },
187
+ {
188
+ type: "arc",
189
+ cx,
190
+ cy,
191
+ ux: inner,
192
+ uy: 0,
193
+ vx: 0,
194
+ vy: inner,
195
+ startAngle: (sourceArc.startAngleDegrees - 90) * Math.PI / 180,
196
+ sweep: (sourceArc.endAngleDegrees - sourceArc.startAngleDegrees) * Math.PI / 180
197
+ },
198
+ {
199
+ type: "quadratic",
200
+ cpx: cx,
201
+ cpy: cy,
202
+ x: d.x,
203
+ y: d.y
204
+ },
205
+ {
206
+ type: "arc",
207
+ cx,
208
+ cy,
209
+ ux: inner,
210
+ uy: 0,
211
+ vx: 0,
212
+ vy: inner,
213
+ startAngle: (targetArc.startAngleDegrees - 90) * Math.PI / 180,
214
+ sweep: (targetArc.endAngleDegrees - targetArc.startAngleDegrees) * Math.PI / 180
215
+ },
216
+ {
217
+ type: "quadratic",
218
+ cpx: cx,
219
+ cpy: cy,
220
+ x: a.x,
221
+ y: a.y
222
+ },
223
+ { type: "close" }
224
+ ]);
225
+ ribbons.push(
226
+ Object.freeze({
227
+ key: `${typeof entry.source}:${String(entry.source)}\0${typeof entry.target}:${String(entry.target)}`,
228
+ sourceKey: entry.source,
229
+ targetKey: entry.target,
230
+ records: Object.freeze(entry.records),
231
+ value: entry.value,
232
+ sourceArc,
233
+ targetArc,
234
+ segments,
235
+ path: svg(segments)
236
+ })
237
+ );
238
+ }
239
+ return Object.freeze({
240
+ bounds: Object.freeze({ ...b }),
241
+ unit: options.unit,
242
+ total,
243
+ bands: Object.freeze(bands),
244
+ ribbons: Object.freeze(ribbons)
245
+ });
246
+ }
247
+ function defaultChordBandStyle(_band) {
248
+ return { fill: "#0f766e" };
249
+ }
250
+ function defaultChordRibbonStyle(_ribbon) {
251
+ return { fill: "rgba(15, 118, 110, 0.3)" };
252
+ }
253
+ function ChordBand({
254
+ band,
255
+ style: input,
256
+ ...events
257
+ }) {
258
+ return /* @__PURE__ */ jsx(
259
+ SvgPath,
260
+ {
261
+ ...events,
262
+ style: { ...resolveSignalValue(input) ?? {}, d: band.path }
263
+ }
264
+ );
265
+ }
266
+ function ChordRibbon({
267
+ ribbon,
268
+ style: input,
269
+ ...events
270
+ }) {
271
+ return /* @__PURE__ */ jsx(
272
+ SvgPath,
273
+ {
274
+ ...events,
275
+ style: { ...resolveSignalValue(input) ?? {}, d: ribbon.path }
276
+ }
277
+ );
278
+ }
279
+ function ChordDiagram(props) {
280
+ const frame = useGraphFrame(props.style), style = frame.style;
281
+ if (!frame.bounds.width || !frame.bounds.height)
282
+ return /* @__PURE__ */ jsx(Group, { style: frame.groupStyle, children: null });
283
+ const layout = layoutChords(resolveSignalValue(props.data), {
284
+ ...props,
285
+ bounds: frame.bounds,
286
+ bandWidth: style.bandWidth,
287
+ padAngle: style.padAngle,
288
+ startAngle: style.startAngle
289
+ });
290
+ return /* @__PURE__ */ jsxs(Group, { style: frame.groupStyle, children: [
291
+ layout.ribbons.map((ribbon) => /* @__PURE__ */ jsx(
292
+ Group,
293
+ {
294
+ onClick: (event) => props.onRibbonClick?.(ribbon, event),
295
+ children: props.renderRibbon ? props.renderRibbon(ribbon) : /* @__PURE__ */ jsx(
296
+ ChordRibbon,
297
+ {
298
+ ribbon,
299
+ keyboardFocusable: Boolean(props.onRibbonClick),
300
+ style: {
301
+ ...defaultChordRibbonStyle(ribbon),
302
+ ...resolveMarkStyle(ribbon, props.ribbonStyle)
303
+ }
304
+ }
305
+ )
306
+ },
307
+ ribbon.key
308
+ )),
309
+ layout.bands.map((band) => /* @__PURE__ */ jsx(
310
+ Group,
311
+ {
312
+ onClick: (event) => props.onBandClick?.(band, event),
313
+ children: props.renderBand ? props.renderBand(band) : /* @__PURE__ */ jsxs(Group, { children: [
314
+ /* @__PURE__ */ jsx(
315
+ ChordBand,
316
+ {
317
+ band,
318
+ style: {
319
+ ...defaultChordBandStyle(band),
320
+ ...resolveMarkStyle(band, props.bandStyle)
321
+ }
322
+ }
323
+ ),
324
+ /* @__PURE__ */ jsx(
325
+ GraphLabel,
326
+ {
327
+ label: band.label,
328
+ style: {
329
+ ...defaultGraphLabelStyle(band.label),
330
+ ...resolveSignalValue(props.labelStyle)
331
+ }
332
+ }
333
+ )
334
+ ] })
335
+ },
336
+ String(band.key)
337
+ ))
338
+ ] });
339
+ }
340
+ export {
341
+ ChordBand,
342
+ ChordDiagram,
343
+ ChordRibbon,
344
+ defaultChordBandStyle,
345
+ defaultChordRibbonStyle,
346
+ layoutChords
347
+ };
348
+ //# sourceMappingURL=chord.js.map