@pibbl/core 0.0.2 → 0.0.3-alpha.90.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 (285) hide show
  1. package/THIRD_PARTY_NOTICES.txt +81 -0
  2. package/dist/features/textures/index.d.ts +12 -2
  3. package/dist/features/textures/index.js +33 -1
  4. package/dist/features/textures/index.js.map +2 -2
  5. package/dist/features/textures/lib/chemical-field.d.ts +56 -0
  6. package/dist/features/textures/lib/chemical-field.js +154 -0
  7. package/dist/features/textures/lib/chemical-field.js.map +7 -0
  8. package/dist/features/textures/lib/chemical-recipes.d.ts +119 -0
  9. package/dist/features/textures/lib/chemical-recipes.js +275 -0
  10. package/dist/features/textures/lib/chemical-recipes.js.map +7 -0
  11. package/dist/features/textures/lib/definitions.d.ts +3 -18
  12. package/dist/features/textures/lib/definitions.js +15 -20
  13. package/dist/features/textures/lib/definitions.js.map +2 -2
  14. package/dist/features/textures/lib/geometric-patterns.d.ts +149 -0
  15. package/dist/features/textures/lib/geometric-patterns.js +305 -0
  16. package/dist/features/textures/lib/geometric-patterns.js.map +7 -0
  17. package/dist/features/textures/lib/gray-scott.d.ts +55 -0
  18. package/dist/features/textures/lib/gray-scott.js +39 -0
  19. package/dist/features/textures/lib/gray-scott.js.map +7 -0
  20. package/dist/features/textures/lib/patterns.d.ts +123 -0
  21. package/dist/features/textures/lib/patterns.js +344 -0
  22. package/dist/features/textures/lib/patterns.js.map +7 -0
  23. package/dist/features/textures/lib/reaction-diffusion.d.ts +3 -2
  24. package/dist/features/textures/lib/reaction-diffusion.js +9 -20
  25. package/dist/features/textures/lib/reaction-diffusion.js.map +2 -2
  26. package/dist/features/textures/lib/simulation.d.ts +10 -4
  27. package/dist/features/textures/lib/simulation.js +23 -13
  28. package/dist/features/textures/lib/simulation.js.map +2 -2
  29. package/dist/features/viz/index.d.ts +68 -6
  30. package/dist/features/viz/index.js +164 -2
  31. package/dist/features/viz/index.js.map +2 -2
  32. package/dist/features/viz/inspection/bar.d.ts +79 -0
  33. package/dist/features/viz/inspection/bar.js +49 -0
  34. package/dist/features/viz/inspection/bar.js.map +7 -0
  35. package/dist/features/viz/inspection/candle.d.ts +156 -0
  36. package/dist/features/viz/inspection/candle.js +120 -0
  37. package/dist/features/viz/inspection/candle.js.map +7 -0
  38. package/dist/features/viz/inspection/capture-types.d.ts +65 -0
  39. package/dist/features/viz/inspection/capture.d.ts +16 -0
  40. package/dist/features/viz/inspection/capture.js +49 -0
  41. package/dist/features/viz/inspection/capture.js.map +7 -0
  42. package/dist/features/viz/inspection/handler.d.ts +36 -0
  43. package/dist/features/viz/inspection/handler.js +91 -0
  44. package/dist/features/viz/inspection/handler.js.map +7 -0
  45. package/dist/features/viz/inspection/ohlc-bar.d.ts +132 -0
  46. package/dist/features/viz/inspection/ohlc-bar.js +118 -0
  47. package/dist/features/viz/inspection/ohlc-bar.js.map +7 -0
  48. package/dist/features/viz/inspection/owned-ref.d.ts +16 -0
  49. package/dist/features/viz/inspection/owned-ref.js +99 -0
  50. package/dist/features/viz/inspection/owned-ref.js.map +7 -0
  51. package/dist/features/viz/inspection/painted-point.d.ts +22 -0
  52. package/dist/features/viz/inspection/painted-point.js +29 -0
  53. package/dist/features/viz/inspection/painted-point.js.map +7 -0
  54. package/dist/features/viz/inspection/queries.d.ts +100 -0
  55. package/dist/features/viz/inspection/queries.js +192 -0
  56. package/dist/features/viz/inspection/queries.js.map +7 -0
  57. package/dist/features/viz/inspection/query-types.d.ts +177 -0
  58. package/dist/features/viz/inspection/volume.d.ts +104 -0
  59. package/dist/features/viz/inspection/volume.js +95 -0
  60. package/dist/features/viz/inspection/volume.js.map +7 -0
  61. package/dist/features/viz/inspection.d.ts +19 -0
  62. package/dist/features/viz/inspection.js +54 -0
  63. package/dist/features/viz/inspection.js.map +7 -0
  64. package/dist/features/viz/inspection.mjs +1 -0
  65. package/dist/features/viz/lib/area-series.d.ts +62 -0
  66. package/dist/features/viz/lib/area-series.js +120 -0
  67. package/dist/features/viz/lib/area-series.js.map +7 -0
  68. package/dist/features/viz/lib/axis.js +1 -1
  69. package/dist/features/viz/lib/axis.js.map +2 -2
  70. package/dist/features/viz/lib/bar-series.d.ts +3 -1
  71. package/dist/features/viz/lib/bar-series.js +16 -1
  72. package/dist/features/viz/lib/bar-series.js.map +2 -2
  73. package/dist/features/viz/lib/baseline-series.d.ts +55 -0
  74. package/dist/features/viz/lib/baseline-series.js +136 -0
  75. package/dist/features/viz/lib/baseline-series.js.map +7 -0
  76. package/dist/features/viz/lib/candlestick-series.d.ts +62 -0
  77. package/dist/features/viz/lib/candlestick-series.js +150 -0
  78. package/dist/features/viz/lib/candlestick-series.js.map +7 -0
  79. package/dist/features/viz/lib/censored-point-series.d.ts +71 -0
  80. package/dist/features/viz/lib/censored-point-series.js +129 -0
  81. package/dist/features/viz/lib/censored-point-series.js.map +7 -0
  82. package/dist/features/viz/lib/color-context.d.ts +4 -0
  83. package/dist/features/viz/lib/color-context.js +41 -0
  84. package/dist/features/viz/lib/color-context.js.map +7 -0
  85. package/dist/features/viz/lib/color-math.d.ts +4 -0
  86. package/dist/features/viz/lib/color-math.js +31 -0
  87. package/dist/features/viz/lib/color-math.js.map +7 -0
  88. package/dist/features/viz/lib/color-types.d.ts +53 -0
  89. package/dist/features/viz/lib/curve-definition.d.ts +49 -0
  90. package/dist/features/viz/lib/curve-definition.js +148 -0
  91. package/dist/features/viz/lib/curve-definition.js.map +7 -0
  92. package/dist/features/viz/lib/diverging-color-scale.d.ts +11 -0
  93. package/dist/features/viz/lib/diverging-color-scale.js +51 -0
  94. package/dist/features/viz/lib/diverging-color-scale.js.map +7 -0
  95. package/dist/features/viz/lib/domain-navigation.d.ts +40 -0
  96. package/dist/features/viz/lib/domain-navigation.js +77 -0
  97. package/dist/features/viz/lib/domain-navigation.js.map +7 -0
  98. package/dist/features/viz/lib/editable-chart-elements.d.ts +178 -0
  99. package/dist/features/viz/lib/editable-chart-elements.js +733 -0
  100. package/dist/features/viz/lib/editable-chart-elements.js.map +7 -0
  101. package/dist/features/viz/lib/financial-aggregation.d.ts +127 -0
  102. package/dist/features/viz/lib/financial-aggregation.js +116 -0
  103. package/dist/features/viz/lib/financial-aggregation.js.map +7 -0
  104. package/dist/features/viz/lib/financial-autoscale.d.ts +64 -0
  105. package/dist/features/viz/lib/financial-autoscale.js +61 -0
  106. package/dist/features/viz/lib/financial-autoscale.js.map +7 -0
  107. package/dist/features/viz/lib/financial-comparison.d.ts +62 -0
  108. package/dist/features/viz/lib/financial-comparison.js +98 -0
  109. package/dist/features/viz/lib/financial-comparison.js.map +7 -0
  110. package/dist/features/viz/lib/financial-geometry.d.ts +77 -0
  111. package/dist/features/viz/lib/financial-geometry.js +67 -0
  112. package/dist/features/viz/lib/financial-geometry.js.map +7 -0
  113. package/dist/features/viz/lib/financial-indicators.d.ts +114 -0
  114. package/dist/features/viz/lib/financial-indicators.js +135 -0
  115. package/dist/features/viz/lib/financial-indicators.js.map +7 -0
  116. package/dist/features/viz/lib/financial-oscillators.d.ts +171 -0
  117. package/dist/features/viz/lib/financial-oscillators.js +265 -0
  118. package/dist/features/viz/lib/financial-oscillators.js.map +7 -0
  119. package/dist/features/viz/lib/graph/bipartite.d.ts +14 -0
  120. package/dist/features/viz/lib/graph/bipartite.js +250 -0
  121. package/dist/features/viz/lib/graph/bipartite.js.map +7 -0
  122. package/dist/features/viz/lib/graph/chord.d.ts +44 -0
  123. package/dist/features/viz/lib/graph/chord.js +348 -0
  124. package/dist/features/viz/lib/graph/chord.js.map +7 -0
  125. package/dist/features/viz/lib/graph/dependency.d.ts +26 -0
  126. package/dist/features/viz/lib/graph/dependency.js +141 -0
  127. package/dist/features/viz/lib/graph/dependency.js.map +7 -0
  128. package/dist/features/viz/lib/graph/force.d.ts +28 -0
  129. package/dist/features/viz/lib/graph/force.js +580 -0
  130. package/dist/features/viz/lib/graph/force.js.map +7 -0
  131. package/dist/features/viz/lib/graph/hierarchy.d.ts +21 -0
  132. package/dist/features/viz/lib/graph/hierarchy.js +112 -0
  133. package/dist/features/viz/lib/graph/hierarchy.js.map +7 -0
  134. package/dist/features/viz/lib/graph/icicle.d.ts +16 -0
  135. package/dist/features/viz/lib/graph/icicle.js +153 -0
  136. package/dist/features/viz/lib/graph/icicle.js.map +7 -0
  137. package/dist/features/viz/lib/graph/matrix.d.ts +30 -0
  138. package/dist/features/viz/lib/graph/matrix.js +243 -0
  139. package/dist/features/viz/lib/graph/matrix.js.map +7 -0
  140. package/dist/features/viz/lib/graph/neighborhood.d.ts +11 -0
  141. package/dist/features/viz/lib/graph/neighborhood.js +281 -0
  142. package/dist/features/viz/lib/graph/neighborhood.js.map +7 -0
  143. package/dist/features/viz/lib/graph/routes.d.ts +35 -0
  144. package/dist/features/viz/lib/graph/routes.js +102 -0
  145. package/dist/features/viz/lib/graph/routes.js.map +7 -0
  146. package/dist/features/viz/lib/graph/sankey.d.ts +44 -0
  147. package/dist/features/viz/lib/graph/sankey.js +341 -0
  148. package/dist/features/viz/lib/graph/sankey.js.map +7 -0
  149. package/dist/features/viz/lib/graph/shared.d.ts +59 -0
  150. package/dist/features/viz/lib/graph/shared.js +296 -0
  151. package/dist/features/viz/lib/graph/shared.js.map +7 -0
  152. package/dist/features/viz/lib/graph/tree.d.ts +11 -0
  153. package/dist/features/viz/lib/graph/tree.js +232 -0
  154. package/dist/features/viz/lib/graph/tree.js.map +7 -0
  155. package/dist/features/viz/lib/graph/treemap.d.ts +20 -0
  156. package/dist/features/viz/lib/graph/treemap.js +227 -0
  157. package/dist/features/viz/lib/graph/treemap.js.map +7 -0
  158. package/dist/features/viz/lib/graph/types.d.ts +1097 -0
  159. package/dist/features/viz/lib/hover-data.d.ts +1 -1
  160. package/dist/features/viz/lib/hover-data.js +5 -2
  161. package/dist/features/viz/lib/hover-data.js.map +2 -2
  162. package/dist/features/viz/lib/interval-band-series.d.ts +49 -0
  163. package/dist/features/viz/lib/interval-band-series.js +136 -0
  164. package/dist/features/viz/lib/interval-band-series.js.map +7 -0
  165. package/dist/features/viz/lib/interval-diamond-series.d.ts +43 -0
  166. package/dist/features/viz/lib/interval-diamond-series.js +124 -0
  167. package/dist/features/viz/lib/interval-diamond-series.js.map +7 -0
  168. package/dist/features/viz/lib/interval-series.d.ts +79 -0
  169. package/dist/features/viz/lib/interval-series.js +158 -0
  170. package/dist/features/viz/lib/interval-series.js.map +7 -0
  171. package/dist/features/viz/lib/line-series.d.ts +1 -1
  172. package/dist/features/viz/lib/line-series.js +47 -28
  173. package/dist/features/viz/lib/line-series.js.map +2 -2
  174. package/dist/features/viz/lib/linear-scale.js +1 -1
  175. package/dist/features/viz/lib/linear-scale.js.map +2 -2
  176. package/dist/features/viz/lib/monotone-curve.d.ts +11 -0
  177. package/dist/features/viz/lib/monotone-curve.js +63 -0
  178. package/dist/features/viz/lib/monotone-curve.js.map +7 -0
  179. package/dist/features/viz/lib/numeric-range-interpolation.d.ts +15 -0
  180. package/dist/features/viz/lib/numeric-range-interpolation.js +36 -0
  181. package/dist/features/viz/lib/numeric-range-interpolation.js.map +7 -0
  182. package/dist/features/viz/lib/ohlc-bar-series.d.ts +55 -0
  183. package/dist/features/viz/lib/ohlc-bar-series.js +168 -0
  184. package/dist/features/viz/lib/ohlc-bar-series.js.map +7 -0
  185. package/dist/features/viz/lib/paired-series.d.ts +44 -0
  186. package/dist/features/viz/lib/paired-series.js +93 -0
  187. package/dist/features/viz/lib/paired-series.js.map +7 -0
  188. package/dist/features/viz/lib/plot-series.js +11 -6
  189. package/dist/features/viz/lib/plot-series.js.map +2 -2
  190. package/dist/features/viz/lib/plot-types.d.ts +4 -3
  191. package/dist/features/viz/lib/point-series.d.ts +1 -1
  192. package/dist/features/viz/lib/point-series.js +36 -9
  193. package/dist/features/viz/lib/point-series.js.map +2 -2
  194. package/dist/features/viz/lib/point-types.d.ts +5 -2
  195. package/dist/features/viz/lib/scale-context.d.ts +1 -1
  196. package/dist/features/viz/lib/scale-ticks.js +21 -6
  197. package/dist/features/viz/lib/scale-ticks.js.map +2 -2
  198. package/dist/features/viz/lib/sequential-color-scale.d.ts +11 -0
  199. package/dist/features/viz/lib/sequential-color-scale.js +49 -0
  200. package/dist/features/viz/lib/sequential-color-scale.js.map +7 -0
  201. package/dist/features/viz/lib/series-position.d.ts +12 -0
  202. package/dist/features/viz/lib/series-position.js +44 -0
  203. package/dist/features/viz/lib/series-position.js.map +7 -0
  204. package/dist/features/viz/lib/step-curves.d.ts +19 -0
  205. package/dist/features/viz/lib/step-curves.js +53 -0
  206. package/dist/features/viz/lib/step-curves.js.map +7 -0
  207. package/dist/features/viz/lib/threshold-color-scale.d.ts +43 -0
  208. package/dist/features/viz/lib/threshold-color-scale.js +59 -0
  209. package/dist/features/viz/lib/threshold-color-scale.js.map +7 -0
  210. package/dist/features/viz/lib/trading-time-mapping.d.ts +32 -0
  211. package/dist/features/viz/lib/trading-time-mapping.js +89 -0
  212. package/dist/features/viz/lib/trading-time-mapping.js.map +7 -0
  213. package/dist/features/viz/lib/trading-time-scale.d.ts +83 -0
  214. package/dist/features/viz/lib/trading-time-scale.js +96 -0
  215. package/dist/features/viz/lib/trading-time-scale.js.map +7 -0
  216. package/dist/features/viz/lib/trajectory-series.d.ts +71 -0
  217. package/dist/features/viz/lib/trajectory-series.js +111 -0
  218. package/dist/features/viz/lib/trajectory-series.js.map +7 -0
  219. package/dist/features/viz/lib/types.d.ts +20 -4
  220. package/dist/features/viz/lib/use-continuous-scale.js +6 -1
  221. package/dist/features/viz/lib/use-continuous-scale.js.map +2 -2
  222. package/dist/features/viz/lib/volume-series.d.ts +59 -0
  223. package/dist/features/viz/lib/volume-series.js +117 -0
  224. package/dist/features/viz/lib/volume-series.js.map +7 -0
  225. package/dist/features/viz/lib/weighted-point-series.d.ts +71 -0
  226. package/dist/features/viz/lib/weighted-point-series.js +169 -0
  227. package/dist/features/viz/lib/weighted-point-series.js.map +7 -0
  228. package/dist/filters/backdrop-contrast-gpu.d.ts +5 -0
  229. package/dist/filters/backdrop-contrast-gpu.js +33 -0
  230. package/dist/filters/backdrop-contrast-gpu.js.map +7 -0
  231. package/dist/filters/backdrop-contrast.d.ts +21 -0
  232. package/dist/filters/backdrop-contrast.js +61 -0
  233. package/dist/filters/backdrop-contrast.js.map +7 -0
  234. package/dist/filters/emboss-gpu.d.ts +4 -0
  235. package/dist/filters/emboss-gpu.js +39 -0
  236. package/dist/filters/emboss-gpu.js.map +7 -0
  237. package/dist/filters/emboss.d.ts +32 -0
  238. package/dist/filters/emboss.js +106 -0
  239. package/dist/filters/emboss.js.map +7 -0
  240. package/dist/filters/filter-executor.d.ts +11 -4
  241. package/dist/filters/filter-executor.js +104 -49
  242. package/dist/filters/filter-executor.js.map +2 -2
  243. package/dist/filters/reflection-gpu.d.ts +3 -1
  244. package/dist/filters/reflection-gpu.js +5 -2
  245. package/dist/filters/reflection-gpu.js.map +2 -2
  246. package/dist/filters/render-backdrop-contrast-boundary.d.ts +31 -0
  247. package/dist/filters/render-backdrop-contrast-boundary.js +116 -0
  248. package/dist/filters/render-backdrop-contrast-boundary.js.map +7 -0
  249. package/dist/filters/render-emboss-boundary.d.ts +13 -0
  250. package/dist/filters/render-emboss-boundary.js +131 -0
  251. package/dist/filters/render-emboss-boundary.js.map +7 -0
  252. package/dist/filters.d.ts +9 -5
  253. package/dist/filters.js +4 -0
  254. package/dist/filters.js.map +2 -2
  255. package/dist/index.d.ts +2 -0
  256. package/dist/index.js +3 -0
  257. package/dist/index.js.map +2 -2
  258. package/dist/internal.d.ts +2 -0
  259. package/dist/internal.js +4 -0
  260. package/dist/internal.js.map +2 -2
  261. package/dist/lib/events/event-facade.d.ts +13 -0
  262. package/dist/lib/events/event-facade.js +23 -0
  263. package/dist/lib/events/event-facade.js.map +2 -2
  264. package/dist/lib/events/propagation.js +19 -14
  265. package/dist/lib/events/propagation.js.map +2 -2
  266. package/dist/lib/execute-render.js +13 -0
  267. package/dist/lib/execute-render.js.map +2 -2
  268. package/dist/lib/recording/recording.d.ts +43 -0
  269. package/dist/lib/recording/recording.js +555 -0
  270. package/dist/lib/recording/recording.js.map +7 -0
  271. package/dist/lib/recording/types.d.ts +118 -0
  272. package/dist/lib/recording/wasm-bytes.d.ts +1 -0
  273. package/dist/lib/recording/wasm-bytes.js +5 -0
  274. package/dist/lib/recording/wasm-bytes.js.map +7 -0
  275. package/dist/lib/recording/worker-source.d.ts +1 -0
  276. package/dist/lib/recording/worker-source.js +5 -0
  277. package/dist/lib/recording/worker-source.js.map +7 -0
  278. package/dist/lib/render-transaction.d.ts +5 -2
  279. package/dist/lib/render-transaction.js +23 -1
  280. package/dist/lib/render-transaction.js.map +2 -2
  281. package/dist/lib/series-inspection-frame.d.ts +18 -0
  282. package/dist/lib/series-inspection-frame.js +70 -0
  283. package/dist/lib/series-inspection-frame.js.map +7 -0
  284. package/dist/lib/types.d.ts +6 -0
  285. package/package.json +10 -2
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/internal.ts"],
4
- "sourcesContent": ["import type { PibblInternalFrame, pibblInternalOnRenderFinish, pibblInternalRequestRender } from './lib/scheduler/renderer-participant.js';\nimport type { PibblConfig, PibblPixelRatio } from './lib/surface/types.js';\n/**\n * @packageDocumentation\n * Reserved for official Pibbl packages that are released in lockstep with\n * `@pibbl/core`. This version-coupled module is not a stable third-party plugin\n * API and intentionally does not re-export the public root module.\n */\n\nexport { createBackendToken } from \"./lib/backend/types.js\";\nexport type {\n PibblBackendDriver,\n PibblBackendEventTargetOptions,\n PibblBackendFrame,\n PibblBackendFrameInput,\n PibblBackendMount,\n PibblBackendMountOptions,\n PibblBackendPrimitiveDefinition,\n PibblBackendPrimitiveInput,\n PibblBackendPrimitiveProgram,\n PibblBackendToken,\n PibblNestedResolverInput,\n} from \"./lib/backend/types.js\";\nexport type { SignalProgramProps, SignalStyle } from \"./lib/types.js\";\nexport {\n pibblInternalRunPurePrimitiveResolver,\n defineBackendPrimitive,\n derivePrimitive,\n} from \"./lib/define-primitive.js\";\nexport { mountBackendPibbl } from \"./lib/mount-pibbl.js\";\nexport {\n useInternalHookSlot,\n withHooksForbidden,\n} from \"./lib/hooks/hook-slot.js\";\nexport { useValueMemoSlot as useInternalValueMemoSlot } from \"./lib/hooks/use-value-memo-slot.js\";\nexport {\n haveSameLayerNodeTree,\n materializeRetainedLayerChildren,\n snapshotLayerNodeTree,\n} from \"./lib/components/layer-node-equality.js\";\nexport type { LayerNodeSnapshot } from \"./lib/components/layer-node-equality.js\";\nexport type { PibblEventTargetRegistration } from \"./lib/events/registrations.js\";\nexport type { PibblElementSource } from \"./lib/element/metadata.js\";\nexport { pibblInternalCreatePropAttachment } from \"./lib/element-enhancers.js\";\nexport type {\n PibblInternalMountedPropAttachment,\n PibblInternalPrimitiveAttachmentInput,\n} from \"./lib/element-enhancers.js\";\nexport type { PibblHitTestOutput } from \"./lib/events/paint-entry.js\";\nexport { hasPibblEventHandler } from \"./lib/events/event-definitions.js\";\nexport {\n pibblInternalCurrentSimulationOwner,\n pibblInternalOnSimulationRenderTransactionFinish,\n pibblInternalQueueSimulationBegin,\n pibblInternalQueueSimulationCommitAcknowledgement,\n pibblInternalQueueSimulationComplete,\n pibblInternalRegisterSimulationAdvance,\n pibblInternalRequestSimulationRender,\n} from \"./lib/scheduler/simulation-participant.js\";\nexport type {\n PibblInternalAdvanceLane,\n PibblInternalSimulationOwner,\n} from \"./lib/scheduler/simulation-participant.js\";\n\nimport type {\n PibblBackendEventTargetOptions,\n PibblBackendMount,\n PibblBackendToken,\n PibblNestedResolverInput,\n} from \"./lib/backend/types.js\";\nimport {\n createTarget,\n releaseTarget,\n updateTarget,\n type PibblEventTargetRegistration,\n} from \"./lib/events/registrations.js\";\nimport { PibblPaintEntryKind } from \"./lib/events/paint-entry.js\";\nimport type { PibblEventHandlers, PibblPointerEvents } from \"./lib/events/types.js\";\nimport { getCurrentPibblInstance, GLOBAL_STATE } from \"./lib/global-state.js\";\nimport {\n requireHookContext,\n useInternalHookSlot,\n} from \"./lib/hooks/hook-slot.js\";\nimport { getCurrentWorldTransform } from \"./lib/render-target.js\";\nimport {\n getElementSource,\n type PibblElementSource,\n} from \"./lib/element/metadata.js\";\nimport { getSurfaceSnapshot } from \"./lib/surface/transform.js\";\nimport type {\n Canvas,\n PibblComponentRefs,\n PibblInstance,\n} from \"./lib/types.js\";\nimport type { PibblInteractionLayer } from \"./lib/types.js\";\nimport { update } from \"./lib/update.js\";\nimport { queueBeginCommand } from \"./lib/scheduler/realm-scheduler.js\";\nimport type { PibblBeginCommandHandle } from \"./lib/scheduler/types.js\";\n\ninterface CurrentInstanceFrameRequestState {\n readonly componentRefs: PibblComponentRefs<any>;\n readonly instance: PibblInstance;\n active: boolean;\n handle: PibblBeginCommandHandle | undefined;\n updateParents: boolean;\n}\n\nconst frameRequestsByComponent = new WeakMap<\n PibblComponentRefs<any>,\n CurrentInstanceFrameRequestState\n>();\n/**\n * Reads the selected official backend's current frame environment.\n *\n * @param token - Backend identity required by the caller. See {@link PibblBackendToken}.\n * @returns The active environment for that backend.\n *\n * @see {@link PibblBackendToken}\n */\nexport function getBackendEnvironment<E>(token: PibblBackendToken): E {\n const driver = GLOBAL_STATE.backendDriver;\n const frame = GLOBAL_STATE.backendFrame;\n if (!driver || !frame || driver.token !== token) {\n throw new Error(\"The requested Pibbl backend environment is not active.\");\n }\n return frame.environment as E;\n}\n\n/**\n * Returns the timestamp shared by the current Pibbl render transaction.\n *\n * @returns The active frame timestamp in milliseconds.\n *\n * @see {@link PibblInternalFrame}\n */\nexport function getCurrentFrameTimestamp(): number {\n return getCurrentPibblInstance().renderTimestamp;\n}\n\n/**\n * Returns the active instance's owning Canvas, never a transient filter target.\n *\n * @returns The host canvas of the active backend mount. See {@link Canvas}.\n *\n * @see {@link Canvas}\n */\nexport function getCurrentBackendHostCanvas(): Canvas {\n return getCurrentPibblInstance().canvas;\n}\n\n/**\n * Returns development JSX source metadata for the current component.\n *\n * @returns Source metadata for the current element, or undefined when unavailable. See\n * {@link PibblElementSource} .\n *\n * @see {@link PibblElementSource}\n */\nexport function getCurrentElementSource(): PibblElementSource | undefined {\n const { componentRefs } = requireHookContext();\n return getElementSource(componentRefs.element);\n}\n\n/**\n * Returns the active surface's independent effective backing densities.\n *\n * @returns Backing pixels per logical unit on each axis.\n *\n * @see {@link PibblPixelRatio}\n */\nexport function getCurrentSurfaceDensity(): Readonly<{ x: number; y: number }> {\n const surface = getSurfaceSnapshot(getCurrentPibblInstance());\n return Object.freeze({\n x: surface.backingPixelsPerLogicalUnitX,\n y: surface.backingPixelsPerLogicalUnitY,\n });\n}\n\n/**\n * Returns the active root-logical viewport for an official renderer hook.\n *\n * @returns The current logical viewport width and height.\n *\n * @see {@link PibblConfig}\n */\nexport function getCurrentLogicalViewport(): Readonly<{\n width: number;\n height: number;\n}> {\n const surface = getSurfaceSnapshot(getCurrentPibblInstance());\n return Object.freeze({\n width: surface.logicalWidth,\n height: surface.logicalHeight,\n });\n}\n\n/**\n * Registers a callback on the root-wide transaction containing this render.\n *\n * @param callback - Callback receiving whether the current render transaction succeeded.\n *\n * @see {@link pibblInternalOnRenderFinish}\n */\nexport function onCurrentRenderFinish(\n callback: (success: boolean) => void,\n): void {\n requireHookContext();\n const transaction = GLOBAL_STATE.renderTransaction;\n if (!transaction) {\n throw new Error(\"No Pibbl render transaction is active.\");\n }\n transaction.onFinish(callback);\n}\n\n/**\n * Requests a coalesced frame for the current private backend instance.\n *\n * @param updateParents - Whether ancestor compositions should also receive a frame request.\n *\n * @see {@link pibblInternalRequestRender}\n */\nexport function requestCurrentInstanceFrame(updateParents: boolean): void {\n const { componentRefs, pibblInstance } = requireHookContext();\n let state = frameRequestsByComponent.get(componentRefs);\n if (!state) {\n state = {\n componentRefs,\n instance: pibblInstance,\n active: true,\n handle: undefined,\n updateParents: false,\n };\n frameRequestsByComponent.set(componentRefs, state);\n componentRefs.teardowns.add(() =>\n releaseCurrentInstanceFrameRequest(state!),\n );\n }\n state.updateParents ||= updateParents;\n if (state.handle) return;\n state.handle = queueBeginCommand(() => {\n state!.handle = undefined;\n const updateParentsForFrame = state!.updateParents;\n state!.updateParents = false;\n if (!isCurrentInstanceFrameRequestActive(state!)) return;\n if (updateParentsForFrame) {\n update(state!.instance.canvas, undefined, true);\n } else {\n update(state!.instance.canvas);\n }\n });\n}\n\n/**\n * Retains one geometry-independent target for an official backend picker.\n *\n * @param handlers - Handlers for the backend target. See {@link PibblEventHandlers}.\n * @param options - Backend geometry and focus metadata. See {@link PibblBackendEventTargetOptions}.\n * @param pointerEvents - Pointer participation policy; defaults to auto. See\n * {@link PibblPointerEvents} .\n * @returns The live registration, or undefined when registration is unnecessary. See\n * {@link PibblEventTargetRegistration} .\n *\n * @see {@link PibblEventHandlers}\n * @see {@link PibblBackendEventTargetOptions}\n * @see {@link PibblPointerEvents}\n * @see {@link PibblEventTargetRegistration}\n */\nexport function useBackendEventTarget(\n handlers: PibblEventHandlers,\n options: PibblBackendEventTargetOptions = {},\n pointerEvents: PibblPointerEvents = \"auto\",\n): PibblEventTargetRegistration | undefined {\n const { componentRefs, pibblInstance } = requireHookContext();\n const hookIndex = GLOBAL_STATE.componentHookIndex;\n const slot = useInternalHookSlot(\"backendEventTarget\", (teardowns) => {\n const target = createTarget(pibblInstance, componentRefs, hookIndex);\n teardowns.add(() => releaseTarget(target));\n return { target, emptyPath: new Path2D() };\n });\n const { target, emptyPath } = slot.value;\n if (pointerEvents === \"none\") {\n releaseTarget(target);\n return undefined;\n }\n updateTarget(\n target,\n handlers,\n { ...options, path: emptyPath },\n true,\n options.deferKeyboardNavigationGeometry ?? false,\n );\n if (target.paintEntry) {\n target.owner.paintEntries.delete(target.paintEntry);\n target.paintEntry = undefined;\n }\n return target;\n}\n\n/**\n * Tests whether an official backend target can still win coordinate picking.\n *\n * @param target - Registration whose ownership is being checked. See\n * {@link PibblEventTargetRegistration} .\n * @returns Whether the target registration is still live.\n *\n * @see {@link PibblEventTargetRegistration}\n */\nexport function isBackendEventTargetLive(\n target: PibblEventTargetRegistration,\n): boolean {\n const { owner } = target;\n return (\n target.live &&\n !owner.mainTeardowns.closed &&\n owner.eventRoot.targets.has(target)\n );\n}\n\n/**\n * Temporarily releases one backend target; its retained hook may enroll it again.\n *\n * @param target - Target registration to release. See {@link PibblEventTargetRegistration}.\n *\n * @see {@link PibblEventTargetRegistration}\n */\nexport function releaseBackendEventTarget(\n target: PibblEventTargetRegistration,\n): void {\n releaseTarget(target);\n target.keyboardNavigationBounds = undefined;\n target.keyboardNavigationPoints = undefined;\n}\n\n/**\n * Registers work that runs after this component's rendered descendants.\n *\n * @param callback - Callback to execute after the current component renders.\n *\n * @see {@link pibblInternalOnRenderFinish}\n */\nexport function setCurrentComponentAfterRender(callback: () => void): void {\n const { componentRefs } = requireHookContext();\n const previous = componentRefs.onAfterRender;\n componentRefs.onAfterRender = previous\n ? () => {\n try {\n previous();\n } finally {\n callback();\n }\n }\n : callback;\n}\n\n/**\n * Installs one stable nested backend resolver in the current Canvas paint order.\n *\n * @param input - Nested coordinate resolver and its target metadata. See\n * {@link PibblNestedResolverInput} .\n *\n * @see {@link PibblNestedResolverInput}\n */\nexport function registerNestedInteractionResolver(\n input: PibblNestedResolverInput,\n): void {\n const { componentRefs, pibblInstance } = requireHookContext();\n const childInstance = backendMountInstance(input.child);\n if (\n childInstance.parent !== pibblInstance.canvas ||\n childInstance.eventRoot !== pibblInstance.eventRoot\n ) {\n throw new Error(\n \"A nested Pibbl backend mount must belong to the current instance and same event root.\",\n );\n }\n const slot = useInternalHookSlot<{\n entry: PibblInteractionLayer;\n child: PibblBackendMount;\n }>(\"nestedInteractionResolver\", (teardowns) => {\n const entry: PibblInteractionLayer = {\n paintKind: PibblPaintEntryKind.Resolver,\n instance: childInstance,\n bounds: input.bounds,\n transform: new DOMMatrix(),\n clippingStack: [],\n resolveLocal: input.resolveLocal,\n };\n const value = { entry, child: input.child };\n teardowns.add(() => {\n pibblInstance.paintEntries.delete(entry);\n if (entry.instance.focusParentBridge === entry) {\n entry.instance.focusParentBridge = undefined;\n }\n if (entry.instance.eventParent === componentRefs) {\n entry.instance.eventParent = undefined;\n }\n });\n return value;\n });\n const { entry } = slot.value;\n if (\n (childInstance.eventParent !== undefined &&\n childInstance.eventParent !== componentRefs) ||\n (childInstance.focusParentBridge !== undefined &&\n childInstance.focusParentBridge !== entry)\n ) {\n throw new Error(\n \"A nested Pibbl backend mount already belongs to another nested resolver.\",\n );\n }\n pibblInstance.paintEntries.delete(entry);\n if (slot.value.child !== input.child) {\n if (entry.instance.focusParentBridge === entry) {\n entry.instance.focusParentBridge = undefined;\n }\n if (entry.instance.eventParent === componentRefs) {\n entry.instance.eventParent = undefined;\n }\n slot.value.child = input.child;\n }\n entry.instance = childInstance;\n entry.instance.eventParent = componentRefs;\n entry.bounds = input.bounds;\n entry.transform = getCurrentWorldTransform();\n entry.clippingStack = Array.from(GLOBAL_STATE.clippingStack);\n entry.resolveLocal = input.resolveLocal;\n entry.instance.focusParentBridge = entry;\n if (input.pointerEvents === \"auto\") {\n pibblInstance.paintEntries.add(entry);\n }\n}\n\nfunction backendMountInstance(mount: PibblBackendMount) {\n const instance = GLOBAL_STATE.pibblInstances.get(mount.canvas);\n if (!instance) {\n throw new Error(\"Nested Pibbl backend mount is not active.\");\n }\n return instance;\n}\n\nfunction cancelCurrentInstanceFrameRequest(\n state: CurrentInstanceFrameRequestState,\n): void {\n state.handle?.cancel();\n state.handle = undefined;\n state.updateParents = false;\n}\n\nfunction releaseCurrentInstanceFrameRequest(\n state: CurrentInstanceFrameRequestState,\n): void {\n if (!state.active) return;\n state.active = false;\n cancelCurrentInstanceFrameRequest(state);\n frameRequestsByComponent.delete(state.componentRefs);\n\n}\n\nfunction isCurrentInstanceFrameRequestActive(\n state: CurrentInstanceFrameRequestState,\n): boolean {\n return (\n state.active &&\n !state.componentRefs.teardowns.closed &&\n !state.instance.mainTeardowns.closed &&\n GLOBAL_STATE.pibblInstances.get(state.instance.canvas) === state.instance &&\n state.instance.refs.get(state.componentRefs.id) === state.componentRefs\n );\n}\nexport {\n pibblInternalAssertCommandAllowed,\n pibblInternalCreateSignalConsumer,\n pibblInternalCurrentFrame,\n pibblInternalCurrentRenderOwner,\n pibblInternalOnRenderFinish,\n pibblInternalPaintTarget,\n pibblInternalQueueBegin,\n pibblInternalQueueComplete,\n pibblInternalQueueCurrentCommit,\n pibblInternalQueueCurrentComplete,\n pibblInternalRegisterAdvance,\n pibblInternalRequestRender,\n pibblInternalRequestRendererWork,\n} from \"./lib/scheduler/renderer-participant.js\";\nexport type {\n PibblInternalCommandHandle,\n PibblInternalFrame,\n PibblInternalRendererWorkKind,\n PibblInternalRenderOwner,\n PibblInternalSignalBatch,\n PibblInternalSignalConsumer,\n} from \"./lib/scheduler/renderer-participant.js\";\n\nexport { pushLayoutBox } from \"./lib/layout/context.js\";\n\nexport {\n ManualSchedulerDriver as PibblInternalManualSchedulerDriver,\n installSchedulerDriverForTest as pibblInternalInstallTestSchedulerDriver,\n snapshotRealmScheduler as pibblInternalSnapshotRealmScheduler,\n} from \"./lib/scheduler/testing.js\";\n\nexport { getCurrentWorldTransform as pibblInternalCurrentWorldTransform } from \"./lib/render-target.js\";\n\nexport { borrowTextureRaster, resolveTexturePaint, validateTexturePaint } from './lib/textures/texture-protocol.js';\nexport type { BorrowedTextureRaster } from './lib/textures/texture-protocol.js';\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type { PibblInternalFrame, pibblInternalOnRenderFinish, pibblInternalRequestRender } from './lib/scheduler/renderer-participant.js';\nimport type { PibblConfig, PibblPixelRatio } from './lib/surface/types.js';\n/**\n * @packageDocumentation\n * Reserved for official Pibbl packages that are released in lockstep with\n * `@pibbl/core`. This version-coupled module is not a stable third-party plugin\n * API and intentionally does not re-export the public root module.\n */\n\nexport { createBackendToken } from \"./lib/backend/types.js\";\nexport type {\n PibblBackendDriver,\n PibblBackendEventTargetOptions,\n PibblBackendFrame,\n PibblBackendFrameInput,\n PibblBackendMount,\n PibblBackendMountOptions,\n PibblBackendPrimitiveDefinition,\n PibblBackendPrimitiveInput,\n PibblBackendPrimitiveProgram,\n PibblBackendToken,\n PibblNestedResolverInput,\n} from \"./lib/backend/types.js\";\nexport type { SignalProgramProps, SignalStyle } from \"./lib/types.js\";\nexport {\n pibblInternalRunPurePrimitiveResolver,\n defineBackendPrimitive,\n derivePrimitive,\n} from \"./lib/define-primitive.js\";\nexport { mountBackendPibbl } from \"./lib/mount-pibbl.js\";\nexport {\n useInternalHookSlot,\n withHooksForbidden,\n} from \"./lib/hooks/hook-slot.js\";\nexport { useValueMemoSlot as useInternalValueMemoSlot } from \"./lib/hooks/use-value-memo-slot.js\";\nexport {\n haveSameLayerNodeTree,\n materializeRetainedLayerChildren,\n snapshotLayerNodeTree,\n} from \"./lib/components/layer-node-equality.js\";\nexport type { LayerNodeSnapshot } from \"./lib/components/layer-node-equality.js\";\nexport type { PibblEventTargetRegistration } from \"./lib/events/registrations.js\";\nexport type { PibblElementSource } from \"./lib/element/metadata.js\";\nexport { pibblInternalCreatePropAttachment } from \"./lib/element-enhancers.js\";\nexport type {\n PibblInternalMountedPropAttachment,\n PibblInternalPrimitiveAttachmentInput,\n} from \"./lib/element-enhancers.js\";\nexport type { PibblHitTestOutput } from \"./lib/events/paint-entry.js\";\nexport { hasPibblEventHandler } from \"./lib/events/event-definitions.js\";\nexport {\n pibblInternalCurrentSimulationOwner,\n pibblInternalOnSimulationRenderTransactionFinish,\n pibblInternalQueueSimulationBegin,\n pibblInternalQueueSimulationCommitAcknowledgement,\n pibblInternalQueueSimulationComplete,\n pibblInternalRegisterSimulationAdvance,\n pibblInternalRequestSimulationRender,\n} from \"./lib/scheduler/simulation-participant.js\";\nexport type {\n PibblInternalAdvanceLane,\n PibblInternalSimulationOwner,\n} from \"./lib/scheduler/simulation-participant.js\";\n\nimport type {\n PibblBackendEventTargetOptions,\n PibblBackendMount,\n PibblBackendToken,\n PibblNestedResolverInput,\n} from \"./lib/backend/types.js\";\nimport {\n createTarget,\n releaseTarget,\n updateTarget,\n type PibblEventTargetRegistration,\n} from \"./lib/events/registrations.js\";\nimport { PibblPaintEntryKind } from \"./lib/events/paint-entry.js\";\nimport type { PibblEventHandlers, PibblPointerEvents } from \"./lib/events/types.js\";\nimport { getCurrentPibblInstance, GLOBAL_STATE } from \"./lib/global-state.js\";\nexport { captureSeriesInspectionFrame } from \"./lib/series-inspection-frame.js\";\nexport { borrowDispatchResource } from \"./lib/events/event-facade.js\";\nimport {\n requireHookContext,\n useInternalHookSlot,\n} from \"./lib/hooks/hook-slot.js\";\nimport { getCurrentWorldTransform } from \"./lib/render-target.js\";\nimport {\n getElementSource,\n type PibblElementSource,\n} from \"./lib/element/metadata.js\";\nimport { getSurfaceSnapshot } from \"./lib/surface/transform.js\";\nimport type {\n Canvas,\n PibblComponentRefs,\n PibblInstance,\n} from \"./lib/types.js\";\nimport type { PibblInteractionLayer } from \"./lib/types.js\";\nimport { update } from \"./lib/update.js\";\nimport { queueBeginCommand } from \"./lib/scheduler/realm-scheduler.js\";\nimport type { PibblBeginCommandHandle } from \"./lib/scheduler/types.js\";\n\ninterface CurrentInstanceFrameRequestState {\n readonly componentRefs: PibblComponentRefs<any>;\n readonly instance: PibblInstance;\n active: boolean;\n handle: PibblBeginCommandHandle | undefined;\n updateParents: boolean;\n}\n\nconst frameRequestsByComponent = new WeakMap<\n PibblComponentRefs<any>,\n CurrentInstanceFrameRequestState\n>();\n/**\n * Reads the selected official backend's current frame environment.\n *\n * @param token - Backend identity required by the caller. See {@link PibblBackendToken}.\n * @returns The active environment for that backend.\n *\n * @see {@link PibblBackendToken}\n */\nexport function getBackendEnvironment<E>(token: PibblBackendToken): E {\n const driver = GLOBAL_STATE.backendDriver;\n const frame = GLOBAL_STATE.backendFrame;\n if (!driver || !frame || driver.token !== token) {\n throw new Error(\"The requested Pibbl backend environment is not active.\");\n }\n return frame.environment as E;\n}\n\n/**\n * Returns the timestamp shared by the current Pibbl render transaction.\n *\n * @returns The active frame timestamp in milliseconds.\n *\n * @see {@link PibblInternalFrame}\n */\nexport function getCurrentFrameTimestamp(): number {\n return getCurrentPibblInstance().renderTimestamp;\n}\n\n/**\n * Returns the active instance's owning Canvas, never a transient filter target.\n *\n * @returns The host canvas of the active backend mount. See {@link Canvas}.\n *\n * @see {@link Canvas}\n */\nexport function getCurrentBackendHostCanvas(): Canvas {\n return getCurrentPibblInstance().canvas;\n}\n\n/**\n * Returns development JSX source metadata for the current component.\n *\n * @returns Source metadata for the current element, or undefined when unavailable. See\n * {@link PibblElementSource} .\n *\n * @see {@link PibblElementSource}\n */\nexport function getCurrentElementSource(): PibblElementSource | undefined {\n const { componentRefs } = requireHookContext();\n return getElementSource(componentRefs.element);\n}\n\n/**\n * Returns the active surface's independent effective backing densities.\n *\n * @returns Backing pixels per logical unit on each axis.\n *\n * @see {@link PibblPixelRatio}\n */\nexport function getCurrentSurfaceDensity(): Readonly<{ x: number; y: number }> {\n const surface = getSurfaceSnapshot(getCurrentPibblInstance());\n return Object.freeze({\n x: surface.backingPixelsPerLogicalUnitX,\n y: surface.backingPixelsPerLogicalUnitY,\n });\n}\n\n/**\n * Returns the active root-logical viewport for an official renderer hook.\n *\n * @returns The current logical viewport width and height.\n *\n * @see {@link PibblConfig}\n */\nexport function getCurrentLogicalViewport(): Readonly<{\n width: number;\n height: number;\n}> {\n const surface = getSurfaceSnapshot(getCurrentPibblInstance());\n return Object.freeze({\n width: surface.logicalWidth,\n height: surface.logicalHeight,\n });\n}\n\n/**\n * Registers a callback on the root-wide transaction containing this render.\n *\n * @param callback - Callback receiving whether the current render transaction succeeded.\n *\n * @see {@link pibblInternalOnRenderFinish}\n */\nexport function onCurrentRenderFinish(\n callback: (success: boolean) => void,\n): void {\n requireHookContext();\n const transaction = GLOBAL_STATE.renderTransaction;\n if (!transaction) {\n throw new Error(\"No Pibbl render transaction is active.\");\n }\n transaction.onFinish(callback);\n}\n\n/**\n * Requests a coalesced frame for the current private backend instance.\n *\n * @param updateParents - Whether ancestor compositions should also receive a frame request.\n *\n * @see {@link pibblInternalRequestRender}\n */\nexport function requestCurrentInstanceFrame(updateParents: boolean): void {\n const { componentRefs, pibblInstance } = requireHookContext();\n let state = frameRequestsByComponent.get(componentRefs);\n if (!state) {\n state = {\n componentRefs,\n instance: pibblInstance,\n active: true,\n handle: undefined,\n updateParents: false,\n };\n frameRequestsByComponent.set(componentRefs, state);\n componentRefs.teardowns.add(() =>\n releaseCurrentInstanceFrameRequest(state!),\n );\n }\n state.updateParents ||= updateParents;\n if (state.handle) return;\n state.handle = queueBeginCommand(() => {\n state!.handle = undefined;\n const updateParentsForFrame = state!.updateParents;\n state!.updateParents = false;\n if (!isCurrentInstanceFrameRequestActive(state!)) return;\n if (updateParentsForFrame) {\n update(state!.instance.canvas, undefined, true);\n } else {\n update(state!.instance.canvas);\n }\n });\n}\n\n/**\n * Retains one geometry-independent target for an official backend picker.\n *\n * @param handlers - Handlers for the backend target. See {@link PibblEventHandlers}.\n * @param options - Backend geometry and focus metadata. See {@link PibblBackendEventTargetOptions}.\n * @param pointerEvents - Pointer participation policy; defaults to auto. See\n * {@link PibblPointerEvents} .\n * @returns The live registration, or undefined when registration is unnecessary. See\n * {@link PibblEventTargetRegistration} .\n *\n * @see {@link PibblEventHandlers}\n * @see {@link PibblBackendEventTargetOptions}\n * @see {@link PibblPointerEvents}\n * @see {@link PibblEventTargetRegistration}\n */\nexport function useBackendEventTarget(\n handlers: PibblEventHandlers,\n options: PibblBackendEventTargetOptions = {},\n pointerEvents: PibblPointerEvents = \"auto\",\n): PibblEventTargetRegistration | undefined {\n const { componentRefs, pibblInstance } = requireHookContext();\n const hookIndex = GLOBAL_STATE.componentHookIndex;\n const slot = useInternalHookSlot(\"backendEventTarget\", (teardowns) => {\n const target = createTarget(pibblInstance, componentRefs, hookIndex);\n teardowns.add(() => releaseTarget(target));\n return { target, emptyPath: new Path2D() };\n });\n const { target, emptyPath } = slot.value;\n if (pointerEvents === \"none\") {\n releaseTarget(target);\n return undefined;\n }\n updateTarget(\n target,\n handlers,\n { ...options, path: emptyPath },\n true,\n options.deferKeyboardNavigationGeometry ?? false,\n );\n if (target.paintEntry) {\n target.owner.paintEntries.delete(target.paintEntry);\n target.paintEntry = undefined;\n }\n return target;\n}\n\n/**\n * Tests whether an official backend target can still win coordinate picking.\n *\n * @param target - Registration whose ownership is being checked. See\n * {@link PibblEventTargetRegistration} .\n * @returns Whether the target registration is still live.\n *\n * @see {@link PibblEventTargetRegistration}\n */\nexport function isBackendEventTargetLive(\n target: PibblEventTargetRegistration,\n): boolean {\n const { owner } = target;\n return (\n target.live &&\n !owner.mainTeardowns.closed &&\n owner.eventRoot.targets.has(target)\n );\n}\n\n/**\n * Temporarily releases one backend target; its retained hook may enroll it again.\n *\n * @param target - Target registration to release. See {@link PibblEventTargetRegistration}.\n *\n * @see {@link PibblEventTargetRegistration}\n */\nexport function releaseBackendEventTarget(\n target: PibblEventTargetRegistration,\n): void {\n releaseTarget(target);\n target.keyboardNavigationBounds = undefined;\n target.keyboardNavigationPoints = undefined;\n}\n\n/**\n * Registers work that runs after this component's rendered descendants.\n *\n * @param callback - Callback to execute after the current component renders.\n *\n * @see {@link pibblInternalOnRenderFinish}\n */\nexport function setCurrentComponentAfterRender(callback: () => void): void {\n const { componentRefs } = requireHookContext();\n const previous = componentRefs.onAfterRender;\n componentRefs.onAfterRender = previous\n ? () => {\n try {\n previous();\n } finally {\n callback();\n }\n }\n : callback;\n}\n\n/**\n * Installs one stable nested backend resolver in the current Canvas paint order.\n *\n * @param input - Nested coordinate resolver and its target metadata. See\n * {@link PibblNestedResolverInput} .\n *\n * @see {@link PibblNestedResolverInput}\n */\nexport function registerNestedInteractionResolver(\n input: PibblNestedResolverInput,\n): void {\n const { componentRefs, pibblInstance } = requireHookContext();\n const childInstance = backendMountInstance(input.child);\n if (\n childInstance.parent !== pibblInstance.canvas ||\n childInstance.eventRoot !== pibblInstance.eventRoot\n ) {\n throw new Error(\n \"A nested Pibbl backend mount must belong to the current instance and same event root.\",\n );\n }\n const slot = useInternalHookSlot<{\n entry: PibblInteractionLayer;\n child: PibblBackendMount;\n }>(\"nestedInteractionResolver\", (teardowns) => {\n const entry: PibblInteractionLayer = {\n paintKind: PibblPaintEntryKind.Resolver,\n instance: childInstance,\n bounds: input.bounds,\n transform: new DOMMatrix(),\n clippingStack: [],\n resolveLocal: input.resolveLocal,\n };\n const value = { entry, child: input.child };\n teardowns.add(() => {\n pibblInstance.paintEntries.delete(entry);\n if (entry.instance.focusParentBridge === entry) {\n entry.instance.focusParentBridge = undefined;\n }\n if (entry.instance.eventParent === componentRefs) {\n entry.instance.eventParent = undefined;\n }\n });\n return value;\n });\n const { entry } = slot.value;\n if (\n (childInstance.eventParent !== undefined &&\n childInstance.eventParent !== componentRefs) ||\n (childInstance.focusParentBridge !== undefined &&\n childInstance.focusParentBridge !== entry)\n ) {\n throw new Error(\n \"A nested Pibbl backend mount already belongs to another nested resolver.\",\n );\n }\n pibblInstance.paintEntries.delete(entry);\n if (slot.value.child !== input.child) {\n if (entry.instance.focusParentBridge === entry) {\n entry.instance.focusParentBridge = undefined;\n }\n if (entry.instance.eventParent === componentRefs) {\n entry.instance.eventParent = undefined;\n }\n slot.value.child = input.child;\n }\n entry.instance = childInstance;\n entry.instance.eventParent = componentRefs;\n entry.bounds = input.bounds;\n entry.transform = getCurrentWorldTransform();\n entry.clippingStack = Array.from(GLOBAL_STATE.clippingStack);\n entry.resolveLocal = input.resolveLocal;\n entry.instance.focusParentBridge = entry;\n if (input.pointerEvents === \"auto\") {\n pibblInstance.paintEntries.add(entry);\n }\n}\n\nfunction backendMountInstance(mount: PibblBackendMount) {\n const instance = GLOBAL_STATE.pibblInstances.get(mount.canvas);\n if (!instance) {\n throw new Error(\"Nested Pibbl backend mount is not active.\");\n }\n return instance;\n}\n\nfunction cancelCurrentInstanceFrameRequest(\n state: CurrentInstanceFrameRequestState,\n): void {\n state.handle?.cancel();\n state.handle = undefined;\n state.updateParents = false;\n}\n\nfunction releaseCurrentInstanceFrameRequest(\n state: CurrentInstanceFrameRequestState,\n): void {\n if (!state.active) return;\n state.active = false;\n cancelCurrentInstanceFrameRequest(state);\n frameRequestsByComponent.delete(state.componentRefs);\n\n}\n\nfunction isCurrentInstanceFrameRequestActive(\n state: CurrentInstanceFrameRequestState,\n): boolean {\n return (\n state.active &&\n !state.componentRefs.teardowns.closed &&\n !state.instance.mainTeardowns.closed &&\n GLOBAL_STATE.pibblInstances.get(state.instance.canvas) === state.instance &&\n state.instance.refs.get(state.componentRefs.id) === state.componentRefs\n );\n}\nexport {\n pibblInternalAssertCommandAllowed,\n pibblInternalCreateSignalConsumer,\n pibblInternalCurrentFrame,\n pibblInternalCurrentRenderOwner,\n pibblInternalOnRenderFinish,\n pibblInternalPaintTarget,\n pibblInternalQueueBegin,\n pibblInternalQueueComplete,\n pibblInternalQueueCurrentCommit,\n pibblInternalQueueCurrentComplete,\n pibblInternalRegisterAdvance,\n pibblInternalRequestRender,\n pibblInternalRequestRendererWork,\n} from \"./lib/scheduler/renderer-participant.js\";\nexport type {\n PibblInternalCommandHandle,\n PibblInternalFrame,\n PibblInternalRendererWorkKind,\n PibblInternalRenderOwner,\n PibblInternalSignalBatch,\n PibblInternalSignalConsumer,\n} from \"./lib/scheduler/renderer-participant.js\";\n\nexport { pushLayoutBox } from \"./lib/layout/context.js\";\n\nexport {\n ManualSchedulerDriver as PibblInternalManualSchedulerDriver,\n installSchedulerDriverForTest as pibblInternalInstallTestSchedulerDriver,\n snapshotRealmScheduler as pibblInternalSnapshotRealmScheduler,\n} from \"./lib/scheduler/testing.js\";\n\nexport { getCurrentWorldTransform as pibblInternalCurrentWorldTransform } from \"./lib/render-target.js\";\n\nexport { borrowTextureRaster, resolveTexturePaint, validateTexturePaint } from './lib/textures/texture-protocol.js';\nexport type { BorrowedTextureRaster } from './lib/textures/texture-protocol.js';\n"],
5
+ "mappings": "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",
6
6
  "names": ["useInternalHookSlot", "target", "entry", "getCurrentWorldTransform"]
