@pibbl/core 0.0.1 → 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 (683) hide show
  1. package/README.md +1 -1
  2. package/THIRD_PARTY_NOTICES.txt +81 -0
  3. package/dist/features/machines/animation.d.ts +64 -0
  4. package/dist/features/machines/animation.js +55 -0
  5. package/dist/features/machines/animation.js.map +7 -0
  6. package/dist/features/machines/animation.mjs +1 -0
  7. package/dist/features/machines/assign.d.ts +16 -0
  8. package/dist/features/machines/assign.js +15 -0
  9. package/dist/features/machines/assign.js.map +7 -0
  10. package/dist/features/machines/callback.d.ts +9 -0
  11. package/dist/features/machines/callback.js +7 -0
  12. package/dist/features/machines/callback.js.map +7 -0
  13. package/dist/features/machines/hook.d.ts +30 -0
  14. package/dist/features/machines/hook.js +37 -0
  15. package/dist/features/machines/hook.js.map +7 -0
  16. package/dist/features/machines/index.d.ts +6 -0
  17. package/dist/features/machines/index.js +12 -0
  18. package/dist/features/machines/index.js.map +7 -0
  19. package/dist/features/machines/index.mjs +1 -0
  20. package/dist/features/machines/runtime.d.ts +18 -0
  21. package/dist/features/machines/runtime.js +363 -0
  22. package/dist/features/machines/runtime.js.map +7 -0
  23. package/dist/features/machines/types.d.ts +164 -0
  24. package/dist/features/physics/2d-geometry.d.ts +3 -3
  25. package/dist/features/physics/2d-geometry.js.map +1 -1
  26. package/dist/features/physics/2d-testing.d.ts +1 -1
  27. package/dist/features/physics/2d-testing.js +2 -2
  28. package/dist/features/physics/2d-testing.js.map +2 -2
  29. package/dist/features/physics/2d.d.ts +115 -62
  30. package/dist/features/physics/2d.js +59 -28
  31. package/dist/features/physics/2d.js.map +2 -2
  32. package/dist/features/physics/lib/2d/canvas/components.js +25 -21
  33. package/dist/features/physics/lib/2d/canvas/components.js.map +2 -2
  34. package/dist/features/physics/lib/2d/canvas/presentation.js +1 -2
  35. package/dist/features/physics/lib/2d/canvas/presentation.js.map +2 -2
  36. package/dist/features/physics/lib/2d/collision/casts.js +4 -2
  37. package/dist/features/physics/lib/2d/collision/casts.js.map +2 -2
  38. package/dist/features/physics/lib/2d/query-types.d.ts +6 -0
  39. package/dist/features/physics/lib/2d/runtime/controller.d.ts +7 -6
  40. package/dist/features/physics/lib/2d/runtime/controller.js +1 -1
  41. package/dist/features/physics/lib/2d/runtime/controller.js.map +2 -2
  42. package/dist/features/physics/lib/2d/runtime/obstacles.js +9 -11
  43. package/dist/features/physics/lib/2d/runtime/obstacles.js.map +2 -2
  44. package/dist/features/physics/lib/2d/shapes.js +8 -9
  45. package/dist/features/physics/lib/2d/shapes.js.map +2 -2
  46. package/dist/features/physics/lib/2d/types.d.ts +8 -30
  47. package/dist/features/physics/lib/2d/world/queries.d.ts +7 -6
  48. package/dist/features/physics/lib/2d/world/queries.js.map +2 -2
  49. package/dist/features/physics/lib/2d/world/rapier.js +22 -26
  50. package/dist/features/physics/lib/2d/world/rapier.js.map +2 -2
  51. package/dist/features/sprites/formats/aseprite.d.ts +5 -0
  52. package/dist/features/sprites/formats/texture-packer.d.ts +5 -0
  53. package/dist/features/sprites/index.d.ts +6 -0
  54. package/dist/features/sprites/loader.d.ts +25 -0
  55. package/dist/features/sprites/loader.js +6 -3
  56. package/dist/features/sprites/loader.js.map +2 -2
  57. package/dist/features/sprites/model.d.ts +75 -0
  58. package/dist/features/sprites/sprite.d.ts +22 -0
  59. package/dist/features/textures/index.d.ts +12 -2
  60. package/dist/features/textures/index.js +33 -1
  61. package/dist/features/textures/index.js.map +2 -2
  62. package/dist/features/textures/lib/chemical-field.d.ts +56 -0
  63. package/dist/features/textures/lib/chemical-field.js +154 -0
  64. package/dist/features/textures/lib/chemical-field.js.map +7 -0
  65. package/dist/features/textures/lib/chemical-recipes.d.ts +119 -0
  66. package/dist/features/textures/lib/chemical-recipes.js +275 -0
  67. package/dist/features/textures/lib/chemical-recipes.js.map +7 -0
  68. package/dist/features/textures/lib/definitions.d.ts +3 -18
  69. package/dist/features/textures/lib/definitions.js +17 -24
  70. package/dist/features/textures/lib/definitions.js.map +2 -2
  71. package/dist/features/textures/lib/geometric-patterns.d.ts +149 -0
  72. package/dist/features/textures/lib/geometric-patterns.js +305 -0
  73. package/dist/features/textures/lib/geometric-patterns.js.map +7 -0
  74. package/dist/features/textures/lib/gray-scott.d.ts +55 -0
  75. package/dist/features/textures/lib/gray-scott.js +37 -0
  76. package/dist/features/textures/lib/gray-scott.js.map +7 -0
  77. package/dist/features/textures/lib/palette.js +1 -3
  78. package/dist/features/textures/lib/palette.js.map +2 -2
  79. package/dist/features/textures/lib/patterns.d.ts +123 -0
  80. package/dist/features/textures/lib/patterns.js +344 -0
  81. package/dist/features/textures/lib/patterns.js.map +7 -0
  82. package/dist/features/textures/lib/rain-drops.js +2 -1
  83. package/dist/features/textures/lib/rain-drops.js.map +2 -2
  84. package/dist/features/textures/lib/reaction-diffusion.d.ts +3 -2
  85. package/dist/features/textures/lib/reaction-diffusion.js +9 -20
  86. package/dist/features/textures/lib/reaction-diffusion.js.map +2 -2
  87. package/dist/features/textures/lib/simulation.d.ts +10 -4
  88. package/dist/features/textures/lib/simulation.js +23 -13
  89. package/dist/features/textures/lib/simulation.js.map +2 -2
  90. package/dist/features/textures/lib/wasm/electric.js +8 -1
  91. package/dist/features/textures/lib/wasm/electric.js.map +2 -2
  92. package/dist/features/textures/lib/water-surface.js +1 -3
  93. package/dist/features/textures/lib/water-surface.js.map +2 -2
  94. package/dist/features/viz/index.d.ts +92 -5
  95. package/dist/features/viz/index.js +202 -4
  96. package/dist/features/viz/index.js.map +2 -2
  97. package/dist/features/viz/inspection/bar.d.ts +79 -0
  98. package/dist/features/viz/inspection/bar.js +49 -0
  99. package/dist/features/viz/inspection/bar.js.map +7 -0
  100. package/dist/features/viz/inspection/candle.d.ts +156 -0
  101. package/dist/features/viz/inspection/candle.js +120 -0
  102. package/dist/features/viz/inspection/candle.js.map +7 -0
  103. package/dist/features/viz/inspection/capture-types.d.ts +65 -0
  104. package/dist/features/viz/inspection/capture.d.ts +16 -0
  105. package/dist/features/viz/inspection/capture.js +49 -0
  106. package/dist/features/viz/inspection/capture.js.map +7 -0
  107. package/dist/features/viz/inspection/handler.d.ts +36 -0
  108. package/dist/features/viz/inspection/handler.js +91 -0
  109. package/dist/features/viz/inspection/handler.js.map +7 -0
  110. package/dist/features/viz/inspection/ohlc-bar.d.ts +132 -0
  111. package/dist/features/viz/inspection/ohlc-bar.js +118 -0
  112. package/dist/features/viz/inspection/ohlc-bar.js.map +7 -0
  113. package/dist/features/viz/inspection/owned-ref.d.ts +16 -0
  114. package/dist/features/viz/inspection/owned-ref.js +99 -0
  115. package/dist/features/viz/inspection/owned-ref.js.map +7 -0
  116. package/dist/features/viz/inspection/painted-point.d.ts +22 -0
  117. package/dist/features/viz/inspection/painted-point.js +29 -0
  118. package/dist/features/viz/inspection/painted-point.js.map +7 -0
  119. package/dist/features/viz/inspection/queries.d.ts +100 -0
  120. package/dist/features/viz/inspection/queries.js +192 -0
  121. package/dist/features/viz/inspection/queries.js.map +7 -0
  122. package/dist/features/viz/inspection/query-types.d.ts +177 -0
  123. package/dist/features/viz/inspection/volume.d.ts +104 -0
  124. package/dist/features/viz/inspection/volume.js +95 -0
  125. package/dist/features/viz/inspection/volume.js.map +7 -0
  126. package/dist/features/viz/inspection.d.ts +19 -0
  127. package/dist/features/viz/inspection.js +54 -0
  128. package/dist/features/viz/inspection.js.map +7 -0
  129. package/dist/features/viz/inspection.mjs +1 -0
  130. package/dist/features/viz/lib/area-series.d.ts +62 -0
  131. package/dist/features/viz/lib/area-series.js +120 -0
  132. package/dist/features/viz/lib/area-series.js.map +7 -0
  133. package/dist/features/viz/lib/axis-labels.d.ts +2 -0
  134. package/dist/features/viz/lib/axis-labels.js +41 -0
  135. package/dist/features/viz/lib/axis-labels.js.map +7 -0
  136. package/dist/features/viz/lib/axis-title.d.ts +23 -0
  137. package/dist/features/viz/lib/axis-title.js +24 -0
  138. package/dist/features/viz/lib/axis-title.js.map +7 -0
  139. package/dist/features/viz/lib/axis.d.ts +1 -1
  140. package/dist/features/viz/lib/axis.js +50 -50
  141. package/dist/features/viz/lib/axis.js.map +2 -2
  142. package/dist/features/viz/lib/bar-scale.d.ts +7 -0
  143. package/dist/features/viz/lib/bar-scale.js +34 -0
  144. package/dist/features/viz/lib/bar-scale.js.map +7 -0
  145. package/dist/features/viz/lib/bar-series.d.ts +3 -1
  146. package/dist/features/viz/lib/bar-series.js +21 -5
  147. package/dist/features/viz/lib/bar-series.js.map +2 -2
  148. package/dist/features/viz/lib/baseline-series.d.ts +55 -0
  149. package/dist/features/viz/lib/baseline-series.js +136 -0
  150. package/dist/features/viz/lib/baseline-series.js.map +7 -0
  151. package/dist/features/viz/lib/candlestick-series.d.ts +62 -0
  152. package/dist/features/viz/lib/candlestick-series.js +150 -0
  153. package/dist/features/viz/lib/candlestick-series.js.map +7 -0
  154. package/dist/features/viz/lib/censored-point-series.d.ts +71 -0
  155. package/dist/features/viz/lib/censored-point-series.js +129 -0
  156. package/dist/features/viz/lib/censored-point-series.js.map +7 -0
  157. package/dist/features/viz/lib/chart-lines.d.ts +41 -0
  158. package/dist/features/viz/lib/chart-lines.js +32 -0
  159. package/dist/features/viz/lib/chart-lines.js.map +7 -0
  160. package/dist/features/viz/lib/color-context.d.ts +4 -0
  161. package/dist/features/viz/lib/color-context.js +41 -0
  162. package/dist/features/viz/lib/color-context.js.map +7 -0
  163. package/dist/features/viz/lib/color-math.d.ts +4 -0
  164. package/dist/features/viz/lib/color-math.js +31 -0
  165. package/dist/features/viz/lib/color-math.js.map +7 -0
  166. package/dist/features/viz/lib/color-types.d.ts +53 -0
  167. package/dist/features/viz/lib/curve-definition.d.ts +49 -0
  168. package/dist/features/viz/lib/curve-definition.js +142 -0
  169. package/dist/features/viz/lib/curve-definition.js.map +7 -0
  170. package/dist/features/viz/lib/diverging-color-scale.d.ts +11 -0
  171. package/dist/features/viz/lib/diverging-color-scale.js +51 -0
  172. package/dist/features/viz/lib/diverging-color-scale.js.map +7 -0
  173. package/dist/features/viz/lib/domain-navigation.d.ts +40 -0
  174. package/dist/features/viz/lib/domain-navigation.js +77 -0
  175. package/dist/features/viz/lib/domain-navigation.js.map +7 -0
  176. package/dist/features/viz/lib/editable-chart-elements.d.ts +178 -0
  177. package/dist/features/viz/lib/editable-chart-elements.js +733 -0
  178. package/dist/features/viz/lib/editable-chart-elements.js.map +7 -0
  179. package/dist/features/viz/lib/financial-aggregation.d.ts +127 -0
  180. package/dist/features/viz/lib/financial-aggregation.js +116 -0
  181. package/dist/features/viz/lib/financial-aggregation.js.map +7 -0
  182. package/dist/features/viz/lib/financial-autoscale.d.ts +64 -0
  183. package/dist/features/viz/lib/financial-autoscale.js +61 -0
  184. package/dist/features/viz/lib/financial-autoscale.js.map +7 -0
  185. package/dist/features/viz/lib/financial-comparison.d.ts +62 -0
  186. package/dist/features/viz/lib/financial-comparison.js +98 -0
  187. package/dist/features/viz/lib/financial-comparison.js.map +7 -0
  188. package/dist/features/viz/lib/financial-geometry.d.ts +77 -0
  189. package/dist/features/viz/lib/financial-geometry.js +67 -0
  190. package/dist/features/viz/lib/financial-geometry.js.map +7 -0
  191. package/dist/features/viz/lib/financial-indicators.d.ts +114 -0
  192. package/dist/features/viz/lib/financial-indicators.js +135 -0
  193. package/dist/features/viz/lib/financial-indicators.js.map +7 -0
  194. package/dist/features/viz/lib/financial-oscillators.d.ts +171 -0
  195. package/dist/features/viz/lib/financial-oscillators.js +265 -0
  196. package/dist/features/viz/lib/financial-oscillators.js.map +7 -0
  197. package/dist/features/viz/lib/graph/bipartite.d.ts +14 -0
  198. package/dist/features/viz/lib/graph/bipartite.js +250 -0
  199. package/dist/features/viz/lib/graph/bipartite.js.map +7 -0
  200. package/dist/features/viz/lib/graph/chord.d.ts +44 -0
  201. package/dist/features/viz/lib/graph/chord.js +348 -0
  202. package/dist/features/viz/lib/graph/chord.js.map +7 -0
  203. package/dist/features/viz/lib/graph/dependency.d.ts +26 -0
  204. package/dist/features/viz/lib/graph/dependency.js +140 -0
  205. package/dist/features/viz/lib/graph/dependency.js.map +7 -0
  206. package/dist/features/viz/lib/graph/force.d.ts +28 -0
  207. package/dist/features/viz/lib/graph/force.js +580 -0
  208. package/dist/features/viz/lib/graph/force.js.map +7 -0
  209. package/dist/features/viz/lib/graph/hierarchy.d.ts +21 -0
  210. package/dist/features/viz/lib/graph/hierarchy.js +112 -0
  211. package/dist/features/viz/lib/graph/hierarchy.js.map +7 -0
  212. package/dist/features/viz/lib/graph/icicle.d.ts +16 -0
  213. package/dist/features/viz/lib/graph/icicle.js +153 -0
  214. package/dist/features/viz/lib/graph/icicle.js.map +7 -0
  215. package/dist/features/viz/lib/graph/matrix.d.ts +30 -0
  216. package/dist/features/viz/lib/graph/matrix.js +243 -0
  217. package/dist/features/viz/lib/graph/matrix.js.map +7 -0
  218. package/dist/features/viz/lib/graph/neighborhood.d.ts +11 -0
  219. package/dist/features/viz/lib/graph/neighborhood.js +281 -0
  220. package/dist/features/viz/lib/graph/neighborhood.js.map +7 -0
  221. package/dist/features/viz/lib/graph/routes.d.ts +35 -0
  222. package/dist/features/viz/lib/graph/routes.js +101 -0
  223. package/dist/features/viz/lib/graph/routes.js.map +7 -0
  224. package/dist/features/viz/lib/graph/sankey.d.ts +44 -0
  225. package/dist/features/viz/lib/graph/sankey.js +341 -0
  226. package/dist/features/viz/lib/graph/sankey.js.map +7 -0
  227. package/dist/features/viz/lib/graph/shared.d.ts +59 -0
  228. package/dist/features/viz/lib/graph/shared.js +301 -0
  229. package/dist/features/viz/lib/graph/shared.js.map +7 -0
  230. package/dist/features/viz/lib/graph/tree.d.ts +11 -0
  231. package/dist/features/viz/lib/graph/tree.js +232 -0
  232. package/dist/features/viz/lib/graph/tree.js.map +7 -0
  233. package/dist/features/viz/lib/graph/treemap.d.ts +20 -0
  234. package/dist/features/viz/lib/graph/treemap.js +227 -0
  235. package/dist/features/viz/lib/graph/treemap.js.map +7 -0
  236. package/dist/features/viz/lib/graph/types.d.ts +1097 -0
  237. package/dist/features/viz/lib/hover-card.js +8 -9
  238. package/dist/features/viz/lib/hover-card.js.map +2 -2
  239. package/dist/features/viz/lib/hover-data.d.ts +1 -1
  240. package/dist/features/viz/lib/hover-data.js +6 -3
  241. package/dist/features/viz/lib/hover-data.js.map +2 -2
  242. package/dist/features/viz/lib/hover-types.d.ts +5 -5
  243. package/dist/features/viz/lib/interval-band-series.d.ts +49 -0
  244. package/dist/features/viz/lib/interval-band-series.js +136 -0
  245. package/dist/features/viz/lib/interval-band-series.js.map +7 -0
  246. package/dist/features/viz/lib/interval-diamond-series.d.ts +43 -0
  247. package/dist/features/viz/lib/interval-diamond-series.js +122 -0
  248. package/dist/features/viz/lib/interval-diamond-series.js.map +7 -0
  249. package/dist/features/viz/lib/interval-series.d.ts +79 -0
  250. package/dist/features/viz/lib/interval-series.js +158 -0
  251. package/dist/features/viz/lib/interval-series.js.map +7 -0
  252. package/dist/features/viz/lib/layout-pie.js +9 -13
  253. package/dist/features/viz/lib/layout-pie.js.map +2 -2
  254. package/dist/features/viz/lib/line-series.d.ts +1 -1
  255. package/dist/features/viz/lib/line-series.js +47 -28
  256. package/dist/features/viz/lib/line-series.js.map +2 -2
  257. package/dist/features/viz/lib/linear-scale-component.d.ts +7 -0
  258. package/dist/features/viz/lib/linear-scale-component.js +18 -0
  259. package/dist/features/viz/lib/linear-scale-component.js.map +7 -0
  260. package/dist/features/viz/lib/linear-scale.js +1 -1
  261. package/dist/features/viz/lib/linear-scale.js.map +2 -2
  262. package/dist/features/viz/lib/log-scale-component.d.ts +7 -0
  263. package/dist/features/viz/lib/log-scale-component.js +19 -0
  264. package/dist/features/viz/lib/log-scale-component.js.map +7 -0
  265. package/dist/features/viz/lib/log-scale.d.ts +2 -0
  266. package/dist/features/viz/lib/log-scale.js +53 -0
  267. package/dist/features/viz/lib/log-scale.js.map +7 -0
  268. package/dist/features/viz/lib/monotone-curve.d.ts +11 -0
  269. package/dist/features/viz/lib/monotone-curve.js +63 -0
  270. package/dist/features/viz/lib/monotone-curve.js.map +7 -0
  271. package/dist/features/viz/lib/nearest.d.ts +9 -9
  272. package/dist/features/viz/lib/nearest.js.map +1 -1
  273. package/dist/features/viz/lib/numeric-range-interpolation.d.ts +15 -0
  274. package/dist/features/viz/lib/numeric-range-interpolation.js +36 -0
  275. package/dist/features/viz/lib/numeric-range-interpolation.js.map +7 -0
  276. package/dist/features/viz/lib/numeric-ticks.d.ts +38 -0
  277. package/dist/features/viz/lib/numeric-ticks.js +54 -0
  278. package/dist/features/viz/lib/numeric-ticks.js.map +7 -0
  279. package/dist/features/viz/lib/ohlc-bar-series.d.ts +55 -0
  280. package/dist/features/viz/lib/ohlc-bar-series.js +168 -0
  281. package/dist/features/viz/lib/ohlc-bar-series.js.map +7 -0
  282. package/dist/features/viz/lib/paired-series.d.ts +44 -0
  283. package/dist/features/viz/lib/paired-series.js +93 -0
  284. package/dist/features/viz/lib/paired-series.js.map +7 -0
  285. package/dist/features/viz/lib/pie-layout.js +2 -1
  286. package/dist/features/viz/lib/pie-layout.js.map +2 -2
  287. package/dist/features/viz/lib/plot-series.js +11 -6
  288. package/dist/features/viz/lib/plot-series.js.map +2 -2
  289. package/dist/features/viz/lib/plot-types.d.ts +4 -3
  290. package/dist/features/viz/lib/point-scale-component.d.ts +7 -0
  291. package/dist/features/viz/lib/point-scale-component.js +19 -0
  292. package/dist/features/viz/lib/point-scale-component.js.map +7 -0
  293. package/dist/features/viz/lib/point-scale.d.ts +2 -0
  294. package/dist/features/viz/lib/point-scale.js +45 -0
  295. package/dist/features/viz/lib/point-scale.js.map +7 -0
  296. package/dist/features/viz/lib/point-series.d.ts +1 -1
  297. package/dist/features/viz/lib/point-series.js +36 -9
  298. package/dist/features/viz/lib/point-series.js.map +2 -2
  299. package/dist/features/viz/lib/point-types.d.ts +5 -2
  300. package/dist/features/viz/lib/reference-band.d.ts +16 -0
  301. package/dist/features/viz/lib/reference-band.js +30 -0
  302. package/dist/features/viz/lib/reference-band.js.map +7 -0
  303. package/dist/features/viz/lib/scale-adjust.js +9 -4
  304. package/dist/features/viz/lib/scale-adjust.js.map +2 -2
  305. package/dist/features/viz/lib/scale-context.d.ts +5 -4
  306. package/dist/features/viz/lib/scale-context.js +15 -11
  307. package/dist/features/viz/lib/scale-context.js.map +2 -2
  308. package/dist/features/viz/lib/scale-provider.d.ts +2 -0
  309. package/dist/features/viz/lib/scale-provider.js +13 -0
  310. package/dist/features/viz/lib/scale-provider.js.map +7 -0
  311. package/dist/features/viz/lib/scale-ticks.d.ts +5 -0
  312. package/dist/features/viz/lib/scale-ticks.js +64 -0
  313. package/dist/features/viz/lib/scale-ticks.js.map +7 -0
  314. package/dist/features/viz/lib/scale-view.d.ts +4 -0
  315. package/dist/features/viz/lib/scale-view.js +21 -0
  316. package/dist/features/viz/lib/scale-view.js.map +7 -0
  317. package/dist/features/viz/lib/sequential-color-scale.d.ts +11 -0
  318. package/dist/features/viz/lib/sequential-color-scale.js +49 -0
  319. package/dist/features/viz/lib/sequential-color-scale.js.map +7 -0
  320. package/dist/features/viz/lib/series-position.d.ts +12 -0
  321. package/dist/features/viz/lib/series-position.js +44 -0
  322. package/dist/features/viz/lib/series-position.js.map +7 -0
  323. package/dist/features/viz/lib/step-curves.d.ts +19 -0
  324. package/dist/features/viz/lib/step-curves.js +53 -0
  325. package/dist/features/viz/lib/step-curves.js.map +7 -0
  326. package/dist/features/viz/lib/symlog-scale-component.d.ts +7 -0
  327. package/dist/features/viz/lib/symlog-scale-component.js +19 -0
  328. package/dist/features/viz/lib/symlog-scale-component.js.map +7 -0
  329. package/dist/features/viz/lib/symlog-scale.d.ts +2 -0
  330. package/dist/features/viz/lib/symlog-scale.js +38 -0
  331. package/dist/features/viz/lib/symlog-scale.js.map +7 -0
  332. package/dist/features/viz/lib/threshold-color-scale.d.ts +43 -0
  333. package/dist/features/viz/lib/threshold-color-scale.js +59 -0
  334. package/dist/features/viz/lib/threshold-color-scale.js.map +7 -0
  335. package/dist/features/viz/lib/trading-time-mapping.d.ts +32 -0
  336. package/dist/features/viz/lib/trading-time-mapping.js +89 -0
  337. package/dist/features/viz/lib/trading-time-mapping.js.map +7 -0
  338. package/dist/features/viz/lib/trading-time-scale.d.ts +83 -0
  339. package/dist/features/viz/lib/trading-time-scale.js +96 -0
  340. package/dist/features/viz/lib/trading-time-scale.js.map +7 -0
  341. package/dist/features/viz/lib/trajectory-series.d.ts +71 -0
  342. package/dist/features/viz/lib/trajectory-series.js +111 -0
  343. package/dist/features/viz/lib/trajectory-series.js.map +7 -0
  344. package/dist/features/viz/lib/types.d.ts +114 -21
  345. package/dist/features/viz/lib/use-bar-scale.d.ts +8 -0
  346. package/dist/features/viz/lib/use-bar-scale.js +9 -0
  347. package/dist/features/viz/lib/use-bar-scale.js.map +7 -0
  348. package/dist/features/viz/lib/use-continuous-scale.d.ts +8 -0
  349. package/dist/features/viz/lib/use-continuous-scale.js +14 -0
  350. package/dist/features/viz/lib/use-continuous-scale.js.map +7 -0
  351. package/dist/features/viz/lib/use-linear-scale.d.ts +8 -0
  352. package/dist/features/viz/lib/use-linear-scale.js +9 -0
  353. package/dist/features/viz/lib/use-linear-scale.js.map +7 -0
  354. package/dist/features/viz/lib/use-log-scale.d.ts +8 -0
  355. package/dist/features/viz/lib/use-log-scale.js +9 -0
  356. package/dist/features/viz/lib/use-log-scale.js.map +7 -0
  357. package/dist/features/viz/lib/use-point-scale.d.ts +8 -0
  358. package/dist/features/viz/lib/use-point-scale.js +9 -0
  359. package/dist/features/viz/lib/use-point-scale.js.map +7 -0
  360. package/dist/features/viz/lib/use-symlog-scale.d.ts +8 -0
  361. package/dist/features/viz/lib/use-symlog-scale.js +9 -0
  362. package/dist/features/viz/lib/use-symlog-scale.js.map +7 -0
  363. package/dist/features/viz/lib/use-utc-scale.d.ts +8 -0
  364. package/dist/features/viz/lib/use-utc-scale.js +9 -0
  365. package/dist/features/viz/lib/use-utc-scale.js.map +7 -0
  366. package/dist/features/viz/lib/utc-labels.d.ts +12 -0
  367. package/dist/features/viz/lib/utc-labels.js +27 -0
  368. package/dist/features/viz/lib/utc-labels.js.map +7 -0
  369. package/dist/features/viz/lib/utc-scale-component.d.ts +7 -0
  370. package/dist/features/viz/lib/utc-scale-component.js +18 -0
  371. package/dist/features/viz/lib/utc-scale-component.js.map +7 -0
  372. package/dist/features/viz/lib/utc-scale.d.ts +21 -0
  373. package/dist/features/viz/lib/utc-scale.js +124 -0
  374. package/dist/features/viz/lib/utc-scale.js.map +7 -0
  375. package/dist/features/viz/lib/volume-series.d.ts +59 -0
  376. package/dist/features/viz/lib/volume-series.js +117 -0
  377. package/dist/features/viz/lib/volume-series.js.map +7 -0
  378. package/dist/features/viz/lib/weighted-point-series.d.ts +71 -0
  379. package/dist/features/viz/lib/weighted-point-series.js +169 -0
  380. package/dist/features/viz/lib/weighted-point-series.js.map +7 -0
  381. package/dist/filters/backdrop-contrast-gpu.d.ts +5 -0
  382. package/dist/filters/backdrop-contrast-gpu.js +33 -0
  383. package/dist/filters/backdrop-contrast-gpu.js.map +7 -0
  384. package/dist/filters/backdrop-contrast.d.ts +21 -0
  385. package/dist/filters/backdrop-contrast.js +61 -0
  386. package/dist/filters/backdrop-contrast.js.map +7 -0
  387. package/dist/filters/displacement.js +1 -1
  388. package/dist/filters/displacement.js.map +2 -2
  389. package/dist/filters/emboss-gpu.d.ts +4 -0
  390. package/dist/filters/emboss-gpu.js +39 -0
  391. package/dist/filters/emboss-gpu.js.map +7 -0
  392. package/dist/filters/emboss.d.ts +32 -0
  393. package/dist/filters/emboss.js +104 -0
  394. package/dist/filters/emboss.js.map +7 -0
  395. package/dist/filters/filter-executor.d.ts +11 -4
  396. package/dist/filters/filter-executor.js +104 -49
  397. package/dist/filters/filter-executor.js.map +2 -2
  398. package/dist/filters/reflected-light.js +1 -1
  399. package/dist/filters/reflected-light.js.map +2 -2
  400. package/dist/filters/reflection-gpu.d.ts +3 -1
  401. package/dist/filters/reflection-gpu.js +5 -2
  402. package/dist/filters/reflection-gpu.js.map +2 -2
  403. package/dist/filters/render-backdrop-contrast-boundary.d.ts +31 -0
  404. package/dist/filters/render-backdrop-contrast-boundary.js +116 -0
  405. package/dist/filters/render-backdrop-contrast-boundary.js.map +7 -0
  406. package/dist/filters/render-emboss-boundary.d.ts +13 -0
  407. package/dist/filters/render-emboss-boundary.js +131 -0
  408. package/dist/filters/render-emboss-boundary.js.map +7 -0
  409. package/dist/filters.d.ts +9 -5
  410. package/dist/filters.js +4 -0
  411. package/dist/filters.js.map +2 -2
  412. package/dist/index.d.ts +10 -6
  413. package/dist/index.js +18 -2
  414. package/dist/index.js.map +2 -2
  415. package/dist/internal.d.ts +4 -0
  416. package/dist/internal.js +6 -0
  417. package/dist/internal.js.map +2 -2
  418. package/dist/layout-kernel.d.ts +12 -0
  419. package/dist/layout-kernel.js +11 -0
  420. package/dist/layout-kernel.js.map +7 -0
  421. package/dist/layout-kernel.mjs +1 -0
  422. package/dist/lib/animation/definition.d.ts +5 -3
  423. package/dist/lib/animation/definition.js +29 -4
  424. package/dist/lib/animation/definition.js.map +2 -2
  425. package/dist/lib/animation/playback.d.ts +8 -0
  426. package/dist/lib/animation/playback.js +33 -11
  427. package/dist/lib/animation/playback.js.map +2 -2
  428. package/dist/lib/animation/spring.d.ts +3 -1
  429. package/dist/lib/animation/spring.js.map +2 -2
  430. package/dist/lib/animation/types.d.ts +29 -73
  431. package/dist/lib/backend/types.d.ts +13 -1
  432. package/dist/lib/backend/types.js.map +2 -2
  433. package/dist/lib/components/arc-geometry.js +2 -1
  434. package/dist/lib/components/arc-geometry.js.map +2 -2
  435. package/dist/lib/components/g.js +2 -0
  436. package/dist/lib/components/g.js.map +2 -2
  437. package/dist/lib/components/html-box.js +2 -1
  438. package/dist/lib/components/html-box.js.map +2 -2
  439. package/dist/lib/components/img.js +3 -3
  440. package/dist/lib/components/img.js.map +2 -2
  441. package/dist/lib/components/layer.js +98 -16
  442. package/dist/lib/components/layer.js.map +3 -3
  443. package/dist/lib/components/text.d.ts +16 -0
  444. package/dist/lib/components/text.js +131 -24
  445. package/dist/lib/components/text.js.map +2 -2
  446. package/dist/lib/define-primitive.d.ts +4 -2
  447. package/dist/lib/define-primitive.js +3 -1
  448. package/dist/lib/define-primitive.js.map +2 -2
  449. package/dist/lib/element/metadata.d.ts +9 -0
  450. package/dist/lib/element/metadata.js +19 -0
  451. package/dist/lib/element/metadata.js.map +2 -2
  452. package/dist/lib/element/resolve-primitive-inputs.d.ts +2 -0
  453. package/dist/lib/element/resolve-primitive-inputs.js +17 -4
  454. package/dist/lib/element/resolve-primitive-inputs.js.map +2 -2
  455. package/dist/lib/events/event-facade.d.ts +18 -0
  456. package/dist/lib/events/event-facade.js +28 -2
  457. package/dist/lib/events/event-facade.js.map +2 -2
  458. package/dist/lib/events/hit-test.js +2 -1
  459. package/dist/lib/events/hit-test.js.map +2 -2
  460. package/dist/lib/events/propagation.d.ts +2 -1
  461. package/dist/lib/events/propagation.js +22 -16
  462. package/dist/lib/events/propagation.js.map +2 -2
  463. package/dist/lib/events/registrations.d.ts +10 -0
  464. package/dist/lib/events/registrations.js +160 -5
  465. package/dist/lib/events/registrations.js.map +2 -2
  466. package/dist/lib/execute-render.js +25 -1
  467. package/dist/lib/execute-render.js.map +2 -2
  468. package/dist/lib/filter/filter-region.js +3 -10
  469. package/dist/lib/filter/filter-region.js.map +2 -2
  470. package/dist/lib/focus/focus-manager.d.ts +8 -1
  471. package/dist/lib/focus/focus-manager.js +87 -43
  472. package/dist/lib/focus/focus-manager.js.map +2 -2
  473. package/dist/lib/focus/geometry.d.ts +2 -0
  474. package/dist/lib/focus/geometry.js +6 -0
  475. package/dist/lib/focus/geometry.js.map +2 -2
  476. package/dist/lib/geometry/path-bend-guide.js +1 -1
  477. package/dist/lib/geometry/path-bend-guide.js.map +2 -2
  478. package/dist/lib/geometry/path-geometry.js +12 -11
  479. package/dist/lib/geometry/path-geometry.js.map +2 -2
  480. package/dist/lib/geometry/path-transforms.js +17 -21
  481. package/dist/lib/geometry/path-transforms.js.map +2 -2
  482. package/dist/lib/geometry/path-warp-bezier.js +3 -1
  483. package/dist/lib/geometry/path-warp-bezier.js.map +2 -2
  484. package/dist/lib/geometry/path-warp.js +1 -1
  485. package/dist/lib/geometry/path-warp.js.map +2 -2
  486. package/dist/lib/global-state.js +2 -0
  487. package/dist/lib/global-state.js.map +2 -2
  488. package/dist/lib/hooks/use-animated-value.d.ts +11 -21
  489. package/dist/lib/hooks/use-animated-value.js +23 -70
  490. package/dist/lib/hooks/use-animated-value.js.map +3 -3
  491. package/dist/lib/hooks/use-playback.js +1 -0
  492. package/dist/lib/hooks/use-playback.js.map +2 -2
  493. package/dist/lib/html/html-events.d.ts +32 -0
  494. package/dist/lib/html/html-events.js +179 -0
  495. package/dist/lib/html/html-events.js.map +7 -0
  496. package/dist/lib/html/html-service.d.ts +8 -2
  497. package/dist/lib/html/html-service.js +198 -65
  498. package/dist/lib/html/html-service.js.map +2 -2
  499. package/dist/lib/html/overlay-config.js +7 -6
  500. package/dist/lib/html/overlay-config.js.map +2 -2
  501. package/dist/lib/html/types.d.ts +29 -2
  502. package/dist/lib/layout/absolute.d.ts +11 -5
  503. package/dist/lib/layout/absolute.js +329 -55
  504. package/dist/lib/layout/absolute.js.map +3 -3
  505. package/dist/lib/layout/allocation-checkpoint-owner.d.ts +11 -0
  506. package/dist/lib/layout/allocation-checkpoint-owner.js +86 -0
  507. package/dist/lib/layout/allocation-checkpoint-owner.js.map +7 -0
  508. package/dist/lib/layout/allocation-checkpoint.d.ts +53 -0
  509. package/dist/lib/layout/allocation-checkpoint.js +463 -0
  510. package/dist/lib/layout/allocation-checkpoint.js.map +7 -0
  511. package/dist/lib/layout/allocation-dependencies.d.ts +30 -0
  512. package/dist/lib/layout/allocation-dependencies.js +90 -0
  513. package/dist/lib/layout/allocation-dependencies.js.map +7 -0
  514. package/dist/lib/layout/allocation-revision.d.ts +13 -0
  515. package/dist/lib/layout/allocation-revision.js +67 -0
  516. package/dist/lib/layout/allocation-revision.js.map +7 -0
  517. package/dist/lib/layout/box-insets.d.ts +17 -0
  518. package/dist/lib/layout/box-insets.js +138 -0
  519. package/dist/lib/layout/box-insets.js.map +7 -0
  520. package/dist/lib/layout/box-sizing.d.ts +16 -0
  521. package/dist/lib/layout/box-sizing.js +77 -0
  522. package/dist/lib/layout/box-sizing.js.map +7 -0
  523. package/dist/lib/layout/box.js +42 -12
  524. package/dist/lib/layout/box.js.map +2 -2
  525. package/dist/lib/layout/canvas-measurement.d.ts +13 -0
  526. package/dist/lib/layout/canvas-measurement.js +57 -0
  527. package/dist/lib/layout/canvas-measurement.js.map +7 -0
  528. package/dist/lib/layout/context.d.ts +35 -6
  529. package/dist/lib/layout/context.js +72 -3
  530. package/dist/lib/layout/context.js.map +2 -2
  531. package/dist/lib/layout/define-layout-component.d.ts +23 -0
  532. package/dist/lib/layout/define-layout-component.js +84 -0
  533. package/dist/lib/layout/define-layout-component.js.map +7 -0
  534. package/dist/lib/layout/flex-allocation-cache.d.ts +42 -0
  535. package/dist/lib/layout/flex-baseline-mode.d.ts +2 -0
  536. package/dist/lib/layout/flex-baseline-mode.js +7 -0
  537. package/dist/lib/layout/flex-baseline-mode.js.map +7 -0
  538. package/dist/lib/layout/flex.d.ts +50 -15
  539. package/dist/lib/layout/flex.js +2124 -195
  540. package/dist/lib/layout/flex.js.map +3 -3
  541. package/dist/lib/layout/flow.js +225 -49
  542. package/dist/lib/layout/flow.js.map +2 -2
  543. package/dist/lib/layout/geometry-publication.d.ts +53 -0
  544. package/dist/lib/layout/geometry-publication.js +244 -0
  545. package/dist/lib/layout/geometry-publication.js.map +7 -0
  546. package/dist/lib/layout/grid-kernel.d.ts +63 -0
  547. package/dist/lib/layout/grid-kernel.js +168 -0
  548. package/dist/lib/layout/grid-kernel.js.map +7 -0
  549. package/dist/lib/layout/grid.d.ts +63 -4
  550. package/dist/lib/layout/grid.js +767 -171
  551. package/dist/lib/layout/grid.js.map +3 -3
  552. package/dist/lib/layout/measure.d.ts +55 -3
  553. package/dist/lib/layout/measure.js +448 -15
  554. package/dist/lib/layout/measure.js.map +2 -2
  555. package/dist/lib/layout/overlay.js +81 -23
  556. package/dist/lib/layout/overlay.js.map +2 -2
  557. package/dist/lib/layout/participation.d.ts +27 -0
  558. package/dist/lib/layout/participation.js +188 -0
  559. package/dist/lib/layout/participation.js.map +7 -0
  560. package/dist/lib/layout/place-child.js +1 -1
  561. package/dist/lib/layout/place-child.js.map +2 -2
  562. package/dist/lib/layout/positioning-diagnostics.d.ts +1 -1
  563. package/dist/lib/layout/positioning-diagnostics.js +13 -2
  564. package/dist/lib/layout/positioning-diagnostics.js.map +2 -2
  565. package/dist/lib/layout/prepared-root.d.ts +121 -0
  566. package/dist/lib/layout/prepared-root.js +360 -0
  567. package/dist/lib/layout/prepared-root.js.map +7 -0
  568. package/dist/lib/layout/standalone-kernel.d.ts +60 -0
  569. package/dist/lib/layout/standalone-kernel.js +722 -0
  570. package/dist/lib/layout/standalone-kernel.js.map +7 -0
  571. package/dist/lib/layout/topology.d.ts +21 -0
  572. package/dist/lib/layout/topology.js +113 -0
  573. package/dist/lib/layout/topology.js.map +7 -0
  574. package/dist/lib/layout/types.d.ts +5 -0
  575. package/dist/lib/layout/wasm/artifact.d.ts +1 -0
  576. package/dist/lib/layout/wasm/artifact.js +5 -0
  577. package/dist/lib/layout/wasm/artifact.js.map +7 -0
  578. package/dist/lib/layout/wasm/bytes.d.ts +1 -0
  579. package/dist/lib/layout/wasm/bytes.js +5 -0
  580. package/dist/lib/layout/wasm/bytes.js.map +7 -0
  581. package/dist/lib/layout/wasm/embedded.d.ts +2 -0
  582. package/dist/lib/layout/wasm/embedded.js +12 -0
  583. package/dist/lib/layout/wasm/embedded.js.map +7 -0
  584. package/dist/lib/layout/wasm/layout.wasm +0 -0
  585. package/dist/lib/layout/wasm/module.d.ts +8 -0
  586. package/dist/lib/layout/wasm/module.js +70 -0
  587. package/dist/lib/layout/wasm/module.js.map +7 -0
  588. package/dist/lib/layout/wasm/region.d.ts +267 -0
  589. package/dist/lib/layout/wasm/region.js +1018 -0
  590. package/dist/lib/layout/wasm/region.js.map +7 -0
  591. package/dist/lib/manipulation/controller.js +4 -7
  592. package/dist/lib/manipulation/controller.js.map +2 -2
  593. package/dist/lib/manipulation/frame.js +1 -1
  594. package/dist/lib/manipulation/frame.js.map +2 -2
  595. package/dist/lib/manipulation/handles.js +32 -33
  596. package/dist/lib/manipulation/handles.js.map +2 -2
  597. package/dist/lib/manipulation/solve.js +12 -10
  598. package/dist/lib/manipulation/solve.js.map +2 -2
  599. package/dist/lib/mount-pibbl.js +1 -0
  600. package/dist/lib/mount-pibbl.js.map +2 -2
  601. package/dist/lib/mount-prepared-pibbl.d.ts +5 -0
  602. package/dist/lib/mount-prepared-pibbl.js +29 -0
  603. package/dist/lib/mount-prepared-pibbl.js.map +7 -0
  604. package/dist/lib/mount-request.d.ts +8 -0
  605. package/dist/lib/mount-request.js +41 -0
  606. package/dist/lib/mount-request.js.map +7 -0
  607. package/dist/lib/pibbl.d.ts +21 -13
  608. package/dist/lib/pibbl.js +18 -16
  609. package/dist/lib/pibbl.js.map +2 -2
  610. package/dist/lib/recording/recording.d.ts +43 -0
  611. package/dist/lib/recording/recording.js +555 -0
  612. package/dist/lib/recording/recording.js.map +7 -0
  613. package/dist/lib/recording/types.d.ts +118 -0
  614. package/dist/lib/recording/wasm-bytes.d.ts +1 -0
  615. package/dist/lib/recording/wasm-bytes.js +5 -0
  616. package/dist/lib/recording/wasm-bytes.js.map +7 -0
  617. package/dist/lib/recording/worker-source.d.ts +1 -0
  618. package/dist/lib/recording/worker-source.js +5 -0
  619. package/dist/lib/recording/worker-source.js.map +7 -0
  620. package/dist/lib/render-layer/controller.d.ts +9 -3
  621. package/dist/lib/render-layer/controller.js +259 -110
  622. package/dist/lib/render-layer/controller.js.map +2 -2
  623. package/dist/lib/render-transaction.d.ts +12 -2
  624. package/dist/lib/render-transaction.js +69 -1
  625. package/dist/lib/render-transaction.js.map +2 -2
  626. package/dist/lib/render.js +32 -8
  627. package/dist/lib/render.js.map +2 -2
  628. package/dist/lib/scheduler/realm-scheduler.d.ts +2 -0
  629. package/dist/lib/scheduler/realm-scheduler.js +55 -26
  630. package/dist/lib/scheduler/realm-scheduler.js.map +2 -2
  631. package/dist/lib/scheduler/renderer-participant.js +1 -0
  632. package/dist/lib/scheduler/renderer-participant.js.map +2 -2
  633. package/dist/lib/series-inspection-frame.d.ts +18 -0
  634. package/dist/lib/series-inspection-frame.js +70 -0
  635. package/dist/lib/series-inspection-frame.js.map +7 -0
  636. package/dist/lib/signals/edge.d.ts +7 -4
  637. package/dist/lib/signals/edge.js +25 -3
  638. package/dist/lib/signals/edge.js.map +2 -2
  639. package/dist/lib/signals/graph.d.ts +16 -2
  640. package/dist/lib/signals/graph.js +54 -12
  641. package/dist/lib/signals/graph.js.map +2 -2
  642. package/dist/lib/signals/input-provision.d.ts +15 -0
  643. package/dist/lib/signals/input-provision.js +53 -3
  644. package/dist/lib/signals/input-provision.js.map +2 -2
  645. package/dist/lib/signals/render-consumer.d.ts +3 -0
  646. package/dist/lib/signals/render-consumer.js +22 -14
  647. package/dist/lib/signals/render-consumer.js.map +2 -2
  648. package/dist/lib/style/positioning.d.ts +50 -2
  649. package/dist/lib/style/positioning.js +28 -4
  650. package/dist/lib/style/positioning.js.map +2 -2
  651. package/dist/lib/style/resolve-built-in.d.ts +4 -3
  652. package/dist/lib/style/resolve-built-in.js +17 -3
  653. package/dist/lib/style/resolve-built-in.js.map +2 -2
  654. package/dist/lib/style/resolve-dispatch.d.ts +3 -0
  655. package/dist/lib/style/resolve-dispatch.js +77 -4
  656. package/dist/lib/style/resolve-dispatch.js.map +2 -2
  657. package/dist/lib/style/resolve-length.d.ts +2 -0
  658. package/dist/lib/style/resolve-length.js +13 -9
  659. package/dist/lib/style/resolve-length.js.map +2 -2
  660. package/dist/lib/style/sizing-length.d.ts +51 -0
  661. package/dist/lib/style/sizing-length.js +77 -0
  662. package/dist/lib/style/sizing-length.js.map +7 -0
  663. package/dist/lib/style/types.d.ts +63 -25
  664. package/dist/lib/surface/root-surface.js +10 -6
  665. package/dist/lib/surface/root-surface.js.map +2 -2
  666. package/dist/lib/textures/texture.js +10 -8
  667. package/dist/lib/textures/texture.js.map +2 -2
  668. package/dist/lib/transitions/capture.js +4 -1
  669. package/dist/lib/transitions/capture.js.map +2 -2
  670. package/dist/lib/transitions/embers-physics.js +17 -10
  671. package/dist/lib/transitions/embers-physics.js.map +2 -2
  672. package/dist/lib/types.d.ts +110 -1
  673. package/dist/sync.d.ts +16 -0
  674. package/dist/sync.js +13 -0
  675. package/dist/sync.js.map +7 -0
  676. package/dist/sync.mjs +1 -0
  677. package/package.json +43 -6
  678. package/dist/features/viz/lib/scale.d.ts +0 -11
  679. package/dist/features/viz/lib/scale.js +0 -80
  680. package/dist/features/viz/lib/scale.js.map +0 -7
  681. package/dist/features/viz/lib/use-scale.d.ts +0 -20
  682. package/dist/features/viz/lib/use-scale.js +0 -10
  683. package/dist/features/viz/lib/use-scale.js.map +0 -7
