@sakuzu/maplibre-gl-draw 1.0.0
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/CHANGELOG.md +43 -0
- package/LICENSE +661 -0
- package/README.ja.md +248 -0
- package/README.md +255 -0
- package/THIRD_PARTY_NOTICES.md +275 -0
- package/dist/api/api.d.ts +1259 -0
- package/dist/api/api.js +86 -0
- package/dist/api/context.d.ts +173 -0
- package/dist/api/context.js +193 -0
- package/dist/api/display-api.d.ts +1 -0
- package/dist/api/display-api.js +23 -0
- package/dist/api/event-api.d.ts +13 -0
- package/dist/api/event-api.js +17 -0
- package/dist/api/extension-api.d.ts +46 -0
- package/dist/api/extension-api.js +85 -0
- package/dist/api/feature-api.d.ts +11 -0
- package/dist/api/feature-api.js +101 -0
- package/dist/api/geometry/apply.d.ts +51 -0
- package/dist/api/geometry/apply.js +114 -0
- package/dist/api/geometry/boolean.d.ts +28 -0
- package/dist/api/geometry/boolean.js +65 -0
- package/dist/api/geometry/buffer.d.ts +11 -0
- package/dist/api/geometry/buffer.js +105 -0
- package/dist/api/geometry/split.d.ts +16 -0
- package/dist/api/geometry/split.js +75 -0
- package/dist/api/geometry/targets.d.ts +76 -0
- package/dist/api/geometry/targets.js +158 -0
- package/dist/api/geometry/types.d.ts +31 -0
- package/dist/api/geometry/types.js +3 -0
- package/dist/api/geometry-operations.d.ts +162 -0
- package/dist/api/geometry-operations.js +94 -0
- package/dist/api/group-api.d.ts +10 -0
- package/dist/api/group-api.js +78 -0
- package/dist/api/import-export/constants.d.ts +29 -0
- package/dist/api/import-export/constants.js +40 -0
- package/dist/api/import-export/embedded-file.d.ts +13 -0
- package/dist/api/import-export/embedded-file.js +31 -0
- package/dist/api/import-export/file-name.d.ts +10 -0
- package/dist/api/import-export/file-name.js +20 -0
- package/dist/api/import-export/format-detection.d.ts +12 -0
- package/dist/api/import-export/format-detection.js +29 -0
- package/dist/api/import-export/geojson-export.d.ts +19 -0
- package/dist/api/import-export/geojson-export.js +262 -0
- package/dist/api/import-export/geojson-import.d.ts +34 -0
- package/dist/api/import-export/geojson-import.js +538 -0
- package/dist/api/import-export/geometry-validation.d.ts +20 -0
- package/dist/api/import-export/geometry-validation.js +107 -0
- package/dist/api/import-export/image-import.d.ts +12 -0
- package/dist/api/import-export/image-import.js +53 -0
- package/dist/api/import-export/index.d.ts +9 -0
- package/dist/api/import-export/index.js +107 -0
- package/dist/api/import-export/native-format.d.ts +15 -0
- package/dist/api/import-export/native-format.js +126 -0
- package/dist/api/import-export/native-validation.d.ts +28 -0
- package/dist/api/import-export/native-validation.js +212 -0
- package/dist/api/import-export/own-property.d.ts +10 -0
- package/dist/api/import-export/own-property.js +19 -0
- package/dist/api/import-export/style-validation.d.ts +27 -0
- package/dist/api/import-export/style-validation.js +49 -0
- package/dist/api/import-export/types.d.ts +26 -0
- package/dist/api/import-export/types.js +3 -0
- package/dist/api/index.d.ts +15 -0
- package/dist/api/index.js +3 -0
- package/dist/api/input-api.d.ts +158 -0
- package/dist/api/input-api.js +144 -0
- package/dist/api/instance-api.d.ts +38 -0
- package/dist/api/instance-api.js +136 -0
- package/dist/api/layer-api.d.ts +12 -0
- package/dist/api/layer-api.js +62 -0
- package/dist/api/selection-api.d.ts +7 -0
- package/dist/api/selection-api.js +78 -0
- package/dist/api/snapping-api.d.ts +125 -0
- package/dist/api/snapping-api.js +50 -0
- package/dist/api/topology-api.d.ts +30 -0
- package/dist/api/topology-api.js +16 -0
- package/dist/api/tracing-api.d.ts +31 -0
- package/dist/api/tracing-api.js +16 -0
- package/dist/dispatcher/hit-test/box-strategies.d.ts +19 -0
- package/dist/dispatcher/hit-test/box-strategies.js +275 -0
- package/dist/dispatcher/hit-test/box-strategy.d.ts +59 -0
- package/dist/dispatcher/hit-test/box-strategy.js +37 -0
- package/dist/dispatcher/hit-test/globe-shape.d.ts +46 -0
- package/dist/dispatcher/hit-test/globe-shape.js +70 -0
- package/dist/dispatcher/hit-test/index.d.ts +14 -0
- package/dist/dispatcher/hit-test/index.js +9 -0
- package/dist/dispatcher/hit-test/local-frame.d.ts +77 -0
- package/dist/dispatcher/hit-test/local-frame.js +112 -0
- package/dist/dispatcher/hit-test/segment-grid.d.ts +32 -0
- package/dist/dispatcher/hit-test/segment-grid.js +79 -0
- package/dist/dispatcher/hit-test/service.d.ts +120 -0
- package/dist/dispatcher/hit-test/service.js +333 -0
- package/dist/dispatcher/hit-test/strategies/base.d.ts +136 -0
- package/dist/dispatcher/hit-test/strategies/base.js +66 -0
- package/dist/dispatcher/hit-test/strategies/circle.d.ts +10 -0
- package/dist/dispatcher/hit-test/strategies/circle.js +56 -0
- package/dist/dispatcher/hit-test/strategies/image.d.ts +22 -0
- package/dist/dispatcher/hit-test/strategies/image.js +115 -0
- package/dist/dispatcher/hit-test/strategies/index.d.ts +11 -0
- package/dist/dispatcher/hit-test/strategies/index.js +10 -0
- package/dist/dispatcher/hit-test/strategies/line.d.ts +17 -0
- package/dist/dispatcher/hit-test/strategies/line.js +30 -0
- package/dist/dispatcher/hit-test/strategies/multi.d.ts +44 -0
- package/dist/dispatcher/hit-test/strategies/multi.js +141 -0
- package/dist/dispatcher/hit-test/strategies/point.d.ts +20 -0
- package/dist/dispatcher/hit-test/strategies/point.js +29 -0
- package/dist/dispatcher/hit-test/strategies/polygon.d.ts +52 -0
- package/dist/dispatcher/hit-test/strategies/polygon.js +138 -0
- package/dist/dispatcher/hit-test/topmost.d.ts +48 -0
- package/dist/dispatcher/hit-test/topmost.js +157 -0
- package/dist/dispatcher/hit-test/visibility-lookup.d.ts +23 -0
- package/dist/dispatcher/hit-test/visibility-lookup.js +40 -0
- package/dist/dispatcher/index.d.ts +15 -0
- package/dist/dispatcher/index.js +3 -0
- package/dist/dispatcher/input-router.d.ts +1 -0
- package/dist/dispatcher/input-router.js +288 -0
- package/dist/dispatcher/normalizer.d.ts +1 -0
- package/dist/dispatcher/normalizer.js +513 -0
- package/dist/dispatcher/types.d.ts +144 -0
- package/dist/dispatcher/types.js +15 -0
- package/dist/display/chunk-set.d.ts +24 -0
- package/dist/display/chunk-set.js +533 -0
- package/dist/display/chunk.d.ts +1 -0
- package/dist/display/chunk.js +104 -0
- package/dist/display/columnar/index.d.ts +12 -0
- package/dist/display/columnar/index.js +13 -0
- package/dist/display/columnar/prepare.d.ts +42 -0
- package/dist/display/columnar/prepare.js +116 -0
- package/dist/display/columnar/source.d.ts +1 -0
- package/dist/display/columnar/source.js +531 -0
- package/dist/display/columnar/table.d.ts +1 -0
- package/dist/display/columnar/table.js +471 -0
- package/dist/display/columnar/types.d.ts +223 -0
- package/dist/display/columnar/types.js +3 -0
- package/dist/display/dataset.d.ts +2 -0
- package/dist/display/dataset.js +891 -0
- package/dist/display/index.d.ts +13 -0
- package/dist/display/index.js +3 -0
- package/dist/display/interaction.d.ts +1 -0
- package/dist/display/interaction.js +90 -0
- package/dist/display/manager.d.ts +1 -0
- package/dist/display/manager.js +440 -0
- package/dist/display/packed-rtree.d.ts +1 -0
- package/dist/display/packed-rtree.js +244 -0
- package/dist/display/partition.d.ts +1 -0
- package/dist/display/partition.js +226 -0
- package/dist/display/provider.d.ts +1 -0
- package/dist/display/provider.js +342 -0
- package/dist/display/retained.d.ts +40 -0
- package/dist/display/retained.js +898 -0
- package/dist/display/selection.d.ts +13 -0
- package/dist/display/selection.js +226 -0
- package/dist/display/source.d.ts +1 -0
- package/dist/display/source.js +119 -0
- package/dist/display/spatial.d.ts +1 -0
- package/dist/display/spatial.js +71 -0
- package/dist/display/style.d.ts +1 -0
- package/dist/display/style.js +126 -0
- package/dist/display/thinning.d.ts +65 -0
- package/dist/display/thinning.js +910 -0
- package/dist/display/triangulation.d.ts +1 -0
- package/dist/display/triangulation.js +0 -0
- package/dist/display/types.d.ts +561 -0
- package/dist/display/types.js +43 -0
- package/dist/extension/feature-handler.d.ts +182 -0
- package/dist/extension/feature-handler.js +3 -0
- package/dist/extension/index.d.ts +9 -0
- package/dist/extension/index.js +3 -0
- package/dist/extension/renderers.d.ts +208 -0
- package/dist/extension/renderers.js +3 -0
- package/dist/geometry/angle.d.ts +47 -0
- package/dist/geometry/angle.js +44 -0
- package/dist/geometry/bbox.d.ts +48 -0
- package/dist/geometry/bbox.js +83 -0
- package/dist/geometry/boolean.d.ts +162 -0
- package/dist/geometry/boolean.js +331 -0
- package/dist/geometry/buffer.d.ts +72 -0
- package/dist/geometry/buffer.js +218 -0
- package/dist/geometry/circle.d.ts +55 -0
- package/dist/geometry/circle.js +107 -0
- package/dist/geometry/coords.d.ts +97 -0
- package/dist/geometry/coords.js +149 -0
- package/dist/geometry/distance.d.ts +79 -0
- package/dist/geometry/distance.js +111 -0
- package/dist/geometry/errors.d.ts +74 -0
- package/dist/geometry/errors.js +104 -0
- package/dist/geometry/index.d.ts +28 -0
- package/dist/geometry/index.js +38 -0
- package/dist/geometry/measure.d.ts +81 -0
- package/dist/geometry/measure.js +236 -0
- package/dist/geometry/predicates.d.ts +62 -0
- package/dist/geometry/predicates.js +132 -0
- package/dist/geometry/simplify.d.ts +74 -0
- package/dist/geometry/simplify.js +159 -0
- package/dist/geometry/split.d.ts +68 -0
- package/dist/geometry/split.js +430 -0
- package/dist/geometry/types.d.ts +95 -0
- package/dist/geometry/types.js +3 -0
- package/dist/geometry/units.d.ts +35 -0
- package/dist/geometry/units.js +41 -0
- package/dist/index.d.ts +72 -0
- package/dist/index.js +20 -0
- package/dist/maplibre-gl-draw.d.ts +47 -0
- package/dist/maplibre-gl-draw.js +407 -0
- package/dist/messages.d.ts +64 -0
- package/dist/messages.js +36 -0
- package/dist/modes/cursor.d.ts +1 -0
- package/dist/modes/cursor.js +72 -0
- package/dist/modes/draw/circle.d.ts +1 -0
- package/dist/modes/draw/circle.js +222 -0
- package/dist/modes/draw/commit-layer.d.ts +26 -0
- package/dist/modes/draw/commit-layer.js +31 -0
- package/dist/modes/draw/freehand.d.ts +1 -0
- package/dist/modes/draw/freehand.js +264 -0
- package/dist/modes/draw/image.d.ts +1 -0
- package/dist/modes/draw/image.js +60 -0
- package/dist/modes/draw/index.d.ts +9 -0
- package/dist/modes/draw/index.js +11 -0
- package/dist/modes/draw/line.d.ts +1 -0
- package/dist/modes/draw/line.js +363 -0
- package/dist/modes/draw/point.d.ts +1 -0
- package/dist/modes/draw/point.js +87 -0
- package/dist/modes/draw/polygon.d.ts +1 -0
- package/dist/modes/draw/polygon.js +378 -0
- package/dist/modes/draw/trace-support.d.ts +79 -0
- package/dist/modes/draw/trace-support.js +161 -0
- package/dist/modes/handler.d.ts +285 -0
- package/dist/modes/handler.js +3 -0
- package/dist/modes/index.d.ts +7 -0
- package/dist/modes/index.js +3 -0
- package/dist/modes/manager.d.ts +15 -0
- package/dist/modes/manager.js +196 -0
- package/dist/modes/select/box-selection.d.ts +52 -0
- package/dist/modes/select/box-selection.js +140 -0
- package/dist/modes/select/click-handler.d.ts +32 -0
- package/dist/modes/select/click-handler.js +166 -0
- package/dist/modes/select/cursor-handler.d.ts +15 -0
- package/dist/modes/select/cursor-handler.js +59 -0
- package/dist/modes/select/drag/auxiliary.d.ts +26 -0
- package/dist/modes/select/drag/auxiliary.js +56 -0
- package/dist/modes/select/drag/intermediate-writes.d.ts +1 -0
- package/dist/modes/select/drag/intermediate-writes.js +171 -0
- package/dist/modes/select/drag/move.d.ts +24 -0
- package/dist/modes/select/drag/move.js +59 -0
- package/dist/modes/select/drag/operation.d.ts +30 -0
- package/dist/modes/select/drag/operation.js +18 -0
- package/dist/modes/select/drag/radius.d.ts +15 -0
- package/dist/modes/select/drag/radius.js +49 -0
- package/dist/modes/select/drag/transform.d.ts +17 -0
- package/dist/modes/select/drag/transform.js +155 -0
- package/dist/modes/select/drag/vertex.d.ts +17 -0
- package/dist/modes/select/drag/vertex.js +163 -0
- package/dist/modes/select/drag-handler.d.ts +1 -0
- package/dist/modes/select/drag-handler.js +254 -0
- package/dist/modes/select/hit-helpers.d.ts +40 -0
- package/dist/modes/select/hit-helpers.js +51 -0
- package/dist/modes/select/mode.d.ts +1 -0
- package/dist/modes/select/mode.js +397 -0
- package/dist/modes/select/shortcut-handler.d.ts +40 -0
- package/dist/modes/select/shortcut-handler.js +128 -0
- package/dist/operations/index.d.ts +9 -0
- package/dist/operations/index.js +3 -0
- package/dist/operations/layer-operations.d.ts +1 -0
- package/dist/operations/layer-operations.js +350 -0
- package/dist/operations/resize.d.ts +71 -0
- package/dist/operations/resize.js +252 -0
- package/dist/operations/rotate.d.ts +17 -0
- package/dist/operations/rotate.js +166 -0
- package/dist/operations/selection-operations.d.ts +20 -0
- package/dist/operations/selection-operations.js +159 -0
- package/dist/operations/shared-vertex.d.ts +1 -0
- package/dist/operations/shared-vertex.js +210 -0
- package/dist/operations/trace-graph.d.ts +96 -0
- package/dist/operations/trace-graph.js +283 -0
- package/dist/operations/vertex.d.ts +1 -0
- package/dist/operations/vertex.js +538 -0
- package/dist/plugins/index.d.ts +10 -0
- package/dist/plugins/index.js +3 -0
- package/dist/plugins/mutation-hooks.d.ts +28 -0
- package/dist/plugins/mutation-hooks.js +84 -0
- package/dist/plugins/plugin-context.d.ts +1 -0
- package/dist/plugins/plugin-context.js +367 -0
- package/dist/plugins/plugin-manager.d.ts +103 -0
- package/dist/plugins/plugin-manager.js +316 -0
- package/dist/plugins/plugin.d.ts +529 -0
- package/dist/plugins/plugin.js +3 -0
- package/dist/shared/config/constants.d.ts +66 -0
- package/dist/shared/config/constants.js +60 -0
- package/dist/shared/config/feature-style.d.ts +155 -0
- package/dist/shared/config/feature-style.js +154 -0
- package/dist/shared/config/index.d.ts +17 -0
- package/dist/shared/config/index.js +8 -0
- package/dist/shared/config/rendering.d.ts +107 -0
- package/dist/shared/config/rendering.js +33 -0
- package/dist/shared/config/selection-highlight.d.ts +29 -0
- package/dist/shared/config/selection-highlight.js +35 -0
- package/dist/shared/config/selection.d.ts +273 -0
- package/dist/shared/config/selection.js +266 -0
- package/dist/shared/config/topology.d.ts +33 -0
- package/dist/shared/config/topology.js +17 -0
- package/dist/shared/config/trace.d.ts +40 -0
- package/dist/shared/config/trace.js +17 -0
- package/dist/shared/math/angle.d.ts +21 -0
- package/dist/shared/math/angle.js +34 -0
- package/dist/shared/math/circle.d.ts +6 -0
- package/dist/shared/math/circle.js +10 -0
- package/dist/shared/math/constants.d.ts +48 -0
- package/dist/shared/math/constants.js +59 -0
- package/dist/shared/math/distance.d.ts +78 -0
- package/dist/shared/math/distance.js +147 -0
- package/dist/shared/math/globe-subdivision.d.ts +62 -0
- package/dist/shared/math/globe-subdivision.js +99 -0
- package/dist/shared/math/index.d.ts +17 -0
- package/dist/shared/math/index.js +21 -0
- package/dist/shared/math/intersection.d.ts +63 -0
- package/dist/shared/math/intersection.js +236 -0
- package/dist/shared/math/longitude.d.ts +20 -0
- package/dist/shared/math/longitude.js +31 -0
- package/dist/shared/math/mercator-plane.d.ts +27 -0
- package/dist/shared/math/mercator-plane.js +26 -0
- package/dist/shared/math/obb.d.ts +65 -0
- package/dist/shared/math/obb.js +107 -0
- package/dist/shared/math/rotation.d.ts +93 -0
- package/dist/shared/math/rotation.js +186 -0
- package/dist/shared/math/segment-grid.d.ts +69 -0
- package/dist/shared/math/segment-grid.js +159 -0
- package/dist/shared/math/transform.d.ts +140 -0
- package/dist/shared/math/transform.js +189 -0
- package/dist/shared/types/events.d.ts +128 -0
- package/dist/shared/types/events.js +3 -0
- package/dist/shared/types/model.d.ts +950 -0
- package/dist/shared/types/model.js +3 -0
- package/dist/shared/types/selection-box.d.ts +23 -0
- package/dist/shared/types/selection-box.js +3 -0
- package/dist/shared/types/style.d.ts +68 -0
- package/dist/shared/types/style.js +3 -0
- package/dist/shared/utils/color.d.ts +49 -0
- package/dist/shared/utils/color.js +180 -0
- package/dist/shared/utils/coordinates.d.ts +52 -0
- package/dist/shared/utils/coordinates.js +75 -0
- package/dist/shared/utils/embedded-image.d.ts +34 -0
- package/dist/shared/utils/embedded-image.js +161 -0
- package/dist/shared/utils/event-emitter.d.ts +262 -0
- package/dist/shared/utils/event-emitter.js +44 -0
- package/dist/shared/utils/feature-bbox.d.ts +8 -0
- package/dist/shared/utils/feature-bbox.js +207 -0
- package/dist/shared/utils/feature-segments.d.ts +23 -0
- package/dist/shared/utils/feature-segments.js +179 -0
- package/dist/shared/utils/id.d.ts +1 -0
- package/dist/shared/utils/id.js +35 -0
- package/dist/shared/utils/image.d.ts +34 -0
- package/dist/shared/utils/image.js +106 -0
- package/dist/shared/utils/index.d.ts +15 -0
- package/dist/shared/utils/index.js +24 -0
- package/dist/shared/utils/map.d.ts +26 -0
- package/dist/shared/utils/map.js +35 -0
- package/dist/shared/utils/name-generator.d.ts +197 -0
- package/dist/shared/utils/name-generator.js +337 -0
- package/dist/shared/utils/pixel-ratio.d.ts +111 -0
- package/dist/shared/utils/pixel-ratio.js +85 -0
- package/dist/shared/utils/property.d.ts +88 -0
- package/dist/shared/utils/property.js +140 -0
- package/dist/shared/utils/vertex-ref.d.ts +23 -0
- package/dist/shared/utils/vertex-ref.js +20 -0
- package/dist/snapping/custom-targets.d.ts +1 -0
- package/dist/snapping/custom-targets.js +21 -0
- package/dist/snapping/geometry.d.ts +1 -0
- package/dist/snapping/geometry.js +61 -0
- package/dist/snapping/index.d.ts +14 -0
- package/dist/snapping/index.js +4 -0
- package/dist/snapping/indicator.d.ts +19 -0
- package/dist/snapping/indicator.js +145 -0
- package/dist/snapping/providers/display.d.ts +72 -0
- package/dist/snapping/providers/display.js +268 -0
- package/dist/snapping/providers/guide.d.ts +69 -0
- package/dist/snapping/providers/guide.js +187 -0
- package/dist/snapping/providers/intersection.d.ts +1 -0
- package/dist/snapping/providers/intersection.js +92 -0
- package/dist/snapping/providers/shared.d.ts +39 -0
- package/dist/snapping/providers/shared.js +146 -0
- package/dist/snapping/providers/store.d.ts +1 -0
- package/dist/snapping/providers/store.js +132 -0
- package/dist/snapping/service.d.ts +1 -0
- package/dist/snapping/service.js +272 -0
- package/dist/snapping/types.d.ts +267 -0
- package/dist/snapping/types.js +66 -0
- package/dist/store/change-merger.d.ts +1 -0
- package/dist/store/change-merger.js +102 -0
- package/dist/store/draw-store.d.ts +1 -0
- package/dist/store/draw-store.js +396 -0
- package/dist/store/event-bridge.d.ts +1 -0
- package/dist/store/event-bridge.js +161 -0
- package/dist/store/index.d.ts +12 -0
- package/dist/store/index.js +4 -0
- package/dist/store/local-visibility.d.ts +21 -0
- package/dist/store/local-visibility.js +27 -0
- package/dist/store/lock.d.ts +67 -0
- package/dist/store/lock.js +54 -0
- package/dist/store/memory/change-bus.d.ts +60 -0
- package/dist/store/memory/change-bus.js +232 -0
- package/dist/store/memory/file-store.d.ts +15 -0
- package/dist/store/memory/file-store.js +33 -0
- package/dist/store/memory/frozen.d.ts +21 -0
- package/dist/store/memory/frozen.js +51 -0
- package/dist/store/memory/ui-state.d.ts +51 -0
- package/dist/store/memory/ui-state.js +223 -0
- package/dist/store/memory.d.ts +26 -0
- package/dist/store/memory.js +708 -0
- package/dist/store/spatial/index.d.ts +6 -0
- package/dist/store/spatial/index.js +4 -0
- package/dist/store/spatial/spatial-index.d.ts +90 -0
- package/dist/store/spatial/spatial-index.js +148 -0
- package/dist/store/spatial/store-spatial-index.d.ts +60 -0
- package/dist/store/spatial/store-spatial-index.js +125 -0
- package/dist/store/store.d.ts +417 -0
- package/dist/store/store.js +3 -0
- package/dist/store/types.d.ts +8 -0
- package/dist/store/types.js +3 -0
- package/dist/store/writable-layer.d.ts +35 -0
- package/dist/store/writable-layer.js +20 -0
- package/dist/view/cache/buffer.d.ts +28 -0
- package/dist/view/cache/buffer.js +176 -0
- package/dist/view/cache/earcut.d.ts +1 -0
- package/dist/view/cache/earcut.js +122 -0
- package/dist/view/cache/style-rule.d.ts +1 -0
- package/dist/view/cache/style-rule.js +97 -0
- package/dist/view/cache/terrain-fill.d.ts +30 -0
- package/dist/view/cache/terrain-fill.js +60 -0
- package/dist/view/cache/texture.d.ts +14 -0
- package/dist/view/cache/texture.js +292 -0
- package/dist/view/coordinator.d.ts +27 -0
- package/dist/view/coordinator.js +72 -0
- package/dist/view/feature-companion.d.ts +173 -0
- package/dist/view/feature-companion.js +108 -0
- package/dist/view/globe-subdivision.d.ts +78 -0
- package/dist/view/globe-subdivision.js +128 -0
- package/dist/view/index.d.ts +47 -0
- package/dist/view/index.js +20 -0
- package/dist/view/layer/attach.d.ts +20 -0
- package/dist/view/layer/attach.js +47 -0
- package/dist/view/layer/blend.d.ts +57 -0
- package/dist/view/layer/blend.js +14 -0
- package/dist/view/layer/custom-layer.d.ts +1 -0
- package/dist/view/layer/custom-layer.js +509 -0
- package/dist/view/layer/depth-state.d.ts +14 -0
- package/dist/view/layer/depth-state.js +44 -0
- package/dist/view/layer/display-list.d.ts +1 -0
- package/dist/view/layer/display-list.js +111 -0
- package/dist/view/layer/drape-planner.d.ts +139 -0
- package/dist/view/layer/drape-planner.js +726 -0
- package/dist/view/layer/frame-render.d.ts +57 -0
- package/dist/view/layer/frame-render.js +209 -0
- package/dist/view/layer/frame-state.d.ts +147 -0
- package/dist/view/layer/frame-state.js +484 -0
- package/dist/view/layer/gl-state.d.ts +77 -0
- package/dist/view/layer/gl-state.js +132 -0
- package/dist/view/layer/index.d.ts +6 -0
- package/dist/view/layer/index.js +5 -0
- package/dist/view/layer/render-scope.d.ts +30 -0
- package/dist/view/layer/render-scope.js +28 -0
- package/dist/view/layer/render.d.ts +87 -0
- package/dist/view/layer/render.js +187 -0
- package/dist/view/layer/renderers.d.ts +81 -0
- package/dist/view/layer/renderers.js +142 -0
- package/dist/view/layer/slot-manager.d.ts +26 -0
- package/dist/view/layer/slot-manager.js +133 -0
- package/dist/view/layer/slots.d.ts +33 -0
- package/dist/view/layer/slots.js +50 -0
- package/dist/view/layer/store-retained-bbox.d.ts +36 -0
- package/dist/view/layer/store-retained-bbox.js +188 -0
- package/dist/view/layer/store-retained-chunk.d.ts +97 -0
- package/dist/view/layer/store-retained-chunk.js +94 -0
- package/dist/view/layer/store-retained-classify.d.ts +34 -0
- package/dist/view/layer/store-retained-classify.js +88 -0
- package/dist/view/layer/store-retained-collect.d.ts +24 -0
- package/dist/view/layer/store-retained-collect.js +121 -0
- package/dist/view/layer/store-retained-coord-patch.d.ts +119 -0
- package/dist/view/layer/store-retained-coord-patch.js +168 -0
- package/dist/view/layer/store-retained-immediate.d.ts +63 -0
- package/dist/view/layer/store-retained-immediate.js +49 -0
- package/dist/view/layer/store-retained-invalidation.d.ts +96 -0
- package/dist/view/layer/store-retained-invalidation.js +192 -0
- package/dist/view/layer/store-retained.d.ts +198 -0
- package/dist/view/layer/store-retained.js +430 -0
- package/dist/view/layer/terrain-resolver.d.ts +1 -0
- package/dist/view/layer/terrain-resolver.js +174 -0
- package/dist/view/renderers/batch-manager.d.ts +61 -0
- package/dist/view/renderers/batch-manager.js +718 -0
- package/dist/view/renderers/draw-factors.d.ts +60 -0
- package/dist/view/renderers/draw-factors.js +35 -0
- package/dist/view/renderers/drawer.d.ts +1 -0
- package/dist/view/renderers/drawer.js +346 -0
- package/dist/view/renderers/image.d.ts +1 -0
- package/dist/view/renderers/image.js +255 -0
- package/dist/view/renderers/line/dash.d.ts +31 -0
- package/dist/view/renderers/line/dash.js +152 -0
- package/dist/view/renderers/line/line-geometry.d.ts +39 -0
- package/dist/view/renderers/line/line-geometry.js +460 -0
- package/dist/view/renderers/line/line-gl.d.ts +1 -0
- package/dist/view/renderers/line/line-gl.js +236 -0
- package/dist/view/renderers/line/line-shader.d.ts +1 -0
- package/dist/view/renderers/line/line-shader.js +364 -0
- package/dist/view/renderers/line/line-types.d.ts +43 -0
- package/dist/view/renderers/line/line-types.js +3 -0
- package/dist/view/renderers/line/line-uniforms.d.ts +1 -0
- package/dist/view/renderers/line/line-uniforms.js +390 -0
- package/dist/view/renderers/line/sdf-line.d.ts +92 -0
- package/dist/view/renderers/line/sdf-line.js +567 -0
- package/dist/view/renderers/point/billboard-depth.d.ts +10 -0
- package/dist/view/renderers/point/billboard-depth.js +56 -0
- package/dist/view/renderers/point/point-instance.d.ts +124 -0
- package/dist/view/renderers/point/point-instance.js +738 -0
- package/dist/view/renderers/point/point-sdf.d.ts +58 -0
- package/dist/view/renderers/point/point-sdf.js +170 -0
- package/dist/view/renderers/point/point-shape.d.ts +99 -0
- package/dist/view/renderers/point/point-shape.js +504 -0
- package/dist/view/renderers/point/point-style.d.ts +1 -0
- package/dist/view/renderers/point/point-style.js +46 -0
- package/dist/view/renderers/polygon/batch.d.ts +26 -0
- package/dist/view/renderers/polygon/batch.js +336 -0
- package/dist/view/renderers/polygon/earcut-input.d.ts +37 -0
- package/dist/view/renderers/polygon/earcut-input.js +55 -0
- package/dist/view/renderers/polygon/earcut-sliced.d.ts +69 -0
- package/dist/view/renderers/polygon/earcut-sliced.js +960 -0
- package/dist/view/renderers/polygon/fill.d.ts +74 -0
- package/dist/view/renderers/polygon/fill.js +251 -0
- package/dist/view/renderers/polygon/sdf-polygon.d.ts +62 -0
- package/dist/view/renderers/polygon/sdf-polygon.js +919 -0
- package/dist/view/renderers/polygon/terrain-cull.d.ts +3 -0
- package/dist/view/renderers/polygon/terrain-cull.js +14 -0
- package/dist/view/renderers/polygon/triangulator.d.ts +41 -0
- package/dist/view/renderers/polygon/triangulator.js +3 -0
- package/dist/view/renderers/retained.d.ts +43 -0
- package/dist/view/renderers/retained.js +3 -0
- package/dist/view/renderers/stroke.d.ts +121 -0
- package/dist/view/renderers/stroke.js +621 -0
- package/dist/view/shaders/frame.d.ts +8 -0
- package/dist/view/shaders/frame.js +37 -0
- package/dist/view/shaders/helpers.d.ts +238 -0
- package/dist/view/shaders/helpers.js +611 -0
- package/dist/view/shaders/initializer.d.ts +27 -0
- package/dist/view/shaders/initializer.js +125 -0
- package/dist/view/shaders/projection.d.ts +123 -0
- package/dist/view/shaders/projection.js +299 -0
- package/dist/view/shaders/quad-grid.d.ts +77 -0
- package/dist/view/shaders/quad-grid.js +128 -0
- package/dist/view/shaders/quad.d.ts +189 -0
- package/dist/view/shaders/quad.js +582 -0
- package/dist/view/shaders/retained-origin.d.ts +50 -0
- package/dist/view/shaders/retained-origin.js +67 -0
- package/dist/view/shaders/terrain-shade.d.ts +23 -0
- package/dist/view/shaders/terrain-shade.js +93 -0
- package/dist/view/style-rule.d.ts +166 -0
- package/dist/view/style-rule.js +300 -0
- package/dist/view/terrain/anchor.d.ts +135 -0
- package/dist/view/terrain/anchor.js +226 -0
- package/dist/view/terrain/context.d.ts +132 -0
- package/dist/view/terrain/context.js +437 -0
- package/dist/view/terrain/dem-atlas.d.ts +97 -0
- package/dist/view/terrain/dem-atlas.js +534 -0
- package/dist/view/terrain/detect.d.ts +126 -0
- package/dist/view/terrain/detect.js +198 -0
- package/dist/view/terrain/drape/bin-store.d.ts +179 -0
- package/dist/view/terrain/drape/bin-store.js +529 -0
- package/dist/view/terrain/drape/binning.d.ts +259 -0
- package/dist/view/terrain/drape/binning.js +604 -0
- package/dist/view/terrain/drape/edge-constrain.d.ts +37 -0
- package/dist/view/terrain/drape/edge-constrain.js +175 -0
- package/dist/view/terrain/drape/geometry.d.ts +95 -0
- package/dist/view/terrain/drape/geometry.js +260 -0
- package/dist/view/terrain/drape/mesh.d.ts +50 -0
- package/dist/view/terrain/drape/mesh.js +86 -0
- package/dist/view/terrain/drape/pass.d.ts +122 -0
- package/dist/view/terrain/drape/pass.js +379 -0
- package/dist/view/terrain/drape/quad-glyphs.d.ts +64 -0
- package/dist/view/terrain/drape/quad-glyphs.js +117 -0
- package/dist/view/terrain/drape/quad.d.ts +249 -0
- package/dist/view/terrain/drape/quad.js +835 -0
- package/dist/view/terrain/drape/renderer.d.ts +184 -0
- package/dist/view/terrain/drape/renderer.js +706 -0
- package/dist/view/terrain/drape/shared.d.ts +80 -0
- package/dist/view/terrain/drape/shared.js +173 -0
- package/dist/view/terrain/drape/stitch.d.ts +155 -0
- package/dist/view/terrain/drape/stitch.js +228 -0
- package/dist/view/terrain/ground.d.ts +72 -0
- package/dist/view/terrain/ground.js +151 -0
- package/dist/view/terrain/metrics.d.ts +180 -0
- package/dist/view/terrain/metrics.js +231 -0
- package/dist/view/terrain/occlusion.d.ts +11 -0
- package/dist/view/terrain/occlusion.js +129 -0
- package/dist/view/terrain/polygon.d.ts +86 -0
- package/dist/view/terrain/polygon.js +301 -0
- package/dist/view/terrain/shade.d.ts +48 -0
- package/dist/view/terrain/shade.js +45 -0
- package/dist/view/terrain/state.d.ts +99 -0
- package/dist/view/terrain/state.js +186 -0
- package/dist/view/terrain/tessellation.d.ts +265 -0
- package/dist/view/terrain/tessellation.js +924 -0
- package/dist/view/terrain/tiling.d.ts +56 -0
- package/dist/view/terrain/tiling.js +155 -0
- package/dist/view/terrain/upstream-terrain.d.ts +82 -0
- package/dist/view/terrain/upstream-terrain.js +116 -0
- package/dist/view/ui/auxiliary-handles.d.ts +151 -0
- package/dist/view/ui/auxiliary-handles.js +22 -0
- package/dist/view/ui/bounds.d.ts +53 -0
- package/dist/view/ui/bounds.js +149 -0
- package/dist/view/ui/box-selection.d.ts +1 -0
- package/dist/view/ui/box-selection.js +83 -0
- package/dist/view/ui/handle-test.d.ts +1 -0
- package/dist/view/ui/handle-test.js +437 -0
- package/dist/view/ui/handle-thinning.d.ts +122 -0
- package/dist/view/ui/handle-thinning.js +430 -0
- package/dist/view/ui/handles.d.ts +25 -0
- package/dist/view/ui/handles.js +673 -0
- package/dist/view/ui/helper.d.ts +19 -0
- package/dist/view/ui/helper.js +76 -0
- package/dist/view/ui/index.d.ts +15 -0
- package/dist/view/ui/index.js +15 -0
- package/dist/view/ui/selection-scope.d.ts +25 -0
- package/dist/view/ui/selection-scope.js +34 -0
- package/dist/view/ui/selection-ui/bounding-box.d.ts +44 -0
- package/dist/view/ui/selection-ui/bounding-box.js +240 -0
- package/dist/view/ui/selection-ui/extension-registry.d.ts +76 -0
- package/dist/view/ui/selection-ui/extension-registry.js +78 -0
- package/dist/view/ui/selection-ui/index.d.ts +12 -0
- package/dist/view/ui/selection-ui/index.js +12 -0
- package/dist/view/ui/selection-ui/renderer.d.ts +29 -0
- package/dist/view/ui/selection-ui/renderer.js +227 -0
- package/dist/view/ui/selection-ui/types.d.ts +55 -0
- package/dist/view/ui/selection-ui/types.js +3 -0
- package/dist/view/ui/selection-ui-drawer.d.ts +52 -0
- package/dist/view/ui/selection-ui-drawer.js +329 -0
- package/dist/view/ui/tentative.d.ts +1 -0
- package/dist/view/ui/tentative.js +320 -0
- package/dist/view/viewport.d.ts +119 -0
- package/dist/view/viewport.js +254 -0
- package/package.json +113 -0
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
import { getDisplayFeatures } from '../../store/local-visibility.js';
|
|
4
|
+
import { hitTestFeatureCompanions } from '../../view/feature-companion.js';
|
|
5
|
+
import { clickCopies } from './local-frame.js';
|
|
6
|
+
import { DEFAULT_HIT_TEST_OPTIONS } from './strategies/base.js';
|
|
7
|
+
import { createVisibilityLookup } from './visibility-lookup.js';
|
|
8
|
+
/**
|
|
9
|
+
* Creates the hit tester of the unified z traversal
|
|
10
|
+
*
|
|
11
|
+
* @internal
|
|
12
|
+
*/
|
|
13
|
+
export function createTopmostHitTester(deps) {
|
|
14
|
+
const { store, hitTestService, unproject, toleranceLngLat, datasets } = deps;
|
|
15
|
+
const test = (feature, coordinate, tolerance) => hitTestService.hitTestFeature(feature, coordinate, tolerance);
|
|
16
|
+
/**
|
|
17
|
+
* Builds the context of the companion hits (null unless the configuration can perform
|
|
18
|
+
* the test)
|
|
19
|
+
*
|
|
20
|
+
* It is not built when no provider at all is registered, so the conventional traversal
|
|
21
|
+
* changes neither in cost nor in path.
|
|
22
|
+
*/
|
|
23
|
+
const companionContext = (point) => {
|
|
24
|
+
if (!deps.companions?.any())
|
|
25
|
+
return null;
|
|
26
|
+
const project = deps.project;
|
|
27
|
+
const getZoom = deps.getZoom;
|
|
28
|
+
if (!project || !getZoom)
|
|
29
|
+
return null;
|
|
30
|
+
return {
|
|
31
|
+
point,
|
|
32
|
+
project,
|
|
33
|
+
unproject: (p) => {
|
|
34
|
+
const { lng, lat } = unproject(p);
|
|
35
|
+
return { lng, lat };
|
|
36
|
+
},
|
|
37
|
+
zoom: getZoom(),
|
|
38
|
+
tolerancePx: deps.clickTolerancePx ?? DEFAULT_HIT_TEST_OPTIONS.clickTolerance,
|
|
39
|
+
};
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* Asks for a hit on the companions of one feature (a feature that is not visible is not
|
|
43
|
+
* asked)
|
|
44
|
+
*/
|
|
45
|
+
const companionOf = (feature, context, visible) => {
|
|
46
|
+
if (!context)
|
|
47
|
+
return null;
|
|
48
|
+
if (!visible(feature))
|
|
49
|
+
return null;
|
|
50
|
+
const companions = deps.companions;
|
|
51
|
+
if (!companions)
|
|
52
|
+
return null;
|
|
53
|
+
const companion = hitTestFeatureCompanions(companions, feature, context);
|
|
54
|
+
return companion ? { kind: 'companion', companion } : null;
|
|
55
|
+
};
|
|
56
|
+
return (point, options) => {
|
|
57
|
+
const orderedFeatures = options?.orderedFeatures ?? getDisplayFeatures(store);
|
|
58
|
+
const companion = companionContext(point);
|
|
59
|
+
// Within one hit test, the visibility of a layer or a group is looked up only once per
|
|
60
|
+
// container.
|
|
61
|
+
const visible = createVisibilityLookup(store);
|
|
62
|
+
// On a map with no dataset at all (none is visible), the cost is kept the same as
|
|
63
|
+
// the conventional path. The spatial index is queried only once as well.
|
|
64
|
+
if (!datasets?.hasAny()) {
|
|
65
|
+
if (!companion) {
|
|
66
|
+
const hit = hitTestService.hitTest(point, unproject, orderedFeatures);
|
|
67
|
+
return hit ? { kind: 'store', feature: hit.feature } : null;
|
|
68
|
+
}
|
|
69
|
+
// A companion sits one z below the feature itself, so the features are examined one
|
|
70
|
+
// at a time from the front in the order "the feature itself -> its companions". The
|
|
71
|
+
// spatial index is queried only once.
|
|
72
|
+
const storeHits = new Set(hitTestService.hitTestAll(point, unproject, orderedFeatures).map((r) => r.feature.id));
|
|
73
|
+
for (let i = orderedFeatures.length - 1; i >= 0; i--) {
|
|
74
|
+
const feature = orderedFeatures[i];
|
|
75
|
+
if (storeHits.has(feature.id))
|
|
76
|
+
return { kind: 'store', feature };
|
|
77
|
+
const companionHit = companionOf(feature, companion, visible);
|
|
78
|
+
if (companionHit)
|
|
79
|
+
return companionHit;
|
|
80
|
+
}
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
const lngLat = unproject(point);
|
|
84
|
+
const tolerance = toleranceLngLat(point);
|
|
85
|
+
// The click on each copy of the world it can reach (the stored copy first; local-frame.ts)
|
|
86
|
+
const copies = clickCopies([lngLat.lng, lngLat.lat], tolerance);
|
|
87
|
+
const onCopies = (hitOn) => {
|
|
88
|
+
for (const copy of copies) {
|
|
89
|
+
const hit = hitOn(copy);
|
|
90
|
+
if (hit)
|
|
91
|
+
return hit;
|
|
92
|
+
}
|
|
93
|
+
return null;
|
|
94
|
+
};
|
|
95
|
+
// 1. The above-store side
|
|
96
|
+
const above = onCopies((copy) => datasets.hitTestSide('above-store', copy, tolerance, test));
|
|
97
|
+
if (above)
|
|
98
|
+
return toTopHit(above);
|
|
99
|
+
// 2. The stacking order from the front. One hit test per frame is enough on the Store
|
|
100
|
+
// side, so it is performed only once, at the moment a layer entry is first met.
|
|
101
|
+
let storeHits;
|
|
102
|
+
let byLayer;
|
|
103
|
+
const layerOrder = store.getLayerOrder();
|
|
104
|
+
for (let i = layerOrder.length - 1; i >= 0; i--) {
|
|
105
|
+
const entryId = layerOrder[i];
|
|
106
|
+
if (store.getLayer(entryId) !== undefined) {
|
|
107
|
+
if (!storeHits) {
|
|
108
|
+
storeHits = new Set(hitTestService
|
|
109
|
+
.hitTestAll(point, unproject, orderedFeatures)
|
|
110
|
+
.map((result) => result.feature.id));
|
|
111
|
+
byLayer = groupByLayer(orderedFeatures);
|
|
112
|
+
}
|
|
113
|
+
// Even when not a single feature itself was hit, a companion can still be hit
|
|
114
|
+
if (storeHits.size === 0 && !companion)
|
|
115
|
+
continue;
|
|
116
|
+
const features = byLayer?.get(entryId);
|
|
117
|
+
if (!features)
|
|
118
|
+
continue;
|
|
119
|
+
for (let j = features.length - 1; j >= 0; j--) {
|
|
120
|
+
const feature = features[j];
|
|
121
|
+
if (storeHits.has(feature.id))
|
|
122
|
+
return { kind: 'store', feature };
|
|
123
|
+
const companionHit = companionOf(feature, companion, visible);
|
|
124
|
+
if (companionHit)
|
|
125
|
+
return companionHit;
|
|
126
|
+
}
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
const entry = onCopies((copy) => datasets.hitTestEntry(entryId, copy, tolerance, test));
|
|
130
|
+
if (entry)
|
|
131
|
+
return toTopHit(entry);
|
|
132
|
+
}
|
|
133
|
+
// 3. The below-store side
|
|
134
|
+
const below = onCopies((copy) => datasets.hitTestSide('below-store', copy, tolerance, test));
|
|
135
|
+
return below ? toTopHit(below) : null;
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Converts a dataset hit into a TopHit
|
|
140
|
+
*/
|
|
141
|
+
function toTopHit(hit) {
|
|
142
|
+
return { kind: 'dataset', dataset: hit.dataset, feature: hit.feature, row: hit.row };
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Splits the features in display order per layer (the order is preserved)
|
|
146
|
+
*/
|
|
147
|
+
function groupByLayer(orderedFeatures) {
|
|
148
|
+
const byLayer = new Map();
|
|
149
|
+
for (const feature of orderedFeatures) {
|
|
150
|
+
const features = byLayer.get(feature.layerId);
|
|
151
|
+
if (features)
|
|
152
|
+
features.push(feature);
|
|
153
|
+
else
|
|
154
|
+
byLayer.set(feature.layerId, [feature]);
|
|
155
|
+
}
|
|
156
|
+
return byLayer;
|
|
157
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Visibility lookup for hit testing
|
|
3
|
+
*
|
|
4
|
+
* Whether a feature can be selected is decided by the visible flag of the feature itself,
|
|
5
|
+
* its layer and its group. A single hit test asks this once per feature, so looking the
|
|
6
|
+
* store up for every feature makes one test O(N^2) on implementations where reading a
|
|
7
|
+
* layer costs time proportional to the feature count N (such as a replaced DocumentStore
|
|
8
|
+
* that copies the order array on every read). Here each layer and group is looked up only
|
|
9
|
+
* once per hit test, and features reuse the result of that lookup.
|
|
10
|
+
*
|
|
11
|
+
* The lookup is built for each hit test call (it is never carried over across store changes).
|
|
12
|
+
*/
|
|
13
|
+
import type { Store } from '../../store/store.js';
|
|
14
|
+
import type { Feature } from '../../store/types.js';
|
|
15
|
+
export type VisibilityLookup = (feature: Feature) => boolean;
|
|
16
|
+
/**
|
|
17
|
+
* Builds the lookup for a single hit test.
|
|
18
|
+
*
|
|
19
|
+
* Features that are not visible (any of feature / layer / group has visible=false) are not
|
|
20
|
+
* drawn, so they are excluded from the targets. A lock forbids interaction, not selection,
|
|
21
|
+
* so it is not consulted here.
|
|
22
|
+
*/
|
|
23
|
+
export declare function createVisibilityLookup(store: Store): VisibilityLookup;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
/**
|
|
4
|
+
* Builds the lookup for a single hit test.
|
|
5
|
+
*
|
|
6
|
+
* Features that are not visible (any of feature / layer / group has visible=false) are not
|
|
7
|
+
* drawn, so they are excluded from the targets. A lock forbids interaction, not selection,
|
|
8
|
+
* so it is not consulted here.
|
|
9
|
+
*/
|
|
10
|
+
export function createVisibilityLookup(store) {
|
|
11
|
+
const layers = new Map();
|
|
12
|
+
const groups = new Map();
|
|
13
|
+
const layerVisible = (id) => {
|
|
14
|
+
let visible = layers.get(id);
|
|
15
|
+
if (visible === undefined) {
|
|
16
|
+
const layer = store.getLayer(id);
|
|
17
|
+
visible = !layer || layer.visible;
|
|
18
|
+
layers.set(id, visible);
|
|
19
|
+
}
|
|
20
|
+
return visible;
|
|
21
|
+
};
|
|
22
|
+
const groupVisible = (id) => {
|
|
23
|
+
let visible = groups.get(id);
|
|
24
|
+
if (visible === undefined) {
|
|
25
|
+
const group = store.getGroup(id);
|
|
26
|
+
visible = !group || group.visible;
|
|
27
|
+
groups.set(id, visible);
|
|
28
|
+
}
|
|
29
|
+
return visible;
|
|
30
|
+
};
|
|
31
|
+
return (feature) => {
|
|
32
|
+
if (!feature.visible)
|
|
33
|
+
return false;
|
|
34
|
+
if (!layerVisible(feature.layerId))
|
|
35
|
+
return false;
|
|
36
|
+
if (feature.groupId && !groupVisible(feature.groupId))
|
|
37
|
+
return false;
|
|
38
|
+
return true;
|
|
39
|
+
};
|
|
40
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dispatcher module
|
|
3
|
+
*
|
|
4
|
+
* Responsible for accepting user input and routing it to modes.
|
|
5
|
+
* The input handling layer of the Flux architecture.
|
|
6
|
+
*
|
|
7
|
+
* Only the symbols that src/index.ts publishes are listed here (see "The public
|
|
8
|
+
* surface" in CONTRIBUTING.md). Internal code imports from the defining file.
|
|
9
|
+
*/
|
|
10
|
+
export type { BoxSelectionStrategy, BoxSelectionStrategyRegistry, } from './hit-test/box-strategy.js';
|
|
11
|
+
export type { HitTestService, UnprojectFunction } from './hit-test/service.js';
|
|
12
|
+
export type { HitTestOptions, HitTestResult, HitTestStrategy, VertexHit, } from './hit-test/strategies/base.js';
|
|
13
|
+
export { PointHitTestStrategy } from './hit-test/strategies/point.js';
|
|
14
|
+
export type { HitTestTopmost, TopHit, TopmostHitTestOptions } from './hit-test/topmost.js';
|
|
15
|
+
export type { DragNormalizedEvent, KeyNormalizedEvent, MapClickEventPayload, ModifierKeys, MouseNormalizedEvent, NormalizedEvent, PointerOriginalEvent, PointerType, } from './types.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
import { nearestLongitude, wrapLongitude } from '../shared/math/longitude.js';
|
|
4
|
+
/**
|
|
5
|
+
* The event types that are stopped while the pointer is held
|
|
6
|
+
*
|
|
7
|
+
* Only the ones that determine coordinates are stopped. Stopping mousedown /
|
|
8
|
+
* mouseup / the drag events would also break the pan and zoom of MapLibre.
|
|
9
|
+
*/
|
|
10
|
+
const HELD_EVENT_TYPES = new Set([
|
|
11
|
+
'click',
|
|
12
|
+
'dblclick',
|
|
13
|
+
'mousemove',
|
|
14
|
+
]);
|
|
15
|
+
/**
|
|
16
|
+
* The first coordinate of a shape being drawn (null when there is none)
|
|
17
|
+
*/
|
|
18
|
+
function firstTentativeCoordinate(tentative) {
|
|
19
|
+
let value = tentative?.coordinates;
|
|
20
|
+
while (Array.isArray(value) && Array.isArray(value[0]))
|
|
21
|
+
value = value[0];
|
|
22
|
+
if (Array.isArray(value) && typeof value[0] === 'number' && typeof value[1] === 'number') {
|
|
23
|
+
return value;
|
|
24
|
+
}
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Brings the longitudes of an event onto the stored copy of the world
|
|
29
|
+
*
|
|
30
|
+
* The rule, from the point of view of the pointer:
|
|
31
|
+
*
|
|
32
|
+
* - A click, a move or a press on its own lands in [-180, 180], the range the features are
|
|
33
|
+
* stored in. This is the same point hit testing starts from (`clickCopies` in
|
|
34
|
+
* hit-test/local-frame.ts), so a point placed or a feature picked on the copy east of the
|
|
35
|
+
* antimeridian gets its stored longitude
|
|
36
|
+
* - While a shape is being drawn, the pointer goes to the copy nearest to the first vertex of the
|
|
37
|
+
* shape instead, so a line drawn across the antimeridian stays continuous (170 then 190, not
|
|
38
|
+
* 170 then -170, which would run the other way round the world). Its vertices can then lie a
|
|
39
|
+
* little beyond ±180; the rendering and the export deal with that
|
|
40
|
+
* - A drag moves every coordinate of its events by the one shift decided from where it started
|
|
41
|
+
* (`dragStartLngLat`), so the distance dragged never jumps by 360 degrees when the pointer
|
|
42
|
+
* crosses the antimeridian during the drag
|
|
43
|
+
*
|
|
44
|
+
* Away from the antimeridian, on the main copy of the world, nothing changes and the event is
|
|
45
|
+
* returned as it is.
|
|
46
|
+
*/
|
|
47
|
+
function toStoredCopy(event, reference) {
|
|
48
|
+
if (!('lngLat' in event))
|
|
49
|
+
return event;
|
|
50
|
+
const anchor = 'dragStartLngLat' in event ? event.dragStartLngLat.lng : event.lngLat.lng;
|
|
51
|
+
const target = reference ? nearestLongitude(anchor, reference[0]) : wrapLongitude(anchor);
|
|
52
|
+
const shift = target - anchor;
|
|
53
|
+
if (shift === 0)
|
|
54
|
+
return event;
|
|
55
|
+
const moved = { ...event, lngLat: { lng: event.lngLat.lng + shift, lat: event.lngLat.lat } };
|
|
56
|
+
if ('dragStartLngLat' in event) {
|
|
57
|
+
moved.dragStartLngLat = {
|
|
58
|
+
lng: event.dragStartLngLat.lng + shift,
|
|
59
|
+
lat: event.dragStartLngLat.lat,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
return moved;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Creates an InputRouter
|
|
66
|
+
*
|
|
67
|
+
* @internal
|
|
68
|
+
*/
|
|
69
|
+
export function createInputRouter(deps) {
|
|
70
|
+
const { normalizer, modeManager, context, map, pluginManager, displayInteractions, notifyMapClick, snapService, } = deps;
|
|
71
|
+
let boundHandleEvent = null;
|
|
72
|
+
/**
|
|
73
|
+
* Whether input originating from the pointer is currently held
|
|
74
|
+
*
|
|
75
|
+
* While the keyboard is determining the coordinates, as with a numeric input
|
|
76
|
+
* panel, interruption by the real pointer is stopped. What is stopped is only the
|
|
77
|
+
* events that "determine" coordinates (click / dblclick / mousemove); mousedown /
|
|
78
|
+
* mouseup / the drag events are let through (so as not to kill the pan and zoom of
|
|
79
|
+
* MapLibre; drawing modes do not consume them).
|
|
80
|
+
*/
|
|
81
|
+
let pointerHeld = false;
|
|
82
|
+
/**
|
|
83
|
+
* Builds the snapping context
|
|
84
|
+
*
|
|
85
|
+
* While a vertex / midpoint is being dragged, the grabbed vertex itself is
|
|
86
|
+
* excluded (the other vertices of the same feature stay as candidates so that a
|
|
87
|
+
* ring can be closed). The exclusion can be derived from the drag state of the
|
|
88
|
+
* Store, so no modification is needed on the select mode side.
|
|
89
|
+
*
|
|
90
|
+
* While a move drag is in progress, the features being moved are excluded whole.
|
|
91
|
+
* A feature being moved travels with the cursor, so if it stayed a candidate it
|
|
92
|
+
* would always sit inside the tolerance, the cursor would be pulled back to its
|
|
93
|
+
* own position, and it would repeat "drift every frame by the offset from when it
|
|
94
|
+
* was grabbed, then leave the tolerance and catch up all at once" (which looks
|
|
95
|
+
* like a vibration). It is the same reasoning as excludeVertex for a vertex drag,
|
|
96
|
+
* except that the unit that is removed is the whole feature.
|
|
97
|
+
*
|
|
98
|
+
* The feature to prefer when candidates tie is read from the current mode (a
|
|
99
|
+
* drawing mode returns the boundary it started tracing).
|
|
100
|
+
*/
|
|
101
|
+
function buildSnapContext(modifiers) {
|
|
102
|
+
const dragState = context.store.getDragState();
|
|
103
|
+
const isVertexDrag = dragState?.operation === 'vertex' || dragState?.operation === 'midpoint';
|
|
104
|
+
const excludeVertex = isVertexDrag && dragState?.activeFeatureId && dragState.activeVertex
|
|
105
|
+
? { featureId: dragState.activeFeatureId, vertex: dragState.activeVertex }
|
|
106
|
+
: undefined;
|
|
107
|
+
const moving = dragState?.operation === 'move' ? dragState.movingFeatureIds : undefined;
|
|
108
|
+
const excludeFeatureIds = moving && moving.length > 0 ? new Set(moving) : undefined;
|
|
109
|
+
const preferFeature = modeManager.getHandler()?.getSnapPreference?.() ?? undefined;
|
|
110
|
+
return {
|
|
111
|
+
zoom: map.getZoom(),
|
|
112
|
+
excludeVertex,
|
|
113
|
+
excludeFeatureIds,
|
|
114
|
+
preferFeature,
|
|
115
|
+
modifiers,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Replaces lngLat with the snapped coordinates just before delivery to the mode
|
|
120
|
+
*
|
|
121
|
+
* When nothing was snapped, the event is returned as-is (no pointless copy).
|
|
122
|
+
*
|
|
123
|
+
* Whether snapping is wanted is asked of the current mode per input type
|
|
124
|
+
* (isSnapEnabledFor). A mode that does not declare it snaps for every input type
|
|
125
|
+
* (as before).
|
|
126
|
+
*/
|
|
127
|
+
function applySnap(event, inputType) {
|
|
128
|
+
if (!snapService || event.snap === false)
|
|
129
|
+
return event;
|
|
130
|
+
if (modeManager.getHandler()?.isSnapEnabledFor?.(inputType) === false)
|
|
131
|
+
return event;
|
|
132
|
+
const result = snapService.resolve(event.lngLat, event.point, buildSnapContext(event.modifiers));
|
|
133
|
+
if (result.lngLat.lng === event.lngLat.lng && result.lngLat.lat === event.lngLat.lat) {
|
|
134
|
+
return event;
|
|
135
|
+
}
|
|
136
|
+
return { ...event, lngLat: { lng: result.lngLat.lng, lat: result.lngLat.lat } };
|
|
137
|
+
}
|
|
138
|
+
function handleEvent(input, options = {}) {
|
|
139
|
+
// Only input originating from the real pointer is stopped while held.
|
|
140
|
+
// Synthetic input (dispatch) is let through
|
|
141
|
+
if (pointerHeld && !options.synthetic && HELD_EVENT_TYPES.has(input.type))
|
|
142
|
+
return;
|
|
143
|
+
const handler = modeManager.getHandler();
|
|
144
|
+
if (!handler)
|
|
145
|
+
return;
|
|
146
|
+
// The single place where the longitude of the input is decided (see toStoredCopy)
|
|
147
|
+
const event = toStoredCopy(input, firstTentativeCoordinate(context.store.getTentative()));
|
|
148
|
+
switch (event.type) {
|
|
149
|
+
case 'click': {
|
|
150
|
+
// Deliver to the mode with the snapped coordinates (if nothing snapped,
|
|
151
|
+
// the original event is used unchanged)
|
|
152
|
+
const snapped = applySnap(event, 'click');
|
|
153
|
+
handleClick(handler, snapped);
|
|
154
|
+
// Delivery to datasets happens only in select mode. A click
|
|
155
|
+
// in a drawing mode places a vertex, and delivering that same click as a
|
|
156
|
+
// click on the data as well would make the host application's "click to
|
|
157
|
+
// select" fire by mistake while drawing (for example, starting to draw a
|
|
158
|
+
// circle on top of a huge polygon of data would cover the whole screen with
|
|
159
|
+
// the selection highlight). The rule that a hit in the Store always wins is
|
|
160
|
+
// decided on the interception side, so the selection behavior of the mode
|
|
161
|
+
// during select is unaffected.
|
|
162
|
+
if (handler.modeName === 'select')
|
|
163
|
+
displayInteractions?.handleClick(snapped);
|
|
164
|
+
// Emit the click of select mode as a single stream regardless of whether
|
|
165
|
+
// anything was hit (draw.map.click). display.click is designed not to fire
|
|
166
|
+
// when a feature in the Store is hit, so a host application that needs "a
|
|
167
|
+
// click anywhere on the map" (placing a comment pin, for instance) watches
|
|
168
|
+
// this one. The coordinates are copied from the raw event before snapping.
|
|
169
|
+
if (handler.modeName === 'select') {
|
|
170
|
+
notifyMapClick?.({
|
|
171
|
+
lngLat: [event.lngLat.lng, event.lngLat.lat],
|
|
172
|
+
point: { x: event.point.x, y: event.point.y },
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
break;
|
|
176
|
+
}
|
|
177
|
+
case 'dblclick':
|
|
178
|
+
handler.onDoubleClick?.(event);
|
|
179
|
+
break;
|
|
180
|
+
case 'mousedown':
|
|
181
|
+
handleMouseDown(handler, event);
|
|
182
|
+
break;
|
|
183
|
+
case 'mouseup':
|
|
184
|
+
handler.onMouseUp?.(event);
|
|
185
|
+
break;
|
|
186
|
+
case 'mousemove': {
|
|
187
|
+
const snapped = applySnap(event, 'mousemove');
|
|
188
|
+
// Call the onMouseMove of the plugins (they do not consume it)
|
|
189
|
+
pluginManager?.handleMouseMove(snapped);
|
|
190
|
+
handler.onMouseMove?.(snapped);
|
|
191
|
+
// The hover of datasets is likewise limited to select mode,
|
|
192
|
+
// by the same rule as click. When switching to a drawing mode, a hover that
|
|
193
|
+
// is still held is discarded (so that it does not fire on the stale target
|
|
194
|
+
// when coming back).
|
|
195
|
+
if (handler.modeName === 'select') {
|
|
196
|
+
displayInteractions?.handleMouseMove(snapped);
|
|
197
|
+
}
|
|
198
|
+
else {
|
|
199
|
+
displayInteractions?.reset();
|
|
200
|
+
}
|
|
201
|
+
break;
|
|
202
|
+
}
|
|
203
|
+
case 'contextmenu':
|
|
204
|
+
// contextmenu currently has no special handling
|
|
205
|
+
break;
|
|
206
|
+
// The start and end of a drag also go through snapping. This is to keep
|
|
207
|
+
// "start drawing exactly at a corner of a boundary and end at a corner" for
|
|
208
|
+
// drag-driven drawing (freehand). The drag operations of select mode use
|
|
209
|
+
// dragStartLngLat (the press position from before the threshold was exceeded)
|
|
210
|
+
// as their start position, so they are unaffected by the replacement here.
|
|
211
|
+
case 'dragstart': {
|
|
212
|
+
const snapped = applySnap(event, 'dragstart');
|
|
213
|
+
handler.onDragStart?.(snapped);
|
|
214
|
+
break;
|
|
215
|
+
}
|
|
216
|
+
case 'dragmove': {
|
|
217
|
+
const snapped = applySnap(event, 'dragmove');
|
|
218
|
+
// Call the onDragMove of the plugins (they do not consume it; the
|
|
219
|
+
// counterpart of onMouseMove)
|
|
220
|
+
pluginManager?.handleDragMove(snapped);
|
|
221
|
+
handler.onDragMove?.(snapped);
|
|
222
|
+
break;
|
|
223
|
+
}
|
|
224
|
+
case 'dragend': {
|
|
225
|
+
const snapped = applySnap(event, 'dragend');
|
|
226
|
+
handler.onDragEnd?.(snapped);
|
|
227
|
+
break;
|
|
228
|
+
}
|
|
229
|
+
// A press ended without a release (a second finger, or the browser cancelled the
|
|
230
|
+
// touch). No coordinates are decided, so it does not go through snapping, and it
|
|
231
|
+
// is never held: the mode must always get the chance to abort the press.
|
|
232
|
+
case 'dragcancel':
|
|
233
|
+
handler.onDragCancel?.(event);
|
|
234
|
+
break;
|
|
235
|
+
case 'keydown':
|
|
236
|
+
// Call the onKeyDown of the plugins first
|
|
237
|
+
if (pluginManager?.handleKeyDown(event)) {
|
|
238
|
+
// Handled by a plugin
|
|
239
|
+
break;
|
|
240
|
+
}
|
|
241
|
+
handler.onKeyDown?.(event);
|
|
242
|
+
break;
|
|
243
|
+
case 'keyup':
|
|
244
|
+
handler.onKeyUp?.(event);
|
|
245
|
+
break;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
function handleClick(handler, event) {
|
|
249
|
+
handler.onClick?.(event);
|
|
250
|
+
}
|
|
251
|
+
function handleMouseDown(handler, event) {
|
|
252
|
+
if (handler.onMouseDown) {
|
|
253
|
+
const consumed = handler.onMouseDown(event);
|
|
254
|
+
// When the event has been consumed, stop it from propagating to MapLibre
|
|
255
|
+
if (consumed) {
|
|
256
|
+
const original = event.originalEvent;
|
|
257
|
+
original.stopPropagation();
|
|
258
|
+
// MapLibre listens to touchstart as a passive listener, where preventDefault() is
|
|
259
|
+
// ignored and makes the browser warn. The pan and the pinch of a touch are left to
|
|
260
|
+
// MapLibre, so only a mouse press has its default action prevented.
|
|
261
|
+
if (!('touches' in original)) {
|
|
262
|
+
original.preventDefault();
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
function start() {
|
|
268
|
+
boundHandleEvent = handleEvent;
|
|
269
|
+
normalizer.on(boundHandleEvent);
|
|
270
|
+
}
|
|
271
|
+
function stop() {
|
|
272
|
+
if (boundHandleEvent) {
|
|
273
|
+
normalizer.off(boundHandleEvent);
|
|
274
|
+
boundHandleEvent = null;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
return {
|
|
278
|
+
start,
|
|
279
|
+
stop,
|
|
280
|
+
dispatch: (event) => handleEvent(event, { synthetic: true }),
|
|
281
|
+
setPointerHold(held) {
|
|
282
|
+
pointerHeld = held;
|
|
283
|
+
},
|
|
284
|
+
isPointerHeld() {
|
|
285
|
+
return pointerHeld;
|
|
286
|
+
},
|
|
287
|
+
};
|
|
288
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|