7
7
  }
@@ -13,6 +13,19 @@ export interface CreatePibblEventInput<K extends PibblEventType> {
13
13
  /** Root-logical coordinate supplied by the family adapter. */
14
14
  readonly y?: number;
15
15
  }
16
+ /** Private opt-in dispatch ownership; ordinary events allocate no resource map.
17
+ * @param event - The currently dispatched logical event.
18
+ * @param key - Identity of this optional integration resource.
19
+ * @param create - Lazy initializer with an exact dispatch-end disposer.
20
+ * @returns Shared resource for this logical dispatch.
21
+ * @see {@link PibblEvent}
22
+ */
23
+ export declare function borrowDispatchResource<T>(event: PibblEvent, key: object, create: () => {
24
+ value: T;
25
+ dispose: () => void;
26
+ }): T;
27
+ /** Releases optional synchronous resources even when a handler fails. */
28
+ export declare function finishEventDispatch(event: PibblEvent): void;
16
29
  export declare function createPibblEvent<K extends PibblEventType>(input: CreatePibblEventInput<K>): PibblEventMap[K];
17
30
  export declare function setPibblEventInvocation(event: PibblEvent, currentTarget: PibblEventTarget, eventPhase: PibblEventPhase): void;
18
31
  export declare function isPibblPropagationStopped(event: PibblEvent): boolean;
