@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,263 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `draw.datasets`: large data that is drawn but not edited, and is not part of the document
|
|
3
|
+
*/
|
|
4
|
+
import type { Feature as GeoJSONFeature, Geometry, Position } from 'geojson';
|
|
5
|
+
import type { BBox } from '../geometry/types.js';
|
|
6
|
+
import type { PreparedTable, Table } from '../table/index.js';
|
|
7
|
+
import type { ScreenPoint } from './events.js';
|
|
8
|
+
import type { FeatureStyle, FeatureType, StyleRule } from './model.js';
|
|
9
|
+
/**
|
|
10
|
+
* A row of a dataset, given and read as a GeoJSON feature. Its geometry may be `null`, as
|
|
11
|
+
* GeoJSON allows; such a row is kept in the table and is not drawn.
|
|
12
|
+
*
|
|
13
|
+
* Besides the members of GeoJSON, a row may carry `style`, its own look, which wins over the
|
|
14
|
+
* color of the style rule and the base style of the dataset. A row read back carries the look
|
|
15
|
+
* it was given merged over the base style, when that has a key.
|
|
16
|
+
*/
|
|
17
|
+
export type DatasetRow = GeoJSONFeature<Geometry | null> & {
|
|
18
|
+
/** The look of the row; it wins over the style rule and the base style of the dataset */
|
|
19
|
+
style?: FeatureStyle;
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Where a dataset is stacked: below the layers of the document, above them, or inside the
|
|
23
|
+
* layer order.
|
|
24
|
+
*/
|
|
25
|
+
export type DatasetOrder = 'below-store' | 'above-store' | 'layer-order';
|
|
26
|
+
/** Where a dataset goes in the stacking order. */
|
|
27
|
+
export interface DatasetPlacement {
|
|
28
|
+
/** The division of the stacking order */
|
|
29
|
+
order?: DatasetOrder;
|
|
30
|
+
/** The position within the division, 0 at the back */
|
|
31
|
+
index?: number;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* The default look of the rows of a dataset for each part a style rule colors (`point`,
|
|
35
|
+
* `stroke` and `fill`). A row without a look of its own takes it.
|
|
36
|
+
*/
|
|
37
|
+
export type DatasetBaseStyle = Partial<Record<'point' | 'stroke' | 'fill', FeatureStyle>>;
|
|
38
|
+
/** The scale factor and the opacity the rows of a dataset are drawn with at a zoom. */
|
|
39
|
+
export type DatasetZoomScale = (zoom: number) => {
|
|
40
|
+
scale: number;
|
|
41
|
+
opacity: number;
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* A function that returns the rows of the range in view, for a dataset whose rows are fetched
|
|
45
|
+
* as the map moves.
|
|
46
|
+
*
|
|
47
|
+
* @param bbox - The range in view, in degrees
|
|
48
|
+
* @param zoom - The zoom of the map
|
|
49
|
+
* @returns The rows of the range
|
|
50
|
+
*/
|
|
51
|
+
export type DatasetProvider = (bbox: BBox, zoom: number) => Promise<DatasetRow[]>;
|
|
52
|
+
/** How the point rows of a dataset that overlap on the screen are thinned out. */
|
|
53
|
+
export interface DatasetCollisionThinning {
|
|
54
|
+
/** Whether the thinning is on; false when it is left out */
|
|
55
|
+
enabled?: boolean;
|
|
56
|
+
/** The zoom from which every row is drawn; 17 when it is left out */
|
|
57
|
+
fullDisplayZoom?: number;
|
|
58
|
+
/** The margin around each marker, in screen pixels; 2 when it is left out */
|
|
59
|
+
marginPx?: number;
|
|
60
|
+
}
|
|
61
|
+
/** What the thinning of a dataset is doing now, for a message such as "showing n of N". */
|
|
62
|
+
export interface DatasetThinningStats {
|
|
63
|
+
/** Whether the thinning is on */
|
|
64
|
+
enabled: boolean;
|
|
65
|
+
/** Whether it is thinning out rows at the current zoom */
|
|
66
|
+
active: boolean;
|
|
67
|
+
/** The number of rows */
|
|
68
|
+
total: number;
|
|
69
|
+
/** The number of rows drawn */
|
|
70
|
+
visible: number;
|
|
71
|
+
/** The zoom band the drawn rows were chosen for, or `null` */
|
|
72
|
+
band: number | null;
|
|
73
|
+
}
|
|
74
|
+
/** The events of one dataset, by name, with their payloads. */
|
|
75
|
+
export interface DatasetEvents {
|
|
76
|
+
/** A row was clicked */
|
|
77
|
+
clicked: {
|
|
78
|
+
datasetId: string;
|
|
79
|
+
rowIndex: number;
|
|
80
|
+
row: DatasetRow;
|
|
81
|
+
lngLat: Position;
|
|
82
|
+
point: ScreenPoint;
|
|
83
|
+
};
|
|
84
|
+
/** The pointer moved over a row, or off every row (`rowIndex` and `row` are then `null`) */
|
|
85
|
+
hovered: {
|
|
86
|
+
datasetId: string;
|
|
87
|
+
rowIndex: number | null;
|
|
88
|
+
row: DatasetRow | null;
|
|
89
|
+
lngLat: Position;
|
|
90
|
+
point: ScreenPoint;
|
|
91
|
+
};
|
|
92
|
+
/** The rows, the look, the visibility, the selection or the thinning changed */
|
|
93
|
+
changed: {
|
|
94
|
+
reason: 'rows' | 'style' | 'visibility' | 'selection' | 'thinning';
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* What `datasets.add` takes. The rows are given in one of three ways, told apart by the name
|
|
99
|
+
* of the field: `rows`, `table` or `provider`. With none of them the dataset starts empty: it
|
|
100
|
+
* can be placed at once (`layers.reorder` takes its ID when its order is `layer-order`), and
|
|
101
|
+
* its rows are given later with `setRows` or `setTable`.
|
|
102
|
+
*/
|
|
103
|
+
export type DatasetOptions = {
|
|
104
|
+
/** The ID */
|
|
105
|
+
id: string;
|
|
106
|
+
/** The rule that colors the rows from their attributes */
|
|
107
|
+
styleRule?: StyleRule;
|
|
108
|
+
/** The default look */
|
|
109
|
+
baseStyle?: DatasetBaseStyle;
|
|
110
|
+
/** Whether the rows can be clicked and snapped to */
|
|
111
|
+
interactive?: boolean;
|
|
112
|
+
/** Where it is stacked */
|
|
113
|
+
order?: DatasetOrder;
|
|
114
|
+
/** The scale factor and the opacity by zoom */
|
|
115
|
+
zoomScale?: DatasetZoomScale;
|
|
116
|
+
/** The thinning of overlapping points */
|
|
117
|
+
collisionThinning?: DatasetCollisionThinning;
|
|
118
|
+
/** Picks the point rows that another renderer draws; they are not drawn by the dataset */
|
|
119
|
+
externalPointRender?: (row: DatasetRow) => boolean;
|
|
120
|
+
} & ({
|
|
121
|
+
/** The rows as GeoJSON features */
|
|
122
|
+
rows: readonly DatasetRow[];
|
|
123
|
+
} | {
|
|
124
|
+
/** The rows as a table, prepared or not */
|
|
125
|
+
table: Table | PreparedTable;
|
|
126
|
+
} | {
|
|
127
|
+
/** The function that returns the rows of the range in view */
|
|
128
|
+
provider: DatasetProvider;
|
|
129
|
+
} | {
|
|
130
|
+
/** No rows yet: they are given later with `setRows` or `setTable` */
|
|
131
|
+
rows?: undefined;
|
|
132
|
+
/** No table yet */
|
|
133
|
+
table?: undefined;
|
|
134
|
+
/** No provider */
|
|
135
|
+
provider?: undefined;
|
|
136
|
+
});
|
|
137
|
+
/**
|
|
138
|
+
* Large data drawn on the map and not edited; it is not part of the document.
|
|
139
|
+
*/
|
|
140
|
+
export interface Dataset {
|
|
141
|
+
/** The ID */
|
|
142
|
+
readonly id: string;
|
|
143
|
+
/** Where it is stacked */
|
|
144
|
+
readonly order: DatasetOrder;
|
|
145
|
+
/** Whether the rows can be clicked and snapped to */
|
|
146
|
+
readonly interactive: boolean;
|
|
147
|
+
/** Whether it is visible */
|
|
148
|
+
readonly visible: boolean;
|
|
149
|
+
/** Shows or hides the dataset. */
|
|
150
|
+
setVisible(visible: boolean): void;
|
|
151
|
+
/** Replaces every row. */
|
|
152
|
+
setRows(rows: readonly DatasetRow[]): void;
|
|
153
|
+
/** Replaces every row with a table. */
|
|
154
|
+
setTable(table: Table | PreparedTable): void;
|
|
155
|
+
/** Replaces the style rule; `undefined` removes it. */
|
|
156
|
+
setStyleRule(rule: StyleRule | undefined): void;
|
|
157
|
+
/**
|
|
158
|
+
* The style rule, or `undefined` when none is set: the rule last given to `setStyleRule`, or
|
|
159
|
+
* the one given to `datasets.add` when it was not replaced.
|
|
160
|
+
*/
|
|
161
|
+
getStyleRule(): StyleRule | undefined;
|
|
162
|
+
/** Replaces the scale factor and the opacity by zoom; `null` removes them. */
|
|
163
|
+
setZoomScale(zoomScale: DatasetZoomScale | null): void;
|
|
164
|
+
/** The scale factor and the opacity by zoom, or `null` when none is set. */
|
|
165
|
+
getZoomScale(): DatasetZoomScale | null;
|
|
166
|
+
/** Replaces the default look; `undefined` removes it. */
|
|
167
|
+
setBaseStyle(style: DatasetBaseStyle | undefined): void;
|
|
168
|
+
/** Replaces the function that picks the point rows another renderer draws. */
|
|
169
|
+
setExternalPointRender(predicate: ((row: DatasetRow) => boolean) | undefined): void;
|
|
170
|
+
/** The default look, or `undefined` when none is set. */
|
|
171
|
+
getBaseStyle(): DatasetBaseStyle | undefined;
|
|
172
|
+
/** Every row, in drawing order, without the rule colors and the default look. */
|
|
173
|
+
listRows(): DatasetRow[];
|
|
174
|
+
/** The rows whose extent meets the range, with the rule colors and the default look. */
|
|
175
|
+
listVisibleRows(bbox: BBox): DatasetRow[];
|
|
176
|
+
/** The indexes of the rows drawn now whose extent meets the range, in ascending order. */
|
|
177
|
+
listDrawnRows(bbox: BBox): Int32Array;
|
|
178
|
+
/** Reads a row as a GeoJSON feature; `undefined` when there is no such row. */
|
|
179
|
+
getRow(index: number): DatasetRow | undefined;
|
|
180
|
+
/** The ID of a row, or `null` when there is no such row or it has no ID. */
|
|
181
|
+
getRowId(index: number): string | null;
|
|
182
|
+
/** The type of the geometry of a row, or `null` when there is no such row. */
|
|
183
|
+
getRowType(index: number): FeatureType | null;
|
|
184
|
+
/** The extent of a row, or `null` when there is no such row or it has no geometry. */
|
|
185
|
+
getRowBounds(index: number): BBox | null;
|
|
186
|
+
/** The position of a point row, or `null` when the row is not a point. */
|
|
187
|
+
getRowPoint(index: number): Position | null;
|
|
188
|
+
/** The index of the row with this ID, or `null` when there is none. */
|
|
189
|
+
findRow(id: string): number | null;
|
|
190
|
+
/** Replaces the IDs of the selected rows. */
|
|
191
|
+
setSelectedRowIds(ids: readonly string[]): void;
|
|
192
|
+
/** The IDs of the selected rows. */
|
|
193
|
+
getSelectedRowIds(): string[];
|
|
194
|
+
/** Replaces the thinning of overlapping points; `null` turns it off. */
|
|
195
|
+
setCollisionThinning(options: DatasetCollisionThinning | null): void;
|
|
196
|
+
/** The thinning in effect with every default filled in, or `null` when it is off. */
|
|
197
|
+
getCollisionThinning(): Required<DatasetCollisionThinning> | null;
|
|
198
|
+
/** The IDs of the rows the thinning draws, or `null` when it thins nothing. */
|
|
199
|
+
listVisibleRowIds(): ReadonlySet<string> | null;
|
|
200
|
+
/** What the thinning is doing now. */
|
|
201
|
+
getThinningStats(): DatasetThinningStats;
|
|
202
|
+
/** A number that changes whenever the rows drawn change. */
|
|
203
|
+
getDrawnRowsRevision(): number;
|
|
204
|
+
/** Fetches the rows of the provider again on the next move of the map. */
|
|
205
|
+
refresh(): void;
|
|
206
|
+
/** Subscribes to an event of this dataset and returns the function that unsubscribes. */
|
|
207
|
+
on<K extends keyof DatasetEvents>(event: K, listener: (payload: DatasetEvents[K]) => void): () => void;
|
|
208
|
+
/** Unsubscribes from an event of this dataset. */
|
|
209
|
+
off<K extends keyof DatasetEvents>(event: K, listener: (payload: DatasetEvents[K]) => void): void;
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* The datasets on the map, in stacking order.
|
|
213
|
+
*/
|
|
214
|
+
export interface DatasetsCollection {
|
|
215
|
+
/**
|
|
216
|
+
* Gets a dataset by ID.
|
|
217
|
+
*
|
|
218
|
+
* @returns The dataset, or `undefined` when there is none with this ID
|
|
219
|
+
*/
|
|
220
|
+
get(id: string): Dataset | undefined;
|
|
221
|
+
/** Lists the datasets in stacking order. */
|
|
222
|
+
list(): Dataset[];
|
|
223
|
+
/** Counts the datasets. */
|
|
224
|
+
count(): number;
|
|
225
|
+
/** Whether a dataset with this ID exists. */
|
|
226
|
+
has(id: string): boolean;
|
|
227
|
+
/**
|
|
228
|
+
* Adds a dataset and returns it.
|
|
229
|
+
*
|
|
230
|
+
* @throws `DrawError` with the code `already-exists` when the ID is taken, or
|
|
231
|
+
* `invalid-input` when the options are wrong
|
|
232
|
+
*/
|
|
233
|
+
add(options: DatasetOptions): Dataset;
|
|
234
|
+
/**
|
|
235
|
+
* Adds several datasets in one transaction, all of them or none, and returns them.
|
|
236
|
+
*
|
|
237
|
+
* @throws `DrawError` as {@link DatasetsCollection.add} does, for any of the options;
|
|
238
|
+
* nothing is added then
|
|
239
|
+
*/
|
|
240
|
+
addMany(options: readonly DatasetOptions[]): Dataset[];
|
|
241
|
+
/**
|
|
242
|
+
* Removes a dataset.
|
|
243
|
+
*
|
|
244
|
+
* @returns True when it was removed
|
|
245
|
+
* @throws `DrawError` with the code `not-found` when there is no dataset with this ID
|
|
246
|
+
*/
|
|
247
|
+
remove(id: string): boolean;
|
|
248
|
+
/**
|
|
249
|
+
* Removes several datasets in one transaction: all of them or none.
|
|
250
|
+
*
|
|
251
|
+
* @returns True when they were removed
|
|
252
|
+
* @throws `DrawError` with the code `not-found` when one of the IDs does not exist; nothing
|
|
253
|
+
* is removed then
|
|
254
|
+
*/
|
|
255
|
+
removeMany(ids: readonly string[]): boolean;
|
|
256
|
+
/**
|
|
257
|
+
* Moves a dataset in the stacking order.
|
|
258
|
+
*
|
|
259
|
+
* @returns True when it moved
|
|
260
|
+
* @throws `DrawError` with the code `not-found` when there is no dataset with this ID
|
|
261
|
+
*/
|
|
262
|
+
move(id: string, placement: DatasetPlacement): boolean;
|
|
263
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `draw.document`: the whole document, to load and to write out
|
|
3
|
+
*/
|
|
4
|
+
import type { FeatureCollection } from 'geojson';
|
|
5
|
+
import type { DrawDocument, LoadOptions, LoadResult, LoadSource } from './model.js';
|
|
6
|
+
/**
|
|
7
|
+
* The whole document: features, layers, groups and metadata.
|
|
8
|
+
*/
|
|
9
|
+
export interface DocumentResource {
|
|
10
|
+
/**
|
|
11
|
+
* Reads a file, a JSON string, a document of the library or GeoJSON.
|
|
12
|
+
*
|
|
13
|
+
* `options.mode` decides whether the document is replaced or the features are added; it is
|
|
14
|
+
* `replace` for a document of the library and `merge` for GeoJSON when it is left out.
|
|
15
|
+
*
|
|
16
|
+
* The source is read (and an image decoded) first; then every write is one transaction with
|
|
17
|
+
* the source `load`, whatever the format: one `document.changed` and one notification of the
|
|
18
|
+
* Store, one step for a subscriber that records changes. A load that fails writes nothing.
|
|
19
|
+
* The layer of `options.layer` and the group of `options.group` are created in that
|
|
20
|
+
* transaction too.
|
|
21
|
+
*
|
|
22
|
+
* @returns What was read, or `null` when the document is read-only
|
|
23
|
+
* @throws `DrawError` (the promise rejects; every failure is a `DrawError`) with the code
|
|
24
|
+
* `unsupported-format` when the source cannot be read (text that is not JSON, data that is
|
|
25
|
+
* neither a document of the library nor GeoJSON, an image file that cannot be decoded), or
|
|
26
|
+
* `invalid-input` when the document is not valid (a document of the library that breaks
|
|
27
|
+
* its format, an embedded image that is broken, an image without `coordinate`, `layer`
|
|
28
|
+
* with `layerId`, `layer` or `group` with a document of the library), `not-found` for a
|
|
29
|
+
* `layerId` the document does not have, or `already-exists` for an ID of `layer` or
|
|
30
|
+
* `group` that is taken
|
|
31
|
+
*/
|
|
32
|
+
load(source: LoadSource, options?: LoadOptions): Promise<LoadResult | null>;
|
|
33
|
+
/**
|
|
34
|
+
* Reads several sources and writes all of them in one transaction with the source `load`:
|
|
35
|
+
* one `document.changed` and one notification of the Store, so that an import of several
|
|
36
|
+
* files is one step to undo and one change to send. Every source is read first, in order; the
|
|
37
|
+
* writes then follow in the same order, each as `load` would write it, against the document
|
|
38
|
+
* the earlier items left (a document of the library replaces what the earlier items wrote).
|
|
39
|
+
* `document.loaded` arrives once per item, after the writes.
|
|
40
|
+
*
|
|
41
|
+
* An item may name with `layerId` a layer that an earlier item creates with `layer`, so the
|
|
42
|
+
* items can fill one new layer and a group of it. A layer named by `layerId` that an earlier
|
|
43
|
+
* item removed is replaced with the active layer. With `layer` and `group` in the options of
|
|
44
|
+
* the items, an import of one layer per file and one group per folder is still one
|
|
45
|
+
* transaction.
|
|
46
|
+
*
|
|
47
|
+
* @param items - The sources, each with the options `load` takes
|
|
48
|
+
* @returns What was read from each item, in the order of the items, or `null` when the
|
|
49
|
+
* document is read-only
|
|
50
|
+
* @throws `DrawError` (the promise rejects) as `load` does, for the first item that cannot
|
|
51
|
+
* be read (`not-found` for a `layerId` that neither the document nor an earlier item has);
|
|
52
|
+
* nothing is written then. `invalid-input` when `items` is not an array of objects
|
|
53
|
+
* with a `source`
|
|
54
|
+
*/
|
|
55
|
+
loadMany(items: readonly {
|
|
56
|
+
source: LoadSource;
|
|
57
|
+
options?: LoadOptions;
|
|
58
|
+
}[]): Promise<LoadResult[] | null>;
|
|
59
|
+
/** The whole document in the format of the library. */
|
|
60
|
+
toJSON(): DrawDocument;
|
|
61
|
+
/**
|
|
62
|
+
* The whole document as GeoJSON. The values of the library are kept in `properties` under
|
|
63
|
+
* the prefixed keys.
|
|
64
|
+
*/
|
|
65
|
+
toGeoJSON(): FeatureCollection;
|
|
66
|
+
}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `Draw`: the draw instance, its resources and the members that belong to no resource
|
|
3
|
+
*/
|
|
4
|
+
import type { Map as MaplibreMap } from 'maplibre-gl';
|
|
5
|
+
import type { DatasetsCollection } from './datasets.js';
|
|
6
|
+
import type { DocumentResource } from './document.js';
|
|
7
|
+
import type { DrawingResource } from './drawing.js';
|
|
8
|
+
import type { DrawEvents } from './events.js';
|
|
9
|
+
import type { StoreView, UpdateSource } from './extension/store.js';
|
|
10
|
+
import type { ExtensionsCollections } from './extensions.js';
|
|
11
|
+
import type { FeaturesCollection } from './features.js';
|
|
12
|
+
import type { GroupsCollection } from './groups.js';
|
|
13
|
+
import type { HiddenCollection } from './hidden.js';
|
|
14
|
+
import type { LayersCollection } from './layers.js';
|
|
15
|
+
import type { MetadataResource } from './metadata.js';
|
|
16
|
+
import type { DrawOptions, OptionsResource } from './options.js';
|
|
17
|
+
import type { SelectionResource, VertexSelectionResource } from './selection.js';
|
|
18
|
+
import type { LayerStackEntry, Mode, TerrainDiagnostics } from './state.js';
|
|
19
|
+
/** The options of {@link Draw.transact} */
|
|
20
|
+
export interface TransactOptions {
|
|
21
|
+
/** Where the writes come from; `'local'` when left out */
|
|
22
|
+
source?: UpdateSource;
|
|
23
|
+
/**
|
|
24
|
+
* Whether the writes ignore the locks of the features, groups and layers; read-only still
|
|
25
|
+
* refuses them. False when left out.
|
|
26
|
+
*/
|
|
27
|
+
ignoreLocks?: boolean;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* A draw instance on a map: the collections and resources of the document and of this
|
|
31
|
+
* client, and the members that belong to no resource.
|
|
32
|
+
*/
|
|
33
|
+
export interface Draw {
|
|
34
|
+
/** The features of the document */
|
|
35
|
+
readonly features: FeaturesCollection;
|
|
36
|
+
/** The layers of the document */
|
|
37
|
+
readonly layers: LayersCollection;
|
|
38
|
+
/** The groups of the document */
|
|
39
|
+
readonly groups: GroupsCollection;
|
|
40
|
+
/** The large data that is drawn but not edited, outside the document */
|
|
41
|
+
readonly datasets: DatasetsCollection;
|
|
42
|
+
/** What this client hides without changing the document */
|
|
43
|
+
readonly hidden: HiddenCollection;
|
|
44
|
+
/** What this client has selected */
|
|
45
|
+
readonly selection: SelectionResource;
|
|
46
|
+
/** The selected vertices of one feature in this client */
|
|
47
|
+
readonly vertexSelection: VertexSelectionResource;
|
|
48
|
+
/** The shape the current drawing mode is drawing, to drive it from code */
|
|
49
|
+
readonly drawing: DrawingResource;
|
|
50
|
+
/** The title and the description of the document */
|
|
51
|
+
readonly metadata: MetadataResource;
|
|
52
|
+
/** The options that can change while the instance runs */
|
|
53
|
+
readonly options: OptionsResource;
|
|
54
|
+
/** The whole document, to load and to write out */
|
|
55
|
+
readonly document: DocumentResource;
|
|
56
|
+
/** The plugins, modes, feature types, overlays and providers */
|
|
57
|
+
readonly extensions: ExtensionsCollections;
|
|
58
|
+
/** The map the instance draws on. */
|
|
59
|
+
getMap(): MaplibreMap;
|
|
60
|
+
/** The Store, to read the document and the state and to subscribe to their changes. */
|
|
61
|
+
getStore(): StoreView;
|
|
62
|
+
/** The current mode. */
|
|
63
|
+
getMode(): Mode;
|
|
64
|
+
/**
|
|
65
|
+
* Changes the mode.
|
|
66
|
+
*
|
|
67
|
+
* @returns False when the mode cannot be entered now
|
|
68
|
+
* @throws `DrawError` with the code `not-found` when there is no mode with this name
|
|
69
|
+
*/
|
|
70
|
+
setMode(mode: Mode): boolean;
|
|
71
|
+
/** Whether the document is read-only. */
|
|
72
|
+
isReadOnly(): boolean;
|
|
73
|
+
/** Turns read-only on or off. */
|
|
74
|
+
setReadOnly(value: boolean): void;
|
|
75
|
+
/** Whether the interaction lock is on. */
|
|
76
|
+
isInteractionLocked(): boolean;
|
|
77
|
+
/** Turns the interaction lock on or off. */
|
|
78
|
+
setInteractionLocked(value: boolean): void;
|
|
79
|
+
/**
|
|
80
|
+
* Runs `fn` as one transaction: its writes arrive as one `document.changed`.
|
|
81
|
+
*
|
|
82
|
+
* In nested calls the source of the outermost call wins. With `ignoreLocks`, the writes of
|
|
83
|
+
* `fn` through the resources of this instance ignore the locks of the features, groups and
|
|
84
|
+
* layers, as a change applied again from a record needs; read-only still refuses them, and
|
|
85
|
+
* what the user does with the pointer and the keys still respects the locks. A nested call
|
|
86
|
+
* inside such a call ignores them as well.
|
|
87
|
+
*
|
|
88
|
+
* @param options - `source` names where the writes come from; `ignoreLocks` lets them
|
|
89
|
+
* change locked features, groups and layers
|
|
90
|
+
* @returns What `fn` returns
|
|
91
|
+
*/
|
|
92
|
+
transact<T>(fn: () => T, options?: TransactOptions): T;
|
|
93
|
+
/**
|
|
94
|
+
* Subscribes to an event.
|
|
95
|
+
*
|
|
96
|
+
* @returns The function that unsubscribes
|
|
97
|
+
*/
|
|
98
|
+
on<K extends keyof DrawEvents>(event: K, listener: (payload: DrawEvents[K]) => void): () => void;
|
|
99
|
+
/** Unsubscribes from an event. */
|
|
100
|
+
off<K extends keyof DrawEvents>(event: K, listener: (payload: DrawEvents[K]) => void): void;
|
|
101
|
+
/**
|
|
102
|
+
* Subscribes to the next occurrence of an event only.
|
|
103
|
+
*
|
|
104
|
+
* @returns The function that unsubscribes before it occurs
|
|
105
|
+
*/
|
|
106
|
+
once<K extends keyof DrawEvents>(event: K, listener: (payload: DrawEvents[K]) => void): () => void;
|
|
107
|
+
/** Whether some drawing work has not finished yet. */
|
|
108
|
+
hasPendingWork(): boolean;
|
|
109
|
+
/** The divisions of the stacking order, one per run of layers. */
|
|
110
|
+
getLayerStack(): readonly LayerStackEntry[];
|
|
111
|
+
/** Diagnostics; their fields follow the drawing and carry a weaker promise. */
|
|
112
|
+
readonly debug: {
|
|
113
|
+
/** The state the terrain was drawn with. */
|
|
114
|
+
terrain(): TerrainDiagnostics;
|
|
115
|
+
};
|
|
116
|
+
/**
|
|
117
|
+
* Removes the instance from the map and releases everything it holds. A second call does
|
|
118
|
+
* nothing; every other method of the instance and of its collections then throws `DrawError`
|
|
119
|
+
* with the code `invalid-state` (`document.load` rejects with it).
|
|
120
|
+
*/
|
|
121
|
+
destroy(): void;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Puts a draw instance on a map and returns it.
|
|
125
|
+
*
|
|
126
|
+
* It can be called before, while or after the map loads. The layers are added on top of the map
|
|
127
|
+
* as soon as the style accepts them. After `setStyle`, with or without `diff`, they are on top
|
|
128
|
+
* again: added again after a full replacement, and moved above the layers of the new style after
|
|
129
|
+
* a diff. A layer added to the map later goes above them and stays there until the style changes.
|
|
130
|
+
* Unless `initDefaultLayer: false` is given, the document starts with one empty layer. Several
|
|
131
|
+
* instances can share a page, each on its own map.
|
|
132
|
+
*
|
|
133
|
+
* @param map - The map to draw on
|
|
134
|
+
* @param options - The options; every one can be omitted
|
|
135
|
+
* @returns The draw instance
|
|
136
|
+
*/
|
|
137
|
+
export declare function createDraw(map: MaplibreMap, options?: DrawOptions): Draw;
|
package/dist/api/draw.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
import { createDraw as createDrawInstance } from './impl/create-draw.js';
|
|
4
|
+
/**
|
|
5
|
+
* Puts a draw instance on a map and returns it.
|
|
6
|
+
*
|
|
7
|
+
* It can be called before, while or after the map loads. The layers are added on top of the map
|
|
8
|
+
* as soon as the style accepts them. After `setStyle`, with or without `diff`, they are on top
|
|
9
|
+
* again: added again after a full replacement, and moved above the layers of the new style after
|
|
10
|
+
* a diff. A layer added to the map later goes above them and stays there until the style changes.
|
|
11
|
+
* Unless `initDefaultLayer: false` is given, the document starts with one empty layer. Several
|
|
12
|
+
* instances can share a page, each on its own map.
|
|
13
|
+
*
|
|
14
|
+
* @param map - The map to draw on
|
|
15
|
+
* @param options - The options; every one can be omitted
|
|
16
|
+
* @returns The draw instance
|
|
17
|
+
*/
|
|
18
|
+
export function createDraw(map, options) {
|
|
19
|
+
return createDrawInstance(map, options);
|
|
20
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `draw.drawing`: the shape the current drawing mode is drawing, driven from outside the
|
|
3
|
+
* pointer and the keys
|
|
4
|
+
*/
|
|
5
|
+
import type { Position } from 'geojson';
|
|
6
|
+
/**
|
|
7
|
+
* The shape the current drawing mode is drawing, driven from code: to draw from typed
|
|
8
|
+
* coordinates, from another input device, or in an automated run.
|
|
9
|
+
*
|
|
10
|
+
* `addVertex`, `moveTo` and `finish` act as the input they stand for would: they are made into
|
|
11
|
+
* the same pointer and key events the map gives, at the point of the screen the position
|
|
12
|
+
* projects to, and go the same way as that input, through the `input` receivers of the plugins
|
|
13
|
+
* first and then to the mode. The position is used as it is: nothing snaps it, and the event
|
|
14
|
+
* carries it as its snapped position. A mode that ignores clicks, or a plugin that consumes
|
|
15
|
+
* them, ignores or consumes these as well.
|
|
16
|
+
*
|
|
17
|
+
* Extensions reach the same object as `ctx.drawing`.
|
|
18
|
+
*/
|
|
19
|
+
export interface DrawingResource {
|
|
20
|
+
/**
|
|
21
|
+
* Whether a drawing mode is drawing: a shape is in progress, or the mode is ready to place its
|
|
22
|
+
* first vertex (the current mode writes features).
|
|
23
|
+
*/
|
|
24
|
+
isActive(): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Whether a shape is in progress: the mode shows a shape that is not created yet. False
|
|
27
|
+
* while a drawing mode waits for its first vertex.
|
|
28
|
+
*/
|
|
29
|
+
isDrawing(): boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Places a vertex at a position, as a click there would: the pointer moves there, then
|
|
32
|
+
* clicks. It does not snap. What the click does is up to the mode: the point mode creates the
|
|
33
|
+
* point, and a click on the closing vertex of a line or an area finishes it. The position is
|
|
34
|
+
* exact, so the click tolerance of the pointer (10 px) does not apply: a vertex a few pixels
|
|
35
|
+
* from the last one is placed, and one near the closing vertex does not finish the shape.
|
|
36
|
+
* Only a position exactly equal to the closing vertex (the last vertex of a line, the first
|
|
37
|
+
* of an area) finishes it, and one exactly equal to the last vertex of an area is not placed
|
|
38
|
+
* again.
|
|
39
|
+
*
|
|
40
|
+
* @param position - The position, as `[longitude, latitude]` in degrees
|
|
41
|
+
* @returns True when the mode (or a plugin) took the click; false when no drawing mode is
|
|
42
|
+
* active or nothing took it
|
|
43
|
+
* @throws `DrawError` with the code `invalid-input` when the position is not two finite
|
|
44
|
+
* numbers
|
|
45
|
+
*/
|
|
46
|
+
addVertex(position: Position): boolean;
|
|
47
|
+
/**
|
|
48
|
+
* Moves the pointer to a position, as a pointer move there would: the preview of the shape
|
|
49
|
+
* follows it. It does not snap, and, as with `addVertex`, the position is exact. It does
|
|
50
|
+
* nothing when no drawing mode is active.
|
|
51
|
+
*
|
|
52
|
+
* @param position - The position, as `[longitude, latitude]` in degrees
|
|
53
|
+
* @throws `DrawError` with the code `invalid-input` when the position is not two finite
|
|
54
|
+
* numbers
|
|
55
|
+
*/
|
|
56
|
+
moveTo(position: Position): void;
|
|
57
|
+
/**
|
|
58
|
+
* Completes the shape in progress, as a double click on its last vertex or Enter would: the
|
|
59
|
+
* mode creates the feature from the vertices placed so far, as soon as there are enough of
|
|
60
|
+
* them (2 for a line, 3 for an area), wherever the last one is.
|
|
61
|
+
*
|
|
62
|
+
* @returns True when the shape was completed; false when no shape is in progress, or the mode
|
|
63
|
+
* did not complete it (too few vertices)
|
|
64
|
+
*/
|
|
65
|
+
finish(): boolean;
|
|
66
|
+
/**
|
|
67
|
+
* Cancels the shape in progress, as an Escape does while drawing: the mode drops it
|
|
68
|
+
* (`ModeHandler.onCancel`), the preview is cleared and the mode stays the current one. When
|
|
69
|
+
* no shape is in progress it does nothing; unlike an Escape, it does not leave the mode.
|
|
70
|
+
*
|
|
71
|
+
* @returns True when a shape was in progress and was cancelled
|
|
72
|
+
*/
|
|
73
|
+
cancel(): boolean;
|
|
74
|
+
/**
|
|
75
|
+
* Removes the last vertex of the shape in progress.
|
|
76
|
+
*
|
|
77
|
+
* @returns True when a vertex was removed; false when nothing is being drawn or the mode has
|
|
78
|
+
* no vertex to remove
|
|
79
|
+
*/
|
|
80
|
+
undoVertex(): boolean;
|
|
81
|
+
/**
|
|
82
|
+
* Puts back the vertex the last `undoVertex` removed.
|
|
83
|
+
*
|
|
84
|
+
* @returns True when a vertex was put back
|
|
85
|
+
*/
|
|
86
|
+
redoVertex(): boolean;
|
|
87
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The error thrown for a wrong argument
|
|
3
|
+
*
|
|
4
|
+
* A method throws it when an argument is wrong (an ID that does not exist, an input of the
|
|
5
|
+
* wrong shape) and changes nothing. A refusal because of the state (read-only, a lock) is not
|
|
6
|
+
* an error: the method returns `null` or `false` instead.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Why a {@link DrawError} was thrown.
|
|
10
|
+
*
|
|
11
|
+
* - `not-found`: an ID that does not exist
|
|
12
|
+
* - `already-exists`: an ID that is already taken
|
|
13
|
+
* - `invalid-input`: an input of the wrong shape or value
|
|
14
|
+
* - `unsupported-format`: a source that cannot be read
|
|
15
|
+
* - `invalid-state`: a call that is not possible in the current situation, such as deleting
|
|
16
|
+
* a feature while it is being drawn, or any call on an instance that was destroyed
|
|
17
|
+
*/
|
|
18
|
+
export type DrawErrorCode = 'not-found' | 'already-exists' | 'invalid-input' | 'unsupported-format' | 'invalid-state';
|
|
19
|
+
/**
|
|
20
|
+
* The error a method throws when an argument is wrong; the method has changed nothing.
|
|
21
|
+
*/
|
|
22
|
+
export declare class DrawError extends Error {
|
|
23
|
+
/** Why it was thrown */
|
|
24
|
+
readonly code: DrawErrorCode;
|
|
25
|
+
/** More about the cause, such as the ID that was not found */
|
|
26
|
+
readonly details?: unknown;
|
|
27
|
+
/**
|
|
28
|
+
* Creates the error
|
|
29
|
+
*
|
|
30
|
+
* @param code - Why it is thrown
|
|
31
|
+
* @param message - A description in English, for logs
|
|
32
|
+
* @param details - More about the cause
|
|
33
|
+
*/
|
|
34
|
+
constructor(code: DrawErrorCode, message: string, details?: unknown);
|
|
35
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
/**
|
|
4
|
+
* The error a method throws when an argument is wrong; the method has changed nothing.
|
|
5
|
+
*/
|
|
6
|
+
export class DrawError extends Error {
|
|
7
|
+
/**
|
|
8
|
+
* Creates the error
|
|
9
|
+
*
|
|
10
|
+
* @param code - Why it is thrown
|
|
11
|
+
* @param message - A description in English, for logs
|
|
12
|
+
* @param details - More about the cause
|
|
13
|
+
*/
|
|
14
|
+
constructor(code, message, details) {
|
|
15
|
+
super(message);
|
|
16
|
+
/** Why it was thrown */
|
|
17
|
+
Object.defineProperty(this, "code", {
|
|
18
|
+
enumerable: true,
|
|
19
|
+
configurable: true,
|
|
20
|
+
writable: true,
|
|
21
|
+
value: void 0
|
|
22
|
+
});
|
|
23
|
+
/** More about the cause, such as the ID that was not found */
|
|
24
|
+
Object.defineProperty(this, "details", {
|
|
25
|
+
enumerable: true,
|
|
26
|
+
configurable: true,
|
|
27
|
+
writable: true,
|
|
28
|
+
value: void 0
|
|
29
|
+
});
|
|
30
|
+
this.name = 'DrawError';
|
|
31
|
+
this.code = code;
|
|
32
|
+
if (details !== undefined)
|
|
33
|
+
this.details = details;
|
|
34
|
+
}
|
|
35
|
+
}
|