@@ -1,8 +1,9 @@
1
+ import { contentBoxStyle, borderBoxPaddingFloor } from "./box-sizing.js";
1
2
  import {
2
3
  layoutDiagnostic
3
4
  } from "../style/diagnostics.js";
4
- import { normalizeEdges } from "../style/normalize.js";
5
- import { resolveLength } from "../style/resolve-length.js";
5
+ import { normalizeBoxInsets } from "./box-insets.js";
6
+ import { resolveScalarSizingLength } from "../style/sizing-length.js";
6
7
  function resolveBox(style, constraints, context = {}) {
7
8
  const diagnosticContext = {
8
9
  component: context.component ?? "layout",
@@ -10,28 +11,56 @@ function resolveBox(style, constraints, context = {}) {
10
11
  constraints
11
12
  };
12
13
  validateConstraints(constraints, diagnosticContext);
13
- const padding = normalizeEdges(style.padding, "padding", diagnosticContext);
14
+ const ratio = style.aspectRatio;
15
+ if (ratio !== void 0 && (!Number.isFinite(ratio) || ratio <= 0)) throw layoutDiagnostic({ ...diagnosticContext, property: "aspectRatio", value: ratio, reason: "must be finite and positive" });
16
+ const paddingFloor = borderBoxPaddingFloor(style);
17
+ if (style.boxSizing !== void 0) style = contentBoxStyle(style, { width: constraints.maxWidth, height: constraints.maxHeight, context: diagnosticContext });
18
+ const padding = normalizeBoxInsets(style, diagnosticContext);
19
+ let width = style.width, height = style.height;
20
+ const widthAutomatic = width === void 0 || width === "auto";
21
+ const heightAutomatic = height === void 0 || height === "auto";
22
+ let vertical;
23
+ if (ratio !== void 0 && widthAutomatic && !heightAutomatic) {
24
+ vertical = resolveAxis(
25
+ "height",
26
+ height,
27
+ style.minHeight,
28
+ style.maxHeight,
29
+ constraints.minHeight,
30
+ constraints.maxHeight,
31
+ padding.top,
32
+ padding.bottom,
33
+ diagnosticContext,
34
+ paddingFloor
35
+ );
36
+ width = paddingFloor ? Math.max(0, vertical.border * ratio - padding.left - padding.right) : vertical.content * ratio;
37
+ }
14
38
  const horizontal = resolveAxis(
15
39
  "width",
16
- style.width,
40
+ width,
17
41
  style.minWidth,
18
42
  style.maxWidth,
19
43
  constraints.minWidth,
20
44
  constraints.maxWidth,
21
45
  padding.left,
22
46
  padding.right,
23
- diagnosticContext
47
+ diagnosticContext,
48
+ paddingFloor
24
49
  );
25
- const vertical = resolveAxis(
50
+ if (ratio !== void 0 && !widthAutomatic && heightAutomatic) {
51
+ height = paddingFloor ? Math.max(0, horizontal.border / ratio - padding.top - padding.bottom) : horizontal.content / ratio;
52
+ }
53
+ vertical ??= resolveAxis(
26
54
  "height",
27
- style.height,
55
+ height,
28
56
  style.minHeight,
29
57
  style.maxHeight,
30
58
  constraints.minHeight,
31
59
  constraints.maxHeight,
32
60
  padding.top,
33
61
  padding.bottom,
34
- diagnosticContext
62
+ diagnosticContext,
63
+ paddingFloor
35
64
  );
36
65
  return {
37
66
  borderBox: {
@@ -48,7 +77,7 @@ function resolveBox(style, constraints, context = {}) {
48
77
  }
49
78
  };
50
79
  }
51
- function resolveAxis(axis, specified, specifiedMinimum, specifiedMaximum, constraintMinimum, constraintMaximum, paddingStart, paddingEnd, context) {
80
+ function resolveAxis(axis, specified, specifiedMinimum, specifiedMaximum, constraintMinimum, constraintMaximum, paddingStart, paddingEnd, context, paddingFloor) {
52
81
  const minimumProperty = axis === "width" ? "minWidth" : "minHeight";
53
82
  const maximumProperty = axis === "width" ? "maxWidth" : "maxHeight";
54
83
  const minimum = specifiedMinimum === void 0 ? 0 : resolveAllocationLength(
@@ -76,7 +105,7 @@ function resolveAxis(axis, specified, specifiedMinimum, specifiedMaximum, constr
76
105
  axis,
77
106
  context
78
107
  );
79
- const resolved = specified === void 0 ? void 0 : resolveLength(specified, constraintMaximum, axis, context);
108
+ const resolved = specified === void 0 ? void 0 : resolveScalarSizingLength(specified, constraintMaximum, axis, context);
80
109
  let content;
81
110
  if (resolved === void 0) {
82
111
  if (!Number.isFinite(constraintMaximum)) {
@@ -108,10 +137,11 @@ function resolveAxis(axis, specified, specifiedMinimum, specifiedMaximum, constr
108
137
  axis,
109
138
  context
110
139
  );
111
- const border = Math.min(
140
+ const constrainedBorder = Math.min(
112
141
  constraintMaximum,
113
142
  Math.max(constraintMinimum, paddedContent)
114
143
  );
144
+ const border = paddingFloor ? Math.max(padding, constrainedBorder) : constrainedBorder;
115
145
  return {
116
146
  border: requireFiniteArithmetic(border, axis, context),
117
147
  content: Math.max(
@@ -132,7 +162,7 @@ function requireFiniteArithmetic(value, property, context) {
132
162
  return value;
133
163
  }
134
164
  function resolveAllocationLength(value, reference, property, context) {
135
- const resolved = resolveLength(value, reference, property, context);
165
+ const resolved = resolveScalarSizingLength(value, reference, property, context);
136
166
  if (resolved < 0) {
137
167
  throw layoutDiagnostic({
138
168
  ...context,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/lib/layout/box.ts"],
4
- "sourcesContent": ["import {\n layoutDiagnostic,\n type LayoutDiagnosticContext,\n} from '../style/diagnostics.js';\nimport { normalizeEdges } from '../style/normalize.js';\nimport { resolveLength } from '../style/resolve-length.js';\nimport type { BoxStyle, Length, ResolvedBoxStyle } from '../style/types.js';\nimport type { Constraints } from './types.js';\n\n/**\n * Resolves declared box sizing and padding into border and content boxes under parent constraints.\n *\n * @param style - Declared box sizing and edge properties. See {@link BoxStyle}.\n * @param constraints - Available dimensions used to resolve percentages and constraints. See\n * {@link Constraints} .\n * @param context - Component and property context for diagnostic messages. See\n * {@link LayoutDiagnosticContext} .\n * @returns Resolved box dimensions and edge values. See {@link ResolvedBoxStyle}.\n *\n * @see {@link BoxStyle}\n * @see {@link Constraints}\n * @see {@link LayoutDiagnosticContext}\n * @see {@link ResolvedBoxStyle}\n */\nexport function resolveBox(\n style: Readonly<BoxStyle>,\n constraints: Readonly<Constraints>,\n context: Readonly<LayoutDiagnosticContext> = {},\n): ResolvedBoxStyle {\n const diagnosticContext = {\n component: context.component ?? 'layout',\n algorithm: context.algorithm ?? 'box-resolution',\n constraints,\n };\n validateConstraints(constraints, diagnosticContext);\n const padding = normalizeEdges(style.padding, 'padding', diagnosticContext);\n\n const horizontal = resolveAxis(\n 'width',\n style.width,\n style.minWidth,\n style.maxWidth,\n constraints.minWidth,\n constraints.maxWidth,\n padding.left,\n padding.right,\n diagnosticContext,\n );\n const vertical = resolveAxis(\n 'height',\n style.height,\n style.minHeight,\n style.maxHeight,\n constraints.minHeight,\n constraints.maxHeight,\n padding.top,\n padding.bottom,\n diagnosticContext,\n );\n\n return {\n borderBox: {\n x: 0,\n y: 0,\n width: horizontal.border,\n height: vertical.border,\n },\n contentBox: {\n x: padding.left,\n y: padding.top,\n width: horizontal.content,\n height: vertical.content,\n },\n };\n}\n\nfunction resolveAxis(\n axis: 'width' | 'height',\n specified: Length | undefined,\n specifiedMinimum: Exclude<Length, 'auto'> | undefined,\n specifiedMaximum: Exclude<Length, 'auto'> | undefined,\n constraintMinimum: number,\n constraintMaximum: number,\n paddingStart: number,\n paddingEnd: number,\n context: Readonly<LayoutDiagnosticContext>,\n): { border: number; content: number } {\n const minimumProperty = axis === 'width' ? 'minWidth' : 'minHeight';\n const maximumProperty = axis === 'width' ? 'maxWidth' : 'maxHeight';\n const minimum =\n specifiedMinimum === undefined\n ? 0\n : resolveAllocationLength(\n specifiedMinimum,\n constraintMaximum,\n minimumProperty,\n context,\n );\n const maximum =\n specifiedMaximum === undefined\n ? Number.POSITIVE_INFINITY\n : resolveAllocationLength(\n specifiedMaximum,\n constraintMaximum,\n maximumProperty,\n context,\n );\n\n if (minimum > maximum) {\n throw layoutDiagnostic({\n ...context,\n property: minimumProperty,\n value: minimum,\n reason: `${minimumProperty} ${minimum} must not exceed ${maximumProperty} ${maximum}`,\n });\n }\n\n const padding = requireFiniteArithmetic(\n paddingStart + paddingEnd,\n axis,\n context,\n );\n const resolved =\n specified === undefined\n ? undefined\n : resolveLength(specified, constraintMaximum, axis, context);\n let content: number;\n if (resolved === undefined) {\n if (!Number.isFinite(constraintMaximum)) {\n throw layoutDiagnostic({\n ...context,\n property: axis,\n value: specified ?? 'auto',\n reason: 'requires a definite finite allocation for auto sizing',\n });\n }\n content = Math.max(\n 0,\n requireFiniteArithmetic(constraintMaximum - padding, axis, context),\n );\n } else {\n if (resolved < 0) {\n throw layoutDiagnostic({\n ...context,\n property: axis,\n value: specified,\n reason: 'must be nonnegative when used as a layout allocation',\n });\n }\n content = resolved;\n }\n\n content = Math.min(maximum, Math.max(minimum, content));\n const paddedContent = requireFiniteArithmetic(\n content + padding,\n axis,\n context,\n );\n const border = Math.min(\n constraintMaximum,\n Math.max(constraintMinimum, paddedContent),\n );\n return {\n border: requireFiniteArithmetic(border, axis, context),\n content: Math.max(\n 0,\n requireFiniteArithmetic(border - padding, axis, context),\n ),\n };\n}\n\nfunction requireFiniteArithmetic(\n value: number,\n property: string,\n context: Readonly<LayoutDiagnosticContext>,\n): number {\n if (!Number.isFinite(value)) {\n throw layoutDiagnostic({\n ...context,\n property,\n value,\n reason: 'resolved box arithmetic must remain finite',\n });\n }\n return value;\n}\n\nfunction resolveAllocationLength(\n value: Exclude<Length, 'auto'>,\n reference: number,\n property: string,\n context: Readonly<LayoutDiagnosticContext>,\n): number {\n const resolved = resolveLength(value, reference, property, context)!;\n if (resolved < 0) {\n throw layoutDiagnostic({\n ...context,\n property,\n value,\n reason: 'must be nonnegative when used as a layout allocation',\n });\n }\n return resolved;\n}\n\nfunction validateConstraints(\n constraints: Readonly<Constraints>,\n context: Readonly<LayoutDiagnosticContext>,\n): void {\n validateConstraint(\n constraints.minWidth,\n 'constraints.minWidth',\n false,\n context,\n );\n validateConstraint(\n constraints.maxWidth,\n 'constraints.maxWidth',\n true,\n context,\n );\n validateConstraint(\n constraints.minHeight,\n 'constraints.minHeight',\n false,\n context,\n );\n validateConstraint(\n constraints.maxHeight,\n 'constraints.maxHeight',\n true,\n context,\n );\n\n if (constraints.minWidth > constraints.maxWidth) {\n throw layoutDiagnostic({\n ...context,\n property: 'constraints.minWidth',\n value: constraints.minWidth,\n reason: `constraints.minWidth ${constraints.minWidth} must not exceed constraints.maxWidth ${constraints.maxWidth}`,\n });\n }\n if (constraints.minHeight > constraints.maxHeight) {\n throw layoutDiagnostic({\n ...context,\n property: 'constraints.minHeight',\n value: constraints.minHeight,\n reason: `constraints.minHeight ${constraints.minHeight} must not exceed constraints.maxHeight ${constraints.maxHeight}`,\n });\n }\n}\n\nfunction validateConstraint(\n value: number,\n property: string,\n allowPositiveInfinity: boolean,\n context: Readonly<LayoutDiagnosticContext>,\n): void {\n if (\n !Number.isFinite(value) &&\n !(allowPositiveInfinity && value === Number.POSITIVE_INFINITY)\n ) {\n throw layoutDiagnostic({\n ...context,\n property,\n value,\n reason: 'must be finite',\n });\n }\n if (value < 0) {\n throw layoutDiagnostic({\n ...context,\n property,\n value,\n reason: 'must be nonnegative',\n });\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { contentBoxStyle, borderBoxPaddingFloor } from './box-sizing.js';\nimport {\n layoutDiagnostic,\n type LayoutDiagnosticContext,\n} from '../style/diagnostics.js';\nimport { normalizeBoxInsets } from './box-insets.js';\nimport { resolveScalarSizingLength } from '../style/sizing-length.js';\nimport type { BoxStyle, ResolvedBoxStyle } from '../style/types.js';\nimport type { SizingLength } from '../style/sizing-length.js';\nimport type { Constraints } from './types.js';\n\n/**\n * Resolves declared box sizing and padding into border and content boxes under parent constraints.\n *\n * @param style - Declared box sizing and edge properties. See {@link BoxStyle}.\n * @param constraints - Available dimensions used to resolve percentages and constraints. See\n * {@link Constraints} .\n * @param context - Component and property context for diagnostic messages. See\n * {@link LayoutDiagnosticContext} .\n * @returns Resolved box dimensions and edge values. See {@link ResolvedBoxStyle}.\n *\n * @see {@link BoxStyle}\n * @see {@link Constraints}\n * @see {@link LayoutDiagnosticContext}\n * @see {@link ResolvedBoxStyle}\n */\nexport function resolveBox(\n style: Readonly<BoxStyle>,\n constraints: Readonly<Constraints>,\n context: Readonly<LayoutDiagnosticContext> = {},\n): ResolvedBoxStyle {\n const diagnosticContext = {\n component: context.component ?? 'layout',\n algorithm: context.algorithm ?? 'box-resolution',\n constraints,\n };\n validateConstraints(constraints, diagnosticContext);\n const ratio = style.aspectRatio;\n if (ratio !== undefined && (!Number.isFinite(ratio) || ratio <= 0)) throw layoutDiagnostic({ ...diagnosticContext, property: 'aspectRatio', value: ratio, reason: 'must be finite and positive' });\n const paddingFloor = borderBoxPaddingFloor(style);\n if (style.boxSizing !== undefined) style = contentBoxStyle(style, { width: constraints.maxWidth, height: constraints.maxHeight, context: diagnosticContext });\n const padding = normalizeBoxInsets(style, diagnosticContext);\n\n let width = style.width, height = style.height;\n const widthAutomatic = width === undefined || width === 'auto';\n const heightAutomatic = height === undefined || height === 'auto';\n let vertical: { border: number; content: number } | undefined;\n if (ratio !== undefined && widthAutomatic && !heightAutomatic) {\n vertical = resolveAxis('height', height, style.minHeight, style.maxHeight,\n constraints.minHeight, constraints.maxHeight, padding.top, padding.bottom, diagnosticContext, paddingFloor);\n width = paddingFloor ? Math.max(0, vertical.border * ratio - padding.left - padding.right) : vertical.content * ratio;\n }\n const horizontal = resolveAxis(\n 'width',\n width,\n style.minWidth,\n style.maxWidth,\n constraints.minWidth,\n constraints.maxWidth,\n padding.left,\n padding.right,\n diagnosticContext,\n paddingFloor,\n );\n if (ratio !== undefined && !widthAutomatic && heightAutomatic) {\n height = paddingFloor ? Math.max(0, horizontal.border / ratio - padding.top - padding.bottom) : horizontal.content / ratio;\n }\n vertical ??= resolveAxis(\n 'height',\n height,\n style.minHeight,\n style.maxHeight,\n constraints.minHeight,\n constraints.maxHeight,\n padding.top,\n padding.bottom,\n diagnosticContext,\n paddingFloor,\n );\n\n return {\n borderBox: {\n x: 0,\n y: 0,\n width: horizontal.border,\n height: vertical.border,\n },\n contentBox: {\n x: padding.left,\n y: padding.top,\n width: horizontal.content,\n height: vertical.content,\n },\n };\n}\n\nfunction resolveAxis(\n axis: 'width' | 'height',\n specified: SizingLength | undefined,\n specifiedMinimum: Exclude<SizingLength, 'auto'> | undefined,\n specifiedMaximum: Exclude<SizingLength, 'auto'> | undefined,\n constraintMinimum: number,\n constraintMaximum: number,\n paddingStart: number,\n paddingEnd: number,\n context: Readonly<LayoutDiagnosticContext>,\n paddingFloor: boolean,\n): { border: number; content: number } {\n const minimumProperty = axis === 'width' ? 'minWidth' : 'minHeight';\n const maximumProperty = axis === 'width' ? 'maxWidth' : 'maxHeight';\n const minimum =\n specifiedMinimum === undefined\n ? 0\n : resolveAllocationLength(\n specifiedMinimum,\n constraintMaximum,\n minimumProperty,\n context,\n );\n const maximum =\n specifiedMaximum === undefined\n ? Number.POSITIVE_INFINITY\n : resolveAllocationLength(\n specifiedMaximum,\n constraintMaximum,\n maximumProperty,\n context,\n );\n\n if (minimum > maximum) {\n throw layoutDiagnostic({\n ...context,\n property: minimumProperty,\n value: minimum,\n reason: `${minimumProperty} ${minimum} must not exceed ${maximumProperty} ${maximum}`,\n });\n }\n\n const padding = requireFiniteArithmetic(\n paddingStart + paddingEnd,\n axis,\n context,\n );\n const resolved =\n specified === undefined\n ? undefined\n : resolveScalarSizingLength(specified, constraintMaximum, axis, context);\n let content: number;\n if (resolved === undefined) {\n if (!Number.isFinite(constraintMaximum)) {\n throw layoutDiagnostic({\n ...context,\n property: axis,\n value: specified ?? 'auto',\n reason: 'requires a definite finite allocation for auto sizing',\n });\n }\n content = Math.max(\n 0,\n requireFiniteArithmetic(constraintMaximum - padding, axis, context),\n );\n } else {\n if (resolved < 0) {\n throw layoutDiagnostic({\n ...context,\n property: axis,\n value: specified,\n reason: 'must be nonnegative when used as a layout allocation',\n });\n }\n content = resolved;\n }\n\n content = Math.min(maximum, Math.max(minimum, content));\n const paddedContent = requireFiniteArithmetic(\n content + padding,\n axis,\n context,\n );\n const constrainedBorder = Math.min(\n constraintMaximum,\n Math.max(constraintMinimum, paddedContent),\n );\n const border = paddingFloor ? Math.max(padding, constrainedBorder) : constrainedBorder;\n return {\n border: requireFiniteArithmetic(border, axis, context),\n content: Math.max(\n 0,\n requireFiniteArithmetic(border - padding, axis, context),\n ),\n };\n}\n\nfunction requireFiniteArithmetic(\n value: number,\n property: string,\n context: Readonly<LayoutDiagnosticContext>,\n): number {\n if (!Number.isFinite(value)) {\n throw layoutDiagnostic({\n ...context,\n property,\n value,\n reason: 'resolved box arithmetic must remain finite',\n });\n }\n return value;\n}\n\nfunction resolveAllocationLength(\n value: Exclude<SizingLength, 'auto'>,\n reference: number,\n property: string,\n context: Readonly<LayoutDiagnosticContext>,\n): number {\n const resolved = resolveScalarSizingLength(value, reference, property, context)!;\n if (resolved < 0) {\n throw layoutDiagnostic({\n ...context,\n property,\n value,\n reason: 'must be nonnegative when used as a layout allocation',\n });\n }\n return resolved;\n}\n\nfunction validateConstraints(\n constraints: Readonly<Constraints>,\n context: Readonly<LayoutDiagnosticContext>,\n): void {\n validateConstraint(\n constraints.minWidth,\n 'constraints.minWidth',\n false,\n context,\n );\n validateConstraint(\n constraints.maxWidth,\n 'constraints.maxWidth',\n true,\n context,\n );\n validateConstraint(\n constraints.minHeight,\n 'constraints.minHeight',\n false,\n context,\n );\n validateConstraint(\n constraints.maxHeight,\n 'constraints.maxHeight',\n true,\n context,\n );\n\n if (constraints.minWidth > constraints.maxWidth) {\n throw layoutDiagnostic({\n ...context,\n property: 'constraints.minWidth',\n value: constraints.minWidth,\n reason: `constraints.minWidth ${constraints.minWidth} must not exceed constraints.maxWidth ${constraints.maxWidth}`,\n });\n }\n if (constraints.minHeight > constraints.maxHeight) {\n throw layoutDiagnostic({\n ...context,\n property: 'constraints.minHeight',\n value: constraints.minHeight,\n reason: `constraints.minHeight ${constraints.minHeight} must not exceed constraints.maxHeight ${constraints.maxHeight}`,\n });\n }\n}\n\nfunction validateConstraint(\n value: number,\n property: string,\n allowPositiveInfinity: boolean,\n context: Readonly<LayoutDiagnosticContext>,\n): void {\n if (\n !Number.isFinite(value) &&\n !(allowPositiveInfinity && value === Number.POSITIVE_INFINITY)\n ) {\n throw layoutDiagnostic({\n ...context,\n property,\n value,\n reason: 'must be finite',\n });\n }\n if (value < 0) {\n throw layoutDiagnostic({\n ...context,\n property,\n value,\n reason: 'must be nonnegative',\n });\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,13 @@
1
+ import type { RenderingContext2D, CanvasMeasurementService } from '../types.js';
2
+ /** Matches the existing retained Text metric policy; application faces are external inputs. */
3
+ export declare function isGenericCanvasFont(font: string): boolean;
4
+ /** @internal Pure Canvas metrics with explicit state isolation. */
5
+ export declare function canvasMeasurementService(context: RenderingContext2D): CanvasMeasurementService;
6
+ /** Internal wrappers are equivalent only when they target the same Canvas.
7
+ * Pure measurement clears render state, so compare the bound targets directly.
8
+ * Independent custom services retain strict identity semantics.
9
+ */
10
+ export declare function sameCanvasMeasurementService(left: CanvasMeasurementService, right: CanvasMeasurementService): boolean;
11
+ export declare function isCurrentCanvasMeasurementService(service: CanvasMeasurementService): boolean;
12
+ /** Avoid retaining a previous frame's temporary Canvas measurement target. */
13
+ export declare function bindCanvasMeasurementService(service: CanvasMeasurementService): () => CanvasMeasurementService;
@@ -0,0 +1,57 @@
1
+ import { markVolatileAllocationQuery } from "./allocation-checkpoint.js";
2
+ import { GLOBAL_STATE } from "../global-state.js";
3
+ function isGenericCanvasFont(font) {
4
+ return /^(?:(?:bold|italic|normal) )?\d+(?:\.\d+)?px (?:sans-serif|serif|monospace)$/.test(font);
5
+ }
6
+ const serviceContexts = /* @__PURE__ */ new WeakMap();
7
+ function canvasMeasurementService(context) {
8
+ const service = {
9
+ measureText(text, font) {
10
+ if (!isGenericCanvasFont(font)) markVolatileAllocationQuery();
11
+ context.save();
12
+ try {
13
+ context.font = font;
14
+ return context.measureText(text);
15
+ } finally {
16
+ context.restore();
17
+ }
18
+ },
19
+ measureTextAtBaseline(text, options) {
20
+ if (!isGenericCanvasFont(options.font)) markVolatileAllocationQuery();
21
+ context.save();
22
+ try {
23
+ context.font = options.font;
24
+ context.textBaseline = options.textBaseline;
25
+ return context.measureText(text);
26
+ } finally {
27
+ context.restore();
28
+ }
29
+ }
30
+ };
31
+ serviceContexts.set(service, context);
32
+ return service;
33
+ }
34
+ function sameCanvasMeasurementService(left, right) {
35
+ if (left === right) return true;
36
+ const context = serviceContexts.get(left);
37
+ return context !== void 0 && context === serviceContexts.get(right);
38
+ }
39
+ function isCurrentCanvasMeasurementService(service) {
40
+ return GLOBAL_STATE.renderContext !== void 0 && serviceContexts.get(service) === GLOBAL_STATE.renderContext;
41
+ }
42
+ function currentCanvasMeasurementService() {
43
+ const context = GLOBAL_STATE.renderContext;
44
+ if (!context) throw new Error("A mounted measurement replay requires its current Canvas context.");
45
+ return canvasMeasurementService(context);
46
+ }
47
+ function bindCanvasMeasurementService(service) {
48
+ return isCurrentCanvasMeasurementService(service) ? currentCanvasMeasurementService : () => service;
49
+ }
50
+ export {
51
+ bindCanvasMeasurementService,
52
+ canvasMeasurementService,
53
+ isCurrentCanvasMeasurementService,
54
+ isGenericCanvasFont,
55
+ sameCanvasMeasurementService
56
+ };
57
+ //# sourceMappingURL=canvas-measurement.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/lib/layout/canvas-measurement.ts"],
4
+ "sourcesContent": ["import { markVolatileAllocationQuery } from './allocation-checkpoint.js';\nimport { GLOBAL_STATE } from '../global-state.js';\nimport type { RenderingContext2D, CanvasMeasurementService } from '../types.js';\n\n/** Matches the existing retained Text metric policy; application faces are external inputs. */\nexport function isGenericCanvasFont(font: string): boolean {\n return /^(?:(?:bold|italic|normal) )?\\d+(?:\\.\\d+)?px (?:sans-serif|serif|monospace)$/.test(font);\n}\n\nconst serviceContexts = new WeakMap<CanvasMeasurementService, RenderingContext2D>();\n\n/** @internal Pure Canvas metrics with explicit state isolation. */\nexport function canvasMeasurementService(\n context: RenderingContext2D,\n): CanvasMeasurementService {\n const service: CanvasMeasurementService = {\n measureText(text: string, font: string): TextMetrics {\n if (!isGenericCanvasFont(font)) markVolatileAllocationQuery();\n context.save();\n try {\n context.font = font;\n return context.measureText(text);\n } finally {\n context.restore();\n }\n },\n measureTextAtBaseline(\n text: string,\n options: Readonly<{ font: string; textBaseline: CanvasTextBaseline }>,\n ): TextMetrics {\n if (!isGenericCanvasFont(options.font)) markVolatileAllocationQuery();\n context.save();\n try {\n context.font = options.font;\n context.textBaseline = options.textBaseline;\n return context.measureText(text);\n } finally {\n context.restore();\n }\n },\n };\n serviceContexts.set(service, context);\n return service;\n}\n\n/** Internal wrappers are equivalent only when they target the same Canvas.\n * Pure measurement clears render state, so compare the bound targets directly.\n * Independent custom services retain strict identity semantics.\n */\nexport function sameCanvasMeasurementService(left: CanvasMeasurementService, right: CanvasMeasurementService): boolean {\n if (left === right) return true;\n const context = serviceContexts.get(left);\n return context !== undefined && context === serviceContexts.get(right);\n}\n\nexport function isCurrentCanvasMeasurementService(service: CanvasMeasurementService): boolean {\n return GLOBAL_STATE.renderContext !== undefined && serviceContexts.get(service) === GLOBAL_STATE.renderContext;\n}\nfunction currentCanvasMeasurementService(): CanvasMeasurementService {\n const context = GLOBAL_STATE.renderContext;\n if (!context) throw new Error('A mounted measurement replay requires its current Canvas context.');\n return canvasMeasurementService(context);\n}\n/** Avoid retaining a previous frame's temporary Canvas measurement target. */\nexport function bindCanvasMeasurementService(service: CanvasMeasurementService): () => CanvasMeasurementService {\n return isCurrentCanvasMeasurementService(service) ? currentCanvasMeasurementService : () => service;\n}\n"],
5
+ "mappings": "AAAA,SAAS,mCAAmC;AAC5C,SAAS,oBAAoB;AAItB,SAAS,oBAAoB,MAAuB;AACzD,SAAO,+EAA+E,KAAK,IAAI;AACjG;AAEA,MAAM,kBAAkB,oBAAI,QAAsD;AAG3E,SAAS,yBACd,SAC0B;AAC1B,QAAM,UAAoC;AAAA,IACxC,YAAY,MAAc,MAA2B;AACnD,UAAI,CAAC,oBAAoB,IAAI,EAAG,6BAA4B;AAC5D,cAAQ,KAAK;AACb,UAAI;AACF,gBAAQ,OAAO;AACf,eAAO,QAAQ,YAAY,IAAI;AAAA,MACjC,UAAE;AACA,gBAAQ,QAAQ;AAAA,MAClB;AAAA,IACF;AAAA,IACA,sBACE,MACA,SACa;AACb,UAAI,CAAC,oBAAoB,QAAQ,IAAI,EAAG,6BAA4B;AACpE,cAAQ,KAAK;AACb,UAAI;AACF,gBAAQ,OAAO,QAAQ;AACvB,gBAAQ,eAAe,QAAQ;AAC/B,eAAO,QAAQ,YAAY,IAAI;AAAA,MACjC,UAAE;AACA,gBAAQ,QAAQ;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AACA,kBAAgB,IAAI,SAAS,OAAO;AACpC,SAAO;AACT;AAMO,SAAS,6BAA6B,MAAgC,OAA0C;AACrH,MAAI,SAAS,MAAO,QAAO;AAC3B,QAAM,UAAU,gBAAgB,IAAI,IAAI;AACxC,SAAO,YAAY,UAAa,YAAY,gBAAgB,IAAI,KAAK;AACvE;AAEO,SAAS,kCAAkC,SAA4C;AAC5F,SAAO,aAAa,kBAAkB,UAAa,gBAAgB,IAAI,OAAO,MAAM,aAAa;AACnG;AACA,SAAS,kCAA4D;AACnE,QAAM,UAAU,aAAa;AAC7B,MAAI,CAAC,QAAS,OAAM,IAAI,MAAM,mEAAmE;AACjG,SAAO,yBAAyB,OAAO;AACzC;AAEO,SAAS,6BAA6B,SAAmE;AAC9G,SAAO,kCAAkC,OAAO,IAAI,kCAAkC,MAAM;AAC9F;",
6
+ "names": []
7
+ }
@@ -1,13 +1,42 @@
1
- import type { LayoutBox } from './types.js';
1
+ import type { BoxStyle } from "../style/types.js";
2
+ import type { LayoutBox } from "./types.js";
3
+ /** @internal A pushed allocation remains active through ordinary components. */
4
+ export declare function hasParentLayoutAllocation(): boolean;
5
+ /** @internal Inherited inline direction; roots default to LTR. */
6
+ export declare function getLayoutDirection(): "ltr" | "rtl";
2
7
  export declare function getLayoutBox(): Readonly<LayoutBox>;
3
8
  export declare function getPercentageBasis(): Readonly<LayoutBox>;
9
+ /** @internal Current accumulated layout origin, before Canvas presentation transforms. */
10
+ export declare function getLogicalLayoutOrigin(): Readonly<{
11
+ x: number;
12
+ y: number;
13
+ }>;
14
+ /** The nearest positioned layout box, expressed before presentation transforms. */
15
+ export declare function getLogicalContainingBox(): Readonly<LayoutBox>;
4
16
  /**
5
- * Pushes a layout allocation for nested evaluation and returns the callback that restores the
6
- * previous allocation.
17
+ * Resolves the positioned containing block in the current layout coordinates.
18
+ * A positioned layout boundary owns its padding box; a static boundary stays
19
+ * transparent and inherits the nearest positioned ancestor.
7
20
  *
8
- * @param box - Parent allocation to expose to child layout hooks. See {@link LayoutBox}.
9
- * @returns A function restoring the previous layout box.
21
+ * @internal
22
+ */
23
+ export declare function resolvePositionedContainingBox(style: Readonly<BoxStyle & {
24
+ readonly position?: string;
25
+ }>, content: Readonly<LayoutBox>, component: string): Readonly<LayoutBox> | undefined;
26
+ /**
27
+ * Pushes one finite layout allocation and returns its exact restoration callback.
28
+ *
29
+ * @param box - Child allocation to expose during nested layout work.
30
+ * @param options - Optional inherited direction and containing-block metadata.
31
+ * @returns A callback that restores the prior layout context.
10
32
  *
11
33
  * @see {@link LayoutBox}
12
34
  */
13
- export declare function pushLayoutBox(box: Readonly<LayoutBox>): () => void;
35
+ export declare function pushLayoutBox(box: Readonly<LayoutBox>, options?: {
36
+ readonly layoutDirection?: "ltr" | "rtl";
37
+ readonly logicalOffset?: Readonly<{
38
+ x: number;
39
+ y: number;
40
+ }>;
41
+ readonly containingBlock?: Readonly<LayoutBox>;
42
+ }): () => void;
@@ -1,4 +1,11 @@
1
1
  import { GLOBAL_STATE } from "../global-state.js";
2
+ import { normalizePaddingInsets } from "./box-insets.js";
3
+ function hasParentLayoutAllocation() {
4
+ return (GLOBAL_STATE.layoutStack?.length ?? 0) > 1;
5
+ }
6
+ function getLayoutDirection() {
7
+ return GLOBAL_STATE.layoutStack?.at(-1)?.layoutDirection ?? "ltr";
8
+ }
2
9
  function getLayoutBox() {
3
10
  const context = GLOBAL_STATE.layoutStack?.at(-1);
4
11
  if (!context) {
@@ -13,7 +20,46 @@ function getPercentageBasis() {
13
20
  }
14
21
  return context.percentageBasis;
15
22
  }
16
- function pushLayoutBox(box) {
23
+ const logicalContexts = /* @__PURE__ */ new WeakMap();
24
+ const ROOT_LOGICAL_ORIGIN = Object.freeze({ x: 0, y: 0 });
25
+ function getLogicalLayoutOrigin() {
26
+ const context = GLOBAL_STATE.layoutStack?.at(-1);
27
+ if (!context) throw new Error("No Pibbl layout context is available");
28
+ return logicalContexts.get(context) ?? ROOT_LOGICAL_ORIGIN;
29
+ }
30
+ function getLogicalContainingBox() {
31
+ const context = GLOBAL_STATE.layoutStack?.at(-1);
32
+ if (!context)
33
+ throw new Error("No Pibbl containing layout context is available");
34
+ const logical = logicalContexts.get(context);
35
+ if (!logical) return context.allocation;
36
+ return {
37
+ x: logical.containing.x - logical.x,
38
+ y: logical.containing.y - logical.y,
39
+ width: logical.containing.width,
40
+ height: logical.containing.height
41
+ };
42
+ }
43
+ function resolvePositionedContainingBox(style, content, component) {
44
+ if (style.position === "static") return void 0;
45
+ const padding = normalizePaddingInsets(style, {
46
+ component,
47
+ algorithm: "containing block",
48
+ constraints: {
49
+ minWidth: 0,
50
+ maxWidth: content.width,
51
+ minHeight: 0,
52
+ maxHeight: content.height
53
+ }
54
+ });
55
+ return Object.freeze({
56
+ x: content.x - padding.left,
57
+ y: content.y - padding.top,
58
+ width: content.width + padding.left + padding.right,
59
+ height: content.height + padding.top + padding.bottom
60
+ });
61
+ }
62
+ function pushLayoutBox(box, options) {
17
63
  const stack = GLOBAL_STATE.layoutStack;
18
64
  if (!stack) {
19
65
  throw new Error("No Pibbl layout context is available");
@@ -22,7 +68,25 @@ function pushLayoutBox(box) {
22
68
  if (!parent) {
23
69
  throw new Error("No Pibbl parent layout context is available");
24
70
  }
25
- const context = { allocation: box, percentageBasis: parent.allocation };
71
+ const context = {
72
+ allocation: box,
73
+ percentageBasis: parent.allocation,
74
+ layoutDirection: options?.layoutDirection ?? parent.layoutDirection ?? "ltr"
75
+ };
76
+ const inherited = logicalContexts.get(parent);
77
+ const x = (inherited?.x ?? 0) + (options?.logicalOffset?.x ?? 0);
78
+ const y = (inherited?.y ?? 0) + (options?.logicalOffset?.y ?? 0);
79
+ const declared = options?.containingBlock;
80
+ logicalContexts.set(context, {
81
+ x,
82
+ y,
83
+ containing: declared ? {
84
+ x: x + declared.x,
85
+ y: y + declared.y,
86
+ width: declared.width,
87
+ height: declared.height
88
+ } : inherited?.containing ?? parent.allocation
89
+ });
26
90
  stack.push(context);
27
91
  let active = true;
28
92
  return () => {
@@ -36,7 +100,12 @@ function pushLayoutBox(box) {
36
100
  }
37
101
  export {
38
102
  getLayoutBox,
103
+ getLayoutDirection,
104
+ getLogicalContainingBox,
105
+ getLogicalLayoutOrigin,
39
106
  getPercentageBasis,
40
- pushLayoutBox
107
+ hasParentLayoutAllocation,
108
+ pushLayoutBox,
109
+ resolvePositionedContainingBox
41
110
  };
42
111
  //# sourceMappingURL=context.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/lib/layout/context.ts"],
4
- "sourcesContent": ["import { GLOBAL_STATE } from '../global-state.js';\nimport type { LayoutBox } from './types.js';\n\nexport function getLayoutBox(): Readonly<LayoutBox> {\n const context = GLOBAL_STATE.layoutStack?.at(-1);\n if (!context) {\n throw new Error('No Pibbl layout context is available');\n }\n return context.allocation;\n}\n\nexport function getPercentageBasis(): Readonly<LayoutBox> {\n const context = GLOBAL_STATE.layoutStack?.at(-1);\n if (!context) {\n throw new Error('No Pibbl layout context is available');\n }\n return context.percentageBasis;\n}\n\n/**\n * Pushes a layout allocation for nested evaluation and returns the callback that restores the\n * previous allocation.\n *\n * @param box - Parent allocation to expose to child layout hooks. See {@link LayoutBox}.\n * @returns A function restoring the previous layout box.\n *\n * @see {@link LayoutBox}\n */\nexport function pushLayoutBox(box: Readonly<LayoutBox>): () => void {\n const stack = GLOBAL_STATE.layoutStack;\n if (!stack) {\n throw new Error('No Pibbl layout context is available');\n }\n const parent = stack.at(-1);\n if (!parent) {\n throw new Error('No Pibbl parent layout context is available');\n }\n const context = { allocation: box, percentageBasis: parent.allocation };\n stack.push(context);\n let active = true;\n return () => {\n if (!active) return;\n active = false;\n if (stack.at(-1) !== context) {\n throw new Error('Pibbl layout context was restored out of order');\n }\n stack.pop();\n };\n}\n"],
5
- "mappings": "AAAA,SAAS,oBAAoB;AAGtB,SAAS,eAAoC;AAClD,QAAM,UAAU,aAAa,aAAa,GAAG,EAAE;AAC/C,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,sCAAsC;AAAA,EACxD;AACA,SAAO,QAAQ;AACjB;AAEO,SAAS,qBAA0C;AACxD,QAAM,UAAU,aAAa,aAAa,GAAG,EAAE;AAC/C,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,sCAAsC;AAAA,EACxD;AACA,SAAO,QAAQ;AACjB;AAWO,SAAS,cAAc,KAAsC;AAClE,QAAM,QAAQ,aAAa;AAC3B,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,sCAAsC;AAAA,EACxD;AACA,QAAM,SAAS,MAAM,GAAG,EAAE;AAC1B,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,MAAM,6CAA6C;AAAA,EAC/D;AACA,QAAM,UAAU,EAAE,YAAY,KAAK,iBAAiB,OAAO,WAAW;AACtE,QAAM,KAAK,OAAO;AAClB,MAAI,SAAS;AACb,SAAO,MAAM;AACX,QAAI,CAAC,OAAQ;AACb,aAAS;AACT,QAAI,MAAM,GAAG,EAAE,MAAM,SAAS;AAC5B,YAAM,IAAI,MAAM,gDAAgD;AAAA,IAClE;AACA,UAAM,IAAI;AAAA,EACZ;AACF;",
4
+ "sourcesContent": ["import { GLOBAL_STATE } from \"../global-state.js\";\nimport { normalizePaddingInsets } from \"./box-insets.js\";\nimport type { BoxStyle } from \"../style/types.js\";\nimport type { LayoutBox } from \"./types.js\";\n\n/** @internal A pushed allocation remains active through ordinary components. */\nexport function hasParentLayoutAllocation(): boolean {\n return (GLOBAL_STATE.layoutStack?.length ?? 0) > 1;\n}\n\n/** @internal Inherited inline direction; roots default to LTR. */\nexport function getLayoutDirection(): \"ltr\" | \"rtl\" {\n return GLOBAL_STATE.layoutStack?.at(-1)?.layoutDirection ?? \"ltr\";\n}\n\nexport function getLayoutBox(): Readonly<LayoutBox> {\n const context = GLOBAL_STATE.layoutStack?.at(-1);\n if (!context) {\n throw new Error(\"No Pibbl layout context is available\");\n }\n return context.allocation;\n}\n\nexport function getPercentageBasis(): Readonly<LayoutBox> {\n const context = GLOBAL_STATE.layoutStack?.at(-1);\n if (!context) {\n throw new Error(\"No Pibbl layout context is available\");\n }\n return context.percentageBasis;\n}\n\ninterface LogicalLayoutContext {\n readonly x: number;\n readonly y: number;\n readonly containing: Readonly<LayoutBox>;\n}\nconst logicalContexts = new WeakMap<object, LogicalLayoutContext>();\nconst ROOT_LOGICAL_ORIGIN = Object.freeze({ x: 0, y: 0 });\n\n/** @internal Current accumulated layout origin, before Canvas presentation transforms. */\nexport function getLogicalLayoutOrigin(): Readonly<{ x: number; y: number }> {\n const context = GLOBAL_STATE.layoutStack?.at(-1);\n if (!context) throw new Error('No Pibbl layout context is available');\n return logicalContexts.get(context) ?? ROOT_LOGICAL_ORIGIN;\n}\n\n/** The nearest positioned layout box, expressed before presentation transforms. */\nexport function getLogicalContainingBox(): Readonly<LayoutBox> {\n const context = GLOBAL_STATE.layoutStack?.at(-1);\n if (!context)\n throw new Error(\"No Pibbl containing layout context is available\");\n const logical = logicalContexts.get(context);\n if (!logical) return context.allocation;\n return {\n x: logical.containing.x - logical.x,\n y: logical.containing.y - logical.y,\n width: logical.containing.width,\n height: logical.containing.height,\n };\n}\n\n/**\n * Resolves the positioned containing block in the current layout coordinates.\n * A positioned layout boundary owns its padding box; a static boundary stays\n * transparent and inherits the nearest positioned ancestor.\n *\n * @internal\n */\nexport function resolvePositionedContainingBox(\n style: Readonly<BoxStyle & { readonly position?: string }>,\n content: Readonly<LayoutBox>,\n component: string,\n): Readonly<LayoutBox> | undefined {\n if (style.position === \"static\") return undefined;\n const padding = normalizePaddingInsets(style, {\n component,\n algorithm: \"containing block\",\n constraints: {\n minWidth: 0,\n maxWidth: content.width,\n minHeight: 0,\n maxHeight: content.height,\n },\n });\n return Object.freeze({\n x: content.x - padding.left,\n y: content.y - padding.top,\n width: content.width + padding.left + padding.right,\n height: content.height + padding.top + padding.bottom,\n });\n}\n\n/**\n * Pushes one finite layout allocation and returns its exact restoration callback.\n *\n * @param box - Child allocation to expose during nested layout work.\n * @param options - Optional inherited direction and containing-block metadata.\n * @returns A callback that restores the prior layout context.\n *\n * @see {@link LayoutBox}\n */\nexport function pushLayoutBox(\n box: Readonly<LayoutBox>,\n options?: {\n readonly layoutDirection?: \"ltr\" | \"rtl\";\n readonly logicalOffset?: Readonly<{ x: number; y: number }>;\n readonly containingBlock?: Readonly<LayoutBox>;\n },\n): () => void {\n const stack = GLOBAL_STATE.layoutStack;\n if (!stack) {\n throw new Error(\"No Pibbl layout context is available\");\n }\n const parent = stack.at(-1);\n if (!parent) {\n throw new Error(\"No Pibbl parent layout context is available\");\n }\n const context = {\n allocation: box,\n percentageBasis: parent.allocation,\n layoutDirection:\n options?.layoutDirection ?? parent.layoutDirection ?? \"ltr\",\n };\n const inherited = logicalContexts.get(parent);\n const x = (inherited?.x ?? 0) + (options?.logicalOffset?.x ?? 0);\n const y = (inherited?.y ?? 0) + (options?.logicalOffset?.y ?? 0);\n const declared = options?.containingBlock;\n logicalContexts.set(context, {\n x,\n y,\n containing: declared\n ? {\n x: x + declared.x,\n y: y + declared.y,\n width: declared.width,\n height: declared.height,\n }\n : (inherited?.containing ?? parent.allocation),\n });\n stack.push(context);\n let active = true;\n return () => {\n if (!active) return;\n active = false;\n if (stack.at(-1) !== context) {\n throw new Error(\"Pibbl layout context was restored out of order\");\n }\n stack.pop();\n };\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,23 @@
1
+ import type { PibblComponent, PibblElement, PibblNodeInput } from '../element/types.js';
2
+ import { type PreparedStyleInput } from '../style/resolve-dispatch.js';
3
+ /**
4
+ * Defines pure reusable structure that a parent can inspect before allocation.
5
+ * The description returns one drawing or layout primitive root, optionally inside
6
+ * transparent fragments. Forward any authored style explicitly to that root.
7
+ * Signal reads are supported; hooks, Canvas/allocation reads, writes and resource
8
+ * creation are excluded. Descriptions are shared only within one transaction.
9
+ *
10
+ * @param describe - Pure synchronous description using authored readonly props.
11
+ * @returns A component for JSX or createElement, preserving normal type/key identity.
12
+ * @throws When called directly, or when its description has no single primitive root.
13
+ * @see {@link PibblComponent}
14
+ * @see {@link PibblNodeInput}
15
+ */
16
+ export declare function defineLayoutComponent<P>(describe: (props: Readonly<P>) => PibblNodeInput): PibblComponent<P>;
17
+ export declare function isLayoutComponent(type: Function): boolean;
18
+ /** One prepared root per layout occurrence, never cached by mutable prop identity. */
19
+ export declare function prepareLayoutComponent(element: PibblElement<any>, options?: {
20
+ receiverToken?: object;
21
+ }): PibblElement<any>;
22
+ /** Carries the parent's settled content size into the same prepared root. */
23
+ export declare function placedLayoutComponentRoot(element: PibblElement<any>, style?: PreparedStyleInput): PibblElement<any>;
@@ -0,0 +1,84 @@
1
+ import { clonePibblElement } from "../element/create-element.js";
2
+ import { materializeContainerChildren } from "../element/children.js";
3
+ import { getChildPrimitiveReceiverToken, getElementMetadata, setElementMetadata, getPrimitiveDefinition, getPrimitiveReceiverToken, setPrimitiveReceiverToken, isPlacementConsumed, setPlacementConsumed } from "../element/metadata.js";
4
+ import { GLOBAL_STATE } from "../global-state.js";
5
+ import { withHooksForbidden } from "../hooks/hook-slot.js";
6
+ import { withSignalWriteForbidden } from "../signals/graph.js";
7
+ import { adoptReceiverInputProvision, withReceiverInputProvision } from "../signals/input-provision.js";
8
+ import { withIsolatedRenderState } from "./measure.js";
9
+ import { setPreNormalizedStyle } from "../style/resolve-dispatch.js";
10
+ const definitions = /* @__PURE__ */ new WeakMap();
11
+ const transactions = /* @__PURE__ */ new WeakMap();
12
+ function defineLayoutComponent(describe) {
13
+ if (typeof describe !== "function") throw new TypeError("A layout description must be a function.");
14
+ const component = function LayoutComponent() {
15
+ throw new Error("Mount layout components through JSX or createElement; do not call them directly.");
16
+ };
17
+ definitions.set(component, describe);
18
+ return component;
19
+ }
20
+ function isLayoutComponent(type) {
21
+ return definitions.has(type);
22
+ }
23
+ function prepareLayoutComponent(element, options) {
24
+ const describe = definitions.get(element.type);
25
+ if (!describe) throw new Error("The element has no structural layout description.");
26
+ const transaction = GLOBAL_STATE.renderTransaction;
27
+ const receiver = options?.receiverToken ?? getPrimitiveReceiverToken(element) ?? (GLOBAL_STATE.componentRefs?.element === element ? GLOBAL_STATE.componentRefs : element);
28
+ let prepared = transaction ? transactions.get(transaction) : void 0;
29
+ const cached = prepared?.get(receiver);
30
+ if (cached) return cached;
31
+ const root = withHooksForbidden(
32
+ "Hooks are forbidden in a layout description.",
33
+ () => withSignalWriteForbidden(
34
+ "Signal writes are forbidden in a layout description.",
35
+ () => withIsolatedRenderState(() => withReceiverInputProvision(transaction, receiver, () => {
36
+ const roots = materializeContainerChildren(describe(element.props), element);
37
+ if (roots.length !== 1 || !getPrimitiveDefinition(roots[0].type)) {
38
+ throw new Error("A layout description must return exactly one drawing or layout primitive root.");
39
+ }
40
+ const root2 = clonePibblElement(roots[0]);
41
+ setElementMetadata(root2, {
42
+ ...getElementMetadata(root2),
43
+ layoutDescriptionSource: getElementMetadata(roots[0])?.layoutDescriptionSource ?? roots[0]
44
+ });
45
+ return root2;
46
+ }))
47
+ )
48
+ );
49
+ const current = GLOBAL_STATE.componentRefs;
50
+ if (current && (getPrimitiveReceiverToken(current.element) ?? current) === receiver) {
51
+ adoptReceiverInputProvision(transaction, receiver);
52
+ }
53
+ setPrimitiveReceiverToken(root, getChildPrimitiveReceiverToken(transaction, receiver, 0));
54
+ if (transaction) {
55
+ if (!prepared) {
56
+ prepared = /* @__PURE__ */ new WeakMap();
57
+ transactions.set(transaction, prepared);
58
+ }
59
+ prepared.set(receiver, root);
60
+ }
61
+ return root;
62
+ }
63
+ function placedLayoutComponentRoot(element, style) {
64
+ const root = prepareLayoutComponent(element);
65
+ const slot = getElementMetadata(element)?.preparedLayoutSlot;
66
+ if (!style && !slot) return root;
67
+ const placed = clonePibblElement(root);
68
+ if (isPlacementConsumed(element)) setPlacementConsumed(placed);
69
+ if (style) setPreNormalizedStyle(placed, style.style, root, getPrimitiveReceiverToken(root), style.query);
70
+ const metadata = getElementMetadata(element);
71
+ if (slot || metadata?.absoluteContainingBlock) setElementMetadata(placed, {
72
+ ...getElementMetadata(placed),
73
+ ...slot ? { preparedLayoutSlot: slot } : void 0,
74
+ ...metadata?.absoluteContainingBlock ? { absoluteContainingBlock: metadata.absoluteContainingBlock } : void 0
75
+ });
76
+ return placed;
77
+ }
78
+ export {
79
+ defineLayoutComponent,
80
+ isLayoutComponent,
81
+ placedLayoutComponentRoot,
82
+ prepareLayoutComponent
83
+ };
84
+ //# sourceMappingURL=define-layout-component.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/lib/layout/define-layout-component.ts"],
4
+ "sourcesContent": ["import type { PibblComponent, PibblElement, PibblNodeInput } from '../element/types.js';\nimport { clonePibblElement } from '../element/create-element.js';\nimport { materializeContainerChildren } from '../element/children.js';\nimport { getChildPrimitiveReceiverToken, getElementMetadata, setElementMetadata, getPrimitiveDefinition, getPrimitiveReceiverToken, setPrimitiveReceiverToken, isPlacementConsumed, setPlacementConsumed } from '../element/metadata.js';\nimport { GLOBAL_STATE } from '../global-state.js';\nimport { withHooksForbidden } from '../hooks/hook-slot.js';\nimport { withSignalWriteForbidden } from '../signals/graph.js';\nimport { adoptReceiverInputProvision, withReceiverInputProvision } from '../signals/input-provision.js';\nimport type { PibblRenderTransaction } from '../types.js';\nimport { withIsolatedRenderState } from './measure.js';\nimport { setPreNormalizedStyle, type PreparedStyleInput } from '../style/resolve-dispatch.js';\n\nconst definitions = new WeakMap<Function, (props: any) => PibblNodeInput>();\nconst transactions = new WeakMap<PibblRenderTransaction, WeakMap<object, PibblElement<any>>>();\n\n/**\n * Defines pure reusable structure that a parent can inspect before allocation.\n * The description returns one drawing or layout primitive root, optionally inside\n * transparent fragments. Forward any authored style explicitly to that root.\n * Signal reads are supported; hooks, Canvas/allocation reads, writes and resource\n * creation are excluded. Descriptions are shared only within one transaction.\n *\n * @param describe - Pure synchronous description using authored readonly props.\n * @returns A component for JSX or createElement, preserving normal type/key identity.\n * @throws When called directly, or when its description has no single primitive root.\n * @see {@link PibblComponent}\n * @see {@link PibblNodeInput}\n */\nexport function defineLayoutComponent<P>(\n describe: (props: Readonly<P>) => PibblNodeInput,\n): PibblComponent<P> {\n if (typeof describe !== 'function') throw new TypeError('A layout description must be a function.');\n const component: PibblComponent<P> = function LayoutComponent() {\n throw new Error('Mount layout components through JSX or createElement; do not call them directly.');\n };\n definitions.set(component, describe);\n return component;\n}\n\nexport function isLayoutComponent(type: Function): boolean { return definitions.has(type); }\n\n/** One prepared root per layout occurrence, never cached by mutable prop identity. */\nexport function prepareLayoutComponent(\n element: PibblElement<any>, options?: { receiverToken?: object },\n): PibblElement<any> {\n const describe = definitions.get(element.type);\n if (!describe) throw new Error('The element has no structural layout description.');\n const transaction = GLOBAL_STATE.renderTransaction;\n const receiver = options?.receiverToken ?? getPrimitiveReceiverToken(element) ??\n (GLOBAL_STATE.componentRefs?.element === element ? GLOBAL_STATE.componentRefs : element);\n let prepared = transaction ? transactions.get(transaction) : undefined;\n const cached = prepared?.get(receiver);\n if (cached) return cached;\n const root = withHooksForbidden('Hooks are forbidden in a layout description.', () =>\n withSignalWriteForbidden('Signal writes are forbidden in a layout description.', () =>\n withIsolatedRenderState(() => withReceiverInputProvision(transaction, receiver, () => {\n const roots = materializeContainerChildren(describe(element.props), element);\n if (roots.length !== 1 || !getPrimitiveDefinition(roots[0].type)) {\n throw new Error('A layout description must return exactly one drawing or layout primitive root.');\n }\n const root = clonePibblElement(roots[0]);\n setElementMetadata(root, {\n ...getElementMetadata(root),\n layoutDescriptionSource: getElementMetadata(roots[0])?.layoutDescriptionSource ?? roots[0],\n });\n return root;\n })),\n ),\n );\n const current = GLOBAL_STATE.componentRefs;\n if (current && (getPrimitiveReceiverToken(current.element) ?? current) === receiver) {\n adoptReceiverInputProvision(transaction, receiver);\n }\n setPrimitiveReceiverToken(root, getChildPrimitiveReceiverToken(transaction, receiver, 0));\n if (transaction) {\n if (!prepared) { prepared = new WeakMap(); transactions.set(transaction, prepared); }\n prepared.set(receiver, root);\n }\n return root;\n}\n\n/** Carries the parent's settled content size into the same prepared root. */\nexport function placedLayoutComponentRoot(element: PibblElement<any>, style?: PreparedStyleInput): PibblElement<any> {\n const root = prepareLayoutComponent(element);\n const slot = getElementMetadata(element)?.preparedLayoutSlot;\n if (!style && !slot) return root;\n const placed = clonePibblElement(root);\n // The description is transparent: its one actual root consumes the already\n // allocated placement, including explicit static/relative positioning, once.\n if (isPlacementConsumed(element)) setPlacementConsumed(placed);\n if (style) setPreNormalizedStyle(placed, style.style, root, getPrimitiveReceiverToken(root), style.query);\n const metadata = getElementMetadata(element);\n if (slot || metadata?.absoluteContainingBlock) setElementMetadata(placed, {\n ...getElementMetadata(placed),\n ...(slot ? { preparedLayoutSlot: slot } : undefined),\n ...(metadata?.absoluteContainingBlock ? { absoluteContainingBlock: metadata.absoluteContainingBlock } : undefined),\n });\n return placed;\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["root"]
7
+ }
@@ -0,0 +1,42 @@
1
+ import { FLEX_BASELINE_GROUP, FLEX_LAST_BASELINE } from './flex-baseline-mode.js';
2
+ import type { PibblElement } from '../element/types.js';
3
+ import type { AllocationInputState } from './allocation-revision.js';
4
+ import type { LayoutBox } from './types.js';
5
+ export interface AllocationSettings {
6
+ [FLEX_BASELINE_GROUP]?: boolean;
7
+ [FLEX_LAST_BASELINE]?: boolean;
8
+ layoutDirection: 'ltr' | 'rtl';
9
+ flexDirection: string;
10
+ flexWrap: string;
11
+ justifyContent: string;
12
+ alignItems: string;
13
+ alignContent: string;
14
+ rowGap: number;
15
+ columnGap: number;
16
+ }
17
+ export interface CachedFlexPlacement {
18
+ readonly box: Readonly<LayoutBox>;
19
+ /** Physical outer y before relative paint translation. */
20
+ readonly layoutY: number;
21
+ readonly usedWidth: number;
22
+ readonly usedHeight: number;
23
+ }
24
+ type SignalVersionNode = Readonly<{
25
+ version: number;
26
+ }>;
27
+ /** One scalar snapshot; its input identity is weak and never owns descriptors. */
28
+ export declare class FlexAllocationCache {
29
+ private input;
30
+ private state;
31
+ private dependencies;
32
+ private width;
33
+ private height;
34
+ private settings;
35
+ private placements;
36
+ read(input: unknown, state: AllocationInputState, box: Readonly<LayoutBox>, settings: AllocationSettings): readonly CachedFlexPlacement[] | undefined;
37
+ store(input: object, state: AllocationInputState, box: Readonly<LayoutBox>, settings: AllocationSettings, placements: readonly CachedFlexPlacement[], dependencies?: readonly SignalVersionNode[]): void;
38
+ }
39
+ /** Captures only declared frozen metric signals; opaque components never participate. */
40
+ export declare function frozenFlexMetricDependencies(input: unknown): readonly SignalVersionNode[] | undefined;
41
+ export declare function frozenFlexInputs(input: unknown, dependencies?: SignalVersionNode[]): input is readonly PibblElement<any>[];
42
+ export {};
@@ -0,0 +1,2 @@
1
+ export declare const FLEX_BASELINE_GROUP: unique symbol;
2
+ export declare const FLEX_LAST_BASELINE: unique symbol;
@@ -0,0 +1,7 @@
1
+ const FLEX_BASELINE_GROUP = /* @__PURE__ */ Symbol("pibbl.flex-baseline-group");
2
+ const FLEX_LAST_BASELINE = /* @__PURE__ */ Symbol("pibbl.flex-last-baseline");
3
+ export {
4
+ FLEX_BASELINE_GROUP,
5
+ FLEX_LAST_BASELINE
6
+ };
7
+ //# sourceMappingURL=flex-baseline-mode.js.map