@pibbl/core 0.0.2 → 0.0.3-alpha.109.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (549) hide show
  1. package/THIRD_PARTY_NOTICES.txt +81 -0
  2. package/dist/features/physics/2d-testing.d.ts +1 -1
  3. package/dist/features/physics/2d-testing.js +2 -2
  4. package/dist/features/physics/2d-testing.js.map +2 -2
  5. package/dist/features/physics/lib/2d/canvas/components.js +25 -21
  6. package/dist/features/physics/lib/2d/canvas/components.js.map +2 -2
  7. package/dist/features/physics/lib/2d/canvas/presentation.js +1 -2
  8. package/dist/features/physics/lib/2d/canvas/presentation.js.map +2 -2
  9. package/dist/features/physics/lib/2d/collision/casts.js +4 -2
  10. package/dist/features/physics/lib/2d/collision/casts.js.map +2 -2
  11. package/dist/features/physics/lib/2d/runtime/controller.js +1 -1
  12. package/dist/features/physics/lib/2d/runtime/controller.js.map +2 -2
  13. package/dist/features/physics/lib/2d/runtime/obstacles.js +9 -11
  14. package/dist/features/physics/lib/2d/runtime/obstacles.js.map +2 -2
  15. package/dist/features/physics/lib/2d/shapes.js +8 -9
  16. package/dist/features/physics/lib/2d/shapes.js.map +2 -2
  17. package/dist/features/physics/lib/2d/world/rapier.js +22 -26
  18. package/dist/features/physics/lib/2d/world/rapier.js.map +2 -2
  19. package/dist/features/sprites/loader.js +6 -3
  20. package/dist/features/sprites/loader.js.map +2 -2
  21. package/dist/features/textures/index.d.ts +12 -2
  22. package/dist/features/textures/index.js +33 -1
  23. package/dist/features/textures/index.js.map +2 -2
  24. package/dist/features/textures/lib/chemical-field.d.ts +56 -0
  25. package/dist/features/textures/lib/chemical-field.js +154 -0
  26. package/dist/features/textures/lib/chemical-field.js.map +7 -0
  27. package/dist/features/textures/lib/chemical-recipes.d.ts +119 -0
  28. package/dist/features/textures/lib/chemical-recipes.js +275 -0
  29. package/dist/features/textures/lib/chemical-recipes.js.map +7 -0
  30. package/dist/features/textures/lib/definitions.d.ts +3 -18
  31. package/dist/features/textures/lib/definitions.js +17 -24
  32. package/dist/features/textures/lib/definitions.js.map +2 -2
  33. package/dist/features/textures/lib/geometric-patterns.d.ts +149 -0
  34. package/dist/features/textures/lib/geometric-patterns.js +305 -0
  35. package/dist/features/textures/lib/geometric-patterns.js.map +7 -0
  36. package/dist/features/textures/lib/gray-scott.d.ts +55 -0
  37. package/dist/features/textures/lib/gray-scott.js +37 -0
  38. package/dist/features/textures/lib/gray-scott.js.map +7 -0
  39. package/dist/features/textures/lib/palette.js +1 -3
  40. package/dist/features/textures/lib/palette.js.map +2 -2
  41. package/dist/features/textures/lib/patterns.d.ts +123 -0
  42. package/dist/features/textures/lib/patterns.js +344 -0
  43. package/dist/features/textures/lib/patterns.js.map +7 -0
  44. package/dist/features/textures/lib/rain-drops.js +2 -1
  45. package/dist/features/textures/lib/rain-drops.js.map +2 -2
  46. package/dist/features/textures/lib/reaction-diffusion.d.ts +3 -2
  47. package/dist/features/textures/lib/reaction-diffusion.js +9 -20
  48. package/dist/features/textures/lib/reaction-diffusion.js.map +2 -2
  49. package/dist/features/textures/lib/simulation.d.ts +10 -4
  50. package/dist/features/textures/lib/simulation.js +23 -13
  51. package/dist/features/textures/lib/simulation.js.map +2 -2
  52. package/dist/features/textures/lib/wasm/electric.js +8 -1
  53. package/dist/features/textures/lib/wasm/electric.js.map +2 -2
  54. package/dist/features/textures/lib/water-surface.js +1 -3
  55. package/dist/features/textures/lib/water-surface.js.map +2 -2
  56. package/dist/features/viz/index.d.ts +68 -6
  57. package/dist/features/viz/index.js +164 -2
  58. package/dist/features/viz/index.js.map +2 -2
  59. package/dist/features/viz/inspection/bar.d.ts +79 -0
  60. package/dist/features/viz/inspection/bar.js +49 -0
  61. package/dist/features/viz/inspection/bar.js.map +7 -0
  62. package/dist/features/viz/inspection/candle.d.ts +156 -0
  63. package/dist/features/viz/inspection/candle.js +120 -0
  64. package/dist/features/viz/inspection/candle.js.map +7 -0
  65. package/dist/features/viz/inspection/capture-types.d.ts +65 -0
  66. package/dist/features/viz/inspection/capture.d.ts +16 -0
  67. package/dist/features/viz/inspection/capture.js +49 -0
  68. package/dist/features/viz/inspection/capture.js.map +7 -0
  69. package/dist/features/viz/inspection/handler.d.ts +36 -0
  70. package/dist/features/viz/inspection/handler.js +91 -0
  71. package/dist/features/viz/inspection/handler.js.map +7 -0
  72. package/dist/features/viz/inspection/ohlc-bar.d.ts +132 -0
  73. package/dist/features/viz/inspection/ohlc-bar.js +118 -0
  74. package/dist/features/viz/inspection/ohlc-bar.js.map +7 -0
  75. package/dist/features/viz/inspection/owned-ref.d.ts +16 -0
  76. package/dist/features/viz/inspection/owned-ref.js +99 -0
  77. package/dist/features/viz/inspection/owned-ref.js.map +7 -0
  78. package/dist/features/viz/inspection/painted-point.d.ts +22 -0
  79. package/dist/features/viz/inspection/painted-point.js +29 -0
  80. package/dist/features/viz/inspection/painted-point.js.map +7 -0
  81. package/dist/features/viz/inspection/queries.d.ts +100 -0
  82. package/dist/features/viz/inspection/queries.js +192 -0
  83. package/dist/features/viz/inspection/queries.js.map +7 -0
  84. package/dist/features/viz/inspection/query-types.d.ts +177 -0
  85. package/dist/features/viz/inspection/volume.d.ts +104 -0
  86. package/dist/features/viz/inspection/volume.js +95 -0
  87. package/dist/features/viz/inspection/volume.js.map +7 -0
  88. package/dist/features/viz/inspection.d.ts +19 -0
  89. package/dist/features/viz/inspection.js +54 -0
  90. package/dist/features/viz/inspection.js.map +7 -0
  91. package/dist/features/viz/inspection.mjs +1 -0
  92. package/dist/features/viz/lib/area-series.d.ts +62 -0
  93. package/dist/features/viz/lib/area-series.js +120 -0
  94. package/dist/features/viz/lib/area-series.js.map +7 -0
  95. package/dist/features/viz/lib/axis-title.js +2 -1
  96. package/dist/features/viz/lib/axis-title.js.map +2 -2
  97. package/dist/features/viz/lib/axis.js +1 -1
  98. package/dist/features/viz/lib/axis.js.map +2 -2
  99. package/dist/features/viz/lib/bar-series.d.ts +3 -1
  100. package/dist/features/viz/lib/bar-series.js +16 -1
  101. package/dist/features/viz/lib/bar-series.js.map +2 -2
  102. package/dist/features/viz/lib/baseline-series.d.ts +55 -0
  103. package/dist/features/viz/lib/baseline-series.js +136 -0
  104. package/dist/features/viz/lib/baseline-series.js.map +7 -0
  105. package/dist/features/viz/lib/candlestick-series.d.ts +62 -0
  106. package/dist/features/viz/lib/candlestick-series.js +150 -0
  107. package/dist/features/viz/lib/candlestick-series.js.map +7 -0
  108. package/dist/features/viz/lib/censored-point-series.d.ts +71 -0
  109. package/dist/features/viz/lib/censored-point-series.js +129 -0
  110. package/dist/features/viz/lib/censored-point-series.js.map +7 -0
  111. package/dist/features/viz/lib/color-context.d.ts +4 -0
  112. package/dist/features/viz/lib/color-context.js +41 -0
  113. package/dist/features/viz/lib/color-context.js.map +7 -0
  114. package/dist/features/viz/lib/color-math.d.ts +4 -0
  115. package/dist/features/viz/lib/color-math.js +31 -0
  116. package/dist/features/viz/lib/color-math.js.map +7 -0
  117. package/dist/features/viz/lib/color-types.d.ts +53 -0
  118. package/dist/features/viz/lib/curve-definition.d.ts +49 -0
  119. package/dist/features/viz/lib/curve-definition.js +142 -0
  120. package/dist/features/viz/lib/curve-definition.js.map +7 -0
  121. package/dist/features/viz/lib/diverging-color-scale.d.ts +11 -0
  122. package/dist/features/viz/lib/diverging-color-scale.js +51 -0
  123. package/dist/features/viz/lib/diverging-color-scale.js.map +7 -0
  124. package/dist/features/viz/lib/domain-navigation.d.ts +40 -0
  125. package/dist/features/viz/lib/domain-navigation.js +77 -0
  126. package/dist/features/viz/lib/domain-navigation.js.map +7 -0
  127. package/dist/features/viz/lib/editable-chart-elements.d.ts +178 -0
  128. package/dist/features/viz/lib/editable-chart-elements.js +733 -0
  129. package/dist/features/viz/lib/editable-chart-elements.js.map +7 -0
  130. package/dist/features/viz/lib/financial-aggregation.d.ts +127 -0
  131. package/dist/features/viz/lib/financial-aggregation.js +116 -0
  132. package/dist/features/viz/lib/financial-aggregation.js.map +7 -0
  133. package/dist/features/viz/lib/financial-autoscale.d.ts +64 -0
  134. package/dist/features/viz/lib/financial-autoscale.js +61 -0
  135. package/dist/features/viz/lib/financial-autoscale.js.map +7 -0
  136. package/dist/features/viz/lib/financial-comparison.d.ts +62 -0
  137. package/dist/features/viz/lib/financial-comparison.js +98 -0
  138. package/dist/features/viz/lib/financial-comparison.js.map +7 -0
  139. package/dist/features/viz/lib/financial-geometry.d.ts +77 -0
  140. package/dist/features/viz/lib/financial-geometry.js +67 -0
  141. package/dist/features/viz/lib/financial-geometry.js.map +7 -0
  142. package/dist/features/viz/lib/financial-indicators.d.ts +114 -0
  143. package/dist/features/viz/lib/financial-indicators.js +135 -0
  144. package/dist/features/viz/lib/financial-indicators.js.map +7 -0
  145. package/dist/features/viz/lib/financial-oscillators.d.ts +171 -0
  146. package/dist/features/viz/lib/financial-oscillators.js +265 -0
  147. package/dist/features/viz/lib/financial-oscillators.js.map +7 -0
  148. package/dist/features/viz/lib/graph/bipartite.d.ts +14 -0
  149. package/dist/features/viz/lib/graph/bipartite.js +250 -0
  150. package/dist/features/viz/lib/graph/bipartite.js.map +7 -0
  151. package/dist/features/viz/lib/graph/chord.d.ts +44 -0
  152. package/dist/features/viz/lib/graph/chord.js +348 -0
  153. package/dist/features/viz/lib/graph/chord.js.map +7 -0
  154. package/dist/features/viz/lib/graph/dependency.d.ts +26 -0
  155. package/dist/features/viz/lib/graph/dependency.js +140 -0
  156. package/dist/features/viz/lib/graph/dependency.js.map +7 -0
  157. package/dist/features/viz/lib/graph/force.d.ts +28 -0
  158. package/dist/features/viz/lib/graph/force.js +580 -0
  159. package/dist/features/viz/lib/graph/force.js.map +7 -0
  160. package/dist/features/viz/lib/graph/hierarchy.d.ts +21 -0
  161. package/dist/features/viz/lib/graph/hierarchy.js +112 -0
  162. package/dist/features/viz/lib/graph/hierarchy.js.map +7 -0
  163. package/dist/features/viz/lib/graph/icicle.d.ts +16 -0
  164. package/dist/features/viz/lib/graph/icicle.js +153 -0
  165. package/dist/features/viz/lib/graph/icicle.js.map +7 -0
  166. package/dist/features/viz/lib/graph/matrix.d.ts +30 -0
  167. package/dist/features/viz/lib/graph/matrix.js +243 -0
  168. package/dist/features/viz/lib/graph/matrix.js.map +7 -0
  169. package/dist/features/viz/lib/graph/neighborhood.d.ts +11 -0
  170. package/dist/features/viz/lib/graph/neighborhood.js +281 -0
  171. package/dist/features/viz/lib/graph/neighborhood.js.map +7 -0
  172. package/dist/features/viz/lib/graph/routes.d.ts +35 -0
  173. package/dist/features/viz/lib/graph/routes.js +101 -0
  174. package/dist/features/viz/lib/graph/routes.js.map +7 -0
  175. package/dist/features/viz/lib/graph/sankey.d.ts +44 -0
  176. package/dist/features/viz/lib/graph/sankey.js +341 -0
  177. package/dist/features/viz/lib/graph/sankey.js.map +7 -0
  178. package/dist/features/viz/lib/graph/shared.d.ts +59 -0
  179. package/dist/features/viz/lib/graph/shared.js +301 -0
  180. package/dist/features/viz/lib/graph/shared.js.map +7 -0
  181. package/dist/features/viz/lib/graph/tree.d.ts +11 -0
  182. package/dist/features/viz/lib/graph/tree.js +232 -0
  183. package/dist/features/viz/lib/graph/tree.js.map +7 -0
  184. package/dist/features/viz/lib/graph/treemap.d.ts +20 -0
  185. package/dist/features/viz/lib/graph/treemap.js +227 -0
  186. package/dist/features/viz/lib/graph/treemap.js.map +7 -0
  187. package/dist/features/viz/lib/graph/types.d.ts +1097 -0
  188. package/dist/features/viz/lib/hover-card.js +8 -9
  189. package/dist/features/viz/lib/hover-card.js.map +2 -2
  190. package/dist/features/viz/lib/hover-data.d.ts +1 -1
  191. package/dist/features/viz/lib/hover-data.js +5 -2
  192. package/dist/features/viz/lib/hover-data.js.map +2 -2
  193. package/dist/features/viz/lib/interval-band-series.d.ts +49 -0
  194. package/dist/features/viz/lib/interval-band-series.js +136 -0
  195. package/dist/features/viz/lib/interval-band-series.js.map +7 -0
  196. package/dist/features/viz/lib/interval-diamond-series.d.ts +43 -0
  197. package/dist/features/viz/lib/interval-diamond-series.js +122 -0
  198. package/dist/features/viz/lib/interval-diamond-series.js.map +7 -0
  199. package/dist/features/viz/lib/interval-series.d.ts +79 -0
  200. package/dist/features/viz/lib/interval-series.js +158 -0
  201. package/dist/features/viz/lib/interval-series.js.map +7 -0
  202. package/dist/features/viz/lib/layout-pie.js +9 -13
  203. package/dist/features/viz/lib/layout-pie.js.map +2 -2
  204. package/dist/features/viz/lib/line-series.d.ts +1 -1
  205. package/dist/features/viz/lib/line-series.js +47 -28
  206. package/dist/features/viz/lib/line-series.js.map +2 -2
  207. package/dist/features/viz/lib/linear-scale.js +1 -1
  208. package/dist/features/viz/lib/linear-scale.js.map +2 -2
  209. package/dist/features/viz/lib/monotone-curve.d.ts +11 -0
  210. package/dist/features/viz/lib/monotone-curve.js +63 -0
  211. package/dist/features/viz/lib/monotone-curve.js.map +7 -0
  212. package/dist/features/viz/lib/numeric-range-interpolation.d.ts +15 -0
  213. package/dist/features/viz/lib/numeric-range-interpolation.js +36 -0
  214. package/dist/features/viz/lib/numeric-range-interpolation.js.map +7 -0
  215. package/dist/features/viz/lib/ohlc-bar-series.d.ts +55 -0
  216. package/dist/features/viz/lib/ohlc-bar-series.js +168 -0
  217. package/dist/features/viz/lib/ohlc-bar-series.js.map +7 -0
  218. package/dist/features/viz/lib/paired-series.d.ts +44 -0
  219. package/dist/features/viz/lib/paired-series.js +93 -0
  220. package/dist/features/viz/lib/paired-series.js.map +7 -0
  221. package/dist/features/viz/lib/pie-layout.js +2 -1
  222. package/dist/features/viz/lib/pie-layout.js.map +2 -2
  223. package/dist/features/viz/lib/plot-series.js +11 -6
  224. package/dist/features/viz/lib/plot-series.js.map +2 -2
  225. package/dist/features/viz/lib/plot-types.d.ts +4 -3
  226. package/dist/features/viz/lib/point-series.d.ts +1 -1
  227. package/dist/features/viz/lib/point-series.js +36 -9
  228. package/dist/features/viz/lib/point-series.js.map +2 -2
  229. package/dist/features/viz/lib/point-types.d.ts +5 -2
  230. package/dist/features/viz/lib/reference-band.js +4 -1
  231. package/dist/features/viz/lib/reference-band.js.map +2 -2
  232. package/dist/features/viz/lib/scale-context.d.ts +1 -1
  233. package/dist/features/viz/lib/scale-ticks.js +21 -6
  234. package/dist/features/viz/lib/scale-ticks.js.map +2 -2
  235. package/dist/features/viz/lib/sequential-color-scale.d.ts +11 -0
  236. package/dist/features/viz/lib/sequential-color-scale.js +49 -0
  237. package/dist/features/viz/lib/sequential-color-scale.js.map +7 -0
  238. package/dist/features/viz/lib/series-position.d.ts +12 -0
  239. package/dist/features/viz/lib/series-position.js +44 -0
  240. package/dist/features/viz/lib/series-position.js.map +7 -0
  241. package/dist/features/viz/lib/step-curves.d.ts +19 -0
  242. package/dist/features/viz/lib/step-curves.js +53 -0
  243. package/dist/features/viz/lib/step-curves.js.map +7 -0
  244. package/dist/features/viz/lib/threshold-color-scale.d.ts +43 -0
  245. package/dist/features/viz/lib/threshold-color-scale.js +59 -0
  246. package/dist/features/viz/lib/threshold-color-scale.js.map +7 -0
  247. package/dist/features/viz/lib/trading-time-mapping.d.ts +32 -0
  248. package/dist/features/viz/lib/trading-time-mapping.js +89 -0
  249. package/dist/features/viz/lib/trading-time-mapping.js.map +7 -0
  250. package/dist/features/viz/lib/trading-time-scale.d.ts +83 -0
  251. package/dist/features/viz/lib/trading-time-scale.js +96 -0
  252. package/dist/features/viz/lib/trading-time-scale.js.map +7 -0
  253. package/dist/features/viz/lib/trajectory-series.d.ts +71 -0
  254. package/dist/features/viz/lib/trajectory-series.js +111 -0
  255. package/dist/features/viz/lib/trajectory-series.js.map +7 -0
  256. package/dist/features/viz/lib/types.d.ts +20 -4
  257. package/dist/features/viz/lib/use-continuous-scale.js +6 -1
  258. package/dist/features/viz/lib/use-continuous-scale.js.map +2 -2
  259. package/dist/features/viz/lib/utc-scale.js +11 -10
  260. package/dist/features/viz/lib/utc-scale.js.map +2 -2
  261. package/dist/features/viz/lib/volume-series.d.ts +59 -0
  262. package/dist/features/viz/lib/volume-series.js +117 -0
  263. package/dist/features/viz/lib/volume-series.js.map +7 -0
  264. package/dist/features/viz/lib/weighted-point-series.d.ts +71 -0
  265. package/dist/features/viz/lib/weighted-point-series.js +169 -0
  266. package/dist/features/viz/lib/weighted-point-series.js.map +7 -0
  267. package/dist/filters/backdrop-contrast-gpu.d.ts +5 -0
  268. package/dist/filters/backdrop-contrast-gpu.js +33 -0
  269. package/dist/filters/backdrop-contrast-gpu.js.map +7 -0
  270. package/dist/filters/backdrop-contrast.d.ts +21 -0
  271. package/dist/filters/backdrop-contrast.js +61 -0
  272. package/dist/filters/backdrop-contrast.js.map +7 -0
  273. package/dist/filters/displacement.js +1 -1
  274. package/dist/filters/displacement.js.map +2 -2
  275. package/dist/filters/emboss-gpu.d.ts +4 -0
  276. package/dist/filters/emboss-gpu.js +39 -0
  277. package/dist/filters/emboss-gpu.js.map +7 -0
  278. package/dist/filters/emboss.d.ts +32 -0
  279. package/dist/filters/emboss.js +104 -0
  280. package/dist/filters/emboss.js.map +7 -0
  281. package/dist/filters/filter-executor.d.ts +11 -4
  282. package/dist/filters/filter-executor.js +104 -49
  283. package/dist/filters/filter-executor.js.map +2 -2
  284. package/dist/filters/reflected-light.js +1 -1
  285. package/dist/filters/reflected-light.js.map +2 -2
  286. package/dist/filters/reflection-gpu.d.ts +3 -1
  287. package/dist/filters/reflection-gpu.js +5 -2
  288. package/dist/filters/reflection-gpu.js.map +2 -2
  289. package/dist/filters/render-backdrop-contrast-boundary.d.ts +31 -0
  290. package/dist/filters/render-backdrop-contrast-boundary.js +116 -0
  291. package/dist/filters/render-backdrop-contrast-boundary.js.map +7 -0
  292. package/dist/filters/render-emboss-boundary.d.ts +13 -0
  293. package/dist/filters/render-emboss-boundary.js +131 -0
  294. package/dist/filters/render-emboss-boundary.js.map +7 -0
  295. package/dist/filters.d.ts +9 -5
  296. package/dist/filters.js +4 -0
  297. package/dist/filters.js.map +2 -2
  298. package/dist/index.d.ts +9 -5
  299. package/dist/index.js +18 -2
  300. package/dist/index.js.map +2 -2
  301. package/dist/internal.d.ts +4 -0
  302. package/dist/internal.js +6 -0
  303. package/dist/internal.js.map +2 -2
  304. package/dist/layout-kernel.d.ts +12 -0
  305. package/dist/layout-kernel.js +11 -0
  306. package/dist/layout-kernel.js.map +7 -0
  307. package/dist/layout-kernel.mjs +1 -0
  308. package/dist/lib/backend/types.d.ts +13 -1
  309. package/dist/lib/backend/types.js.map +2 -2
  310. package/dist/lib/components/arc-geometry.js +2 -1
  311. package/dist/lib/components/arc-geometry.js.map +2 -2
  312. package/dist/lib/components/g.js +2 -0
  313. package/dist/lib/components/g.js.map +2 -2
  314. package/dist/lib/components/html-box.js +2 -1
  315. package/dist/lib/components/html-box.js.map +2 -2
  316. package/dist/lib/components/img.js +3 -3
  317. package/dist/lib/components/img.js.map +2 -2
  318. package/dist/lib/components/layer.js +98 -16
  319. package/dist/lib/components/layer.js.map +3 -3
  320. package/dist/lib/components/text.d.ts +16 -0
  321. package/dist/lib/components/text.js +131 -24
  322. package/dist/lib/components/text.js.map +2 -2
  323. package/dist/lib/define-primitive.d.ts +4 -2
  324. package/dist/lib/define-primitive.js +3 -1
  325. package/dist/lib/define-primitive.js.map +2 -2
  326. package/dist/lib/element/metadata.d.ts +9 -0
  327. package/dist/lib/element/metadata.js +19 -0
  328. package/dist/lib/element/metadata.js.map +2 -2
  329. package/dist/lib/element/resolve-primitive-inputs.d.ts +2 -0
  330. package/dist/lib/element/resolve-primitive-inputs.js +17 -4
  331. package/dist/lib/element/resolve-primitive-inputs.js.map +2 -2
  332. package/dist/lib/events/event-facade.d.ts +18 -0
  333. package/dist/lib/events/event-facade.js +28 -2
  334. package/dist/lib/events/event-facade.js.map +2 -2
  335. package/dist/lib/events/hit-test.js +2 -1
  336. package/dist/lib/events/hit-test.js.map +2 -2
  337. package/dist/lib/events/propagation.d.ts +2 -1
  338. package/dist/lib/events/propagation.js +22 -16
  339. package/dist/lib/events/propagation.js.map +2 -2
  340. package/dist/lib/events/registrations.d.ts +10 -0
  341. package/dist/lib/events/registrations.js +160 -5
  342. package/dist/lib/events/registrations.js.map +2 -2
  343. package/dist/lib/execute-render.js +25 -1
  344. package/dist/lib/execute-render.js.map +2 -2
  345. package/dist/lib/filter/filter-region.js +3 -10
  346. package/dist/lib/filter/filter-region.js.map +2 -2
  347. package/dist/lib/focus/focus-manager.d.ts +8 -1
  348. package/dist/lib/focus/focus-manager.js +87 -43
  349. package/dist/lib/focus/focus-manager.js.map +2 -2
  350. package/dist/lib/focus/geometry.d.ts +2 -0
  351. package/dist/lib/focus/geometry.js +6 -0
  352. package/dist/lib/focus/geometry.js.map +2 -2
  353. package/dist/lib/geometry/path-bend-guide.js +1 -1
  354. package/dist/lib/geometry/path-bend-guide.js.map +2 -2
  355. package/dist/lib/geometry/path-geometry.js +12 -11
  356. package/dist/lib/geometry/path-geometry.js.map +2 -2
  357. package/dist/lib/geometry/path-transforms.js +17 -21
  358. package/dist/lib/geometry/path-transforms.js.map +2 -2
  359. package/dist/lib/geometry/path-warp-bezier.js +3 -1
  360. package/dist/lib/geometry/path-warp-bezier.js.map +2 -2
  361. package/dist/lib/geometry/path-warp.js +1 -1
  362. package/dist/lib/geometry/path-warp.js.map +2 -2
  363. package/dist/lib/global-state.js +2 -0
  364. package/dist/lib/global-state.js.map +2 -2
  365. package/dist/lib/html/html-events.d.ts +32 -0
  366. package/dist/lib/html/html-events.js +179 -0
  367. package/dist/lib/html/html-events.js.map +7 -0
  368. package/dist/lib/html/html-service.d.ts +8 -2
  369. package/dist/lib/html/html-service.js +198 -65
  370. package/dist/lib/html/html-service.js.map +2 -2
  371. package/dist/lib/html/overlay-config.js +7 -6
  372. package/dist/lib/html/overlay-config.js.map +2 -2
  373. package/dist/lib/html/types.d.ts +29 -2
  374. package/dist/lib/layout/absolute.d.ts +11 -5
  375. package/dist/lib/layout/absolute.js +329 -55
  376. package/dist/lib/layout/absolute.js.map +3 -3
  377. package/dist/lib/layout/allocation-checkpoint-owner.d.ts +11 -0
  378. package/dist/lib/layout/allocation-checkpoint-owner.js +86 -0
  379. package/dist/lib/layout/allocation-checkpoint-owner.js.map +7 -0
  380. package/dist/lib/layout/allocation-checkpoint.d.ts +53 -0
  381. package/dist/lib/layout/allocation-checkpoint.js +463 -0
  382. package/dist/lib/layout/allocation-checkpoint.js.map +7 -0
  383. package/dist/lib/layout/allocation-dependencies.d.ts +30 -0
  384. package/dist/lib/layout/allocation-dependencies.js +90 -0
  385. package/dist/lib/layout/allocation-dependencies.js.map +7 -0
  386. package/dist/lib/layout/allocation-revision.d.ts +13 -0
  387. package/dist/lib/layout/allocation-revision.js +67 -0
  388. package/dist/lib/layout/allocation-revision.js.map +7 -0
  389. package/dist/lib/layout/box-insets.d.ts +17 -0
  390. package/dist/lib/layout/box-insets.js +138 -0
  391. package/dist/lib/layout/box-insets.js.map +7 -0
  392. package/dist/lib/layout/box-sizing.d.ts +16 -0
  393. package/dist/lib/layout/box-sizing.js +77 -0
  394. package/dist/lib/layout/box-sizing.js.map +7 -0
  395. package/dist/lib/layout/box.js +42 -12
  396. package/dist/lib/layout/box.js.map +2 -2
  397. package/dist/lib/layout/canvas-measurement.d.ts +13 -0
  398. package/dist/lib/layout/canvas-measurement.js +57 -0
  399. package/dist/lib/layout/canvas-measurement.js.map +7 -0
  400. package/dist/lib/layout/context.d.ts +35 -6
  401. package/dist/lib/layout/context.js +72 -3
  402. package/dist/lib/layout/context.js.map +2 -2
  403. package/dist/lib/layout/define-layout-component.d.ts +23 -0
  404. package/dist/lib/layout/define-layout-component.js +84 -0
  405. package/dist/lib/layout/define-layout-component.js.map +7 -0
  406. package/dist/lib/layout/flex-allocation-cache.d.ts +42 -0
  407. package/dist/lib/layout/flex-baseline-mode.d.ts +2 -0
  408. package/dist/lib/layout/flex-baseline-mode.js +7 -0
  409. package/dist/lib/layout/flex-baseline-mode.js.map +7 -0
  410. package/dist/lib/layout/flex.d.ts +50 -15
  411. package/dist/lib/layout/flex.js +2124 -195
  412. package/dist/lib/layout/flex.js.map +3 -3
  413. package/dist/lib/layout/flow.js +225 -49
  414. package/dist/lib/layout/flow.js.map +2 -2
  415. package/dist/lib/layout/geometry-publication.d.ts +53 -0
  416. package/dist/lib/layout/geometry-publication.js +244 -0
  417. package/dist/lib/layout/geometry-publication.js.map +7 -0
  418. package/dist/lib/layout/grid-kernel.d.ts +63 -0
  419. package/dist/lib/layout/grid-kernel.js +168 -0
  420. package/dist/lib/layout/grid-kernel.js.map +7 -0
  421. package/dist/lib/layout/grid.d.ts +63 -4
  422. package/dist/lib/layout/grid.js +767 -171
  423. package/dist/lib/layout/grid.js.map +3 -3
  424. package/dist/lib/layout/measure.d.ts +55 -3
  425. package/dist/lib/layout/measure.js +448 -15
  426. package/dist/lib/layout/measure.js.map +2 -2
  427. package/dist/lib/layout/overlay.js +81 -23
  428. package/dist/lib/layout/overlay.js.map +2 -2
  429. package/dist/lib/layout/participation.d.ts +27 -0
  430. package/dist/lib/layout/participation.js +188 -0
  431. package/dist/lib/layout/participation.js.map +7 -0
  432. package/dist/lib/layout/place-child.js +1 -1
  433. package/dist/lib/layout/place-child.js.map +2 -2
  434. package/dist/lib/layout/positioning-diagnostics.d.ts +1 -1
  435. package/dist/lib/layout/positioning-diagnostics.js +13 -2
  436. package/dist/lib/layout/positioning-diagnostics.js.map +2 -2
  437. package/dist/lib/layout/prepared-root.d.ts +121 -0
  438. package/dist/lib/layout/prepared-root.js +360 -0
  439. package/dist/lib/layout/prepared-root.js.map +7 -0
  440. package/dist/lib/layout/standalone-kernel.d.ts +60 -0
  441. package/dist/lib/layout/standalone-kernel.js +722 -0
  442. package/dist/lib/layout/standalone-kernel.js.map +7 -0
  443. package/dist/lib/layout/topology.d.ts +21 -0
  444. package/dist/lib/layout/topology.js +113 -0
  445. package/dist/lib/layout/topology.js.map +7 -0
  446. package/dist/lib/layout/types.d.ts +5 -0
  447. package/dist/lib/layout/wasm/artifact.d.ts +1 -0
  448. package/dist/lib/layout/wasm/artifact.js +5 -0
  449. package/dist/lib/layout/wasm/artifact.js.map +7 -0
  450. package/dist/lib/layout/wasm/bytes.d.ts +1 -0
  451. package/dist/lib/layout/wasm/bytes.js +5 -0
  452. package/dist/lib/layout/wasm/bytes.js.map +7 -0
  453. package/dist/lib/layout/wasm/embedded.d.ts +2 -0
  454. package/dist/lib/layout/wasm/embedded.js +12 -0
  455. package/dist/lib/layout/wasm/embedded.js.map +7 -0
  456. package/dist/lib/layout/wasm/layout.wasm +0 -0
  457. package/dist/lib/layout/wasm/module.d.ts +8 -0
  458. package/dist/lib/layout/wasm/module.js +70 -0
  459. package/dist/lib/layout/wasm/module.js.map +7 -0
  460. package/dist/lib/layout/wasm/region.d.ts +267 -0
  461. package/dist/lib/layout/wasm/region.js +1018 -0
  462. package/dist/lib/layout/wasm/region.js.map +7 -0
  463. package/dist/lib/manipulation/controller.js +4 -7
  464. package/dist/lib/manipulation/controller.js.map +2 -2
  465. package/dist/lib/manipulation/frame.js +1 -1
  466. package/dist/lib/manipulation/frame.js.map +2 -2
  467. package/dist/lib/manipulation/handles.js +32 -33
  468. package/dist/lib/manipulation/handles.js.map +2 -2
  469. package/dist/lib/manipulation/solve.js +12 -10
  470. package/dist/lib/manipulation/solve.js.map +2 -2
  471. package/dist/lib/mount-pibbl.js +1 -0
  472. package/dist/lib/mount-pibbl.js.map +2 -2
  473. package/dist/lib/mount-prepared-pibbl.d.ts +5 -0
  474. package/dist/lib/mount-prepared-pibbl.js +29 -0
  475. package/dist/lib/mount-prepared-pibbl.js.map +7 -0
  476. package/dist/lib/mount-request.d.ts +8 -0
  477. package/dist/lib/mount-request.js +41 -0
  478. package/dist/lib/mount-request.js.map +7 -0
  479. package/dist/lib/pibbl.d.ts +21 -13
  480. package/dist/lib/pibbl.js +18 -16
  481. package/dist/lib/pibbl.js.map +2 -2
  482. package/dist/lib/recording/recording.d.ts +43 -0
  483. package/dist/lib/recording/recording.js +555 -0
  484. package/dist/lib/recording/recording.js.map +7 -0
  485. package/dist/lib/recording/types.d.ts +118 -0
  486. package/dist/lib/recording/wasm-bytes.d.ts +1 -0
  487. package/dist/lib/recording/wasm-bytes.js +5 -0
  488. package/dist/lib/recording/wasm-bytes.js.map +7 -0
  489. package/dist/lib/recording/worker-source.d.ts +1 -0
  490. package/dist/lib/recording/worker-source.js +5 -0
  491. package/dist/lib/recording/worker-source.js.map +7 -0
  492. package/dist/lib/render-layer/controller.d.ts +9 -3
  493. package/dist/lib/render-layer/controller.js +259 -110
  494. package/dist/lib/render-layer/controller.js.map +2 -2
  495. package/dist/lib/render-transaction.d.ts +12 -2
  496. package/dist/lib/render-transaction.js +69 -1
  497. package/dist/lib/render-transaction.js.map +2 -2
  498. package/dist/lib/render.js +32 -8
  499. package/dist/lib/render.js.map +2 -2
  500. package/dist/lib/scheduler/realm-scheduler.d.ts +2 -0
  501. package/dist/lib/scheduler/realm-scheduler.js +55 -26
  502. package/dist/lib/scheduler/realm-scheduler.js.map +2 -2
  503. package/dist/lib/scheduler/renderer-participant.js +1 -0
  504. package/dist/lib/scheduler/renderer-participant.js.map +2 -2
  505. package/dist/lib/series-inspection-frame.d.ts +18 -0
  506. package/dist/lib/series-inspection-frame.js +70 -0
  507. package/dist/lib/series-inspection-frame.js.map +7 -0
  508. package/dist/lib/signals/edge.d.ts +7 -4
  509. package/dist/lib/signals/edge.js +25 -3
  510. package/dist/lib/signals/edge.js.map +2 -2
  511. package/dist/lib/signals/graph.d.ts +16 -2
  512. package/dist/lib/signals/graph.js +54 -12
  513. package/dist/lib/signals/graph.js.map +2 -2
  514. package/dist/lib/signals/input-provision.d.ts +15 -0
  515. package/dist/lib/signals/input-provision.js +53 -3
  516. package/dist/lib/signals/input-provision.js.map +2 -2
  517. package/dist/lib/signals/render-consumer.d.ts +3 -0
  518. package/dist/lib/signals/render-consumer.js +22 -14
  519. package/dist/lib/signals/render-consumer.js.map +2 -2
  520. package/dist/lib/style/positioning.d.ts +50 -2
  521. package/dist/lib/style/positioning.js +28 -4
  522. package/dist/lib/style/positioning.js.map +2 -2
  523. package/dist/lib/style/resolve-built-in.d.ts +4 -3
  524. package/dist/lib/style/resolve-built-in.js +17 -3
  525. package/dist/lib/style/resolve-built-in.js.map +2 -2
  526. package/dist/lib/style/resolve-dispatch.d.ts +3 -0
  527. package/dist/lib/style/resolve-dispatch.js +77 -4
  528. package/dist/lib/style/resolve-dispatch.js.map +2 -2
  529. package/dist/lib/style/resolve-length.d.ts +2 -0
  530. package/dist/lib/style/resolve-length.js +13 -9
  531. package/dist/lib/style/resolve-length.js.map +2 -2
  532. package/dist/lib/style/sizing-length.d.ts +51 -0
  533. package/dist/lib/style/sizing-length.js +77 -0
  534. package/dist/lib/style/sizing-length.js.map +7 -0
  535. package/dist/lib/style/types.d.ts +63 -25
  536. package/dist/lib/surface/root-surface.js +10 -6
  537. package/dist/lib/surface/root-surface.js.map +2 -2
  538. package/dist/lib/textures/texture.js +10 -8
  539. package/dist/lib/textures/texture.js.map +2 -2
  540. package/dist/lib/transitions/capture.js +4 -1
  541. package/dist/lib/transitions/capture.js.map +2 -2
  542. package/dist/lib/transitions/embers-physics.js +17 -10
  543. package/dist/lib/transitions/embers-physics.js.map +2 -2
  544. package/dist/lib/types.d.ts +110 -1
  545. package/dist/sync.d.ts +16 -0
  546. package/dist/sync.js +13 -0
  547. package/dist/sync.js.map +7 -0
  548. package/dist/sync.mjs +1 -0
  549. package/package.json +26 -3
