@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,79 @@
1
+ import type { FillStyle, PibblEventHandlers, PibblEventParticipationOptions, PibblNode, SignalValue, StrokeStyle } from "@pibbl/core";
2
+ import type { SignalStyle } from "@pibbl/core/internal";
3
+ import type { BarCategoryAccessor } from "./bar-series.js";
4
+ import type { LineAccessor, ScaleId } from "./types.js";
5
+ /** Shared local-pixel geometry and paint for estimate-and-interval marks.
6
+ * @see {@link IntervalSeriesProps}
7
+ */
8
+ export interface IntervalSeriesStyle {
9
+ /** Estimate circle radius in local pixels; defaults to 4. */
10
+ readonly radius?: number;
11
+ /** Full perpendicular length of each endpoint cap; defaults to 8 pixels. */
12
+ readonly capSize?: number;
13
+ /** Estimate circle fill; defaults to #087f8c. */
14
+ readonly fill?: FillStyle;
15
+ /** Interval, cap, and circle outline paint; defaults to #087f8c. */
16
+ readonly stroke?: StrokeStyle;
17
+ /** Visible stroke width in local pixels; defaults to 1.5. */
18
+ readonly strokeWidth?: number;
19
+ /** Stroke targeting width, independent of visible width; defaults to strokeWidth. */
20
+ readonly lineInteractionWidth?: number;
21
+ /** Shared paint opacity from zero to one; defaults to 1. */
22
+ readonly opacity?: number;
23
+ /** Cursor for painted mark targets. */
24
+ readonly cursor?: string;
25
+ }
26
+ /** Explicit supplied estimates and numeric bounds placed at categorical centers.
27
+ * @see {@link HorizontalIntervalSeries}
28
+ * @see {@link VerticalIntervalSeries}
29
+ */
30
+ export interface IntervalSeriesProps<D> extends PibblEventHandlers, PibblEventParticipationOptions {
31
+ /** Original records, or a signal of records; no estimation is performed. */
32
+ readonly data: SignalValue<readonly D[]>;
33
+ /** Property or callback supplying a category; missing/unknown categories omit rows. */
34
+ readonly category: BarCategoryAccessor<D>;
35
+ /** Property or callback supplying the numeric point estimate. */
36
+ readonly estimate: LineAccessor<D>;
37
+ /** Property or callback supplying the numeric lower bound. */
38
+ readonly lower: LineAccessor<D>;
39
+ /** Property or callback supplying the numeric upper bound. */
40
+ readonly upper: LineAccessor<D>;
41
+ /** Ancestor PointScale or BarScale; band categories use their centers. */
42
+ readonly categoryScale: ScaleId;
43
+ /** Ancestor continuous numeric scale mapping estimate and both bounds independently. */
44
+ readonly valueScale: ScaleId;
45
+ /** Optional synchronous predicate; excluded rows contribute no marks.
46
+ * @param datum - Original record being tested.
47
+ * @param index - Source index of the record.
48
+ * @param data - Complete supplied data array.
49
+ * @returns Whether to include this record's estimate and interval.
50
+ */
51
+ readonly defined?: (datum: D, index: number, data: readonly D[]) => boolean;
52
+ /** Shared style; whole-object and shallow field signals are observed by the series. */
53
+ readonly style?: SignalValue<SignalStyle<IntervalSeriesStyle>>;
54
+ }
55
+ /** Horizontal estimate-and-interval authoring inputs. See {@link HorizontalIntervalSeries}. */
56
+ export type HorizontalIntervalSeriesProps<D> = IntervalSeriesProps<D>;
57
+ /** Vertical estimate-and-interval authoring inputs. See {@link VerticalIntervalSeries}. */
58
+ export type VerticalIntervalSeriesProps<D> = IntervalSeriesProps<D>;
59
+ /**
60
+ * Draw supplied numeric intervals horizontally with an estimate circle per category.
61
+ * Missing/non-finite coordinates omit the entire row; reversed bounds reject it.
62
+ * Mapping does not clamp or clip; compose a Clip when required. Marks use ordinary
63
+ * Line/Circle targets, with series handlers receiving their bubbled events.
64
+ *
65
+ * @param props - Supplied data, categorical/numeric scale IDs, and shared style.
66
+ * @returns Ordinary Pibbl content in source order, interval then circle for each row.
67
+ * @see {@link HorizontalIntervalSeriesProps}
68
+ */
69
+ export declare function HorizontalIntervalSeries<D>(props: HorizontalIntervalSeriesProps<D>): PibblNode;
70
+ /**
71
+ * Draw supplied numeric intervals vertically with an estimate circle per category.
72
+ * Shares the missing-data, bounds, paint, targeting, and clipping contract of
73
+ * HorizontalIntervalSeries; orientation is explicit in the operation name.
74
+ *
75
+ * @param props - Supplied data, categorical/numeric scale IDs, and shared style.
76
+ * @returns Ordinary Pibbl content in source order, interval then circle for each row.
77
+ * @see {@link VerticalIntervalSeriesProps}
78
+ */
79
+ export declare function VerticalIntervalSeries<D>(props: VerticalIntervalSeriesProps<D>): PibblNode;
@@ -0,0 +1,158 @@
1
+ import { Fragment, jsx, jsxs } from "@pibbl/core/jsx-runtime";
2
+ import { Circle, Group, Line, resolveSignalValue } from "@pibbl/core";
3
+ import { withHooksForbidden } from "@pibbl/core/internal";
4
+ import { lookupScale } from "./scale-context.js";
5
+ import { useContinuousScale } from "./use-continuous-scale.js";
6
+ import { finiteCoordinate, pointAccessor, pointData } from "./point-data.js";
7
+ import { opacity, width } from "./paint.js";
8
+ function intervalSeries(props, horizontal) {
9
+ const receiver = horizontal ? "HorizontalIntervalSeries" : "VerticalIntervalSeries";
10
+ const {
11
+ data: input,
12
+ category: categoryInput,
13
+ estimate: estimateInput,
14
+ lower: lowerInput,
15
+ upper: upperInput,
16
+ categoryScale,
17
+ valueScale,
18
+ defined,
19
+ style: styleInput,
20
+ pointerEvents,
21
+ ...events
22
+ } = props;
23
+ const categories = lookupScale(categoryScale, receiver)?.get();
24
+ const values = useContinuousScale(valueScale).get();
25
+ if (!categories || categories.type !== "point" && categories.type !== "band")
26
+ throw new TypeError(
27
+ `${receiver}: categoryScale requires PointScale or BarScale.`
28
+ );
29
+ const data = pointData(resolveSignalValue(input), receiver);
30
+ const category = typeof categoryInput === "function" ? categoryInput : (datum) => datum[categoryInput];
31
+ const estimate = pointAccessor(estimateInput), lower = pointAccessor(lowerInput), upper = pointAccessor(upperInput);
32
+ const specified = resolveSignalValue(styleInput) ?? {};
33
+ if (typeof specified !== "object" || Array.isArray(specified))
34
+ throw new TypeError(`${receiver}: style must be an object.`);
35
+ const style = {};
36
+ for (const key of Object.keys(specified)) {
37
+ if (![
38
+ "radius",
39
+ "capSize",
40
+ "fill",
41
+ "stroke",
42
+ "strokeWidth",
43
+ "lineInteractionWidth",
44
+ "opacity",
45
+ "cursor"
46
+ ].includes(key))
47
+ throw new TypeError(`${receiver}: unsupported style field ${key}.`);
48
+ style[key] = resolveSignalValue(specified[key]);
49
+ }
50
+ const resolved = style;
51
+ const radius = width(resolved.radius ?? 4, `${receiver} radius`);
52
+ const halfCap = width(resolved.capSize ?? 8, `${receiver} capSize`) / 2;
53
+ const strokeWidth = width(resolved.strokeWidth ?? 1.5, receiver);
54
+ const lineInteractionWidth = width(
55
+ resolved.lineInteractionWidth ?? strokeWidth,
56
+ receiver
57
+ );
58
+ const alpha = opacity(resolved.opacity ?? 1, receiver);
59
+ if (resolved.cursor !== void 0 && typeof resolved.cursor !== "string")
60
+ throw new TypeError(`${receiver}: cursor must be a string.`);
61
+ const stroke = resolved.stroke ?? "#087f8c";
62
+ const lineStyle = {
63
+ stroke,
64
+ strokeWidth,
65
+ lineInteractionWidth,
66
+ opacity: alpha,
67
+ cursor: resolved.cursor
68
+ };
69
+ const nodes = [];
70
+ for (let i = 0; i < data.length; i++) {
71
+ const datum = data[i];
72
+ const coordinates = withHooksForbidden(
73
+ `${receiver}: accessors cannot call hooks.`,
74
+ () => {
75
+ if (defined && !defined(datum, i, data)) return void 0;
76
+ return {
77
+ category: category(datum, i, data),
78
+ estimate: estimate(datum, i, data),
79
+ lower: lower(datum, i, data),
80
+ upper: upper(datum, i, data)
81
+ };
82
+ }
83
+ );
84
+ if (!coordinates || coordinates.category == null || !finiteCoordinate(coordinates.estimate) || !finiteCoordinate(coordinates.lower) || !finiteCoordinate(coordinates.upper))
85
+ continue;
86
+ const start = categories.map(coordinates.category);
87
+ if (start === void 0) continue;
88
+ if (coordinates.lower > coordinates.upper)
89
+ throw new RangeError(
90
+ `${receiver}: lower must not exceed upper (row ${i}).`
91
+ );
92
+ const center = start + (categories.type === "band" ? categories.bandwidth / 2 : 0);
93
+ const lo = values.map(coordinates.lower), hi = values.map(coordinates.upper), point = values.map(coordinates.estimate);
94
+ if (!(Number.isFinite(center) && Number.isFinite(lo) && Number.isFinite(hi) && Number.isFinite(point)))
95
+ throw new RangeError(
96
+ `${receiver}: mapped coordinates must be finite (row ${i}).`
97
+ );
98
+ const position = (value, offset = 0) => horizontal ? [value, center + offset] : [center + offset, value];
99
+ nodes.push(
100
+ /* @__PURE__ */ jsxs(Group, { children: [
101
+ /* @__PURE__ */ jsx(
102
+ Line,
103
+ {
104
+ pointerEvents,
105
+ style: { ...lineStyle, coords: [position(lo), position(hi)] }
106
+ }
107
+ ),
108
+ halfCap > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
109
+ /* @__PURE__ */ jsx(
110
+ Line,
111
+ {
112
+ pointerEvents,
113
+ style: {
114
+ ...lineStyle,
115
+ coords: [position(lo, -halfCap), position(lo, halfCap)]
116
+ }
117
+ }
118
+ ),
119
+ /* @__PURE__ */ jsx(
120
+ Line,
121
+ {
122
+ pointerEvents,
123
+ style: {
124
+ ...lineStyle,
125
+ coords: [position(hi, -halfCap), position(hi, halfCap)]
126
+ }
127
+ }
128
+ )
129
+ ] }),
130
+ radius > 0 && /* @__PURE__ */ jsx(
131
+ Circle,
132
+ {
133
+ pointerEvents,
134
+ style: {
135
+ ...lineStyle,
136
+ cx: horizontal ? point : center,
137
+ cy: horizontal ? center : point,
138
+ radius,
139
+ fill: resolved.fill ?? "#087f8c"
140
+ }
141
+ }
142
+ )
143
+ ] }, i)
144
+ );
145
+ }
146
+ return /* @__PURE__ */ jsx(Group, { ...events, children: nodes });
147
+ }
148
+ function HorizontalIntervalSeries(props) {
149
+ return intervalSeries(props, true);
150
+ }
151
+ function VerticalIntervalSeries(props) {
152
+ return intervalSeries(props, false);
153
+ }
154
+ export {
155
+ HorizontalIntervalSeries,
156
+ VerticalIntervalSeries
157
+ };
158
+ //# sourceMappingURL=interval-series.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/features/viz/lib/interval-series.tsx"],
4
+ "sourcesContent": ["import { Circle, Group, Line, resolveSignalValue } from \"@pibbl/core\";\nimport type {\n FillStyle,\n PibblEventHandlers,\n PibblEventParticipationOptions,\n PibblNode,\n SignalValue,\n StrokeStyle,\n} from \"@pibbl/core\";\nimport type { SignalStyle } from \"@pibbl/core/internal\";\nimport { withHooksForbidden } from \"@pibbl/core/internal\";\nimport type { BarCategoryAccessor } from \"./bar-series.js\";\nimport type { BandCategory, LineAccessor, ScaleId } from \"./types.js\";\nimport { lookupScale } from \"./scale-context.js\";\nimport { useContinuousScale } from \"./use-continuous-scale.js\";\nimport { finiteCoordinate, pointAccessor, pointData } from \"./point-data.js\";\nimport { opacity, width } from \"./paint.js\";\n\n/** Shared local-pixel geometry and paint for estimate-and-interval marks.\n * @see {@link IntervalSeriesProps}\n */\nexport interface IntervalSeriesStyle {\n /** Estimate circle radius in local pixels; defaults to 4. */\n readonly radius?: number;\n /** Full perpendicular length of each endpoint cap; defaults to 8 pixels. */\n readonly capSize?: number;\n /** Estimate circle fill; defaults to #087f8c. */\n readonly fill?: FillStyle;\n /** Interval, cap, and circle outline paint; defaults to #087f8c. */\n readonly stroke?: StrokeStyle;\n /** Visible stroke width in local pixels; defaults to 1.5. */\n readonly strokeWidth?: number;\n /** Stroke targeting width, independent of visible width; defaults to strokeWidth. */\n readonly lineInteractionWidth?: number;\n /** Shared paint opacity from zero to one; defaults to 1. */\n readonly opacity?: number;\n /** Cursor for painted mark targets. */\n readonly cursor?: string;\n}\n\n/** Explicit supplied estimates and numeric bounds placed at categorical centers.\n * @see {@link HorizontalIntervalSeries}\n * @see {@link VerticalIntervalSeries}\n */\nexport interface IntervalSeriesProps<D>\n extends PibblEventHandlers, PibblEventParticipationOptions {\n /** Original records, or a signal of records; no estimation is performed. */\n readonly data: SignalValue<readonly D[]>;\n /** Property or callback supplying a category; missing/unknown categories omit rows. */\n readonly category: BarCategoryAccessor<D>;\n /** Property or callback supplying the numeric point estimate. */\n readonly estimate: LineAccessor<D>;\n /** Property or callback supplying the numeric lower bound. */\n readonly lower: LineAccessor<D>;\n /** Property or callback supplying the numeric upper bound. */\n readonly upper: LineAccessor<D>;\n /** Ancestor PointScale or BarScale; band categories use their centers. */\n readonly categoryScale: ScaleId;\n /** Ancestor continuous numeric scale mapping estimate and both bounds independently. */\n readonly valueScale: ScaleId;\n /** Optional synchronous predicate; excluded rows contribute no marks.\n * @param datum - Original record being tested.\n * @param index - Source index of the record.\n * @param data - Complete supplied data array.\n * @returns Whether to include this record's estimate and interval.\n */\n readonly defined?: (datum: D, index: number, data: readonly D[]) => boolean;\n /** Shared style; whole-object and shallow field signals are observed by the series. */\n readonly style?: SignalValue<SignalStyle<IntervalSeriesStyle>>;\n}\n\n/** Horizontal estimate-and-interval authoring inputs. See {@link HorizontalIntervalSeries}. */\nexport type HorizontalIntervalSeriesProps<D> = IntervalSeriesProps<D>;\n/** Vertical estimate-and-interval authoring inputs. See {@link VerticalIntervalSeries}. */\nexport type VerticalIntervalSeriesProps<D> = IntervalSeriesProps<D>;\n\nfunction intervalSeries<D>(\n props: IntervalSeriesProps<D>,\n horizontal: boolean,\n): PibblNode {\n const receiver = horizontal\n ? \"HorizontalIntervalSeries\"\n : \"VerticalIntervalSeries\";\n const {\n data: input,\n category: categoryInput,\n estimate: estimateInput,\n lower: lowerInput,\n upper: upperInput,\n categoryScale,\n valueScale,\n defined,\n style: styleInput,\n pointerEvents,\n ...events\n } = props;\n const categories = lookupScale(categoryScale, receiver)?.get();\n const values = useContinuousScale(valueScale).get();\n if (\n !categories ||\n (categories.type !== \"point\" && categories.type !== \"band\")\n )\n throw new TypeError(\n `${receiver}: categoryScale requires PointScale or BarScale.`,\n );\n const data = pointData(resolveSignalValue(input), receiver);\n const category =\n typeof categoryInput === \"function\"\n ? categoryInput\n : (datum: D) => datum[categoryInput] as BandCategory | null | undefined;\n const estimate = pointAccessor(estimateInput),\n lower = pointAccessor(lowerInput),\n upper = pointAccessor(upperInput);\n const specified = resolveSignalValue(styleInput) ?? {};\n if (typeof specified !== \"object\" || Array.isArray(specified))\n throw new TypeError(`${receiver}: style must be an object.`);\n const style: Record<string, unknown> = {};\n for (const key of Object.keys(specified)) {\n if (\n ![\n \"radius\",\n \"capSize\",\n \"fill\",\n \"stroke\",\n \"strokeWidth\",\n \"lineInteractionWidth\",\n \"opacity\",\n \"cursor\",\n ].includes(key)\n )\n throw new TypeError(`${receiver}: unsupported style field ${key}.`);\n style[key] = resolveSignalValue(specified[key as keyof typeof specified]);\n }\n const resolved = style as IntervalSeriesStyle;\n const radius = width(resolved.radius ?? 4, `${receiver} radius`);\n const halfCap = width(resolved.capSize ?? 8, `${receiver} capSize`) / 2;\n const strokeWidth = width(resolved.strokeWidth ?? 1.5, receiver);\n const lineInteractionWidth = width(\n resolved.lineInteractionWidth ?? strokeWidth,\n receiver,\n );\n const alpha = opacity(resolved.opacity ?? 1, receiver);\n if (resolved.cursor !== undefined && typeof resolved.cursor !== \"string\")\n throw new TypeError(`${receiver}: cursor must be a string.`);\n const stroke = resolved.stroke ?? \"#087f8c\";\n const lineStyle = {\n stroke,\n strokeWidth,\n lineInteractionWidth,\n opacity: alpha,\n cursor: resolved.cursor,\n };\n const nodes: PibblNode[] = [];\n for (let i = 0; i < data.length; i++) {\n const datum = data[i];\n const coordinates = withHooksForbidden(\n `${receiver}: accessors cannot call hooks.`,\n () => {\n if (defined && !defined(datum, i, data)) return undefined;\n return {\n category: category(datum, i, data),\n estimate: estimate(datum, i, data),\n lower: lower(datum, i, data),\n upper: upper(datum, i, data),\n };\n },\n );\n if (\n !coordinates ||\n coordinates.category == null ||\n !finiteCoordinate(coordinates.estimate) ||\n !finiteCoordinate(coordinates.lower) ||\n !finiteCoordinate(coordinates.upper)\n )\n continue;\n const start = categories.map(coordinates.category);\n if (start === undefined) continue;\n if (coordinates.lower > coordinates.upper)\n throw new RangeError(\n `${receiver}: lower must not exceed upper (row ${i}).`,\n );\n const center =\n start + (categories.type === \"band\" ? categories.bandwidth / 2 : 0);\n const lo = values.map(coordinates.lower),\n hi = values.map(coordinates.upper),\n point = values.map(coordinates.estimate);\n if (!(Number.isFinite(center) && Number.isFinite(lo) && Number.isFinite(hi) && Number.isFinite(point)))\n throw new RangeError(\n `${receiver}: mapped coordinates must be finite (row ${i}).`,\n );\n const position = (value: number, offset = 0): [number, number] =>\n horizontal ? [value, center + offset] : [center + offset, value];\n nodes.push(\n <Group key={i}>\n <Line\n pointerEvents={pointerEvents}\n style={{ ...lineStyle, coords: [position(lo), position(hi)] }}\n />\n {halfCap > 0 && (\n <>\n <Line\n pointerEvents={pointerEvents}\n style={{\n ...lineStyle,\n coords: [position(lo, -halfCap), position(lo, halfCap)],\n }}\n />\n <Line\n pointerEvents={pointerEvents}\n style={{\n ...lineStyle,\n coords: [position(hi, -halfCap), position(hi, halfCap)],\n }}\n />\n </>\n )}\n {radius > 0 && (\n <Circle\n pointerEvents={pointerEvents}\n style={{\n ...lineStyle,\n cx: horizontal ? point : center,\n cy: horizontal ? center : point,\n radius,\n fill: resolved.fill ?? \"#087f8c\",\n }}\n />\n )}\n </Group>,\n );\n }\n return <Group {...events}>{nodes}</Group>;\n}\n\n/**\n * Draw supplied numeric intervals horizontally with an estimate circle per category.\n * Missing/non-finite coordinates omit the entire row; reversed bounds reject it.\n * Mapping does not clamp or clip; compose a Clip when required. Marks use ordinary\n * Line/Circle targets, with series handlers receiving their bubbled events.\n *\n * @param props - Supplied data, categorical/numeric scale IDs, and shared style.\n * @returns Ordinary Pibbl content in source order, interval then circle for each row.\n * @see {@link HorizontalIntervalSeriesProps}\n */\nexport function HorizontalIntervalSeries<D>(\n props: HorizontalIntervalSeriesProps<D>,\n): PibblNode {\n return intervalSeries(props, true);\n}\n\n/**\n * Draw supplied numeric intervals vertically with an estimate circle per category.\n * Shares the missing-data, bounds, paint, targeting, and clipping contract of\n * HorizontalIntervalSeries; orientation is explicit in the operation name.\n *\n * @param props - Supplied data, categorical/numeric scale IDs, and shared style.\n * @returns Ordinary Pibbl content in source order, interval then circle for each row.\n * @see {@link VerticalIntervalSeriesProps}\n */\nexport function VerticalIntervalSeries<D>(\n props: VerticalIntervalSeriesProps<D>,\n): PibblNode {\n return intervalSeries(props, false);\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -41,17 +41,15 @@ function layoutPie(slices, cx, cy, radius, innerRadius, bounds, font, gap, place
41
41
  const labelRadius = innerRadius === 0 ? radius * 0.65 : innerRadius + (radius - innerRadius) * 0.65;
42
42
  const x = cx + Math.cos(mid) * labelRadius - m.width / 2;
43
43
  const y = cy + Math.sin(mid) * labelRadius - m.height / 2;
44
- const corners = [
45
- [x, y],
46
- [x + m.width, y],
47
- [x, y + m.height],
48
- [x + m.width, y + m.height]
49
- ];
50
- const fits = inBounds(x, y, m.width, m.height) && corners.every(([px, py]) => {
44
+ let fits = inBounds(x, y, m.width, m.height);
45
+ for (let corner = 0; corner < 4 && fits; corner++) {
46
+ const px = x + (corner % 2 === 0 ? 0 : m.width);
47
+ const py = y + (corner < 2 ? 0 : m.height);
51
48
  const dx = px - cx, dy = py - cy;
52
49
  const relative = (Math.atan2(dy, dx) - mid + Math.PI * 3) % (Math.PI * 2) - Math.PI;
53
- return Math.hypot(dx, dy) <= radius && Math.abs(relative) <= Math.min(Math.PI / 2, (slice.endAngle - slice.startAngle) / 2);
54
- }) && boxOutsideInnerCircle(x, y, m.width, m.height, cx, cy, innerRadius);
50
+ fits = Math.hypot(dx, dy) <= radius && Math.abs(relative) <= Math.min(Math.PI / 2, (slice.endAngle - slice.startAngle) / 2);
51
+ }
52
+ fits = fits && boxOutsideInnerCircle(x, y, m.width, m.height, cx, cy, innerRadius);
55
53
  if (placement !== "outside" && fits) {
56
54
  labels[index] = placed(text, m, x, y, "inside");
57
55
  return;
@@ -94,10 +92,8 @@ function layoutPie(slices, cx, cy, radius, innerRadius, bounds, font, gap, place
94
92
  const upper = accepted.filter((row) => row.anchor[1] < cy).reverse();
95
93
  const lower = accepted.filter((row) => row.anchor[1] >= cy);
96
94
  const visible = /* @__PURE__ */ new Set();
97
- for (const [rows, sign] of [
98
- [upper, -1],
99
- [lower, 1]
100
- ]) {
95
+ for (let sign = -1; sign <= 1; sign += 2) {
96
+ const rows = sign < 0 ? upper : lower;
101
97
  let cursor = cy + sign * gap / 2;
102
98
  for (const row of rows) {
103
99
  const dx = row.anchor[0] - cx;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/features/viz/lib/layout-pie.ts"],
4
- "sourcesContent": ["import type { PieSliceGeometry } from \"./pie-slices.js\";\nimport type {\n PieLayoutSlice,\n PieLabelLayout,\n PieLabelPlacement,\n} from \"./pie-types.js\";\nimport type { HoverBounds } from \"./hover-placement.js\";\ninterface Metrics {\n width: number;\n height: number;\n left: number;\n ascent: number;\n}\n/** Checks the closest point of a complete label box, not just its corners. */\nexport function boxOutsideInnerCircle(\n x: number,\n y: number,\n width: number,\n height: number,\n cx: number,\n cy: number,\n innerRadius: number,\n): boolean {\n if (innerRadius === 0) return true;\n return (\n Math.hypot(\n Math.max(x - cx, 0, cx - (x + width)),\n Math.max(y - cy, 0, cy - (y + height)),\n ) >= innerRadius\n );\n}\nexport function layoutPie<D>(\n slices: readonly PieSliceGeometry<D>[],\n cx: number,\n cy: number,\n radius: number,\n innerRadius: number,\n bounds: HoverBounds,\n font: string,\n gap: number,\n placement: PieLabelPlacement,\n label: ((slice: PieSliceGeometry<D>) => string) | undefined,\n measure: (text: string) => Metrics,\n): readonly PieLayoutSlice<D>[] {\n const labels: (PieLabelLayout | undefined)[] = slices.map(() => undefined);\n const lanes: {\n index: number;\n text: string;\n metrics: Metrics;\n anchor: [number, number];\n y: number;\n }[][] = [[], []];\n function placed(\n text: string,\n m: Metrics,\n x: number,\n y: number,\n location: \"inside\" | \"outside\",\n leader?: readonly (readonly [number, number])[],\n ): PieLabelLayout {\n return Object.freeze({\n status: \"placed\",\n placement: location,\n text,\n font,\n x,\n y,\n width: m.width,\n height: m.height,\n textX: x + m.left,\n textY: y + m.ascent,\n leader,\n });\n }\n const inBounds = (x: number, y: number, w: number, h: number) =>\n x >= bounds.x &&\n y >= bounds.y &&\n x + w <= bounds.x + bounds.width &&\n y + h <= bounds.y + bounds.height;\n slices.forEach((slice, index) => {\n if (!label) return;\n const text = label(slice);\n if (typeof text !== \"string\" || /[\\r\\n]/u.test(text))\n throw new TypeError(\"PieLayout: label must return a single-line string.\");\n const hide = (reason: \"empty\" | \"inside-fit\" | \"space\") => {\n labels[index] = Object.freeze({ status: \"hidden\", reason, text });\n };\n if (!text || !radius || slice.endAngle <= slice.startAngle) {\n hide(\"empty\");\n return;\n }\n const m = measure(text);\n const mid = (slice.startAngle + slice.endAngle) / 2;\n const labelRadius =\n innerRadius === 0\n ? radius * 0.65\n : innerRadius + (radius - innerRadius) * 0.65;\n const x = cx + Math.cos(mid) * labelRadius - m.width / 2;\n const y = cy + Math.sin(mid) * labelRadius - m.height / 2;\n const corners = [\n [x, y],\n [x + m.width, y],\n [x, y + m.height],\n [x + m.width, y + m.height],\n ];\n // A disk intersected with the midpoint half-plane is convex. Restrict wide\n // sectors to it so corner containment also proves containment of the box.\n const fits =\n inBounds(x, y, m.width, m.height) &&\n corners.every(([px, py]) => {\n const dx = px - cx,\n dy = py - cy;\n const relative =\n ((Math.atan2(dy, dx) - mid + Math.PI * 3) % (Math.PI * 2)) - Math.PI;\n return (\n Math.hypot(dx, dy) <= radius &&\n Math.abs(relative) <=\n Math.min(Math.PI / 2, (slice.endAngle - slice.startAngle) / 2)\n );\n }) &&\n boxOutsideInnerCircle(x, y, m.width, m.height, cx, cy, innerRadius);\n if (placement !== \"outside\" && fits) {\n labels[index] = placed(text, m, x, y, \"inside\");\n return;\n }\n if (placement === \"inside\") {\n hide(\"inside-fit\");\n return;\n }\n const anchor: [number, number] = [\n cx + Math.cos(mid) * radius,\n cy + Math.sin(mid) * radius,\n ];\n lanes[Math.cos(mid) < 0 ? 0 : 1].push({\n index,\n text,\n metrics: m,\n anchor,\n y: 0,\n });\n });\n lanes.forEach((lane, side) => {\n lane.sort((a, b) => a.anchor[1] - b.anchor[1] || a.index - b.index);\n let used = 0;\n const accepted = lane.filter((row) => {\n const x =\n side === 0 ? cx - radius - gap - row.metrics.width : cx + radius + gap;\n const next = used + (used ? gap : 0) + row.metrics.height;\n if (\n next > bounds.height ||\n !inBounds(x, bounds.y, row.metrics.width, row.metrics.height)\n ) {\n labels[row.index] = Object.freeze({\n status: \"hidden\",\n reason: \"space\",\n text: row.text,\n });\n return false;\n }\n used = next;\n return true;\n });\n const direction = side === 0 ? -1 : 1;\n const rail = cx + direction * (radius + gap / 2);\n // Pack each half away from the equator. The tangent constraint keeps every\n // straight fan-out outside the disk; ordering keeps neighboring fans apart.\n // There is one sort and two linear sweeps, with no relaxation loop.\n const upper = accepted.filter((row) => row.anchor[1] < cy).reverse();\n const lower = accepted.filter((row) => row.anchor[1] >= cy);\n const visible = new Set<(typeof accepted)[number]>();\n for (const [rows, sign] of [\n [upper, -1],\n [lower, 1],\n ] as const) {\n let cursor = cy + (sign * gap) / 2;\n for (const row of rows) {\n const dx = row.anchor[0] - cx;\n const dy = row.anchor[1] - cy;\n const half = row.metrics.height / 2;\n const ideal = cy + (dy * (radius + gap)) / radius;\n const tangent =\n dy === 0 ? cy : cy + (radius * radius - dx * (rail - cx)) / dy;\n const center =\n sign < 0\n ? Math.min(ideal, tangent, cursor - half)\n : Math.max(ideal, tangent, cursor + half);\n row.y = center - half;\n if (\n row.y < bounds.y ||\n row.y + row.metrics.height > bounds.y + bounds.height\n ) {\n labels[row.index] = Object.freeze({\n status: \"hidden\",\n reason: \"space\",\n text: row.text,\n });\n continue;\n }\n visible.add(row);\n cursor = center + sign * (half + gap);\n }\n }\n for (const row of accepted) {\n if (!visible.has(row)) continue;\n const x =\n side === 0 ? cx - radius - gap - row.metrics.width : cx + radius + gap;\n const edge = side === 0 ? x + row.metrics.width : x;\n const center = row.y + row.metrics.height / 2;\n const leader = Object.freeze([\n Object.freeze(row.anchor),\n Object.freeze([rail, center] as const),\n Object.freeze([edge, center] as const),\n ]);\n labels[row.index] = placed(\n row.text,\n row.metrics,\n x,\n row.y,\n \"outside\",\n leader,\n );\n }\n });\n return Object.freeze(\n slices.map((slice, index) =>\n Object.freeze({\n ...slice,\n cx,\n cy,\n radius,\n innerRadius,\n label: labels[index],\n }),\n ),\n );\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type { PieSliceGeometry } from \"./pie-slices.js\";\nimport type {\n PieLayoutSlice,\n PieLabelLayout,\n PieLabelPlacement,\n} from \"./pie-types.js\";\nimport type { HoverBounds } from \"./hover-placement.js\";\ninterface Metrics {\n width: number;\n height: number;\n left: number;\n ascent: number;\n}\n/** Checks the closest point of a complete label box, not just its corners. */\nexport function boxOutsideInnerCircle(\n x: number,\n y: number,\n width: number,\n height: number,\n cx: number,\n cy: number,\n innerRadius: number,\n): boolean {\n if (innerRadius === 0) return true;\n return (\n Math.hypot(\n Math.max(x - cx, 0, cx - (x + width)),\n Math.max(y - cy, 0, cy - (y + height)),\n ) >= innerRadius\n );\n}\nexport function layoutPie<D>(\n slices: readonly PieSliceGeometry<D>[],\n cx: number,\n cy: number,\n radius: number,\n innerRadius: number,\n bounds: HoverBounds,\n font: string,\n gap: number,\n placement: PieLabelPlacement,\n label: ((slice: PieSliceGeometry<D>) => string) | undefined,\n measure: (text: string) => Metrics,\n): readonly PieLayoutSlice<D>[] {\n const labels: (PieLabelLayout | undefined)[] = slices.map(() => undefined);\n const lanes: {\n index: number;\n text: string;\n metrics: Metrics;\n anchor: [number, number];\n y: number;\n }[][] = [[], []];\n function placed(\n text: string,\n m: Metrics,\n x: number,\n y: number,\n location: \"inside\" | \"outside\",\n leader?: readonly (readonly [number, number])[],\n ): PieLabelLayout {\n return Object.freeze({\n status: \"placed\",\n placement: location,\n text,\n font,\n x,\n y,\n width: m.width,\n height: m.height,\n textX: x + m.left,\n textY: y + m.ascent,\n leader,\n });\n }\n const inBounds = (x: number, y: number, w: number, h: number) =>\n x >= bounds.x &&\n y >= bounds.y &&\n x + w <= bounds.x + bounds.width &&\n y + h <= bounds.y + bounds.height;\n slices.forEach((slice, index) => {\n if (!label) return;\n const text = label(slice);\n if (typeof text !== \"string\" || /[\\r\\n]/u.test(text))\n throw new TypeError(\"PieLayout: label must return a single-line string.\");\n const hide = (reason: \"empty\" | \"inside-fit\" | \"space\") => {\n labels[index] = Object.freeze({ status: \"hidden\", reason, text });\n };\n if (!text || !radius || slice.endAngle <= slice.startAngle) {\n hide(\"empty\");\n return;\n }\n const m = measure(text);\n const mid = (slice.startAngle + slice.endAngle) / 2;\n const labelRadius =\n innerRadius === 0\n ? radius * 0.65\n : innerRadius + (radius - innerRadius) * 0.65;\n const x = cx + Math.cos(mid) * labelRadius - m.width / 2;\n const y = cy + Math.sin(mid) * labelRadius - m.height / 2;\n // A disk intersected with the midpoint half-plane is convex. Restrict wide\n // sectors to it so corner containment also proves containment of the box.\n let fits = inBounds(x, y, m.width, m.height);\n for (let corner = 0; corner < 4 && fits; corner++) {\n const px = x + (corner % 2 === 0 ? 0 : m.width);\n const py = y + (corner < 2 ? 0 : m.height);\n const dx = px - cx,\n dy = py - cy;\n const relative =\n ((Math.atan2(dy, dx) - mid + Math.PI * 3) % (Math.PI * 2)) - Math.PI;\n fits = Math.hypot(dx, dy) <= radius &&\n Math.abs(relative) <=\n Math.min(Math.PI / 2, (slice.endAngle - slice.startAngle) / 2);\n }\n fits = fits && boxOutsideInnerCircle(x, y, m.width, m.height, cx, cy, innerRadius);\n if (placement !== \"outside\" && fits) {\n labels[index] = placed(text, m, x, y, \"inside\");\n return;\n }\n if (placement === \"inside\") {\n hide(\"inside-fit\");\n return;\n }\n const anchor: [number, number] = [\n cx + Math.cos(mid) * radius,\n cy + Math.sin(mid) * radius,\n ];\n lanes[Math.cos(mid) < 0 ? 0 : 1].push({\n index,\n text,\n metrics: m,\n anchor,\n y: 0,\n });\n });\n lanes.forEach((lane, side) => {\n lane.sort((a, b) => a.anchor[1] - b.anchor[1] || a.index - b.index);\n let used = 0;\n const accepted = lane.filter((row) => {\n const x =\n side === 0 ? cx - radius - gap - row.metrics.width : cx + radius + gap;\n const next = used + (used ? gap : 0) + row.metrics.height;\n if (\n next > bounds.height ||\n !inBounds(x, bounds.y, row.metrics.width, row.metrics.height)\n ) {\n labels[row.index] = Object.freeze({\n status: \"hidden\",\n reason: \"space\",\n text: row.text,\n });\n return false;\n }\n used = next;\n return true;\n });\n const direction = side === 0 ? -1 : 1;\n const rail = cx + direction * (radius + gap / 2);\n // Pack each half away from the equator. The tangent constraint keeps every\n // straight fan-out outside the disk; ordering keeps neighboring fans apart.\n // There is one sort and two linear sweeps, with no relaxation loop.\n const upper = accepted.filter((row) => row.anchor[1] < cy).reverse();\n const lower = accepted.filter((row) => row.anchor[1] >= cy);\n const visible = new Set<(typeof accepted)[number]>();\n for (let sign = -1; sign <= 1; sign += 2) {\n const rows = sign < 0 ? upper : lower;\n let cursor = cy + (sign * gap) / 2;\n for (const row of rows) {\n const dx = row.anchor[0] - cx;\n const dy = row.anchor[1] - cy;\n const half = row.metrics.height / 2;\n const ideal = cy + (dy * (radius + gap)) / radius;\n const tangent =\n dy === 0 ? cy : cy + (radius * radius - dx * (rail - cx)) / dy;\n const center =\n sign < 0\n ? Math.min(ideal, tangent, cursor - half)\n : Math.max(ideal, tangent, cursor + half);\n row.y = center - half;\n if (\n row.y < bounds.y ||\n row.y + row.metrics.height > bounds.y + bounds.height\n ) {\n labels[row.index] = Object.freeze({\n status: \"hidden\",\n reason: \"space\",\n text: row.text,\n });\n continue;\n }\n visible.add(row);\n cursor = center + sign * (half + gap);\n }\n }\n for (const row of accepted) {\n if (!visible.has(row)) continue;\n const x =\n side === 0 ? cx - radius - gap - row.metrics.width : cx + radius + gap;\n const edge = side === 0 ? x + row.metrics.width : x;\n const center = row.y + row.metrics.height / 2;\n const leader = Object.freeze([\n Object.freeze(row.anchor),\n Object.freeze([rail, center] as const),\n Object.freeze([edge, center] as const),\n ]);\n labels[row.index] = placed(\n row.text,\n row.metrics,\n x,\n row.y,\n \"outside\",\n leader,\n );\n }\n });\n return Object.freeze(\n slices.map((slice, index) =>\n Object.freeze({\n ...slice,\n cx,\n cy,\n radius,\n innerRadius,\n label: labels[index],\n }),\n ),\n );\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -8,4 +8,4 @@ import type { LineSeriesProps } from "./types.js";
8
8
  *
9
9
  * @see {@link LineSeriesProps}
10
10
  */
11
- export declare function LineSeries<D>({ data: dataInput, x: xInput, y: yInput, xScale: xId, yScale: yId, defined, curve, style: styleInput, ...eventProps }: LineSeriesProps<D>): import("../../../jsx-runtime.js").JSX.Element;
11
+ export declare function LineSeries<D>({ data: dataInput, x: xInput, y: yInput, xScale: xId, yScale: yId, defined, inspection, curve, style: styleInput, ...eventProps }: LineSeriesProps<D>): import("../../../jsx-runtime.js").JSX.Element;
@@ -1,11 +1,17 @@
1
1
  import { jsx } from "@pibbl/core/jsx-runtime";
2
2
  import { Path, resolveSignalValue } from "@pibbl/core";
3
3
  import { useInternalValueMemoSlot } from "@pibbl/core/internal";
4
- import { useContinuousScale } from "./use-continuous-scale.js";
4
+ import {
5
+ appendCurveForward,
6
+ curveGeometry,
7
+ resolveSeriesCurve
8
+ } from "./curve-definition.js";
9
+ import {
10
+ useSeriesPosition,
11
+ seriesAccessor,
12
+ mapSeriesPosition
13
+ } from "./series-position.js";
5
14
  import { width, opacity } from "./paint.js";
6
- function accessor(input) {
7
- return typeof input === "function" ? input : (datum) => datum[input];
8
- }
9
15
  function LineSeries({
10
16
  data: dataInput,
11
17
  x: xInput,
@@ -13,20 +19,24 @@ function LineSeries({
13
19
  xScale: xId,
14
20
  yScale: yId,
15
21
  defined,
22
+ inspection,
16
23
  curve,
17
24
  style: styleInput,
18
25
  ...eventProps
19
26
  }) {
20
- const xScale = useContinuousScale(xId).get();
21
- const yScale = useContinuousScale(yId).get();
22
- const x = useInternalValueMemoSlot("vizXAccessor", () => accessor(xInput), [
23
- xInput
24
- ]);
25
- const y = useInternalValueMemoSlot("vizYAccessor", () => accessor(yInput), [
26
- yInput
27
- ]);
28
- if (curve !== void 0 && curve !== "linear")
29
- throw new TypeError('LineSeries supports curve="linear" only.');
27
+ const xScale = useSeriesPosition(xId);
28
+ const yScale = useSeriesPosition(yId);
29
+ const x = useInternalValueMemoSlot(
30
+ "vizXAccessor",
31
+ () => seriesAccessor(xInput),
32
+ [xInput]
33
+ );
34
+ const y = useInternalValueMemoSlot(
35
+ "vizYAccessor",
36
+ () => seriesAccessor(yInput),
37
+ [yInput]
38
+ );
39
+ const curveDefinition = resolveSeriesCurve(curve);
30
40
  const data = resolveSignalValue(dataInput);
31
41
  if (!Array.isArray(data))
32
42
  throw new TypeError(
@@ -45,29 +55,38 @@ function LineSeries({
45
55
  "LineSeries"
46
56
  );
47
57
  const path = new Path2D();
48
- let previous;
49
- let inRun = false;
58
+ const captured = inspection ? [] : void 0;
59
+ let runId = 0;
60
+ if (inspection && (xScale.type === "point" || yScale.type === "point")) throw new TypeError("Numeric line inspection requires numeric continuous scales.");
61
+ let run = [];
62
+ const flushRun = () => {
63
+ if (run.length >= 2) {
64
+ const geometry = curveGeometry(curveDefinition, run);
65
+ path.moveTo(geometry.start[0], geometry.start[1]);
66
+ appendCurveForward(path, geometry);
67
+ }
68
+ run = [];
69
+ };
50
70
  for (let i = 0; i < data.length; i++) {
51
71
  const datum = data[i];
52
72
  if (defined && !defined(datum, i, data)) {
53
- previous = void 0;
54
- inRun = false;
73
+ flushRun();
74
+ runId++;
55
75
  continue;
56
76
  }
57
77
  const xv = x(datum, i, data), yv = y(datum, i, data);
58
- if (typeof xv !== "number" || typeof yv !== "number" || !Number.isFinite(xv) || !Number.isFinite(yv)) {
59
- previous = void 0;
60
- inRun = false;
78
+ const px = mapSeriesPosition(xScale, xv), py = mapSeriesPosition(yScale, yv);
79
+ if (px === void 0 || py === void 0) {
80
+ flushRun();
81
+ runId++;
61
82
  continue;
62
83
  }
63
- const point = [xScale.map(xv), yScale.map(yv)];
64
- if (previous) {
65
- if (!inRun) path.moveTo(previous[0], previous[1]);
66
- path.lineTo(point[0], point[1]);
67
- inRun = true;
68
- }
69
- previous = point;
84
+ captured?.push(Object.freeze({ datum, sourceIndex: i, domainX: xv, domainY: yv, anchorLocal: Object.freeze({ x: px, y: py }), run: runId }));
85
+ const point = [px, py];
86
+ run.push(point);
70
87
  }
88
+ flushRun();
89
+ if (inspection && xScale.type !== "point" && yScale.type !== "point") inspection.capture({ observations: captured, xScale, yScale });
71
90
  return /* @__PURE__ */ jsx(
72
91
  Path,
73
92
  {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/features/viz/lib/line-series.tsx"],
4
- "sourcesContent": ["import { Path, resolveSignalValue } from \"@pibbl/core\";\nimport { useInternalValueMemoSlot } from \"@pibbl/core/internal\";\nimport type { LineAccessor, LineCoordinate, LineSeriesProps } from \"./types.js\";\nimport { useContinuousScale } from \"./use-continuous-scale.js\";\nimport { width, opacity } from \"./paint.js\";\nfunction accessor<D>(\n input: LineAccessor<D>,\n): (datum: D, index: number, data: readonly D[]) => LineCoordinate {\n return typeof input === \"function\"\n ? input\n : (datum) => datum[input] as LineCoordinate;\n}\n/**\n * Draws a scaled line through defined data values, leaving gaps for undefined values.\n *\n * @param props - Data, coordinate accessors, scales, and line styling. See {@link LineSeriesProps}\n * .\n * @returns Pibbl nodes drawing the data as a line series.\n *\n * @see {@link LineSeriesProps}\n */\nexport function LineSeries<D>({\n data: dataInput,\n x: xInput,\n y: yInput,\n xScale: xId,\n yScale: yId,\n defined,\n curve,\n style: styleInput,\n ...eventProps\n}: LineSeriesProps<D>) {\n const xScale = useContinuousScale(xId).get();\n const yScale = useContinuousScale(yId).get();\n const x = useInternalValueMemoSlot(\"vizXAccessor\", () => accessor(xInput), [\n xInput,\n ]);\n const y = useInternalValueMemoSlot(\"vizYAccessor\", () => accessor(yInput), [\n yInput,\n ]);\n if (curve !== undefined && curve !== \"linear\")\n throw new TypeError('LineSeries supports curve=\"linear\" only.');\n const data = resolveSignalValue(dataInput);\n if (!Array.isArray(data))\n throw new TypeError(\n \"LineSeries data must be an array or a signal containing an array.\",\n );\n const style = resolveSignalValue(styleInput) ?? {};\n const stroke = resolveSignalValue(style.stroke) ?? \"#2563eb\";\n const strokeWidth = width(\n resolveSignalValue(style.strokeWidth) ?? 2,\n \"LineSeries\",\n );\n const alpha = opacity(resolveSignalValue(style.opacity) ?? 1, \"LineSeries\");\n const cursor = resolveSignalValue(style.cursor);\n const lineInteractionWidth = width(\n resolveSignalValue(style.lineInteractionWidth) ?? strokeWidth,\n \"LineSeries\",\n );\n const path = new Path2D();\n let previous: readonly [number, number] | undefined;\n let inRun = false;\n for (let i = 0; i < data.length; i++) {\n const datum = data[i];\n if (defined && !defined(datum, i, data)) {\n previous = undefined;\n inRun = false;\n continue;\n }\n const xv = x(datum, i, data),\n yv = y(datum, i, data);\n if (\n typeof xv !== \"number\" ||\n typeof yv !== \"number\" ||\n !Number.isFinite(xv) ||\n !Number.isFinite(yv)\n ) {\n previous = undefined;\n inRun = false;\n continue;\n }\n const point = [xScale.map(xv), yScale.map(yv)] as const;\n if (previous) {\n if (!inRun) path.moveTo(previous[0], previous[1]);\n path.lineTo(point[0], point[1]);\n inRun = true;\n }\n previous = point;\n }\n return (\n <Path\n {...eventProps}\n style={{\n d: path,\n stroke,\n strokeWidth,\n opacity: alpha,\n cursor,\n lineInteractionWidth,\n }}\n />\n );\n}\n"],
5
- "mappings": "AA0FI;AA1FJ,SAAS,MAAM,0BAA0B;AACzC,SAAS,gCAAgC;AAEzC,SAAS,0BAA0B;AACnC,SAAS,OAAO,eAAe;AAC/B,SAAS,SACP,OACiE;AACjE,SAAO,OAAO,UAAU,aACpB,QACA,CAAC,UAAU,MAAM,KAAK;AAC5B;AAUO,SAAS,WAAc;AAAA,EAC5B,MAAM;AAAA,EACN,GAAG;AAAA,EACH,GAAG;AAAA,EACH,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,GAAG;AACL,GAAuB;AACrB,QAAM,SAAS,mBAAmB,GAAG,EAAE,IAAI;AAC3C,QAAM,SAAS,mBAAmB,GAAG,EAAE,IAAI;AAC3C,QAAM,IAAI,yBAAyB,gBAAgB,MAAM,SAAS,MAAM,GAAG;AAAA,IACzE;AAAA,EACF,CAAC;AACD,QAAM,IAAI,yBAAyB,gBAAgB,MAAM,SAAS,MAAM,GAAG;AAAA,IACzE;AAAA,EACF,CAAC;AACD,MAAI,UAAU,UAAa,UAAU;AACnC,UAAM,IAAI,UAAU,0CAA0C;AAChE,QAAM,OAAO,mBAAmB,SAAS;AACzC,MAAI,CAAC,MAAM,QAAQ,IAAI;AACrB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AACF,QAAM,QAAQ,mBAAmB,UAAU,KAAK,CAAC;AACjD,QAAM,SAAS,mBAAmB,MAAM,MAAM,KAAK;AACnD,QAAM,cAAc;AAAA,IAClB,mBAAmB,MAAM,WAAW,KAAK;AAAA,IACzC;AAAA,EACF;AACA,QAAM,QAAQ,QAAQ,mBAAmB,MAAM,OAAO,KAAK,GAAG,YAAY;AAC1E,QAAM,SAAS,mBAAmB,MAAM,MAAM;AAC9C,QAAM,uBAAuB;AAAA,IAC3B,mBAAmB,MAAM,oBAAoB,KAAK;AAAA,IAClD;AAAA,EACF;AACA,QAAM,OAAO,IAAI,OAAO;AACxB,MAAI;AACJ,MAAI,QAAQ;AACZ,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,UAAM,QAAQ,KAAK,CAAC;AACpB,QAAI,WAAW,CAAC,QAAQ,OAAO,GAAG,IAAI,GAAG;AACvC,iBAAW;AACX,cAAQ;AACR;AAAA,IACF;AACA,UAAM,KAAK,EAAE,OAAO,GAAG,IAAI,GACzB,KAAK,EAAE,OAAO,GAAG,IAAI;AACvB,QACE,OAAO,OAAO,YACd,OAAO,OAAO,YACd,CAAC,OAAO,SAAS,EAAE,KACnB,CAAC,OAAO,SAAS,EAAE,GACnB;AACA,iBAAW;AACX,cAAQ;AACR;AAAA,IACF;AACA,UAAM,QAAQ,CAAC,OAAO,IAAI,EAAE,GAAG,OAAO,IAAI,EAAE,CAAC;AAC7C,QAAI,UAAU;AACZ,UAAI,CAAC,MAAO,MAAK,OAAO,SAAS,CAAC,GAAG,SAAS,CAAC,CAAC;AAChD,WAAK,OAAO,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC;AAC9B,cAAQ;AAAA,IACV;AACA,eAAW;AAAA,EACb;AACA,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,OAAO;AAAA,QACL,GAAG;AAAA,QACH;AAAA,QACA;AAAA,QACA,SAAS;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA;AAAA,EACF;AAEJ;",
4
+ "sourcesContent": ["import { Path, resolveSignalValue } from \"@pibbl/core\";\nimport { useInternalValueMemoSlot } from \"@pibbl/core/internal\";\nimport type { LineSeriesProps } from \"./types.js\";\nimport {\n appendCurveForward,\n curveGeometry,\n resolveSeriesCurve,\n} from \"./curve-definition.js\";\nimport {\n useSeriesPosition,\n seriesAccessor,\n mapSeriesPosition,\n} from \"./series-position.js\";\nimport { width, opacity } from \"./paint.js\";\n/**\n * Draws a scaled line through defined data values, leaving gaps for undefined values.\n *\n * @param props - Data, coordinate accessors, scales, and line styling. See {@link LineSeriesProps}\n * .\n * @returns Pibbl nodes drawing the data as a line series.\n *\n * @see {@link LineSeriesProps}\n */\nexport function LineSeries<D>({\n data: dataInput,\n x: xInput,\n y: yInput,\n xScale: xId,\n yScale: yId,\n defined,\n inspection,\n curve,\n style: styleInput,\n ...eventProps\n}: LineSeriesProps<D>) {\n const xScale = useSeriesPosition(xId);\n const yScale = useSeriesPosition(yId);\n const x = useInternalValueMemoSlot(\n \"vizXAccessor\",\n () => seriesAccessor(xInput),\n [xInput],\n );\n const y = useInternalValueMemoSlot(\n \"vizYAccessor\",\n () => seriesAccessor(yInput),\n [yInput],\n );\n const curveDefinition = resolveSeriesCurve(curve);\n const data = resolveSignalValue(dataInput);\n if (!Array.isArray(data))\n throw new TypeError(\n \"LineSeries data must be an array or a signal containing an array.\",\n );\n const style = resolveSignalValue(styleInput) ?? {};\n const stroke = resolveSignalValue(style.stroke) ?? \"#2563eb\";\n const strokeWidth = width(\n resolveSignalValue(style.strokeWidth) ?? 2,\n \"LineSeries\",\n );\n const alpha = opacity(resolveSignalValue(style.opacity) ?? 1, \"LineSeries\");\n const cursor = resolveSignalValue(style.cursor);\n const lineInteractionWidth = width(\n resolveSignalValue(style.lineInteractionWidth) ?? strokeWidth,\n \"LineSeries\",\n );\n const path = new Path2D();\n const captured: import(\"../inspection/capture-types.js\").CapturedNumericObservation<D>[] | undefined = inspection ? [] : undefined;\n let runId = 0;\n if (inspection && (xScale.type === \"point\" || yScale.type === \"point\")) throw new TypeError(\"Numeric line inspection requires numeric continuous scales.\");\n let run: (readonly [number, number])[] = [];\n const flushRun = () => {\n if (run.length >= 2) {\n const geometry = curveGeometry(curveDefinition, run);\n path.moveTo(geometry.start[0], geometry.start[1]);\n appendCurveForward(path, geometry);\n }\n run = [];\n };\n for (let i = 0; i < data.length; i++) {\n const datum = data[i];\n if (defined && !defined(datum, i, data)) {\n flushRun();\n runId++;\n continue;\n }\n const xv = x(datum, i, data),\n yv = y(datum, i, data);\n const px = mapSeriesPosition(xScale, xv),\n py = mapSeriesPosition(yScale, yv);\n if (px === undefined || py === undefined) {\n flushRun();\n runId++;\n continue;\n }\n captured?.push(Object.freeze({datum,sourceIndex:i,domainX:xv as number,domainY:yv as number,anchorLocal:Object.freeze({x:px,y:py}),run:runId}));\n const point = [px, py] as const;\n run.push(point);\n }\n flushRun();\n if (inspection && xScale.type !== \"point\" && yScale.type !== \"point\") inspection.capture({observations:captured!,xScale,yScale});\n return (\n <Path\n {...eventProps}\n style={{\n d: path,\n stroke,\n strokeWidth,\n opacity: alpha,\n cursor,\n lineInteractionWidth,\n }}\n />\n );\n}\n"],
5
+ "mappings": "AAqGI;AArGJ,SAAS,MAAM,0BAA0B;AACzC,SAAS,gCAAgC;AAEzC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,OAAO,eAAe;AAUxB,SAAS,WAAc;AAAA,EAC5B,MAAM;AAAA,EACN,GAAG;AAAA,EACH,GAAG;AAAA,EACH,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,GAAG;AACL,GAAuB;AACrB,QAAM,SAAS,kBAAkB,GAAG;AACpC,QAAM,SAAS,kBAAkB,GAAG;AACpC,QAAM,IAAI;AAAA,IACR;AAAA,IACA,MAAM,eAAe,MAAM;AAAA,IAC3B,CAAC,MAAM;AAAA,EACT;AACA,QAAM,IAAI;AAAA,IACR;AAAA,IACA,MAAM,eAAe,MAAM;AAAA,IAC3B,CAAC,MAAM;AAAA,EACT;AACA,QAAM,kBAAkB,mBAAmB,KAAK;AAChD,QAAM,OAAO,mBAAmB,SAAS;AACzC,MAAI,CAAC,MAAM,QAAQ,IAAI;AACrB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AACF,QAAM,QAAQ,mBAAmB,UAAU,KAAK,CAAC;AACjD,QAAM,SAAS,mBAAmB,MAAM,MAAM,KAAK;AACnD,QAAM,cAAc;AAAA,IAClB,mBAAmB,MAAM,WAAW,KAAK;AAAA,IACzC;AAAA,EACF;AACA,QAAM,QAAQ,QAAQ,mBAAmB,MAAM,OAAO,KAAK,GAAG,YAAY;AAC1E,QAAM,SAAS,mBAAmB,MAAM,MAAM;AAC9C,QAAM,uBAAuB;AAAA,IAC3B,mBAAmB,MAAM,oBAAoB,KAAK;AAAA,IAClD;AAAA,EACF;AACA,QAAM,OAAO,IAAI,OAAO;AACxB,QAAM,WAAiG,aAAa,CAAC,IAAI;AACzH,MAAI,QAAQ;AACZ,MAAI,eAAe,OAAO,SAAS,WAAW,OAAO,SAAS,SAAU,OAAM,IAAI,UAAU,6DAA6D;AACzJ,MAAI,MAAqC,CAAC;AAC1C,QAAM,WAAW,MAAM;AACrB,QAAI,IAAI,UAAU,GAAG;AACnB,YAAM,WAAW,cAAc,iBAAiB,GAAG;AACnD,WAAK,OAAO,SAAS,MAAM,CAAC,GAAG,SAAS,MAAM,CAAC,CAAC;AAChD,yBAAmB,MAAM,QAAQ;AAAA,IACnC;AACA,UAAM,CAAC;AAAA,EACT;AACA,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,UAAM,QAAQ,KAAK,CAAC;AACpB,QAAI,WAAW,CAAC,QAAQ,OAAO,GAAG,IAAI,GAAG;AACvC,eAAS;AACT;AACA;AAAA,IACF;AACA,UAAM,KAAK,EAAE,OAAO,GAAG,IAAI,GACzB,KAAK,EAAE,OAAO,GAAG,IAAI;AACvB,UAAM,KAAK,kBAAkB,QAAQ,EAAE,GACrC,KAAK,kBAAkB,QAAQ,EAAE;AACnC,QAAI,OAAO,UAAa,OAAO,QAAW;AACxC,eAAS;AACT;AACA;AAAA,IACF;AACA,cAAU,KAAK,OAAO,OAAO,EAAC,OAAM,aAAY,GAAE,SAAQ,IAAa,SAAQ,IAAa,aAAY,OAAO,OAAO,EAAC,GAAE,IAAG,GAAE,GAAE,CAAC,GAAE,KAAI,MAAK,CAAC,CAAC;AAC9I,UAAM,QAAQ,CAAC,IAAI,EAAE;AACrB,QAAI,KAAK,KAAK;AAAA,EAChB;AACA,WAAS;AACT,MAAI,cAAc,OAAO,SAAS,WAAW,OAAO,SAAS,QAAS,YAAW,QAAQ,EAAC,cAAa,UAAU,QAAO,OAAM,CAAC;AAC/H,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,OAAO;AAAA,QACL,GAAG;AAAA,QACH;AAAA,QACA;AAAA,QACA,SAAS;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA;AAAA,EACF;AAEJ;",
6
6
  "names": []
7
7
  }
@@ -61,7 +61,7 @@ function resolveLinearScale(domainInput, rangeInput, reverse, width, height) {
61
61
  });
62
62
  }
63
63
  function equalScale(a, b) {
64
- return a.type === b.type && (a.type !== "symlog" || b.type === "symlog" && a.constant === b.constant) && (a.type !== "point" || b.type === "point" && a.padding === b.padding) && (a.type !== "log" || b.type === "log" && a.base === b.base) && a.domain.length === b.domain.length && a.domain.every((value, index) => Object.is(value, b.domain[index])) && (a.type !== "band" || b.type === "band" && a.bandwidth === b.bandwidth && a.step === b.step) && Object.is(a.range[0], b.range[0]) && Object.is(a.range[1], b.range[1]) && Object.is(a.frame.width, b.frame.width) && Object.is(a.frame.height, b.frame.height);
64
+ return a.type === b.type && (a.type !== "trading-time" || b.type === "trading-time" && a.logicalRange.every((v, i) => v === b.logicalRange[i])) && (a.type !== "symlog" || b.type === "symlog" && a.constant === b.constant) && (a.type !== "point" || b.type === "point" && a.padding === b.padding) && (a.type !== "log" || b.type === "log" && a.base === b.base) && a.domain.length === b.domain.length && a.domain.every((value, index) => Object.is(value, b.domain[index])) && (a.type !== "band" || b.type === "band" && a.bandwidth === b.bandwidth && a.step === b.step) && Object.is(a.range[0], b.range[0]) && Object.is(a.range[1], b.range[1]) && Object.is(a.frame.width, b.frame.width) && Object.is(a.frame.height, b.frame.height);
65
65
  }
66
66
  export {
67
67
  equalScale,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/features/viz/lib/linear-scale.ts"],
4
- "sourcesContent": ["import type {\n LinearDomain,\n ResolvedLinearScale,\n ResolvedScale,\n ScaleRange,\n} from \"./types.js\";\nfunction finite(value: number, field: string): number {\n if (typeof value !== \"number\" || !Number.isFinite(value))\n throw new RangeError(`Scale ${field} must be finite.`);\n return value;\n}\nfunction pair(\n value: readonly number[],\n field: string,\n): readonly [number, number] {\n if (!Array.isArray(value) || value.length !== 2)\n throw new RangeError(`Scale ${field} requires two finite endpoints.`);\n return Object.freeze([finite(value[0], field), finite(value[1], field)]);\n}\nexport function resolveLinearScale(\n domainInput: LinearDomain,\n rangeInput: ScaleRange,\n reverse: boolean,\n width: number,\n height: number,\n): ResolvedLinearScale {\n finite(width, \"frame.width\");\n finite(height, \"frame.height\");\n if (width < 0 || height < 0)\n throw new RangeError(\"Scale allocation must be nonnegative.\");\n if (typeof reverse !== \"boolean\")\n throw new TypeError(\"Scale reverse must be boolean.\");\n const domain = pair(domainInput, \"domain\");\n if (domain[0] === domain[1])\n throw new RangeError(\"Scale domain endpoints must differ.\");\n const original = pair(\n rangeInput === \"width\"\n ? [0, width]\n : rangeInput === \"height\"\n ? [0, height]\n : (rangeInput as readonly number[]),\n \"range\",\n );\n const range = reverse ? pair([original[1], original[0]], \"range\") : original;\n const domainSpan = finite(domain[1] - domain[0], \"domain span\");\n const rangeSpan = finite(range[1] - range[0], \"range span\");\n return Object.freeze({\n type: \"linear\",\n domain,\n range,\n frame: Object.freeze({ x: 0, y: 0, width, height }),\n map(value: number) {\n return finite(\n range[0] +\n ((finite(value, \"map input\") - domain[0]) / domainSpan) * rangeSpan,\n \"mapped output\",\n );\n },\n invert(pixel: number) {\n if (rangeSpan === 0)\n throw new RangeError(\n \"Scale cannot invert a collapsed range; supply a nonzero extent.\",\n );\n return finite(\n domain[0] +\n ((finite(pixel, \"invert input\") - range[0]) / rangeSpan) * domainSpan,\n \"inverted output\",\n );\n },\n ticks(count = 5) {\n if (!Number.isInteger(count) || count < 2 || count > 100)\n throw new RangeError(\n \"Scale ticks count must be an integer from 2 to 100.\",\n );\n return Object.freeze(\n Array.from({ length: count }, (_, i) =>\n i === count - 1\n ? domain[1]\n : finite(domain[0] + (domainSpan * i) / (count - 1), \"tick\"),\n ),\n );\n },\n });\n}\nexport function equalScale(a: ResolvedScale, b: ResolvedScale): boolean {\n return (\n a.type === b.type &&\n (a.type !== \"symlog\" || (b.type === \"symlog\" && a.constant === b.constant)) &&\n (a.type !== \"point\" || (b.type === \"point\" && a.padding === b.padding)) &&\n (a.type !== \"log\" || (b.type === \"log\" && a.base === b.base)) &&\n a.domain.length === b.domain.length &&\n a.domain.every((value, index) => Object.is(value, b.domain[index])) &&\n (a.type !== \"band\" ||\n (b.type === \"band\" &&\n a.bandwidth === b.bandwidth &&\n a.step === b.step)) &&\n Object.is(a.range[0], b.range[0]) &&\n Object.is(a.range[1], b.range[1]) &&\n Object.is(a.frame.width, b.frame.width) &&\n Object.is(a.frame.height, b.frame.height)\n );\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type {\n LinearDomain,\n ResolvedLinearScale,\n ResolvedScale,\n ScaleRange,\n} from \"./types.js\";\nfunction finite(value: number, field: string): number {\n if (typeof value !== \"number\" || !Number.isFinite(value))\n throw new RangeError(`Scale ${field} must be finite.`);\n return value;\n}\nfunction pair(\n value: readonly number[],\n field: string,\n): readonly [number, number] {\n if (!Array.isArray(value) || value.length !== 2)\n throw new RangeError(`Scale ${field} requires two finite endpoints.`);\n return Object.freeze([finite(value[0], field), finite(value[1], field)]);\n}\nexport function resolveLinearScale(\n domainInput: LinearDomain,\n rangeInput: ScaleRange,\n reverse: boolean,\n width: number,\n height: number,\n): ResolvedLinearScale {\n finite(width, \"frame.width\");\n finite(height, \"frame.height\");\n if (width < 0 || height < 0)\n throw new RangeError(\"Scale allocation must be nonnegative.\");\n if (typeof reverse !== \"boolean\")\n throw new TypeError(\"Scale reverse must be boolean.\");\n const domain = pair(domainInput, \"domain\");\n if (domain[0] === domain[1])\n throw new RangeError(\"Scale domain endpoints must differ.\");\n const original = pair(\n rangeInput === \"width\"\n ? [0, width]\n : rangeInput === \"height\"\n ? [0, height]\n : (rangeInput as readonly number[]),\n \"range\",\n );\n const range = reverse ? pair([original[1], original[0]], \"range\") : original;\n const domainSpan = finite(domain[1] - domain[0], \"domain span\");\n const rangeSpan = finite(range[1] - range[0], \"range span\");\n return Object.freeze({\n type: \"linear\",\n domain,\n range,\n frame: Object.freeze({ x: 0, y: 0, width, height }),\n map(value: number) {\n return finite(\n range[0] +\n ((finite(value, \"map input\") - domain[0]) / domainSpan) * rangeSpan,\n \"mapped output\",\n );\n },\n invert(pixel: number) {\n if (rangeSpan === 0)\n throw new RangeError(\n \"Scale cannot invert a collapsed range; supply a nonzero extent.\",\n );\n return finite(\n domain[0] +\n ((finite(pixel, \"invert input\") - range[0]) / rangeSpan) * domainSpan,\n \"inverted output\",\n );\n },\n ticks(count = 5) {\n if (!Number.isInteger(count) || count < 2 || count > 100)\n throw new RangeError(\n \"Scale ticks count must be an integer from 2 to 100.\",\n );\n return Object.freeze(\n Array.from({ length: count }, (_, i) =>\n i === count - 1\n ? domain[1]\n : finite(domain[0] + (domainSpan * i) / (count - 1), \"tick\"),\n ),\n );\n },\n });\n}\nexport function equalScale(a: ResolvedScale, b: ResolvedScale): boolean {\n return (\n a.type === b.type &&\n (a.type !== \"trading-time\" ||\n (b.type === \"trading-time\" &&\n a.logicalRange.every((v, i) => v === b.logicalRange[i]))) &&\n (a.type !== \"symlog\" ||\n (b.type === \"symlog\" && a.constant === b.constant)) &&\n (a.type !== \"point\" || (b.type === \"point\" && a.padding === b.padding)) &&\n (a.type !== \"log\" || (b.type === \"log\" && a.base === b.base)) &&\n a.domain.length === b.domain.length &&\n a.domain.every((value, index) => Object.is(value, b.domain[index])) &&\n (a.type !== \"band\" ||\n (b.type === \"band\" &&\n a.bandwidth === b.bandwidth &&\n a.step === b.step)) &&\n Object.is(a.range[0], b.range[0]) &&\n Object.is(a.range[1], b.range[1]) &&\n Object.is(a.frame.width, b.frame.width) &&\n Object.is(a.frame.height, b.frame.height)\n );\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,11 @@
1
+ import { type SeriesCurve } from "./curve-definition.js";
2
+ /**
3
+ * Returns the immutable monotone-X cubic Hermite definition.
4
+ *
5
+ * It uses weighted harmonic interior slopes and limited one-sided endpoint slopes, preserving every observation,
6
+ * flat segment, and local extremum without sorting data. Each run must have strictly ascending
7
+ * or strictly descending x coordinates.
8
+ *
9
+ * @returns The named {@link SeriesCurve} definition.
10
+ */
11
+ export declare function monotoneX(): SeriesCurve;