@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
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The contexts an extension works through
|
|
3
|
+
*
|
|
4
|
+
* Each kind of extension receives one narrow context with only what that kind needs. Every
|
|
5
|
+
* type a context holds is part of the public API and follows semver.
|
|
6
|
+
*/
|
|
7
|
+
import type { Position } from 'geojson';
|
|
8
|
+
import type { BBox } from '../../geometry/types.js';
|
|
9
|
+
import type { DatasetRow } from '../datasets.js';
|
|
10
|
+
import type { Draw } from '../draw.js';
|
|
11
|
+
import type { DrawingResource } from '../drawing.js';
|
|
12
|
+
import type { DrawEvents, ScreenPoint } from '../events.js';
|
|
13
|
+
import type { ExtensionsCollections } from '../extensions.js';
|
|
14
|
+
import type { Feature, FeatureInput, FeatureType, Layer } from '../model.js';
|
|
15
|
+
import type { SelectionStyleOptions } from '../options.js';
|
|
16
|
+
import type { Mode, SnapResult } from '../state.js';
|
|
17
|
+
import type { Hit } from './provider.js';
|
|
18
|
+
import type { StoreView } from './store.js';
|
|
19
|
+
/** The positions and the heights on the terrain, for placing things on it. */
|
|
20
|
+
export interface TerrainAnchors {
|
|
21
|
+
/**
|
|
22
|
+
* The point on the screen of a position lifted to the ground.
|
|
23
|
+
*
|
|
24
|
+
* @returns The point, or `null` when the terrain is off or not ready
|
|
25
|
+
*/
|
|
26
|
+
project(lngLat: Position): ScreenPoint | null;
|
|
27
|
+
/**
|
|
28
|
+
* The height of the ground at a position.
|
|
29
|
+
*
|
|
30
|
+
* @returns The height in meters; 0 when the terrain is off
|
|
31
|
+
*/
|
|
32
|
+
elevation(lngLat: Position): number;
|
|
33
|
+
/**
|
|
34
|
+
* The opacity for a mark at a position: lower when the terrain hides it from the camera.
|
|
35
|
+
*
|
|
36
|
+
* @returns A value from 0 to 1; 1 when the terrain is off
|
|
37
|
+
*/
|
|
38
|
+
ghostOpacity(lngLat: Position): number;
|
|
39
|
+
/** A number that changes whenever the heights `elevation` returns may have changed. */
|
|
40
|
+
generation(): number;
|
|
41
|
+
}
|
|
42
|
+
/** The automatic names of new features, layers and groups. */
|
|
43
|
+
export interface NameGenerator {
|
|
44
|
+
/**
|
|
45
|
+
* The next name for a type.
|
|
46
|
+
*
|
|
47
|
+
* @returns The name, or `undefined` for a feature when automatic names are off
|
|
48
|
+
*/
|
|
49
|
+
next(type: FeatureType | 'Layer' | 'Group'): string | undefined;
|
|
50
|
+
}
|
|
51
|
+
/** The conversion between positions on the map and points on the screen. */
|
|
52
|
+
export interface ScreenContext {
|
|
53
|
+
/** The point on the screen of a position. */
|
|
54
|
+
project(lngLat: Position): ScreenPoint;
|
|
55
|
+
/** The position on the map of a point on the screen. */
|
|
56
|
+
unproject(point: ScreenPoint): Position;
|
|
57
|
+
/**
|
|
58
|
+
* The extent of a feature on the screen, in pixels; a feature off the screen still has
|
|
59
|
+
* one.
|
|
60
|
+
*
|
|
61
|
+
* @returns The corners of the extent, or `null` when the feature has nothing to draw
|
|
62
|
+
*/
|
|
63
|
+
bounds(feature: Feature): {
|
|
64
|
+
min: ScreenPoint;
|
|
65
|
+
max: ScreenPoint;
|
|
66
|
+
} | null;
|
|
67
|
+
/**
|
|
68
|
+
* The outline of the selection frame of a feature on the screen, in pixels, without the
|
|
69
|
+
* margin the frame is drawn with (`selectionStyle.boundingBox.margin`): its four corners in
|
|
70
|
+
* the order top left, top right, bottom right, bottom left of the shape as it stands
|
|
71
|
+
* unturned. It answers for every type: an image and any other turned shape give the turned
|
|
72
|
+
* corners, a line or an area the corners of its extent, a point the square its marker
|
|
73
|
+
* spans (its radius and its outline), and a custom type the corners of its `outline`, or of
|
|
74
|
+
* its `bounds` when it has none. A feature
|
|
75
|
+
* off the screen still has one. The engine draws the frame with every edge moved the margin
|
|
76
|
+
* outward from these corners.
|
|
77
|
+
*
|
|
78
|
+
* A custom type must not call it for its own features from its `outline` or `bounds`, which
|
|
79
|
+
* it calls.
|
|
80
|
+
*
|
|
81
|
+
* @returns The four corners, or an empty array when the feature has nothing to draw
|
|
82
|
+
*/
|
|
83
|
+
outline(feature: Feature): ScreenPoint[];
|
|
84
|
+
/** The zoom of the map */
|
|
85
|
+
readonly zoom: number;
|
|
86
|
+
/** The pixel ratio the drawing uses */
|
|
87
|
+
readonly pixelRatio: number;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* What every context of an extension has: the public API, the Store, the events, the
|
|
91
|
+
* terrain, the automatic names, the screen and a way to redraw, and the shape being drawn.
|
|
92
|
+
*/
|
|
93
|
+
export interface ExtensionContext {
|
|
94
|
+
/** The whole public API; an extension reads and writes the document through it */
|
|
95
|
+
readonly draw: Draw;
|
|
96
|
+
/** The Store, to read the document and the state and to subscribe to their changes */
|
|
97
|
+
readonly store: StoreView;
|
|
98
|
+
/**
|
|
99
|
+
* Subscribes to an event, with the same names as `draw.on`. The subscription ends by itself
|
|
100
|
+
* when the extension is removed.
|
|
101
|
+
*
|
|
102
|
+
* @returns The function that unsubscribes
|
|
103
|
+
*/
|
|
104
|
+
on<K extends keyof DrawEvents>(event: K, listener: (payload: DrawEvents[K]) => void): () => void;
|
|
105
|
+
/** Unsubscribes from an event. */
|
|
106
|
+
off<K extends keyof DrawEvents>(event: K, listener: (payload: DrawEvents[K]) => void): void;
|
|
107
|
+
/**
|
|
108
|
+
* Subscribes to the next occurrence of an event only.
|
|
109
|
+
*
|
|
110
|
+
* @returns The function that unsubscribes before it occurs
|
|
111
|
+
*/
|
|
112
|
+
once<K extends keyof DrawEvents>(event: K, listener: (payload: DrawEvents[K]) => void): () => void;
|
|
113
|
+
/** The positions and the heights on the terrain */
|
|
114
|
+
readonly terrain: TerrainAnchors;
|
|
115
|
+
/** The automatic names of new features, layers and groups */
|
|
116
|
+
readonly names: NameGenerator;
|
|
117
|
+
/** The conversion between the map and the screen */
|
|
118
|
+
readonly screen: ScreenContext;
|
|
119
|
+
/**
|
|
120
|
+
* Asks for the features to be drawn again.
|
|
121
|
+
*
|
|
122
|
+
* @param filter - Only the features of this type, or with these IDs; every feature when it
|
|
123
|
+
* is left out
|
|
124
|
+
*/
|
|
125
|
+
invalidate(filter?: {
|
|
126
|
+
type?: string;
|
|
127
|
+
ids?: string[];
|
|
128
|
+
}): void;
|
|
129
|
+
/**
|
|
130
|
+
* The shape the current drawing mode is drawing: the same object as `draw.drawing`, to place,
|
|
131
|
+
* finish, cancel, undo and redo its vertices
|
|
132
|
+
*/
|
|
133
|
+
readonly drawing: DrawingResource;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* The context of a plugin.
|
|
137
|
+
*/
|
|
138
|
+
export interface PluginContext extends ExtensionContext {
|
|
139
|
+
/**
|
|
140
|
+
* The same collections as `draw.extensions`. What a plugin adds through them is removed by
|
|
141
|
+
* itself when the plugin is removed.
|
|
142
|
+
*/
|
|
143
|
+
readonly extensions: ExtensionsCollections;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* The context of a mode.
|
|
147
|
+
*/
|
|
148
|
+
export interface ModeContext extends ExtensionContext {
|
|
149
|
+
/**
|
|
150
|
+
* Changes the mode.
|
|
151
|
+
*
|
|
152
|
+
* @returns False when the mode cannot be entered now
|
|
153
|
+
*/
|
|
154
|
+
setMode(mode: Mode): boolean;
|
|
155
|
+
/**
|
|
156
|
+
* The topmost feature or dataset row at a point on the screen.
|
|
157
|
+
*
|
|
158
|
+
* @param options - `tolerancePx` is how far from the point a hit may be, in pixels
|
|
159
|
+
* @returns What was hit, or `null`
|
|
160
|
+
*/
|
|
161
|
+
hitTest(point: ScreenPoint, options?: {
|
|
162
|
+
tolerancePx?: number;
|
|
163
|
+
}): Hit | null;
|
|
164
|
+
/** Where a point on the screen snaps to; its own position when nothing is snapped to. */
|
|
165
|
+
snap(point: ScreenPoint): SnapResult;
|
|
166
|
+
/**
|
|
167
|
+
* Creates a feature the way the built-in modes do: the writable layer, the ID, the
|
|
168
|
+
* automatic name and the reference zoom follow the same rules.
|
|
169
|
+
*
|
|
170
|
+
* @returns The new feature, or `null` when it is refused (read-only, a lock)
|
|
171
|
+
*/
|
|
172
|
+
commitFeature(input: FeatureInput): Feature | null;
|
|
173
|
+
/** Shows the shape being drawn before it is created. */
|
|
174
|
+
readonly preview: {
|
|
175
|
+
/**
|
|
176
|
+
* Shows this shape as the one being drawn.
|
|
177
|
+
*
|
|
178
|
+
* @param options - `confirmedVertices` is how many vertices from the start are placed:
|
|
179
|
+
* the line up to them is drawn solid and the rest, up to the pointer, dashed (every
|
|
180
|
+
* vertex when it is left out); `highlightVertex` is the index of a vertex drawn
|
|
181
|
+
* highlighted, such as the first vertex of an area the next click would close
|
|
182
|
+
*/
|
|
183
|
+
set(feature: FeatureInput, options?: {
|
|
184
|
+
confirmedVertices?: number;
|
|
185
|
+
highlightVertex?: number;
|
|
186
|
+
}): void;
|
|
187
|
+
/** Stops showing it */
|
|
188
|
+
clear(): void;
|
|
189
|
+
};
|
|
190
|
+
/** The cursor of the map. */
|
|
191
|
+
readonly cursor: {
|
|
192
|
+
/** Sets the cursor, as a CSS cursor value */
|
|
193
|
+
set(cursor: string): void;
|
|
194
|
+
/**
|
|
195
|
+
* Goes back to the cursor of the mode: the one it set in `onEnter`, or the cursor of the
|
|
196
|
+
* map when it set none there. The cursor the mode set is taken back when it is left.
|
|
197
|
+
*/
|
|
198
|
+
reset(): void;
|
|
199
|
+
};
|
|
200
|
+
/** The look of the selected features. */
|
|
201
|
+
readonly selectionStyle: Required<SelectionStyleOptions>;
|
|
202
|
+
/**
|
|
203
|
+
* The layer a new feature goes into: the active layer when it can be written (it exists,
|
|
204
|
+
* is visible, is not locked and not hidden on this client), otherwise the first layer that
|
|
205
|
+
* can.
|
|
206
|
+
*
|
|
207
|
+
* @returns The layer, or `null` when no layer can be written
|
|
208
|
+
*/
|
|
209
|
+
writableLayer(): Layer | null;
|
|
210
|
+
/**
|
|
211
|
+
* The rows of the datasets that a shape can trace along, within an extent. Empty when
|
|
212
|
+
* snapping to the datasets is off.
|
|
213
|
+
*
|
|
214
|
+
* @param bbox - The extent, as `[west, south, east, north]` in degrees
|
|
215
|
+
* @returns The rows, each with the ID of its dataset and its index there; the dataset finds
|
|
216
|
+
* a row by the ID of a snapping target with `draw.datasets.get(datasetId).findRow(id)`
|
|
217
|
+
*/
|
|
218
|
+
listTraceRows(bbox: BBox): {
|
|
219
|
+
datasetId: string;
|
|
220
|
+
rowIndex: number;
|
|
221
|
+
row: DatasetRow;
|
|
222
|
+
}[];
|
|
223
|
+
}
|
|
224
|
+
/** What a hit test of a custom feature type or a companion receives. */
|
|
225
|
+
export interface HitTestContext {
|
|
226
|
+
/** The point on the screen */
|
|
227
|
+
point: ScreenPoint;
|
|
228
|
+
/** The position on the map */
|
|
229
|
+
lngLat: Position;
|
|
230
|
+
/** How far from the point a hit may be, in pixels */
|
|
231
|
+
tolerancePx: number;
|
|
232
|
+
/** The conversion between the map and the screen */
|
|
233
|
+
screen: ScreenContext;
|
|
234
|
+
}
|
|
235
|
+
/** What a provider of snapping candidates receives. */
|
|
236
|
+
export interface SnapContext {
|
|
237
|
+
/** The point on the screen */
|
|
238
|
+
point: ScreenPoint;
|
|
239
|
+
/** The position on the map */
|
|
240
|
+
lngLat: Position;
|
|
241
|
+
/** How far from the point a candidate may be, in pixels */
|
|
242
|
+
tolerancePx: number;
|
|
243
|
+
/** The conversion between the map and the screen */
|
|
244
|
+
screen: ScreenContext;
|
|
245
|
+
/** The IDs of the features that must not be snapped to, such as the one being drawn */
|
|
246
|
+
excludeIds: ReadonlySet<string>;
|
|
247
|
+
}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Custom feature types: the one definition that says how a type is drawn, hit, selected and
|
|
3
|
+
* resized
|
|
4
|
+
*/
|
|
5
|
+
import type { Geometry, Position } from 'geojson';
|
|
6
|
+
import type { BBox } from '../../geometry/types.js';
|
|
7
|
+
import type { ScreenPoint } from '../events.js';
|
|
8
|
+
import type { Feature, FeaturePatch } from '../model.js';
|
|
9
|
+
import type { HitTestContext, ScreenContext, SnapContext } from './context.js';
|
|
10
|
+
import type { DrawPointerEvent } from './mode.js';
|
|
11
|
+
import type { Hit, SnapCandidate } from './provider.js';
|
|
12
|
+
import type { FeatureRenderer } from './render.js';
|
|
13
|
+
/** One handle on a selected feature. */
|
|
14
|
+
export interface Handle {
|
|
15
|
+
/** The ID of the handle, unique within the feature */
|
|
16
|
+
id: string;
|
|
17
|
+
/** The position of the handle */
|
|
18
|
+
position: Position;
|
|
19
|
+
/** The kind of handle, as its provider names it */
|
|
20
|
+
kind: string;
|
|
21
|
+
/** The CSS cursor over the handle */
|
|
22
|
+
cursor?: string;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* The definition of a custom feature type. Its handles and snapping candidates are written
|
|
26
|
+
* here; a provider is only for the types an extension does not define.
|
|
27
|
+
*/
|
|
28
|
+
export interface FeatureTypeDefinition {
|
|
29
|
+
/** The name of the type; it is registered under this name */
|
|
30
|
+
readonly type: string;
|
|
31
|
+
/** The kind of GeoJSON geometry the features of this type have; one kind per type */
|
|
32
|
+
readonly geometry: Geometry['type'];
|
|
33
|
+
/**
|
|
34
|
+
* How far beyond its geometry a feature of this type can be hit, in pixels, such as the
|
|
35
|
+
* half size of an icon drawn on a point. The candidates of a hit test are gathered this much
|
|
36
|
+
* farther out; 0 when it is left out.
|
|
37
|
+
*/
|
|
38
|
+
readonly hitPaddingPx?: number;
|
|
39
|
+
/** How the features of this type are drawn */
|
|
40
|
+
readonly renderer: FeatureRenderer;
|
|
41
|
+
/**
|
|
42
|
+
* Which features of the type the definition takes, for a definition that overrides a
|
|
43
|
+
* built-in type (`extensions.featureTypes.override`). A feature for which it returns false
|
|
44
|
+
* keeps the built-in type: its built-in drawing (drawn in batches with the other features),
|
|
45
|
+
* hit test, box selection, selection frame, handles, snapping candidates and extent. The
|
|
46
|
+
* others are drawn, hit and framed by this definition. Every feature of the type is taken
|
|
47
|
+
* when it is left out.
|
|
48
|
+
*
|
|
49
|
+
* It is asked again whenever a feature changes, so its answer must follow from the feature
|
|
50
|
+
* (its properties, its geometry, its style) and nothing outside it. It is ignored in a
|
|
51
|
+
* definition given to `add`: a custom type takes every feature of its type.
|
|
52
|
+
*/
|
|
53
|
+
appliesTo?(feature: Feature): boolean;
|
|
54
|
+
/**
|
|
55
|
+
* The extent of a feature on the map, `[west, south, east, north]` in degrees, for a type
|
|
56
|
+
* that draws beyond its geometry by a distance on the ground. The spatial index takes it:
|
|
57
|
+
* it gathers the candidates of a hit test and of a box selection, answers
|
|
58
|
+
* `features.list({ bbox })`, and decides which features are near enough to the view to be
|
|
59
|
+
* drawn. The extent of the geometry is used when it is left out, and when it returns an
|
|
60
|
+
* extent that is not four finite numbers from the west and south to the east and north.
|
|
61
|
+
*
|
|
62
|
+
* It is measured when a feature changes; call `invalidate({ type })` when it depends on
|
|
63
|
+
* something outside the document. A reach in pixels belongs in `hitPaddingPx`.
|
|
64
|
+
*/
|
|
65
|
+
bbox?(feature: Feature): BBox;
|
|
66
|
+
/**
|
|
67
|
+
* Hit tests a feature of this type; the geometry is hit tested when it is left out.
|
|
68
|
+
*
|
|
69
|
+
* @returns What was hit, or `null`
|
|
70
|
+
*/
|
|
71
|
+
hitTest?(feature: Feature, ctx: HitTestContext): Hit | null;
|
|
72
|
+
/**
|
|
73
|
+
* Whether a box selection takes a feature of this type.
|
|
74
|
+
*
|
|
75
|
+
* @param box - The corners of the box on the screen, in pixels
|
|
76
|
+
*/
|
|
77
|
+
boxSelect?(feature: Feature, box: {
|
|
78
|
+
min: ScreenPoint;
|
|
79
|
+
max: ScreenPoint;
|
|
80
|
+
}, ctx: HitTestContext): boolean;
|
|
81
|
+
/**
|
|
82
|
+
* The extent of the selection box of a feature on the screen, in pixels.
|
|
83
|
+
*
|
|
84
|
+
* @returns The corners of the extent, or `null` when the feature has nothing to draw
|
|
85
|
+
*/
|
|
86
|
+
bounds?(feature: Feature, ctx: ScreenContext): {
|
|
87
|
+
min: ScreenPoint;
|
|
88
|
+
max: ScreenPoint;
|
|
89
|
+
} | null;
|
|
90
|
+
/**
|
|
91
|
+
* The outline of the selection frame of a feature on the screen, in pixels, for a type whose
|
|
92
|
+
* shape turns: its four corners in the order top left, top right, bottom right, bottom left
|
|
93
|
+
* of the shape as it stands unturned, without the margin of the frame
|
|
94
|
+
* (`selectionStyle.boundingBox.margin`). The engine draws the selection frame along it when
|
|
95
|
+
* it is given, and from `bounds` otherwise, with every edge moved the margin outward. For a
|
|
96
|
+
* type of any geometry but `Point`, the resize and rotate handles sit on the corners of that
|
|
97
|
+
* frame too; a `Point` type keeps a frame with no such handles.
|
|
98
|
+
*
|
|
99
|
+
* @returns The four corners; anything else (or an empty array) gives the frame of `bounds`
|
|
100
|
+
*/
|
|
101
|
+
outline?(feature: Feature, ctx: ScreenContext): ScreenPoint[];
|
|
102
|
+
/**
|
|
103
|
+
* The handles that resize or reshape a selected feature. The engine draws them with the
|
|
104
|
+
* look of the vertex handles, hit tests them at the same size, and gives their drags to
|
|
105
|
+
* `onHandleDrag`.
|
|
106
|
+
*/
|
|
107
|
+
handles?(feature: Feature, ctx: ScreenContext): Handle[];
|
|
108
|
+
/**
|
|
109
|
+
* The change a drag of one of its handles makes.
|
|
110
|
+
*
|
|
111
|
+
* @returns The patch to apply to the feature, or `null` for no change
|
|
112
|
+
*/
|
|
113
|
+
onHandleDrag?(feature: Feature, handle: Handle, event: DrawPointerEvent): FeaturePatch | null;
|
|
114
|
+
/**
|
|
115
|
+
* A drag of one of its handles is about to start, before the first `onHandleDrag`.
|
|
116
|
+
*
|
|
117
|
+
* @returns False to refuse the drag; no `onHandleDrag` nor `onHandleDragEnd` follows then
|
|
118
|
+
*/
|
|
119
|
+
onHandleDragStart?(feature: Feature, handle: Handle, event: DrawPointerEvent): boolean;
|
|
120
|
+
/**
|
|
121
|
+
* A drag of one of its handles ended, after the last `onHandleDrag` and its patch. It is
|
|
122
|
+
* called once for every drag that started, also when the drag is cut short.
|
|
123
|
+
*
|
|
124
|
+
* @param feature - The feature as it is now, or `null` when it is gone
|
|
125
|
+
*/
|
|
126
|
+
onHandleDragEnd?(feature: Feature | null, handle: Handle, event: DrawPointerEvent): void;
|
|
127
|
+
/** The snapping candidates a feature of this type offers. */
|
|
128
|
+
snapCandidates?(feature: Feature, ctx: SnapContext): SnapCandidate[];
|
|
129
|
+
}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The input contract: the events a mode and a plugin receive, and the handler of a mode
|
|
3
|
+
*
|
|
4
|
+
* One rule holds for every input handler: returning true consumes the event, so that nothing
|
|
5
|
+
* after the handler receives it.
|
|
6
|
+
*/
|
|
7
|
+
import type { Position } from 'geojson';
|
|
8
|
+
import type { ScreenPoint } from '../events.js';
|
|
9
|
+
import type { SnapPreference, SnapResult } from '../state.js';
|
|
10
|
+
import type { ModeContext } from './context.js';
|
|
11
|
+
/** The modifier keys held during an input. */
|
|
12
|
+
export interface Modifiers {
|
|
13
|
+
/** Whether Shift was held */
|
|
14
|
+
shift: boolean;
|
|
15
|
+
/** Whether Control was held */
|
|
16
|
+
ctrl: boolean;
|
|
17
|
+
/** Whether Alt (Option on macOS) was held */
|
|
18
|
+
alt: boolean;
|
|
19
|
+
/** Whether Meta (Command on macOS) was held */
|
|
20
|
+
meta: boolean;
|
|
21
|
+
}
|
|
22
|
+
/** A pointer input on the map, as a mode and a plugin receive it. */
|
|
23
|
+
export interface DrawPointerEvent {
|
|
24
|
+
/** The point on the screen */
|
|
25
|
+
point: ScreenPoint;
|
|
26
|
+
/** The position on the map */
|
|
27
|
+
lngLat: Position;
|
|
28
|
+
/** Where the input snaps to; the position of the pointer when nothing is snapped to */
|
|
29
|
+
snapped: SnapResult;
|
|
30
|
+
/** The modifier keys held */
|
|
31
|
+
modifiers: Modifiers;
|
|
32
|
+
/** The kind of pointer */
|
|
33
|
+
pointerType: 'mouse' | 'touch' | 'pen';
|
|
34
|
+
/** The event of the browser */
|
|
35
|
+
original: PointerEvent;
|
|
36
|
+
/**
|
|
37
|
+
* True when the input was made from code by `draw.drawing` (`addVertex`, `moveTo`), not by
|
|
38
|
+
* the pointer. Its position is exact: a mode applies no click tolerance to it, so a vertex
|
|
39
|
+
* placed a few pixels from another is kept, and only one at exactly the same position is
|
|
40
|
+
* the same vertex. Left out for the input of the pointer.
|
|
41
|
+
*/
|
|
42
|
+
programmatic?: boolean;
|
|
43
|
+
}
|
|
44
|
+
/** A key input, as a mode and a plugin receive it. */
|
|
45
|
+
export interface DrawKeyEvent {
|
|
46
|
+
/** The key, as `KeyboardEvent.key` gives it */
|
|
47
|
+
key: string;
|
|
48
|
+
/** The modifier keys held */
|
|
49
|
+
modifiers: Modifiers;
|
|
50
|
+
/** The event of the browser */
|
|
51
|
+
original: KeyboardEvent;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* The receivers of the input; `Plugin.input` and `ModeHandler` take any of them. Returning
|
|
55
|
+
* true consumes the event, so that nothing after the receiver gets it.
|
|
56
|
+
*/
|
|
57
|
+
export interface InputHandlers {
|
|
58
|
+
/** A pointer was pressed */
|
|
59
|
+
onPointerDown(event: DrawPointerEvent): boolean | void;
|
|
60
|
+
/** The pointer moved without a drag */
|
|
61
|
+
onPointerMove(event: DrawPointerEvent): boolean | void;
|
|
62
|
+
/** A pointer was released */
|
|
63
|
+
onPointerUp(event: DrawPointerEvent): boolean | void;
|
|
64
|
+
/** The pointer left the map */
|
|
65
|
+
onPointerLeave(): boolean | void;
|
|
66
|
+
/** A click */
|
|
67
|
+
onClick(event: DrawPointerEvent): boolean | void;
|
|
68
|
+
/** A double click */
|
|
69
|
+
onDoubleClick(event: DrawPointerEvent): boolean | void;
|
|
70
|
+
/** A drag started */
|
|
71
|
+
onDragStart(event: DrawPointerEvent): boolean | void;
|
|
72
|
+
/** The pointer moved during a drag */
|
|
73
|
+
onDrag(event: DrawPointerEvent): boolean | void;
|
|
74
|
+
/** A drag ended */
|
|
75
|
+
onDragEnd(event: DrawPointerEvent): boolean | void;
|
|
76
|
+
/** A drag was cancelled */
|
|
77
|
+
onDragCancel(event: DrawPointerEvent): boolean | void;
|
|
78
|
+
/** A key was pressed */
|
|
79
|
+
onKeyDown(event: DrawKeyEvent): boolean | void;
|
|
80
|
+
/** A key was released */
|
|
81
|
+
onKeyUp(event: DrawKeyEvent): boolean | void;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* The contract of a mode: how it enters, exits and receives the input. Every member is
|
|
85
|
+
* optional; returning true from an input receiver consumes the event.
|
|
86
|
+
*/
|
|
87
|
+
export interface ModeHandler extends Partial<InputHandlers> {
|
|
88
|
+
/**
|
|
89
|
+
* Whether the mode writes new features. Such a mode is entered only while a layer can be
|
|
90
|
+
* written, and a double click never zooms the map while it is the current mode, whether or
|
|
91
|
+
* not it takes the double click; false when it is left out.
|
|
92
|
+
*/
|
|
93
|
+
readonly writes?: boolean;
|
|
94
|
+
/** How the mode wants the positions of its input snapped; every input snaps when left out */
|
|
95
|
+
readonly snapPreference?: SnapPreference;
|
|
96
|
+
/** Called when the mode is entered */
|
|
97
|
+
onEnter?(): void;
|
|
98
|
+
/** Called when the mode is left */
|
|
99
|
+
onExit?(): void;
|
|
100
|
+
/**
|
|
101
|
+
* Called when the mode is interrupted: by an Escape that neither a plugin nor the mode
|
|
102
|
+
* consumed, or when the Store replaces its whole document (a notification with
|
|
103
|
+
* `reset: true`). The mode drops what it was drawing and stays the current mode.
|
|
104
|
+
*/
|
|
105
|
+
onCancel?(): void;
|
|
106
|
+
/**
|
|
107
|
+
* Removes the last vertex of the shape being drawn, as `ctx.drawing.undoVertex` asks.
|
|
108
|
+
*
|
|
109
|
+
* @returns True when a vertex was removed
|
|
110
|
+
*/
|
|
111
|
+
onUndoVertex?(): boolean;
|
|
112
|
+
/**
|
|
113
|
+
* Puts back the vertex the last `onUndoVertex` removed, as `ctx.drawing.redoVertex` asks.
|
|
114
|
+
*
|
|
115
|
+
* @returns True when a vertex was put back
|
|
116
|
+
*/
|
|
117
|
+
onRedoVertex?(): boolean;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* The function that creates the handler of a mode. It is registered once, under its name,
|
|
121
|
+
* with `draw.extensions.modes.add(name, factory)`.
|
|
122
|
+
*/
|
|
123
|
+
export type ModeFactory = (ctx: ModeContext) => ModeHandler;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plugins: bundles of other extensions and state
|
|
3
|
+
*/
|
|
4
|
+
import type { Feature } from '../model.js';
|
|
5
|
+
import type { PluginContext } from './context.js';
|
|
6
|
+
import type { DrawPointerEvent, InputHandlers } from './mode.js';
|
|
7
|
+
/**
|
|
8
|
+
* A plugin: a bundle of modes, feature types, overlays, providers and state, added with
|
|
9
|
+
* `draw.extensions.plugins.add`. What it adds through its context is removed by itself when
|
|
10
|
+
* the plugin is removed. Plugins talk to each other through their `api`.
|
|
11
|
+
*
|
|
12
|
+
* @typeParam Api - The API the plugin offers to others
|
|
13
|
+
*/
|
|
14
|
+
export interface Plugin<Api = unknown> {
|
|
15
|
+
/** The name it is registered under */
|
|
16
|
+
readonly name: string;
|
|
17
|
+
/** Called when the plugin is added; add its extensions and subscribe to events here. */
|
|
18
|
+
onAdd(ctx: PluginContext): void;
|
|
19
|
+
/** Called when the plugin is removed. */
|
|
20
|
+
onRemove?(): void;
|
|
21
|
+
/** The API others get with `draw.extensions.plugins.getApi(name)` */
|
|
22
|
+
readonly api?: Api;
|
|
23
|
+
/**
|
|
24
|
+
* Receivers of the input, called before those of the mode. Returning true consumes the
|
|
25
|
+
* event, so that the mode does not get it.
|
|
26
|
+
*/
|
|
27
|
+
readonly input?: Partial<InputHandlers>;
|
|
28
|
+
/** The hooks of the select mode, and an exclusive interaction of the plugin */
|
|
29
|
+
readonly interaction?: {
|
|
30
|
+
/** Narrows the candidates of a selection to the IDs it returns */
|
|
31
|
+
filterSelection?(candidateIds: readonly string[]): string[];
|
|
32
|
+
/** A selected feature was clicked again; returning true means the plugin handled it */
|
|
33
|
+
onFeatureClick?(feature: Feature, event: DrawPointerEvent): boolean;
|
|
34
|
+
/** A feature was double-clicked; returning true means the plugin handled it */
|
|
35
|
+
onFeatureDoubleClick?(feature: Feature, event: DrawPointerEvent): boolean;
|
|
36
|
+
/**
|
|
37
|
+
* A drawing mode created a feature: a commit of `ModeContext.commitFeature`, which the
|
|
38
|
+
* built-in drawing modes use too, or the image placed by the load that follows a request
|
|
39
|
+
* of the image mode
|
|
40
|
+
*/
|
|
41
|
+
onDrawCommit?(feature: Feature): void;
|
|
42
|
+
/** Whether the plugin is in an exclusive interaction, during which the mode stays still */
|
|
43
|
+
isBusy?(): boolean;
|
|
44
|
+
/** Completes the exclusive interaction */
|
|
45
|
+
finish?(): void;
|
|
46
|
+
/** Cancels the exclusive interaction */
|
|
47
|
+
cancel?(): void;
|
|
48
|
+
/** The element of the exclusive interaction; clicks inside it are left to the plugin */
|
|
49
|
+
container?(): HTMLElement | null;
|
|
50
|
+
};
|
|
51
|
+
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Providers: extensions that add snapping candidates, handles or companions to feature types
|
|
3
|
+
* they do not define
|
|
4
|
+
*
|
|
5
|
+
* A custom feature type describes its own handles and candidates in its definition; a
|
|
6
|
+
* provider is for the built-in types and the types of other extensions.
|
|
7
|
+
*/
|
|
8
|
+
import type { Position } from 'geojson';
|
|
9
|
+
import type { Feature, FeaturePatch } from '../model.js';
|
|
10
|
+
import type { HitTestContext, ScreenContext, SnapContext } from './context.js';
|
|
11
|
+
import type { Handle } from './feature-type.js';
|
|
12
|
+
import type { DrawPointerEvent } from './mode.js';
|
|
13
|
+
import type { RenderContext } from './render.js';
|
|
14
|
+
/** What a hit test found. */
|
|
15
|
+
export interface Hit {
|
|
16
|
+
/** What was hit */
|
|
17
|
+
kind: 'feature' | 'dataset' | 'companion' | 'handle';
|
|
18
|
+
/** The ID of what was hit */
|
|
19
|
+
id: string;
|
|
20
|
+
/** The ID of the feature it belongs to */
|
|
21
|
+
featureId?: string;
|
|
22
|
+
/** The ID of the dataset, for a row of a dataset */
|
|
23
|
+
datasetId?: string;
|
|
24
|
+
/** The distance from the point, in pixels */
|
|
25
|
+
distancePx: number;
|
|
26
|
+
}
|
|
27
|
+
/** One snapping candidate. */
|
|
28
|
+
export interface SnapCandidate {
|
|
29
|
+
/** The position to snap to */
|
|
30
|
+
position: Position;
|
|
31
|
+
/** The kind of candidate; a provider may use a kind of its own */
|
|
32
|
+
kind: 'vertex' | 'edge' | 'intersection' | 'guide' | (string & {});
|
|
33
|
+
/** The priority among candidates at the same distance; higher wins */
|
|
34
|
+
priority?: number;
|
|
35
|
+
/** Where the candidate came from, for display */
|
|
36
|
+
source?: string;
|
|
37
|
+
}
|
|
38
|
+
/** An extension that adds snapping candidates. */
|
|
39
|
+
export interface SnapProvider {
|
|
40
|
+
/** The name it is registered under */
|
|
41
|
+
readonly name: string;
|
|
42
|
+
/** The candidates near the point of the context. */
|
|
43
|
+
candidates(ctx: SnapContext): SnapCandidate[];
|
|
44
|
+
}
|
|
45
|
+
/** An extension that shows handles of its own on the selected features and receives their drags. */
|
|
46
|
+
export interface HandleProvider {
|
|
47
|
+
/** The name it is registered under */
|
|
48
|
+
readonly name: string;
|
|
49
|
+
/**
|
|
50
|
+
* The handles of a selected feature. The engine draws them with the look of the vertex
|
|
51
|
+
* handles, hit tests them at the same size, and gives their drags to `onDrag`.
|
|
52
|
+
*/
|
|
53
|
+
handles(feature: Feature, ctx: ScreenContext): Handle[];
|
|
54
|
+
/**
|
|
55
|
+
* The handles that belong to no feature, shown whatever is selected; they are hit and
|
|
56
|
+
* dragged like the others, and their drag arrives with `feature` as `null`.
|
|
57
|
+
*/
|
|
58
|
+
globalHandles?(ctx: ScreenContext): Handle[];
|
|
59
|
+
/**
|
|
60
|
+
* The change a drag of one of its handles makes. It is called for every move of the drag
|
|
61
|
+
* and once more when the drag ends; the patch of the end is the one that stays.
|
|
62
|
+
*
|
|
63
|
+
* @param feature - The feature the handle is on; `null` for a handle of `globalHandles`
|
|
64
|
+
* @returns The patch to apply to the feature, or `null` for no change
|
|
65
|
+
*/
|
|
66
|
+
onDrag(feature: Feature | null, handle: Handle, event: DrawPointerEvent): FeaturePatch | null;
|
|
67
|
+
/**
|
|
68
|
+
* A drag of one of its handles is about to start, before the first `onDrag`.
|
|
69
|
+
*
|
|
70
|
+
* @param feature - The feature the handle is on; `null` for a handle of `globalHandles`
|
|
71
|
+
* @returns False to refuse the drag: the pointer then does what it would do without the
|
|
72
|
+
* handle, and no `onDrag` nor `onDragEnd` follows
|
|
73
|
+
*/
|
|
74
|
+
onDragStart?(feature: Feature | null, handle: Handle, event: DrawPointerEvent): boolean;
|
|
75
|
+
/**
|
|
76
|
+
* A drag of one of its handles ended, after the last `onDrag` and its patch. It is called
|
|
77
|
+
* once for every drag that started, also when the drag is cut short.
|
|
78
|
+
*
|
|
79
|
+
* @param feature - The feature the handle is on as it is now; `null` for a handle of
|
|
80
|
+
* `globalHandles`, or when the feature is gone
|
|
81
|
+
*/
|
|
82
|
+
onDragEnd?(feature: Feature | null, handle: Handle, event: DrawPointerEvent): void;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* An extension that draws a companion one step below a feature, such as a leader line, and
|
|
86
|
+
* hit tests it at the same step.
|
|
87
|
+
*/
|
|
88
|
+
export interface CompanionProvider {
|
|
89
|
+
/** The name it is registered under */
|
|
90
|
+
readonly name: string;
|
|
91
|
+
/**
|
|
92
|
+
* Whether a feature has a companion. It is asked for every feature on every frame and
|
|
93
|
+
* every hit test, so it must answer at once.
|
|
94
|
+
*/
|
|
95
|
+
has(feature: Feature): boolean;
|
|
96
|
+
/** Draws the companion of a feature. */
|
|
97
|
+
draw(feature: Feature, ctx: RenderContext): void;
|
|
98
|
+
/**
|
|
99
|
+
* Hit tests the companion of a feature.
|
|
100
|
+
*
|
|
101
|
+
* It is asked at the step of the feature in the stacking order: when the point missed the
|
|
102
|
+
* feature itself, and before the feature behind it. At one point, the handles of the
|
|
103
|
+
* selection come first; then, from the front, each feature and then its companions, so a
|
|
104
|
+
* feature (its marker, its line or its area, with the click tolerance) wins over its own
|
|
105
|
+
* companion and a companion wins over the features behind its feature; the rows of a
|
|
106
|
+
* dataset come only after the features and the companions in front of them.
|
|
107
|
+
*
|
|
108
|
+
* @returns What was hit, or `null`
|
|
109
|
+
*/
|
|
110
|
+
hitTest(feature: Feature, ctx: HitTestContext): Hit | null;
|
|
111
|
+
/**
|
|
112
|
+
* A companion was clicked.
|
|
113
|
+
*
|
|
114
|
+
* @param hit - What `hitTest` returned
|
|
115
|
+
* @returns True to consume the click, which then changes nothing else; false, or nothing,
|
|
116
|
+
* to leave it to the select mode as a click on the feature
|
|
117
|
+
*/
|
|
118
|
+
onClick?(feature: Feature, hit: Hit, event: DrawPointerEvent): boolean;
|
|
119
|
+
}
|