@sakuzu/maplibre-gl-draw 1.0.0 → 2.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 +1016 -2
- package/README.ja.md +39 -19
- package/README.md +41 -21
- package/dist/api/datasets.d.ts +258 -0
- package/dist/api/document.d.ts +66 -0
- package/dist/api/draw.d.ts +135 -0
- package/dist/api/draw.js +18 -0
- package/dist/api/drawing.d.ts +87 -0
- package/dist/api/errors.d.ts +35 -0
- package/dist/api/errors.js +35 -0
- package/dist/api/events.d.ts +306 -0
- package/dist/api/extension/context.d.ts +247 -0
- package/dist/api/extension/feature-type.d.ts +129 -0
- package/dist/api/extension/mode.d.ts +123 -0
- package/dist/api/extension/plugin.d.ts +51 -0
- package/dist/api/extension/plugin.js +3 -0
- package/dist/api/extension/provider.d.ts +119 -0
- package/dist/api/extension/provider.js +3 -0
- package/dist/api/extension/render.d.ts +176 -0
- package/dist/api/extension/render.js +3 -0
- package/dist/api/extension/store.d.ts +190 -0
- package/dist/api/extension/store.js +3 -0
- package/dist/api/extensions.d.ts +306 -0
- package/dist/api/extensions.js +3 -0
- package/dist/api/features.d.ts +188 -0
- package/dist/api/features.js +3 -0
- package/dist/api/groups.d.ts +111 -0
- package/dist/api/groups.js +3 -0
- package/dist/api/hidden.d.ts +45 -0
- package/dist/api/hidden.js +3 -0
- package/dist/api/impl/adapters.js +463 -0
- package/dist/api/impl/contexts.js +466 -0
- package/dist/api/impl/create-draw.js +124 -0
- package/dist/api/impl/datasets.js +404 -0
- package/dist/api/impl/destroy-guard.js +74 -0
- package/dist/api/impl/document.js +280 -0
- package/dist/api/impl/drawing.js +180 -0
- package/dist/api/impl/engine-context.d.ts +7 -0
- package/dist/api/{context.js → impl/engine-context.js} +49 -38
- package/dist/{maplibre-gl-draw.js → api/impl/engine.js} +145 -177
- package/dist/api/impl/events.js +422 -0
- package/dist/api/impl/extension-host.js +361 -0
- package/dist/api/impl/extensions.js +229 -0
- package/dist/api/impl/features.js +445 -0
- package/dist/api/impl/geometry/apply.d.ts +32 -0
- package/dist/api/{geometry → impl/geometry}/apply.js +10 -27
- package/dist/api/{geometry → impl/geometry}/buffer.d.ts +4 -3
- package/dist/api/{geometry → impl/geometry}/buffer.js +12 -23
- package/dist/api/{geometry → impl/geometry}/split.d.ts +4 -3
- package/dist/api/{geometry → impl/geometry}/split.js +10 -21
- package/dist/api/{geometry → impl/geometry}/targets.d.ts +2 -20
- package/dist/api/{geometry → impl/geometry}/targets.js +8 -35
- package/dist/api/impl/geometry/types.js +3 -0
- package/dist/api/impl/groups.d.ts +3 -0
- package/dist/api/impl/groups.js +268 -0
- package/dist/api/impl/hidden.js +60 -0
- package/dist/api/impl/import-export/constants.d.ts +22 -0
- package/dist/api/impl/import-export/constants.js +24 -0
- package/dist/api/{import-export → impl/import-export}/embedded-file.js +2 -2
- package/dist/api/{import-export → impl/import-export}/format-detection.d.ts +1 -1
- package/dist/api/{import-export → impl/import-export}/format-detection.js +2 -1
- package/dist/api/impl/import-export/geojson-export.d.ts +19 -0
- package/dist/api/{import-export → impl/import-export}/geojson-export.js +71 -104
- package/dist/api/{import-export → impl/import-export}/geojson-import.d.ts +11 -7
- package/dist/api/{import-export → impl/import-export}/geojson-import.js +139 -97
- package/dist/api/{import-export → impl/import-export}/geometry-validation.d.ts +14 -0
- package/dist/api/{import-export → impl/import-export}/geometry-validation.js +45 -0
- package/dist/api/impl/import-export/image-import.d.ts +16 -0
- package/dist/api/impl/import-export/image-import.js +73 -0
- package/dist/api/impl/import-export/legacy-image-style.d.ts +16 -0
- package/dist/api/impl/import-export/legacy-image-style.js +49 -0
- package/dist/api/impl/import-export/native-format.d.ts +14 -0
- package/dist/api/{import-export → impl/import-export}/native-format.js +32 -22
- package/dist/api/impl/import-export/native-upgrade.d.ts +8 -0
- package/dist/api/impl/import-export/native-upgrade.js +139 -0
- package/dist/api/{import-export → impl/import-export}/native-validation.d.ts +1 -1
- package/dist/api/{import-export → impl/import-export}/native-validation.js +15 -14
- package/dist/api/impl/import-export/style-validation.d.ts +24 -0
- package/dist/api/impl/import-export/style-validation.js +86 -0
- package/dist/api/impl/import-export/types.d.ts +52 -0
- package/dist/api/impl/import-export/types.js +3 -0
- package/dist/api/impl/input.js +180 -0
- package/dist/api/impl/layers.js +307 -0
- package/dist/api/impl/metadata.d.ts +1 -0
- package/dist/api/impl/metadata.js +22 -0
- package/dist/api/impl/options.d.ts +1 -0
- package/dist/api/impl/options.js +822 -0
- package/dist/api/impl/placement.d.ts +1 -0
- package/dist/api/impl/placement.js +138 -0
- package/dist/api/impl/render-context.d.ts +13 -0
- package/dist/api/impl/render-context.js +272 -0
- package/dist/api/impl/rows.d.ts +1 -0
- package/dist/api/impl/rows.js +46 -0
- package/dist/api/impl/selection.d.ts +1 -0
- package/dist/api/impl/selection.js +186 -0
- package/dist/api/impl/shared.d.ts +64 -0
- package/dist/api/impl/shared.js +178 -0
- package/dist/api/impl/validate-extension.d.ts +1 -0
- package/dist/api/impl/validate-extension.js +159 -0
- package/dist/api/layers.d.ts +130 -0
- package/dist/api/layers.js +3 -0
- package/dist/api/metadata.d.ts +18 -0
- package/dist/api/metadata.js +3 -0
- package/dist/api/model.d.ts +487 -0
- package/dist/api/model.js +47 -0
- package/dist/api/options.d.ts +466 -0
- package/dist/api/options.js +3 -0
- package/dist/api/selection.d.ts +94 -0
- package/dist/api/selection.js +3 -0
- package/dist/api/state.d.ts +155 -0
- package/dist/api/state.js +12 -0
- package/dist/{display → dataset}/chunk.d.ts +1 -1
- package/dist/{display → dataset}/chunk.js +4 -3
- package/dist/{display → dataset}/dataset.js +18 -21
- package/dist/dataset/interaction.d.ts +1 -0
- package/dist/{display → dataset}/interaction.js +18 -6
- package/dist/dataset/manager.d.ts +1 -0
- package/dist/dataset/provider.d.ts +1 -0
- package/dist/{display → dataset}/retained.d.ts +1 -1
- package/dist/{display → dataset}/retained.js +8 -7
- package/dist/dataset/source.d.ts +1 -0
- package/dist/{display → dataset}/source.js +17 -4
- package/dist/dataset/spatial.d.ts +1 -0
- package/dist/{display → dataset}/spatial.js +1 -1
- package/dist/dataset/style.d.ts +1 -0
- package/dist/{display → dataset}/style.js +1 -1
- package/dist/dataset/table-source.d.ts +1 -0
- package/dist/{display/columnar/source.js → dataset/table-source.js} +53 -25
- package/dist/{display → dataset}/thinning.d.ts +0 -10
- package/dist/{display → dataset}/thinning.js +3 -2
- package/dist/dataset/triangulation.d.ts +1 -0
- package/dist/{display → dataset}/triangulation.js +0 -0
- package/dist/{display → dataset}/types.d.ts +82 -121
- package/dist/dataset/types.js +61 -0
- package/dist/dispatcher/hit-test/box-strategies.js +13 -13
- package/dist/dispatcher/hit-test/box-strategy.d.ts +2 -15
- package/dist/dispatcher/hit-test/globe-shape.js +5 -4
- package/dist/dispatcher/hit-test/service.d.ts +17 -0
- package/dist/dispatcher/hit-test/service.js +80 -16
- package/dist/dispatcher/hit-test/strategies/base.d.ts +13 -19
- package/dist/dispatcher/hit-test/strategies/circle.js +3 -2
- package/dist/dispatcher/hit-test/strategies/image.js +6 -18
- package/dist/dispatcher/hit-test/strategies/line.d.ts +0 -6
- package/dist/dispatcher/hit-test/strategies/line.js +9 -2
- package/dist/dispatcher/hit-test/strategies/multi.d.ts +0 -8
- package/dist/dispatcher/hit-test/strategies/multi.js +17 -8
- package/dist/dispatcher/hit-test/strategies/point.d.ts +9 -7
- package/dist/dispatcher/hit-test/strategies/point.js +8 -4
- package/dist/dispatcher/hit-test/strategies/polygon.d.ts +0 -7
- package/dist/dispatcher/hit-test/strategies/polygon.js +11 -3
- package/dist/dispatcher/hit-test/topmost.d.ts +1 -1
- package/dist/dispatcher/input-router.js +152 -69
- package/dist/dispatcher/normalizer.js +6 -2
- package/dist/dispatcher/types.d.ts +6 -1
- package/dist/extension/feature-handler.d.ts +1 -182
- package/dist/extension/index.d.ts +4 -7
- package/dist/extension/renderers.d.ts +1 -208
- package/dist/geometry/angle.d.ts +0 -8
- package/dist/geometry/angle.js +0 -8
- package/dist/geometry/bbox.d.ts +4 -12
- package/dist/geometry/bbox.js +4 -12
- package/dist/geometry/boolean.d.ts +0 -51
- package/dist/geometry/boolean.js +0 -51
- package/dist/geometry/buffer.d.ts +0 -26
- package/dist/geometry/buffer.js +0 -26
- package/dist/geometry/circle.d.ts +0 -9
- package/dist/geometry/circle.js +0 -9
- package/dist/geometry/coords.d.ts +0 -16
- package/dist/geometry/coords.js +0 -16
- package/dist/geometry/distance.d.ts +0 -24
- package/dist/geometry/distance.js +0 -24
- package/dist/geometry/errors.d.ts +21 -36
- package/dist/geometry/errors.js +49 -29
- package/dist/geometry/geojson.d.ts +81 -0
- package/dist/geometry/geojson.js +164 -0
- package/dist/geometry/index.d.ts +38 -23
- package/dist/geometry/index.js +43 -31
- package/dist/geometry/measure.d.ts +0 -27
- package/dist/geometry/measure.js +0 -27
- package/dist/geometry/predicates.d.ts +0 -9
- package/dist/geometry/predicates.js +0 -9
- package/dist/geometry/public-bounds.d.ts +26 -0
- package/dist/geometry/public-bounds.js +30 -0
- package/dist/geometry/public-combine.d.ts +78 -0
- package/dist/geometry/public-combine.js +82 -0
- package/dist/geometry/public-create.d.ts +54 -0
- package/dist/geometry/public-create.js +70 -0
- package/dist/geometry/public-measure.d.ts +170 -0
- package/dist/geometry/public-measure.js +283 -0
- package/dist/geometry/public-predicates.d.ts +54 -0
- package/dist/geometry/public-predicates.js +144 -0
- package/dist/geometry/public-repair.d.ts +75 -0
- package/dist/geometry/public-repair.js +77 -0
- package/dist/geometry/simplify.d.ts +0 -7
- package/dist/geometry/simplify.js +0 -7
- package/dist/geometry/split.d.ts +0 -20
- package/dist/geometry/split.js +0 -20
- package/dist/geometry/units.d.ts +20 -12
- package/dist/geometry/units.js +20 -12
- package/dist/index.d.ts +52 -66
- package/dist/index.js +6 -18
- package/dist/messages.d.ts +7 -7
- package/dist/modes/draw/circle.js +83 -207
- package/dist/modes/draw/commit-layer.d.ts +5 -16
- package/dist/modes/draw/commit-layer.js +2 -13
- package/dist/modes/draw/freehand.js +108 -246
- package/dist/modes/draw/image.js +4 -2
- package/dist/modes/draw/index.d.ts +5 -5
- package/dist/modes/draw/index.js +5 -5
- package/dist/modes/draw/line.js +18 -354
- package/dist/modes/draw/point.js +29 -78
- package/dist/modes/draw/polygon.js +23 -368
- package/dist/modes/draw/trace-support.d.ts +43 -36
- package/dist/modes/draw/trace-support.js +95 -98
- package/dist/modes/draw/vertex-drawing.d.ts +1 -0
- package/dist/modes/draw/vertex-drawing.js +176 -0
- package/dist/modes/handler.d.ts +1 -285
- package/dist/modes/manager.d.ts +2 -2
- package/dist/modes/manager.js +3 -0
- package/dist/modes/select/box-selection.d.ts +3 -3
- package/dist/modes/select/box-selection.js +2 -1
- package/dist/modes/select/click-handler.d.ts +5 -5
- package/dist/modes/select/click-handler.js +22 -20
- package/dist/modes/select/cursor-handler.d.ts +2 -2
- package/dist/modes/select/drag/intermediate-writes.js +1 -1
- package/dist/modes/select/drag/move.js +3 -3
- package/dist/modes/select/drag/operation.d.ts +3 -3
- package/dist/modes/select/drag/radius.js +5 -4
- package/dist/modes/select/drag/transform.d.ts +2 -2
- package/dist/modes/select/drag/transform.js +11 -5
- package/dist/modes/select/drag/vertex.d.ts +2 -2
- package/dist/modes/select/drag/vertex.js +13 -8
- package/dist/modes/select/drag-handler.js +44 -25
- package/dist/modes/select/mode.js +17 -17
- package/dist/modes/select/shortcut-handler.d.ts +8 -8
- package/dist/modes/select/shortcut-handler.js +9 -7
- package/dist/operations/layer-operations.js +29 -168
- package/dist/operations/resize.d.ts +2 -2
- package/dist/operations/resize.js +5 -5
- package/dist/operations/rotate.js +5 -5
- package/dist/operations/selection-operations.d.ts +16 -1
- package/dist/operations/selection-operations.js +28 -13
- package/dist/operations/shared-vertex.js +4 -2
- package/dist/operations/trace-graph.d.ts +0 -18
- package/dist/operations/trace-graph.js +0 -18
- package/dist/operations/vertex.js +36 -35
- package/dist/shared/color.d.ts +1 -0
- package/dist/shared/color.js +245 -0
- package/dist/shared/config/constants.d.ts +1 -54
- package/dist/shared/config/constants.js +1 -58
- package/dist/shared/config/feature-style.d.ts +16 -13
- package/dist/shared/config/feature-style.js +9 -0
- package/dist/shared/config/rendering.d.ts +3 -3
- package/dist/shared/config/selection-highlight.d.ts +0 -15
- package/dist/shared/config/selection-highlight.js +4 -7
- package/dist/shared/config/selection.d.ts +2 -32
- package/dist/shared/config/selection.js +0 -18
- package/dist/shared/config/topology.d.ts +2 -2
- package/dist/shared/config/trace.d.ts +4 -4
- package/dist/shared/math/angle.d.ts +1 -1
- package/dist/shared/math/angle.js +1 -1
- package/dist/shared/math/circle.d.ts +1 -1
- package/dist/shared/math/circle.js +1 -1
- package/dist/shared/math/distance.d.ts +2 -1
- package/dist/shared/math/distance.js +3 -2
- package/dist/shared/math/index.d.ts +1 -1
- package/dist/shared/math/index.js +1 -1
- package/dist/shared/math/transform.d.ts +23 -0
- package/dist/shared/math/transform.js +47 -28
- package/dist/shared/properties.d.ts +18 -0
- package/dist/shared/properties.js +129 -0
- package/dist/shared/types/events.d.ts +15 -7
- package/dist/shared/types/model.d.ts +109 -159
- package/dist/shared/types/style.d.ts +1 -1
- package/dist/shared/utils/color.d.ts +2 -36
- package/dist/shared/utils/color.js +13 -70
- package/dist/shared/utils/coordinates.d.ts +30 -4
- package/dist/shared/utils/coordinates.js +56 -10
- package/dist/shared/utils/event-emitter.d.ts +1 -262
- package/dist/shared/utils/event-emitter.js +4 -3
- package/dist/shared/utils/feature-bbox.js +8 -7
- package/dist/shared/utils/feature-segments.js +5 -4
- package/dist/shared/utils/image.d.ts +0 -4
- package/dist/shared/utils/image.js +0 -6
- package/dist/shared/utils/name-generator.d.ts +14 -20
- package/dist/shared/utils/name-generator.js +20 -3
- package/dist/shared/utils/pixel-ratio.d.ts +9 -3
- package/dist/shared/utils/pixel-ratio.js +13 -4
- package/dist/shared/utils/property.d.ts +7 -50
- package/dist/shared/utils/property.js +22 -87
- package/dist/snapping/custom-targets.js +21 -4
- package/dist/snapping/indicator.js +20 -11
- package/dist/snapping/providers/display.d.ts +6 -1
- package/dist/snapping/providers/display.js +2 -1
- package/dist/snapping/providers/guide.d.ts +3 -43
- package/dist/snapping/providers/guide.js +1 -44
- package/dist/snapping/providers/intersection.js +1 -1
- package/dist/snapping/providers/store.js +3 -3
- package/dist/snapping/service.js +18 -7
- package/dist/snapping/types.d.ts +9 -35
- package/dist/store/draw-store.js +233 -142
- package/dist/store/local-visibility.d.ts +11 -6
- package/dist/store/local-visibility.js +38 -7
- package/dist/store/lock.d.ts +0 -6
- package/dist/store/lock.js +0 -6
- package/dist/store/memory/change-bus.d.ts +3 -3
- package/dist/store/memory/change-bus.js +12 -0
- package/dist/store/memory/file-store.d.ts +2 -2
- package/dist/store/memory/ui-state.d.ts +1 -51
- package/dist/store/memory/ui-state.js +122 -134
- package/dist/store/memory.d.ts +1 -8
- package/dist/store/memory.js +249 -45
- package/dist/store/ordering.d.ts +9 -0
- package/dist/store/ordering.js +17 -0
- package/dist/store/spatial/spatial-index.d.ts +1 -1
- package/dist/store/spatial/spatial-index.js +1 -1
- package/dist/store/spatial/store-spatial-index.d.ts +3 -1
- package/dist/store/spatial/store-spatial-index.js +9 -3
- package/dist/store/store.d.ts +66 -107
- package/dist/store/types.d.ts +1 -1
- package/dist/store/writable-layer.d.ts +1 -1
- package/dist/store/writable-layer.js +2 -2
- package/dist/table/builder.d.ts +83 -0
- package/dist/table/builder.js +381 -0
- package/dist/table/index.d.ts +37 -0
- package/dist/table/index.js +5 -0
- package/dist/table/packed-rtree.d.ts +1 -0
- package/dist/{display → table}/packed-rtree.js +1 -1
- package/dist/table/partition.d.ts +1 -0
- package/dist/{display → table}/partition.js +3 -3
- package/dist/table/prepare.d.ts +44 -0
- package/dist/table/prepare.js +136 -0
- package/dist/table/table.d.ts +1 -0
- package/dist/{display/columnar → table}/table.js +29 -25
- package/dist/{display/columnar → table}/types.d.ts +68 -72
- package/dist/table/types.js +3 -0
- package/dist/view/coordinator.js +4 -3
- package/dist/view/feature-companion.d.ts +13 -7
- package/dist/view/feature-companion.js +11 -3
- package/dist/view/globe-subdivision.js +3 -3
- package/dist/view/layer/attach.d.ts +1 -1
- package/dist/view/layer/attach.js +1 -1
- package/dist/view/layer/custom-layer.js +40 -11
- package/dist/view/layer/display-list.js +2 -1
- package/dist/view/layer/drape-planner.d.ts +2 -2
- package/dist/view/layer/frame-render.d.ts +3 -3
- package/dist/view/layer/frame-render.js +7 -2
- package/dist/view/layer/frame-state.d.ts +6 -6
- package/dist/view/layer/index.d.ts +2 -2
- package/dist/view/layer/index.js +1 -1
- package/dist/view/layer/render.d.ts +4 -4
- package/dist/view/layer/render.js +3 -8
- package/dist/view/layer/renderers.d.ts +2 -2
- package/dist/view/layer/renderers.js +1 -1
- package/dist/view/layer/slot-manager.d.ts +2 -2
- package/dist/view/layer/slot-manager.js +4 -4
- package/dist/view/layer/slots.d.ts +2 -2
- package/dist/view/layer/slots.js +1 -1
- package/dist/view/layer/store-retained-bbox.js +3 -2
- package/dist/view/layer/store-retained-classify.d.ts +5 -7
- package/dist/view/layer/store-retained-classify.js +19 -7
- package/dist/view/layer/store-retained-collect.js +8 -7
- package/dist/view/layer/store-retained-coord-patch.d.ts +0 -8
- package/dist/view/layer/store-retained-coord-patch.js +13 -4
- package/dist/view/layer/store-retained-immediate.d.ts +3 -3
- package/dist/view/layer/store-retained-immediate.js +3 -8
- package/dist/view/layer/store-retained-invalidation.d.ts +2 -2
- package/dist/view/layer/store-retained.d.ts +2 -2
- package/dist/view/layer/store-retained.js +1 -1
- package/dist/view/renderers/batch-manager.js +8 -7
- package/dist/view/renderers/drawer.js +21 -15
- package/dist/view/renderers/image.js +13 -39
- package/dist/view/renderers/line/line-types.d.ts +3 -3
- package/dist/view/renderers/line/sdf-line.js +3 -1
- package/dist/view/renderers/point/billboard-depth.js +1 -1
- package/dist/view/renderers/point/point-instance.js +1 -1
- package/dist/view/renderers/point/point-shape.js +2 -2
- package/dist/view/renderers/point/point-style.js +48 -4
- package/dist/view/renderers/polygon/batch.js +1 -2
- package/dist/view/renderers/polygon/fill.js +3 -1
- package/dist/view/renderers/polygon/sdf-polygon.js +2 -3
- package/dist/view/renderers/polygon/triangulator.d.ts +1 -1
- package/dist/view/renderers/stroke.js +3 -1
- package/dist/view/shaders/helpers.d.ts +2 -42
- package/dist/view/shaders/helpers.js +0 -6
- package/dist/view/shaders/projection.d.ts +15 -7
- package/dist/view/shaders/projection.js +23 -6
- package/dist/view/shaders/quad.d.ts +16 -12
- package/dist/view/shaders/quad.js +34 -13
- package/dist/view/style-rule.d.ts +5 -42
- package/dist/view/style-rule.js +20 -44
- package/dist/view/terrain/binding.d.ts +1 -0
- package/dist/view/terrain/binding.js +29 -0
- package/dist/view/terrain/context.d.ts +3 -4
- package/dist/view/terrain/context.js +4 -5
- package/dist/view/terrain/drape/geometry.js +1 -1
- package/dist/view/terrain/drape/pass.d.ts +1 -1
- package/dist/view/terrain/drape/pass.js +8 -7
- package/dist/view/terrain/polygon.d.ts +9 -5
- package/dist/view/terrain/polygon.js +16 -2
- package/dist/view/terrain/state.d.ts +1 -1
- package/dist/view/terrain/state.js +1 -1
- package/dist/view/terrain/tessellation.d.ts +2 -2
- package/dist/view/terrain/tessellation.js +1 -1
- package/dist/view/ui/auxiliary-handles.d.ts +6 -29
- package/dist/view/ui/bounds.js +8 -12
- package/dist/view/ui/handle-test.js +2 -2
- package/dist/view/ui/handle-thinning.js +17 -17
- package/dist/view/ui/handles.js +21 -13
- package/dist/view/ui/helper.d.ts +1 -1
- package/dist/view/ui/helper.js +1 -1
- package/dist/view/ui/index.d.ts +1 -1
- package/dist/view/ui/selection-scope.js +4 -2
- package/dist/view/ui/selection-ui/bounding-box.js +6 -6
- package/dist/view/ui/selection-ui/extension-registry.d.ts +31 -20
- package/dist/view/ui/selection-ui/extension-registry.js +70 -7
- package/dist/view/ui/selection-ui/index.d.ts +2 -2
- package/dist/view/ui/selection-ui/index.js +1 -1
- package/dist/view/ui/selection-ui/renderer.js +15 -38
- package/dist/view/ui/selection-ui/types.d.ts +17 -2
- package/dist/view/ui/selection-ui-drawer.d.ts +8 -0
- package/dist/view/ui/selection-ui-drawer.js +63 -2
- package/dist/view/ui/tentative.js +1 -1
- package/dist/webgl/index.d.ts +65 -0
- package/dist/webgl/index.js +62 -0
- package/package.json +20 -9
- package/dist/api/api.d.ts +0 -1259
- package/dist/api/api.js +0 -86
- package/dist/api/context.d.ts +0 -173
- package/dist/api/display-api.js +0 -23
- package/dist/api/event-api.d.ts +0 -13
- package/dist/api/event-api.js +0 -17
- package/dist/api/extension-api.d.ts +0 -46
- package/dist/api/extension-api.js +0 -85
- package/dist/api/feature-api.d.ts +0 -11
- package/dist/api/feature-api.js +0 -101
- package/dist/api/geometry/apply.d.ts +0 -51
- package/dist/api/geometry/boolean.d.ts +0 -28
- package/dist/api/geometry/boolean.js +0 -65
- package/dist/api/geometry/types.d.ts +0 -31
- package/dist/api/geometry-operations.d.ts +0 -162
- package/dist/api/geometry-operations.js +0 -94
- package/dist/api/group-api.d.ts +0 -10
- package/dist/api/group-api.js +0 -78
- package/dist/api/import-export/constants.d.ts +0 -29
- package/dist/api/import-export/constants.js +0 -40
- package/dist/api/import-export/file-name.d.ts +0 -10
- package/dist/api/import-export/file-name.js +0 -20
- package/dist/api/import-export/geojson-export.d.ts +0 -19
- package/dist/api/import-export/image-import.d.ts +0 -12
- package/dist/api/import-export/image-import.js +0 -53
- package/dist/api/import-export/index.d.ts +0 -9
- package/dist/api/import-export/index.js +0 -107
- package/dist/api/import-export/native-format.d.ts +0 -15
- package/dist/api/import-export/style-validation.d.ts +0 -27
- package/dist/api/import-export/style-validation.js +0 -49
- package/dist/api/import-export/types.d.ts +0 -26
- package/dist/api/index.d.ts +0 -15
- package/dist/api/index.js +0 -3
- package/dist/api/input-api.d.ts +0 -158
- package/dist/api/input-api.js +0 -144
- package/dist/api/instance-api.d.ts +0 -38
- package/dist/api/instance-api.js +0 -136
- package/dist/api/layer-api.d.ts +0 -12
- package/dist/api/layer-api.js +0 -62
- package/dist/api/selection-api.d.ts +0 -7
- package/dist/api/selection-api.js +0 -78
- package/dist/api/snapping-api.d.ts +0 -125
- package/dist/api/snapping-api.js +0 -50
- package/dist/api/topology-api.d.ts +0 -30
- package/dist/api/topology-api.js +0 -16
- package/dist/api/tracing-api.d.ts +0 -31
- package/dist/api/tracing-api.js +0 -16
- package/dist/dispatcher/hit-test/index.d.ts +0 -14
- package/dist/dispatcher/hit-test/index.js +0 -9
- package/dist/dispatcher/index.d.ts +0 -15
- package/dist/dispatcher/index.js +0 -3
- package/dist/display/columnar/index.d.ts +0 -12
- package/dist/display/columnar/index.js +0 -13
- package/dist/display/columnar/prepare.d.ts +0 -42
- package/dist/display/columnar/prepare.js +0 -116
- package/dist/display/index.d.ts +0 -13
- package/dist/display/types.js +0 -43
- package/dist/maplibre-gl-draw.d.ts +0 -47
- package/dist/modes/cursor.js +0 -72
- package/dist/modes/index.d.ts +0 -7
- package/dist/operations/index.d.ts +0 -9
- package/dist/operations/index.js +0 -3
- package/dist/plugins/index.d.ts +0 -10
- package/dist/plugins/mutation-hooks.d.ts +0 -28
- package/dist/plugins/mutation-hooks.js +0 -84
- package/dist/plugins/plugin-context.js +0 -367
- package/dist/plugins/plugin-manager.d.ts +0 -103
- package/dist/plugins/plugin-manager.js +0 -316
- package/dist/plugins/plugin.d.ts +0 -529
- package/dist/shared/config/index.d.ts +0 -17
- package/dist/shared/config/index.js +0 -8
- package/dist/shared/utils/index.d.ts +0 -15
- package/dist/shared/utils/index.js +0 -24
- package/dist/snapping/index.d.ts +0 -14
- package/dist/snapping/index.js +0 -4
- package/dist/store/change-merger.js +0 -102
- package/dist/store/event-bridge.js +0 -161
- package/dist/store/index.d.ts +0 -12
- package/dist/store/index.js +0 -4
- package/dist/view/index.d.ts +0 -47
- package/dist/view/index.js +0 -20
- /package/dist/api/{geometry/types.js → datasets.js} +0 -0
- /package/dist/api/{import-export/types.js → document.js} +0 -0
- /package/dist/{display/columnar/types.js → api/drawing.js} +0 -0
- /package/dist/{display/index.js → api/events.js} +0 -0
- /package/dist/{modes/index.js → api/extension/context.js} +0 -0
- /package/dist/{plugins/index.js → api/extension/feature-type.js} +0 -0
- /package/dist/{plugins/plugin.js → api/extension/mode.js} +0 -0
- /package/dist/api/{display-api.d.ts → impl/adapters.d.ts} +0 -0
- /package/dist/{display/columnar/source.d.ts → api/impl/contexts.d.ts} +0 -0
- /package/dist/{display/columnar/table.d.ts → api/impl/create-draw.d.ts} +0 -0
- /package/dist/{display/interaction.d.ts → api/impl/datasets.d.ts} +0 -0
- /package/dist/{display/manager.d.ts → api/impl/destroy-guard.d.ts} +0 -0
- /package/dist/{display/packed-rtree.d.ts → api/impl/document.d.ts} +0 -0
- /package/dist/{display/partition.d.ts → api/impl/drawing.d.ts} +0 -0
- /package/dist/{display/provider.d.ts → api/impl/engine.d.ts} +0 -0
- /package/dist/{display/source.d.ts → api/impl/events.d.ts} +0 -0
- /package/dist/{display/spatial.d.ts → api/impl/extension-host.d.ts} +0 -0
- /package/dist/{display/style.d.ts → api/impl/extensions.d.ts} +0 -0
- /package/dist/{display/triangulation.d.ts → api/impl/features.d.ts} +0 -0
- /package/dist/{modes/cursor.d.ts → api/impl/geometry/types.d.ts} +0 -0
- /package/dist/{plugins/plugin-context.d.ts → api/impl/hidden.d.ts} +0 -0
- /package/dist/api/{import-export → impl/import-export}/embedded-file.d.ts +0 -0
- /package/dist/api/{import-export → impl/import-export}/own-property.d.ts +0 -0
- /package/dist/api/{import-export → impl/import-export}/own-property.js +0 -0
- /package/dist/{store/change-merger.d.ts → api/impl/input.d.ts} +0 -0
- /package/dist/{store/event-bridge.d.ts → api/impl/layers.d.ts} +0 -0
- /package/dist/{display → dataset}/chunk-set.d.ts +0 -0
- /package/dist/{display → dataset}/chunk-set.js +0 -0
- /package/dist/{display → dataset}/dataset.d.ts +0 -0
- /package/dist/{display → dataset}/manager.js +0 -0
- /package/dist/{display → dataset}/provider.js +0 -0
- /package/dist/{display → dataset}/selection.d.ts +0 -0
- /package/dist/{display → dataset}/selection.js +0 -0
|
@@ -67,7 +67,7 @@ function toStoredCopy(event, reference) {
|
|
|
67
67
|
* @internal
|
|
68
68
|
*/
|
|
69
69
|
export function createInputRouter(deps) {
|
|
70
|
-
const { normalizer, modeManager, context, map,
|
|
70
|
+
const { normalizer, modeManager, context, map, displayInteractions, notifyMapClick, trackClick, snapService, extensionInput, } = deps;
|
|
71
71
|
let boundHandleEvent = null;
|
|
72
72
|
/**
|
|
73
73
|
* Whether input originating from the pointer is currently held
|
|
@@ -126,68 +126,140 @@ export function createInputRouter(deps) {
|
|
|
126
126
|
*/
|
|
127
127
|
function applySnap(event, inputType) {
|
|
128
128
|
if (!snapService || event.snap === false)
|
|
129
|
-
return event;
|
|
130
|
-
if (modeManager.getHandler()?.isSnapEnabledFor?.(inputType) === false)
|
|
131
|
-
return event;
|
|
129
|
+
return { event, result: null };
|
|
130
|
+
if (modeManager.getHandler()?.isSnapEnabledFor?.(inputType) === false) {
|
|
131
|
+
return { event, result: null };
|
|
132
|
+
}
|
|
132
133
|
const result = snapService.resolve(event.lngLat, event.point, buildSnapContext(event.modifiers));
|
|
133
134
|
if (result.lngLat.lng === event.lngLat.lng && result.lngLat.lat === event.lngLat.lat) {
|
|
134
|
-
return event;
|
|
135
|
+
return { event, result: result.target ? result : null };
|
|
136
|
+
}
|
|
137
|
+
return {
|
|
138
|
+
event: { ...event, lngLat: { lng: result.lngLat.lng, lat: result.lngLat.lat } },
|
|
139
|
+
result,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* What a consumed event stops besides the receivers after it: a consumed press does not
|
|
144
|
+
* reach the map (no pan starts) and a consumed double click does not zoom it
|
|
145
|
+
*/
|
|
146
|
+
function stopConsumed(event) {
|
|
147
|
+
if (event.type === 'mousedown') {
|
|
148
|
+
const original = event.originalEvent;
|
|
149
|
+
original.stopPropagation();
|
|
150
|
+
if (!('touches' in original))
|
|
151
|
+
original.preventDefault();
|
|
152
|
+
}
|
|
153
|
+
else if (event.type === 'dblclick') {
|
|
154
|
+
event.originalEvent.preventDefault();
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Hands the event to the plugins of the extensions, then to a mode written to the extension
|
|
159
|
+
* contract
|
|
160
|
+
*
|
|
161
|
+
* @returns 'consumed' when the event goes no further, 'mode' when a mode of the contract
|
|
162
|
+
* received it, 'engine' when the mode is a mode of the engine the router calls
|
|
163
|
+
*/
|
|
164
|
+
function toExtensions(handler, event, snapped, snap) {
|
|
165
|
+
if (!extensionInput)
|
|
166
|
+
return 'engine';
|
|
167
|
+
if (extensionInput.toPlugins(event, snapped, snap)) {
|
|
168
|
+
stopConsumed(event);
|
|
169
|
+
return 'consumed';
|
|
170
|
+
}
|
|
171
|
+
const consumed = extensionInput.toMode(handler, event, snapped, snap);
|
|
172
|
+
if (consumed === undefined)
|
|
173
|
+
return 'engine';
|
|
174
|
+
if (consumed) {
|
|
175
|
+
stopConsumed(event);
|
|
176
|
+
return 'consumed';
|
|
177
|
+
}
|
|
178
|
+
return 'mode';
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* A click: to the extensions, the mode, the datasets and the map.clicked notification
|
|
182
|
+
*
|
|
183
|
+
* @returns Whether a receiver took it
|
|
184
|
+
*/
|
|
185
|
+
function handleClickEvent(handler, event) {
|
|
186
|
+
// Deliver to the mode with the snapped coordinates (if nothing snapped,
|
|
187
|
+
// the original event is used unchanged)
|
|
188
|
+
const { event: snapped, result } = applySnap(event, 'click');
|
|
189
|
+
const route = toExtensions(handler, event, snapped, result);
|
|
190
|
+
if (route === 'consumed')
|
|
191
|
+
return true;
|
|
192
|
+
if (route === 'engine')
|
|
193
|
+
handleClick(handler, snapped);
|
|
194
|
+
// Delivery to datasets happens only in select mode. A click
|
|
195
|
+
// in a drawing mode places a vertex, and delivering that same click as a
|
|
196
|
+
// click on the data as well would make the host application's "click to
|
|
197
|
+
// select" fire by mistake while drawing (for example, starting to draw a
|
|
198
|
+
// circle on top of a huge polygon of data would cover the whole screen with
|
|
199
|
+
// the selection highlight). The rule that a hit in the Store always wins is
|
|
200
|
+
// decided on the interception side, so the selection behavior of the mode
|
|
201
|
+
// during select is unaffected.
|
|
202
|
+
if (handler.modeName === 'select')
|
|
203
|
+
displayInteractions?.handleClick(snapped);
|
|
204
|
+
// Emit the click of select mode as a single stream regardless of whether
|
|
205
|
+
// anything was hit (draw.map.click). display.click is designed not to fire
|
|
206
|
+
// when a feature in the Store is hit, so a host application that needs "a
|
|
207
|
+
// click anywhere on the map" (placing a comment pin, for instance) watches
|
|
208
|
+
// this one. The coordinates are copied from the raw event before snapping.
|
|
209
|
+
if (handler.modeName === 'select') {
|
|
210
|
+
notifyMapClick?.({
|
|
211
|
+
lngLat: [event.lngLat.lng, event.lngLat.lat],
|
|
212
|
+
point: { x: event.point.x, y: event.point.y },
|
|
213
|
+
});
|
|
135
214
|
}
|
|
136
|
-
return
|
|
215
|
+
return route === 'engine' && handler.onClick !== undefined;
|
|
137
216
|
}
|
|
217
|
+
/**
|
|
218
|
+
* Hands an event to the extensions and the mode
|
|
219
|
+
*
|
|
220
|
+
* @returns Whether a receiver took it: a plugin or a mode of the contract consumed it, or
|
|
221
|
+
* the mode of the engine has a receiver for it
|
|
222
|
+
*/
|
|
138
223
|
function handleEvent(input, options = {}) {
|
|
139
224
|
// Only input originating from the real pointer is stopped while held.
|
|
140
225
|
// Synthetic input (dispatch) is let through
|
|
141
226
|
if (pointerHeld && !options.synthetic && HELD_EVENT_TYPES.has(input.type))
|
|
142
|
-
return;
|
|
227
|
+
return false;
|
|
143
228
|
const handler = modeManager.getHandler();
|
|
144
229
|
if (!handler)
|
|
145
|
-
return;
|
|
230
|
+
return false;
|
|
146
231
|
// The single place where the longitude of the input is decided (see toStoredCopy)
|
|
147
232
|
const event = toStoredCopy(input, firstTentativeCoordinate(context.store.getTentative()));
|
|
148
233
|
switch (event.type) {
|
|
149
|
-
case 'click':
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
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
|
-
});
|
|
234
|
+
case 'click':
|
|
235
|
+
trackClick?.([event.lngLat.lng, event.lngLat.lat]);
|
|
236
|
+
try {
|
|
237
|
+
return handleClickEvent(handler, event);
|
|
174
238
|
}
|
|
175
|
-
|
|
239
|
+
finally {
|
|
240
|
+
trackClick?.(null);
|
|
241
|
+
}
|
|
242
|
+
case 'dblclick': {
|
|
243
|
+
const taken = engineOr(toExtensions(handler, event, event, null), handler.onDoubleClick, () => handler.onDoubleClick?.(event));
|
|
244
|
+
// A double click never zooms the map while a drawing mode is active, whether or not
|
|
245
|
+
// anything took it: its clicks were meant for the drawing
|
|
246
|
+
if (handler.writesFeatures === true)
|
|
247
|
+
event.originalEvent.preventDefault();
|
|
248
|
+
return taken;
|
|
176
249
|
}
|
|
177
|
-
case 'dblclick':
|
|
178
|
-
handler.onDoubleClick?.(event);
|
|
179
|
-
break;
|
|
180
250
|
case 'mousedown':
|
|
181
|
-
handleMouseDown(handler, event);
|
|
182
|
-
break;
|
|
251
|
+
return engineOr(toExtensions(handler, event, event, null), handler.onMouseDown, () => handleMouseDown(handler, event));
|
|
183
252
|
case 'mouseup':
|
|
184
|
-
handler.onMouseUp?.(event);
|
|
185
|
-
break;
|
|
253
|
+
return engineOr(toExtensions(handler, event, event, null), handler.onMouseUp, () => handler.onMouseUp?.(event));
|
|
186
254
|
case 'mousemove': {
|
|
187
|
-
const snapped = applySnap(event, 'mousemove');
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
255
|
+
const { event: snapped, result } = applySnap(event, 'mousemove');
|
|
256
|
+
if (extensionInput?.toPlugins(event, snapped, result))
|
|
257
|
+
return true;
|
|
258
|
+
const consumed = extensionInput?.toMode(handler, event, snapped, result);
|
|
259
|
+
if (consumed === true)
|
|
260
|
+
return true;
|
|
261
|
+
if (consumed === undefined)
|
|
262
|
+
handler.onMouseMove?.(snapped);
|
|
191
263
|
// The hover of datasets is likewise limited to select mode,
|
|
192
264
|
// by the same rule as click. When switching to a drawing mode, a hover that
|
|
193
265
|
// is still held is discarded (so that it does not fire on the stale target
|
|
@@ -198,53 +270,64 @@ export function createInputRouter(deps) {
|
|
|
198
270
|
else {
|
|
199
271
|
displayInteractions?.reset();
|
|
200
272
|
}
|
|
201
|
-
|
|
273
|
+
return consumed === undefined && handler.onMouseMove !== undefined;
|
|
202
274
|
}
|
|
203
275
|
case 'contextmenu':
|
|
204
276
|
// contextmenu currently has no special handling
|
|
205
|
-
|
|
277
|
+
return false;
|
|
206
278
|
// The start and end of a drag also go through snapping. This is to keep
|
|
207
279
|
// "start drawing exactly at a corner of a boundary and end at a corner" for
|
|
208
280
|
// drag-driven drawing (freehand). The drag operations of select mode use
|
|
209
281
|
// dragStartLngLat (the press position from before the threshold was exceeded)
|
|
210
282
|
// as their start position, so they are unaffected by the replacement here.
|
|
211
283
|
case 'dragstart': {
|
|
212
|
-
const snapped = applySnap(event, 'dragstart');
|
|
213
|
-
handler.onDragStart?.(snapped);
|
|
214
|
-
break;
|
|
284
|
+
const { event: snapped, result } = applySnap(event, 'dragstart');
|
|
285
|
+
return engineOr(toExtensions(handler, event, snapped, result), handler.onDragStart, () => handler.onDragStart?.(snapped));
|
|
215
286
|
}
|
|
216
287
|
case 'dragmove': {
|
|
217
|
-
const snapped = applySnap(event, 'dragmove');
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
288
|
+
const { event: snapped, result } = applySnap(event, 'dragmove');
|
|
289
|
+
if (extensionInput?.toPlugins(event, snapped, result))
|
|
290
|
+
return true;
|
|
291
|
+
const consumed = extensionInput?.toMode(handler, event, snapped, result);
|
|
292
|
+
if (consumed !== undefined)
|
|
293
|
+
return consumed;
|
|
221
294
|
handler.onDragMove?.(snapped);
|
|
222
|
-
|
|
295
|
+
return handler.onDragMove !== undefined;
|
|
223
296
|
}
|
|
224
297
|
case 'dragend': {
|
|
225
|
-
const snapped = applySnap(event, 'dragend');
|
|
226
|
-
handler.onDragEnd?.(snapped);
|
|
227
|
-
break;
|
|
298
|
+
const { event: snapped, result } = applySnap(event, 'dragend');
|
|
299
|
+
return engineOr(toExtensions(handler, event, snapped, result), handler.onDragEnd, () => handler.onDragEnd?.(snapped));
|
|
228
300
|
}
|
|
229
301
|
// A press ended without a release (a second finger, or the browser cancelled the
|
|
230
302
|
// touch). No coordinates are decided, so it does not go through snapping, and it
|
|
231
303
|
// is never held: the mode must always get the chance to abort the press.
|
|
232
304
|
case 'dragcancel':
|
|
233
|
-
handler.onDragCancel?.(event);
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
}
|
|
305
|
+
return engineOr(toExtensions(handler, event, event, null), handler.onDragCancel, () => handler.onDragCancel?.(event));
|
|
306
|
+
case 'keydown': {
|
|
307
|
+
if (extensionInput?.toPlugins(event, event, null))
|
|
308
|
+
return true;
|
|
309
|
+
const consumed = extensionInput?.toMode(handler, event, event, null);
|
|
310
|
+
if (consumed !== undefined)
|
|
311
|
+
return consumed;
|
|
241
312
|
handler.onKeyDown?.(event);
|
|
242
|
-
|
|
313
|
+
return handler.onKeyDown !== undefined;
|
|
314
|
+
}
|
|
243
315
|
case 'keyup':
|
|
244
|
-
handler.onKeyUp?.(event);
|
|
245
|
-
break;
|
|
316
|
+
return engineOr(toExtensions(handler, event, event, null), handler.onKeyUp, () => handler.onKeyUp?.(event));
|
|
246
317
|
}
|
|
247
318
|
}
|
|
319
|
+
/**
|
|
320
|
+
* Runs the receiver of the mode of the engine when the route leads to it
|
|
321
|
+
*
|
|
322
|
+
* @param receiver - The receiver of the mode of the engine, to tell whether it has one
|
|
323
|
+
* @returns Whether a receiver took the event
|
|
324
|
+
*/
|
|
325
|
+
function engineOr(route, receiver, run) {
|
|
326
|
+
if (route !== 'engine')
|
|
327
|
+
return route === 'consumed';
|
|
328
|
+
run();
|
|
329
|
+
return receiver !== undefined;
|
|
330
|
+
}
|
|
248
331
|
function handleClick(handler, event) {
|
|
249
332
|
handler.onClick?.(event);
|
|
250
333
|
}
|
|
@@ -77,7 +77,7 @@ export function createInputNormalizer(map, options = {}) {
|
|
|
77
77
|
const canvas = map.getCanvas();
|
|
78
78
|
const listeners = new Set();
|
|
79
79
|
const opts = { ...DEFAULT_OPTIONS, ...options };
|
|
80
|
-
|
|
80
|
+
let profiles = createProfiles(opts);
|
|
81
81
|
// State management
|
|
82
82
|
let press = null;
|
|
83
83
|
/**
|
|
@@ -509,5 +509,9 @@ export function createInputNormalizer(map, options = {}) {
|
|
|
509
509
|
function off(handler) {
|
|
510
510
|
listeners.delete(handler);
|
|
511
511
|
}
|
|
512
|
-
|
|
512
|
+
const setDragThreshold = (px) => {
|
|
513
|
+
opts.dragThreshold = px;
|
|
514
|
+
profiles = createProfiles(opts);
|
|
515
|
+
};
|
|
516
|
+
return { attach, detach, on, off, setDragThreshold };
|
|
513
517
|
}
|
|
@@ -22,7 +22,7 @@ export interface ModifierKeys {
|
|
|
22
22
|
* `'touch'` is one finger of a touch screen, `'pen'` a stylus (reported either through
|
|
23
23
|
* the touch events, as on iPadOS, or through the mouse events the browser emits for
|
|
24
24
|
* it), and `'mouse'` everything else. Input with no `pointerType` (synthetic input
|
|
25
|
-
*
|
|
25
|
+
* of the tests, for example) is treated as `'mouse'`.
|
|
26
26
|
*/
|
|
27
27
|
export type PointerType = 'mouse' | 'touch' | 'pen';
|
|
28
28
|
/**
|
|
@@ -68,6 +68,11 @@ export interface MouseNormalizedEvent {
|
|
|
68
68
|
* which synthetic input chooses whether to go through snapping.
|
|
69
69
|
*/
|
|
70
70
|
snap?: boolean;
|
|
71
|
+
/**
|
|
72
|
+
* Whether the event was made from code (`draw.drawing`) at an exact position, not by the
|
|
73
|
+
* pointer; the modes apply no click tolerance to it (`DrawPointerEvent.programmatic`)
|
|
74
|
+
*/
|
|
75
|
+
programmatic?: boolean;
|
|
71
76
|
}
|
|
72
77
|
/**
|
|
73
78
|
* A normalized drag event: the start, each move, the end or the cancellation of a press
|
|
@@ -1,182 +1 @@
|
|
|
1
|
-
|
|
2
|
-
* The feature handler contract of an extension
|
|
3
|
-
*
|
|
4
|
-
* The shape an extension implements to add a custom feature type: its renderer, its hit
|
|
5
|
-
* testing, its box selection, its bounding boxes, its resize and its snapping candidates, all
|
|
6
|
-
* registered at once with `registerFeatureHandler`. It is types only and sits low in the layer
|
|
7
|
-
* order, so the view, snapping and operations layers read it without reaching up into api.
|
|
8
|
-
*/
|
|
9
|
-
import type { BoxSelectionStrategy } from '../dispatcher/hit-test/box-strategy.js';
|
|
10
|
-
import type { HitTestStrategy } from '../dispatcher/hit-test/strategies/index.js';
|
|
11
|
-
import type { ResizeState } from '../operations/resize.js';
|
|
12
|
-
import type { HandleType } from '../shared/config/constants.js';
|
|
13
|
-
import type { BoundingBox, Coordinate, Feature } from '../shared/types/model.js';
|
|
14
|
-
import type { BoundingBoxCoords } from '../shared/types/selection-box.js';
|
|
15
|
-
import type { SnapCandidate, SnapProviderContext } from '../snapping/types.js';
|
|
16
|
-
import type { HandleInfo } from '../view/ui/handles.js';
|
|
17
|
-
import type { PointFrameExtent } from '../view/ui/selection-ui/index.js';
|
|
18
|
-
import type { CustomFeatureRenderer } from './renderers.js';
|
|
19
|
-
/**
|
|
20
|
-
* Custom resize result
|
|
21
|
-
*
|
|
22
|
-
* The result of the resize computation for a custom feature.
|
|
23
|
-
* Used when processing different from the standard resize (changing scale) is needed.
|
|
24
|
-
*/
|
|
25
|
-
export interface CustomResizeResult {
|
|
26
|
-
/** The new coordinates */
|
|
27
|
-
coordinates: Coordinate;
|
|
28
|
-
/** The new width (in pixels, optional) */
|
|
29
|
-
width?: number;
|
|
30
|
-
/** The new height (in pixels, optional) */
|
|
31
|
-
height?: number;
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* The type of a custom resize computation function
|
|
35
|
-
*/
|
|
36
|
-
export type CustomResizeCalculator = (handle: HandleType, state: ResizeState, currentLngLat: {
|
|
37
|
-
lng: number;
|
|
38
|
-
lat: number;
|
|
39
|
-
}, feature: Feature) => CustomResizeResult | null;
|
|
40
|
-
/**
|
|
41
|
-
* A custom feature type: how its features are drawn, hit, selected, resized and snapped to
|
|
42
|
-
*
|
|
43
|
-
* Register it with `draw.registerFeatureHandler(handler)`, usually from `onInstall` of a
|
|
44
|
-
* {@link Plugin}. The registration belongs to that draw instance, and the returned function
|
|
45
|
-
* removes it. Features of the type are ordinary features in the Store (`type` is the name of
|
|
46
|
-
* the handler), so they are saved, exported, grouped and stacked like the built-in types;
|
|
47
|
-
* GeoJSON export writes the type in `maplibre-gl-draw:featureType` so that it comes back.
|
|
48
|
-
*
|
|
49
|
-
* `type`, `renderer` and `hitTest` are required. The rest have fallbacks: box selection and
|
|
50
|
-
* the bounding box use the coordinates, and without `getSelectionBoundingBox` no selection UI
|
|
51
|
-
* is drawn.
|
|
52
|
-
*
|
|
53
|
-
* @example
|
|
54
|
-
* ```ts
|
|
55
|
-
* import type { CustomFeatureHandler, Feature } from '@sakuzu/maplibre-gl-draw';
|
|
56
|
-
*
|
|
57
|
-
* // A "marker" type: one coordinate, drawn as a square, hit within the tolerance
|
|
58
|
-
* const distanceTo = (feature: Feature, [lng, lat]: [number, number]) => {
|
|
59
|
-
* const [x, y] = feature.coordinates as [number, number];
|
|
60
|
-
* return Math.hypot(x - lng, y - lat);
|
|
61
|
-
* };
|
|
62
|
-
*
|
|
63
|
-
* const markerHandler: CustomFeatureHandler = {
|
|
64
|
-
* type: 'marker',
|
|
65
|
-
* renderer: markerRenderer, // see CustomFeatureRenderer
|
|
66
|
-
* hitTest: {
|
|
67
|
-
* geometryType: 'marker',
|
|
68
|
-
* test: (feature, coordinate, tolerance) => distanceTo(feature, coordinate) <= tolerance,
|
|
69
|
-
* distance: (feature, coordinate) => distanceTo(feature, coordinate),
|
|
70
|
-
* },
|
|
71
|
-
* };
|
|
72
|
-
*
|
|
73
|
-
* const unregister = draw.registerFeatureHandler(markerHandler);
|
|
74
|
-
* draw.addFeature({ type: 'marker', coordinates: [139.767, 35.681] });
|
|
75
|
-
* ```
|
|
76
|
-
*/
|
|
77
|
-
export interface CustomFeatureHandler {
|
|
78
|
-
/** The feature type name */
|
|
79
|
-
readonly type: string;
|
|
80
|
-
/** The custom renderer */
|
|
81
|
-
readonly renderer: CustomFeatureRenderer;
|
|
82
|
-
/** The custom hit testing strategy */
|
|
83
|
-
readonly hitTest: HitTestStrategy;
|
|
84
|
-
/** The custom box selection strategy (when omitted, a coordinate-based fallback is used) */
|
|
85
|
-
readonly boxSelection?: BoxSelectionStrategy;
|
|
86
|
-
/**
|
|
87
|
-
* The resize strategy (applied when computeCustomResize returns null)
|
|
88
|
-
* - 'scale': changes the scale property (as an Image does)
|
|
89
|
-
* - 'coordinates': changes the coordinates directly (the same as Polygon and LineString)
|
|
90
|
-
* - when omitted: a generic check (decided by the presence of the scale property)
|
|
91
|
-
*/
|
|
92
|
-
readonly resizeStrategy?: 'scale' | 'coordinates';
|
|
93
|
-
/**
|
|
94
|
-
* Bounding box computation
|
|
95
|
-
*
|
|
96
|
-
* Used for viewport filtering in SpatialIndex.
|
|
97
|
-
* When omitted, a simple bounding box is computed from the coordinates.
|
|
98
|
-
*
|
|
99
|
-
* @param feature The target feature
|
|
100
|
-
* @param tileSize The tile size (512 by default)
|
|
101
|
-
*/
|
|
102
|
-
getBoundingBox?(feature: Feature, tileSize: number): BoundingBox;
|
|
103
|
-
/**
|
|
104
|
-
* The additional reach for narrowing down candidates (in CSS pixels)
|
|
105
|
-
*
|
|
106
|
-
* The first stage of hit testing narrows down candidates with a radius equivalent to
|
|
107
|
-
* clickTolerance, so when the hitTest strategy of this type treats a wider area as a hit
|
|
108
|
-
* (icons and the like), the candidate is dropped before the precise test is reached.
|
|
109
|
-
* Registering "how far from the center a hit can occur" here widens the candidate search
|
|
110
|
-
* radius by that much.
|
|
111
|
-
*
|
|
112
|
-
* The test itself is still decided by the hitTest strategy as before (only the number of
|
|
113
|
-
* candidates increases slightly). A value that changes with zoom or with settings is
|
|
114
|
-
* registered as a function (it is evaluated on every query).
|
|
115
|
-
*/
|
|
116
|
-
readonly candidateReachPx?: number | (() => number);
|
|
117
|
-
/**
|
|
118
|
-
* The half width and half height of the selection box of a zero-area point (in CSS pixels)
|
|
119
|
-
*
|
|
120
|
-
* A point keeps its zero area and is treated with the "point appearance" (box only, no resize
|
|
121
|
-
* or rotation handles, move inside the box). This function only decides the dimensions of that
|
|
122
|
-
* box (the special treatment of zero area itself does not change).
|
|
123
|
-
*
|
|
124
|
-
* When it is omitted, or returns null, the default 12px square is used.
|
|
125
|
-
*
|
|
126
|
-
* @param feature The target feature
|
|
127
|
-
*/
|
|
128
|
-
getPointFrameExtent?(feature: Feature): PointFrameExtent | null;
|
|
129
|
-
/**
|
|
130
|
-
* Bounding box computation for the selection UI
|
|
131
|
-
*
|
|
132
|
-
* Used for the visual feedback of the selected state (bounding box, handles).
|
|
133
|
-
* Returns an OBB (Oriented Bounding Box) that takes rotation into account.
|
|
134
|
-
* When omitted, no selection UI is drawn.
|
|
135
|
-
*
|
|
136
|
-
* @param feature The target feature
|
|
137
|
-
* @param tileSize The tile size (512 by default)
|
|
138
|
-
*/
|
|
139
|
-
getSelectionBoundingBox?(feature: Feature, tileSize: number): BoundingBoxCoords;
|
|
140
|
-
/**
|
|
141
|
-
* Returns additional resize handles
|
|
142
|
-
*
|
|
143
|
-
* Returns the handles to display in addition to the standard four corner handles.
|
|
144
|
-
* When omitted, only the four corner handles are shown.
|
|
145
|
-
* Called only for a single selection.
|
|
146
|
-
*
|
|
147
|
-
* @param feature The target feature
|
|
148
|
-
* @param bbox The bounding box for the selection UI
|
|
149
|
-
*/
|
|
150
|
-
getAdditionalResizeHandles?(feature: Feature, bbox: BoundingBoxCoords): HandleInfo[];
|
|
151
|
-
/**
|
|
152
|
-
* Custom resize computation
|
|
153
|
-
*
|
|
154
|
-
* Provides custom resize logic such as edge-midpoint handles.
|
|
155
|
-
* Returning null applies the standard resize (changing scale).
|
|
156
|
-
*
|
|
157
|
-
* @param handle The type of the handle being operated
|
|
158
|
-
* @param state The state of the resize operation
|
|
159
|
-
* @param currentLngLat The current mouse coordinate
|
|
160
|
-
* @param feature The target feature
|
|
161
|
-
*/
|
|
162
|
-
computeCustomResize?(handle: HandleType, state: ResizeState, currentLngLat: {
|
|
163
|
-
lng: number;
|
|
164
|
-
lat: number;
|
|
165
|
-
}, feature: Feature): CustomResizeResult | null;
|
|
166
|
-
/**
|
|
167
|
-
* Returns the snapping candidates
|
|
168
|
-
*
|
|
169
|
-
* An extension point that lets a custom type provide its own vertices and edges as snapping
|
|
170
|
-
* targets. The built-in vertex provider calls this when there is a registration for the type
|
|
171
|
-
* of the target feature (when it is called, the standard enumeration of the vertices and edges
|
|
172
|
-
* of that feature is not performed).
|
|
173
|
-
*
|
|
174
|
-
* The returned candidates may be either point candidates that have a coordinate
|
|
175
|
-
* (kind: 'vertex' and the like) or segment candidates that have two endpoints (kind: 'edge').
|
|
176
|
-
* The nearest point on a segment candidate is computed by SnapService.
|
|
177
|
-
*
|
|
178
|
-
* @param feature The target feature
|
|
179
|
-
* @param ctx The snapping context (includes the cursor position, the tolerance and exclusions)
|
|
180
|
-
*/
|
|
181
|
-
getSnapTargets?(feature: Feature, ctx: SnapProviderContext): SnapCandidate[];
|
|
182
|
-
}
|
|
1
|
+
export {};
|
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The contracts
|
|
3
|
-
*
|
|
4
|
-
* The types a plugin, a custom feature type or an overlay implements to plug into the
|
|
5
|
-
* extension points of a draw instance. The registration itself is on the instance
|
|
6
|
-
* (`registerFeatureHandler`, `addOverlayRenderer` and so on).
|
|
2
|
+
* The contracts of the engine for the feature types that are not built in and for the
|
|
3
|
+
* overlays. The extension contract of `api/extension/` is installed into them.
|
|
7
4
|
*/
|
|
8
|
-
export type {
|
|
9
|
-
export type {
|
|
5
|
+
export type { FeatureTypeHandler, TypeResizeCalculator, TypeResizeResult, } from './feature-handler.js';
|
|
6
|
+
export type { EngineOverlayRenderer, FeatureTypeRenderer, FrameDrawContext, LayeredOverlayRenderer, } from './renderers.js';
|