@sakuzu/maplibre-gl-draw 1.0.0 → 2.1.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 +1109 -2
- package/README.ja.md +83 -50
- package/README.md +89 -53
- package/THIRD_PARTY_NOTICES.md +29 -0
- package/dist/api/datasets.d.ts +263 -0
- package/dist/api/document.d.ts +66 -0
- package/dist/api/draw.d.ts +137 -0
- package/dist/api/draw.js +20 -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 +316 -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 +405 -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 +423 -0
- package/dist/api/impl/extension-host.js +364 -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 +851 -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 +21 -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 +84 -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 +154 -70
- package/dist/dispatcher/normalizer.js +25 -4
- 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 +85 -0
- package/dist/geometry/geojson.js +173 -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 +66 -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 +12 -6
- package/dist/view/layer/attach.js +86 -10
- 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 +38 -15
- 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,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
|
+
}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Drawing: the renderers of custom feature types and overlays, the values they draw with,
|
|
3
|
+
* and the shared renderers they can draw through
|
|
4
|
+
*/
|
|
5
|
+
import type { Position } from 'geojson';
|
|
6
|
+
import type { Map as MaplibreMap, ProjectionData } from 'maplibre-gl';
|
|
7
|
+
import type { Feature, LineStyle, PointShape } from '../model.js';
|
|
8
|
+
import type { TerrainAnchors } from './context.js';
|
|
9
|
+
/**
|
|
10
|
+
* The shader prelude the map passes to a custom layer, for compiling programs for the current
|
|
11
|
+
* projection.
|
|
12
|
+
*/
|
|
13
|
+
export interface ShaderData {
|
|
14
|
+
/** The GLSL the map prepends to a vertex shader (its projection functions) */
|
|
15
|
+
vertexShaderPrelude: string;
|
|
16
|
+
/** The `#define` lines of the current projection */
|
|
17
|
+
define: string;
|
|
18
|
+
/** The name of the projection variant; a program is compiled again when it changes */
|
|
19
|
+
variantName: string;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* The values for drawing positions relative to the center of the view, which keeps the
|
|
23
|
+
* precision of 32-bit floats near the camera.
|
|
24
|
+
*/
|
|
25
|
+
export interface OffsetUniforms {
|
|
26
|
+
/** The center, rounded to 32-bit floats for the shader */
|
|
27
|
+
centerLngLat: [number, number];
|
|
28
|
+
/** The center at 64-bit precision, for the offsets computed on the CPU */
|
|
29
|
+
centerLngLat64: [number, number];
|
|
30
|
+
/** The Mercator coordinates of the center, at 64-bit precision */
|
|
31
|
+
centerMercator: [number, number];
|
|
32
|
+
/** The center of the view in clip space, at 64-bit precision */
|
|
33
|
+
projectionCenter: [number, number, number, number];
|
|
34
|
+
/** The Mercator units per degree of longitude and latitude at the center */
|
|
35
|
+
unitsPerDegree: [number, number, number];
|
|
36
|
+
/** The second-order correction of `unitsPerDegree` for the change with latitude */
|
|
37
|
+
unitsPerDegree2: [number, number, number];
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* The shared renderer of lines. It only draws; the zoom, the projection and the terrain come
|
|
41
|
+
* from the {@link RenderContext} it was taken from.
|
|
42
|
+
*/
|
|
43
|
+
export interface LineRenderer {
|
|
44
|
+
/**
|
|
45
|
+
* Draws a line.
|
|
46
|
+
*
|
|
47
|
+
* @param coordinates - The positions of the line
|
|
48
|
+
* @param style - The width in pixels, the CSS color, the opacity from 0 to 1, the dash
|
|
49
|
+
* pattern, and a custom `[dash, gap]` in pixels
|
|
50
|
+
* @param options - `closed` joins the last position to the first; `widthUnit` says whether
|
|
51
|
+
* the width is in pixels or meters; `createdZoom` is the zoom at which the width applies,
|
|
52
|
+
* so that the line grows and shrinks with the zoom
|
|
53
|
+
*/
|
|
54
|
+
draw(coordinates: readonly Position[], style: {
|
|
55
|
+
width: number;
|
|
56
|
+
color: string;
|
|
57
|
+
opacity: number;
|
|
58
|
+
lineStyle: LineStyle;
|
|
59
|
+
dashArray?: number[];
|
|
60
|
+
}, options?: {
|
|
61
|
+
closed?: boolean;
|
|
62
|
+
widthUnit?: 'pixels' | 'meters';
|
|
63
|
+
createdZoom?: number;
|
|
64
|
+
}): void;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* The shared renderer of areas. It only draws; the zoom, the projection and the terrain come
|
|
68
|
+
* from the {@link RenderContext} it was taken from.
|
|
69
|
+
*/
|
|
70
|
+
export interface FillRenderer {
|
|
71
|
+
/**
|
|
72
|
+
* Fills an area.
|
|
73
|
+
*
|
|
74
|
+
* @param rings - The outer ring first, then the holes
|
|
75
|
+
* @param style - The CSS color and the opacity from 0 to 1
|
|
76
|
+
*/
|
|
77
|
+
draw(rings: readonly (readonly Position[])[], style: {
|
|
78
|
+
color: string;
|
|
79
|
+
opacity: number;
|
|
80
|
+
}): void;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* The shared renderer of point markers. It only draws; the zoom, the projection and the
|
|
84
|
+
* terrain come from the {@link RenderContext} it was taken from.
|
|
85
|
+
*/
|
|
86
|
+
export interface PointRenderer {
|
|
87
|
+
/**
|
|
88
|
+
* Draws a point marker.
|
|
89
|
+
*
|
|
90
|
+
* @param position - The position
|
|
91
|
+
* @param style - The shape, the size in pixels, the fill and the outline (CSS colors,
|
|
92
|
+
* opacities from 0 to 1, the outline width in pixels)
|
|
93
|
+
* @param options - `elevationMeters` places the marker at this height instead of on the
|
|
94
|
+
* ground
|
|
95
|
+
*/
|
|
96
|
+
draw(position: Position, style: {
|
|
97
|
+
shape: PointShape;
|
|
98
|
+
size: number;
|
|
99
|
+
fillColor: string;
|
|
100
|
+
fillOpacity: number;
|
|
101
|
+
strokeColor: string;
|
|
102
|
+
strokeWidth: number;
|
|
103
|
+
strokeOpacity: number;
|
|
104
|
+
}, options?: {
|
|
105
|
+
elevationMeters?: number;
|
|
106
|
+
}): void;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Everything a renderer needs to draw a frame. The offsets are already computed.
|
|
110
|
+
*/
|
|
111
|
+
export interface RenderContext {
|
|
112
|
+
/** The WebGL context of the map */
|
|
113
|
+
readonly gl: WebGL2RenderingContext;
|
|
114
|
+
/** The shader prelude of the current projection */
|
|
115
|
+
readonly shader: ShaderData;
|
|
116
|
+
/** The values for drawing relative to the center of the view */
|
|
117
|
+
readonly offset: OffsetUniforms;
|
|
118
|
+
/** The projection of the frame, as the map passes it to a custom layer */
|
|
119
|
+
readonly projection: ProjectionData;
|
|
120
|
+
/** The zoom of the frame */
|
|
121
|
+
readonly zoom: number;
|
|
122
|
+
/** The pixel ratio of the drawing */
|
|
123
|
+
readonly pixelRatio: number;
|
|
124
|
+
/** The opacity of the layer being drawn, from 0 to 1 */
|
|
125
|
+
readonly opacity: number;
|
|
126
|
+
/**
|
|
127
|
+
* The positions and the heights on the terrain. The building blocks of the `/webgl` entry
|
|
128
|
+
* that draw on the terrain take it, or the whole render context.
|
|
129
|
+
*/
|
|
130
|
+
readonly terrain: TerrainAnchors;
|
|
131
|
+
/** The shared renderer of lines */
|
|
132
|
+
readonly line: LineRenderer;
|
|
133
|
+
/** The shared renderer of areas */
|
|
134
|
+
readonly fill: FillRenderer;
|
|
135
|
+
/** The shared renderer of point markers */
|
|
136
|
+
readonly point: PointRenderer;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* How the features of a custom type are drawn. The methods take their arguments in the order
|
|
140
|
+
* of a custom layer of the map.
|
|
141
|
+
*/
|
|
142
|
+
export interface FeatureRenderer {
|
|
143
|
+
/** Called when the renderer is added to the map; create the programs and buffers here. */
|
|
144
|
+
onAdd(map: MaplibreMap, gl: WebGL2RenderingContext): void;
|
|
145
|
+
/** Draws one feature. */
|
|
146
|
+
draw(feature: Feature, ctx: RenderContext): void;
|
|
147
|
+
/** Called when the renderer is removed; release what `onAdd` created. */
|
|
148
|
+
onRemove(map: MaplibreMap, gl: WebGL2RenderingContext): void;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* A renderer that draws above the features, or between the layers.
|
|
152
|
+
*/
|
|
153
|
+
export interface OverlayRenderer {
|
|
154
|
+
/** The name it is registered under */
|
|
155
|
+
readonly name: string;
|
|
156
|
+
/**
|
|
157
|
+
* The order among the overlays: a lower one is drawn first, below a higher one. Overlays of
|
|
158
|
+
* the same order are drawn in the order they were added; 0 when it is left out.
|
|
159
|
+
*/
|
|
160
|
+
readonly order?: number;
|
|
161
|
+
/** Called when the renderer is added to the map; create the programs and buffers here. */
|
|
162
|
+
onAdd(map: MaplibreMap, gl: WebGL2RenderingContext): void;
|
|
163
|
+
/** Draws above every layer. */
|
|
164
|
+
draw(ctx: RenderContext): void;
|
|
165
|
+
/** Draws just above one layer, for an overlay drawn between the layers. */
|
|
166
|
+
drawForLayer?(layerId: string, ctx: RenderContext): void;
|
|
167
|
+
/**
|
|
168
|
+
* Draws the vertices of what the overlay shows, above the features of every layer and the
|
|
169
|
+
* selection, so that they stay visible over a layer further back.
|
|
170
|
+
*/
|
|
171
|
+
drawVertices?(ctx: RenderContext): void;
|
|
172
|
+
/** Whether some of its drawing has not finished yet. */
|
|
173
|
+
hasPendingWork?(): boolean;
|
|
174
|
+
/** Called when the renderer is removed; release what `onAdd` created. */
|
|
175
|
+
onRemove(map: MaplibreMap, gl: WebGL2RenderingContext): void;
|
|
176
|
+
}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Store: where the document and the state of this client are kept
|
|
3
|
+
*
|
|
4
|
+
* The built-in Store keeps them in memory. An application replaces it through the `store`
|
|
5
|
+
* option of `createDraw`, for example to keep the document somewhere shared.
|
|
6
|
+
*/
|
|
7
|
+
import type { DocumentChange } from '../events.js';
|
|
8
|
+
import type { Feature, FileData, Group, Layer, Metadata } from '../model.js';
|
|
9
|
+
import type { Mode, Selection, SelectionType, VertexSelection } from '../state.js';
|
|
10
|
+
/**
|
|
11
|
+
* Where a write came from, as it arrives in {@link DocumentChange.source} and in the `source` of
|
|
12
|
+
* the events.
|
|
13
|
+
*
|
|
14
|
+
* - `local`: an operation of the user or a call of the API (the default)
|
|
15
|
+
* - `silent`: a change that a subscriber recording changes leaves out, such as the selection a
|
|
16
|
+
* drawing mode clears as it is entered
|
|
17
|
+
* - `load`: a load of any format (`document.load`, `document.loadMany`), with the replacement
|
|
18
|
+
* of `mode: 'replace'`, in one transaction
|
|
19
|
+
* - `batch`: a bulk change of an application or an extension recorded as one step; the
|
|
20
|
+
* library does not write it
|
|
21
|
+
* - `remote`: a change a replaced Store applies from outside the instance
|
|
22
|
+
* - `import`: data an application or an extension loads by its own means
|
|
23
|
+
*
|
|
24
|
+
* Any other string can be used by an extension or a Store for the changes it applies itself.
|
|
25
|
+
*/
|
|
26
|
+
export type UpdateSource = 'local' | 'silent' | 'load' | 'batch' | 'remote' | 'import' | (string & Record<never, never>);
|
|
27
|
+
/**
|
|
28
|
+
* The read side of the Store: the document, the state of this client, and the subscription
|
|
29
|
+
* to their changes.
|
|
30
|
+
*
|
|
31
|
+
* What it returns and notifies keeps these rules:
|
|
32
|
+
*
|
|
33
|
+
* - Returned objects are never changed afterwards. Callers treat what a getter returns or a
|
|
34
|
+
* notification carries as read-only, and the Store never changes such an object: a change
|
|
35
|
+
* stores a new object.
|
|
36
|
+
* - The stacking order (`getLayerOrder()`) is part of the document. It may hold entries that
|
|
37
|
+
* are not layers (a dataset with `order: 'layer-order'`, a separator of the application),
|
|
38
|
+
* and its entries are distinct non-empty strings.
|
|
39
|
+
* - One notification per outermost transaction: `subscribe` delivers one `DocumentChange`
|
|
40
|
+
* per outermost `transact` (or per write outside one), with its `source`. The transactions
|
|
41
|
+
* inside another fold into the outermost one.
|
|
42
|
+
* - A replacement of the whole document is one `DocumentChange`. A load that replaces the
|
|
43
|
+
* document in one `transact` arrives as one change; a document the Store takes from
|
|
44
|
+
* elsewhere in one step arrives as one change with `reset: true`, which lists what was
|
|
45
|
+
* replaced.
|
|
46
|
+
* - A write of the selection, the editing or the mode is notified with its category; a write
|
|
47
|
+
* of the vertex selection, read-only, the interaction lock or the hidden items may be
|
|
48
|
+
* notified with no category.
|
|
49
|
+
* - A change applied from outside the instance is notified like a local one, with the source
|
|
50
|
+
* `'remote'`. The instance follows it: a deleted item leaves the selection, the editing and
|
|
51
|
+
* the hidden items through the writes of {@link Store}.
|
|
52
|
+
* - An optional field (`Feature.groupId`, `Layer.metadata`, `Layer.styleRule`) may be given as
|
|
53
|
+
* `null`: null is accepted and read as `undefined`, so the instance and its API always hand
|
|
54
|
+
* out `undefined` for it.
|
|
55
|
+
* - The state of this client (the selection, the editing, the selected vertices, the mode,
|
|
56
|
+
* read-only, the interaction lock and the hidden items) is not part of the document: it is
|
|
57
|
+
* not saved, and a change from outside the instance does not carry it.
|
|
58
|
+
*/
|
|
59
|
+
export interface StoreView {
|
|
60
|
+
/** A feature by ID, or `undefined` */
|
|
61
|
+
getFeature(id: string): Feature | undefined;
|
|
62
|
+
/** Every feature, in no particular order */
|
|
63
|
+
listFeatures(): Feature[];
|
|
64
|
+
/** Every feature in stacking order, from the back */
|
|
65
|
+
listFeaturesInOrder(): Feature[];
|
|
66
|
+
/** A layer by ID, or `undefined` */
|
|
67
|
+
getLayer(id: string): Layer | undefined;
|
|
68
|
+
/** Every layer, in no particular order */
|
|
69
|
+
listLayers(): Layer[];
|
|
70
|
+
/** The stacking order, from the back: the layers and the entries from outside the document */
|
|
71
|
+
getLayerOrder(): readonly string[];
|
|
72
|
+
/** A group by ID, or `undefined` */
|
|
73
|
+
getGroup(id: string): Group | undefined;
|
|
74
|
+
/** Every group */
|
|
75
|
+
listGroups(): Group[];
|
|
76
|
+
/** An embedded file by ID, or `undefined` */
|
|
77
|
+
getFile(id: string): FileData | undefined;
|
|
78
|
+
/** Every embedded file */
|
|
79
|
+
listFiles(): FileData[];
|
|
80
|
+
/** The title and the description */
|
|
81
|
+
getMetadata(): Metadata;
|
|
82
|
+
/** The selection of this client */
|
|
83
|
+
getSelection(): Selection;
|
|
84
|
+
/** The IDs of the features being edited */
|
|
85
|
+
getEditingIds(): readonly string[];
|
|
86
|
+
/** The selected vertices, or `null` */
|
|
87
|
+
getVertexSelection(): VertexSelection | null;
|
|
88
|
+
/** The current mode */
|
|
89
|
+
getMode(): Mode;
|
|
90
|
+
/** Whether the document is read-only */
|
|
91
|
+
isReadOnly(): boolean;
|
|
92
|
+
/** Whether the interaction lock is on */
|
|
93
|
+
isInteractionLocked(): boolean;
|
|
94
|
+
/** Whether this client hides the item */
|
|
95
|
+
isHidden(id: string): boolean;
|
|
96
|
+
/** The IDs this client hides */
|
|
97
|
+
listHidden(): ReadonlySet<string>;
|
|
98
|
+
/**
|
|
99
|
+
* Subscribes to the changes; one notification arrives per outermost transaction.
|
|
100
|
+
*
|
|
101
|
+
* @returns The function that unsubscribes
|
|
102
|
+
*/
|
|
103
|
+
subscribe(listener: (changes: DocumentChange) => void): () => void;
|
|
104
|
+
/**
|
|
105
|
+
* Runs `fn` as one transaction, so that its writes arrive as one notification.
|
|
106
|
+
*
|
|
107
|
+
* @returns What `fn` returns
|
|
108
|
+
*/
|
|
109
|
+
transact<T>(fn: () => T, source?: UpdateSource): T;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* The Store with its writes: what the `store` option of `createDraw` takes.
|
|
113
|
+
*
|
|
114
|
+
* The instance reads and writes the document and the state of this client only through these
|
|
115
|
+
* methods, subscribes to it and groups its writes with `transact`. The shape being drawn, the
|
|
116
|
+
* box selection and the drag stay in the instance. A Store keeps the rules of
|
|
117
|
+
* {@link StoreView} and these:
|
|
118
|
+
*
|
|
119
|
+
* - Unique IDs: the IDs of features and groups are unique together (both are listed in
|
|
120
|
+
* `Layer.items`), the IDs of layers are unique, and so are the IDs of files. A write that
|
|
121
|
+
* would take an ID in use does not apply.
|
|
122
|
+
* - `Layer.items` is consistent: every feature is listed in exactly one container, in
|
|
123
|
+
* `Group.featureIds` of its group when it has `groupId`, otherwise in `Layer.items` of its
|
|
124
|
+
* layer, and every group is listed in `Layer.items` of one layer. The writes keep it so: a
|
|
125
|
+
* new feature or group is listed, a deleted one is taken out, a change of `layerId` or
|
|
126
|
+
* `groupId` moves the feature, and a group whose last member leaves is deleted.
|
|
127
|
+
* - `Group.layerId` is maintained by the Store: it is always the layer whose `items` list the
|
|
128
|
+
* group.
|
|
129
|
+
* - The stacking order: `createLayer` adds the new layer at the front unless the order
|
|
130
|
+
* already holds it, `deleteLayer` takes it out, and no other write adds or removes entries.
|
|
131
|
+
* - Writes return whether they were applied: a write of the document returns true when it
|
|
132
|
+
* changed the Store, and false when it was refused, changing nothing. A write whose
|
|
133
|
+
* argument cannot apply (an ID that names nothing) may throw instead, storing nothing.
|
|
134
|
+
* - Read-only refusals: the instance does not call the writes of the document while
|
|
135
|
+
* `isReadOnly()` is true, and a Store may refuse them then (and for reasons of its own) by
|
|
136
|
+
* returning false. The interaction lock does not stop any write. The writes of the state of
|
|
137
|
+
* this client return nothing: the instance takes them as applied.
|
|
138
|
+
*/
|
|
139
|
+
export interface Store extends StoreView {
|
|
140
|
+
/** Creates a feature. */
|
|
141
|
+
createFeature(feature: Feature): boolean;
|
|
142
|
+
/** Changes the fields given of a feature; `isIntermediate` marks an edit in progress. */
|
|
143
|
+
updateFeature(id: string, updates: Partial<Feature>, options?: {
|
|
144
|
+
isIntermediate?: boolean;
|
|
145
|
+
}): boolean;
|
|
146
|
+
/** Drops the intermediate updates of these features that were not followed by a final one. */
|
|
147
|
+
abortIntermediateUpdates?(ids: string[]): void;
|
|
148
|
+
/** Deletes a feature. */
|
|
149
|
+
deleteFeature(id: string): boolean;
|
|
150
|
+
/** Creates a layer. */
|
|
151
|
+
createLayer(layer: Layer): boolean;
|
|
152
|
+
/** Changes the fields given of a layer. */
|
|
153
|
+
updateLayer(id: string, updates: Partial<Layer>): boolean;
|
|
154
|
+
/** Deletes a layer. */
|
|
155
|
+
deleteLayer(id: string): boolean;
|
|
156
|
+
/** Replaces the stacking order. */
|
|
157
|
+
setLayerOrder(order: string[]): boolean;
|
|
158
|
+
/** Moves an item to a position within a layer. */
|
|
159
|
+
reorderInLayer(itemId: string, layerId: string, newIndex: number): boolean;
|
|
160
|
+
/** Moves a feature to a position within a group. */
|
|
161
|
+
reorderInGroup(featureId: string, groupId: string, newIndex: number): boolean;
|
|
162
|
+
/** Creates a group. */
|
|
163
|
+
createGroup(group: Group): boolean;
|
|
164
|
+
/** Changes the fields given of a group. */
|
|
165
|
+
updateGroup(id: string, updates: Partial<Group>): boolean;
|
|
166
|
+
/** Deletes a group. */
|
|
167
|
+
deleteGroup(id: string): boolean;
|
|
168
|
+
/** Adds an embedded file. */
|
|
169
|
+
createFile(file: FileData): boolean;
|
|
170
|
+
/** Deletes an embedded file. */
|
|
171
|
+
deleteFile(id: string): boolean;
|
|
172
|
+
/** Changes the fields given of the metadata. */
|
|
173
|
+
setMetadata(metadata: Partial<Metadata>): boolean;
|
|
174
|
+
/** Replaces the selection of this client. */
|
|
175
|
+
setSelection(type: SelectionType | null, ids: string[]): void;
|
|
176
|
+
/** Marks features as being edited. */
|
|
177
|
+
startEditing(ids: string[]): void;
|
|
178
|
+
/** Marks features as no longer being edited. */
|
|
179
|
+
endEditing(ids: string[]): void;
|
|
180
|
+
/** Replaces the selected vertices. */
|
|
181
|
+
setSelectedVertices(selection: VertexSelection | null): void;
|
|
182
|
+
/** Replaces the mode. */
|
|
183
|
+
setMode(mode: Mode): void;
|
|
184
|
+
/** Turns read-only on or off. */
|
|
185
|
+
setReadOnly(value: boolean): void;
|
|
186
|
+
/** Turns the interaction lock on or off. */
|
|
187
|
+
setInteractionLock(value: boolean): void;
|
|
188
|
+
/** Hides or shows an item in this client. */
|
|
189
|
+
setLocallyHidden(id: string, hidden: boolean): void;
|
|
190
|
+
}
|