@pibbl/core 0.0.2 → 0.0.3-alpha.109.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/THIRD_PARTY_NOTICES.txt +81 -0
- package/dist/features/physics/2d-testing.d.ts +1 -1
- package/dist/features/physics/2d-testing.js +2 -2
- package/dist/features/physics/2d-testing.js.map +2 -2
- package/dist/features/physics/lib/2d/canvas/components.js +25 -21
- package/dist/features/physics/lib/2d/canvas/components.js.map +2 -2
- package/dist/features/physics/lib/2d/canvas/presentation.js +1 -2
- package/dist/features/physics/lib/2d/canvas/presentation.js.map +2 -2
- package/dist/features/physics/lib/2d/collision/casts.js +4 -2
- package/dist/features/physics/lib/2d/collision/casts.js.map +2 -2
- package/dist/features/physics/lib/2d/runtime/controller.js +1 -1
- package/dist/features/physics/lib/2d/runtime/controller.js.map +2 -2
- package/dist/features/physics/lib/2d/runtime/obstacles.js +9 -11
- package/dist/features/physics/lib/2d/runtime/obstacles.js.map +2 -2
- package/dist/features/physics/lib/2d/shapes.js +8 -9
- package/dist/features/physics/lib/2d/shapes.js.map +2 -2
- package/dist/features/physics/lib/2d/world/rapier.js +22 -26
- package/dist/features/physics/lib/2d/world/rapier.js.map +2 -2
- package/dist/features/sprites/loader.js +6 -3
- package/dist/features/sprites/loader.js.map +2 -2
- package/dist/features/textures/index.d.ts +12 -2
- package/dist/features/textures/index.js +33 -1
- package/dist/features/textures/index.js.map +2 -2
- package/dist/features/textures/lib/chemical-field.d.ts +56 -0
- package/dist/features/textures/lib/chemical-field.js +154 -0
- package/dist/features/textures/lib/chemical-field.js.map +7 -0
- package/dist/features/textures/lib/chemical-recipes.d.ts +119 -0
- package/dist/features/textures/lib/chemical-recipes.js +275 -0
- package/dist/features/textures/lib/chemical-recipes.js.map +7 -0
- package/dist/features/textures/lib/definitions.d.ts +3 -18
- package/dist/features/textures/lib/definitions.js +17 -24
- package/dist/features/textures/lib/definitions.js.map +2 -2
- package/dist/features/textures/lib/geometric-patterns.d.ts +149 -0
- package/dist/features/textures/lib/geometric-patterns.js +305 -0
- package/dist/features/textures/lib/geometric-patterns.js.map +7 -0
- package/dist/features/textures/lib/gray-scott.d.ts +55 -0
- package/dist/features/textures/lib/gray-scott.js +37 -0
- package/dist/features/textures/lib/gray-scott.js.map +7 -0
- package/dist/features/textures/lib/palette.js +1 -3
- package/dist/features/textures/lib/palette.js.map +2 -2
- package/dist/features/textures/lib/patterns.d.ts +123 -0
- package/dist/features/textures/lib/patterns.js +344 -0
- package/dist/features/textures/lib/patterns.js.map +7 -0
- package/dist/features/textures/lib/rain-drops.js +2 -1
- package/dist/features/textures/lib/rain-drops.js.map +2 -2
- package/dist/features/textures/lib/reaction-diffusion.d.ts +3 -2
- package/dist/features/textures/lib/reaction-diffusion.js +9 -20
- package/dist/features/textures/lib/reaction-diffusion.js.map +2 -2
- package/dist/features/textures/lib/simulation.d.ts +10 -4
- package/dist/features/textures/lib/simulation.js +23 -13
- package/dist/features/textures/lib/simulation.js.map +2 -2
- package/dist/features/textures/lib/wasm/electric.js +8 -1
- package/dist/features/textures/lib/wasm/electric.js.map +2 -2
- package/dist/features/textures/lib/water-surface.js +1 -3
- package/dist/features/textures/lib/water-surface.js.map +2 -2
- package/dist/features/viz/index.d.ts +68 -6
- package/dist/features/viz/index.js +164 -2
- package/dist/features/viz/index.js.map +2 -2
- package/dist/features/viz/inspection/bar.d.ts +79 -0
- package/dist/features/viz/inspection/bar.js +49 -0
- package/dist/features/viz/inspection/bar.js.map +7 -0
- package/dist/features/viz/inspection/candle.d.ts +156 -0
- package/dist/features/viz/inspection/candle.js +120 -0
- package/dist/features/viz/inspection/candle.js.map +7 -0
- package/dist/features/viz/inspection/capture-types.d.ts +65 -0
- package/dist/features/viz/inspection/capture.d.ts +16 -0
- package/dist/features/viz/inspection/capture.js +49 -0
- package/dist/features/viz/inspection/capture.js.map +7 -0
- package/dist/features/viz/inspection/handler.d.ts +36 -0
- package/dist/features/viz/inspection/handler.js +91 -0
- package/dist/features/viz/inspection/handler.js.map +7 -0
- package/dist/features/viz/inspection/ohlc-bar.d.ts +132 -0
- package/dist/features/viz/inspection/ohlc-bar.js +118 -0
- package/dist/features/viz/inspection/ohlc-bar.js.map +7 -0
- package/dist/features/viz/inspection/owned-ref.d.ts +16 -0
- package/dist/features/viz/inspection/owned-ref.js +99 -0
- package/dist/features/viz/inspection/owned-ref.js.map +7 -0
- package/dist/features/viz/inspection/painted-point.d.ts +22 -0
- package/dist/features/viz/inspection/painted-point.js +29 -0
- package/dist/features/viz/inspection/painted-point.js.map +7 -0
- package/dist/features/viz/inspection/queries.d.ts +100 -0
- package/dist/features/viz/inspection/queries.js +192 -0
- package/dist/features/viz/inspection/queries.js.map +7 -0
- package/dist/features/viz/inspection/query-types.d.ts +177 -0
- package/dist/features/viz/inspection/volume.d.ts +104 -0
- package/dist/features/viz/inspection/volume.js +95 -0
- package/dist/features/viz/inspection/volume.js.map +7 -0
- package/dist/features/viz/inspection.d.ts +19 -0
- package/dist/features/viz/inspection.js +54 -0
- package/dist/features/viz/inspection.js.map +7 -0
- package/dist/features/viz/inspection.mjs +1 -0
- package/dist/features/viz/lib/area-series.d.ts +62 -0
- package/dist/features/viz/lib/area-series.js +120 -0
- package/dist/features/viz/lib/area-series.js.map +7 -0
- package/dist/features/viz/lib/axis-title.js +2 -1
- package/dist/features/viz/lib/axis-title.js.map +2 -2
- package/dist/features/viz/lib/axis.js +1 -1
- package/dist/features/viz/lib/axis.js.map +2 -2
- package/dist/features/viz/lib/bar-series.d.ts +3 -1
- package/dist/features/viz/lib/bar-series.js +16 -1
- package/dist/features/viz/lib/bar-series.js.map +2 -2
- package/dist/features/viz/lib/baseline-series.d.ts +55 -0
- package/dist/features/viz/lib/baseline-series.js +136 -0
- package/dist/features/viz/lib/baseline-series.js.map +7 -0
- package/dist/features/viz/lib/candlestick-series.d.ts +62 -0
- package/dist/features/viz/lib/candlestick-series.js +150 -0
- package/dist/features/viz/lib/candlestick-series.js.map +7 -0
- package/dist/features/viz/lib/censored-point-series.d.ts +71 -0
- package/dist/features/viz/lib/censored-point-series.js +129 -0
- package/dist/features/viz/lib/censored-point-series.js.map +7 -0
- package/dist/features/viz/lib/color-context.d.ts +4 -0
- package/dist/features/viz/lib/color-context.js +41 -0
- package/dist/features/viz/lib/color-context.js.map +7 -0
- package/dist/features/viz/lib/color-math.d.ts +4 -0
- package/dist/features/viz/lib/color-math.js +31 -0
- package/dist/features/viz/lib/color-math.js.map +7 -0
- package/dist/features/viz/lib/color-types.d.ts +53 -0
- package/dist/features/viz/lib/curve-definition.d.ts +49 -0
- package/dist/features/viz/lib/curve-definition.js +142 -0
- package/dist/features/viz/lib/curve-definition.js.map +7 -0
- package/dist/features/viz/lib/diverging-color-scale.d.ts +11 -0
- package/dist/features/viz/lib/diverging-color-scale.js +51 -0
- package/dist/features/viz/lib/diverging-color-scale.js.map +7 -0
- package/dist/features/viz/lib/domain-navigation.d.ts +40 -0
- package/dist/features/viz/lib/domain-navigation.js +77 -0
- package/dist/features/viz/lib/domain-navigation.js.map +7 -0
- package/dist/features/viz/lib/editable-chart-elements.d.ts +178 -0
- package/dist/features/viz/lib/editable-chart-elements.js +733 -0
- package/dist/features/viz/lib/editable-chart-elements.js.map +7 -0
- package/dist/features/viz/lib/financial-aggregation.d.ts +127 -0
- package/dist/features/viz/lib/financial-aggregation.js +116 -0
- package/dist/features/viz/lib/financial-aggregation.js.map +7 -0
- package/dist/features/viz/lib/financial-autoscale.d.ts +64 -0
- package/dist/features/viz/lib/financial-autoscale.js +61 -0
- package/dist/features/viz/lib/financial-autoscale.js.map +7 -0
- package/dist/features/viz/lib/financial-comparison.d.ts +62 -0
- package/dist/features/viz/lib/financial-comparison.js +98 -0
- package/dist/features/viz/lib/financial-comparison.js.map +7 -0
- package/dist/features/viz/lib/financial-geometry.d.ts +77 -0
- package/dist/features/viz/lib/financial-geometry.js +67 -0
- package/dist/features/viz/lib/financial-geometry.js.map +7 -0
- package/dist/features/viz/lib/financial-indicators.d.ts +114 -0
- package/dist/features/viz/lib/financial-indicators.js +135 -0
- package/dist/features/viz/lib/financial-indicators.js.map +7 -0
- package/dist/features/viz/lib/financial-oscillators.d.ts +171 -0
- package/dist/features/viz/lib/financial-oscillators.js +265 -0
- package/dist/features/viz/lib/financial-oscillators.js.map +7 -0
- package/dist/features/viz/lib/graph/bipartite.d.ts +14 -0
- package/dist/features/viz/lib/graph/bipartite.js +250 -0
- package/dist/features/viz/lib/graph/bipartite.js.map +7 -0
- package/dist/features/viz/lib/graph/chord.d.ts +44 -0
- package/dist/features/viz/lib/graph/chord.js +348 -0
- package/dist/features/viz/lib/graph/chord.js.map +7 -0
- package/dist/features/viz/lib/graph/dependency.d.ts +26 -0
- package/dist/features/viz/lib/graph/dependency.js +140 -0
- package/dist/features/viz/lib/graph/dependency.js.map +7 -0
- package/dist/features/viz/lib/graph/force.d.ts +28 -0
- package/dist/features/viz/lib/graph/force.js +580 -0
- package/dist/features/viz/lib/graph/force.js.map +7 -0
- package/dist/features/viz/lib/graph/hierarchy.d.ts +21 -0
- package/dist/features/viz/lib/graph/hierarchy.js +112 -0
- package/dist/features/viz/lib/graph/hierarchy.js.map +7 -0
- package/dist/features/viz/lib/graph/icicle.d.ts +16 -0
- package/dist/features/viz/lib/graph/icicle.js +153 -0
- package/dist/features/viz/lib/graph/icicle.js.map +7 -0
- package/dist/features/viz/lib/graph/matrix.d.ts +30 -0
- package/dist/features/viz/lib/graph/matrix.js +243 -0
- package/dist/features/viz/lib/graph/matrix.js.map +7 -0
- package/dist/features/viz/lib/graph/neighborhood.d.ts +11 -0
- package/dist/features/viz/lib/graph/neighborhood.js +281 -0
- package/dist/features/viz/lib/graph/neighborhood.js.map +7 -0
- package/dist/features/viz/lib/graph/routes.d.ts +35 -0
- package/dist/features/viz/lib/graph/routes.js +101 -0
- package/dist/features/viz/lib/graph/routes.js.map +7 -0
- package/dist/features/viz/lib/graph/sankey.d.ts +44 -0
- package/dist/features/viz/lib/graph/sankey.js +341 -0
- package/dist/features/viz/lib/graph/sankey.js.map +7 -0
- package/dist/features/viz/lib/graph/shared.d.ts +59 -0
- package/dist/features/viz/lib/graph/shared.js +301 -0
- package/dist/features/viz/lib/graph/shared.js.map +7 -0
- package/dist/features/viz/lib/graph/tree.d.ts +11 -0
- package/dist/features/viz/lib/graph/tree.js +232 -0
- package/dist/features/viz/lib/graph/tree.js.map +7 -0
- package/dist/features/viz/lib/graph/treemap.d.ts +20 -0
- package/dist/features/viz/lib/graph/treemap.js +227 -0
- package/dist/features/viz/lib/graph/treemap.js.map +7 -0
- package/dist/features/viz/lib/graph/types.d.ts +1097 -0
- package/dist/features/viz/lib/hover-card.js +8 -9
- package/dist/features/viz/lib/hover-card.js.map +2 -2
- package/dist/features/viz/lib/hover-data.d.ts +1 -1
- package/dist/features/viz/lib/hover-data.js +5 -2
- package/dist/features/viz/lib/hover-data.js.map +2 -2
- package/dist/features/viz/lib/interval-band-series.d.ts +49 -0
- package/dist/features/viz/lib/interval-band-series.js +136 -0
- package/dist/features/viz/lib/interval-band-series.js.map +7 -0
- package/dist/features/viz/lib/interval-diamond-series.d.ts +43 -0
- package/dist/features/viz/lib/interval-diamond-series.js +122 -0
- package/dist/features/viz/lib/interval-diamond-series.js.map +7 -0
- package/dist/features/viz/lib/interval-series.d.ts +79 -0
- package/dist/features/viz/lib/interval-series.js +158 -0
- package/dist/features/viz/lib/interval-series.js.map +7 -0
- package/dist/features/viz/lib/layout-pie.js +9 -13
- package/dist/features/viz/lib/layout-pie.js.map +2 -2
- package/dist/features/viz/lib/line-series.d.ts +1 -1
- package/dist/features/viz/lib/line-series.js +47 -28
- package/dist/features/viz/lib/line-series.js.map +2 -2
- package/dist/features/viz/lib/linear-scale.js +1 -1
- package/dist/features/viz/lib/linear-scale.js.map +2 -2
- package/dist/features/viz/lib/monotone-curve.d.ts +11 -0
- package/dist/features/viz/lib/monotone-curve.js +63 -0
- package/dist/features/viz/lib/monotone-curve.js.map +7 -0
- package/dist/features/viz/lib/numeric-range-interpolation.d.ts +15 -0
- package/dist/features/viz/lib/numeric-range-interpolation.js +36 -0
- package/dist/features/viz/lib/numeric-range-interpolation.js.map +7 -0
- package/dist/features/viz/lib/ohlc-bar-series.d.ts +55 -0
- package/dist/features/viz/lib/ohlc-bar-series.js +168 -0
- package/dist/features/viz/lib/ohlc-bar-series.js.map +7 -0
- package/dist/features/viz/lib/paired-series.d.ts +44 -0
- package/dist/features/viz/lib/paired-series.js +93 -0
- package/dist/features/viz/lib/paired-series.js.map +7 -0
- package/dist/features/viz/lib/pie-layout.js +2 -1
- package/dist/features/viz/lib/pie-layout.js.map +2 -2
- package/dist/features/viz/lib/plot-series.js +11 -6
- package/dist/features/viz/lib/plot-series.js.map +2 -2
- package/dist/features/viz/lib/plot-types.d.ts +4 -3
- package/dist/features/viz/lib/point-series.d.ts +1 -1
- package/dist/features/viz/lib/point-series.js +36 -9
- package/dist/features/viz/lib/point-series.js.map +2 -2
- package/dist/features/viz/lib/point-types.d.ts +5 -2
- package/dist/features/viz/lib/reference-band.js +4 -1
- package/dist/features/viz/lib/reference-band.js.map +2 -2
- package/dist/features/viz/lib/scale-context.d.ts +1 -1
- package/dist/features/viz/lib/scale-ticks.js +21 -6
- package/dist/features/viz/lib/scale-ticks.js.map +2 -2
- package/dist/features/viz/lib/sequential-color-scale.d.ts +11 -0
- package/dist/features/viz/lib/sequential-color-scale.js +49 -0
- package/dist/features/viz/lib/sequential-color-scale.js.map +7 -0
- package/dist/features/viz/lib/series-position.d.ts +12 -0
- package/dist/features/viz/lib/series-position.js +44 -0
- package/dist/features/viz/lib/series-position.js.map +7 -0
- package/dist/features/viz/lib/step-curves.d.ts +19 -0
- package/dist/features/viz/lib/step-curves.js +53 -0
- package/dist/features/viz/lib/step-curves.js.map +7 -0
- package/dist/features/viz/lib/threshold-color-scale.d.ts +43 -0
- package/dist/features/viz/lib/threshold-color-scale.js +59 -0
- package/dist/features/viz/lib/threshold-color-scale.js.map +7 -0
- package/dist/features/viz/lib/trading-time-mapping.d.ts +32 -0
- package/dist/features/viz/lib/trading-time-mapping.js +89 -0
- package/dist/features/viz/lib/trading-time-mapping.js.map +7 -0
- package/dist/features/viz/lib/trading-time-scale.d.ts +83 -0
- package/dist/features/viz/lib/trading-time-scale.js +96 -0
- package/dist/features/viz/lib/trading-time-scale.js.map +7 -0
- package/dist/features/viz/lib/trajectory-series.d.ts +71 -0
- package/dist/features/viz/lib/trajectory-series.js +111 -0
- package/dist/features/viz/lib/trajectory-series.js.map +7 -0
- package/dist/features/viz/lib/types.d.ts +20 -4
- package/dist/features/viz/lib/use-continuous-scale.js +6 -1
- package/dist/features/viz/lib/use-continuous-scale.js.map +2 -2
- package/dist/features/viz/lib/utc-scale.js +11 -10
- package/dist/features/viz/lib/utc-scale.js.map +2 -2
- package/dist/features/viz/lib/volume-series.d.ts +59 -0
- package/dist/features/viz/lib/volume-series.js +117 -0
- package/dist/features/viz/lib/volume-series.js.map +7 -0
- package/dist/features/viz/lib/weighted-point-series.d.ts +71 -0
- package/dist/features/viz/lib/weighted-point-series.js +169 -0
- package/dist/features/viz/lib/weighted-point-series.js.map +7 -0
- package/dist/filters/backdrop-contrast-gpu.d.ts +5 -0
- package/dist/filters/backdrop-contrast-gpu.js +33 -0
- package/dist/filters/backdrop-contrast-gpu.js.map +7 -0
- package/dist/filters/backdrop-contrast.d.ts +21 -0
- package/dist/filters/backdrop-contrast.js +61 -0
- package/dist/filters/backdrop-contrast.js.map +7 -0
- package/dist/filters/displacement.js +1 -1
- package/dist/filters/displacement.js.map +2 -2
- package/dist/filters/emboss-gpu.d.ts +4 -0
- package/dist/filters/emboss-gpu.js +39 -0
- package/dist/filters/emboss-gpu.js.map +7 -0
- package/dist/filters/emboss.d.ts +32 -0
- package/dist/filters/emboss.js +104 -0
- package/dist/filters/emboss.js.map +7 -0
- package/dist/filters/filter-executor.d.ts +11 -4
- package/dist/filters/filter-executor.js +104 -49
- package/dist/filters/filter-executor.js.map +2 -2
- package/dist/filters/reflected-light.js +1 -1
- package/dist/filters/reflected-light.js.map +2 -2
- package/dist/filters/reflection-gpu.d.ts +3 -1
- package/dist/filters/reflection-gpu.js +5 -2
- package/dist/filters/reflection-gpu.js.map +2 -2
- package/dist/filters/render-backdrop-contrast-boundary.d.ts +31 -0
- package/dist/filters/render-backdrop-contrast-boundary.js +116 -0
- package/dist/filters/render-backdrop-contrast-boundary.js.map +7 -0
- package/dist/filters/render-emboss-boundary.d.ts +13 -0
- package/dist/filters/render-emboss-boundary.js +131 -0
- package/dist/filters/render-emboss-boundary.js.map +7 -0
- package/dist/filters.d.ts +9 -5
- package/dist/filters.js +4 -0
- package/dist/filters.js.map +2 -2
- package/dist/index.d.ts +9 -5
- package/dist/index.js +18 -2
- package/dist/index.js.map +2 -2
- package/dist/internal.d.ts +4 -0
- package/dist/internal.js +6 -0
- package/dist/internal.js.map +2 -2
- package/dist/layout-kernel.d.ts +12 -0
- package/dist/layout-kernel.js +11 -0
- package/dist/layout-kernel.js.map +7 -0
- package/dist/layout-kernel.mjs +1 -0
- package/dist/lib/backend/types.d.ts +13 -1
- package/dist/lib/backend/types.js.map +2 -2
- package/dist/lib/components/arc-geometry.js +2 -1
- package/dist/lib/components/arc-geometry.js.map +2 -2
- package/dist/lib/components/g.js +2 -0
- package/dist/lib/components/g.js.map +2 -2
- package/dist/lib/components/html-box.js +2 -1
- package/dist/lib/components/html-box.js.map +2 -2
- package/dist/lib/components/img.js +3 -3
- package/dist/lib/components/img.js.map +2 -2
- package/dist/lib/components/layer.js +98 -16
- package/dist/lib/components/layer.js.map +3 -3
- package/dist/lib/components/text.d.ts +16 -0
- package/dist/lib/components/text.js +131 -24
- package/dist/lib/components/text.js.map +2 -2
- package/dist/lib/define-primitive.d.ts +4 -2
- package/dist/lib/define-primitive.js +3 -1
- package/dist/lib/define-primitive.js.map +2 -2
- package/dist/lib/element/metadata.d.ts +9 -0
- package/dist/lib/element/metadata.js +19 -0
- package/dist/lib/element/metadata.js.map +2 -2
- package/dist/lib/element/resolve-primitive-inputs.d.ts +2 -0
- package/dist/lib/element/resolve-primitive-inputs.js +17 -4
- package/dist/lib/element/resolve-primitive-inputs.js.map +2 -2
- package/dist/lib/events/event-facade.d.ts +18 -0
- package/dist/lib/events/event-facade.js +28 -2
- package/dist/lib/events/event-facade.js.map +2 -2
- package/dist/lib/events/hit-test.js +2 -1
- package/dist/lib/events/hit-test.js.map +2 -2
- package/dist/lib/events/propagation.d.ts +2 -1
- package/dist/lib/events/propagation.js +22 -16
- package/dist/lib/events/propagation.js.map +2 -2
- package/dist/lib/events/registrations.d.ts +10 -0
- package/dist/lib/events/registrations.js +160 -5
- package/dist/lib/events/registrations.js.map +2 -2
- package/dist/lib/execute-render.js +25 -1
- package/dist/lib/execute-render.js.map +2 -2
- package/dist/lib/filter/filter-region.js +3 -10
- package/dist/lib/filter/filter-region.js.map +2 -2
- package/dist/lib/focus/focus-manager.d.ts +8 -1
- package/dist/lib/focus/focus-manager.js +87 -43
- package/dist/lib/focus/focus-manager.js.map +2 -2
- package/dist/lib/focus/geometry.d.ts +2 -0
- package/dist/lib/focus/geometry.js +6 -0
- package/dist/lib/focus/geometry.js.map +2 -2
- package/dist/lib/geometry/path-bend-guide.js +1 -1
- package/dist/lib/geometry/path-bend-guide.js.map +2 -2
- package/dist/lib/geometry/path-geometry.js +12 -11
- package/dist/lib/geometry/path-geometry.js.map +2 -2
- package/dist/lib/geometry/path-transforms.js +17 -21
- package/dist/lib/geometry/path-transforms.js.map +2 -2
- package/dist/lib/geometry/path-warp-bezier.js +3 -1
- package/dist/lib/geometry/path-warp-bezier.js.map +2 -2
- package/dist/lib/geometry/path-warp.js +1 -1
- package/dist/lib/geometry/path-warp.js.map +2 -2
- package/dist/lib/global-state.js +2 -0
- package/dist/lib/global-state.js.map +2 -2
- package/dist/lib/html/html-events.d.ts +32 -0
- package/dist/lib/html/html-events.js +179 -0
- package/dist/lib/html/html-events.js.map +7 -0
- package/dist/lib/html/html-service.d.ts +8 -2
- package/dist/lib/html/html-service.js +198 -65
- package/dist/lib/html/html-service.js.map +2 -2
- package/dist/lib/html/overlay-config.js +7 -6
- package/dist/lib/html/overlay-config.js.map +2 -2
- package/dist/lib/html/types.d.ts +29 -2
- package/dist/lib/layout/absolute.d.ts +11 -5
- package/dist/lib/layout/absolute.js +329 -55
- package/dist/lib/layout/absolute.js.map +3 -3
- package/dist/lib/layout/allocation-checkpoint-owner.d.ts +11 -0
- package/dist/lib/layout/allocation-checkpoint-owner.js +86 -0
- package/dist/lib/layout/allocation-checkpoint-owner.js.map +7 -0
- package/dist/lib/layout/allocation-checkpoint.d.ts +53 -0
- package/dist/lib/layout/allocation-checkpoint.js +463 -0
- package/dist/lib/layout/allocation-checkpoint.js.map +7 -0
- package/dist/lib/layout/allocation-dependencies.d.ts +30 -0
- package/dist/lib/layout/allocation-dependencies.js +90 -0
- package/dist/lib/layout/allocation-dependencies.js.map +7 -0
- package/dist/lib/layout/allocation-revision.d.ts +13 -0
- package/dist/lib/layout/allocation-revision.js +67 -0
- package/dist/lib/layout/allocation-revision.js.map +7 -0
- package/dist/lib/layout/box-insets.d.ts +17 -0
- package/dist/lib/layout/box-insets.js +138 -0
- package/dist/lib/layout/box-insets.js.map +7 -0
- package/dist/lib/layout/box-sizing.d.ts +16 -0
- package/dist/lib/layout/box-sizing.js +77 -0
- package/dist/lib/layout/box-sizing.js.map +7 -0
- package/dist/lib/layout/box.js +42 -12
- package/dist/lib/layout/box.js.map +2 -2
- package/dist/lib/layout/canvas-measurement.d.ts +13 -0
- package/dist/lib/layout/canvas-measurement.js +57 -0
- package/dist/lib/layout/canvas-measurement.js.map +7 -0
- package/dist/lib/layout/context.d.ts +35 -6
- package/dist/lib/layout/context.js +72 -3
- package/dist/lib/layout/context.js.map +2 -2
- package/dist/lib/layout/define-layout-component.d.ts +23 -0
- package/dist/lib/layout/define-layout-component.js +84 -0
- package/dist/lib/layout/define-layout-component.js.map +7 -0
- package/dist/lib/layout/flex-allocation-cache.d.ts +42 -0
- package/dist/lib/layout/flex-baseline-mode.d.ts +2 -0
- package/dist/lib/layout/flex-baseline-mode.js +7 -0
- package/dist/lib/layout/flex-baseline-mode.js.map +7 -0
- package/dist/lib/layout/flex.d.ts +50 -15
- package/dist/lib/layout/flex.js +2124 -195
- package/dist/lib/layout/flex.js.map +3 -3
- package/dist/lib/layout/flow.js +225 -49
- package/dist/lib/layout/flow.js.map +2 -2
- package/dist/lib/layout/geometry-publication.d.ts +53 -0
- package/dist/lib/layout/geometry-publication.js +244 -0
- package/dist/lib/layout/geometry-publication.js.map +7 -0
- package/dist/lib/layout/grid-kernel.d.ts +63 -0
- package/dist/lib/layout/grid-kernel.js +168 -0
- package/dist/lib/layout/grid-kernel.js.map +7 -0
- package/dist/lib/layout/grid.d.ts +63 -4
- package/dist/lib/layout/grid.js +767 -171
- package/dist/lib/layout/grid.js.map +3 -3
- package/dist/lib/layout/measure.d.ts +55 -3
- package/dist/lib/layout/measure.js +448 -15
- package/dist/lib/layout/measure.js.map +2 -2
- package/dist/lib/layout/overlay.js +81 -23
- package/dist/lib/layout/overlay.js.map +2 -2
- package/dist/lib/layout/participation.d.ts +27 -0
- package/dist/lib/layout/participation.js +188 -0
- package/dist/lib/layout/participation.js.map +7 -0
- package/dist/lib/layout/place-child.js +1 -1
- package/dist/lib/layout/place-child.js.map +2 -2
- package/dist/lib/layout/positioning-diagnostics.d.ts +1 -1
- package/dist/lib/layout/positioning-diagnostics.js +13 -2
- package/dist/lib/layout/positioning-diagnostics.js.map +2 -2
- package/dist/lib/layout/prepared-root.d.ts +121 -0
- package/dist/lib/layout/prepared-root.js +360 -0
- package/dist/lib/layout/prepared-root.js.map +7 -0
- package/dist/lib/layout/standalone-kernel.d.ts +60 -0
- package/dist/lib/layout/standalone-kernel.js +722 -0
- package/dist/lib/layout/standalone-kernel.js.map +7 -0
- package/dist/lib/layout/topology.d.ts +21 -0
- package/dist/lib/layout/topology.js +113 -0
- package/dist/lib/layout/topology.js.map +7 -0
- package/dist/lib/layout/types.d.ts +5 -0
- package/dist/lib/layout/wasm/artifact.d.ts +1 -0
- package/dist/lib/layout/wasm/artifact.js +5 -0
- package/dist/lib/layout/wasm/artifact.js.map +7 -0
- package/dist/lib/layout/wasm/bytes.d.ts +1 -0
- package/dist/lib/layout/wasm/bytes.js +5 -0
- package/dist/lib/layout/wasm/bytes.js.map +7 -0
- package/dist/lib/layout/wasm/embedded.d.ts +2 -0
- package/dist/lib/layout/wasm/embedded.js +12 -0
- package/dist/lib/layout/wasm/embedded.js.map +7 -0
- package/dist/lib/layout/wasm/layout.wasm +0 -0
- package/dist/lib/layout/wasm/module.d.ts +8 -0
- package/dist/lib/layout/wasm/module.js +70 -0
- package/dist/lib/layout/wasm/module.js.map +7 -0
- package/dist/lib/layout/wasm/region.d.ts +267 -0
- package/dist/lib/layout/wasm/region.js +1018 -0
- package/dist/lib/layout/wasm/region.js.map +7 -0
- package/dist/lib/manipulation/controller.js +4 -7
- package/dist/lib/manipulation/controller.js.map +2 -2
- package/dist/lib/manipulation/frame.js +1 -1
- package/dist/lib/manipulation/frame.js.map +2 -2
- package/dist/lib/manipulation/handles.js +32 -33
- package/dist/lib/manipulation/handles.js.map +2 -2
- package/dist/lib/manipulation/solve.js +12 -10
- package/dist/lib/manipulation/solve.js.map +2 -2
- package/dist/lib/mount-pibbl.js +1 -0
- package/dist/lib/mount-pibbl.js.map +2 -2
- package/dist/lib/mount-prepared-pibbl.d.ts +5 -0
- package/dist/lib/mount-prepared-pibbl.js +29 -0
- package/dist/lib/mount-prepared-pibbl.js.map +7 -0
- package/dist/lib/mount-request.d.ts +8 -0
- package/dist/lib/mount-request.js +41 -0
- package/dist/lib/mount-request.js.map +7 -0
- package/dist/lib/pibbl.d.ts +21 -13
- package/dist/lib/pibbl.js +18 -16
- package/dist/lib/pibbl.js.map +2 -2
- package/dist/lib/recording/recording.d.ts +43 -0
- package/dist/lib/recording/recording.js +555 -0
- package/dist/lib/recording/recording.js.map +7 -0
- package/dist/lib/recording/types.d.ts +118 -0
- package/dist/lib/recording/wasm-bytes.d.ts +1 -0
- package/dist/lib/recording/wasm-bytes.js +5 -0
- package/dist/lib/recording/wasm-bytes.js.map +7 -0
- package/dist/lib/recording/worker-source.d.ts +1 -0
- package/dist/lib/recording/worker-source.js +5 -0
- package/dist/lib/recording/worker-source.js.map +7 -0
- package/dist/lib/render-layer/controller.d.ts +9 -3
- package/dist/lib/render-layer/controller.js +259 -110
- package/dist/lib/render-layer/controller.js.map +2 -2
- package/dist/lib/render-transaction.d.ts +12 -2
- package/dist/lib/render-transaction.js +69 -1
- package/dist/lib/render-transaction.js.map +2 -2
- package/dist/lib/render.js +32 -8
- package/dist/lib/render.js.map +2 -2
- package/dist/lib/scheduler/realm-scheduler.d.ts +2 -0
- package/dist/lib/scheduler/realm-scheduler.js +55 -26
- package/dist/lib/scheduler/realm-scheduler.js.map +2 -2
- package/dist/lib/scheduler/renderer-participant.js +1 -0
- package/dist/lib/scheduler/renderer-participant.js.map +2 -2
- package/dist/lib/series-inspection-frame.d.ts +18 -0
- package/dist/lib/series-inspection-frame.js +70 -0
- package/dist/lib/series-inspection-frame.js.map +7 -0
- package/dist/lib/signals/edge.d.ts +7 -4
- package/dist/lib/signals/edge.js +25 -3
- package/dist/lib/signals/edge.js.map +2 -2
- package/dist/lib/signals/graph.d.ts +16 -2
- package/dist/lib/signals/graph.js +54 -12
- package/dist/lib/signals/graph.js.map +2 -2
- package/dist/lib/signals/input-provision.d.ts +15 -0
- package/dist/lib/signals/input-provision.js +53 -3
- package/dist/lib/signals/input-provision.js.map +2 -2
- package/dist/lib/signals/render-consumer.d.ts +3 -0
- package/dist/lib/signals/render-consumer.js +22 -14
- package/dist/lib/signals/render-consumer.js.map +2 -2
- package/dist/lib/style/positioning.d.ts +50 -2
- package/dist/lib/style/positioning.js +28 -4
- package/dist/lib/style/positioning.js.map +2 -2
- package/dist/lib/style/resolve-built-in.d.ts +4 -3
- package/dist/lib/style/resolve-built-in.js +17 -3
- package/dist/lib/style/resolve-built-in.js.map +2 -2
- package/dist/lib/style/resolve-dispatch.d.ts +3 -0
- package/dist/lib/style/resolve-dispatch.js +77 -4
- package/dist/lib/style/resolve-dispatch.js.map +2 -2
- package/dist/lib/style/resolve-length.d.ts +2 -0
- package/dist/lib/style/resolve-length.js +13 -9
- package/dist/lib/style/resolve-length.js.map +2 -2
- package/dist/lib/style/sizing-length.d.ts +51 -0
- package/dist/lib/style/sizing-length.js +77 -0
- package/dist/lib/style/sizing-length.js.map +7 -0
- package/dist/lib/style/types.d.ts +63 -25
- package/dist/lib/surface/root-surface.js +10 -6
- package/dist/lib/surface/root-surface.js.map +2 -2
- package/dist/lib/textures/texture.js +10 -8
- package/dist/lib/textures/texture.js.map +2 -2
- package/dist/lib/transitions/capture.js +4 -1
- package/dist/lib/transitions/capture.js.map +2 -2
- package/dist/lib/transitions/embers-physics.js +17 -10
- package/dist/lib/transitions/embers-physics.js.map +2 -2
- package/dist/lib/types.d.ts +110 -1
- package/dist/sync.d.ts +16 -0
- package/dist/sync.js +13 -0
- package/dist/sync.js.map +7 -0
- package/dist/sync.mjs +1 -0
- package/package.json +26 -3
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/lib/focus/focus-manager.ts"],
|
|
4
|
-
"sourcesContent": ["import type { PibblEventTargetRegistration } from \"../events/registrations.js\";\nimport { GLOBAL_STATE } from \"../global-state.js\";\nimport type {\n PibblEvent,\n PibblEventType,\n PibblKeyboardEvent,\n} from \"../events/types.js\";\nimport { Teardowns } from \"../teardowns.js\";\nimport type {\n PibblEventRoot,\n PibblFocusPressDefaultInput,\n PibblFocusTouchDefaultContact,\n PibblFocusTouchDefaultInput,\n PibblFocusPolicyBridge,\n PibblInstance,\n PibblRenderTransaction,\n} from \"../types.js\";\nimport { resolveTargetRootBounds } from \"./geometry.js\";\nimport {\n mountDOMFocusHost,\n type PibblMountedDOMFocusHost,\n} from \"./dom-focus-host.js\";\nimport {\n applyDirectionalNavigationDefault,\n applyKeyboardActivationDefault,\n applyTabDefault,\n} from \"./keyboard-defaults.js\";\nimport { transitionLogicalFocus } from \"./focus-events.js\";\nimport type { HtmlFocusRegion } from \"./html-focus-region.js\";\nimport {\n isHtmlFocusCandidate,\n type PibblDirectionalBoundary,\n type PibblFocusCandidate,\n type PibblHtmlFocusCandidate,\n type PibblNavigationCandidate,\n} from \"./types.js\";\nimport { getManagedTabStops } from \"./dom-tab-stops.js\";\n\nconst UNFOCUSED_SNAPSHOT = Object.freeze({\n isFocused: false,\n isFocusVisible: false,\n});\n\nconst retainedDirectionalBoundaries = new WeakMap<\n PibblEventTargetRegistration,\n DirectionalBoundary\n>();\nconst coordinators = new WeakMap<PibblEventRoot, FocusManagerCoordinator>();\nconst managerOwners = new WeakMap<PibblFocusManager, PibblInstance>();\n\ninterface PendingCandidate {\n readonly target: PibblEventTargetRegistration;\n readonly directionalBoundary: DirectionalBoundary | undefined;\n}\n\ninterface PendingHtmlRegion {\n readonly region: HtmlFocusRegion;\n readonly directionalBoundary: DirectionalBoundary | undefined;\n}\n\ninterface PendingFrame {\n readonly entries: (PendingCandidate | PendingHtmlRegion)[];\n readonly targets: PendingCandidate[];\n readonly htmlRegions: PendingHtmlRegion[];\n readonly observedTargets: Set<PibblEventTargetRegistration>;\n readonly observedHtmlRegions: Set<HtmlFocusRegion>;\n readonly ineligibleTargets: Set<PibblEventTargetRegistration>;\n readonly boundaries: Set<DirectionalBoundary>;\n}\n\ninterface RepresentedPress {\n readonly x: number;\n readonly y: number;\n readonly timeStamp: number;\n}\n\ninterface RepresentedPointerPress extends RepresentedPress {\n suppressMouse: boolean;\n suppressTouch: boolean;\n}\n\nconst COMPATIBILITY_PRESS_WINDOW_MS = 1_500;\n\nclass DirectionalBoundary implements PibblDirectionalBoundary {\n private committedCandidates: readonly PibblNavigationCandidate[] =\n Object.freeze([]);\n\n constructor(readonly owner: PibblInstance) {}\n\n get candidates(): readonly PibblNavigationCandidate[] {\n return this.committedCandidates;\n }\n\n commit(candidates: readonly PibblNavigationCandidate[]): void {\n this.committedCandidates = candidates;\n }\n}\n\ninterface FocusTransactionState {\n readonly prior: PibblFocusManager | undefined;\n readonly replayedManagers: Set<PibblFocusManager>;\n prepared: PibblFocusManager | undefined;\n claimed: PibblFocusManager | undefined;\n finished: boolean;\n restored: PibblFocusManager | undefined;\n}\n\nclass FocusManagerCoordinator {\n private readonly managers = new Set<PibblFocusManager>();\n private readonly transactions = new WeakMap<\n PibblRenderTransaction,\n FocusTransactionState\n >();\n private active: PibblFocusManager | undefined;\n private domFocusHost: PibblMountedDOMFocusHost | undefined;\n private domFocusHostTeardowns: Teardowns | undefined;\n private disposed = false;\n\n constructor(private readonly eventRoot: PibblEventRoot) {\n eventRoot.rootInstance?.mainTeardowns.add(() => this.dispose());\n }\n\n add(manager: PibblFocusManager): void {\n if (this.disposed) {\n throw new Error(\"Pibbl focus manager root is disposed.\");\n }\n this.ensureDOMFocusHost();\n this.managers.add(manager);\n const transaction = this.eventRoot.renderTransaction;\n if (transaction) {\n const state = this.stateFor(transaction);\n state.prepared = manager;\n // Reconciliation mounts every descriptor before declaration-order entry.\n // Expose that transaction-local manager so a same-element directional\n // descriptor can enter first without making the claim permanent.\n this.eventRoot.focusPolicy = manager;\n }\n }\n\n claim(manager: PibblFocusManager): void {\n const transaction = this.eventRoot.renderTransaction;\n if (!transaction) {\n if (this.active && this.active !== manager) {\n throw duplicateManagerError();\n }\n this.setActive(manager);\n return;\n }\n\n const state = this.stateFor(transaction);\n if (state.claimed && state.claimed !== manager) {\n throw duplicateManagerError();\n }\n state.claimed = manager;\n this.eventRoot.focusPolicy = manager;\n }\n\n beforeNativeDispatch(\n type: PibblEventType,\n event: Event,\n ): PibblFocusManager | undefined {\n const manager = this.active;\n const routeLogicalEvent =\n this.domFocusHost?.beforeNativeDispatch(type, event) ?? true;\n return routeLogicalEvent && manager && !manager.isDestroyed\n ? manager\n : undefined;\n }\n\n syncDOMFocusHost(manager: PibblFocusManager): void {\n if (this.active === manager) {\n this.domFocusHost?.syncCandidateAvailability(manager.hasFocusCandidates);\n this.domFocusHost?.syncHtmlRegions(manager.htmlFocusRegions);\n }\n }\n\n focusCanvasFromPress(manager: PibblFocusManager): void {\n if (this.active === manager) this.domFocusHost?.focusFromPress();\n }\n\n claimRetainedManagers(instance: PibblInstance): readonly PibblFocusManager[] {\n const retained = Array.from(this.managers).filter((manager) => {\n const owner = managerOwners.get(manager);\n return (\n !manager.isDestroyed &&\n !manager.ownerWasReleased &&\n owner !== undefined &&\n isInstanceWithin(owner, instance)\n );\n });\n const transaction = this.eventRoot.renderTransaction;\n if (!transaction) {\n for (const manager of retained) this.claim(manager);\n return retained;\n }\n\n const state = this.stateFor(transaction);\n for (const manager of retained) {\n if (state.replayedManagers.has(manager)) continue;\n state.replayedManagers.add(manager);\n this.claim(manager);\n }\n return retained;\n }\n\n release(manager: PibblFocusManager): void {\n if (manager.isDestroyed) return;\n manager.markOwnerReleased();\n const transaction = this.eventRoot.renderTransaction;\n if (transaction) {\n const state = this.stateFor(transaction);\n if (!state.finished) return;\n }\n if (this.active === manager) {\n this.setActive(undefined);\n }\n this.destroy(manager);\n }\n\n private stateFor(transaction: PibblRenderTransaction): FocusTransactionState {\n const existing = this.transactions.get(transaction);\n if (existing) return existing;\n const state: FocusTransactionState = {\n prior: this.active,\n replayedManagers: new Set(),\n prepared: undefined,\n claimed: undefined,\n finished: false,\n restored: undefined,\n };\n this.transactions.set(transaction, state);\n transaction.onFinish((success) => this.finishTransaction(state, success));\n return state;\n }\n\n private finishTransaction(\n state: FocusTransactionState,\n success: boolean,\n ): void {\n if (state.finished) return;\n state.finished = true;\n if (success) {\n if (state.claimed) {\n this.active = state.claimed;\n } else if (this.active?.ownerWasReleased) {\n this.active = undefined;\n }\n this.eventRoot.focusPolicy = this.active;\n for (const manager of Array.from(this.managers)) {\n if (manager !== this.active && manager.ownerWasReleased) {\n this.destroy(manager);\n }\n }\n this.domFocusHost?.setManager(this.active);\n return;\n }\n\n const attemptedReplacement =\n (state.claimed && state.claimed !== state.prior) ||\n (state.prepared && state.prepared !== state.prior);\n const restored =\n state.prior && attemptedReplacement && !state.prior.isDestroyed\n ? state.prior\n : undefined;\n state.restored = restored;\n this.active = restored;\n this.eventRoot.focusPolicy = restored;\n for (const manager of Array.from(this.managers)) {\n if (manager !== restored) this.destroy(manager);\n }\n this.domFocusHost?.setManager(restored);\n }\n\n private destroy(manager: PibblFocusManager): void {\n this.managers.delete(manager);\n manager.destroyFromCoordinator();\n if (this.managers.size === 0) this.disposeDOMFocusHost();\n }\n\n private ensureDOMFocusHost(): void {\n if (this.domFocusHost) return;\n const canvas = this.eventRoot.canvas;\n if (!canvas) {\n throw new Error(\n \"FocusManagement requires an HTMLCanvasElement root; an OffscreenCanvas has no DOM focus host.\",\n );\n }\n const teardowns = new Teardowns();\n try {\n this.domFocusHost = mountDOMFocusHost(canvas, this.eventRoot, teardowns);\n this.domFocusHostTeardowns = teardowns;\n } catch (error) {\n teardowns.execute();\n throw error;\n }\n }\n\n private disposeDOMFocusHost(): void {\n this.domFocusHost = undefined;\n this.domFocusHostTeardowns?.execute();\n this.domFocusHostTeardowns = undefined;\n }\n\n private setActive(manager: PibblFocusManager | undefined): void {\n this.active = manager;\n this.eventRoot.focusPolicy = manager;\n this.domFocusHost?.setManager(manager);\n }\n\n private dispose(): void {\n if (this.disposed) return;\n this.disposed = true;\n this.active = undefined;\n this.eventRoot.focusPolicy = undefined;\n for (const manager of Array.from(this.managers)) this.destroy(manager);\n this.disposeDOMFocusHost();\n }\n}\n\nexport class PibblFocusManager implements PibblFocusPolicyBridge {\n private committedCandidates: readonly PibblFocusCandidate[] = Object.freeze([]);\n private committedHtmlCandidates: readonly PibblHtmlFocusCandidate[] =\n Object.freeze([]);\n private committedNavigationCandidates: readonly PibblNavigationCandidate[] =\n Object.freeze([]);\n private committedBoundaries = new Set<DirectionalBoundary>();\n private pending: PendingFrame | undefined;\n private transactionalPending:\n | {\n readonly transaction: PibblRenderTransaction;\n readonly frame: PendingFrame;\n }\n | undefined;\n private directionalStack: DirectionalBoundary[] = [];\n private focusedTarget: PibblEventTargetRegistration | undefined;\n private focusedHtmlRegion: HtmlFocusRegion | undefined;\n private pendingHtmlFocusModality: \"keyboard\" | \"pointer\" | undefined;\n private focusVisible = false;\n private pendingSpaceTarget: PibblEventTargetRegistration | undefined;\n private pendingPressFocus:\n { readonly target: PibblEventTargetRegistration | undefined } | undefined;\n private readonly representedPointerPresses = new Map<\n number,\n RepresentedPointerPress\n >();\n private readonly representedTouchContacts = new Map<\n number,\n RepresentedPress\n >();\n private activeTouchIdentifiers = new Set<number>();\n private primaryTouchIdentifier: number | undefined;\n private touchSequenceActive = false;\n private touchMouseCompatibility: RepresentedPress | undefined;\n private focusRenderRevision = 0;\n private readonly layerFocusRenderRevisions = new WeakMap<\n PibblInstance,\n number\n >();\n private destroyed = false;\n private ownerReleased = false;\n private readonly coordinator: FocusManagerCoordinator;\n\n constructor(\n private readonly eventRoot: PibblEventRoot,\n owner: PibblInstance,\n ) {\n const canvas = eventRoot.canvas;\n if (!canvas) {\n throw new Error(\n \"FocusManagement requires an HTMLCanvasElement root; an OffscreenCanvas has no DOM focus host.\",\n );\n }\n managerOwners.set(this, owner);\n this.coordinator = getCoordinator(eventRoot);\n try {\n this.coordinator.add(this);\n } catch (error) {\n managerOwners.delete(this);\n throw error;\n }\n }\n\n get candidates(): readonly PibblFocusCandidate[] {\n return this.committedCandidates;\n }\n\n /** @internal Full source-order list including native HtmlBox regions. */\n get navigationCandidates(): readonly PibblNavigationCandidate[] {\n return this.committedNavigationCandidates;\n }\n\n get htmlFocusRegions(): readonly HtmlFocusRegion[] {\n return this.committedHtmlCandidates.map((candidate) => candidate.region);\n }\n\n get focusedNavigationCandidate(): PibblNavigationCandidate | undefined {\n if (this.focusedHtmlRegion) {\n return this.committedHtmlCandidates.find(\n (candidate) => candidate.region === this.focusedHtmlRegion,\n );\n }\n return this.focusedTarget\n ? this.committedCandidates.find(\n (candidate) => candidate.target === this.focusedTarget,\n )\n : undefined;\n }\n\n /** @internal Resolves dynamic native eligibility at each navigation boundary. */\n isNavigationCandidateFocusable(candidate: PibblNavigationCandidate): boolean {\n return isHtmlFocusCandidate(candidate)\n ? Boolean(\n candidate.region.active &&\n candidate.region.content &&\n getManagedTabStops(candidate.region.content).length,\n )\n : Boolean(this.liveFocusCandidate(candidate.target));\n }\n\n /** Includes a successful render's collected candidates before commit callbacks settle. */\n get hasFocusCandidates(): boolean {\n return (\n this.committedNavigationCandidates.length > 0 ||\n (this.transactionalPending?.frame.targets.length ?? 0) +\n (this.transactionalPending?.frame.htmlRegions.length ?? 0) >\n 0\n );\n }\n\n get isDestroyed(): boolean {\n return this.destroyed;\n }\n\n get ownerWasReleased(): boolean {\n return this.ownerReleased;\n }\n\n get canvas(): HTMLCanvasElement {\n const canvas = this.eventRoot.canvas;\n if (!canvas) throw new Error(\"Pibbl focus manager has no DOM Canvas host.\");\n return canvas;\n }\n\n get logicalFocusTarget(): PibblEventTargetRegistration | undefined {\n return this.focusedTarget;\n }\n\n get logicalFocusVisible(): boolean {\n return this.focusVisible;\n }\n\n beginCollection(): void {\n this.assertLive();\n if (this.pending) {\n throw new Error(\"FocusManagement cannot enter twice on one Pibbl root.\");\n }\n this.coordinator.claim(this);\n this.pending = {\n entries: [],\n targets: [],\n htmlRegions: [],\n observedTargets: new Set(),\n observedHtmlRegions: new Set(),\n ineligibleTargets: new Set(),\n boundaries: new Set(this.directionalStack),\n };\n }\n\n finishCollection(success: boolean): void {\n const pending = this.pending;\n this.pending = undefined;\n if (!pending || !success || this.destroyed) return;\n\n const transaction = this.eventRoot.renderTransaction;\n if (transaction) {\n this.transactionalPending = { transaction, frame: pending };\n transaction.onFinish((transactionSucceeded) => {\n if (this.transactionalPending?.transaction === transaction) {\n this.transactionalPending = undefined;\n }\n if (transactionSucceeded && !this.destroyed) {\n this.commitCollection(pending);\n }\n });\n return;\n }\n\n this.commitCollection(pending);\n }\n\n private commitCollection(pending: PendingFrame): void {\n const collected: PibblNavigationCandidate[] = [];\n for (const [sourceIndex, observed] of pending.entries.entries()) {\n if (\"target\" in observed) {\n const target = observed.target;\n collected.push(\n Object.freeze({\n target,\n sourceIndex,\n directionalBoundary: observed.directionalBoundary,\n rootBounds: resolveTargetRootBounds(target),\n }) satisfies PibblFocusCandidate,\n );\n continue;\n }\n const region = observed.region;\n if (region.active && region.content)\n collected.push(\n Object.freeze({\n region,\n sourceIndex,\n directionalBoundary: observed.directionalBoundary,\n rootBounds: region.rootBounds,\n }) satisfies PibblHtmlFocusCandidate,\n );\n }\n const navigation = Object.freeze(collected);\n this.commitNavigationCandidates(navigation, pending.boundaries);\n const candidates = navigation.filter(\n (candidate): candidate is PibblFocusCandidate =>\n !isHtmlFocusCandidate(candidate),\n );\n for (const candidate of candidates) {\n if (candidate.directionalBoundary) {\n retainedDirectionalBoundaries.set(\n candidate.target,\n asDirectionalBoundary(candidate.directionalBoundary),\n );\n } else {\n retainedDirectionalBoundaries.delete(candidate.target);\n }\n }\n }\n\n observeTarget(target: PibblEventTargetRegistration): void {\n const pending = this.pending;\n if (!pending) return;\n if (this.pendingSpaceTarget === target && !target.handlers.click) {\n this.cancelSpaceActivation();\n }\n if (!isKeyboardFocusable(target)) {\n this.markPendingIneligible(target);\n return;\n }\n pending.ineligibleTargets.delete(target);\n this.recordPendingTarget(target, this.currentDirectionalBoundary());\n }\n\n /** @internal Collects one published HtmlBox in source order. */\n observeHtmlRegion(region: HtmlFocusRegion): void {\n const pending = this.pending;\n if (!pending || pending.observedHtmlRegions.has(region)) return;\n pending.observedHtmlRegions.add(region);\n const observed = {\n region,\n directionalBoundary: this.currentDirectionalBoundary(),\n };\n pending.htmlRegions.push(observed);\n pending.entries.push(observed);\n }\n\n /** @internal Removes an unmounted HtmlBox without manufacturing a Canvas target. */\n removeHtmlFocusRegion(region: HtmlFocusRegion): void {\n if (this.pending?.observedHtmlRegions.delete(region)) {\n this.pending.htmlRegions.splice(\n this.pending.htmlRegions.findIndex((entry) => entry.region === region),\n 1,\n );\n const index = this.pending.entries.findIndex(\n (entry) => \"region\" in entry && entry.region === region,\n );\n if (index >= 0) this.pending.entries.splice(index, 1);\n return;\n }\n if (\n !this.committedHtmlCandidates.some(\n (candidate) => candidate.region === region,\n )\n )\n return;\n const wasFocused = this.focusedHtmlRegion === region;\n const canvas = this.eventRoot.canvas;\n const shouldReturnNativeFocus = Boolean(\n wasFocused &&\n canvas &&\n !this.eventRoot.rootInstance?.mainTeardowns.closed &&\n region.content?.contains(canvas.ownerDocument.activeElement),\n );\n this.commitNavigationCandidates(\n this.committedNavigationCandidates.filter(\n (candidate) =>\n !isHtmlFocusCandidate(candidate) || candidate.region !== region,\n ),\n this.committedBoundaries,\n );\n if (shouldReturnNativeFocus && canvas) {\n this.coordinator.focusCanvasFromPress(this);\n // Canvas focus synchronously enters the ordinary DOM host. A retired\n // region must leave no logical selection behind that would turn this\n // removal into an unintended navigation action.\n this.clearFocusState();\n }\n if (wasFocused) this.clearHtmlFocus(region);\n }\n\n /** @internal Deactivates retained DOM hosts while the root has no display area. */\n suspendHtmlRegions(): void {\n if (this.committedHtmlCandidates.length === 0) return;\n const focused = this.focusedHtmlRegion;\n const canvas = this.eventRoot.canvas;\n const shouldReturnNativeFocus = Boolean(\n focused &&\n canvas &&\n !this.eventRoot.rootInstance?.mainTeardowns.closed &&\n focused.content?.contains(canvas.ownerDocument.activeElement),\n );\n this.commitNavigationCandidates(\n this.committedNavigationCandidates.filter(\n (candidate) => !isHtmlFocusCandidate(candidate),\n ),\n this.committedBoundaries,\n );\n if (shouldReturnNativeFocus && canvas) {\n this.coordinator.focusCanvasFromPress(this);\n this.clearFocusState();\n }\n if (focused) this.clearHtmlFocus(focused);\n }\n\n observeTransactionalTarget(target: PibblEventTargetRegistration): void {\n const transactional = this.transactionalPending;\n if (\n !transactional ||\n transactional.transaction !== this.eventRoot.renderTransaction\n )\n return;\n const pending = transactional.frame;\n if (this.pendingSpaceTarget === target && !target.handlers.click) {\n this.cancelSpaceActivation();\n }\n if (!isKeyboardFocusable(target)) {\n pending.ineligibleTargets.add(target);\n const index = pending.targets.findIndex(\n (candidate) => candidate.target === target,\n );\n if (index !== -1) pending.targets.splice(index, 1);\n const entryIndex = pending.entries.findIndex(\n (entry) => \"target\" in entry && entry.target === target,\n );\n if (entryIndex !== -1) pending.entries.splice(entryIndex, 1);\n pending.observedTargets.delete(target);\n return;\n }\n pending.ineligibleTargets.delete(target);\n if (pending.observedTargets.has(target)) return;\n pending.observedTargets.add(target);\n const observed = {\n target,\n directionalBoundary: this.currentDirectionalBoundary(),\n };\n pending.targets.push(observed);\n pending.entries.push(observed);\n }\n\n removeTarget(target: PibblEventTargetRegistration): void {\n if (this.pendingSpaceTarget === target) this.cancelSpaceActivation();\n if (this.pending) {\n this.markPendingIneligible(target);\n return;\n }\n if (\n !this.committedCandidates.some((candidate) => candidate.target === target)\n ) {\n if (this.focusedTarget === target) this.clearFocusState();\n return;\n }\n this.commitRemovedTarget(target);\n }\n\n snapshot(target: PibblEventTargetRegistration) {\n if (\n this.ownerReleased ||\n this.pending?.ineligibleTargets.has(target) ||\n target !== this.focusedTarget\n ) {\n return UNFOCUSED_SNAPSHOT;\n }\n return Object.freeze({\n isFocused: true,\n isFocusVisible: this.focusVisible,\n });\n }\n\n resolveKeyboardTarget(): PibblEventTargetRegistration | undefined {\n const target = this.focusedTarget;\n if (target && this.pending?.ineligibleTargets.has(target)) return undefined;\n return target &&\n this.committedCandidates.some((candidate) => candidate.target === target)\n ? target\n : undefined;\n }\n\n afterDispatch(event: PibblEvent): void {\n if (event.type === \"keydown\") {\n applyTabDefault(this, event as PibblKeyboardEvent);\n }\n if (event.type === \"keydown\" || event.type === \"keyup\") {\n applyKeyboardActivationDefault(this, event as PibblKeyboardEvent);\n }\n if (event.type === \"keydown\") {\n applyDirectionalNavigationDefault(this, event as PibblKeyboardEvent);\n }\n }\n\n afterPressDispatch(input: PibblFocusPressDefaultInput): void {\n if (this.destroyed) return;\n this.purgeExpiredPresses(input.originalEvent.timeStamp);\n switch (input.source) {\n case \"pointer\":\n this.recordPointerPress(input);\n if (!pressWasPrevented(input)) this.applyPressFocus(input.target);\n return;\n case \"mouse\":\n if (this.consumeRepresentedMousePress(input)) return;\n if (!pressWasPrevented(input)) this.applyPressFocus(input.target);\n return;\n case \"touch\":\n if (this.consumeRepresentedTouchPress(input)) return;\n this.recordTouchFallback(input);\n if (!pressWasPrevented(input)) this.applyPressFocus(input.target);\n return;\n }\n }\n\n afterTouchDispatch(input: PibblFocusTouchDefaultInput): void {\n if (this.destroyed) return;\n this.purgeExpiredPresses(input.originalEvent.timeStamp);\n this.reconcileTouchContacts(input);\n if (input.type === \"touchstart\") {\n const primary = this.recordTouchStarts(input);\n if (!primary) return;\n this.afterPressDispatch({\n source: \"touch\",\n target: primary.target,\n event: undefined,\n originalEvent: input.originalEvent,\n x: primary.x,\n y: primary.y,\n touchIdentifier: primary.identifier,\n });\n return;\n }\n if (input.type === \"touchend\" || input.type === \"touchcancel\") {\n this.recordTouchTerminals(input);\n }\n }\n\n beforeNativeDispatch(\n type: PibblEventType,\n event: Event,\n ): PibblFocusManager | undefined {\n return this.coordinator.beforeNativeDispatch(type, event);\n }\n\n enterDOMFocus(backwards: boolean): void {\n if (this.destroyed) return;\n const pendingPress = this.pendingPressFocus;\n if (pendingPress) {\n this.pendingPressFocus = undefined;\n transitionLogicalFocus(\n this,\n this.liveFocusCandidate(pendingPress.target),\n \"pointer\",\n );\n return;\n }\n const candidates = backwards\n ? [...this.committedNavigationCandidates].reverse()\n : this.committedNavigationCandidates;\n for (const candidate of candidates) {\n if (this.focusNavigationCandidate(candidate, \"keyboard\", backwards))\n return;\n }\n }\n\n leaveDOMFocus(): void {\n if (this.destroyed) return;\n this.pendingPressFocus = undefined;\n transitionLogicalFocus(this, undefined, \"keyboard\");\n }\n\n activateDOMHost(): void {\n if (!this.destroyed) this.coordinator.syncDOMFocusHost(this);\n }\n\n focusNavigationCandidate(\n candidate: PibblNavigationCandidate | undefined,\n modality: \"keyboard\" | \"pointer\",\n backwards = false,\n ): boolean {\n if (!candidate) return false;\n if (!isHtmlFocusCandidate(candidate)) {\n this.focusedHtmlRegion && this.clearHtmlFocus(this.focusedHtmlRegion);\n transitionLogicalFocus(\n this,\n this.liveFocusCandidate(candidate.target),\n modality,\n );\n return true;\n }\n const region = candidate.region;\n const content = region.active ? region.content : undefined;\n const stops = content ? getManagedTabStops(content) : [];\n const destination = backwards ? stops.at(-1) : stops[0];\n if (!destination) return false;\n if (this.focusedTarget) transitionLogicalFocus(this, undefined, modality);\n this.adoptHtmlFocus(region, modality);\n this.pendingHtmlFocusModality = modality;\n destination.focus({ preventScroll: true });\n this.pendingHtmlFocusModality = undefined;\n return true;\n }\n\n /** @internal Called by the native region listeners after the browser focuses a descendant. */\n adoptNativeHtmlFocus(\n region: HtmlFocusRegion,\n modality: \"keyboard\" | \"pointer\" | undefined,\n ): void {\n if (\n !this.committedHtmlCandidates.some(\n (candidate) => candidate.region === region,\n )\n )\n return;\n const carriedModality =\n modality ?? (this.focusVisible ? \"keyboard\" : \"pointer\");\n if (this.focusedTarget)\n transitionLogicalFocus(this, undefined, carriedModality);\n this.adoptHtmlFocus(\n region,\n this.pendingHtmlFocusModality ?? carriedModality,\n );\n }\n\n /** @internal Native blur settled outside a registered host. */\n clearNativeHtmlFocus(region: HtmlFocusRegion): void {\n if (this.focusedHtmlRegion === region) this.clearHtmlFocus(region);\n }\n\n /** @internal Reconciles a committed host list with the browser focus owner. */\n reconcileNativeHtmlFocus(region: HtmlFocusRegion | undefined): void {\n if (region) {\n this.adoptNativeHtmlFocus(region, undefined);\n } else if (this.focusedHtmlRegion) {\n this.clearHtmlFocus(this.focusedHtmlRegion);\n }\n }\n\n replayRetainedSubtree(instance: PibblInstance): void {\n const retainedManagers = this.coordinator.claimRetainedManagers(instance);\n const replayManager =\n retainedManagers.length === 1 ? retainedManagers[0] : this;\n replayManager.replayRetainedTargets(instance);\n }\n\n layerFocusRenderRevision(instance: PibblInstance): number | undefined {\n return this.ownerReleased\n ? undefined\n : this.layerFocusRenderRevisions.get(instance);\n }\n\n private replayRetainedTargets(instance: PibblInstance): void {\n // A cached Layer must replay the exact mixed source sequence from its last\n // successful render. Enumerating eventRoot.targets would lose HtmlBox\n // positions because native regions intentionally have no event target.\n const retained = this.committedNavigationCandidates.filter((candidate) =>\n isHtmlFocusCandidate(candidate)\n ? isInstanceWithin(candidate.region.owner, instance)\n : isInstanceWithin(candidate.target.owner, instance),\n );\n // Preserve the established Canvas-only replay behavior. A Canvas target\n // registration can be refreshed independently of its original collection\n // position; the mixed sequence is required only once native regions exist.\n if (!retained.some(isHtmlFocusCandidate)) {\n this.replayCanvasOnlyTargets(instance);\n return;\n }\n if (this.pending) {\n for (const candidate of retained) {\n const retainedBoundary = isHtmlFocusCandidate(candidate)\n ? candidate.directionalBoundary instanceof DirectionalBoundary &&\n isInstanceWithin(candidate.directionalBoundary.owner, instance)\n ? candidate.directionalBoundary\n : undefined\n : retainedDirectionalBoundaries.get(candidate.target);\n const directionalBoundary =\n retainedBoundary && isInstanceWithin(retainedBoundary.owner, instance)\n ? retainedBoundary\n : this.currentDirectionalBoundary();\n if (directionalBoundary) {\n this.pending.boundaries.add(directionalBoundary);\n }\n if (isHtmlFocusCandidate(candidate)) {\n const region = candidate.region;\n if (!region.active || !region.content) continue;\n if (!this.pending.observedHtmlRegions.has(region)) {\n this.pending.observedHtmlRegions.add(region);\n const observed = { region, directionalBoundary };\n this.pending.htmlRegions.push(observed);\n this.pending.entries.push(observed);\n }\n } else if (isKeyboardFocusable(candidate.target)) {\n this.recordPendingTarget(candidate.target, directionalBoundary);\n } else {\n this.markPendingIneligible(candidate.target);\n }\n }\n return;\n }\n\n if (retained.length === 0) return;\n const replayed = new Set(retained);\n const candidates = Object.freeze(\n this.committedNavigationCandidates.map((candidate) => {\n if (!replayed.has(candidate)) return candidate;\n return isHtmlFocusCandidate(candidate)\n ? Object.freeze({\n ...candidate,\n rootBounds: candidate.region.rootBounds,\n })\n : Object.freeze({\n ...candidate,\n rootBounds: resolveTargetRootBounds(candidate.target),\n });\n }),\n );\n this.commitNavigationCandidates(candidates, this.committedBoundaries);\n }\n\n private replayCanvasOnlyTargets(instance: PibblInstance): void {\n const targets: PibblEventTargetRegistration[] = [];\n collectRetainedTargets(instance, targets);\n if (this.pending) {\n for (const target of targets) {\n if (!isKeyboardFocusable(target)) {\n this.markPendingIneligible(target);\n continue;\n }\n const retainedBoundary = retainedDirectionalBoundaries.get(target);\n const directionalBoundary =\n retainedBoundary && isInstanceWithin(retainedBoundary.owner, instance)\n ? retainedBoundary\n : this.currentDirectionalBoundary();\n if (directionalBoundary)\n this.pending.boundaries.add(directionalBoundary);\n this.recordPendingTarget(target, directionalBoundary);\n }\n return;\n }\n const replayed = new Set(targets);\n if (\n !this.committedCandidates.some((candidate) =>\n replayed.has(candidate.target),\n )\n )\n return;\n const candidates = Object.freeze(\n this.committedCandidates.map((candidate) =>\n replayed.has(candidate.target)\n ? Object.freeze({\n ...candidate,\n rootBounds: resolveTargetRootBounds(candidate.target),\n })\n : candidate,\n ),\n );\n this.commitCandidates(candidates, this.committedBoundaries);\n }\n\n setFocusState(\n target: PibblEventTargetRegistration | undefined,\n focusVisible: boolean,\n ): void {\n if (\n target &&\n !this.committedCandidates.some((candidate) => candidate.target === target)\n ) {\n throw new Error(\n \"Pibbl logical focus target is not a live focus candidate.\",\n );\n }\n this.commitLogicalFocus(target, focusVisible);\n }\n\n liveFocusCandidate(\n target: PibblEventTargetRegistration | undefined,\n ): PibblEventTargetRegistration | undefined {\n return target?.live &&\n target.owner.eventRoot === this.eventRoot &&\n this.committedCandidates.some((candidate) => candidate.target === target)\n ? target\n : undefined;\n }\n\n commitLogicalFocus(\n target: PibblEventTargetRegistration | undefined,\n focusVisible: boolean,\n ): void {\n const nextFocusVisible = Boolean(target && focusVisible);\n if (\n target === this.focusedTarget &&\n nextFocusVisible === this.focusVisible\n ) {\n return;\n }\n const previous = this.focusedTarget;\n if (this.focusedTarget !== target) this.cancelSpaceActivation();\n this.focusedTarget = target;\n this.focusVisible = nextFocusVisible;\n const revision = ++this.focusRenderRevision;\n this.markFocusRenderLayers(previous, revision);\n this.markFocusRenderLayers(target, revision);\n }\n\n enterDirectionalBoundary(boundary: PibblDirectionalBoundary): void {\n const value = asDirectionalBoundary(boundary);\n this.directionalStack.push(value);\n this.pending?.boundaries.add(value);\n }\n\n exitDirectionalBoundary(boundary: PibblDirectionalBoundary): void {\n const value = asDirectionalBoundary(boundary);\n if (this.directionalStack.at(-1) !== value) {\n throw new Error(\"Pibbl directional boundary scope exited out of order.\");\n }\n this.directionalStack.pop();\n }\n\n private currentDirectionalBoundary(): DirectionalBoundary | undefined {\n return this.directionalStack.at(-1);\n }\n\n private markFocusRenderLayers(\n target: PibblEventTargetRegistration | undefined,\n revision: number,\n ): void {\n let instance = target?.owner;\n while (instance && instance !== this.eventRoot.rootInstance) {\n this.layerFocusRenderRevisions.set(instance, revision);\n instance = instance.parent\n ? GLOBAL_STATE.pibblInstances.get(instance.parent)\n : undefined;\n }\n }\n\n dispose(): void {\n if (this.ownerReleased || this.destroyed) return;\n this.coordinator.release(this);\n }\n\n markOwnerReleased(): void {\n this.ownerReleased = true;\n }\n\n destroyFromCoordinator(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n managerOwners.delete(this);\n this.pending = undefined;\n this.directionalStack = [];\n this.pendingPressFocus = undefined;\n this.cancelSpaceActivation();\n this.representedPointerPresses.clear();\n this.representedTouchContacts.clear();\n this.activeTouchIdentifiers.clear();\n this.primaryTouchIdentifier = undefined;\n this.touchSequenceActive = false;\n this.touchMouseCompatibility = undefined;\n for (const boundary of this.committedBoundaries) {\n boundary.commit(Object.freeze([]));\n }\n this.committedBoundaries.clear();\n this.committedCandidates = Object.freeze([]);\n this.clearFocusState();\n }\n\n private recordPendingTarget(\n target: PibblEventTargetRegistration,\n directionalBoundary: DirectionalBoundary | undefined,\n ): void {\n const pending = this.pending;\n if (!pending || pending.observedTargets.has(target)) return;\n pending.observedTargets.add(target);\n const observed = { target, directionalBoundary };\n pending.targets.push(observed);\n pending.entries.push(observed);\n }\n\n private markPendingIneligible(target: PibblEventTargetRegistration): void {\n const pending = this.pending;\n if (!pending) return;\n pending.ineligibleTargets.add(target);\n if (!pending.observedTargets.delete(target)) return;\n for (let index = pending.targets.length - 1; index >= 0; index--) {\n if (pending.targets[index].target === target) {\n pending.targets.splice(index, 1);\n }\n }\n for (let index = pending.entries.length - 1; index >= 0; index--) {\n const entry = pending.entries[index];\n if (\"target\" in entry && entry.target === target)\n pending.entries.splice(index, 1);\n }\n }\n\n private commitCandidates(\n candidates: readonly PibblFocusCandidate[],\n boundaries: ReadonlySet<DirectionalBoundary>,\n ): void {\n const canvasByTarget = new Map(\n candidates.map((candidate) => [candidate.target, candidate]),\n );\n const navigation = this.committedNavigationCandidates\n .map((candidate) =>\n isHtmlFocusCandidate(candidate)\n ? candidate\n : (canvasByTarget.get(candidate.target) ?? candidate),\n )\n .filter(\n (candidate) =>\n isHtmlFocusCandidate(candidate) ||\n candidates.some((canvas) => canvas.target === candidate.target),\n );\n if (navigation.length === 0 && candidates.length > 0)\n navigation.push(...candidates);\n this.commitNavigationCandidates(Object.freeze(navigation), boundaries);\n }\n\n private commitNavigationCandidates(\n candidates: readonly PibblNavigationCandidate[],\n boundaries: ReadonlySet<DirectionalBoundary>,\n ): void {\n const pendingByBoundary = new Map<\n DirectionalBoundary,\n PibblNavigationCandidate[]\n >();\n for (const boundary of boundaries) pendingByBoundary.set(boundary, []);\n for (const candidate of candidates) {\n if (candidate.directionalBoundary instanceof DirectionalBoundary) {\n pendingByBoundary.get(candidate.directionalBoundary)?.push(candidate);\n }\n }\n\n // Freeze every replacement before exposing any one of them. Candidate\n // collection failures therefore leave every committed direct list intact.\n const committedByBoundary = new Map<\n DirectionalBoundary,\n readonly PibblNavigationCandidate[]\n >();\n for (const [boundary, directCandidates] of pendingByBoundary) {\n committedByBoundary.set(boundary, Object.freeze(directCandidates));\n }\n\n for (const boundary of this.committedBoundaries) {\n if (!committedByBoundary.has(boundary)) {\n boundary.commit(Object.freeze([]));\n }\n }\n for (const [boundary, directCandidates] of committedByBoundary) {\n boundary.commit(directCandidates);\n }\n this.committedBoundaries = new Set(committedByBoundary.keys());\n this.committedNavigationCandidates = candidates;\n this.committedCandidates = Object.freeze(\n candidates.filter(\n (candidate): candidate is PibblFocusCandidate =>\n !isHtmlFocusCandidate(candidate),\n ),\n );\n this.committedHtmlCandidates = Object.freeze(\n candidates.filter((candidate): candidate is PibblHtmlFocusCandidate =>\n isHtmlFocusCandidate(candidate),\n ),\n );\n if (\n this.focusedTarget &&\n !candidates.some(\n (candidate) =>\n !isHtmlFocusCandidate(candidate) &&\n candidate.target === this.focusedTarget,\n )\n ) {\n this.clearFocusState();\n }\n if (\n this.focusedHtmlRegion &&\n !this.committedHtmlCandidates.some(\n (candidate) => candidate.region === this.focusedHtmlRegion,\n )\n )\n this.clearHtmlFocus(this.focusedHtmlRegion);\n this.activateDOMHost();\n }\n\n private commitRemovedTarget(target: PibblEventTargetRegistration): void {\n const retained = this.committedCandidates.filter(\n (candidate) => candidate.target !== target,\n );\n const candidates = Object.freeze(\n retained.map((candidate, sourceIndex) =>\n Object.freeze({ ...candidate, sourceIndex }),\n ),\n );\n this.commitCandidates(candidates, this.committedBoundaries);\n }\n\n private clearFocusState(): void {\n this.cancelSpaceActivation();\n this.focusedTarget = undefined;\n this.focusVisible = false;\n }\n\n private adoptHtmlFocus(\n region: HtmlFocusRegion,\n modality: \"keyboard\" | \"pointer\",\n ): void {\n const visible = modality === \"keyboard\";\n if (this.focusedHtmlRegion === region && this.focusVisible === visible)\n return;\n const previous = this.focusedHtmlRegion;\n this.focusedHtmlRegion = region;\n this.focusVisible = visible;\n if (previous && previous !== region)\n this.notifyHtmlFocus(previous, false, false);\n this.notifyHtmlFocus(region, true, visible);\n }\n\n private clearHtmlFocus(region: HtmlFocusRegion): void {\n if (this.focusedHtmlRegion !== region) return;\n this.focusedHtmlRegion = undefined;\n this.focusVisible = false;\n this.notifyHtmlFocus(region, false, false);\n }\n\n private notifyHtmlFocus(\n region: HtmlFocusRegion,\n isFocusWithin: boolean,\n isFocusVisible: boolean,\n ): void {\n region.onFocusSnapshot?.(Object.freeze({ isFocusWithin, isFocusVisible }));\n }\n\n private applyPressFocus(\n requestedTarget: PibblEventTargetRegistration | undefined,\n ): void {\n const target = this.liveFocusCandidate(requestedTarget);\n const pending = { target };\n this.pendingPressFocus = pending;\n try {\n this.coordinator.focusCanvasFromPress(this);\n if (\n this.pendingPressFocus !== pending ||\n this.destroyed ||\n this.canvas.ownerDocument.activeElement !== this.canvas\n ) {\n return;\n }\n this.pendingPressFocus = undefined;\n transitionLogicalFocus(this, this.liveFocusCandidate(target), \"pointer\");\n } finally {\n if (this.pendingPressFocus === pending)\n this.pendingPressFocus = undefined;\n }\n }\n\n beginSpaceActivation(target: PibblEventTargetRegistration): void {\n this.pendingSpaceTarget = target;\n }\n\n hasPendingSpaceActivation(\n target: PibblEventTargetRegistration | undefined,\n ): boolean {\n return Boolean(target && this.pendingSpaceTarget === target);\n }\n\n consumeSpaceActivation(): PibblEventTargetRegistration | undefined {\n const target = this.pendingSpaceTarget;\n this.pendingSpaceTarget = undefined;\n return target;\n }\n\n cancelSpaceActivation(): void {\n this.pendingSpaceTarget = undefined;\n }\n\n private recordPointerPress(input: PibblFocusPressDefaultInput): void {\n if (input.pointerId === undefined) return;\n this.representedPointerPresses.set(input.pointerId, {\n x: input.x,\n y: input.y,\n timeStamp: input.originalEvent.timeStamp,\n suppressMouse: true,\n suppressTouch: input.pointerType === \"touch\",\n });\n }\n\n private consumeRepresentedMousePress(\n input: PibblFocusPressDefaultInput,\n ): boolean {\n for (const [pointerId, press] of this.representedPointerPresses) {\n if (!press.suppressMouse || !samePress(press, input)) continue;\n press.suppressMouse = false;\n if (!press.suppressTouch)\n this.representedPointerPresses.delete(pointerId);\n return true;\n }\n if (\n this.touchMouseCompatibility &&\n samePress(this.touchMouseCompatibility, input)\n ) {\n this.touchMouseCompatibility = undefined;\n return true;\n }\n return false;\n }\n\n private consumeRepresentedTouchPress(\n input: PibblFocusPressDefaultInput,\n ): boolean {\n const identifier = input.touchIdentifier;\n if (identifier === undefined) return false;\n const existing = this.representedTouchContacts.get(identifier);\n if (existing && samePress(existing, input)) return true;\n this.representedTouchContacts.set(identifier, pressRecord(input));\n\n for (const [pointerId, press] of this.representedPointerPresses) {\n if (!press.suppressTouch || !samePress(press, input)) continue;\n press.suppressTouch = false;\n if (!press.suppressMouse)\n this.representedPointerPresses.delete(pointerId);\n return true;\n }\n return false;\n }\n\n private recordTouchFallback(input: PibblFocusPressDefaultInput): void {\n this.touchMouseCompatibility = pressRecord(input);\n }\n\n private recordTouchStarts(\n input: PibblFocusTouchDefaultInput,\n ): PibblFocusTouchDefaultContact | undefined {\n let primary: PibblFocusTouchDefaultContact | undefined;\n for (const contact of input.changedContacts) {\n if (this.activeTouchIdentifiers.has(contact.identifier)) continue;\n if (!this.touchSequenceActive) {\n this.touchSequenceActive = true;\n this.primaryTouchIdentifier = contact.identifier;\n }\n if (contact.identifier === this.primaryTouchIdentifier) primary = contact;\n this.activeTouchIdentifiers.add(contact.identifier);\n }\n return primary;\n }\n\n private reconcileTouchContacts(input: PibblFocusTouchDefaultInput): void {\n const activeIdentifiers = new Set(input.activeIdentifiers);\n for (const identifier of this.activeTouchIdentifiers) {\n if (activeIdentifiers.has(identifier)) continue;\n this.activeTouchIdentifiers.delete(identifier);\n this.representedTouchContacts.delete(identifier);\n }\n\n const startingIdentifiers =\n input.type === \"touchstart\"\n ? new Set(input.changedContacts.map((contact) => contact.identifier))\n : undefined;\n for (const identifier of activeIdentifiers) {\n if (!startingIdentifiers?.has(identifier)) {\n this.activeTouchIdentifiers.add(identifier);\n }\n }\n\n if (this.activeTouchIdentifiers.size > 0) {\n this.touchSequenceActive = true;\n return;\n }\n this.touchSequenceActive = false;\n this.primaryTouchIdentifier = undefined;\n this.representedTouchContacts.clear();\n }\n\n private recordTouchTerminals(input: PibblFocusTouchDefaultInput): void {\n for (const contact of input.changedContacts) {\n this.activeTouchIdentifiers.delete(contact.identifier);\n this.representedTouchContacts.delete(contact.identifier);\n }\n if (this.activeTouchIdentifiers.size > 0) return;\n this.touchSequenceActive = false;\n this.primaryTouchIdentifier = undefined;\n this.representedTouchContacts.clear();\n }\n\n private purgeExpiredPresses(timeStamp: number): void {\n for (const [pointerId, press] of this.representedPointerPresses) {\n if (!recentPress(press, timeStamp)) {\n this.representedPointerPresses.delete(pointerId);\n }\n }\n for (const [identifier, press] of this.representedTouchContacts) {\n if (!recentPress(press, timeStamp)) {\n this.representedTouchContacts.delete(identifier);\n }\n }\n if (\n this.touchMouseCompatibility &&\n !recentPress(this.touchMouseCompatibility, timeStamp)\n ) {\n this.touchMouseCompatibility = undefined;\n }\n }\n\n private assertLive(): void {\n if (this.destroyed) throw new Error(\"Pibbl focus manager is disposed.\");\n }\n}\n\nfunction pressWasPrevented(input: PibblFocusPressDefaultInput): boolean {\n return input.event?.defaultPrevented ?? input.originalEvent.defaultPrevented;\n}\n\nfunction pressRecord(input: PibblFocusPressDefaultInput): RepresentedPress {\n return {\n x: input.x,\n y: input.y,\n timeStamp: input.originalEvent.timeStamp,\n };\n}\n\nfunction samePress(\n press: RepresentedPress,\n input: PibblFocusPressDefaultInput,\n): boolean {\n return (\n recentPress(press, input.originalEvent.timeStamp) &&\n Math.abs(press.x - input.x) <= 1 &&\n Math.abs(press.y - input.y) <= 1\n );\n}\n\nfunction recentPress(press: RepresentedPress, timeStamp: number): boolean {\n const elapsed = timeStamp - press.timeStamp;\n return elapsed >= 0 && elapsed <= COMPATIBILITY_PRESS_WINDOW_MS;\n}\n\nexport function createFocusManager(\n eventRoot: PibblEventRoot,\n owner: PibblInstance,\n): PibblFocusManager {\n return new PibblFocusManager(eventRoot, owner);\n}\n\nexport function requireFocusManager(eventRoot: PibblEventRoot): PibblFocusManager {\n const manager = eventRoot.focusPolicy;\n if (!(manager instanceof PibblFocusManager)) {\n throw new Error(\n \"KeyboardNavigation requires an active FocusManagement focus manager.\",\n );\n }\n return manager;\n}\n\nexport function createDirectionalBoundary(\n owner: PibblInstance,\n): PibblDirectionalBoundary {\n return new DirectionalBoundary(owner);\n}\n\nfunction getCoordinator(eventRoot: PibblEventRoot): FocusManagerCoordinator {\n let coordinator = coordinators.get(eventRoot);\n if (!coordinator) {\n coordinator = new FocusManagerCoordinator(eventRoot);\n coordinators.set(eventRoot, coordinator);\n }\n return coordinator;\n}\n\nfunction duplicateManagerError(): Error {\n return new Error(\n \"FocusManagement allows only one focus manager per Pibbl root.\",\n );\n}\n\nfunction asDirectionalBoundary(\n boundary: PibblDirectionalBoundary,\n): DirectionalBoundary {\n if (!(boundary instanceof DirectionalBoundary)) {\n throw new Error(\"Unknown Pibbl directional boundary.\");\n }\n return boundary;\n}\n\nfunction isKeyboardFocusable(target: PibblEventTargetRegistration): boolean {\n return (\n target.keyboardFocusable ??\n Boolean(\n target.handlers.click || target.handlers.keydown || target.handlers.keyup,\n )\n );\n}\n\nfunction collectRetainedTargets(\n instance: PibblInstance,\n targets: PibblEventTargetRegistration[],\n): void {\n if (instance.mainTeardowns.closed) return;\n for (const target of instance.eventRoot.targets) {\n if (\n target.live &&\n target.owner.eventRoot === instance.eventRoot &&\n !target.owner.mainTeardowns.closed &&\n isInstanceWithin(target.owner, instance)\n )\n targets.push(target);\n }\n}\n\nfunction isInstanceWithin(\n instance: PibblInstance,\n ancestor: PibblInstance,\n): boolean {\n let current: PibblInstance | undefined = instance;\n while (current) {\n if (current === ancestor) return true;\n current = current.parent\n ? GLOBAL_STATE.pibblInstances.get(current.parent)\n : undefined;\n }\n return false;\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import { preparedLayoutHtmlGeometry, preparedLayoutTargetBounds } from '../layout/geometry-publication.js';\nimport type { PibblEventTargetRegistration } from \"../events/registrations.js\";\nimport { GLOBAL_STATE } from \"../global-state.js\";\nimport type {\n PibblEvent,\n PibblEventType,\n PibblKeyboardEvent,\n} from \"../events/types.js\";\nimport { Teardowns } from \"../teardowns.js\";\nimport type {\n PibblEventRoot,\n PibblFocusPressDefaultInput,\n PibblFocusTouchDefaultContact,\n PibblFocusTouchDefaultInput,\n PibblFocusPolicyBridge,\n PibblInstance,\n PibblRenderTransaction,\n} from \"../types.js\";\nimport { resolveTargetRootBounds } from \"./geometry.js\";\nimport {\n mountDOMFocusHost,\n type PibblMountedDOMFocusHost,\n} from \"./dom-focus-host.js\";\nimport {\n applyDirectionalNavigationDefault,\n applyKeyboardActivationDefault,\n applyTabDefault,\n} from \"./keyboard-defaults.js\";\nimport { transitionLogicalFocus } from \"./focus-events.js\";\nimport type { HtmlFocusRegion } from \"./html-focus-region.js\";\nimport {\n isHtmlFocusCandidate,\n type PibblDirectionalBoundary,\n type PibblFocusCandidate,\n type PibblHtmlFocusCandidate,\n type PibblNavigationCandidate,\n} from \"./types.js\";\nimport { getManagedTabStops } from \"./dom-tab-stops.js\";\n\ninterface PreparedNavigation {\n readonly navigation: readonly PibblNavigationCandidate[];\n readonly canvas: readonly PibblFocusCandidate[];\n readonly html: readonly PibblHtmlFocusCandidate[];\n readonly byBoundary: ReadonlyMap<DirectionalBoundary, readonly PibblNavigationCandidate[]>;\n readonly boundaries: Set<DirectionalBoundary>;\n}\nconst EMPTY_NAVIGATION: readonly PibblNavigationCandidate[] = Object.freeze([]);\n\nconst UNFOCUSED_SNAPSHOT = Object.freeze({\n isFocused: false,\n isFocusVisible: false,\n});\n\nconst retainedDirectionalBoundaries = new WeakMap<\n PibblEventTargetRegistration,\n DirectionalBoundary\n>();\nconst coordinators = new WeakMap<PibblEventRoot, FocusManagerCoordinator>();\nconst managerOwners = new WeakMap<PibblFocusManager, PibblInstance>();\n\ninterface PendingCandidate {\n readonly target: PibblEventTargetRegistration;\n readonly directionalBoundary: DirectionalBoundary | undefined;\n}\n\ninterface PendingHtmlRegion {\n readonly region: HtmlFocusRegion;\n readonly directionalBoundary: DirectionalBoundary | undefined;\n}\n\ninterface PendingFrame {\n readonly entries: (PendingCandidate | PendingHtmlRegion)[];\n readonly targets: PendingCandidate[];\n readonly htmlRegions: PendingHtmlRegion[];\n readonly observedTargets: Set<PibblEventTargetRegistration>;\n readonly observedHtmlRegions: Set<HtmlFocusRegion>;\n readonly ineligibleTargets: Set<PibblEventTargetRegistration>;\n readonly boundaries: Set<DirectionalBoundary>;\n}\n\ninterface RepresentedPress {\n readonly x: number;\n readonly y: number;\n readonly timeStamp: number;\n}\n\ninterface RepresentedPointerPress extends RepresentedPress {\n suppressMouse: boolean;\n suppressTouch: boolean;\n}\n\nconst COMPATIBILITY_PRESS_WINDOW_MS = 1_500;\n\nclass DirectionalBoundary implements PibblDirectionalBoundary {\n private committedCandidates: readonly PibblNavigationCandidate[] =\n Object.freeze([]);\n\n constructor(readonly owner: PibblInstance) {}\n\n get candidates(): readonly PibblNavigationCandidate[] {\n return this.committedCandidates;\n }\n\n commit(candidates: readonly PibblNavigationCandidate[]): void {\n this.committedCandidates = candidates;\n }\n}\n\ninterface FocusTransactionState {\n readonly prior: PibblFocusManager | undefined;\n readonly replayedManagers: Set<PibblFocusManager>;\n prepared: PibblFocusManager | undefined;\n claimed: PibblFocusManager | undefined;\n finished: boolean;\n restored: PibblFocusManager | undefined;\n}\n\nclass FocusManagerCoordinator {\n private readonly managers = new Set<PibblFocusManager>();\n private readonly transactions = new WeakMap<\n PibblRenderTransaction,\n FocusTransactionState\n >();\n private active: PibblFocusManager | undefined;\n private domFocusHost: PibblMountedDOMFocusHost | undefined;\n private domFocusHostTeardowns: Teardowns | undefined;\n private disposed = false;\n\n constructor(private readonly eventRoot: PibblEventRoot) {\n eventRoot.rootInstance?.mainTeardowns.add(() => this.dispose());\n }\n\n add(manager: PibblFocusManager): void {\n if (this.disposed) {\n throw new Error(\"Pibbl focus manager root is disposed.\");\n }\n this.ensureDOMFocusHost();\n this.managers.add(manager);\n const transaction = this.eventRoot.renderTransaction;\n if (transaction) {\n const state = this.stateFor(transaction);\n state.prepared = manager;\n // Reconciliation mounts every descriptor before declaration-order entry.\n // Expose that transaction-local manager so a same-element directional\n // descriptor can enter first without making the claim permanent.\n this.eventRoot.focusPolicy = manager;\n }\n }\n\n claim(manager: PibblFocusManager): void {\n const transaction = this.eventRoot.renderTransaction;\n if (!transaction) {\n if (this.active && this.active !== manager) {\n throw duplicateManagerError();\n }\n this.setActive(manager);\n return;\n }\n\n const state = this.stateFor(transaction);\n if (state.claimed && state.claimed !== manager) {\n throw duplicateManagerError();\n }\n state.claimed = manager;\n this.eventRoot.focusPolicy = manager;\n }\n\n beforeNativeDispatch(\n type: PibblEventType,\n event: Event,\n ): PibblFocusManager | undefined {\n const manager = this.active;\n const routeLogicalEvent =\n this.domFocusHost?.beforeNativeDispatch(type, event) ?? true;\n return routeLogicalEvent && manager && !manager.isDestroyed\n ? manager\n : undefined;\n }\n\n syncDOMFocusHost(manager: PibblFocusManager): void {\n if (this.active === manager) {\n this.domFocusHost?.syncCandidateAvailability(manager.hasFocusCandidates);\n this.domFocusHost?.syncHtmlRegions(manager.htmlFocusRegions);\n }\n }\n\n focusCanvasFromPress(manager: PibblFocusManager): void {\n if (this.active === manager) this.domFocusHost?.focusFromPress();\n }\n\n claimRetainedManagers(instance: PibblInstance): readonly PibblFocusManager[] {\n const retained = Array.from(this.managers).filter((manager) => {\n const owner = managerOwners.get(manager);\n return (\n !manager.isDestroyed &&\n !manager.ownerWasReleased &&\n owner !== undefined &&\n isInstanceWithin(owner, instance)\n );\n });\n const transaction = this.eventRoot.renderTransaction;\n if (!transaction) {\n for (const manager of retained) this.claim(manager);\n return retained;\n }\n\n const state = this.stateFor(transaction);\n for (const manager of retained) {\n if (state.replayedManagers.has(manager)) continue;\n state.replayedManagers.add(manager);\n this.claim(manager);\n }\n return retained;\n }\n\n release(manager: PibblFocusManager): void {\n if (manager.isDestroyed) return;\n manager.markOwnerReleased();\n const transaction = this.eventRoot.renderTransaction;\n if (transaction) {\n const state = this.stateFor(transaction);\n if (!state.finished) return;\n }\n if (this.active === manager) {\n this.setActive(undefined);\n }\n this.destroy(manager);\n }\n\n private stateFor(transaction: PibblRenderTransaction): FocusTransactionState {\n const existing = this.transactions.get(transaction);\n if (existing) return existing;\n const state: FocusTransactionState = {\n prior: this.active,\n replayedManagers: new Set(),\n prepared: undefined,\n claimed: undefined,\n finished: false,\n restored: undefined,\n };\n this.transactions.set(transaction, state);\n transaction.onFinish((success) => this.finishTransaction(state, success, transaction.failed === false));\n return state;\n }\n\n private finishTransaction(\n state: FocusTransactionState,\n success: boolean,\n cancelled = false,\n ): void {\n if (state.finished) return;\n state.finished = true;\n if (success) {\n if (state.claimed) {\n this.active = state.claimed;\n } else if (this.active?.ownerWasReleased) {\n this.active = undefined;\n }\n this.eventRoot.focusPolicy = this.active;\n for (const manager of Array.from(this.managers)) {\n if (manager !== this.active && manager.ownerWasReleased) {\n this.destroy(manager);\n }\n }\n this.domFocusHost?.setManager(this.active);\n return;\n }\n\n const attemptedReplacement =\n (state.claimed && state.claimed !== state.prior) ||\n (state.prepared && state.prepared !== state.prior);\n const restored =\n state.prior && (attemptedReplacement || cancelled) && !state.prior.isDestroyed\n ? state.prior\n : undefined;\n state.restored = restored;\n this.active = restored;\n this.eventRoot.focusPolicy = restored;\n for (const manager of Array.from(this.managers)) {\n if (manager !== restored) this.destroy(manager);\n }\n this.domFocusHost?.setManager(restored);\n }\n\n private destroy(manager: PibblFocusManager): void {\n this.managers.delete(manager);\n manager.destroyFromCoordinator();\n if (this.managers.size === 0) this.disposeDOMFocusHost();\n }\n\n private ensureDOMFocusHost(): void {\n if (this.domFocusHost) return;\n const canvas = this.eventRoot.canvas;\n if (!canvas) {\n throw new Error(\n \"FocusManagement requires an HTMLCanvasElement root; an OffscreenCanvas has no DOM focus host.\",\n );\n }\n const teardowns = new Teardowns();\n try {\n this.domFocusHost = mountDOMFocusHost(canvas, this.eventRoot, teardowns);\n this.domFocusHostTeardowns = teardowns;\n } catch (error) {\n teardowns.execute();\n throw error;\n }\n }\n\n private disposeDOMFocusHost(): void {\n this.domFocusHost = undefined;\n this.domFocusHostTeardowns?.execute();\n this.domFocusHostTeardowns = undefined;\n }\n\n private setActive(manager: PibblFocusManager | undefined): void {\n this.active = manager;\n this.eventRoot.focusPolicy = manager;\n this.domFocusHost?.setManager(manager);\n }\n\n private dispose(): void {\n if (this.disposed) return;\n this.disposed = true;\n this.active = undefined;\n this.eventRoot.focusPolicy = undefined;\n for (const manager of Array.from(this.managers)) this.destroy(manager);\n this.disposeDOMFocusHost();\n }\n}\n\nexport class PibblFocusManager implements PibblFocusPolicyBridge {\n private committedCandidates: readonly PibblFocusCandidate[] = Object.freeze([]);\n private committedHtmlCandidates: readonly PibblHtmlFocusCandidate[] =\n Object.freeze([]);\n private committedNavigationCandidates: readonly PibblNavigationCandidate[] =\n Object.freeze([]);\n private committedBoundaries = new Set<DirectionalBoundary>();\n private pending: PendingFrame | undefined;\n private retainedNavigationTransaction: PibblRenderTransaction | undefined;\n private transactionalPending:\n | {\n readonly transaction: PibblRenderTransaction;\n readonly frame: PendingFrame;\n }\n | undefined;\n private directionalStack: DirectionalBoundary[] = [];\n private focusedTarget: PibblEventTargetRegistration | undefined;\n private focusedHtmlRegion: HtmlFocusRegion | undefined;\n private pendingHtmlFocusModality: \"keyboard\" | \"pointer\" | undefined;\n private focusVisible = false;\n private pendingSpaceTarget: PibblEventTargetRegistration | undefined;\n private pendingPressFocus:\n { readonly target: PibblEventTargetRegistration | undefined } | undefined;\n private readonly representedPointerPresses = new Map<\n number,\n RepresentedPointerPress\n >();\n private readonly representedTouchContacts = new Map<\n number,\n RepresentedPress\n >();\n private activeTouchIdentifiers = new Set<number>();\n private primaryTouchIdentifier: number | undefined;\n private touchSequenceActive = false;\n private touchMouseCompatibility: RepresentedPress | undefined;\n private focusRenderRevision = 0;\n private readonly layerFocusRenderRevisions = new WeakMap<\n PibblInstance,\n number\n >();\n private destroyed = false;\n private ownerReleased = false;\n private readonly coordinator: FocusManagerCoordinator;\n\n constructor(\n private readonly eventRoot: PibblEventRoot,\n owner: PibblInstance,\n ) {\n const canvas = eventRoot.canvas;\n if (!canvas) {\n throw new Error(\n \"FocusManagement requires an HTMLCanvasElement root; an OffscreenCanvas has no DOM focus host.\",\n );\n }\n managerOwners.set(this, owner);\n this.coordinator = getCoordinator(eventRoot);\n try {\n this.coordinator.add(this);\n } catch (error) {\n managerOwners.delete(this);\n throw error;\n }\n }\n\n get candidates(): readonly PibblFocusCandidate[] {\n return this.committedCandidates;\n }\n\n /** @internal Full source-order list including native HtmlBox regions. */\n get navigationCandidates(): readonly PibblNavigationCandidate[] {\n return this.committedNavigationCandidates;\n }\n\n get htmlFocusRegions(): readonly HtmlFocusRegion[] {\n return this.committedHtmlCandidates.map((candidate) => candidate.region);\n }\n\n get focusedNavigationCandidate(): PibblNavigationCandidate | undefined {\n if (this.focusedHtmlRegion) {\n return this.committedHtmlCandidates.find(\n (candidate) => candidate.region === this.focusedHtmlRegion,\n );\n }\n return this.focusedTarget\n ? this.committedCandidates.find(\n (candidate) => candidate.target === this.focusedTarget,\n )\n : undefined;\n }\n\n /** @internal Resolves dynamic native eligibility at each navigation boundary. */\n isNavigationCandidateFocusable(candidate: PibblNavigationCandidate): boolean {\n return isHtmlFocusCandidate(candidate)\n ? Boolean(\n candidate.region.active &&\n candidate.region.content &&\n getManagedTabStops(candidate.region.content).length,\n )\n : Boolean(this.liveFocusCandidate(candidate.target));\n }\n\n /** Includes a successful render's collected candidates before commit callbacks settle. */\n get hasFocusCandidates(): boolean {\n return (\n this.committedNavigationCandidates.length > 0 ||\n (this.transactionalPending?.frame.targets.length ?? 0) +\n (this.transactionalPending?.frame.htmlRegions.length ?? 0) >\n 0\n );\n }\n\n get isDestroyed(): boolean {\n return this.destroyed;\n }\n\n get ownerWasReleased(): boolean {\n return this.ownerReleased;\n }\n\n get canvas(): HTMLCanvasElement {\n const canvas = this.eventRoot.canvas;\n if (!canvas) throw new Error(\"Pibbl focus manager has no DOM Canvas host.\");\n return canvas;\n }\n\n get logicalFocusTarget(): PibblEventTargetRegistration | undefined {\n return this.focusedTarget;\n }\n\n get logicalFocusVisible(): boolean {\n return this.focusVisible;\n }\n\n beginCollection(): void {\n this.assertLive();\n if (this.pending) {\n throw new Error(\"FocusManagement cannot enter twice on one Pibbl root.\");\n }\n this.coordinator.claim(this);\n this.pending = {\n entries: [],\n targets: [],\n htmlRegions: [],\n observedTargets: new Set(),\n observedHtmlRegions: new Set(),\n ineligibleTargets: new Set(),\n boundaries: new Set(this.directionalStack),\n };\n }\n\n finishCollection(success: boolean): void {\n const pending = this.pending;\n this.pending = undefined;\n if (!pending || !success || this.destroyed) return;\n\n const transaction = this.eventRoot.renderTransaction;\n if (transaction) {\n this.transactionalPending = { transaction, frame: pending };\n let prepared: PreparedNavigation | undefined;\n if (transaction.onPreflight && transaction.onAdopt) {\n transaction.onPreflight(() => { prepared = this.prepareCollection(pending, transaction); });\n transaction.onAdopt(() => { if (prepared && !this.destroyed) this.adoptNavigationCandidates(prepared); });\n }\n transaction.onFinish((transactionSucceeded) => {\n if (this.transactionalPending?.transaction === transaction) {\n this.transactionalPending = undefined;\n }\n if (transactionSucceeded && !this.destroyed) {\n if (prepared) this.finishNavigationCandidates();\n else this.commitCollection(pending);\n }\n });\n return;\n }\n\n this.commitCollection(pending);\n }\n\n private commitCollection(pending: PendingFrame): void {\n this.adoptNavigationCandidates(this.prepareCollection(pending));\n this.finishNavigationCandidates();\n }\n\n private prepareCollection(pending: PendingFrame, transaction?: PibblRenderTransaction): PreparedNavigation {\n const collected: PibblNavigationCandidate[] = [];\n for (const [sourceIndex, observed] of pending.entries.entries()) {\n if (\"target\" in observed) {\n const target = observed.target;\n collected.push(\n Object.freeze({\n target,\n sourceIndex,\n directionalBoundary: observed.directionalBoundary,\n rootBounds: transaction ? preparedLayoutTargetBounds(transaction, target) : resolveTargetRootBounds(target),\n }) satisfies PibblFocusCandidate,\n );\n continue;\n }\n const region = observed.region;\n const geometry = transaction ? preparedLayoutHtmlGeometry(transaction, region) : undefined;\n if (geometry ? geometry.active : region.active && region.content)\n collected.push(\n Object.freeze({\n region,\n sourceIndex,\n directionalBoundary: observed.directionalBoundary,\n rootBounds: geometry?.bounds ?? region.rootBounds,\n }) satisfies PibblHtmlFocusCandidate,\n );\n }\n const navigation = Object.freeze(collected);\n return this.prepareNavigationCandidates(navigation, pending.boundaries);\n }\n\n observeTarget(target: PibblEventTargetRegistration): void {\n const pending = this.pending;\n if (!pending) return;\n if (this.pendingSpaceTarget === target && !target.handlers.click) {\n this.cancelSpaceActivation();\n }\n if (!isKeyboardFocusable(target)) {\n this.markPendingIneligible(target);\n return;\n }\n pending.ineligibleTargets.delete(target);\n this.recordPendingTarget(target, this.currentDirectionalBoundary());\n }\n\n /** @internal Collects one published HtmlBox in source order. */\n observeHtmlRegion(region: HtmlFocusRegion): void {\n const pending = this.pending;\n if (!pending || pending.observedHtmlRegions.has(region)) return;\n pending.observedHtmlRegions.add(region);\n const observed = {\n region,\n directionalBoundary: this.currentDirectionalBoundary(),\n };\n pending.htmlRegions.push(observed);\n pending.entries.push(observed);\n }\n\n /** @internal Removes an unmounted HtmlBox without manufacturing a Canvas target. */\n removeHtmlFocusRegion(region: HtmlFocusRegion): void {\n if (this.pending?.observedHtmlRegions.delete(region)) {\n this.pending.htmlRegions.splice(\n this.pending.htmlRegions.findIndex((entry) => entry.region === region),\n 1,\n );\n const index = this.pending.entries.findIndex(\n (entry) => \"region\" in entry && entry.region === region,\n );\n if (index >= 0) this.pending.entries.splice(index, 1);\n return;\n }\n if (\n !this.committedHtmlCandidates.some(\n (candidate) => candidate.region === region,\n )\n )\n return;\n const wasFocused = this.focusedHtmlRegion === region;\n const canvas = this.eventRoot.canvas;\n const shouldReturnNativeFocus = Boolean(\n wasFocused &&\n canvas &&\n !this.eventRoot.rootInstance?.mainTeardowns.closed &&\n region.content?.contains(canvas.ownerDocument.activeElement),\n );\n this.commitNavigationCandidates(\n this.committedNavigationCandidates.filter(\n (candidate) =>\n !isHtmlFocusCandidate(candidate) || candidate.region !== region,\n ),\n this.committedBoundaries,\n );\n if (shouldReturnNativeFocus && canvas) {\n this.coordinator.focusCanvasFromPress(this);\n // Canvas focus synchronously enters the ordinary DOM host. A retired\n // region must leave no logical selection behind that would turn this\n // removal into an unintended navigation action.\n this.clearFocusState();\n }\n if (wasFocused) this.clearHtmlFocus(region);\n }\n\n /** @internal Deactivates retained DOM hosts while the root has no display area. */\n suspendHtmlRegions(): void {\n if (this.committedHtmlCandidates.length === 0) return;\n const focused = this.focusedHtmlRegion;\n const canvas = this.eventRoot.canvas;\n const shouldReturnNativeFocus = Boolean(\n focused &&\n canvas &&\n !this.eventRoot.rootInstance?.mainTeardowns.closed &&\n focused.content?.contains(canvas.ownerDocument.activeElement),\n );\n this.commitNavigationCandidates(\n this.committedNavigationCandidates.filter(\n (candidate) => !isHtmlFocusCandidate(candidate),\n ),\n this.committedBoundaries,\n );\n if (shouldReturnNativeFocus && canvas) {\n this.coordinator.focusCanvasFromPress(this);\n this.clearFocusState();\n }\n if (focused) this.clearHtmlFocus(focused);\n }\n\n observeTransactionalTarget(target: PibblEventTargetRegistration, preparedFocusable?: boolean): void {\n const transactional = this.transactionalPending;\n const pending = this.pending ?? (transactional?.transaction === this.eventRoot.renderTransaction ? transactional?.frame : undefined);\n if (!pending) return;\n if (this.pendingSpaceTarget === target && !target.handlers.click) {\n this.cancelSpaceActivation();\n }\n if (!(preparedFocusable ?? isKeyboardFocusable(target))) {\n pending.ineligibleTargets.add(target);\n const index = pending.targets.findIndex(\n (candidate) => candidate.target === target,\n );\n if (index !== -1) pending.targets.splice(index, 1);\n const entryIndex = pending.entries.findIndex(\n (entry) => \"target\" in entry && entry.target === target,\n );\n if (entryIndex !== -1) pending.entries.splice(entryIndex, 1);\n pending.observedTargets.delete(target);\n return;\n }\n pending.ineligibleTargets.delete(target);\n if (pending.observedTargets.has(target)) return;\n pending.observedTargets.add(target);\n const observed = {\n target,\n directionalBoundary: this.currentDirectionalBoundary(),\n };\n pending.targets.push(observed);\n pending.entries.push(observed);\n }\n\n removeTarget(target: PibblEventTargetRegistration): void {\n if (this.pendingSpaceTarget === target) this.cancelSpaceActivation();\n if (this.pending) {\n this.markPendingIneligible(target);\n return;\n }\n if (\n !this.committedCandidates.some((candidate) => candidate.target === target)\n ) {\n if (this.focusedTarget === target) this.clearFocusState();\n return;\n }\n this.commitRemovedTarget(target);\n }\n\n snapshot(target: PibblEventTargetRegistration) {\n if (\n this.ownerReleased ||\n this.pending?.ineligibleTargets.has(target) ||\n target !== this.focusedTarget\n ) {\n return UNFOCUSED_SNAPSHOT;\n }\n return Object.freeze({\n isFocused: true,\n isFocusVisible: this.focusVisible,\n });\n }\n\n resolveKeyboardTarget(): PibblEventTargetRegistration | undefined {\n const target = this.focusedTarget;\n if (target && this.pending?.ineligibleTargets.has(target)) return undefined;\n return target &&\n this.committedCandidates.some((candidate) => candidate.target === target)\n ? target\n : undefined;\n }\n\n afterDispatch(event: PibblEvent): void {\n if (event.type === \"keydown\") {\n applyTabDefault(this, event as PibblKeyboardEvent);\n }\n if (event.type === \"keydown\" || event.type === \"keyup\") {\n applyKeyboardActivationDefault(this, event as PibblKeyboardEvent);\n }\n if (event.type === \"keydown\") {\n applyDirectionalNavigationDefault(this, event as PibblKeyboardEvent);\n }\n }\n\n afterPressDispatch(input: PibblFocusPressDefaultInput): void {\n if (this.destroyed) return;\n this.purgeExpiredPresses(input.originalEvent.timeStamp);\n switch (input.source) {\n case \"pointer\":\n this.recordPointerPress(input);\n if (!pressWasPrevented(input)) this.applyPressFocus(input.target);\n return;\n case \"mouse\":\n if (this.consumeRepresentedMousePress(input)) return;\n if (!pressWasPrevented(input)) this.applyPressFocus(input.target);\n return;\n case \"touch\":\n if (this.consumeRepresentedTouchPress(input)) return;\n this.recordTouchFallback(input);\n if (!pressWasPrevented(input)) this.applyPressFocus(input.target);\n return;\n }\n }\n\n afterTouchDispatch(input: PibblFocusTouchDefaultInput): void {\n if (this.destroyed) return;\n this.purgeExpiredPresses(input.originalEvent.timeStamp);\n this.reconcileTouchContacts(input);\n if (input.type === \"touchstart\") {\n const primary = this.recordTouchStarts(input);\n if (!primary) return;\n this.afterPressDispatch({\n source: \"touch\",\n target: primary.target,\n event: undefined,\n originalEvent: input.originalEvent,\n x: primary.x,\n y: primary.y,\n touchIdentifier: primary.identifier,\n });\n return;\n }\n if (input.type === \"touchend\" || input.type === \"touchcancel\") {\n this.recordTouchTerminals(input);\n }\n }\n\n beforeNativeDispatch(\n type: PibblEventType,\n event: Event,\n ): PibblFocusManager | undefined {\n return this.coordinator.beforeNativeDispatch(type, event);\n }\n\n enterDOMFocus(backwards: boolean): void {\n if (this.destroyed) return;\n const pendingPress = this.pendingPressFocus;\n if (pendingPress) {\n this.pendingPressFocus = undefined;\n transitionLogicalFocus(\n this,\n this.liveFocusCandidate(pendingPress.target),\n \"pointer\",\n );\n return;\n }\n const candidates = backwards\n ? [...this.committedNavigationCandidates].reverse()\n : this.committedNavigationCandidates;\n for (const candidate of candidates) {\n if (this.focusNavigationCandidate(candidate, \"keyboard\", backwards))\n return;\n }\n }\n\n leaveDOMFocus(): void {\n if (this.destroyed) return;\n this.pendingPressFocus = undefined;\n transitionLogicalFocus(this, undefined, \"keyboard\");\n }\n\n activateDOMHost(): void {\n if (!this.destroyed) this.coordinator.syncDOMFocusHost(this);\n }\n\n focusNavigationCandidate(\n candidate: PibblNavigationCandidate | undefined,\n modality: \"keyboard\" | \"pointer\",\n backwards = false,\n ): boolean {\n if (!candidate) return false;\n if (!isHtmlFocusCandidate(candidate)) {\n this.focusedHtmlRegion && this.clearHtmlFocus(this.focusedHtmlRegion);\n transitionLogicalFocus(\n this,\n this.liveFocusCandidate(candidate.target),\n modality,\n );\n return true;\n }\n const region = candidate.region;\n const content = region.active ? region.content : undefined;\n const stops = content ? getManagedTabStops(content) : [];\n const destination = backwards ? stops.at(-1) : stops[0];\n if (!destination) return false;\n if (this.focusedTarget) transitionLogicalFocus(this, undefined, modality);\n this.adoptHtmlFocus(region, modality);\n this.pendingHtmlFocusModality = modality;\n destination.focus({ preventScroll: true });\n this.pendingHtmlFocusModality = undefined;\n return true;\n }\n\n /** @internal Called by the native region listeners after the browser focuses a descendant. */\n adoptNativeHtmlFocus(\n region: HtmlFocusRegion,\n modality: \"keyboard\" | \"pointer\" | undefined,\n ): void {\n if (\n !this.committedHtmlCandidates.some(\n (candidate) => candidate.region === region,\n )\n )\n return;\n const carriedModality =\n modality ?? (this.focusVisible ? \"keyboard\" : \"pointer\");\n if (this.focusedTarget)\n transitionLogicalFocus(this, undefined, carriedModality);\n this.adoptHtmlFocus(\n region,\n this.pendingHtmlFocusModality ?? carriedModality,\n );\n }\n\n /** @internal Native blur settled outside a registered host. */\n clearNativeHtmlFocus(region: HtmlFocusRegion): void {\n if (this.focusedHtmlRegion === region) this.clearHtmlFocus(region);\n }\n\n /** @internal Reconciles a committed host list with the browser focus owner. */\n reconcileNativeHtmlFocus(region: HtmlFocusRegion | undefined): void {\n if (region) {\n this.adoptNativeHtmlFocus(region, undefined);\n } else if (this.focusedHtmlRegion) {\n this.clearHtmlFocus(this.focusedHtmlRegion);\n }\n }\n\n replayRetainedSubtree(instance: PibblInstance): void {\n const retainedManagers = this.coordinator.claimRetainedManagers(instance);\n const replayManager =\n retainedManagers.length === 1 ? retainedManagers[0] : this;\n replayManager.replayRetainedTargets(instance);\n }\n\n layerFocusRenderRevision(instance: PibblInstance): number | undefined {\n return this.ownerReleased\n ? undefined\n : this.layerFocusRenderRevisions.get(instance);\n }\n\n private replayRetainedTargets(instance: PibblInstance): void {\n // A cached Layer must replay the exact mixed source sequence from its last\n // successful render. Enumerating eventRoot.targets would lose HtmlBox\n // positions because native regions intentionally have no event target.\n const retained = this.committedNavigationCandidates.filter((candidate) =>\n isHtmlFocusCandidate(candidate)\n ? isInstanceWithin(candidate.region.owner, instance)\n : isInstanceWithin(candidate.target.owner, instance),\n );\n // Preserve the established Canvas-only replay behavior. A Canvas target\n // registration can be refreshed independently of its original collection\n // position; the mixed sequence is required only once native regions exist.\n if (!retained.some(isHtmlFocusCandidate)) {\n this.replayCanvasOnlyTargets(instance);\n return;\n }\n if (this.pending) {\n for (const candidate of retained) {\n const retainedBoundary = isHtmlFocusCandidate(candidate)\n ? candidate.directionalBoundary instanceof DirectionalBoundary &&\n isInstanceWithin(candidate.directionalBoundary.owner, instance)\n ? candidate.directionalBoundary\n : undefined\n : retainedDirectionalBoundaries.get(candidate.target);\n const directionalBoundary =\n retainedBoundary && isInstanceWithin(retainedBoundary.owner, instance)\n ? retainedBoundary\n : this.currentDirectionalBoundary();\n if (directionalBoundary) {\n this.pending.boundaries.add(directionalBoundary);\n }\n if (isHtmlFocusCandidate(candidate)) {\n const region = candidate.region;\n if (!region.active || !region.content) continue;\n if (!this.pending.observedHtmlRegions.has(region)) {\n this.pending.observedHtmlRegions.add(region);\n const observed = { region, directionalBoundary };\n this.pending.htmlRegions.push(observed);\n this.pending.entries.push(observed);\n }\n } else if (isKeyboardFocusable(candidate.target)) {\n this.recordPendingTarget(candidate.target, directionalBoundary);\n } else {\n this.markPendingIneligible(candidate.target);\n }\n }\n return;\n }\n\n if (retained.length === 0) return;\n if (this.stageRetainedNavigation()) return;\n const replayed = new Set(retained);\n const candidates = Object.freeze(\n this.committedNavigationCandidates.map((candidate) => {\n if (!replayed.has(candidate)) return candidate;\n return isHtmlFocusCandidate(candidate)\n ? Object.freeze({\n ...candidate,\n rootBounds: candidate.region.rootBounds,\n })\n : Object.freeze({\n ...candidate,\n rootBounds: resolveTargetRootBounds(candidate.target),\n });\n }),\n );\n this.commitNavigationCandidates(candidates, this.committedBoundaries);\n }\n\n private replayCanvasOnlyTargets(instance: PibblInstance): void {\n const targets: PibblEventTargetRegistration[] = [];\n collectRetainedTargets(instance, targets);\n if (this.pending) {\n for (const target of targets) {\n if (!isKeyboardFocusable(target)) {\n this.markPendingIneligible(target);\n continue;\n }\n const retainedBoundary = retainedDirectionalBoundaries.get(target);\n const directionalBoundary =\n retainedBoundary && isInstanceWithin(retainedBoundary.owner, instance)\n ? retainedBoundary\n : this.currentDirectionalBoundary();\n if (directionalBoundary)\n this.pending.boundaries.add(directionalBoundary);\n this.recordPendingTarget(target, directionalBoundary);\n }\n return;\n }\n if (this.stageRetainedNavigation()) return;\n const replayed = new Set(targets);\n if (\n !this.committedCandidates.some((candidate) =>\n replayed.has(candidate.target),\n )\n )\n return;\n const candidates = Object.freeze(\n this.committedCandidates.map((candidate) =>\n replayed.has(candidate.target)\n ? Object.freeze({\n ...candidate,\n rootBounds: resolveTargetRootBounds(candidate.target),\n })\n : candidate,\n ),\n );\n this.commitCandidates(candidates, this.committedBoundaries);\n }\n\n /** A clean inner manager still joins its parent root's geometry adoption. */\n private stageRetainedNavigation(): boolean {\n const transaction = this.eventRoot.renderTransaction;\n if (!transaction?.onPreflight || !transaction.onAdopt) return false;\n if (this.retainedNavigationTransaction === transaction) return true;\n this.retainedNavigationTransaction = transaction;\n let prepared: PreparedNavigation | undefined;\n transaction.onPreflight(() => {\n if (this.destroyed) return;\n const candidates: PibblNavigationCandidate[] = [];\n for (const candidate of this.committedNavigationCandidates) {\n if (isHtmlFocusCandidate(candidate)) {\n const geometry = preparedLayoutHtmlGeometry(transaction, candidate.region);\n if (geometry ? !geometry.active : !candidate.region.active || !candidate.region.content) continue;\n candidates.push(Object.freeze({ ...candidate, rootBounds: geometry?.bounds ?? candidate.region.rootBounds }));\n } else {\n candidates.push(Object.freeze({ ...candidate, rootBounds: preparedLayoutTargetBounds(transaction, candidate.target) }));\n }\n }\n prepared = this.prepareNavigationCandidates(Object.freeze(candidates), this.committedBoundaries);\n });\n transaction.onAdopt(() => { if (prepared && !this.destroyed) this.adoptNavigationCandidates(prepared); });\n transaction.onFinish(success => {\n if (this.retainedNavigationTransaction === transaction) this.retainedNavigationTransaction = undefined;\n if (success && prepared && !this.destroyed) this.finishNavigationCandidates();\n });\n return true;\n }\n\n setFocusState(\n target: PibblEventTargetRegistration | undefined,\n focusVisible: boolean,\n ): void {\n if (\n target &&\n !this.committedCandidates.some((candidate) => candidate.target === target)\n ) {\n throw new Error(\n \"Pibbl logical focus target is not a live focus candidate.\",\n );\n }\n this.commitLogicalFocus(target, focusVisible);\n }\n\n liveFocusCandidate(\n target: PibblEventTargetRegistration | undefined,\n ): PibblEventTargetRegistration | undefined {\n return target?.live &&\n target.owner.eventRoot === this.eventRoot &&\n this.committedCandidates.some((candidate) => candidate.target === target)\n ? target\n : undefined;\n }\n\n commitLogicalFocus(\n target: PibblEventTargetRegistration | undefined,\n focusVisible: boolean,\n ): void {\n const nextFocusVisible = Boolean(target && focusVisible);\n if (\n target === this.focusedTarget &&\n nextFocusVisible === this.focusVisible\n ) {\n return;\n }\n const previous = this.focusedTarget;\n if (this.focusedTarget !== target) this.cancelSpaceActivation();\n this.focusedTarget = target;\n this.focusVisible = nextFocusVisible;\n const revision = ++this.focusRenderRevision;\n this.markFocusRenderLayers(previous, revision);\n this.markFocusRenderLayers(target, revision);\n }\n\n enterDirectionalBoundary(boundary: PibblDirectionalBoundary): void {\n const value = asDirectionalBoundary(boundary);\n this.directionalStack.push(value);\n this.pending?.boundaries.add(value);\n }\n\n exitDirectionalBoundary(boundary: PibblDirectionalBoundary): void {\n const value = asDirectionalBoundary(boundary);\n if (this.directionalStack.at(-1) !== value) {\n throw new Error(\"Pibbl directional boundary scope exited out of order.\");\n }\n this.directionalStack.pop();\n }\n\n private currentDirectionalBoundary(): DirectionalBoundary | undefined {\n return this.directionalStack.at(-1);\n }\n\n private markFocusRenderLayers(\n target: PibblEventTargetRegistration | undefined,\n revision: number,\n ): void {\n let instance = target?.owner;\n while (instance && instance !== this.eventRoot.rootInstance) {\n this.layerFocusRenderRevisions.set(instance, revision);\n instance = instance.parent\n ? GLOBAL_STATE.pibblInstances.get(instance.parent)\n : undefined;\n }\n }\n\n dispose(): void {\n if (this.ownerReleased || this.destroyed) return;\n this.coordinator.release(this);\n }\n\n markOwnerReleased(): void {\n this.ownerReleased = true;\n }\n\n destroyFromCoordinator(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n managerOwners.delete(this);\n this.pending = undefined;\n this.directionalStack = [];\n this.pendingPressFocus = undefined;\n this.cancelSpaceActivation();\n this.representedPointerPresses.clear();\n this.representedTouchContacts.clear();\n this.activeTouchIdentifiers.clear();\n this.primaryTouchIdentifier = undefined;\n this.touchSequenceActive = false;\n this.touchMouseCompatibility = undefined;\n for (const boundary of this.committedBoundaries) {\n boundary.commit(Object.freeze([]));\n }\n this.committedBoundaries.clear();\n this.committedCandidates = Object.freeze([]);\n this.clearFocusState();\n }\n\n private recordPendingTarget(\n target: PibblEventTargetRegistration,\n directionalBoundary: DirectionalBoundary | undefined,\n ): void {\n const pending = this.pending;\n if (!pending || pending.observedTargets.has(target)) return;\n pending.observedTargets.add(target);\n const observed = { target, directionalBoundary };\n pending.targets.push(observed);\n pending.entries.push(observed);\n }\n\n private markPendingIneligible(target: PibblEventTargetRegistration): void {\n const pending = this.pending;\n if (!pending) return;\n pending.ineligibleTargets.add(target);\n if (!pending.observedTargets.delete(target)) return;\n for (let index = pending.targets.length - 1; index >= 0; index--) {\n if (pending.targets[index].target === target) {\n pending.targets.splice(index, 1);\n }\n }\n for (let index = pending.entries.length - 1; index >= 0; index--) {\n const entry = pending.entries[index];\n if (\"target\" in entry && entry.target === target)\n pending.entries.splice(index, 1);\n }\n }\n\n private commitCandidates(\n candidates: readonly PibblFocusCandidate[],\n boundaries: ReadonlySet<DirectionalBoundary>,\n ): void {\n const canvasByTarget = new Map(\n candidates.map((candidate) => [candidate.target, candidate]),\n );\n const navigation = this.committedNavigationCandidates\n .map((candidate) =>\n isHtmlFocusCandidate(candidate)\n ? candidate\n : (canvasByTarget.get(candidate.target) ?? candidate),\n )\n .filter(\n (candidate) =>\n isHtmlFocusCandidate(candidate) ||\n candidates.some((canvas) => canvas.target === candidate.target),\n );\n if (navigation.length === 0 && candidates.length > 0)\n navigation.push(...candidates);\n this.commitNavigationCandidates(Object.freeze(navigation), boundaries);\n }\n\n private commitNavigationCandidates(\n candidates: readonly PibblNavigationCandidate[],\n boundaries: ReadonlySet<DirectionalBoundary>,\n ): void {\n this.adoptNavigationCandidates(this.prepareNavigationCandidates(candidates, boundaries));\n this.finishNavigationCandidates();\n }\n\n private prepareNavigationCandidates(\n candidates: readonly PibblNavigationCandidate[],\n boundaries: ReadonlySet<DirectionalBoundary>,\n ): PreparedNavigation {\n const pendingByBoundary = new Map<\n DirectionalBoundary,\n PibblNavigationCandidate[]\n >();\n for (const boundary of boundaries) pendingByBoundary.set(boundary, []);\n for (const candidate of candidates) {\n if (candidate.directionalBoundary instanceof DirectionalBoundary) {\n pendingByBoundary.get(candidate.directionalBoundary)?.push(candidate);\n }\n }\n\n // Freeze every replacement before exposing any one of them. Candidate\n // collection failures therefore leave every committed direct list intact.\n const committedByBoundary = new Map<\n DirectionalBoundary,\n readonly PibblNavigationCandidate[]\n >();\n for (const [boundary, directCandidates] of pendingByBoundary) {\n committedByBoundary.set(boundary, Object.freeze(directCandidates));\n }\n\n return {\n navigation: candidates,\n canvas: Object.freeze(candidates.filter((candidate): candidate is PibblFocusCandidate => !isHtmlFocusCandidate(candidate))),\n html: Object.freeze(candidates.filter((candidate): candidate is PibblHtmlFocusCandidate => isHtmlFocusCandidate(candidate))),\n byBoundary: committedByBoundary,\n boundaries: new Set(committedByBoundary.keys()),\n };\n }\n\n private adoptNavigationCandidates(prepared: PreparedNavigation): void {\n for (const boundary of this.committedBoundaries) {\n if (!prepared.byBoundary.has(boundary)) boundary.commit(EMPTY_NAVIGATION);\n }\n for (const [boundary, candidates] of prepared.byBoundary) boundary.commit(candidates);\n this.committedBoundaries = prepared.boundaries;\n this.committedNavigationCandidates = prepared.navigation;\n this.committedCandidates = prepared.canvas;\n this.committedHtmlCandidates = prepared.html;\n for (const candidate of prepared.canvas) {\n if (candidate.directionalBoundary) retainedDirectionalBoundaries.set(candidate.target, asDirectionalBoundary(candidate.directionalBoundary));\n else retainedDirectionalBoundaries.delete(candidate.target);\n }\n }\n\n private finishNavigationCandidates(): void {\n const candidates = this.committedNavigationCandidates;\n if (\n this.focusedTarget &&\n !candidates.some(\n (candidate) =>\n !isHtmlFocusCandidate(candidate) &&\n candidate.target === this.focusedTarget,\n )\n ) {\n this.clearFocusState();\n }\n if (\n this.focusedHtmlRegion &&\n !this.committedHtmlCandidates.some(\n (candidate) => candidate.region === this.focusedHtmlRegion,\n )\n )\n this.clearHtmlFocus(this.focusedHtmlRegion);\n this.activateDOMHost();\n }\n\n private commitRemovedTarget(target: PibblEventTargetRegistration): void {\n const retained = this.committedCandidates.filter(\n (candidate) => candidate.target !== target,\n );\n const candidates = Object.freeze(\n retained.map((candidate, sourceIndex) =>\n Object.freeze({ ...candidate, sourceIndex }),\n ),\n );\n this.commitCandidates(candidates, this.committedBoundaries);\n }\n\n private clearFocusState(): void {\n this.cancelSpaceActivation();\n this.focusedTarget = undefined;\n this.focusVisible = false;\n }\n\n private adoptHtmlFocus(\n region: HtmlFocusRegion,\n modality: \"keyboard\" | \"pointer\",\n ): void {\n const visible = modality === \"keyboard\";\n if (this.focusedHtmlRegion === region && this.focusVisible === visible)\n return;\n const previous = this.focusedHtmlRegion;\n this.focusedHtmlRegion = region;\n this.focusVisible = visible;\n if (previous && previous !== region)\n this.notifyHtmlFocus(previous, false, false);\n this.notifyHtmlFocus(region, true, visible);\n }\n\n private clearHtmlFocus(region: HtmlFocusRegion): void {\n if (this.focusedHtmlRegion !== region) return;\n this.focusedHtmlRegion = undefined;\n this.focusVisible = false;\n this.notifyHtmlFocus(region, false, false);\n }\n\n private notifyHtmlFocus(\n region: HtmlFocusRegion,\n isFocusWithin: boolean,\n isFocusVisible: boolean,\n ): void {\n region.onFocusSnapshot?.(Object.freeze({ isFocusWithin, isFocusVisible }));\n }\n\n private applyPressFocus(\n requestedTarget: PibblEventTargetRegistration | undefined,\n ): void {\n const target = this.liveFocusCandidate(requestedTarget);\n const pending = { target };\n this.pendingPressFocus = pending;\n try {\n this.coordinator.focusCanvasFromPress(this);\n if (\n this.pendingPressFocus !== pending ||\n this.destroyed ||\n this.canvas.ownerDocument.activeElement !== this.canvas\n ) {\n return;\n }\n this.pendingPressFocus = undefined;\n transitionLogicalFocus(this, this.liveFocusCandidate(target), \"pointer\");\n } finally {\n if (this.pendingPressFocus === pending)\n this.pendingPressFocus = undefined;\n }\n }\n\n beginSpaceActivation(target: PibblEventTargetRegistration): void {\n this.pendingSpaceTarget = target;\n }\n\n hasPendingSpaceActivation(\n target: PibblEventTargetRegistration | undefined,\n ): boolean {\n return Boolean(target && this.pendingSpaceTarget === target);\n }\n\n consumeSpaceActivation(): PibblEventTargetRegistration | undefined {\n const target = this.pendingSpaceTarget;\n this.pendingSpaceTarget = undefined;\n return target;\n }\n\n cancelSpaceActivation(): void {\n this.pendingSpaceTarget = undefined;\n }\n\n private recordPointerPress(input: PibblFocusPressDefaultInput): void {\n if (input.pointerId === undefined) return;\n this.representedPointerPresses.set(input.pointerId, {\n x: input.x,\n y: input.y,\n timeStamp: input.originalEvent.timeStamp,\n suppressMouse: true,\n suppressTouch: input.pointerType === \"touch\",\n });\n }\n\n private consumeRepresentedMousePress(\n input: PibblFocusPressDefaultInput,\n ): boolean {\n for (const [pointerId, press] of this.representedPointerPresses) {\n if (!press.suppressMouse || !samePress(press, input)) continue;\n press.suppressMouse = false;\n if (!press.suppressTouch)\n this.representedPointerPresses.delete(pointerId);\n return true;\n }\n if (\n this.touchMouseCompatibility &&\n samePress(this.touchMouseCompatibility, input)\n ) {\n this.touchMouseCompatibility = undefined;\n return true;\n }\n return false;\n }\n\n private consumeRepresentedTouchPress(\n input: PibblFocusPressDefaultInput,\n ): boolean {\n const identifier = input.touchIdentifier;\n if (identifier === undefined) return false;\n const existing = this.representedTouchContacts.get(identifier);\n if (existing && samePress(existing, input)) return true;\n this.representedTouchContacts.set(identifier, pressRecord(input));\n\n for (const [pointerId, press] of this.representedPointerPresses) {\n if (!press.suppressTouch || !samePress(press, input)) continue;\n press.suppressTouch = false;\n if (!press.suppressMouse)\n this.representedPointerPresses.delete(pointerId);\n return true;\n }\n return false;\n }\n\n private recordTouchFallback(input: PibblFocusPressDefaultInput): void {\n this.touchMouseCompatibility = pressRecord(input);\n }\n\n private recordTouchStarts(\n input: PibblFocusTouchDefaultInput,\n ): PibblFocusTouchDefaultContact | undefined {\n let primary: PibblFocusTouchDefaultContact | undefined;\n for (const contact of input.changedContacts) {\n if (this.activeTouchIdentifiers.has(contact.identifier)) continue;\n if (!this.touchSequenceActive) {\n this.touchSequenceActive = true;\n this.primaryTouchIdentifier = contact.identifier;\n }\n if (contact.identifier === this.primaryTouchIdentifier) primary = contact;\n this.activeTouchIdentifiers.add(contact.identifier);\n }\n return primary;\n }\n\n private reconcileTouchContacts(input: PibblFocusTouchDefaultInput): void {\n const activeIdentifiers = new Set(input.activeIdentifiers);\n for (const identifier of this.activeTouchIdentifiers) {\n if (activeIdentifiers.has(identifier)) continue;\n this.activeTouchIdentifiers.delete(identifier);\n this.representedTouchContacts.delete(identifier);\n }\n\n const startingIdentifiers =\n input.type === \"touchstart\"\n ? new Set(input.changedContacts.map((contact) => contact.identifier))\n : undefined;\n for (const identifier of activeIdentifiers) {\n if (!startingIdentifiers?.has(identifier)) {\n this.activeTouchIdentifiers.add(identifier);\n }\n }\n\n if (this.activeTouchIdentifiers.size > 0) {\n this.touchSequenceActive = true;\n return;\n }\n this.touchSequenceActive = false;\n this.primaryTouchIdentifier = undefined;\n this.representedTouchContacts.clear();\n }\n\n private recordTouchTerminals(input: PibblFocusTouchDefaultInput): void {\n for (const contact of input.changedContacts) {\n this.activeTouchIdentifiers.delete(contact.identifier);\n this.representedTouchContacts.delete(contact.identifier);\n }\n if (this.activeTouchIdentifiers.size > 0) return;\n this.touchSequenceActive = false;\n this.primaryTouchIdentifier = undefined;\n this.representedTouchContacts.clear();\n }\n\n private purgeExpiredPresses(timeStamp: number): void {\n for (const [pointerId, press] of this.representedPointerPresses) {\n if (!recentPress(press, timeStamp)) {\n this.representedPointerPresses.delete(pointerId);\n }\n }\n for (const [identifier, press] of this.representedTouchContacts) {\n if (!recentPress(press, timeStamp)) {\n this.representedTouchContacts.delete(identifier);\n }\n }\n if (\n this.touchMouseCompatibility &&\n !recentPress(this.touchMouseCompatibility, timeStamp)\n ) {\n this.touchMouseCompatibility = undefined;\n }\n }\n\n private assertLive(): void {\n if (this.destroyed) throw new Error(\"Pibbl focus manager is disposed.\");\n }\n}\n\nfunction pressWasPrevented(input: PibblFocusPressDefaultInput): boolean {\n return input.event?.defaultPrevented ?? input.originalEvent.defaultPrevented;\n}\n\nfunction pressRecord(input: PibblFocusPressDefaultInput): RepresentedPress {\n return {\n x: input.x,\n y: input.y,\n timeStamp: input.originalEvent.timeStamp,\n };\n}\n\nfunction samePress(\n press: RepresentedPress,\n input: PibblFocusPressDefaultInput,\n): boolean {\n return (\n recentPress(press, input.originalEvent.timeStamp) &&\n Math.abs(press.x - input.x) <= 1 &&\n Math.abs(press.y - input.y) <= 1\n );\n}\n\nfunction recentPress(press: RepresentedPress, timeStamp: number): boolean {\n const elapsed = timeStamp - press.timeStamp;\n return elapsed >= 0 && elapsed <= COMPATIBILITY_PRESS_WINDOW_MS;\n}\n\nexport function createFocusManager(\n eventRoot: PibblEventRoot,\n owner: PibblInstance,\n): PibblFocusManager {\n return new PibblFocusManager(eventRoot, owner);\n}\n\nexport function requireFocusManager(eventRoot: PibblEventRoot): PibblFocusManager {\n const manager = eventRoot.focusPolicy;\n if (!(manager instanceof PibblFocusManager)) {\n throw new Error(\n \"KeyboardNavigation requires an active FocusManagement focus manager.\",\n );\n }\n return manager;\n}\n\nexport function createDirectionalBoundary(\n owner: PibblInstance,\n): PibblDirectionalBoundary {\n return new DirectionalBoundary(owner);\n}\n\nfunction getCoordinator(eventRoot: PibblEventRoot): FocusManagerCoordinator {\n let coordinator = coordinators.get(eventRoot);\n if (!coordinator) {\n coordinator = new FocusManagerCoordinator(eventRoot);\n coordinators.set(eventRoot, coordinator);\n }\n return coordinator;\n}\n\nfunction duplicateManagerError(): Error {\n return new Error(\n \"FocusManagement allows only one focus manager per Pibbl root.\",\n );\n}\n\nfunction asDirectionalBoundary(\n boundary: PibblDirectionalBoundary,\n): DirectionalBoundary {\n if (!(boundary instanceof DirectionalBoundary)) {\n throw new Error(\"Unknown Pibbl directional boundary.\");\n }\n return boundary;\n}\n\nfunction isKeyboardFocusable(target: PibblEventTargetRegistration): boolean {\n return (\n target.keyboardFocusable ??\n Boolean(\n target.handlers.click || target.handlers.keydown || target.handlers.keyup,\n )\n );\n}\n\nfunction collectRetainedTargets(\n instance: PibblInstance,\n targets: PibblEventTargetRegistration[],\n): void {\n if (instance.mainTeardowns.closed) return;\n for (const target of instance.eventRoot.targets) {\n if (\n target.live &&\n target.owner.eventRoot === instance.eventRoot &&\n !target.owner.mainTeardowns.closed &&\n isInstanceWithin(target.owner, instance)\n )\n targets.push(target);\n }\n}\n\nfunction isInstanceWithin(\n instance: PibblInstance,\n ancestor: PibblInstance,\n): boolean {\n let current: PibblInstance | undefined = instance;\n while (current) {\n if (current === ancestor) return true;\n current = current.parent\n ? GLOBAL_STATE.pibblInstances.get(current.parent)\n : undefined;\n }\n return false;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -2,3 +2,5 @@ import type { PibblEventTargetRegistration } from '../events/registrations.js';
|
|
|
2
2
|
import type { LayoutBox } from '../layout/types.js';
|
|
3
3
|
/** Converts one target-local navigation rectangle to root-logical space. */
|
|
4
4
|
export declare function resolveTargetRootBounds(target: PibblEventTargetRegistration): Readonly<LayoutBox> | undefined;
|
|
5
|
+
/** Geometry preparation only; dispatch and navigation use the adopted generation. */
|
|
6
|
+
export declare function resolveStagedTargetRootBounds(target: PibblEventTargetRegistration): Readonly<LayoutBox> | undefined;
|
|
@@ -1,8 +1,13 @@
|
|
|
1
|
+
import { committedLayoutTargetBounds } from "../layout/geometry-publication.js";
|
|
1
2
|
import { GLOBAL_STATE } from "../global-state.js";
|
|
2
3
|
import {
|
|
3
4
|
PibblPaintEntryKind
|
|
4
5
|
} from "../events/paint-entry.js";
|
|
5
6
|
function resolveTargetRootBounds(target) {
|
|
7
|
+
const committed = committedLayoutTargetBounds(target);
|
|
8
|
+
return committed ? committed.get(target) : resolveStagedTargetRootBounds(target);
|
|
9
|
+
}
|
|
10
|
+
function resolveStagedTargetRootBounds(target) {
|
|
6
11
|
const bounds = target.keyboardNavigationBounds;
|
|
7
12
|
const points = target.keyboardNavigationPoints ?? (bounds ? [
|
|
8
13
|
{ x: bounds.x, y: bounds.y },
|
|
@@ -59,6 +64,7 @@ function findNestedInstanceBridge(parent, child) {
|
|
|
59
64
|
return void 0;
|
|
60
65
|
}
|
|
61
66
|
export {
|
|
67
|
+
resolveStagedTargetRootBounds,
|
|
62
68
|
resolveTargetRootBounds
|
|
63
69
|
};
|
|
64
70
|
//# sourceMappingURL=geometry.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/lib/focus/geometry.ts"],
|
|
4
|
-
"sourcesContent": ["import type { PibblEventTargetRegistration } from '../events/registrations.js';\nimport { GLOBAL_STATE } from '../global-state.js';\nimport type { LayoutBox } from '../layout/types.js';\nimport type { PibblInstance } from '../types.js';\nimport {\n PibblPaintEntryKind,\n type PibblNestedPaintEntry,\n} from '../events/paint-entry.js';\n\n/** Converts one target-local navigation rectangle to root-logical space. */\nexport function resolveTargetRootBounds(\n target: PibblEventTargetRegistration,\n): Readonly<LayoutBox> | undefined {\n const bounds = target.keyboardNavigationBounds;\n const points = target.keyboardNavigationPoints ?? (bounds ? [\n { x: bounds.x, y: bounds.y },\n { x: bounds.x + bounds.width, y: bounds.y },\n { x: bounds.x, y: bounds.y + bounds.height },\n { x: bounds.x + bounds.width, y: bounds.y + bounds.height },\n ] : undefined);\n if (!points?.length) return undefined;\n\n const transform = resolveRootTransform(target);\n if (!transform) return undefined;\n const corners = points.map(point =>\n transform.transformPoint(new DOMPoint(point.x, point.y))\n );\n if (corners.some(point => !Number.isFinite(point.x) || !Number.isFinite(point.y))) {\n return undefined;\n }\n\n const xs = corners.map(point => point.x);\n const ys = corners.map(point => point.y);\n const left = Math.min(...xs);\n const right = Math.max(...xs);\n const top = Math.min(...ys);\n const bottom = Math.max(...ys);\n return Object.freeze({\n x: left,\n y: top,\n width: right - left,\n height: bottom - top,\n });\n}\n\nfunction resolveRootTransform(\n target: PibblEventTargetRegistration,\n): DOMMatrix | undefined {\n let owner = target.owner;\n // Geometry-independent backend targets publish layer-local focus rectangles.\n // Their initial transform is identity; nested resolver bridges compose the\n // owning layer into root-logical space below.\n let transform = target.paintEntry?.transform ?? new DOMMatrix();\n const root = owner.eventRoot.rootInstance;\n if (!root) return undefined;\n\n while (owner !== root) {\n const parentCanvas = owner.parent;\n if (!parentCanvas) return undefined;\n const parent = GLOBAL_STATE.pibblInstances.get(parentCanvas);\n if (!parent) return undefined;\n const bridge = findNestedInstanceBridge(parent, owner);\n if (!bridge) return undefined;\n transform = bridge.transform.multiply(transform);\n owner = parent;\n }\n return transform;\n}\n\nfunction findNestedInstanceBridge(\n parent: PibblInstance,\n child: PibblInstance,\n): PibblNestedPaintEntry | undefined {\n if (\n parent.mainTeardowns.closed ||\n child.mainTeardowns.closed ||\n child.parent !== parent.canvas ||\n child.eventRoot !== parent.eventRoot\n ) return undefined;\n const focusBridge = child.focusParentBridge;\n if (focusBridge?.instance === child) return focusBridge;\n for (const entry of parent.paintEntries) {\n if (\n (entry.paintKind === PibblPaintEntryKind.NestedInstance ||\n entry.paintKind === PibblPaintEntryKind.Resolver) &&\n entry.instance === child\n ) return entry;\n }\n return undefined;\n}\n"],
|
|
5
|
-
"mappings": "
|
|
4
|
+
"sourcesContent": ["import { committedLayoutTargetBounds } from '../layout/geometry-publication.js';\nimport type { PibblEventTargetRegistration } from '../events/registrations.js';\nimport { GLOBAL_STATE } from '../global-state.js';\nimport type { LayoutBox } from '../layout/types.js';\nimport type { PibblInstance } from '../types.js';\nimport {\n PibblPaintEntryKind,\n type PibblNestedPaintEntry,\n} from '../events/paint-entry.js';\n\n/** Converts one target-local navigation rectangle to root-logical space. */\nexport function resolveTargetRootBounds(\n target: PibblEventTargetRegistration,\n): Readonly<LayoutBox> | undefined {\n const committed = committedLayoutTargetBounds(target);\n return committed ? committed.get(target) : resolveStagedTargetRootBounds(target);\n}\n\n/** Geometry preparation only; dispatch and navigation use the adopted generation. */\nexport function resolveStagedTargetRootBounds(\n target: PibblEventTargetRegistration,\n): Readonly<LayoutBox> | undefined {\n const bounds = target.keyboardNavigationBounds;\n const points = target.keyboardNavigationPoints ?? (bounds ? [\n { x: bounds.x, y: bounds.y },\n { x: bounds.x + bounds.width, y: bounds.y },\n { x: bounds.x, y: bounds.y + bounds.height },\n { x: bounds.x + bounds.width, y: bounds.y + bounds.height },\n ] : undefined);\n if (!points?.length) return undefined;\n\n const transform = resolveRootTransform(target);\n if (!transform) return undefined;\n const corners = points.map(point =>\n transform.transformPoint(new DOMPoint(point.x, point.y))\n );\n if (corners.some(point => !Number.isFinite(point.x) || !Number.isFinite(point.y))) {\n return undefined;\n }\n\n const xs = corners.map(point => point.x);\n const ys = corners.map(point => point.y);\n const left = Math.min(...xs);\n const right = Math.max(...xs);\n const top = Math.min(...ys);\n const bottom = Math.max(...ys);\n return Object.freeze({\n x: left,\n y: top,\n width: right - left,\n height: bottom - top,\n });\n}\n\nfunction resolveRootTransform(\n target: PibblEventTargetRegistration,\n): DOMMatrix | undefined {\n let owner = target.owner;\n // Geometry-independent backend targets publish layer-local focus rectangles.\n // Their initial transform is identity; nested resolver bridges compose the\n // owning layer into root-logical space below.\n let transform = target.paintEntry?.transform ?? new DOMMatrix();\n const root = owner.eventRoot.rootInstance;\n if (!root) return undefined;\n\n while (owner !== root) {\n const parentCanvas = owner.parent;\n if (!parentCanvas) return undefined;\n const parent = GLOBAL_STATE.pibblInstances.get(parentCanvas);\n if (!parent) return undefined;\n const bridge = findNestedInstanceBridge(parent, owner);\n if (!bridge) return undefined;\n transform = bridge.transform.multiply(transform);\n owner = parent;\n }\n return transform;\n}\n\nfunction findNestedInstanceBridge(\n parent: PibblInstance,\n child: PibblInstance,\n): PibblNestedPaintEntry | undefined {\n if (\n parent.mainTeardowns.closed ||\n child.mainTeardowns.closed ||\n child.parent !== parent.canvas ||\n child.eventRoot !== parent.eventRoot\n ) return undefined;\n const focusBridge = child.focusParentBridge;\n if (focusBridge?.instance === child) return focusBridge;\n for (const entry of parent.paintEntries) {\n if (\n (entry.paintKind === PibblPaintEntryKind.NestedInstance ||\n entry.paintKind === PibblPaintEntryKind.Resolver) &&\n entry.instance === child\n ) return entry;\n }\n return undefined;\n}\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,mCAAmC;AAE5C,SAAS,oBAAoB;AAG7B;AAAA,EACE;AAAA,OAEK;AAGA,SAAS,wBACd,QACiC;AACjC,QAAM,YAAY,4BAA4B,MAAM;AACpD,SAAO,YAAY,UAAU,IAAI,MAAM,IAAI,8BAA8B,MAAM;AACjF;AAGO,SAAS,8BACd,QACiC;AACjC,QAAM,SAAS,OAAO;AACtB,QAAM,SAAS,OAAO,6BAA6B,SAAS;AAAA,IAC1D,EAAE,GAAG,OAAO,GAAG,GAAG,OAAO,EAAE;AAAA,IAC3B,EAAE,GAAG,OAAO,IAAI,OAAO,OAAO,GAAG,OAAO,EAAE;AAAA,IAC1C,EAAE,GAAG,OAAO,GAAG,GAAG,OAAO,IAAI,OAAO,OAAO;AAAA,IAC3C,EAAE,GAAG,OAAO,IAAI,OAAO,OAAO,GAAG,OAAO,IAAI,OAAO,OAAO;AAAA,EAC5D,IAAI;AACJ,MAAI,CAAC,QAAQ,OAAQ,QAAO;AAE5B,QAAM,YAAY,qBAAqB,MAAM;AAC7C,MAAI,CAAC,UAAW,QAAO;AACvB,QAAM,UAAU,OAAO;AAAA,IAAI,WACzB,UAAU,eAAe,IAAI,SAAS,MAAM,GAAG,MAAM,CAAC,CAAC;AAAA,EACzD;AACA,MAAI,QAAQ,KAAK,WAAS,CAAC,OAAO,SAAS,MAAM,CAAC,KAAK,CAAC,OAAO,SAAS,MAAM,CAAC,CAAC,GAAG;AACjF,WAAO;AAAA,EACT;AAEA,QAAM,KAAK,QAAQ,IAAI,WAAS,MAAM,CAAC;AACvC,QAAM,KAAK,QAAQ,IAAI,WAAS,MAAM,CAAC;AACvC,QAAM,OAAO,KAAK,IAAI,GAAG,EAAE;AAC3B,QAAM,QAAQ,KAAK,IAAI,GAAG,EAAE;AAC5B,QAAM,MAAM,KAAK,IAAI,GAAG,EAAE;AAC1B,QAAM,SAAS,KAAK,IAAI,GAAG,EAAE;AAC7B,SAAO,OAAO,OAAO;AAAA,IACnB,GAAG;AAAA,IACH,GAAG;AAAA,IACH,OAAO,QAAQ;AAAA,IACf,QAAQ,SAAS;AAAA,EACnB,CAAC;AACH;AAEA,SAAS,qBACP,QACuB;AACvB,MAAI,QAAQ,OAAO;AAInB,MAAI,YAAY,OAAO,YAAY,aAAa,IAAI,UAAU;AAC9D,QAAM,OAAO,MAAM,UAAU;AAC7B,MAAI,CAAC,KAAM,QAAO;AAElB,SAAO,UAAU,MAAM;AACrB,UAAM,eAAe,MAAM;AAC3B,QAAI,CAAC,aAAc,QAAO;AAC1B,UAAM,SAAS,aAAa,eAAe,IAAI,YAAY;AAC3D,QAAI,CAAC,OAAQ,QAAO;AACpB,UAAM,SAAS,yBAAyB,QAAQ,KAAK;AACrD,QAAI,CAAC,OAAQ,QAAO;AACpB,gBAAY,OAAO,UAAU,SAAS,SAAS;AAC/C,YAAQ;AAAA,EACV;AACA,SAAO;AACT;AAEA,SAAS,yBACP,QACA,OACmC;AACnC,MACE,OAAO,cAAc,UACrB,MAAM,cAAc,UACpB,MAAM,WAAW,OAAO,UACxB,MAAM,cAAc,OAAO,UAC3B,QAAO;AACT,QAAM,cAAc,MAAM;AAC1B,MAAI,aAAa,aAAa,MAAO,QAAO;AAC5C,aAAW,SAAS,OAAO,cAAc;AACvC,SACG,MAAM,cAAc,oBAAoB,kBACvC,MAAM,cAAc,oBAAoB,aAC1C,MAAM,aAAa,MACnB,QAAO;AAAA,EACX;AACA,SAAO;AACT;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -31,7 +31,7 @@ function prepareBendGuide(path) {
|
|
|
31
31
|
const span = straightSpan(raw);
|
|
32
32
|
const first = tangent(span, false), last = tangent(span, true);
|
|
33
33
|
if (spans.length) sameTangent(tangent(spans.at(-1), true), first);
|
|
34
|
-
if (![
|
|
34
|
+
if (!Number.isFinite(first[0]) || !Number.isFinite(first[1]) || !Number.isFinite(last[0]) || !Number.isFinite(last[1])) throw new RangeError("Guide limiting tangent is not finite.");
|
|
35
35
|
spans.push(span);
|
|
36
36
|
}
|
|
37
37
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/lib/geometry/path-bend-guide.ts"],
|
|
4
|
-
"sourcesContent": ["import { ellipseParameters, singularArcPoints } from './path-arc.js';\nimport { bendSpanBounds, bendSpanPoint, bendSpans, splitBendSpan, type BendPoint, type BendSpan } from './path-bend-spans.js';\nimport { PathGeometry } from './path-geometry.js';\n\ninterface Field { readonly point: BendPoint; readonly normal: BendPoint }\ninterface Leaf {\n readonly span: BendSpan; readonly depth: number;\n readonly first: Field; readonly last: Field;\n readonly chord: number; readonly excess: number;\n readonly sag: number; readonly normalError: number;\n}\ninterface Knot extends Field { readonly distance: number }\nexport interface PreparedBendGuide {\n readonly spans: readonly BendSpan[];\n readonly closed: boolean;\n readonly scale: number;\n}\n\n// Includes failed refinement and field-envelope visits. No resource survives a call.\nconst MAX_GUIDE_WORK = 2_000_000;\nconst MAX_GUIDE_LEAVES = 131_072;\nconst MAX_GUIDE_DEPTH = 48;\nconst JOIN_ROUNDOFF = 512 * Number.EPSILON;\n\n/** Validate all guide contours and joins, even if the source uses only part. */\nexport function prepareBendGuide(path: PathGeometry): PreparedBendGuide {\n const spans: BendSpan[] = [];\n let moves = 0, closed = false, scale = 0;\n for (const item of bendSpans(path)) {\n if (item.type === 'move') {\n if (++moves > 1) throw new RangeError('Along Path requires exactly one guide contour.');\n scale = Math.max(scale, ...item.point.map(Math.abs));\n } else if (item.type === 'close') closed = true;\n else {\n closed = false;\n const bounds = bendSpanBounds(item.span);\n scale = Math.max(scale, Math.abs(bounds.xmin), Math.abs(bounds.xmax), Math.abs(bounds.ymin), Math.abs(bounds.ymax));\n if ('arc' in item.span && !ellipseParameters(item.span.arc)) {\n const points = [bendSpanPoint(item.span, 0), ...singularArcPoints(item.span.arc)];\n for (let i = 1; i < points.length; i++) append({ points: [points[i - 1], points[i]] });\n } else append(item.span);\n }\n }\n if (!spans.length) throw new RangeError('Along Path requires a guide of positive length.');\n if (closed) sameTangent(tangent(spans.at(-1)!, true), tangent(spans[0], false));\n return { spans, closed, scale };\n\n function append(raw: BendSpan) {\n const b = bendSpanBounds(raw);\n // Numerically coincident endpoints/control hulls carry no reliable direction.\n if (Math.hypot(b.xmax - b.xmin, b.ymax - b.ymin) <= scale * Number.EPSILON * 32) return;\n const span = straightSpan(raw);\n const first = tangent(span, false), last = tangent(span, true);\n if (spans.length) sameTangent(tangent(spans.at(-1)!, true), first);\n if (![...first, ...last].every(Number.isFinite)) throw new RangeError('Guide limiting tangent is not finite.');\n spans.push(span);\n }\n}\n\n/**\n * A continuous piecewise-linear position/normal field with a certified error\n * against the true arc-length field. Interpolated normals are deliberately NOT\n * renormalized: this keeps the internal mapping bilinear within each leaf.\n */\nexport function measureBendGuide(\n prepared: PreparedBendGuide,\n tolerance: number,\n maxDisplacement: number,\n distanceFactor: (length: number) => number,\n) {\n let work = 0;\n const charge = () => { if (++work > MAX_GUIDE_WORK) throw new RangeError('Along Path exceeded its guide work budget.'); };\n const roundoff = prepared.scale * Number.EPSILON * 128;\n if (!Number.isFinite(roundoff) || roundoff >= tolerance / 16) throw new RangeError('Guide coordinates cannot support the requested tolerance.');\n let pending = prepared.spans.map(span => ({ span, depth: 0 }));\n let leaves: Leaf[] = [];\n let target = tolerance / 32;\n let length = 0, uncertainty = 0, error = Infinity;\n for (let pass = 0; pass < 24; pass++) {\n leaves = [];\n const stack = [...pending].reverse();\n while (stack.length) {\n charge();\n const { span, depth } = stack.pop()!;\n const leaf = certifyLeaf(span, depth);\n if (leaf && leaf.sag + maxDisplacement * leaf.normalError <= target) {\n if (leaves.length >= MAX_GUIDE_LEAVES) throw new RangeError('Along Path exceeded its guide subdivision budget.');\n leaves.push(leaf);\n } else {\n if (depth >= MAX_GUIDE_DEPTH) throw new RangeError('Guide has a cusp, reversal, or numerically uncertifiable tangent.');\n const [left, right] = splitBendSpan(span);\n stack.push({ span: right, depth: depth + 1 }, { span: left, depth: depth + 1 });\n }\n }\n length = 0; uncertainty = 0;\n let compensation = 0, sag = 0, normalError = 0, normalSlope = 0, joinError = JOIN_ROUNDOFF;\n let previous: Leaf | undefined;\n for (const leaf of leaves) {\n // Original segment joins were validated before subdivision. Inside a\n // polynomial/ellipse, the two limiting tangents at a split must agree or\n // reverse at a cusp. Subtracted tiny control edges amplify roundoff, so\n // do not reuse the original-join angular threshold here. Reject reversals\n // and account for the shared-knot normal replacement in the error bound.\n if (previous) {\n const a = previous.last.normal, b = leaf.first.normal;\n if (a[0] * b[0] + a[1] * b[1] <= 0) throw new RangeError('Along Path guide reverses direction at an internal cusp.');\n joinError = Math.max(joinError, norm(subtract(a, b)));\n }\n previous = leaf;\n // Compensated sums avoid accumulating an O(number-of-leaves) length bias.\n const next = leaf.chord - compensation, sum = length + next;\n compensation = (sum - length) - next; length = sum;\n uncertainty += leaf.excess;\n normalSlope = Math.max(normalSlope, norm(subtract(leaf.last.normal, leaf.first.normal)) / leaf.chord);\n sag = Math.max(sag, leaf.sag); normalError = Math.max(normalError, leaf.normalError);\n }\n if (!(length > 0) || !Number.isFinite(length)) throw new RangeError('Guide length must be finite and positive.');\n uncertainty += roundoff + length * Number.EPSILON * 128;\n // phi maps chord distance to true arc distance and has inverse Lipschitz\n // constant <=1. Its deviation from identity is bounded by total excess.\n // distanceFactor includes fit/alignment and any unwrapped guide laps.\n const distanceError = uncertainty * distanceFactor(length);\n error = sag + maxDisplacement * (normalError + joinError) + (1 + maxDisplacement * normalSlope) * distanceError + roundoff;\n if (Number.isFinite(error) && error <= tolerance / 4) break;\n if (pass === 23) throw new RangeError('Along Path cannot certify its guide-distance and normal error.');\n target /= 2;\n pending = leaves.flatMap(leaf => {\n if (leaf.depth >= MAX_GUIDE_DEPTH) throw new RangeError('Guide measurement reached numerical nonprogress.');\n const [left, right] = splitBendSpan(leaf.span);\n return [{ span: left, depth: leaf.depth + 1 }, { span: right, depth: leaf.depth + 1 }];\n });\n }\n const knots: Knot[] = [{ ...leaves[0].first, distance: 0 }];\n let cumulative = 0, compensation = 0;\n for (const leaf of leaves) {\n const next = leaf.chord - compensation, sum = cumulative + next;\n compensation = (sum - cumulative) - next; cumulative = sum;\n knots.push({ ...leaf.last, distance: cumulative });\n }\n // Joins are already checked. Sharing the endpoint field prevents tiny normal\n // jumps at the closed seam from becoming artificial output edges.\n if (prepared.closed) knots[knots.length - 1] = { ...knots[0], distance: length };\n\n function field(distance: number, wrap: boolean): Field {\n charge();\n if (!Number.isFinite(distance)) throw new RangeError('Mapped guide distance overflowed.');\n if (wrap) distance = ((distance % length) + length) % length;\n if (distance < 0 || distance > length) {\n const end = distance < 0 ? knots[0] : knots.at(-1)!;\n const d = distance - end.distance;\n return { normal: end.normal, point: [end.point[0] + d * end.normal[1], end.point[1] - d * end.normal[0]] };\n }\n if (distance === length) return knots.at(-1)!;\n const i = index(distance), a = knots[i], b = knots[i + 1];\n const u = (distance - a.distance) / (b.distance - a.distance);\n return { point: lerp(a.point, b.point, u), normal: lerp(a.normal, b.normal, u) };\n }\n function index(distance: number): number {\n let low = 0, high = knots.length - 1;\n while (low + 1 < high) {\n const mid = Math.floor((low + high) / 2);\n if (knots[mid].distance <= distance) low = mid; else high = mid;\n }\n return low;\n }\n function envelope(low: number, high: number, wrap: boolean, visit: (distance: number, value: Field) => void) {\n visit(low, field(low, wrap)); visit(high, field(high, wrap));\n if (!wrap) {\n for (let i = index(Math.max(0, low)); i < knots.length && knots[i].distance <= high; i++) {\n if (knots[i].distance >= low) { charge(); visit(knots[i].distance, knots[i]); }\n }\n } else {\n const firstLap = Math.floor(low / length), lastLap = Math.floor(high / length);\n if (!Number.isSafeInteger(firstLap) || !Number.isSafeInteger(lastLap) || lastLap - firstLap > MAX_GUIDE_WORK) throw new RangeError('Too many guide laps to certify.');\n for (let lap = firstLap; lap <= lastLap; lap++) {\n charge();\n const offset = lap * length;\n for (let i = index(Math.max(0, low - offset)); i < knots.length && knots[i].distance + offset <= high; i++) {\n const s = knots[i].distance + offset;\n if (s >= low) { charge(); visit(s, knots[i]); }\n }\n }\n }\n }\n return {\n length, uncertainty, error, field, knots,\n /** Conservative full-field residual, not a sampled flatness heuristic. */\n chordError(low: number, high: number, s0: number, s1: number, d: number, ds: number, dds: number, dy: number, ddy: number, wrap: boolean): number {\n const first = field(s0, wrap), last = field(s1, wrap);\n const delta = s1 - s0;\n const v = delta === 0 ? [0, 0] as const : scaleVector(subtract(last.point, first.point), 1 / delta);\n const q = delta === 0 ? [0, 0] as const : scaleVector(subtract(last.normal, first.normal), 1 / delta);\n const baseNormal = (s: number): BendPoint => add(first.normal, scaleVector(q, s - s0));\n let positionResidual = 0, normalResidual = 0;\n envelope(low, high, wrap, (s, value) => {\n positionResidual = Math.max(positionResidual, norm(subtract(value.point, add(first.point, scaleVector(v, s - s0)))));\n normalResidual = Math.max(normalResidual, norm(subtract(value.normal, baseNormal(s))));\n });\n const baseNormalSize = Math.max(norm(baseNormal(low)), norm(baseNormal(high)));\n const polynomialError = ((norm(v) + d * norm(q)) * dds + baseNormalSize * ddy + 2 * norm(q) * ds * dy) / 8;\n return error + polynomialError + positionResidual + d * normalResidual;\n },\n };\n}\n\nfunction certifyLeaf(span: BendSpan, depth: number): Leaf | undefined {\n if ('arc' in span && Math.abs(span.arc.sweep) > Math.PI / 2) return undefined;\n const a = bendSpanPoint(span, 0), b = bendSpanPoint(span, 1), chordVector = subtract(b, a), chord = norm(chordVector);\n if (!(chord > 0) || !Number.isFinite(chord)) return undefined;\n const axis = scaleVector(chordVector, 1 / chord);\n let ratio = 0, minProjection = Infinity;\n const hull = derivativeHull(span);\n for (const vector of hull) {\n const magnitude = norm(vector);\n if (magnitude === 0) { minProjection = 0; continue; }\n const v = scaleVector(vector, 1 / magnitude);\n const projection = v[0] * axis[0] + v[1] * axis[1];\n if (!(projection > 0)) return undefined;\n minProjection = Math.min(minProjection, projection * magnitude);\n ratio = Math.max(ratio, Math.abs(v[0] * axis[1] - v[1] * axis[0]) / projection);\n }\n const hyp = Math.hypot(1, ratio);\n // All derivatives lie in a directed cone around the chord. Its minimum\n // projection bounds length; its diameter bounds normal interpolation error.\n const excess = chord * ratio * (ratio / (hyp + 1)); // chord*(hyp-1), without cancellation\n const eta = ratio * Math.sqrt(2 / (hyp * (hyp + 1)));\n const first = normal(tangent(span, false)), last = normal(tangent(span, true));\n let normalError = 2 * ratio / hyp;\n // On regular spans use the second derivative of N with respect to arc length.\n // |N''| <= Q/m\u00B3 + 4A\u00B2/m\u2074, where m bounds speed below and A,Q bound the\n // second/third parameter derivatives. The cone remains the fallback at\n // removable stationary endpoints, where m can be zero but the normal exists.\n if (minProjection > 0) {\n let m: number, acceleration: number, jerk: number;\n if ('points' in span) {\n const degree = span.points.length - 1;\n m = minProjection * degree;\n const second = hull.slice(1).map((v, i) => scaleVector(subtract(v, hull[i]), degree * (degree - 1)));\n acceleration = Math.max(0, ...second.map(norm));\n jerk = Math.max(0, ...second.slice(1).map((v, i) => norm(subtract(v, second[i])) * (degree - 2)));\n } else {\n const h = Math.abs(span.arc.sweep), basis = Math.hypot(span.arc.ux, span.arc.uy) + Math.hypot(span.arc.vx, span.arc.vy);\n m = minProjection * h; acceleration = basis * h * h; jerk = acceleration * h;\n }\n const lengthOverSpeed = (chord + excess) / m;\n const error = (jerk / m + 4 * (acceleration / m) ** 2) * lengthOverSpeed ** 2 / 8;\n if (Number.isFinite(error)) normalError = Math.min(normalError, error);\n }\n return { span, depth, first: { point: a, normal: first }, last: { point: b, normal: last }, chord, excess, sag: (chord + excess) * eta / 2, normalError };\n}\n\nfunction derivativeHull(span: BendSpan): readonly BendPoint[] {\n if ('points' in span) return span.points.slice(1).map((point, i) => subtract(point, span.points[i]));\n const a = span.arc;\n return [a.startAngle, a.startAngle + a.sweep].map(theta => [\n Math.sign(a.sweep) * (-a.ux * Math.sin(theta) + a.vx * Math.cos(theta)),\n Math.sign(a.sweep) * (-a.uy * Math.sin(theta) + a.vy * Math.cos(theta)),\n ]);\n}\nfunction tangent(span: BendSpan, end: boolean): BendPoint {\n const vectors = derivativeHull(span);\n const vector = (end ? [...vectors].reverse() : vectors).find(v => norm(v) > 0);\n if (!vector) throw new RangeError('Guide has no limiting tangent.');\n const length = norm(vector);\n return scaleVector(vector, 1 / length);\n}\nfunction sameTangent(a: BendPoint, b: BendPoint) {\n if (norm(subtract(a, b)) > JOIN_ROUNDOFF) throw new RangeError('Along Path requires smooth directed guide joins; corners and cusps are unsupported.');\n}\n\nfunction straightSpan(span: BendSpan): BendSpan {\n if (!('points' in span)) return span;\n const a = span.points[0], b = span.points.at(-1)!, vector = subtract(b, a), length = norm(vector);\n if (!(length > 0) || !Number.isFinite(length)) return span;\n const direction = scaleVector(vector, 1 / length);\n if (!span.points.every(p => {\n const v = subtract(p, a);\n return v[0] * direction[1] - v[1] * direction[0] === 0;\n })) return span;\n const values = derivativeHull(span).map(v => v[0] * direction[0] + v[1] * direction[1]);\n let minimum = Math.min(values[0], values.at(-1)!);\n if (values.length === 3) {\n const denominator = values[0] - 2 * values[1] + values[2];\n const t = (values[0] - values[1]) / denominator;\n if (t > 0 && t < 1) minimum = Math.min(minimum, (1 - t) ** 2 * values[0] + 2 * t * (1 - t) * values[1] + t * t * values[2]);\n }\n if (minimum < -length * Number.EPSILON * 16) throw new RangeError('Guide reverses direction at a cusp.');\n return { points: [a, b] };\n}\nfunction normal(v: BendPoint): BendPoint { return [-v[1], v[0]]; }\nfunction norm(v: BendPoint): number { return Math.hypot(v[0], v[1]); }\nfunction add(a: BendPoint, b: BendPoint): BendPoint { return [a[0] + b[0], a[1] + b[1]]; }\nfunction subtract(a: BendPoint, b: BendPoint): BendPoint { return [a[0] - b[0], a[1] - b[1]]; }\nfunction scaleVector(a: BendPoint, scale: number): BendPoint { return [a[0] * scale, a[1] * scale]; }\nfunction lerp(a: BendPoint, b: BendPoint, t: number): BendPoint { return [a[0] + (b[0] - a[0]) * t, a[1] + (b[1] - a[1]) * t]; }\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import { ellipseParameters, singularArcPoints } from './path-arc.js';\nimport { bendSpanBounds, bendSpanPoint, bendSpans, splitBendSpan, type BendPoint, type BendSpan } from './path-bend-spans.js';\nimport { PathGeometry } from './path-geometry.js';\n\ninterface Field { readonly point: BendPoint; readonly normal: BendPoint }\ninterface Leaf {\n readonly span: BendSpan; readonly depth: number;\n readonly first: Field; readonly last: Field;\n readonly chord: number; readonly excess: number;\n readonly sag: number; readonly normalError: number;\n}\ninterface Knot extends Field { readonly distance: number }\nexport interface PreparedBendGuide {\n readonly spans: readonly BendSpan[];\n readonly closed: boolean;\n readonly scale: number;\n}\n\n// Includes failed refinement and field-envelope visits. No resource survives a call.\nconst MAX_GUIDE_WORK = 2_000_000;\nconst MAX_GUIDE_LEAVES = 131_072;\nconst MAX_GUIDE_DEPTH = 48;\nconst JOIN_ROUNDOFF = 512 * Number.EPSILON;\n\n/** Validate all guide contours and joins, even if the source uses only part. */\nexport function prepareBendGuide(path: PathGeometry): PreparedBendGuide {\n const spans: BendSpan[] = [];\n let moves = 0, closed = false, scale = 0;\n for (const item of bendSpans(path)) {\n if (item.type === 'move') {\n if (++moves > 1) throw new RangeError('Along Path requires exactly one guide contour.');\n scale = Math.max(scale, ...item.point.map(Math.abs));\n } else if (item.type === 'close') closed = true;\n else {\n closed = false;\n const bounds = bendSpanBounds(item.span);\n scale = Math.max(scale, Math.abs(bounds.xmin), Math.abs(bounds.xmax), Math.abs(bounds.ymin), Math.abs(bounds.ymax));\n if ('arc' in item.span && !ellipseParameters(item.span.arc)) {\n const points = [bendSpanPoint(item.span, 0), ...singularArcPoints(item.span.arc)];\n for (let i = 1; i < points.length; i++) append({ points: [points[i - 1], points[i]] });\n } else append(item.span);\n }\n }\n if (!spans.length) throw new RangeError('Along Path requires a guide of positive length.');\n if (closed) sameTangent(tangent(spans.at(-1)!, true), tangent(spans[0], false));\n return { spans, closed, scale };\n\n function append(raw: BendSpan) {\n const b = bendSpanBounds(raw);\n // Numerically coincident endpoints/control hulls carry no reliable direction.\n if (Math.hypot(b.xmax - b.xmin, b.ymax - b.ymin) <= scale * Number.EPSILON * 32) return;\n const span = straightSpan(raw);\n const first = tangent(span, false), last = tangent(span, true);\n if (spans.length) sameTangent(tangent(spans.at(-1)!, true), first);\n if ((!Number.isFinite(first[0]) || !Number.isFinite(first[1]) || !Number.isFinite(last[0]) || !Number.isFinite(last[1]))) throw new RangeError('Guide limiting tangent is not finite.');\n spans.push(span);\n }\n}\n\n/**\n * A continuous piecewise-linear position/normal field with a certified error\n * against the true arc-length field. Interpolated normals are deliberately NOT\n * renormalized: this keeps the internal mapping bilinear within each leaf.\n */\nexport function measureBendGuide(\n prepared: PreparedBendGuide,\n tolerance: number,\n maxDisplacement: number,\n distanceFactor: (length: number) => number,\n) {\n let work = 0;\n const charge = () => { if (++work > MAX_GUIDE_WORK) throw new RangeError('Along Path exceeded its guide work budget.'); };\n const roundoff = prepared.scale * Number.EPSILON * 128;\n if (!Number.isFinite(roundoff) || roundoff >= tolerance / 16) throw new RangeError('Guide coordinates cannot support the requested tolerance.');\n let pending = prepared.spans.map(span => ({ span, depth: 0 }));\n let leaves: Leaf[] = [];\n let target = tolerance / 32;\n let length = 0, uncertainty = 0, error = Infinity;\n for (let pass = 0; pass < 24; pass++) {\n leaves = [];\n const stack = [...pending].reverse();\n while (stack.length) {\n charge();\n const { span, depth } = stack.pop()!;\n const leaf = certifyLeaf(span, depth);\n if (leaf && leaf.sag + maxDisplacement * leaf.normalError <= target) {\n if (leaves.length >= MAX_GUIDE_LEAVES) throw new RangeError('Along Path exceeded its guide subdivision budget.');\n leaves.push(leaf);\n } else {\n if (depth >= MAX_GUIDE_DEPTH) throw new RangeError('Guide has a cusp, reversal, or numerically uncertifiable tangent.');\n const [left, right] = splitBendSpan(span);\n stack.push({ span: right, depth: depth + 1 }, { span: left, depth: depth + 1 });\n }\n }\n length = 0; uncertainty = 0;\n let compensation = 0, sag = 0, normalError = 0, normalSlope = 0, joinError = JOIN_ROUNDOFF;\n let previous: Leaf | undefined;\n for (const leaf of leaves) {\n // Original segment joins were validated before subdivision. Inside a\n // polynomial/ellipse, the two limiting tangents at a split must agree or\n // reverse at a cusp. Subtracted tiny control edges amplify roundoff, so\n // do not reuse the original-join angular threshold here. Reject reversals\n // and account for the shared-knot normal replacement in the error bound.\n if (previous) {\n const a = previous.last.normal, b = leaf.first.normal;\n if (a[0] * b[0] + a[1] * b[1] <= 0) throw new RangeError('Along Path guide reverses direction at an internal cusp.');\n joinError = Math.max(joinError, norm(subtract(a, b)));\n }\n previous = leaf;\n // Compensated sums avoid accumulating an O(number-of-leaves) length bias.\n const next = leaf.chord - compensation, sum = length + next;\n compensation = (sum - length) - next; length = sum;\n uncertainty += leaf.excess;\n normalSlope = Math.max(normalSlope, norm(subtract(leaf.last.normal, leaf.first.normal)) / leaf.chord);\n sag = Math.max(sag, leaf.sag); normalError = Math.max(normalError, leaf.normalError);\n }\n if (!(length > 0) || !Number.isFinite(length)) throw new RangeError('Guide length must be finite and positive.');\n uncertainty += roundoff + length * Number.EPSILON * 128;\n // phi maps chord distance to true arc distance and has inverse Lipschitz\n // constant <=1. Its deviation from identity is bounded by total excess.\n // distanceFactor includes fit/alignment and any unwrapped guide laps.\n const distanceError = uncertainty * distanceFactor(length);\n error = sag + maxDisplacement * (normalError + joinError) + (1 + maxDisplacement * normalSlope) * distanceError + roundoff;\n if (Number.isFinite(error) && error <= tolerance / 4) break;\n if (pass === 23) throw new RangeError('Along Path cannot certify its guide-distance and normal error.');\n target /= 2;\n pending = leaves.flatMap(leaf => {\n if (leaf.depth >= MAX_GUIDE_DEPTH) throw new RangeError('Guide measurement reached numerical nonprogress.');\n const [left, right] = splitBendSpan(leaf.span);\n return [{ span: left, depth: leaf.depth + 1 }, { span: right, depth: leaf.depth + 1 }];\n });\n }\n const knots: Knot[] = [{ ...leaves[0].first, distance: 0 }];\n let cumulative = 0, compensation = 0;\n for (const leaf of leaves) {\n const next = leaf.chord - compensation, sum = cumulative + next;\n compensation = (sum - cumulative) - next; cumulative = sum;\n knots.push({ ...leaf.last, distance: cumulative });\n }\n // Joins are already checked. Sharing the endpoint field prevents tiny normal\n // jumps at the closed seam from becoming artificial output edges.\n if (prepared.closed) knots[knots.length - 1] = { ...knots[0], distance: length };\n\n function field(distance: number, wrap: boolean): Field {\n charge();\n if (!Number.isFinite(distance)) throw new RangeError('Mapped guide distance overflowed.');\n if (wrap) distance = ((distance % length) + length) % length;\n if (distance < 0 || distance > length) {\n const end = distance < 0 ? knots[0] : knots.at(-1)!;\n const d = distance - end.distance;\n return { normal: end.normal, point: [end.point[0] + d * end.normal[1], end.point[1] - d * end.normal[0]] };\n }\n if (distance === length) return knots.at(-1)!;\n const i = index(distance), a = knots[i], b = knots[i + 1];\n const u = (distance - a.distance) / (b.distance - a.distance);\n return { point: lerp(a.point, b.point, u), normal: lerp(a.normal, b.normal, u) };\n }\n function index(distance: number): number {\n let low = 0, high = knots.length - 1;\n while (low + 1 < high) {\n const mid = Math.floor((low + high) / 2);\n if (knots[mid].distance <= distance) low = mid; else high = mid;\n }\n return low;\n }\n function envelope(low: number, high: number, wrap: boolean, visit: (distance: number, value: Field) => void) {\n visit(low, field(low, wrap)); visit(high, field(high, wrap));\n if (!wrap) {\n for (let i = index(Math.max(0, low)); i < knots.length && knots[i].distance <= high; i++) {\n if (knots[i].distance >= low) { charge(); visit(knots[i].distance, knots[i]); }\n }\n } else {\n const firstLap = Math.floor(low / length), lastLap = Math.floor(high / length);\n if (!Number.isSafeInteger(firstLap) || !Number.isSafeInteger(lastLap) || lastLap - firstLap > MAX_GUIDE_WORK) throw new RangeError('Too many guide laps to certify.');\n for (let lap = firstLap; lap <= lastLap; lap++) {\n charge();\n const offset = lap * length;\n for (let i = index(Math.max(0, low - offset)); i < knots.length && knots[i].distance + offset <= high; i++) {\n const s = knots[i].distance + offset;\n if (s >= low) { charge(); visit(s, knots[i]); }\n }\n }\n }\n }\n return {\n length, uncertainty, error, field, knots,\n /** Conservative full-field residual, not a sampled flatness heuristic. */\n chordError(low: number, high: number, s0: number, s1: number, d: number, ds: number, dds: number, dy: number, ddy: number, wrap: boolean): number {\n const first = field(s0, wrap), last = field(s1, wrap);\n const delta = s1 - s0;\n const v = delta === 0 ? [0, 0] as const : scaleVector(subtract(last.point, first.point), 1 / delta);\n const q = delta === 0 ? [0, 0] as const : scaleVector(subtract(last.normal, first.normal), 1 / delta);\n const baseNormal = (s: number): BendPoint => add(first.normal, scaleVector(q, s - s0));\n let positionResidual = 0, normalResidual = 0;\n envelope(low, high, wrap, (s, value) => {\n positionResidual = Math.max(positionResidual, norm(subtract(value.point, add(first.point, scaleVector(v, s - s0)))));\n normalResidual = Math.max(normalResidual, norm(subtract(value.normal, baseNormal(s))));\n });\n const baseNormalSize = Math.max(norm(baseNormal(low)), norm(baseNormal(high)));\n const polynomialError = ((norm(v) + d * norm(q)) * dds + baseNormalSize * ddy + 2 * norm(q) * ds * dy) / 8;\n return error + polynomialError + positionResidual + d * normalResidual;\n },\n };\n}\n\nfunction certifyLeaf(span: BendSpan, depth: number): Leaf | undefined {\n if ('arc' in span && Math.abs(span.arc.sweep) > Math.PI / 2) return undefined;\n const a = bendSpanPoint(span, 0), b = bendSpanPoint(span, 1), chordVector = subtract(b, a), chord = norm(chordVector);\n if (!(chord > 0) || !Number.isFinite(chord)) return undefined;\n const axis = scaleVector(chordVector, 1 / chord);\n let ratio = 0, minProjection = Infinity;\n const hull = derivativeHull(span);\n for (const vector of hull) {\n const magnitude = norm(vector);\n if (magnitude === 0) { minProjection = 0; continue; }\n const v = scaleVector(vector, 1 / magnitude);\n const projection = v[0] * axis[0] + v[1] * axis[1];\n if (!(projection > 0)) return undefined;\n minProjection = Math.min(minProjection, projection * magnitude);\n ratio = Math.max(ratio, Math.abs(v[0] * axis[1] - v[1] * axis[0]) / projection);\n }\n const hyp = Math.hypot(1, ratio);\n // All derivatives lie in a directed cone around the chord. Its minimum\n // projection bounds length; its diameter bounds normal interpolation error.\n const excess = chord * ratio * (ratio / (hyp + 1)); // chord*(hyp-1), without cancellation\n const eta = ratio * Math.sqrt(2 / (hyp * (hyp + 1)));\n const first = normal(tangent(span, false)), last = normal(tangent(span, true));\n let normalError = 2 * ratio / hyp;\n // On regular spans use the second derivative of N with respect to arc length.\n // |N''| <= Q/m\u00B3 + 4A\u00B2/m\u2074, where m bounds speed below and A,Q bound the\n // second/third parameter derivatives. The cone remains the fallback at\n // removable stationary endpoints, where m can be zero but the normal exists.\n if (minProjection > 0) {\n let m: number, acceleration: number, jerk: number;\n if ('points' in span) {\n const degree = span.points.length - 1;\n m = minProjection * degree;\n const second = hull.slice(1).map((v, i) => scaleVector(subtract(v, hull[i]), degree * (degree - 1)));\n acceleration = Math.max(0, ...second.map(norm));\n jerk = Math.max(0, ...second.slice(1).map((v, i) => norm(subtract(v, second[i])) * (degree - 2)));\n } else {\n const h = Math.abs(span.arc.sweep), basis = Math.hypot(span.arc.ux, span.arc.uy) + Math.hypot(span.arc.vx, span.arc.vy);\n m = minProjection * h; acceleration = basis * h * h; jerk = acceleration * h;\n }\n const lengthOverSpeed = (chord + excess) / m;\n const error = (jerk / m + 4 * (acceleration / m) ** 2) * lengthOverSpeed ** 2 / 8;\n if (Number.isFinite(error)) normalError = Math.min(normalError, error);\n }\n return { span, depth, first: { point: a, normal: first }, last: { point: b, normal: last }, chord, excess, sag: (chord + excess) * eta / 2, normalError };\n}\n\nfunction derivativeHull(span: BendSpan): readonly BendPoint[] {\n if ('points' in span) return span.points.slice(1).map((point, i) => subtract(point, span.points[i]));\n const a = span.arc;\n return [a.startAngle, a.startAngle + a.sweep].map(theta => [\n Math.sign(a.sweep) * (-a.ux * Math.sin(theta) + a.vx * Math.cos(theta)),\n Math.sign(a.sweep) * (-a.uy * Math.sin(theta) + a.vy * Math.cos(theta)),\n ]);\n}\nfunction tangent(span: BendSpan, end: boolean): BendPoint {\n const vectors = derivativeHull(span);\n const vector = (end ? [...vectors].reverse() : vectors).find(v => norm(v) > 0);\n if (!vector) throw new RangeError('Guide has no limiting tangent.');\n const length = norm(vector);\n return scaleVector(vector, 1 / length);\n}\nfunction sameTangent(a: BendPoint, b: BendPoint) {\n if (norm(subtract(a, b)) > JOIN_ROUNDOFF) throw new RangeError('Along Path requires smooth directed guide joins; corners and cusps are unsupported.');\n}\n\nfunction straightSpan(span: BendSpan): BendSpan {\n if (!('points' in span)) return span;\n const a = span.points[0], b = span.points.at(-1)!, vector = subtract(b, a), length = norm(vector);\n if (!(length > 0) || !Number.isFinite(length)) return span;\n const direction = scaleVector(vector, 1 / length);\n if (!span.points.every(p => {\n const v = subtract(p, a);\n return v[0] * direction[1] - v[1] * direction[0] === 0;\n })) return span;\n const values = derivativeHull(span).map(v => v[0] * direction[0] + v[1] * direction[1]);\n let minimum = Math.min(values[0], values.at(-1)!);\n if (values.length === 3) {\n const denominator = values[0] - 2 * values[1] + values[2];\n const t = (values[0] - values[1]) / denominator;\n if (t > 0 && t < 1) minimum = Math.min(minimum, (1 - t) ** 2 * values[0] + 2 * t * (1 - t) * values[1] + t * t * values[2]);\n }\n if (minimum < -length * Number.EPSILON * 16) throw new RangeError('Guide reverses direction at a cusp.');\n return { points: [a, b] };\n}\nfunction normal(v: BendPoint): BendPoint { return [-v[1], v[0]]; }\nfunction norm(v: BendPoint): number { return Math.hypot(v[0], v[1]); }\nfunction add(a: BendPoint, b: BendPoint): BendPoint { return [a[0] + b[0], a[1] + b[1]]; }\nfunction subtract(a: BendPoint, b: BendPoint): BendPoint { return [a[0] - b[0], a[1] - b[1]]; }\nfunction scaleVector(a: BendPoint, scale: number): BendPoint { return [a[0] * scale, a[1] * scale]; }\nfunction lerp(a: BendPoint, b: BendPoint, t: number): BendPoint { return [a[0] + (b[0] - a[0]) * t, a[1] + (b[1] - a[1]) * t]; }\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["compensation"]
|
|
7
7
|
}
|