@@ -1,3 +1,6 @@
1
+ import { HtmlNativeEvents } from "./html-events.js";
2
+ import { stageLayoutHtmlGeometry } from "../layout/geometry-publication.js";
3
+ import { isLayoutComponentSuspended, isLayoutInstanceSuspended } from "../layout/participation.js";
1
4
  import { GLOBAL_STATE } from "../global-state.js";
2
5
  import { withSignalWriteForbidden } from "../signals/graph.js";
3
6
  import { validateHtmlOverlay } from "./overlay-config.js";
@@ -21,6 +24,9 @@ class HtmlService {
21
24
  svg;
22
25
  viewport;
23
26
  disposed = false;
27
+ suspended = false;
28
+ projections;
29
+ nextSnapshots;
24
30
  rendered = /* @__PURE__ */ new Set();
25
31
  enterTransaction() {
26
32
  const transaction = this.root.renderTransaction;
@@ -29,12 +35,17 @@ class HtmlService {
29
35
  this.transaction = transaction;
30
36
  this.pending = new Map(this.snapshots);
31
37
  this.rendered = /* @__PURE__ */ new Set();
38
+ this.suspended = false;
39
+ transaction.onPreflight(() => this.prepare());
32
40
  transaction.onPublish(() => this.publish());
41
+ transaction.onAdopt(() => this.adopt());
33
42
  transaction.onFinish((success) => {
34
- if (!success) this.reset();
43
+ if (!success && transaction.failed !== false) this.reset();
35
44
  this.pending = void 0;
36
45
  this.transaction = void 0;
37
46
  this.rendered.clear();
47
+ this.projections = void 0;
48
+ this.nextSnapshots = void 0;
38
49
  });
39
50
  }
40
51
  beginRender(instance) {
@@ -44,14 +55,7 @@ class HtmlService {
44
55
  suspend(instance) {
45
56
  if (instance !== this.root.rootInstance) return;
46
57
  this.enterTransaction();
47
- this.root.renderTransaction.onPublish(() => {
48
- this.root.focusPolicy?.suspendHtmlRegions?.();
49
- if (this.viewport) this.viewport.hidden = true;
50
- for (const slot of this.live) {
51
- slot.region.active = false;
52
- if (slot.shell) slot.shell.inert = true;
53
- }
54
- });
58
+ this.suspended = true;
55
59
  }
56
60
  register(registration) {
57
61
  assertEffects();
@@ -94,6 +98,7 @@ class HtmlService {
94
98
  retire(slot) {
95
99
  if (slot.disposed) return;
96
100
  slot.disposed = true;
101
+ slot.events?.dispose();
97
102
  slot.region.active = false;
98
103
  this.root.focusPolicy?.removeHtmlFocusRegion?.(slot.region);
99
104
  try {
@@ -107,19 +112,18 @@ class HtmlService {
107
112
  this.live.delete(slot);
108
113
  }
109
114
  }
110
- publish() {
115
+ prepare() {
111
116
  if (this.disposed || !this.pending) return;
112
117
  const canvas = this.root.canvas;
113
118
  const overlay = this.root.htmlOverlay;
114
119
  validateHtmlOverlay(canvas, overlay);
115
120
  const rootInstance = this.root.rootInstance;
116
121
  if (rootInstance.surface.kind === "root" && (!rootInstance.surface.display.width || !rootInstance.surface.display.height)) {
117
- this.root.focusPolicy?.suspendHtmlRegions?.();
118
- if (this.viewport) this.viewport.hidden = true;
119
- for (const slot of this.live) {
120
- slot.region.active = false;
121
- if (slot.shell) slot.shell.inert = true;
122
- }
122
+ this.suspended = true;
123
+ for (const slot of this.live) stageLayoutHtmlGeometry(this.transaction, slot.region, {
124
+ active: false,
125
+ bounds: slot.region.rootBounds ?? { x: 0, y: 0, width: 0, height: 0 }
126
+ });
123
127
  return;
124
128
  }
125
129
  const surface = rootInstance.surface.snapshot;
@@ -138,18 +142,84 @@ class HtmlService {
138
142
  walk(entry.child, childWorld, inherited.concat({ data: rectangleSvg(entry.bounds), matrix: childWorld, rule: "nonzero" }), opacity * entry.opacity);
139
143
  } else if (!entry.slot.disposed) {
140
144
  const hostWorld = world.multiply(entry.matrix);
141
- if (![hostWorld.a, hostWorld.b, hostWorld.c, hostWorld.d, hostWorld.e, hostWorld.f].every(Number.isFinite)) throw new Error("HtmlBox transform must be finite.");
142
- projections.push({ registration: entry, world: hostWorld, clips: inherited, opacity: opacity * entry.opacity });
145
+ if (!(Number.isFinite(hostWorld.a) && Number.isFinite(hostWorld.b) && Number.isFinite(hostWorld.c) && Number.isFinite(hostWorld.d) && Number.isFinite(hostWorld.e) && Number.isFinite(hostWorld.f)))
146
+ throw new Error("HtmlBox transform must be finite.");
147
+ projections.push(prepareProjection(entry, hostWorld, rootMatrix, inherited, opacity * entry.opacity));
143
148
  }
144
149
  }
145
150
  };
146
151
  walk(rootInstance, new DOMMatrix(), [], 1);
152
+ for (const projection of projections) {
153
+ projection.transformCss = cssMatrix(projection.matrix);
154
+ const slot = projection.registration.slot;
155
+ slot.events ??= new HtmlNativeEvents(slot, () => this.svg, (target) => {
156
+ const doc = this.root.canvas.ownerDocument;
157
+ if (!(target instanceof doc.defaultView.Node)) return null;
158
+ for (const candidate of this.live) {
159
+ if (candidate.events?.node.live && candidate.shell?.contains(target)) return candidate.events.node;
160
+ }
161
+ return null;
162
+ });
163
+ projection.events = slot.events.prepare(
164
+ projection.registration.handlers,
165
+ projection.world,
166
+ projection.rootMatrix,
167
+ projection.visible && projection.registration.interactive
168
+ );
169
+ stageLayoutHtmlGeometry(this.transaction, projection.registration.slot.region, {
170
+ bounds: projection.bounds,
171
+ active: projection.visible && projection.registration.interactive
172
+ });
173
+ }
174
+ this.projections = projections;
175
+ this.nextSnapshots = new Map([...this.pending].filter(([owner]) => visited.has(owner)));
176
+ }
177
+ publish() {
178
+ if (this.suspended) {
179
+ this.root.focusPolicy?.suspendHtmlRegions?.();
180
+ return;
181
+ }
182
+ const projections = this.projections;
183
+ if (!projections || this.disposed) return;
147
184
  const desired = new Set(projections.map((p) => p.registration.slot));
148
- for (const slot of this.live) if (!desired.has(slot)) this.retire(slot);
185
+ for (const slot of this.live) if (!desired.has(slot)) {
186
+ if (!slot.owner.mainTeardowns.closed && (isLayoutComponentSuspended(slot.component) || isLayoutInstanceSuspended(slot.owner))) {
187
+ slot.region.active = false;
188
+ slot.events?.suspend();
189
+ this.root.focusPolicy?.removeHtmlFocusRegion?.(slot.region);
190
+ if (slot.shell) {
191
+ slot.shell.inert = true;
192
+ slot.shell.style.visibility = "hidden";
193
+ }
194
+ } else this.retire(slot);
195
+ }
149
196
  if (projections.length) this.ensureDOM();
197
+ for (const projection of projections) this.prepareClips(projection);
198
+ for (const projection of projections) {
199
+ const slot = projection.registration.slot;
200
+ if ((!projection.visible || !projection.registration.interactive) && slot.region.active) {
201
+ this.root.focusPolicy?.removeHtmlFocusRegion?.(slot.region);
202
+ const active = this.root.canvas.ownerDocument.activeElement;
203
+ if (active instanceof HTMLElement && slot.content?.contains(active)) active.blur();
204
+ }
205
+ this.publishContent(projection);
206
+ }
207
+ }
208
+ adopt() {
209
+ if (this.disposed) return;
210
+ if (this.suspended) {
211
+ if (this.viewport) this.viewport.hidden = true;
212
+ for (const slot of this.live) {
213
+ slot.region.active = false;
214
+ slot.events?.suspend();
215
+ if (slot.shell) slot.shell.inert = true;
216
+ }
217
+ return;
218
+ }
219
+ if (!this.projections) return;
150
220
  if (this.viewport) this.viewport.hidden = false;
151
- for (const [index, projection] of projections.entries()) this.apply(projection, rootMatrix, index);
152
- this.snapshots = new Map([...this.pending].filter(([owner]) => visited.has(owner)));
221
+ for (let index = 0; index < this.projections.length; index++) this.applyGeometry(this.projections[index], index);
222
+ this.snapshots = this.nextSnapshots;
153
223
  }
154
224
  ensureDOM() {
155
225
  if (this.viewport) return;
@@ -161,18 +231,18 @@ class HtmlService {
161
231
  this.svg.setAttribute("width", "0");
162
232
  this.svg.setAttribute("height", "0");
163
233
  this.svg.setAttribute("aria-hidden", "true");
164
- this.svg.style.cssText = "position:absolute;pointer-events:none";
234
+ this.svg.style.cssText = "position:absolute;left:0;top:0;pointer-events:none";
165
235
  this.root.htmlOverlay.append(this.svg, this.viewport);
166
236
  }
167
- apply(projection, rootMatrix, index) {
168
- const { registration: r, world, clips, opacity } = projection;
237
+ publishContent(projection) {
238
+ const r = projection.registration;
169
239
  const slot = r.slot;
170
240
  const first = !slot.shell;
171
241
  const doc = this.root.canvas.ownerDocument;
172
242
  if (first) {
173
243
  slot.shell = doc.createElement("div");
174
244
  slot.shell.dataset.pibblHtmlBox = "";
175
- slot.shell.style.cssText = "position:absolute;left:0;top:0;transform-origin:0 0;pointer-events:none;isolation:isolate";
245
+ slot.shell.style.cssText = "position:absolute;left:0;top:0;transform-origin:0 0;pointer-events:none;isolation:isolate;opacity:0";
176
246
  slot.content = doc.createElement("div");
177
247
  slot.content.dataset.pibblHtmlContent = "";
178
248
  slot.content.style.cssText = "position:absolute;box-sizing:border-box";
@@ -183,28 +253,7 @@ class HtmlService {
183
253
  slot.region.content = slot.content;
184
254
  this.live.add(slot);
185
255
  }
186
- const matrix = rootMatrix.multiply(world);
187
- const determinant = matrix.a * matrix.d - matrix.b * matrix.c;
188
- const visible = r.border.width > 0 && r.border.height > 0 && determinant !== 0;
189
- slot.shell.style.width = `${r.border.width}px`;
190
- slot.shell.style.height = `${r.border.height}px`;
191
- slot.shell.style.transform = cssMatrix(matrix);
192
- slot.shell.style.zIndex = String(index);
193
- slot.shell.style.opacity = String(opacity);
194
- slot.shell.style.overflow = r.overflow;
195
- slot.content.style.left = `${r.content.x}px`;
196
- slot.content.style.top = `${r.content.y}px`;
197
- slot.content.style.width = `${r.content.width}px`;
198
- slot.content.style.height = `${r.content.height}px`;
199
- slot.content.style.pointerEvents = r.interactive ? "auto" : "none";
200
- slot.shell.inert = !visible || !r.interactive;
201
- slot.shell.style.visibility = visible ? "visible" : "hidden";
202
- slot.region.active = visible && r.interactive;
203
- const corners = [[0, 0], [r.border.width, 0], [0, r.border.height], [r.border.width, r.border.height]].map(([x, y]) => world.transformPoint({ x, y }));
204
- const xs = corners.map((p) => p.x), ys = corners.map((p) => p.y);
205
- slot.region.rootBounds = { x: Math.min(...xs), y: Math.min(...ys), width: Math.max(...xs) - Math.min(...xs), height: Math.max(...ys) - Math.min(...ys) };
206
- slot.callback = r.onFocusChange;
207
- if (visible) this.applyClips(slot, clips, world.inverse());
256
+ slot.events.prepareListeners(projection.events);
208
257
  try {
209
258
  if (first) {
210
259
  const update = withSignalWriteForbidden("HtmlBox mount", () => slot.mount(slot.content, r.data, slot.abort.signal));
@@ -218,31 +267,70 @@ class HtmlService {
218
267
  this.retire(slot);
219
268
  throw error;
220
269
  }
270
+ }
271
+ applyGeometry(projection, index) {
272
+ const { registration: r, bounds, visible, opacity } = projection;
273
+ const slot = r.slot;
274
+ if (slot.disposed) return;
275
+ slot.shell.style.width = `${r.border.width}px`;
276
+ slot.shell.style.height = `${r.border.height}px`;
277
+ slot.shell.style.transform = projection.transformCss;
278
+ slot.shell.style.zIndex = String(index);
279
+ slot.shell.style.opacity = String(opacity);
280
+ slot.shell.style.overflow = r.overflow;
281
+ slot.content.style.left = `${r.content.x}px`;
282
+ slot.content.style.top = `${r.content.y}px`;
283
+ slot.content.style.width = `${r.content.width}px`;
284
+ slot.content.style.height = `${r.content.height}px`;
285
+ slot.content.style.pointerEvents = r.interactive ? "auto" : "none";
221
286
  slot.shell.inert = !visible || !r.interactive;
222
287
  slot.shell.style.visibility = visible ? "visible" : "hidden";
288
+ slot.region.active = visible && r.interactive;
289
+ slot.region.rootBounds = bounds;
290
+ slot.callback = r.onFocusChange;
291
+ slot.events.adopt(projection.events);
292
+ if (visible) {
293
+ const previous = slot.clipping;
294
+ slot.clipping = projection.definitions;
295
+ slot.shell.style.clipPath = projection.clipPath;
296
+ if (previous !== slot.clipping) for (const definition of previous ?? []) definition.remove();
297
+ }
223
298
  }
224
- applyClips(slot, clips, inverseWorld) {
225
- const definitions = slot.clipping;
299
+ prepareClips(projection) {
300
+ if (!projection.visible) return;
301
+ const slot = projection.registration.slot;
302
+ const clips = projection.clips;
303
+ const previous = slot.clipping;
304
+ let unchanged = previous?.length === clips.length;
305
+ const matrices = [];
306
+ for (let index = 0; index < clips.length; index++) {
307
+ const clip = clips[index];
308
+ matrices.push(cssMatrix(clip.matrix));
309
+ const path = previous?.[index]?.firstElementChild;
310
+ if (!path || path.getAttribute("d") !== clip.data || path.getAttribute("clip-rule") !== clip.rule || path.getAttribute("transform") !== matrices[index]) unchanged = false;
311
+ }
312
+ if (unchanged) {
313
+ projection.definitions = previous;
314
+ projection.clipPath = clips.length ? `url(#${previous[0].id})` : "none";
315
+ return;
316
+ }
317
+ const definitions = [];
226
318
  const doc = this.root.canvas.ownerDocument;
227
- while (definitions.length < clips.length) {
319
+ for (let index = 0; index < clips.length; index++) {
228
320
  const definition = doc.createElementNS(SVG, "clipPath");
229
321
  definition.id = `pibbl-html-clip-${++nextId}`;
230
322
  definition.setAttribute("clipPathUnits", "userSpaceOnUse");
231
- definition.append(doc.createElementNS(SVG, "path"));
232
- this.svg.append(definition);
323
+ const path = doc.createElementNS(SVG, "path");
324
+ path.setAttribute("d", clips[index].data);
325
+ path.setAttribute("clip-rule", clips[index].rule);
326
+ path.setAttribute("transform", matrices[index]);
327
+ definition.append(path);
233
328
  definitions.push(definition);
234
329
  }
235
- clips.forEach((clip, index) => {
236
- const definition = definitions[index];
237
- const path = definition.firstElementChild;
238
- setAttribute(path, "d", clip.data);
239
- setAttribute(path, "clip-rule", clip.rule);
240
- setAttribute(path, "transform", cssMatrix(inverseWorld.multiply(clip.matrix)));
241
- if (index + 1 < clips.length) setAttribute(definition, "clip-path", `url(#${definitions[index + 1].id})`);
242
- else definition.removeAttribute("clip-path");
243
- });
244
- slot.shell.style.clipPath = clips.length ? `url(#${definitions[0].id})` : "none";
245
- while (definitions.length > clips.length) definitions.pop().remove();
330
+ for (let index = 0; index + 1 < definitions.length; index++) definitions[index].firstElementChild.setAttribute("clip-path", `url(#${definitions[index + 1].id})`);
331
+ for (const definition of definitions) this.svg.append(definition);
332
+ projection.definitions = definitions;
333
+ projection.clipPath = definitions.length ? `url(#${definitions[0].id})` : "none";
246
334
  }
247
335
  reset() {
248
336
  for (const slot of this.live) this.retire(slot);
@@ -270,8 +358,53 @@ function snapshotClips(clips) {
270
358
  function cssMatrix(m) {
271
359
  return `matrix(${m.a},${m.b},${m.c},${m.d},${m.e},${m.f})`;
272
360
  }
273
- function setAttribute(element, name, value) {
274
- if (element.getAttribute(name) !== value) element.setAttribute(name, value);
361
+ function prepareProjection(registration, world, rootMatrix, clips, opacity) {
362
+ const matrix = rootMatrix.multiply(world);
363
+ assertFiniteProjectionMatrix(matrix);
364
+ const width = registration.border.width;
365
+ const height = registration.border.height;
366
+ let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;
367
+ for (let space = 0; space < 2; space++) {
368
+ const transform = space === 0 ? world : matrix;
369
+ let left = Infinity, top = Infinity, right = -Infinity, bottom = -Infinity;
370
+ for (let corner = 0; corner < 4; corner++) {
371
+ const x = corner & 1 ? width : 0;
372
+ const y = corner & 2 ? height : 0;
373
+ const projectedX = transform.a * x + transform.c * y + transform.e;
374
+ const projectedY = transform.b * x + transform.d * y + transform.f;
375
+ if (!Number.isFinite(projectedX) || !Number.isFinite(projectedY)) throw new Error("HtmlBox projection must be finite.");
376
+ left = Math.min(left, projectedX);
377
+ top = Math.min(top, projectedY);
378
+ right = Math.max(right, projectedX);
379
+ bottom = Math.max(bottom, projectedY);
380
+ }
381
+ if (!Number.isFinite(right - left) || !Number.isFinite(bottom - top)) throw new Error("HtmlBox projection must be finite.");
382
+ if (space === 0) {
383
+ minX = left;
384
+ minY = top;
385
+ maxX = right;
386
+ maxY = bottom;
387
+ }
388
+ }
389
+ const bounds = { x: minX, y: minY, width: maxX - minX, height: maxY - minY };
390
+ if (!Number.isFinite(bounds.width) || !Number.isFinite(bounds.height)) throw new Error("HtmlBox projection must be finite.");
391
+ const determinant = matrix.a * matrix.d - matrix.b * matrix.c;
392
+ if (Number.isNaN(determinant)) throw new Error("HtmlBox projection must be finite.");
393
+ const visible = width > 0 && height > 0 && determinant !== 0;
394
+ const localClips = [];
395
+ if (visible && clips.length) {
396
+ const inverse = world.inverse();
397
+ assertFiniteProjectionMatrix(inverse);
398
+ for (const clip of clips) {
399
+ const local = inverse.multiply(clip.matrix);
400
+ assertFiniteProjectionMatrix(local);
401
+ localClips.push({ data: clip.data, rule: clip.rule, matrix: local });
402
+ }
403
+ }
404
+ return { registration, world, rootMatrix, matrix, bounds, visible, clips: localClips, opacity };
405
+ }
406
+ function assertFiniteProjectionMatrix(matrix) {
407
+ if (!(Number.isFinite(matrix.a) && Number.isFinite(matrix.b) && Number.isFinite(matrix.c) && Number.isFinite(matrix.d) && Number.isFinite(matrix.e) && Number.isFinite(matrix.f))) throw new Error("HtmlBox projection must be finite.");
275
408
  }
276
409
  export {
277
410
  HtmlService,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/lib/html/html-service.ts"],
4
- "sourcesContent": ["import { GLOBAL_STATE } from '../global-state.js';\nimport { withSignalWriteForbidden } from '../signals/graph.js';\nimport type { PibblClippingStackEntry, PibblEventRoot, PibblInstance, PibblInteractionLayer, PibblRenderTransaction } from '../types.js';\nimport type { HtmlBoxRegistration, HtmlBoxSlot, HtmlBridge } from './types.js';\nimport { validateHtmlOverlay } from './overlay-config.js';\nimport { rectangleSvg } from './portable-clips.js';\n\nconst SVG = 'http://www.w3.org/2000/svg';\nlet nextId = 0;\ntype Entry = HtmlBoxRegistration | { child: PibblInstance; matrix: DOMMatrix; clips: readonly PibblClippingStackEntry[]; opacity: number; bounds: {x:number;y:number;width:number;height:number} };\ntype Clip = { data: string; matrix: DOMMatrix; rule: CanvasFillRule };\ninterface Projection { registration: HtmlBoxRegistration; world: DOMMatrix; clips: Clip[]; opacity: number; }\n\nexport function requireHtmlService(owner: PibblInstance): HtmlService {\n const root = owner.eventRoot;\n if (!root.htmlOverlay || !root.canvas) throw new Error('HtmlBox requires an HTMLCanvasElement root configured with htmlOverlay.');\n return (root.html ??= new HtmlService(root)) as HtmlService;\n}\n\nexport class HtmlService implements HtmlBridge {\n private snapshots = new Map<PibblInstance, Entry[]>();\n private pending: Map<PibblInstance, Entry[]> | undefined;\n private transaction: PibblRenderTransaction | undefined;\n private live = new Set<HtmlBoxSlot>();\n private svg: SVGSVGElement | undefined;\n private viewport: HTMLDivElement | undefined;\n private disposed = false;\n private rendered = new Set<HtmlBoxSlot>();\n constructor(private readonly root: PibblEventRoot) {}\n\n private enterTransaction(): void {\n const transaction = this.root.renderTransaction;\n if (!transaction) throw new Error('HtmlBox requires an active render transaction.');\n if (transaction === this.transaction) return;\n this.transaction = transaction;\n this.pending = new Map(this.snapshots);\n this.rendered = new Set();\n transaction.onPublish!(() => this.publish());\n transaction.onFinish(success => {\n if (!success) this.reset();\n this.pending = undefined;\n this.transaction = undefined;\n this.rendered.clear();\n });\n }\n\n beginRender(instance: PibblInstance): void {\n this.enterTransaction();\n this.pending!.set(instance, []);\n }\n\n suspend(instance: PibblInstance): void {\n if (instance !== this.root.rootInstance) return;\n this.enterTransaction();\n this.root.renderTransaction!.onPublish!(() => {\n this.root.focusPolicy?.suspendHtmlRegions?.();\n if (this.viewport) this.viewport.hidden = true;\n for (const slot of this.live) { slot.region.active = false; if (slot.shell) slot.shell.inert = true; }\n });\n }\n\n register(registration: HtmlBoxRegistration): void {\n assertEffects();\n this.enterTransaction();\n const owner = registration.slot.owner;\n let entries = this.pending!.get(owner);\n // A service first created during this render has no candidate array yet.\n if (!entries || entries === this.snapshots.get(owner)) this.pending!.set(owner, entries = []);\n entries.push(registration);\n this.rendered.add(registration.slot);\n this.root.focusPolicy?.observeHtmlRegion?.(registration.slot.region);\n }\n\n recordLayer(parent: PibblInstance, child: PibblInstance, bridge: PibblInteractionLayer, opacity: number, composite: GlobalCompositeOperation): void {\n this.enterTransaction();\n if (this.hasHosts(child)) {\n assertEffects(composite);\n const entries = this.pending!.get(parent) ?? [];\n if (!this.pending!.has(parent)) this.pending!.set(parent, entries);\n entries.push({ child, matrix: copy(bridge.transform), clips: snapshotClips(bridge.clippingStack), opacity,\n bounds: { x: 0, y: 0, width: child.rootLayoutBox.width, height: child.rootLayoutBox.height } });\n }\n }\n\n private hasHosts(instance: PibblInstance): boolean {\n return (this.pending?.get(instance) ?? this.snapshots.get(instance) ?? []).length > 0;\n }\n\n release(slot: HtmlBoxSlot): void {\n if (slot.disposed) return;\n const transaction = this.root.renderTransaction;\n if (transaction) {\n transaction.onPublish!(() => this.retire(slot));\n transaction.onFinish(success => { if (!success) this.retire(slot); });\n } else this.retire(slot);\n }\n\n private retire(slot: HtmlBoxSlot): void {\n if (slot.disposed) return;\n slot.disposed = true;\n slot.region.active = false;\n this.root.focusPolicy?.removeHtmlFocusRegion?.(slot.region);\n try { withSignalWriteForbidden('HtmlBox abort cleanup', () => slot.abort?.abort()); }\n finally {\n slot.shell?.remove();\n for (const clip of slot.clipping ?? []) clip.remove();\n slot.clipping = [];\n slot.update = undefined;\n slot.region.content = undefined;\n this.live.delete(slot);\n }\n }\n\n private publish(): void {\n if (this.disposed || !this.pending) return;\n const canvas = this.root.canvas!;\n const overlay = this.root.htmlOverlay!;\n validateHtmlOverlay(canvas, overlay);\n const rootInstance = this.root.rootInstance!;\n if (rootInstance.surface.kind === 'root' && (!rootInstance.surface.display.width || !rootInstance.surface.display.height)) {\n this.root.focusPolicy?.suspendHtmlRegions?.();\n if (this.viewport) this.viewport.hidden = true;\n for (const slot of this.live) { slot.region.active = false; if (slot.shell) slot.shell.inert = true; }\n return;\n }\n const surface = rootInstance.surface.snapshot!;\n const rootMatrix = new DOMMatrix().scale(1 / surface.backingPixelsPerCssPixelX, 1 / surface.backingPixelsPerCssPixelY).multiply(surface.renderTransform);\n const projections: Projection[] = [];\n const visited = new Set<PibblInstance>();\n const walk = (instance: PibblInstance, world: DOMMatrix, clips: Clip[], opacity: number) => {\n visited.add(instance);\n for (const entry of this.pending!.get(instance) ?? []) {\n const inherited = clips.concat(entry.clips.map(clip => {\n if (clip.svgPath === undefined) throw new Error('HtmlBox cannot project a native Path2D clip. Use PathGeometry for clips enclosing HtmlBox.');\n return { data: clip.svgPath, rule: clip.fillRule, matrix: world.multiply(clip.transform) };\n }));\n if ('child' in entry) {\n const childWorld = world.multiply(entry.matrix);\n walk(entry.child, childWorld, inherited.concat({ data: rectangleSvg(entry.bounds), matrix: childWorld, rule: 'nonzero' }), opacity * entry.opacity);\n } else if (!entry.slot.disposed) {\n const hostWorld = world.multiply(entry.matrix);\n if (![hostWorld.a,hostWorld.b,hostWorld.c,hostWorld.d,hostWorld.e,hostWorld.f].every(Number.isFinite)) throw new Error('HtmlBox transform must be finite.');\n projections.push({ registration: entry, world: hostWorld, clips: inherited, opacity: opacity * entry.opacity });\n }\n }\n };\n walk(rootInstance, new DOMMatrix(), [], 1);\n const desired = new Set(projections.map(p => p.registration.slot));\n for (const slot of this.live) if (!desired.has(slot)) this.retire(slot);\n if (projections.length) this.ensureDOM();\n if (this.viewport) this.viewport.hidden = false;\n for (const [index, projection] of projections.entries()) this.apply(projection, rootMatrix, index);\n this.snapshots = new Map([...this.pending].filter(([owner]) => visited.has(owner)));\n }\n\n private ensureDOM(): void {\n if (this.viewport) return;\n const doc = this.root.canvas!.ownerDocument;\n this.viewport = doc.createElement('div');\n this.viewport.dataset.pibblHtmlViewport = '';\n this.viewport.style.cssText = 'position:absolute;inset:0;overflow:clip;pointer-events:none';\n this.svg = doc.createElementNS(SVG, 'svg');\n this.svg.setAttribute('width', '0'); this.svg.setAttribute('height', '0');\n this.svg.setAttribute('aria-hidden', 'true');\n this.svg.style.cssText = 'position:absolute;pointer-events:none';\n this.root.htmlOverlay!.append(this.svg, this.viewport);\n }\n\n private apply(projection: Projection, rootMatrix: DOMMatrix, index: number): void {\n const { registration: r, world, clips, opacity } = projection;\n const slot = r.slot;\n const first = !slot.shell;\n const doc = this.root.canvas!.ownerDocument;\n if (first) {\n slot.shell = doc.createElement('div'); slot.shell.dataset.pibblHtmlBox = '';\n slot.shell.style.cssText = 'position:absolute;left:0;top:0;transform-origin:0 0;pointer-events:none;isolation:isolate';\n slot.content = doc.createElement('div'); slot.content.dataset.pibblHtmlContent = '';\n slot.content.style.cssText = 'position:absolute;box-sizing:border-box';\n slot.shell.append(slot.content); this.viewport!.append(slot.shell);\n slot.clipping = []; slot.abort = new (doc.defaultView!.AbortController)();\n slot.region.content = slot.content;\n this.live.add(slot);\n }\n const matrix = rootMatrix.multiply(world);\n const determinant = matrix.a * matrix.d - matrix.b * matrix.c;\n const visible = r.border.width > 0 && r.border.height > 0 && determinant !== 0;\n slot.shell!.style.width = `${r.border.width}px`; slot.shell!.style.height = `${r.border.height}px`;\n slot.shell!.style.transform = cssMatrix(matrix); slot.shell!.style.zIndex = String(index);\n slot.shell!.style.opacity = String(opacity); slot.shell!.style.overflow = r.overflow;\n slot.content!.style.left = `${r.content.x}px`; slot.content!.style.top = `${r.content.y}px`;\n slot.content!.style.width = `${r.content.width}px`; slot.content!.style.height = `${r.content.height}px`;\n slot.content!.style.pointerEvents = r.interactive ? 'auto' : 'none';\n slot.shell!.inert = !visible || !r.interactive;\n slot.shell!.style.visibility = visible ? 'visible' : 'hidden';\n slot.region.active = visible && r.interactive;\n const corners = [[0,0],[r.border.width,0],[0,r.border.height],[r.border.width,r.border.height]].map(([x,y]) => world.transformPoint({x,y}));\n const xs = corners.map(p => p.x), ys = corners.map(p => p.y);\n slot.region.rootBounds = { x: Math.min(...xs), y: Math.min(...ys), width: Math.max(...xs)-Math.min(...xs), height: Math.max(...ys)-Math.min(...ys) };\n slot.callback = r.onFocusChange;\n if (visible) this.applyClips(slot, clips, world.inverse());\n try {\n if (first) {\n const update = withSignalWriteForbidden('HtmlBox mount', () => slot.mount(slot.content!, r.data, slot.abort!.signal));\n if (typeof update !== 'function') throw new TypeError('HtmlBox mount must synchronously return an update function.');\n slot.update = update;\n } else if (this.rendered.has(slot)) {\n const result: unknown = withSignalWriteForbidden('HtmlBox update', () => slot.update!(r.data));\n if (result && typeof (result as PromiseLike<unknown>).then === 'function') throw new TypeError('HtmlBox update must be synchronous.');\n }\n } catch (error) { this.retire(slot); throw error; }\n slot.shell!.inert = !visible || !r.interactive;\n slot.shell!.style.visibility = visible ? 'visible' : 'hidden';\n }\n\n private applyClips(slot: HtmlBoxSlot, clips: Clip[], inverseWorld: DOMMatrix): void {\n const definitions = slot.clipping!;\n const doc = this.root.canvas!.ownerDocument;\n while (definitions.length < clips.length) {\n const definition = doc.createElementNS(SVG, 'clipPath');\n definition.id = `pibbl-html-clip-${++nextId}`;\n definition.setAttribute('clipPathUnits', 'userSpaceOnUse');\n definition.append(doc.createElementNS(SVG, 'path'));\n this.svg!.append(definition); definitions.push(definition);\n }\n clips.forEach((clip, index) => {\n const definition = definitions[index]; const path = definition.firstElementChild!;\n setAttribute(path, 'd', clip.data);\n setAttribute(path, 'clip-rule', clip.rule);\n setAttribute(path, 'transform', cssMatrix(inverseWorld.multiply(clip.matrix)));\n if (index + 1 < clips.length) setAttribute(definition, 'clip-path', `url(#${definitions[index+1].id})`);\n else definition.removeAttribute('clip-path');\n });\n slot.shell!.style.clipPath = clips.length ? `url(#${definitions[0].id})` : 'none';\n while (definitions.length > clips.length) definitions.pop()!.remove();\n }\n\n private reset(): void {\n for (const slot of this.live) this.retire(slot);\n this.snapshots.clear();\n this.viewport?.remove(); this.svg?.remove(); this.viewport = undefined; this.svg = undefined;\n }\n dispose(): void { if (this.disposed) return; this.disposed = true; this.reset(); }\n}\n\nfunction assertEffects(composite = GLOBAL_STATE.renderContext?.globalCompositeOperation): void {\n if (GLOBAL_STATE.htmlFilterDepth || composite !== 'source-over') throw new Error('HtmlBox cannot be enclosed by Canvas filters or non-default compositing. Use CSS effects inside its content instead.');\n}\nfunction copy(matrix: DOMMatrixReadOnly): DOMMatrix { return new DOMMatrix([matrix.a,matrix.b,matrix.c,matrix.d,matrix.e,matrix.f]); }\nexport function snapshotClips(clips: readonly PibblClippingStackEntry[]): PibblClippingStackEntry[] {\n return clips.map(clip => ({ ...clip, transform: copy(clip.transform) }));\n}\nfunction cssMatrix(m: DOMMatrixReadOnly): string { return `matrix(${m.a},${m.b},${m.c},${m.d},${m.e},${m.f})`; }\nfunction setAttribute(element: Element, name: string, value: string): void { if (element.getAttribute(name) !== value) element.setAttribute(name, value); }\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { HtmlNativeEvents, type HtmlNativeEventSnapshot } from './html-events.js';\nimport { stageLayoutHtmlGeometry } from '../layout/geometry-publication.js';\nimport { isLayoutComponentSuspended, isLayoutInstanceSuspended } from '../layout/participation.js';\nimport { GLOBAL_STATE } from '../global-state.js';\nimport { withSignalWriteForbidden } from '../signals/graph.js';\nimport type { PibblClippingStackEntry, PibblEventRoot, PibblInstance, PibblInteractionLayer, PibblRenderTransaction } from '../types.js';\nimport type { HtmlBoxRegistration, HtmlBoxSlot, HtmlBridge } from './types.js';\nimport { validateHtmlOverlay } from './overlay-config.js';\nimport { rectangleSvg } from './portable-clips.js';\n\nconst SVG = 'http://www.w3.org/2000/svg';\nlet nextId = 0;\ntype Entry = HtmlBoxRegistration | { child: PibblInstance; matrix: DOMMatrix; clips: readonly PibblClippingStackEntry[]; opacity: number; bounds: {x:number;y:number;width:number;height:number} };\ntype Clip = { data: string; matrix: DOMMatrix; rule: CanvasFillRule };\ninterface Projection { events?: HtmlNativeEventSnapshot; world: DOMMatrix; rootMatrix: DOMMatrix; transformCss?: string; definitions?: SVGClipPathElement[]; clipPath?: string; registration: HtmlBoxRegistration; matrix: DOMMatrix; bounds: { x: number; y: number; width: number; height: number }; visible: boolean; clips: Clip[]; opacity: number; }\n\nexport function requireHtmlService(owner: PibblInstance): HtmlService {\n const root = owner.eventRoot;\n if (!root.htmlOverlay || !root.canvas) throw new Error('HtmlBox requires an HTMLCanvasElement root configured with htmlOverlay.');\n return (root.html ??= new HtmlService(root)) as HtmlService;\n}\n\nexport class HtmlService implements HtmlBridge {\n private snapshots = new Map<PibblInstance, Entry[]>();\n private pending: Map<PibblInstance, Entry[]> | undefined;\n private transaction: PibblRenderTransaction | undefined;\n private live = new Set<HtmlBoxSlot>();\n private svg: SVGSVGElement | undefined;\n private viewport: HTMLDivElement | undefined;\n private disposed = false;\n private suspended = false;\n private projections: Projection[] | undefined;\n private nextSnapshots: Map<PibblInstance, Entry[]> | undefined;\n private rendered = new Set<HtmlBoxSlot>();\n constructor(private readonly root: PibblEventRoot) {}\n\n private enterTransaction(): void {\n const transaction = this.root.renderTransaction;\n if (!transaction) throw new Error('HtmlBox requires an active render transaction.');\n if (transaction === this.transaction) return;\n this.transaction = transaction;\n this.pending = new Map(this.snapshots);\n this.rendered = new Set();\n this.suspended = false;\n transaction.onPreflight!(() => this.prepare());\n transaction.onPublish!(() => this.publish());\n transaction.onAdopt!(() => this.adopt());\n transaction.onFinish(success => {\n if (!success && transaction.failed !== false) this.reset();\n this.pending = undefined;\n this.transaction = undefined;\n this.rendered.clear();\n this.projections = undefined;\n this.nextSnapshots = undefined;\n });\n }\n\n beginRender(instance: PibblInstance): void {\n this.enterTransaction();\n this.pending!.set(instance, []);\n }\n\n suspend(instance: PibblInstance): void {\n if (instance !== this.root.rootInstance) return;\n this.enterTransaction();\n this.suspended = true;\n }\n\n register(registration: HtmlBoxRegistration): void {\n assertEffects();\n this.enterTransaction();\n const owner = registration.slot.owner;\n let entries = this.pending!.get(owner);\n // A service first created during this render has no candidate array yet.\n if (!entries || entries === this.snapshots.get(owner)) this.pending!.set(owner, entries = []);\n entries.push(registration);\n this.rendered.add(registration.slot);\n this.root.focusPolicy?.observeHtmlRegion?.(registration.slot.region);\n }\n\n recordLayer(parent: PibblInstance, child: PibblInstance, bridge: PibblInteractionLayer, opacity: number, composite: GlobalCompositeOperation): void {\n this.enterTransaction();\n if (this.hasHosts(child)) {\n assertEffects(composite);\n const entries = this.pending!.get(parent) ?? [];\n if (!this.pending!.has(parent)) this.pending!.set(parent, entries);\n entries.push({ child, matrix: copy(bridge.transform), clips: snapshotClips(bridge.clippingStack), opacity,\n bounds: { x: 0, y: 0, width: child.rootLayoutBox.width, height: child.rootLayoutBox.height } });\n }\n }\n\n private hasHosts(instance: PibblInstance): boolean {\n return (this.pending?.get(instance) ?? this.snapshots.get(instance) ?? []).length > 0;\n }\n\n release(slot: HtmlBoxSlot): void {\n if (slot.disposed) return;\n const transaction = this.root.renderTransaction;\n if (transaction) {\n transaction.onPublish!(() => this.retire(slot));\n transaction.onFinish(success => { if (!success) this.retire(slot); });\n } else this.retire(slot);\n }\n\n private retire(slot: HtmlBoxSlot): void {\n if (slot.disposed) return;\n slot.disposed = true;\n slot.events?.dispose();\n slot.region.active = false;\n this.root.focusPolicy?.removeHtmlFocusRegion?.(slot.region);\n try { withSignalWriteForbidden('HtmlBox abort cleanup', () => slot.abort?.abort()); }\n finally {\n slot.shell?.remove();\n for (const clip of slot.clipping ?? []) clip.remove();\n slot.clipping = [];\n slot.update = undefined;\n slot.region.content = undefined;\n this.live.delete(slot);\n }\n }\n\n private prepare(): void {\n if (this.disposed || !this.pending) return;\n const canvas = this.root.canvas!;\n const overlay = this.root.htmlOverlay!;\n validateHtmlOverlay(canvas, overlay);\n const rootInstance = this.root.rootInstance!;\n if (rootInstance.surface.kind === 'root' && (!rootInstance.surface.display.width || !rootInstance.surface.display.height)) {\n this.suspended = true;\n for (const slot of this.live) stageLayoutHtmlGeometry(this.transaction!, slot.region, {\n active: false, bounds: slot.region.rootBounds ?? { x: 0, y: 0, width: 0, height: 0 },\n });\n return;\n }\n const surface = rootInstance.surface.snapshot!;\n const rootMatrix = new DOMMatrix().scale(1 / surface.backingPixelsPerCssPixelX, 1 / surface.backingPixelsPerCssPixelY).multiply(surface.renderTransform);\n const projections: Projection[] = [];\n const visited = new Set<PibblInstance>();\n const walk = (\n instance: PibblInstance,\n world: DOMMatrix,\n clips: Clip[],\n opacity: number,\n ) => {\n visited.add(instance);\n for (const entry of this.pending!.get(instance) ?? []) {\n const inherited = clips.concat(entry.clips.map(clip => {\n if (clip.svgPath === undefined) throw new Error('HtmlBox cannot project a native Path2D clip. Use PathGeometry for clips enclosing HtmlBox.');\n return { data: clip.svgPath, rule: clip.fillRule, matrix: world.multiply(clip.transform) };\n }));\n if ('child' in entry) {\n const childWorld = world.multiply(entry.matrix);\n walk(entry.child, childWorld, inherited.concat({ data: rectangleSvg(entry.bounds), matrix: childWorld, rule: 'nonzero' }), opacity * entry.opacity);\n } else if (!entry.slot.disposed) {\n const hostWorld = world.multiply(entry.matrix);\n if (!(\n Number.isFinite(hostWorld.a) &&\n Number.isFinite(hostWorld.b) &&\n Number.isFinite(hostWorld.c) &&\n Number.isFinite(hostWorld.d) &&\n Number.isFinite(hostWorld.e) &&\n Number.isFinite(hostWorld.f)\n ))\n throw new Error('HtmlBox transform must be finite.');\n projections.push(prepareProjection(entry, hostWorld, rootMatrix, inherited, opacity * entry.opacity));\n }\n }\n };\n walk(rootInstance, new DOMMatrix(), [], 1);\n for (const projection of projections) {\n projection.transformCss = cssMatrix(projection.matrix);\n const slot = projection.registration.slot;\n slot.events ??= new HtmlNativeEvents(slot, () => this.svg!, target => {\n const doc = this.root.canvas!.ownerDocument;\n if (!(target instanceof doc.defaultView!.Node)) return null;\n for (const candidate of this.live) {\n if (candidate.events?.node.live && candidate.shell?.contains(target)) return candidate.events.node;\n }\n return null;\n });\n projection.events = slot.events.prepare(projection.registration.handlers, projection.world,\n projection.rootMatrix, projection.visible && projection.registration.interactive);\n stageLayoutHtmlGeometry(this.transaction!, projection.registration.slot.region, {\n bounds: projection.bounds, active: projection.visible && projection.registration.interactive,\n });\n }\n this.projections = projections;\n this.nextSnapshots = new Map([...this.pending].filter(([owner]) => visited.has(owner)));\n }\n\n private publish(): void {\n if (this.suspended) { this.root.focusPolicy?.suspendHtmlRegions?.(); return; }\n const projections = this.projections;\n if (!projections || this.disposed) return;\n const desired = new Set(projections.map(p => p.registration.slot));\n for (const slot of this.live) if (!desired.has(slot)) {\n if (!slot.owner.mainTeardowns.closed && (isLayoutComponentSuspended(slot.component) || isLayoutInstanceSuspended(slot.owner))) {\n slot.region.active = false; slot.events?.suspend();\n this.root.focusPolicy?.removeHtmlFocusRegion?.(slot.region);\n if (slot.shell) { slot.shell.inert = true; slot.shell.style.visibility = 'hidden'; }\n } else this.retire(slot);\n }\n if (projections.length) this.ensureDOM();\n for (const projection of projections) this.prepareClips(projection);\n for (const projection of projections) {\n const slot = projection.registration.slot;\n if ((!projection.visible || !projection.registration.interactive) && slot.region.active) {\n this.root.focusPolicy?.removeHtmlFocusRegion?.(slot.region);\n const active = this.root.canvas!.ownerDocument.activeElement;\n if (active instanceof HTMLElement && slot.content?.contains(active)) active.blur();\n }\n this.publishContent(projection);\n }\n }\n\n private adopt(): void {\n if (this.disposed) return;\n if (this.suspended) {\n if (this.viewport) this.viewport.hidden = true;\n for (const slot of this.live) { slot.region.active = false; slot.events?.suspend(); if (slot.shell) slot.shell.inert = true; }\n return;\n }\n if (!this.projections) return;\n if (this.viewport) this.viewport.hidden = false;\n for (let index = 0; index < this.projections.length; index++) this.applyGeometry(this.projections[index], index);\n this.snapshots = this.nextSnapshots!;\n }\n\n private ensureDOM(): void {\n if (this.viewport) return;\n const doc = this.root.canvas!.ownerDocument;\n this.viewport = doc.createElement('div');\n this.viewport.dataset.pibblHtmlViewport = '';\n this.viewport.style.cssText = 'position:absolute;inset:0;overflow:clip;pointer-events:none';\n this.svg = doc.createElementNS(SVG, 'svg');\n this.svg.setAttribute('width', '0'); this.svg.setAttribute('height', '0');\n this.svg.setAttribute('aria-hidden', 'true');\n this.svg.style.cssText = 'position:absolute;left:0;top:0;pointer-events:none';\n this.root.htmlOverlay!.append(this.svg, this.viewport);\n }\n\n private publishContent(projection: Projection): void {\n const r = projection.registration;\n const slot = r.slot;\n const first = !slot.shell;\n const doc = this.root.canvas!.ownerDocument;\n if (first) {\n slot.shell = doc.createElement('div'); slot.shell.dataset.pibblHtmlBox = '';\n slot.shell.style.cssText = 'position:absolute;left:0;top:0;transform-origin:0 0;pointer-events:none;isolation:isolate;opacity:0';\n slot.content = doc.createElement('div'); slot.content.dataset.pibblHtmlContent = '';\n slot.content.style.cssText = 'position:absolute;box-sizing:border-box';\n slot.shell.append(slot.content); this.viewport!.append(slot.shell);\n slot.clipping = []; slot.abort = new (doc.defaultView!.AbortController)();\n slot.region.content = slot.content;\n this.live.add(slot);\n }\n slot.events!.prepareListeners(projection.events!);\n try {\n if (first) {\n const update = withSignalWriteForbidden('HtmlBox mount', () => slot.mount(slot.content!, r.data, slot.abort!.signal));\n if (typeof update !== 'function') throw new TypeError('HtmlBox mount must synchronously return an update function.');\n slot.update = update;\n } else if (this.rendered.has(slot)) {\n const result: unknown = withSignalWriteForbidden('HtmlBox update', () => slot.update!(r.data));\n if (result && typeof (result as PromiseLike<unknown>).then === 'function') throw new TypeError('HtmlBox update must be synchronous.');\n }\n } catch (error) { this.retire(slot); throw error; }\n }\n\n private applyGeometry(projection: Projection, index: number): void {\n const { registration: r, bounds, visible, opacity } = projection;\n const slot = r.slot;\n if (slot.disposed) return;\n slot.shell!.style.width = `${r.border.width}px`; slot.shell!.style.height = `${r.border.height}px`;\n slot.shell!.style.transform = projection.transformCss!; slot.shell!.style.zIndex = String(index);\n slot.shell!.style.opacity = String(opacity); slot.shell!.style.overflow = r.overflow;\n slot.content!.style.left = `${r.content.x}px`; slot.content!.style.top = `${r.content.y}px`;\n slot.content!.style.width = `${r.content.width}px`; slot.content!.style.height = `${r.content.height}px`;\n slot.content!.style.pointerEvents = r.interactive ? 'auto' : 'none';\n slot.shell!.inert = !visible || !r.interactive;\n slot.shell!.style.visibility = visible ? 'visible' : 'hidden';\n slot.region.active = visible && r.interactive;\n slot.region.rootBounds = bounds;\n slot.callback = r.onFocusChange;\n slot.events!.adopt(projection.events!);\n if (visible) {\n const previous = slot.clipping;\n slot.clipping = projection.definitions!;\n slot.shell!.style.clipPath = projection.clipPath!;\n if (previous !== slot.clipping) for (const definition of previous ?? []) definition.remove();\n }\n }\n\n private prepareClips(projection: Projection): void {\n if (!projection.visible) return;\n const slot = projection.registration.slot;\n const clips = projection.clips;\n const previous = slot.clipping;\n let unchanged = previous?.length === clips.length;\n const matrices: string[] = [];\n for (let index = 0; index < clips.length; index++) {\n const clip = clips[index];\n matrices.push(cssMatrix(clip.matrix));\n const path = previous?.[index]?.firstElementChild;\n if (!path || path.getAttribute('d') !== clip.data || path.getAttribute('clip-rule') !== clip.rule ||\n path.getAttribute('transform') !== matrices[index]) unchanged = false;\n }\n if (unchanged) {\n projection.definitions = previous;\n projection.clipPath = clips.length ? `url(#${previous![0].id})` : 'none';\n return;\n }\n const definitions: SVGClipPathElement[] = [];\n const doc = this.root.canvas!.ownerDocument;\n for (let index = 0; index < clips.length; index++) {\n const definition = doc.createElementNS(SVG, 'clipPath');\n definition.id = `pibbl-html-clip-${++nextId}`;\n definition.setAttribute('clipPathUnits', 'userSpaceOnUse');\n const path = doc.createElementNS(SVG, 'path');\n path.setAttribute('d', clips[index].data);\n path.setAttribute('clip-rule', clips[index].rule);\n path.setAttribute('transform', matrices[index]);\n definition.append(path); definitions.push(definition);\n }\n for (let index = 0; index + 1 < definitions.length; index++) definitions[index].firstElementChild!.setAttribute('clip-path', `url(#${definitions[index + 1].id})`);\n // New definitions cannot affect the live shell until its clip-path is adopted.\n for (const definition of definitions) this.svg!.append(definition);\n projection.definitions = definitions;\n projection.clipPath = definitions.length ? `url(#${definitions[0].id})` : 'none';\n }\n\n private reset(): void {\n for (const slot of this.live) this.retire(slot);\n this.snapshots.clear();\n this.viewport?.remove(); this.svg?.remove(); this.viewport = undefined; this.svg = undefined;\n }\n dispose(): void { if (this.disposed) return; this.disposed = true; this.reset(); }\n}\n\nfunction assertEffects(composite = GLOBAL_STATE.renderContext?.globalCompositeOperation): void {\n if (GLOBAL_STATE.htmlFilterDepth || composite !== 'source-over') throw new Error('HtmlBox cannot be enclosed by Canvas filters or non-default compositing. Use CSS effects inside its content instead.');\n}\nfunction copy(matrix: DOMMatrixReadOnly): DOMMatrix { return new DOMMatrix([matrix.a,matrix.b,matrix.c,matrix.d,matrix.e,matrix.f]); }\nexport function snapshotClips(clips: readonly PibblClippingStackEntry[]): PibblClippingStackEntry[] {\n return clips.map(clip => ({ ...clip, transform: copy(clip.transform) }));\n}\nfunction cssMatrix(m: DOMMatrixReadOnly): string { return `matrix(${m.a},${m.b},${m.c},${m.d},${m.e},${m.f})`; }\n\n\n/** Settle all fallible numeric projection work before publishing any host. */\nfunction prepareProjection(registration: HtmlBoxRegistration, world: DOMMatrix, rootMatrix: DOMMatrix, clips: Clip[], opacity: number): Projection {\n const matrix = rootMatrix.multiply(world);\n assertFiniteProjectionMatrix(matrix);\n const width = registration.border.width;\n const height = registration.border.height;\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n for (let space = 0; space < 2; space++) {\n const transform = space === 0 ? world : matrix;\n let left = Infinity, top = Infinity, right = -Infinity, bottom = -Infinity;\n for (let corner = 0; corner < 4; corner++) {\n const x = corner & 1 ? width : 0;\n const y = corner & 2 ? height : 0;\n const projectedX = transform.a * x + transform.c * y + transform.e;\n const projectedY = transform.b * x + transform.d * y + transform.f;\n if (!Number.isFinite(projectedX) || !Number.isFinite(projectedY)) throw new Error('HtmlBox projection must be finite.');\n left = Math.min(left, projectedX); top = Math.min(top, projectedY);\n right = Math.max(right, projectedX); bottom = Math.max(bottom, projectedY);\n }\n if (!Number.isFinite(right - left) || !Number.isFinite(bottom - top)) throw new Error('HtmlBox projection must be finite.');\n if (space === 0) { minX = left; minY = top; maxX = right; maxY = bottom; }\n }\n const bounds = { x: minX, y: minY, width: maxX - minX, height: maxY - minY };\n if (!Number.isFinite(bounds.width) || !Number.isFinite(bounds.height)) throw new Error('HtmlBox projection must be finite.');\n const determinant = matrix.a * matrix.d - matrix.b * matrix.c;\n if (Number.isNaN(determinant)) throw new Error('HtmlBox projection must be finite.');\n const visible = width > 0 && height > 0 && determinant !== 0;\n const localClips: Clip[] = [];\n if (visible && clips.length) {\n const inverse = world.inverse();\n assertFiniteProjectionMatrix(inverse);\n for (const clip of clips) {\n const local = inverse.multiply(clip.matrix);\n assertFiniteProjectionMatrix(local);\n localClips.push({ data: clip.data, rule: clip.rule, matrix: local });\n }\n }\n return { registration, world, rootMatrix, matrix, bounds, visible, clips: localClips, opacity };\n}\nfunction assertFiniteProjectionMatrix(matrix: DOMMatrixReadOnly): void {\n if (!(Number.isFinite(matrix.a) && Number.isFinite(matrix.b) && Number.isFinite(matrix.c) && Number.isFinite(matrix.d) && Number.isFinite(matrix.e) && Number.isFinite(matrix.f))) throw new Error('HtmlBox projection must be finite.');\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -20,16 +20,17 @@ function validateHtmlOverlay(canvas, overlay) {
20
20
  if (!canvas.isConnected || !overlay.isConnected || canvas.parentElement !== overlay.parentElement || canvas.nextElementSibling !== overlay) {
21
21
  throw new Error("HtmlBox overlay and canvas must remain connected adjacent siblings.");
22
22
  }
23
- for (const element of [canvas, overlay]) {
24
- const style = view.getComputedStyle(element);
25
- if (style.transform !== "none" || ["paddingLeft", "paddingRight", "paddingTop", "paddingBottom", "borderLeftWidth", "borderRightWidth", "borderTopWidth", "borderBottomWidth"].some((key) => parseFloat(style[key]) !== 0)) {
26
- throw new Error("HtmlBox canvas and overlay must have no independent CSS transform, padding, or border. Style their common wrapper instead.");
27
- }
28
- }
23
+ validateOverlayElement(view.getComputedStyle(canvas));
24
+ validateOverlayElement(view.getComputedStyle(overlay));
29
25
  if (Math.abs(canvas.clientWidth - overlay.clientWidth) > 1 || Math.abs(canvas.clientHeight - overlay.clientHeight) > 1 || canvas.offsetLeft !== overlay.offsetLeft || canvas.offsetTop !== overlay.offsetTop) {
30
26
  throw new Error("HtmlBox overlay must share the canvas content rectangle.");
31
27
  }
32
28
  }
29
+ function validateOverlayElement(style) {
30
+ if (style.transform !== "none" || parseFloat(style.paddingLeft) !== 0 || parseFloat(style.paddingRight) !== 0 || parseFloat(style.paddingTop) !== 0 || parseFloat(style.paddingBottom) !== 0 || parseFloat(style.borderLeftWidth) !== 0 || parseFloat(style.borderRightWidth) !== 0 || parseFloat(style.borderTopWidth) !== 0 || parseFloat(style.borderBottomWidth) !== 0) {
31
+ throw new Error("HtmlBox canvas and overlay must have no independent CSS transform, padding, or border. Style their common wrapper instead.");
32
+ }
33
+ }
33
34
  export {
34
35
  reserveHtmlOverlay,
35
36
  validateHtmlOverlay
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/lib/html/overlay-config.ts"],
4
- "sourcesContent": ["import type { PibblInstance } from '../types.js';\n\nconst leases = new WeakMap<HTMLElement, PibblInstance>();\n\nexport function reserveHtmlOverlay(instance: PibblInstance, overlay: HTMLElement): void {\n const canvas = instance.eventRoot.canvas;\n if (!canvas || instance.parent) throw new Error('htmlOverlay requires an HTMLCanvasElement root, not a Layer.');\n if (overlay?.nodeType !== 1 || overlay.namespaceURI !== 'http://www.w3.org/1999/xhtml' ||\n overlay.ownerDocument !== canvas.ownerDocument || !overlay.isConnected || !canvas.isConnected ||\n canvas.parentElement !== overlay.parentElement || canvas.nextElementSibling !== overlay) {\n throw new Error('htmlOverlay must be a connected HTML element immediately after the canvas in the same parent and document.');\n }\n if (leases.has(overlay) || overlay.childNodes.length) throw new Error('htmlOverlay must be empty and exclusively owned by one Pibbl root.');\n leases.set(overlay, instance);\n instance.eventRoot.htmlOverlay = overlay;\n instance.mainTeardowns.add(() => {\n instance.eventRoot.html?.dispose();\n instance.eventRoot.html = undefined;\n instance.eventRoot.htmlOverlay = undefined;\n if (leases.get(overlay) === instance) leases.delete(overlay);\n });\n}\n\nexport function validateHtmlOverlay(canvas: HTMLCanvasElement, overlay: HTMLElement): void {\n const view = canvas.ownerDocument.defaultView!;\n if (!canvas.isConnected || !overlay.isConnected || canvas.parentElement !== overlay.parentElement || canvas.nextElementSibling !== overlay) {\n throw new Error('HtmlBox overlay and canvas must remain connected adjacent siblings.');\n }\n for (const element of [canvas, overlay]) {\n const style = view.getComputedStyle(element);\n if (style.transform !== 'none' || ['paddingLeft','paddingRight','paddingTop','paddingBottom','borderLeftWidth','borderRightWidth','borderTopWidth','borderBottomWidth'].some(key => parseFloat(style[key as keyof CSSStyleDeclaration] as string) !== 0)) {\n throw new Error('HtmlBox canvas and overlay must have no independent CSS transform, padding, or border. Style their common wrapper instead.');\n }\n }\n if (Math.abs(canvas.clientWidth - overlay.clientWidth) > 1 || Math.abs(canvas.clientHeight - overlay.clientHeight) > 1 || canvas.offsetLeft !== overlay.offsetLeft || canvas.offsetTop !== overlay.offsetTop) {\n throw new Error('HtmlBox overlay must share the canvas content rectangle.');\n }\n}\n"],
5
- "mappings": "AAEA,MAAM,SAAS,oBAAI,QAAoC;AAEhD,SAAS,mBAAmB,UAAyB,SAA4B;AACtF,QAAM,SAAS,SAAS,UAAU;AAClC,MAAI,CAAC,UAAU,SAAS,OAAQ,OAAM,IAAI,MAAM,8DAA8D;AAC9G,MAAI,SAAS,aAAa,KAAK,QAAQ,iBAAiB,kCACpD,QAAQ,kBAAkB,OAAO,iBAAiB,CAAC,QAAQ,eAAe,CAAC,OAAO,eAClF,OAAO,kBAAkB,QAAQ,iBAAiB,OAAO,uBAAuB,SAAS;AAC3F,UAAM,IAAI,MAAM,4GAA4G;AAAA,EAC9H;AACA,MAAI,OAAO,IAAI,OAAO,KAAK,QAAQ,WAAW,OAAQ,OAAM,IAAI,MAAM,oEAAoE;AAC1I,SAAO,IAAI,SAAS,QAAQ;AAC5B,WAAS,UAAU,cAAc;AACjC,WAAS,cAAc,IAAI,MAAM;AAC/B,aAAS,UAAU,MAAM,QAAQ;AACjC,aAAS,UAAU,OAAO;AAC1B,aAAS,UAAU,cAAc;AACjC,QAAI,OAAO,IAAI,OAAO,MAAM,SAAU,QAAO,OAAO,OAAO;AAAA,EAC7D,CAAC;AACH;AAEO,SAAS,oBAAoB,QAA2B,SAA4B;AACzF,QAAM,OAAO,OAAO,cAAc;AAClC,MAAI,CAAC,OAAO,eAAe,CAAC,QAAQ,eAAe,OAAO,kBAAkB,QAAQ,iBAAiB,OAAO,uBAAuB,SAAS;AAC1I,UAAM,IAAI,MAAM,qEAAqE;AAAA,EACvF;AACA,aAAW,WAAW,CAAC,QAAQ,OAAO,GAAG;AACvC,UAAM,QAAQ,KAAK,iBAAiB,OAAO;AAC3C,QAAI,MAAM,cAAc,UAAU,CAAC,eAAc,gBAAe,cAAa,iBAAgB,mBAAkB,oBAAmB,kBAAiB,mBAAmB,EAAE,KAAK,SAAO,WAAW,MAAM,GAAgC,CAAW,MAAM,CAAC,GAAG;AACxP,YAAM,IAAI,MAAM,4HAA4H;AAAA,IAC9I;AAAA,EACF;AACA,MAAI,KAAK,IAAI,OAAO,cAAc,QAAQ,WAAW,IAAI,KAAK,KAAK,IAAI,OAAO,eAAe,QAAQ,YAAY,IAAI,KAAK,OAAO,eAAe,QAAQ,cAAc,OAAO,cAAc,QAAQ,WAAW;AAC5M,UAAM,IAAI,MAAM,0DAA0D;AAAA,EAC5E;AACF;",
4
+ "sourcesContent": ["import type { PibblInstance } from '../types.js';\n\nconst leases = new WeakMap<HTMLElement, PibblInstance>();\n\nexport function reserveHtmlOverlay(instance: PibblInstance, overlay: HTMLElement): void {\n const canvas = instance.eventRoot.canvas;\n if (!canvas || instance.parent) throw new Error('htmlOverlay requires an HTMLCanvasElement root, not a Layer.');\n if (overlay?.nodeType !== 1 || overlay.namespaceURI !== 'http://www.w3.org/1999/xhtml' ||\n overlay.ownerDocument !== canvas.ownerDocument || !overlay.isConnected || !canvas.isConnected ||\n canvas.parentElement !== overlay.parentElement || canvas.nextElementSibling !== overlay) {\n throw new Error('htmlOverlay must be a connected HTML element immediately after the canvas in the same parent and document.');\n }\n if (leases.has(overlay) || overlay.childNodes.length) throw new Error('htmlOverlay must be empty and exclusively owned by one Pibbl root.');\n leases.set(overlay, instance);\n instance.eventRoot.htmlOverlay = overlay;\n instance.mainTeardowns.add(() => {\n instance.eventRoot.html?.dispose();\n instance.eventRoot.html = undefined;\n instance.eventRoot.htmlOverlay = undefined;\n if (leases.get(overlay) === instance) leases.delete(overlay);\n });\n}\n\nexport function validateHtmlOverlay(canvas: HTMLCanvasElement, overlay: HTMLElement): void {\n const view = canvas.ownerDocument.defaultView!;\n if (!canvas.isConnected || !overlay.isConnected || canvas.parentElement !== overlay.parentElement || canvas.nextElementSibling !== overlay) {\n throw new Error('HtmlBox overlay and canvas must remain connected adjacent siblings.');\n }\n validateOverlayElement(view.getComputedStyle(canvas));\n validateOverlayElement(view.getComputedStyle(overlay));\n if (Math.abs(canvas.clientWidth - overlay.clientWidth) > 1 || Math.abs(canvas.clientHeight - overlay.clientHeight) > 1 || canvas.offsetLeft !== overlay.offsetLeft || canvas.offsetTop !== overlay.offsetTop) {\n throw new Error('HtmlBox overlay must share the canvas content rectangle.');\n }\n}\n\nfunction validateOverlayElement(style: CSSStyleDeclaration): void {\n if (\n style.transform !== 'none' ||\n parseFloat(style.paddingLeft) !== 0 || parseFloat(style.paddingRight) !== 0 ||\n parseFloat(style.paddingTop) !== 0 || parseFloat(style.paddingBottom) !== 0 ||\n parseFloat(style.borderLeftWidth) !== 0 || parseFloat(style.borderRightWidth) !== 0 ||\n parseFloat(style.borderTopWidth) !== 0 || parseFloat(style.borderBottomWidth) !== 0\n ) {\n throw new Error('HtmlBox canvas and overlay must have no independent CSS transform, padding, or border. Style their common wrapper instead.');\n }\n}\n"],
5
+ "mappings": "AAEA,MAAM,SAAS,oBAAI,QAAoC;AAEhD,SAAS,mBAAmB,UAAyB,SAA4B;AACtF,QAAM,SAAS,SAAS,UAAU;AAClC,MAAI,CAAC,UAAU,SAAS,OAAQ,OAAM,IAAI,MAAM,8DAA8D;AAC9G,MAAI,SAAS,aAAa,KAAK,QAAQ,iBAAiB,kCACpD,QAAQ,kBAAkB,OAAO,iBAAiB,CAAC,QAAQ,eAAe,CAAC,OAAO,eAClF,OAAO,kBAAkB,QAAQ,iBAAiB,OAAO,uBAAuB,SAAS;AAC3F,UAAM,IAAI,MAAM,4GAA4G;AAAA,EAC9H;AACA,MAAI,OAAO,IAAI,OAAO,KAAK,QAAQ,WAAW,OAAQ,OAAM,IAAI,MAAM,oEAAoE;AAC1I,SAAO,IAAI,SAAS,QAAQ;AAC5B,WAAS,UAAU,cAAc;AACjC,WAAS,cAAc,IAAI,MAAM;AAC/B,aAAS,UAAU,MAAM,QAAQ;AACjC,aAAS,UAAU,OAAO;AAC1B,aAAS,UAAU,cAAc;AACjC,QAAI,OAAO,IAAI,OAAO,MAAM,SAAU,QAAO,OAAO,OAAO;AAAA,EAC7D,CAAC;AACH;AAEO,SAAS,oBAAoB,QAA2B,SAA4B;AACzF,QAAM,OAAO,OAAO,cAAc;AAClC,MAAI,CAAC,OAAO,eAAe,CAAC,QAAQ,eAAe,OAAO,kBAAkB,QAAQ,iBAAiB,OAAO,uBAAuB,SAAS;AAC1I,UAAM,IAAI,MAAM,qEAAqE;AAAA,EACvF;AACA,yBAAuB,KAAK,iBAAiB,MAAM,CAAC;AACpD,yBAAuB,KAAK,iBAAiB,OAAO,CAAC;AACrD,MAAI,KAAK,IAAI,OAAO,cAAc,QAAQ,WAAW,IAAI,KAAK,KAAK,IAAI,OAAO,eAAe,QAAQ,YAAY,IAAI,KAAK,OAAO,eAAe,QAAQ,cAAc,OAAO,cAAc,QAAQ,WAAW;AAC5M,UAAM,IAAI,MAAM,0DAA0D;AAAA,EAC5E;AACF;AAEA,SAAS,uBAAuB,OAAkC;AAChE,MACE,MAAM,cAAc,UACpB,WAAW,MAAM,WAAW,MAAM,KAAK,WAAW,MAAM,YAAY,MAAM,KAC1E,WAAW,MAAM,UAAU,MAAM,KAAK,WAAW,MAAM,aAAa,MAAM,KAC1E,WAAW,MAAM,eAAe,MAAM,KAAK,WAAW,MAAM,gBAAgB,MAAM,KAClF,WAAW,MAAM,cAAc,MAAM,KAAK,WAAW,MAAM,iBAAiB,MAAM,GAClF;AACE,UAAM,IAAI,MAAM,4HAA4H;AAAA,EAC9I;AACJ;",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,9 @@
1
1
  import type { HtmlBox } from "../components/html-box.js";
2
+ import type { PibblEventHandlers } from '../events/types.js';
3
+ import type { HtmlNativeEvents } from './html-events.js';
2
4
  import type { GStyle } from '../components/g.js';
3
5
  import type { HtmlFocusRegion } from '../focus/html-focus-region.js';
4
- import type { PibblClippingStackEntry, PibblInstance, PibblInteractionLayer } from '../types.js';
6
+ import type { PibblClippingStackEntry, PibblComponentRefs, PibblInstance, PibblInteractionLayer } from '../types.js';
5
7
  import type { LayoutBox } from '../layout/types.js';
6
8
  /**
7
9
  * Updates mounted application HTML when the owning HtmlBox receives new props.
@@ -40,6 +42,27 @@ export interface HtmlBoxFocusState {
40
42
  /** Whether focus should be presented as keyboard-visible. See {@link HtmlBoxFocusState}. */
41
43
  readonly isFocusVisible: boolean;
42
44
  }
45
+ type HtmlBoxEvent<Event> = Event extends {
46
+ readonly x: number;
47
+ readonly y: number;
48
+ } ? Event & {
49
+ readonly localX: number;
50
+ readonly localY: number;
51
+ } : Event;
52
+ /**
53
+ * Optional native event callbacks using Pibbl event names and capture/bubble phases.
54
+ * Coordinate events retain root-logical x/y and add border-local localX/localY,
55
+ * before padding and independent of the current ancestor handler. The originalEvent
56
+ * retains the real DOM target; target/currentTarget identify the logical Pibbl path.
57
+ * Native editing, cancellation and pointer capture remain browser-owned.
58
+ *
59
+ * @see {@link PibblEventHandlers}
60
+ * @see {@link HtmlBoxProps}
61
+ * @see {@link HtmlBox}
62
+ */
63
+ export type HtmlBoxEventHandlers = {
64
+ [Key in keyof PibblEventHandlers]: (event: HtmlBoxEvent<Parameters<NonNullable<PibblEventHandlers[Key]>>[0]>) => void;
65
+ };
43
66
  /**
44
67
  * Props for a DOM-hosting region, including mount ownership, updates, and focus behavior.
45
68
  *
@@ -47,7 +70,7 @@ export interface HtmlBoxFocusState {
47
70
  * @see {@link HtmlBoxFocusState}
48
71
  * @see {@link HtmlBox}
49
72
  */
50
- export interface HtmlBoxProps<Props> {
73
+ export interface HtmlBoxProps<Props> extends HtmlBoxEventHandlers {
51
74
  /**
52
75
  * Application data supplied to the component or reported by the event. See {@link HtmlBoxProps}
53
76
  * .
@@ -82,6 +105,7 @@ export interface HtmlBridge {
82
105
  }
83
106
  export interface HtmlBoxRegistration {
84
107
  slot: HtmlBoxSlot;
108
+ handlers: HtmlBoxEventHandlers;
85
109
  data: unknown;
86
110
  matrix: DOMMatrix;
87
111
  clips: readonly PibblClippingStackEntry[];
@@ -93,8 +117,10 @@ export interface HtmlBoxRegistration {
93
117
  onFocusChange?: (state: Readonly<HtmlBoxFocusState>) => void;
94
118
  }
95
119
  export interface HtmlBoxSlot {
120
+ readonly component: PibblComponentRefs<any>;
96
121
  readonly owner: PibblInstance;
97
122
  readonly mount: HtmlMountCallback<unknown>;
123
+ events?: HtmlNativeEvents;
98
124
  region: HtmlFocusRegion & {
99
125
  content: HTMLDivElement | undefined;
100
126
  rootBounds: Readonly<LayoutBox> | undefined;
@@ -108,3 +134,4 @@ export interface HtmlBoxSlot {
108
134
  disposed: boolean;
109
135
  callback?: (state: Readonly<HtmlBoxFocusState>) => void;
110
136
  }
137
+ export {};