@@ -2,6 +2,27 @@ import {
2
2
  getPibblEventDefinition
3
3
  } from "./event-definitions.js";
4
4
  const states = /* @__PURE__ */ new WeakMap();
5
+ function borrowDispatchResource(event, key, create) {
6
+ const state = requiredState(event);
7
+ if (state.dispatchFinished) throw new Error("Inspection dispatch has expired.");
8
+ const resources = state.resources ??= /* @__PURE__ */ new Map();
9
+ let resource = resources.get(key);
10
+ if (!resource) {
11
+ resource = create();
12
+ resources.set(key, resource);
13
+ }
14
+ return resource.value;
15
+ }
16
+ function finishEventDispatch(event) {
17
+ const state = requiredState(event);
18
+ state.dispatchFinished = true;
19
+ const resources = state.resources;
20
+ if (resources) {
21
+ for (const resource of resources.values()) resource.dispose();
22
+ resources.clear();
23
+ state.resources = void 0;
24
+ }
25
+ }
5
26
  function createPibblEvent(input) {
6
27
  const definition = requiredDefinition(input.type);
7
28
  const originalEvent = input.originalEvent;
@@ -180,7 +201,9 @@ function pick(value, keys) {
180
201
  return result;
181
202
  }
182
203
  export {
204
+ borrowDispatchResource,
183
205
  createPibblEvent,
206
+ finishEventDispatch,
184
207
  isPibblImmediatePropagationStopped,
185
208
  isPibblPropagationStopped,
186
209
  setPibblEventInvocation
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/lib/events/event-facade.ts"],
4
- "sourcesContent": ["import {\n getPibblEventDefinition,\n type PibblEventDefinition,\n} from './event-definitions.js';\nimport type { PibblEventNode } from './registrations.js';\nimport type {\n PibblEvent,\n PibblEventMap,\n PibblEventPhase,\n PibblEventTarget,\n PibblEventType,\n} from './types.js';\n\nexport type PibblOriginalEvent<K extends PibblEventType> =\n PibblEventMap[K] extends PibblEvent<infer TOriginal> ? TOriginal : Event;\n\nexport interface CreatePibblEventInput<K extends PibblEventType> {\n readonly type: K;\n readonly target: PibblEventNode;\n readonly path: readonly PibblEventNode[];\n readonly relatedTarget?: PibblEventNode | null;\n readonly originalEvent: PibblOriginalEvent<K>;\n readonly sourceEvent?: Event;\n /** Root-logical coordinate supplied by the family adapter. */\n readonly x?: number;\n /** Root-logical coordinate supplied by the family adapter. */\n readonly y?: number;\n}\n\ninterface PibblEventFacadeState {\n currentTarget: PibblEventTarget;\n eventPhase: PibblEventPhase;\n defaultPrevented: boolean;\n propagationStopped: boolean;\n immediatePropagationStopped: boolean;\n}\n\nconst states = new WeakMap<object, PibblEventFacadeState>();\n\nexport function createPibblEvent<K extends PibblEventType>(\n input: CreatePibblEventInput<K>,\n): PibblEventMap[K] {\n const definition = requiredDefinition(input.type);\n const originalEvent = input.originalEvent;\n const cancelable = definition.cancelable && originalEvent.cancelable;\n const publicPath = Object.freeze(\n input.path.map(node => node.publicTarget),\n );\n const state: PibblEventFacadeState = {\n currentTarget: input.target.publicTarget,\n eventPhase: 2,\n defaultPrevented: cancelable && originalEvent.defaultPrevented,\n propagationStopped: false,\n immediatePropagationStopped: false,\n };\n const facade = {\n type: input.type,\n target: input.target.publicTarget,\n relatedTarget: input.relatedTarget?.publicTarget ?? null,\n bubbles: definition.bubbles,\n cancelable,\n timeStamp: originalEvent.timeStamp,\n originalEvent,\n sourceEvent: input.sourceEvent,\n get currentTarget() {\n return state.currentTarget;\n },\n get eventPhase() {\n return state.eventPhase;\n },\n get defaultPrevented() {\n return state.defaultPrevented;\n },\n composedPath() {\n return publicPath;\n },\n preventDefault() {\n if (!cancelable) return;\n state.defaultPrevented = true;\n originalEvent.preventDefault();\n },\n stopPropagation() {\n state.propagationStopped = true;\n originalEvent.stopPropagation();\n },\n stopImmediatePropagation() {\n state.propagationStopped = true;\n state.immediatePropagationStopped = true;\n originalEvent.stopImmediatePropagation();\n },\n } as PibblEvent & Record<string, unknown>;\n states.set(facade, state);\n projectFamilyFields(facade, definition, input);\n return facade as unknown as PibblEventMap[K];\n}\n\nexport function setPibblEventInvocation(\n event: PibblEvent,\n currentTarget: PibblEventTarget,\n eventPhase: PibblEventPhase,\n): void {\n const state = requiredState(event);\n state.currentTarget = currentTarget;\n state.eventPhase = eventPhase;\n}\n\nexport function isPibblPropagationStopped(event: PibblEvent): boolean {\n return requiredState(event).propagationStopped;\n}\n\nexport function isPibblImmediatePropagationStopped(event: PibblEvent): boolean {\n return requiredState(event).immediatePropagationStopped;\n}\n\nfunction requiredState(event: PibblEvent): PibblEventFacadeState {\n const state = states.get(event);\n if (!state) throw new Error('Pibbl event facade state is unavailable.');\n return state;\n}\n\nfunction requiredDefinition(type: PibblEventType): PibblEventDefinition {\n const definition = getPibblEventDefinition(type);\n if (!definition) throw new Error(`Unsupported Pibbl event type: ${type}`);\n return definition;\n}\n\nfunction projectFamilyFields<K extends PibblEventType>(\n facade: PibblEvent & Record<string, unknown>,\n definition: PibblEventDefinition,\n input: CreatePibblEventInput<K>,\n): void {\n const original: unknown = input.originalEvent;\n if (definition.coordinate) {\n Object.assign(facade, { x: input.x ?? 0, y: input.y ?? 0 });\n }\n\n switch (definition.family) {\n case 'pointer':\n projectMouseFields(facade, original as PointerEvent);\n Object.assign(facade, pick(original as PointerEvent, [\n 'pointerId',\n 'width',\n 'height',\n 'pressure',\n 'tangentialPressure',\n 'tiltX',\n 'tiltY',\n 'twist',\n 'pointerType',\n 'isPrimary',\n ]));\n break;\n case 'mouse':\n projectMouseFields(facade, original as MouseEvent);\n break;\n case 'touch':\n projectModifierFields(facade, original as TouchEvent);\n Object.assign(facade, pick(original as TouchEvent, [\n 'touches',\n 'targetTouches',\n 'changedTouches',\n ]));\n break;\n case 'wheel':\n projectMouseFields(facade, original as WheelEvent);\n Object.assign(facade, pick(original as WheelEvent, [\n 'deltaX',\n 'deltaY',\n 'deltaZ',\n 'deltaMode',\n ]));\n break;\n case 'keyboard':\n projectModifierFields(facade, original as KeyboardEvent);\n Object.assign(facade, pick(original as KeyboardEvent, [\n 'key',\n 'code',\n 'location',\n 'repeat',\n 'isComposing',\n ]));\n break;\n case 'input':\n if (definition.type === 'beforeinput' || definition.type === 'input') {\n Object.assign(facade, pick(original as InputEvent, [\n 'data',\n 'dataTransfer',\n 'inputType',\n 'isComposing',\n ]));\n }\n break;\n case 'composition':\n Object.assign(facade, pick(original as CompositionEvent, ['data']));\n break;\n case 'clipboard':\n Object.assign(facade, pick(original as ClipboardEvent, ['clipboardData']));\n break;\n case 'drag':\n projectMouseFields(facade, original as DragEvent);\n Object.assign(facade, pick(original as DragEvent, ['dataTransfer']));\n break;\n case 'focus':\n break;\n }\n}\n\nfunction projectMouseFields(\n facade: PibblEvent & Record<string, unknown>,\n original: MouseEvent,\n): void {\n projectModifierFields(facade, original);\n Object.assign(facade, pick(original, [\n 'clientX',\n 'clientY',\n 'screenX',\n 'screenY',\n 'movementX',\n 'movementY',\n 'button',\n 'buttons',\n 'detail',\n ]));\n}\n\nfunction projectModifierFields(\n facade: PibblEvent & Record<string, unknown>,\n original: MouseEvent | TouchEvent | KeyboardEvent,\n): void {\n Object.assign(facade, pick(original, [\n 'altKey',\n 'ctrlKey',\n 'metaKey',\n 'shiftKey',\n ]));\n}\n\nfunction pick<T extends object, K extends keyof T>(\n value: T,\n keys: readonly K[],\n): Pick<T, K> {\n const result = {} as Pick<T, K>;\n for (const key of keys) result[key] = value[key];\n return result;\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import {\n getPibblEventDefinition,\n type PibblEventDefinition,\n} from './event-definitions.js';\nimport type { PibblEventNode } from './registrations.js';\nimport type {\n PibblEvent,\n PibblEventMap,\n PibblEventPhase,\n PibblEventTarget,\n PibblEventType,\n} from './types.js';\n\nexport type PibblOriginalEvent<K extends PibblEventType> =\n PibblEventMap[K] extends PibblEvent<infer TOriginal> ? TOriginal : Event;\n\nexport interface CreatePibblEventInput<K extends PibblEventType> {\n readonly type: K;\n readonly target: PibblEventNode;\n readonly path: readonly PibblEventNode[];\n readonly relatedTarget?: PibblEventNode | null;\n readonly originalEvent: PibblOriginalEvent<K>;\n readonly sourceEvent?: Event;\n /** Root-logical coordinate supplied by the family adapter. */\n readonly x?: number;\n /** Root-logical coordinate supplied by the family adapter. */\n readonly y?: number;\n}\n\ninterface PibblEventFacadeState {\n dispatchFinished?: boolean;\n resources?: Map<object, { value: unknown; dispose: () => void }>;\n currentTarget: PibblEventTarget;\n eventPhase: PibblEventPhase;\n defaultPrevented: boolean;\n propagationStopped: boolean;\n immediatePropagationStopped: boolean;\n}\n\nconst states = new WeakMap<object, PibblEventFacadeState>();\n\n/** Private opt-in dispatch ownership; ordinary events allocate no resource map.\n * @param event - The currently dispatched logical event.\n * @param key - Identity of this optional integration resource.\n * @param create - Lazy initializer with an exact dispatch-end disposer.\n * @returns Shared resource for this logical dispatch.\n * @see {@link PibblEvent}\n */\nexport function borrowDispatchResource<T>(event: PibblEvent, key: object, create: () => {value:T;dispose:()=>void}): T {\n const state = requiredState(event);\n if (state.dispatchFinished) throw new Error('Inspection dispatch has expired.');\n const resources = state.resources ??= new Map();\n let resource = resources.get(key);\n if (!resource) { resource = create(); resources.set(key,resource); }\n return resource.value as T;\n}\n\n/** Releases optional synchronous resources even when a handler fails. */\nexport function finishEventDispatch(event: PibblEvent): void {\n const state = requiredState(event);\n state.dispatchFinished = true;\n const resources = state.resources;\n if (resources) {\n for (const resource of resources.values()) resource.dispose();\n resources.clear();\n state.resources = undefined;\n }\n}\n\nexport function createPibblEvent<K extends PibblEventType>(\n input: CreatePibblEventInput<K>,\n): PibblEventMap[K] {\n const definition = requiredDefinition(input.type);\n const originalEvent = input.originalEvent;\n const cancelable = definition.cancelable && originalEvent.cancelable;\n const publicPath = Object.freeze(\n input.path.map(node => node.publicTarget),\n );\n const state: PibblEventFacadeState = {\n currentTarget: input.target.publicTarget,\n eventPhase: 2,\n defaultPrevented: cancelable && originalEvent.defaultPrevented,\n propagationStopped: false,\n immediatePropagationStopped: false,\n };\n const facade = {\n type: input.type,\n target: input.target.publicTarget,\n relatedTarget: input.relatedTarget?.publicTarget ?? null,\n bubbles: definition.bubbles,\n cancelable,\n timeStamp: originalEvent.timeStamp,\n originalEvent,\n sourceEvent: input.sourceEvent,\n get currentTarget() {\n return state.currentTarget;\n },\n get eventPhase() {\n return state.eventPhase;\n },\n get defaultPrevented() {\n return state.defaultPrevented;\n },\n composedPath() {\n return publicPath;\n },\n preventDefault() {\n if (!cancelable) return;\n state.defaultPrevented = true;\n originalEvent.preventDefault();\n },\n stopPropagation() {\n state.propagationStopped = true;\n originalEvent.stopPropagation();\n },\n stopImmediatePropagation() {\n state.propagationStopped = true;\n state.immediatePropagationStopped = true;\n originalEvent.stopImmediatePropagation();\n },\n } as PibblEvent & Record<string, unknown>;\n states.set(facade, state);\n projectFamilyFields(facade, definition, input);\n return facade as unknown as PibblEventMap[K];\n}\n\nexport function setPibblEventInvocation(\n event: PibblEvent,\n currentTarget: PibblEventTarget,\n eventPhase: PibblEventPhase,\n): void {\n const state = requiredState(event);\n state.currentTarget = currentTarget;\n state.eventPhase = eventPhase;\n}\n\nexport function isPibblPropagationStopped(event: PibblEvent): boolean {\n return requiredState(event).propagationStopped;\n}\n\nexport function isPibblImmediatePropagationStopped(event: PibblEvent): boolean {\n return requiredState(event).immediatePropagationStopped;\n}\n\nfunction requiredState(event: PibblEvent): PibblEventFacadeState {\n const state = states.get(event);\n if (!state) throw new Error('Pibbl event facade state is unavailable.');\n return state;\n}\n\nfunction requiredDefinition(type: PibblEventType): PibblEventDefinition {\n const definition = getPibblEventDefinition(type);\n if (!definition) throw new Error(`Unsupported Pibbl event type: ${type}`);\n return definition;\n}\n\nfunction projectFamilyFields<K extends PibblEventType>(\n facade: PibblEvent & Record<string, unknown>,\n definition: PibblEventDefinition,\n input: CreatePibblEventInput<K>,\n): void {\n const original: unknown = input.originalEvent;\n if (definition.coordinate) {\n Object.assign(facade, { x: input.x ?? 0, y: input.y ?? 0 });\n }\n\n switch (definition.family) {\n case 'pointer':\n projectMouseFields(facade, original as PointerEvent);\n Object.assign(facade, pick(original as PointerEvent, [\n 'pointerId',\n 'width',\n 'height',\n 'pressure',\n 'tangentialPressure',\n 'tiltX',\n 'tiltY',\n 'twist',\n 'pointerType',\n 'isPrimary',\n ]));\n break;\n case 'mouse':\n projectMouseFields(facade, original as MouseEvent);\n break;\n case 'touch':\n projectModifierFields(facade, original as TouchEvent);\n Object.assign(facade, pick(original as TouchEvent, [\n 'touches',\n 'targetTouches',\n 'changedTouches',\n ]));\n break;\n case 'wheel':\n projectMouseFields(facade, original as WheelEvent);\n Object.assign(facade, pick(original as WheelEvent, [\n 'deltaX',\n 'deltaY',\n 'deltaZ',\n 'deltaMode',\n ]));\n break;\n case 'keyboard':\n projectModifierFields(facade, original as KeyboardEvent);\n Object.assign(facade, pick(original as KeyboardEvent, [\n 'key',\n 'code',\n 'location',\n 'repeat',\n 'isComposing',\n ]));\n break;\n case 'input':\n if (definition.type === 'beforeinput' || definition.type === 'input') {\n Object.assign(facade, pick(original as InputEvent, [\n 'data',\n 'dataTransfer',\n 'inputType',\n 'isComposing',\n ]));\n }\n break;\n case 'composition':\n Object.assign(facade, pick(original as CompositionEvent, ['data']));\n break;\n case 'clipboard':\n Object.assign(facade, pick(original as ClipboardEvent, ['clipboardData']));\n break;\n case 'drag':\n projectMouseFields(facade, original as DragEvent);\n Object.assign(facade, pick(original as DragEvent, ['dataTransfer']));\n break;\n case 'focus':\n break;\n }\n}\n\nfunction projectMouseFields(\n facade: PibblEvent & Record<string, unknown>,\n original: MouseEvent,\n): void {\n projectModifierFields(facade, original);\n Object.assign(facade, pick(original, [\n 'clientX',\n 'clientY',\n 'screenX',\n 'screenY',\n 'movementX',\n 'movementY',\n 'button',\n 'buttons',\n 'detail',\n ]));\n}\n\nfunction projectModifierFields(\n facade: PibblEvent & Record<string, unknown>,\n original: MouseEvent | TouchEvent | KeyboardEvent,\n): void {\n Object.assign(facade, pick(original, [\n 'altKey',\n 'ctrlKey',\n 'metaKey',\n 'shiftKey',\n ]));\n}\n\nfunction pick<T extends object, K extends keyof T>(\n value: T,\n keys: readonly K[],\n): Pick<T, K> {\n const result = {} as Pick<T, K>;\n for (const key of keys) result[key] = value[key];\n return result;\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,6 +1,7 @@
1
1
  import { getPibblEventDefinition } from "./event-definitions.js";
2
2
  import {
3
3
  createPibblEvent,
4
+ finishEventDispatch,
4
5
  isPibblImmediatePropagationStopped,
5
6
  isPibblPropagationStopped,
6
7
  setPibblEventInvocation
@@ -14,23 +15,27 @@ function dispatchEventPath(input) {
14
15
  const path = buildEventPath(input.target);
15
16
  const event = createPibblEvent({ ...input, path });
16
17
  const targetIndex = path.length - 1;
17
- for (let index = 0; index < targetIndex; index++) {
18
- if (isPibblPropagationStopped(event)) break;
19
- invoke(path[index], input.type, true, 1, event);
20
- }
21
- if (!isPibblPropagationStopped(event) && input.target.live) {
22
- invoke(input.target, input.type, true, 2, event);
23
- if (!isPibblImmediatePropagationStopped(event)) {
24
- invoke(input.target, input.type, false, 2, event);
25
- }
26
- }
27
- if (definition.bubbles && !isPibblPropagationStopped(event)) {
28
- for (let index = targetIndex - 1; index >= 0; index--) {
18
+ try {
19
+ for (let index = 0; index < targetIndex; index++) {
29
20
  if (isPibblPropagationStopped(event)) break;
30
- invoke(path[index], input.type, false, 3, event);
21
+ invoke(path[index], input.type, true, 1, event);
22
+ }
23
+ if (!isPibblPropagationStopped(event) && input.target.live) {
24
+ invoke(input.target, input.type, true, 2, event);
25
+ if (!isPibblImmediatePropagationStopped(event)) {
26
+ invoke(input.target, input.type, false, 2, event);
27
+ }
28
+ }
29
+ if (definition.bubbles && !isPibblPropagationStopped(event)) {
30
+ for (let index = targetIndex - 1; index >= 0; index--) {
31
+ if (isPibblPropagationStopped(event)) break;
32
+ invoke(path[index], input.type, false, 3, event);
33
+ }
31
34
  }
35
+ return event;
36
+ } finally {
37
+ finishEventDispatch(event);
32
38
  }
33
- return event;
34
39
  }
35
40
  function invoke(node, type, capture, phase, event) {
36
41
  if (!node.live) return;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/lib/events/propagation.ts"],
4
- "sourcesContent": ["import { getPibblEventDefinition } from './event-definitions.js';\nimport {\n createPibblEvent,\n isPibblImmediatePropagationStopped,\n isPibblPropagationStopped,\n setPibblEventInvocation,\n type CreatePibblEventInput,\n} from './event-facade.js';\nimport { buildEventPath } from './event-path.js';\nimport type {\n PibblEventNode,\n PibblNormalizedHandlers,\n} from './registrations.js';\nimport type {\n PibblEvent,\n PibblEventMap,\n PibblEventPhase,\n PibblEventType,\n} from './types.js';\n\nexport interface DispatchEventPathInput<K extends PibblEventType>\n extends Omit<CreatePibblEventInput<K>, 'path'> {\n readonly target: PibblEventNode;\n}\n\ntype PibblNormalizedCaptureKey = `${PibblEventType}Capture`;\n\nexport function dispatchEventPath<K extends PibblEventType>(\n input: DispatchEventPathInput<K>,\n): PibblEventMap[K] {\n const definition = getPibblEventDefinition(input.type);\n if (!definition) {\n throw new Error(`Unsupported Pibbl event type: ${input.type}`);\n }\n const path = buildEventPath(input.target);\n const event = createPibblEvent({ ...input, path });\n const targetIndex = path.length - 1;\n\n for (let index = 0; index < targetIndex; index++) {\n if (isPibblPropagationStopped(event)) break;\n invoke(path[index], input.type, true, 1, event);\n }\n\n if (!isPibblPropagationStopped(event) && input.target.live) {\n invoke(input.target, input.type, true, 2, event);\n if (!isPibblImmediatePropagationStopped(event)) {\n invoke(input.target, input.type, false, 2, event);\n }\n }\n\n if (definition.bubbles && !isPibblPropagationStopped(event)) {\n for (let index = targetIndex - 1; index >= 0; index--) {\n if (isPibblPropagationStopped(event)) break;\n invoke(path[index], input.type, false, 3, event);\n }\n }\n\n return event;\n}\n\nfunction invoke(\n node: PibblEventNode,\n type: PibblEventType,\n capture: boolean,\n phase: PibblEventPhase,\n event: PibblEvent,\n): void {\n if (!node.live) return;\n const key = capture ? `${type}Capture` as PibblNormalizedCaptureKey : type;\n const handler = node.handlers[key as keyof PibblNormalizedHandlers];\n if (!handler) return;\n setPibblEventInvocation(event, node.publicTarget, phase);\n try {\n (handler as (event: PibblEvent) => void)(event);\n } catch (error) {\n reportDispatchError(error);\n }\n}\n\nfunction reportDispatchError(error: unknown): void {\n try {\n globalThis.reportError(error);\n } catch {\n // Reporting cannot suppress unrelated handlers in this logical dispatch.\n }\n}\n"],
5
- "mappings": "AAAA,SAAS,+BAA+B;AACxC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP,SAAS,sBAAsB;AAmBxB,SAAS,kBACd,OACkB;AAClB,QAAM,aAAa,wBAAwB,MAAM,IAAI;AACrD,MAAI,CAAC,YAAY;AACf,UAAM,IAAI,MAAM,iCAAiC,MAAM,IAAI,EAAE;AAAA,EAC/D;AACA,QAAM,OAAO,eAAe,MAAM,MAAM;AACxC,QAAM,QAAQ,iBAAiB,EAAE,GAAG,OAAO,KAAK,CAAC;AACjD,QAAM,cAAc,KAAK,SAAS;AAElC,WAAS,QAAQ,GAAG,QAAQ,aAAa,SAAS;AAChD,QAAI,0BAA0B,KAAK,EAAG;AACtC,WAAO,KAAK,KAAK,GAAG,MAAM,MAAM,MAAM,GAAG,KAAK;AAAA,EAChD;AAEA,MAAI,CAAC,0BAA0B,KAAK,KAAK,MAAM,OAAO,MAAM;AAC1D,WAAO,MAAM,QAAQ,MAAM,MAAM,MAAM,GAAG,KAAK;AAC/C,QAAI,CAAC,mCAAmC,KAAK,GAAG;AAC9C,aAAO,MAAM,QAAQ,MAAM,MAAM,OAAO,GAAG,KAAK;AAAA,IAClD;AAAA,EACF;AAEA,MAAI,WAAW,WAAW,CAAC,0BAA0B,KAAK,GAAG;AAC3D,aAAS,QAAQ,cAAc,GAAG,SAAS,GAAG,SAAS;AACrD,UAAI,0BAA0B,KAAK,EAAG;AACtC,aAAO,KAAK,KAAK,GAAG,MAAM,MAAM,OAAO,GAAG,KAAK;AAAA,IACjD;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,OACP,MACA,MACA,SACA,OACA,OACM;AACN,MAAI,CAAC,KAAK,KAAM;AAChB,QAAM,MAAM,UAAU,GAAG,IAAI,YAAyC;AACtE,QAAM,UAAU,KAAK,SAAS,GAAoC;AAClE,MAAI,CAAC,QAAS;AACd,0BAAwB,OAAO,KAAK,cAAc,KAAK;AACvD,MAAI;AACF,IAAC,QAAwC,KAAK;AAAA,EAChD,SAAS,OAAO;AACd,wBAAoB,KAAK;AAAA,EAC3B;AACF;AAEA,SAAS,oBAAoB,OAAsB;AACjD,MAAI;AACF,eAAW,YAAY,KAAK;AAAA,EAC9B,QAAQ;AAAA,EAER;AACF;",
4
+ "sourcesContent": ["import { getPibblEventDefinition } from './event-definitions.js';\nimport {\n createPibblEvent,\n finishEventDispatch,\n isPibblImmediatePropagationStopped,\n isPibblPropagationStopped,\n setPibblEventInvocation,\n type CreatePibblEventInput,\n} from './event-facade.js';\nimport { buildEventPath } from './event-path.js';\nimport type {\n PibblEventNode,\n PibblNormalizedHandlers,\n} from './registrations.js';\nimport type {\n PibblEvent,\n PibblEventMap,\n PibblEventPhase,\n PibblEventType,\n} from './types.js';\n\nexport interface DispatchEventPathInput<K extends PibblEventType>\n extends Omit<CreatePibblEventInput<K>, 'path'> {\n readonly target: PibblEventNode;\n}\n\ntype PibblNormalizedCaptureKey = `${PibblEventType}Capture`;\n\nexport function dispatchEventPath<K extends PibblEventType>(\n input: DispatchEventPathInput<K>,\n): PibblEventMap[K] {\n const definition = getPibblEventDefinition(input.type);\n if (!definition) {\n throw new Error(`Unsupported Pibbl event type: ${input.type}`);\n }\n const path = buildEventPath(input.target);\n const event = createPibblEvent({ ...input, path });\n const targetIndex = path.length - 1;\n try {\n for (let index = 0; index < targetIndex; index++) {\n if (isPibblPropagationStopped(event)) break;\n invoke(path[index], input.type, true, 1, event);\n }\n\n if (!isPibblPropagationStopped(event) && input.target.live) {\n invoke(input.target, input.type, true, 2, event);\n if (!isPibblImmediatePropagationStopped(event)) {\n invoke(input.target, input.type, false, 2, event);\n }\n }\n\n if (definition.bubbles && !isPibblPropagationStopped(event)) {\n for (let index = targetIndex - 1; index >= 0; index--) {\n if (isPibblPropagationStopped(event)) break;\n invoke(path[index], input.type, false, 3, event);\n }\n }\n\n return event;\n } finally { finishEventDispatch(event); }\n}\n\nfunction invoke(\n node: PibblEventNode,\n type: PibblEventType,\n capture: boolean,\n phase: PibblEventPhase,\n event: PibblEvent,\n): void {\n if (!node.live) return;\n const key = capture ? `${type}Capture` as PibblNormalizedCaptureKey : type;\n const handler = node.handlers[key as keyof PibblNormalizedHandlers];\n if (!handler) return;\n setPibblEventInvocation(event, node.publicTarget, phase);\n try {\n (handler as (event: PibblEvent) => void)(event);\n } catch (error) {\n reportDispatchError(error);\n }\n}\n\nfunction reportDispatchError(error: unknown): void {\n try {\n globalThis.reportError(error);\n } catch {\n // Reporting cannot suppress unrelated handlers in this logical dispatch.\n }\n}\n"],
5
+ "mappings": "AAAA,SAAS,+BAA+B;AACxC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP,SAAS,sBAAsB;AAmBxB,SAAS,kBACd,OACkB;AAClB,QAAM,aAAa,wBAAwB,MAAM,IAAI;AACrD,MAAI,CAAC,YAAY;AACf,UAAM,IAAI,MAAM,iCAAiC,MAAM,IAAI,EAAE;AAAA,EAC/D;AACA,QAAM,OAAO,eAAe,MAAM,MAAM;AACxC,QAAM,QAAQ,iBAAiB,EAAE,GAAG,OAAO,KAAK,CAAC;AACjD,QAAM,cAAc,KAAK,SAAS;AAClC,MAAI;AACJ,aAAS,QAAQ,GAAG,QAAQ,aAAa,SAAS;AAChD,UAAI,0BAA0B,KAAK,EAAG;AACtC,aAAO,KAAK,KAAK,GAAG,MAAM,MAAM,MAAM,GAAG,KAAK;AAAA,IAChD;AAEA,QAAI,CAAC,0BAA0B,KAAK,KAAK,MAAM,OAAO,MAAM;AAC1D,aAAO,MAAM,QAAQ,MAAM,MAAM,MAAM,GAAG,KAAK;AAC/C,UAAI,CAAC,mCAAmC,KAAK,GAAG;AAC9C,eAAO,MAAM,QAAQ,MAAM,MAAM,OAAO,GAAG,KAAK;AAAA,MAClD;AAAA,IACF;AAEA,QAAI,WAAW,WAAW,CAAC,0BAA0B,KAAK,GAAG;AAC3D,eAAS,QAAQ,cAAc,GAAG,SAAS,GAAG,SAAS;AACrD,YAAI,0BAA0B,KAAK,EAAG;AACtC,eAAO,KAAK,KAAK,GAAG,MAAM,MAAM,OAAO,GAAG,KAAK;AAAA,MACjD;AAAA,IACF;AAEA,WAAO;AAAA,EACP,UAAE;AAAU,wBAAoB,KAAK;AAAA,EAAG;AAC1C;AAEA,SAAS,OACP,MACA,MACA,SACA,OACA,OACM;AACN,MAAI,CAAC,KAAK,KAAM;AAChB,QAAM,MAAM,UAAU,GAAG,IAAI,YAAyC;AACtE,QAAM,UAAU,KAAK,SAAS,GAAoC;AAClE,MAAI,CAAC,QAAS;AACd,0BAAwB,OAAO,KAAK,cAAc,KAAK;AACvD,MAAI;AACF,IAAC,QAAwC,KAAK;AAAA,EAChD,SAAS,OAAO;AACd,wBAAoB,KAAK;AAAA,EAC3B;AACF;AAEA,SAAS,oBAAoB,OAAsB;AACjD,MAAI;AACF,eAAW,YAAY,KAAK;AAAA,EAC9B,QAAQ;AAAA,EAER;AACF;",
6
6
  "names": []
7
7
  }
@@ -114,6 +114,19 @@ function executeRender(canvas, renderTimestamp, updatedRoot, _updateParents = fa
114
114
  percentageBasis: pibblInstance.rootLayoutBox
115
115
  }];
116
116
  const renderGeneration = ++pibblInstance.renderGeneration;
117
+ if (!pibblInstance.parent) {
118
+ renderTransaction.onFinish((success) => {
119
+ if (success) pibblInstance.committedRenderGeneration = renderGeneration;
120
+ });
121
+ if (pibblInstance.rootFrameObservers?.size) {
122
+ renderTransaction.onAfterFinish?.((success) => {
123
+ const observers = pibblInstance.rootFrameObservers;
124
+ if (!observers) return;
125
+ for (const observer of observers)
126
+ observer(success, renderGeneration);
127
+ });
128
+ }
129
+ }
117
130
  renderSeenIds = pibblInstance.renderSeenIds;
118
131
  renderSeenKeys = pibblInstance.renderSeenKeys;
119
132
  renderSeenIds.clear();
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/lib/execute-render.ts"],
4
- "sourcesContent": ["import { RootRenderTransaction } from './render-transaction.js';\nimport {\n clearTempState,\n GLOBAL_STATE,\n NO_PENDING_ROOT,\n} from './global-state.js';\nimport { render } from './render.js';\nimport { initializeCurrentWorldTransformAnchor } from './render-target.js';\nimport {\n Canvas,\n type PibblNode,\n} from './types.js';\nimport type {\n PibblBackendFrame,\n} from './backend/types.js';\nimport type { PibblFrameSnapshot } from './scheduler/types.js';\nimport { withSignalWriteForbidden } from './signals/graph.js';\n\n/**\n * Gets the root element for a canvas and renders it. This is the\n * entry point for rendering the entire tree.\n * @param canvas The canvas to render on\n */\nexport function executeRender(\n canvas: Canvas,\n renderTimestamp: number,\n updatedRoot?: PibblNode | typeof NO_PENDING_ROOT,\n _updateParents = false,\n frameSnapshot?: PibblFrameSnapshot,\n): void {\n if (!canvas) {\n throw new Error('No canvas element provided');\n }\n\n const pibblInstance = GLOBAL_STATE.pibblInstances.get(canvas);\n\n if (!pibblInstance) {\n throw new Error('Pibbl is not mounted on this element');\n }\n\n if (pibblInstance.mainTeardowns.closed) return;\n\n const inheritedTransaction = pibblInstance.eventRoot.renderTransaction;\n const renderTransaction = inheritedTransaction ?? new RootRenderTransaction();\n const ownsRenderTransaction = !inheritedTransaction;\n if (ownsRenderTransaction) {\n pibblInstance.eventRoot.renderTransaction = renderTransaction;\n }\n let transactionFinished = false;\n const finishTransaction = (success: boolean) => {\n if (!ownsRenderTransaction || transactionFinished) return;\n transactionFinished = true;\n (renderTransaction as RootRenderTransaction).finish(success);\n };\n\n const prevCurrentPibblInstance = GLOBAL_STATE.currentPibblInstance;\n const prevCanvas = GLOBAL_STATE.canvas;\n const prevRenderContext = GLOBAL_STATE.renderContext;\n const prevRenderTarget = GLOBAL_STATE.renderTarget;\n const prevWorldBaseTransform = GLOBAL_STATE.worldBaseTransform;\n const prevWorldExactTransform = GLOBAL_STATE.worldExactTransform;\n const prevWorldPaintAnchorTransform = GLOBAL_STATE.worldPaintAnchorTransform;\n const prevPresentationTransformLineage = GLOBAL_STATE.presentationTransformLineage;\n const prevPresentationTransformLineageTrackingDepth =\n GLOBAL_STATE.presentationTransformLineageTrackingDepth;\n const prevRenderTransaction = GLOBAL_STATE.renderTransaction;\n const prevFrameSnapshot = GLOBAL_STATE.frameSnapshot;\n const prevPrimitiveReceiverToken = GLOBAL_STATE.primitiveReceiverToken;\n const prevSeenIds = GLOBAL_STATE.seenIds;\n const prevSeenKeys = GLOBAL_STATE.seenKeys;\n const prevComponentRefs = GLOBAL_STATE.componentRefs;\n const prevComponentHookIndex = GLOBAL_STATE.componentHookIndex;\n const prevComponentIsMounting = GLOBAL_STATE.componentIsMounting;\n const prevClippingStack = GLOBAL_STATE.clippingStack;\n const prevLayoutStack = GLOBAL_STATE.layoutStack;\n const prevBackendDriver = GLOBAL_STATE.backendDriver;\n const prevBackendFrame = GLOBAL_STATE.backendFrame;\n const prevBackendEnvironment = GLOBAL_STATE.backendEnvironment;\n let frame: PibblBackendFrame<unknown> | undefined;\n let frameSuccess = false;\n let renderSeenIds: Set<string> | undefined;\n let renderSeenKeys: Set<string> | undefined;\n try {\n const activeFrameSnapshot = frameSnapshot ?? (\n prevFrameSnapshot?.logicalTime === renderTimestamp ?\n prevFrameSnapshot :\n Object.freeze({\n frameId: prevFrameSnapshot?.frameId ?? 0,\n hostTime: prevFrameSnapshot?.hostTime ?? renderTimestamp,\n logicalTime: renderTimestamp,\n })\n );\n GLOBAL_STATE.frameSnapshot = activeFrameSnapshot;\n GLOBAL_STATE.currentPibblInstance = pibblInstance;\n for (const service of pibblInstance.optionalServices.values()) service.beginRender?.();\n GLOBAL_STATE.renderTransaction = renderTransaction;\n GLOBAL_STATE.currentPibblInstance.renderTimestamp = activeFrameSnapshot.logicalTime;\n GLOBAL_STATE.canvas = canvas;\n const rootNode = arguments.length >= 3 && updatedRoot !== NO_PENDING_ROOT ?\n updatedRoot :\n GLOBAL_STATE.currentPibblInstance.root;\n GLOBAL_STATE.currentPibblInstance.root = rootNode;\n const driver = pibblInstance.backendDriver;\n GLOBAL_STATE.backendDriver = driver;\n frame = driver.beginFrame({\n canvas,\n logicalWidth: pibblInstance.rootLayoutBox.width,\n logicalHeight: pibblInstance.rootLayoutBox.height,\n backingWidth: canvas.width,\n backingHeight: canvas.height,\n renderTimestamp: activeFrameSnapshot.logicalTime,\n });\n if (!frame) {\n pibblInstance.eventRoot.html?.suspend(pibblInstance);\n finishTransaction(true);\n return;\n }\n pibblInstance.eventRoot.html?.beginRender(pibblInstance);\n GLOBAL_STATE.backendFrame = frame;\n GLOBAL_STATE.backendEnvironment = frame.environment;\n GLOBAL_STATE.renderContext = frame.context2D;\n GLOBAL_STATE.renderTarget = frame.renderTarget;\n GLOBAL_STATE.worldBaseTransform = frame.worldBaseTransform;\n GLOBAL_STATE.worldExactTransform = undefined;\n GLOBAL_STATE.worldPaintAnchorTransform = undefined;\n GLOBAL_STATE.presentationTransformLineage = undefined;\n GLOBAL_STATE.presentationTransformLineageTrackingDepth = 0;\n if (\n frame.context2D !== undefined &&\n frame.renderTarget !== undefined &&\n frame.worldBaseTransform !== undefined\n ) {\n initializeCurrentWorldTransformAnchor(frame.worldBaseTransform);\n }\n GLOBAL_STATE.clippingStack = [];\n const surface = pibblInstance.surface.snapshot;\n const logicalWidth = surface?.logicalWidth ?? pibblInstance.rootLayoutBox.width;\n const logicalHeight = surface?.logicalHeight ?? pibblInstance.rootLayoutBox.height;\n const previousRootBox = pibblInstance.rootLayoutBox;\n if (\n previousRootBox.width !== logicalWidth ||\n previousRootBox.height !== logicalHeight\n ) {\n pibblInstance.rootLayoutBox = Object.freeze({\n x: 0,\n y: 0,\n width: logicalWidth,\n height: logicalHeight,\n });\n }\n GLOBAL_STATE.layoutStack = [{\n allocation: pibblInstance.rootLayoutBox,\n percentageBasis: pibblInstance.rootLayoutBox,\n }];\n\n const renderGeneration = ++pibblInstance.renderGeneration;\n renderSeenIds = pibblInstance.renderSeenIds;\n renderSeenKeys = pibblInstance.renderSeenKeys;\n renderSeenIds.clear();\n renderSeenKeys.clear();\n GLOBAL_STATE.seenIds = renderSeenIds;\n GLOBAL_STATE.seenKeys = renderSeenKeys;\n const id = 'root';\n renderSeenIds.add(id);\n withSignalWriteForbidden(\n 'Pibbl render',\n () => render(rootNode, id, undefined),\n );\n\n for (const [id, componentRefs] of pibblInstance.refs) {\n if (componentRefs.renderGeneration === renderGeneration) continue;\n componentRefs.teardowns.execute();\n pibblInstance.refs.delete(id);\n }\n frameSuccess = true;\n for (const service of pibblInstance.optionalServices.values()) service.endRender?.(true);\n driver.finishFrame(frame, true);\n finishTransaction(true);\n } catch (error) {\n for (const service of pibblInstance.optionalServices.values()) service.endRender?.(false);\n finishTransaction(false);\n for (const refs of pibblInstance.refs.values()) {\n refs.teardowns.execute();\n }\n pibblInstance.refs.clear();\n throw error;\n } finally {\n try {\n if (frame && !frameSuccess) {\n pibblInstance.backendDriver.finishFrame(frame, false);\n }\n } finally {\n try {\n clearTempState();\n GLOBAL_STATE.clippingStack = prevClippingStack;\n GLOBAL_STATE.layoutStack = prevLayoutStack;\n if (ownsRenderTransaction) {\n try {\n finishTransaction(false);\n } finally {\n if (pibblInstance.eventRoot.renderTransaction === renderTransaction) {\n pibblInstance.eventRoot.renderTransaction = undefined;\n }\n }\n }\n } finally {\n renderSeenIds?.clear();\n renderSeenKeys?.clear();\n GLOBAL_STATE.currentPibblInstance = prevCurrentPibblInstance;\n GLOBAL_STATE.canvas = prevCanvas;\n GLOBAL_STATE.renderContext = prevRenderContext;\n GLOBAL_STATE.renderTarget = prevRenderTarget;\n GLOBAL_STATE.worldBaseTransform = prevWorldBaseTransform;\n GLOBAL_STATE.worldExactTransform = prevWorldExactTransform;\n GLOBAL_STATE.worldPaintAnchorTransform = prevWorldPaintAnchorTransform;\n GLOBAL_STATE.presentationTransformLineage = prevPresentationTransformLineage;\n GLOBAL_STATE.presentationTransformLineageTrackingDepth =\n prevPresentationTransformLineageTrackingDepth;\n GLOBAL_STATE.renderTransaction = prevRenderTransaction;\n GLOBAL_STATE.frameSnapshot = prevFrameSnapshot;\n GLOBAL_STATE.primitiveReceiverToken = prevPrimitiveReceiverToken;\n GLOBAL_STATE.seenIds = prevSeenIds;\n GLOBAL_STATE.seenKeys = prevSeenKeys;\n GLOBAL_STATE.componentRefs = prevComponentRefs;\n GLOBAL_STATE.componentHookIndex = prevComponentHookIndex;\n GLOBAL_STATE.componentIsMounting = prevComponentIsMounting;\n GLOBAL_STATE.backendDriver = prevBackendDriver;\n GLOBAL_STATE.backendFrame = prevBackendFrame;\n GLOBAL_STATE.backendEnvironment = prevBackendEnvironment;\n }\n }\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { RootRenderTransaction } from './render-transaction.js';\nimport {\n clearTempState,\n GLOBAL_STATE,\n NO_PENDING_ROOT,\n} from './global-state.js';\nimport { render } from './render.js';\nimport { initializeCurrentWorldTransformAnchor } from './render-target.js';\nimport {\n Canvas,\n type PibblNode,\n} from './types.js';\nimport type {\n PibblBackendFrame,\n} from './backend/types.js';\nimport type { PibblFrameSnapshot } from './scheduler/types.js';\nimport { withSignalWriteForbidden } from './signals/graph.js';\n\n/**\n * Gets the root element for a canvas and renders it. This is the\n * entry point for rendering the entire tree.\n * @param canvas The canvas to render on\n */\nexport function executeRender(\n canvas: Canvas,\n renderTimestamp: number,\n updatedRoot?: PibblNode | typeof NO_PENDING_ROOT,\n _updateParents = false,\n frameSnapshot?: PibblFrameSnapshot,\n): void {\n if (!canvas) {\n throw new Error('No canvas element provided');\n }\n\n const pibblInstance = GLOBAL_STATE.pibblInstances.get(canvas);\n\n if (!pibblInstance) {\n throw new Error('Pibbl is not mounted on this element');\n }\n\n if (pibblInstance.mainTeardowns.closed) return;\n\n const inheritedTransaction = pibblInstance.eventRoot.renderTransaction;\n const renderTransaction = inheritedTransaction ?? new RootRenderTransaction();\n const ownsRenderTransaction = !inheritedTransaction;\n if (ownsRenderTransaction) {\n pibblInstance.eventRoot.renderTransaction = renderTransaction;\n }\n let transactionFinished = false;\n const finishTransaction = (success: boolean) => {\n if (!ownsRenderTransaction || transactionFinished) return;\n transactionFinished = true;\n (renderTransaction as RootRenderTransaction).finish(success);\n };\n\n const prevCurrentPibblInstance = GLOBAL_STATE.currentPibblInstance;\n const prevCanvas = GLOBAL_STATE.canvas;\n const prevRenderContext = GLOBAL_STATE.renderContext;\n const prevRenderTarget = GLOBAL_STATE.renderTarget;\n const prevWorldBaseTransform = GLOBAL_STATE.worldBaseTransform;\n const prevWorldExactTransform = GLOBAL_STATE.worldExactTransform;\n const prevWorldPaintAnchorTransform = GLOBAL_STATE.worldPaintAnchorTransform;\n const prevPresentationTransformLineage = GLOBAL_STATE.presentationTransformLineage;\n const prevPresentationTransformLineageTrackingDepth =\n GLOBAL_STATE.presentationTransformLineageTrackingDepth;\n const prevRenderTransaction = GLOBAL_STATE.renderTransaction;\n const prevFrameSnapshot = GLOBAL_STATE.frameSnapshot;\n const prevPrimitiveReceiverToken = GLOBAL_STATE.primitiveReceiverToken;\n const prevSeenIds = GLOBAL_STATE.seenIds;\n const prevSeenKeys = GLOBAL_STATE.seenKeys;\n const prevComponentRefs = GLOBAL_STATE.componentRefs;\n const prevComponentHookIndex = GLOBAL_STATE.componentHookIndex;\n const prevComponentIsMounting = GLOBAL_STATE.componentIsMounting;\n const prevClippingStack = GLOBAL_STATE.clippingStack;\n const prevLayoutStack = GLOBAL_STATE.layoutStack;\n const prevBackendDriver = GLOBAL_STATE.backendDriver;\n const prevBackendFrame = GLOBAL_STATE.backendFrame;\n const prevBackendEnvironment = GLOBAL_STATE.backendEnvironment;\n let frame: PibblBackendFrame<unknown> | undefined;\n let frameSuccess = false;\n let renderSeenIds: Set<string> | undefined;\n let renderSeenKeys: Set<string> | undefined;\n try {\n const activeFrameSnapshot = frameSnapshot ?? (\n prevFrameSnapshot?.logicalTime === renderTimestamp ?\n prevFrameSnapshot :\n Object.freeze({\n frameId: prevFrameSnapshot?.frameId ?? 0,\n hostTime: prevFrameSnapshot?.hostTime ?? renderTimestamp,\n logicalTime: renderTimestamp,\n })\n );\n GLOBAL_STATE.frameSnapshot = activeFrameSnapshot;\n GLOBAL_STATE.currentPibblInstance = pibblInstance;\n for (const service of pibblInstance.optionalServices.values()) service.beginRender?.();\n GLOBAL_STATE.renderTransaction = renderTransaction;\n GLOBAL_STATE.currentPibblInstance.renderTimestamp = activeFrameSnapshot.logicalTime;\n GLOBAL_STATE.canvas = canvas;\n const rootNode = arguments.length >= 3 && updatedRoot !== NO_PENDING_ROOT ?\n updatedRoot :\n GLOBAL_STATE.currentPibblInstance.root;\n GLOBAL_STATE.currentPibblInstance.root = rootNode;\n const driver = pibblInstance.backendDriver;\n GLOBAL_STATE.backendDriver = driver;\n frame = driver.beginFrame({\n canvas,\n logicalWidth: pibblInstance.rootLayoutBox.width,\n logicalHeight: pibblInstance.rootLayoutBox.height,\n backingWidth: canvas.width,\n backingHeight: canvas.height,\n renderTimestamp: activeFrameSnapshot.logicalTime,\n });\n if (!frame) {\n pibblInstance.eventRoot.html?.suspend(pibblInstance);\n finishTransaction(true);\n return;\n }\n pibblInstance.eventRoot.html?.beginRender(pibblInstance);\n GLOBAL_STATE.backendFrame = frame;\n GLOBAL_STATE.backendEnvironment = frame.environment;\n GLOBAL_STATE.renderContext = frame.context2D;\n GLOBAL_STATE.renderTarget = frame.renderTarget;\n GLOBAL_STATE.worldBaseTransform = frame.worldBaseTransform;\n GLOBAL_STATE.worldExactTransform = undefined;\n GLOBAL_STATE.worldPaintAnchorTransform = undefined;\n GLOBAL_STATE.presentationTransformLineage = undefined;\n GLOBAL_STATE.presentationTransformLineageTrackingDepth = 0;\n if (\n frame.context2D !== undefined &&\n frame.renderTarget !== undefined &&\n frame.worldBaseTransform !== undefined\n ) {\n initializeCurrentWorldTransformAnchor(frame.worldBaseTransform);\n }\n GLOBAL_STATE.clippingStack = [];\n const surface = pibblInstance.surface.snapshot;\n const logicalWidth = surface?.logicalWidth ?? pibblInstance.rootLayoutBox.width;\n const logicalHeight = surface?.logicalHeight ?? pibblInstance.rootLayoutBox.height;\n const previousRootBox = pibblInstance.rootLayoutBox;\n if (\n previousRootBox.width !== logicalWidth ||\n previousRootBox.height !== logicalHeight\n ) {\n pibblInstance.rootLayoutBox = Object.freeze({\n x: 0,\n y: 0,\n width: logicalWidth,\n height: logicalHeight,\n });\n }\n GLOBAL_STATE.layoutStack = [{\n allocation: pibblInstance.rootLayoutBox,\n percentageBasis: pibblInstance.rootLayoutBox,\n }];\n\n const renderGeneration = ++pibblInstance.renderGeneration;\n if (!pibblInstance.parent) {\n renderTransaction.onFinish((success) => {\n if (success) pibblInstance.committedRenderGeneration = renderGeneration;\n });\n if (pibblInstance.rootFrameObservers?.size) {\n renderTransaction.onAfterFinish?.((success) => {\n const observers = pibblInstance.rootFrameObservers;\n if (!observers) return;\n for (const observer of observers)\n observer(success, renderGeneration);\n });\n }\n }\n renderSeenIds = pibblInstance.renderSeenIds;\n renderSeenKeys = pibblInstance.renderSeenKeys;\n renderSeenIds.clear();\n renderSeenKeys.clear();\n GLOBAL_STATE.seenIds = renderSeenIds;\n GLOBAL_STATE.seenKeys = renderSeenKeys;\n const id = 'root';\n renderSeenIds.add(id);\n withSignalWriteForbidden(\n 'Pibbl render',\n () => render(rootNode, id, undefined),\n );\n\n for (const [id, componentRefs] of pibblInstance.refs) {\n if (componentRefs.renderGeneration === renderGeneration) continue;\n componentRefs.teardowns.execute();\n pibblInstance.refs.delete(id);\n }\n frameSuccess = true;\n for (const service of pibblInstance.optionalServices.values()) service.endRender?.(true);\n driver.finishFrame(frame, true);\n finishTransaction(true);\n } catch (error) {\n for (const service of pibblInstance.optionalServices.values()) service.endRender?.(false);\n finishTransaction(false);\n for (const refs of pibblInstance.refs.values()) {\n refs.teardowns.execute();\n }\n pibblInstance.refs.clear();\n throw error;\n } finally {\n try {\n if (frame && !frameSuccess) {\n pibblInstance.backendDriver.finishFrame(frame, false);\n }\n } finally {\n try {\n clearTempState();\n GLOBAL_STATE.clippingStack = prevClippingStack;\n GLOBAL_STATE.layoutStack = prevLayoutStack;\n if (ownsRenderTransaction) {\n try {\n finishTransaction(false);\n } finally {\n if (pibblInstance.eventRoot.renderTransaction === renderTransaction) {\n pibblInstance.eventRoot.renderTransaction = undefined;\n }\n }\n }\n } finally {\n renderSeenIds?.clear();\n renderSeenKeys?.clear();\n GLOBAL_STATE.currentPibblInstance = prevCurrentPibblInstance;\n GLOBAL_STATE.canvas = prevCanvas;\n GLOBAL_STATE.renderContext = prevRenderContext;\n GLOBAL_STATE.renderTarget = prevRenderTarget;\n GLOBAL_STATE.worldBaseTransform = prevWorldBaseTransform;\n GLOBAL_STATE.worldExactTransform = prevWorldExactTransform;\n GLOBAL_STATE.worldPaintAnchorTransform = prevWorldPaintAnchorTransform;\n GLOBAL_STATE.presentationTransformLineage = prevPresentationTransformLineage;\n GLOBAL_STATE.presentationTransformLineageTrackingDepth =\n prevPresentationTransformLineageTrackingDepth;\n GLOBAL_STATE.renderTransaction = prevRenderTransaction;\n GLOBAL_STATE.frameSnapshot = prevFrameSnapshot;\n GLOBAL_STATE.primitiveReceiverToken = prevPrimitiveReceiverToken;\n GLOBAL_STATE.seenIds = prevSeenIds;\n GLOBAL_STATE.seenKeys = prevSeenKeys;\n GLOBAL_STATE.componentRefs = prevComponentRefs;\n GLOBAL_STATE.componentHookIndex = prevComponentHookIndex;\n GLOBAL_STATE.componentIsMounting = prevComponentIsMounting;\n GLOBAL_STATE.backendDriver = prevBackendDriver;\n GLOBAL_STATE.backendFrame = prevBackendFrame;\n GLOBAL_STATE.backendEnvironment = prevBackendEnvironment;\n }\n }\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["id"]
7
7
  }
@@ -0,0 +1,43 @@
1
+ import type { Canvas } from "../types.js";
2
+ import type { PibblFrameRecording, PibblFrameRecordingOptions, PibblFrameRecordingSession, PibblGifExportOptions } from "./types.js";
3
+ /** Private deterministic ownership evidence; not a public diagnostics API. */
4
+ export declare const recordingResources: {
5
+ workers: number;
6
+ urls: number;
7
+ observers: number;
8
+ timers: number;
9
+ abortListeners: number;
10
+ requests: number;
11
+ exports: number;
12
+ };
13
+ /**
14
+ * Record committed bitmap frames from any live Pibbl root canvas.
15
+ *
16
+ * Capture uses the existing render lifecycle; it never starts a render loop.
17
+ * Stop retains frames; cancel discards them. Dispose the completed recording
18
+ * after reading or exporting it. Resizing, failed renders, unreadable pixels,
19
+ * allocation failure, and capture queue overflow reject and release the session.
20
+ *
21
+ * @param canvas The canvas belonging to a live Pibbl root mount.
22
+ * @param options Capture duration, maximum frame rate, allocation headroom, and cancellation.
23
+ * @returns Stable controls and promises for one recording session.
24
+ * @see {@link PibblFrameRecordingOptions}
25
+ * @see {@link PibblFrameRecordingSession}
26
+ */
27
+ export declare function recordFrames(canvas: Canvas, options: PibblFrameRecordingOptions): PibblFrameRecordingSession;
28
+ /**
29
+ * Encode a retained recording to an image/gif Blob in its worker's WASM encoder.
30
+ *
31
+ * Pixels remain worker-owned. Cancellation stops encoding and preserves the
32
+ * recording; disposing the recording cancels all pending reads and exports.
33
+ * GIF timing is rounded cumulatively to 10ms units. Without an opaque background,
34
+ * alpha below 128 is transparent and other pixels are opaque. Only one export
35
+ * per recording may run at a time. Requires workers, WebAssembly, and blob-worker CSP permission.
36
+ *
37
+ * @param recording Retained frames returned by recordFrames.
38
+ * @param options Output dimensions, palette, dithering, sampling, looping, background, progress, and cancellation.
39
+ * @returns Encoded GIF bytes as a caller-owned Blob.
40
+ * @see {@link PibblGifExportOptions}
41
+ * @see {@link PibblFrameRecording}
42
+ */
43
+ export declare function exportGif(recording: PibblFrameRecording, options?: PibblGifExportOptions): Promise<Blob>;