@sakuzu/maplibre-gl-draw 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +43 -0
- package/LICENSE +661 -0
- package/README.ja.md +248 -0
- package/README.md +255 -0
- package/THIRD_PARTY_NOTICES.md +275 -0
- package/dist/api/api.d.ts +1259 -0
- package/dist/api/api.js +86 -0
- package/dist/api/context.d.ts +173 -0
- package/dist/api/context.js +193 -0
- package/dist/api/display-api.d.ts +1 -0
- package/dist/api/display-api.js +23 -0
- package/dist/api/event-api.d.ts +13 -0
- package/dist/api/event-api.js +17 -0
- package/dist/api/extension-api.d.ts +46 -0
- package/dist/api/extension-api.js +85 -0
- package/dist/api/feature-api.d.ts +11 -0
- package/dist/api/feature-api.js +101 -0
- package/dist/api/geometry/apply.d.ts +51 -0
- package/dist/api/geometry/apply.js +114 -0
- package/dist/api/geometry/boolean.d.ts +28 -0
- package/dist/api/geometry/boolean.js +65 -0
- package/dist/api/geometry/buffer.d.ts +11 -0
- package/dist/api/geometry/buffer.js +105 -0
- package/dist/api/geometry/split.d.ts +16 -0
- package/dist/api/geometry/split.js +75 -0
- package/dist/api/geometry/targets.d.ts +76 -0
- package/dist/api/geometry/targets.js +158 -0
- package/dist/api/geometry/types.d.ts +31 -0
- package/dist/api/geometry/types.js +3 -0
- package/dist/api/geometry-operations.d.ts +162 -0
- package/dist/api/geometry-operations.js +94 -0
- package/dist/api/group-api.d.ts +10 -0
- package/dist/api/group-api.js +78 -0
- package/dist/api/import-export/constants.d.ts +29 -0
- package/dist/api/import-export/constants.js +40 -0
- package/dist/api/import-export/embedded-file.d.ts +13 -0
- package/dist/api/import-export/embedded-file.js +31 -0
- package/dist/api/import-export/file-name.d.ts +10 -0
- package/dist/api/import-export/file-name.js +20 -0
- package/dist/api/import-export/format-detection.d.ts +12 -0
- package/dist/api/import-export/format-detection.js +29 -0
- package/dist/api/import-export/geojson-export.d.ts +19 -0
- package/dist/api/import-export/geojson-export.js +262 -0
- package/dist/api/import-export/geojson-import.d.ts +34 -0
- package/dist/api/import-export/geojson-import.js +538 -0
- package/dist/api/import-export/geometry-validation.d.ts +20 -0
- package/dist/api/import-export/geometry-validation.js +107 -0
- package/dist/api/import-export/image-import.d.ts +12 -0
- package/dist/api/import-export/image-import.js +53 -0
- package/dist/api/import-export/index.d.ts +9 -0
- package/dist/api/import-export/index.js +107 -0
- package/dist/api/import-export/native-format.d.ts +15 -0
- package/dist/api/import-export/native-format.js +126 -0
- package/dist/api/import-export/native-validation.d.ts +28 -0
- package/dist/api/import-export/native-validation.js +212 -0
- package/dist/api/import-export/own-property.d.ts +10 -0
- package/dist/api/import-export/own-property.js +19 -0
- package/dist/api/import-export/style-validation.d.ts +27 -0
- package/dist/api/import-export/style-validation.js +49 -0
- package/dist/api/import-export/types.d.ts +26 -0
- package/dist/api/import-export/types.js +3 -0
- package/dist/api/index.d.ts +15 -0
- package/dist/api/index.js +3 -0
- package/dist/api/input-api.d.ts +158 -0
- package/dist/api/input-api.js +144 -0
- package/dist/api/instance-api.d.ts +38 -0
- package/dist/api/instance-api.js +136 -0
- package/dist/api/layer-api.d.ts +12 -0
- package/dist/api/layer-api.js +62 -0
- package/dist/api/selection-api.d.ts +7 -0
- package/dist/api/selection-api.js +78 -0
- package/dist/api/snapping-api.d.ts +125 -0
- package/dist/api/snapping-api.js +50 -0
- package/dist/api/topology-api.d.ts +30 -0
- package/dist/api/topology-api.js +16 -0
- package/dist/api/tracing-api.d.ts +31 -0
- package/dist/api/tracing-api.js +16 -0
- package/dist/dispatcher/hit-test/box-strategies.d.ts +19 -0
- package/dist/dispatcher/hit-test/box-strategies.js +275 -0
- package/dist/dispatcher/hit-test/box-strategy.d.ts +59 -0
- package/dist/dispatcher/hit-test/box-strategy.js +37 -0
- package/dist/dispatcher/hit-test/globe-shape.d.ts +46 -0
- package/dist/dispatcher/hit-test/globe-shape.js +70 -0
- package/dist/dispatcher/hit-test/index.d.ts +14 -0
- package/dist/dispatcher/hit-test/index.js +9 -0
- package/dist/dispatcher/hit-test/local-frame.d.ts +77 -0
- package/dist/dispatcher/hit-test/local-frame.js +112 -0
- package/dist/dispatcher/hit-test/segment-grid.d.ts +32 -0
- package/dist/dispatcher/hit-test/segment-grid.js +79 -0
- package/dist/dispatcher/hit-test/service.d.ts +120 -0
- package/dist/dispatcher/hit-test/service.js +333 -0
- package/dist/dispatcher/hit-test/strategies/base.d.ts +136 -0
- package/dist/dispatcher/hit-test/strategies/base.js +66 -0
- package/dist/dispatcher/hit-test/strategies/circle.d.ts +10 -0
- package/dist/dispatcher/hit-test/strategies/circle.js +56 -0
- package/dist/dispatcher/hit-test/strategies/image.d.ts +22 -0
- package/dist/dispatcher/hit-test/strategies/image.js +115 -0
- package/dist/dispatcher/hit-test/strategies/index.d.ts +11 -0
- package/dist/dispatcher/hit-test/strategies/index.js +10 -0
- package/dist/dispatcher/hit-test/strategies/line.d.ts +17 -0
- package/dist/dispatcher/hit-test/strategies/line.js +30 -0
- package/dist/dispatcher/hit-test/strategies/multi.d.ts +44 -0
- package/dist/dispatcher/hit-test/strategies/multi.js +141 -0
- package/dist/dispatcher/hit-test/strategies/point.d.ts +20 -0
- package/dist/dispatcher/hit-test/strategies/point.js +29 -0
- package/dist/dispatcher/hit-test/strategies/polygon.d.ts +52 -0
- package/dist/dispatcher/hit-test/strategies/polygon.js +138 -0
- package/dist/dispatcher/hit-test/topmost.d.ts +48 -0
- package/dist/dispatcher/hit-test/topmost.js +157 -0
- package/dist/dispatcher/hit-test/visibility-lookup.d.ts +23 -0
- package/dist/dispatcher/hit-test/visibility-lookup.js +40 -0
- package/dist/dispatcher/index.d.ts +15 -0
- package/dist/dispatcher/index.js +3 -0
- package/dist/dispatcher/input-router.d.ts +1 -0
- package/dist/dispatcher/input-router.js +288 -0
- package/dist/dispatcher/normalizer.d.ts +1 -0
- package/dist/dispatcher/normalizer.js +513 -0
- package/dist/dispatcher/types.d.ts +144 -0
- package/dist/dispatcher/types.js +15 -0
- package/dist/display/chunk-set.d.ts +24 -0
- package/dist/display/chunk-set.js +533 -0
- package/dist/display/chunk.d.ts +1 -0
- package/dist/display/chunk.js +104 -0
- package/dist/display/columnar/index.d.ts +12 -0
- package/dist/display/columnar/index.js +13 -0
- package/dist/display/columnar/prepare.d.ts +42 -0
- package/dist/display/columnar/prepare.js +116 -0
- package/dist/display/columnar/source.d.ts +1 -0
- package/dist/display/columnar/source.js +531 -0
- package/dist/display/columnar/table.d.ts +1 -0
- package/dist/display/columnar/table.js +471 -0
- package/dist/display/columnar/types.d.ts +223 -0
- package/dist/display/columnar/types.js +3 -0
- package/dist/display/dataset.d.ts +2 -0
- package/dist/display/dataset.js +891 -0
- package/dist/display/index.d.ts +13 -0
- package/dist/display/index.js +3 -0
- package/dist/display/interaction.d.ts +1 -0
- package/dist/display/interaction.js +90 -0
- package/dist/display/manager.d.ts +1 -0
- package/dist/display/manager.js +440 -0
- package/dist/display/packed-rtree.d.ts +1 -0
- package/dist/display/packed-rtree.js +244 -0
- package/dist/display/partition.d.ts +1 -0
- package/dist/display/partition.js +226 -0
- package/dist/display/provider.d.ts +1 -0
- package/dist/display/provider.js +342 -0
- package/dist/display/retained.d.ts +40 -0
- package/dist/display/retained.js +898 -0
- package/dist/display/selection.d.ts +13 -0
- package/dist/display/selection.js +226 -0
- package/dist/display/source.d.ts +1 -0
- package/dist/display/source.js +119 -0
- package/dist/display/spatial.d.ts +1 -0
- package/dist/display/spatial.js +71 -0
- package/dist/display/style.d.ts +1 -0
- package/dist/display/style.js +126 -0
- package/dist/display/thinning.d.ts +65 -0
- package/dist/display/thinning.js +910 -0
- package/dist/display/triangulation.d.ts +1 -0
- package/dist/display/triangulation.js +0 -0
- package/dist/display/types.d.ts +561 -0
- package/dist/display/types.js +43 -0
- package/dist/extension/feature-handler.d.ts +182 -0
- package/dist/extension/feature-handler.js +3 -0
- package/dist/extension/index.d.ts +9 -0
- package/dist/extension/index.js +3 -0
- package/dist/extension/renderers.d.ts +208 -0
- package/dist/extension/renderers.js +3 -0
- package/dist/geometry/angle.d.ts +47 -0
- package/dist/geometry/angle.js +44 -0
- package/dist/geometry/bbox.d.ts +48 -0
- package/dist/geometry/bbox.js +83 -0
- package/dist/geometry/boolean.d.ts +162 -0
- package/dist/geometry/boolean.js +331 -0
- package/dist/geometry/buffer.d.ts +72 -0
- package/dist/geometry/buffer.js +218 -0
- package/dist/geometry/circle.d.ts +55 -0
- package/dist/geometry/circle.js +107 -0
- package/dist/geometry/coords.d.ts +97 -0
- package/dist/geometry/coords.js +149 -0
- package/dist/geometry/distance.d.ts +79 -0
- package/dist/geometry/distance.js +111 -0
- package/dist/geometry/errors.d.ts +74 -0
- package/dist/geometry/errors.js +104 -0
- package/dist/geometry/index.d.ts +28 -0
- package/dist/geometry/index.js +38 -0
- package/dist/geometry/measure.d.ts +81 -0
- package/dist/geometry/measure.js +236 -0
- package/dist/geometry/predicates.d.ts +62 -0
- package/dist/geometry/predicates.js +132 -0
- package/dist/geometry/simplify.d.ts +74 -0
- package/dist/geometry/simplify.js +159 -0
- package/dist/geometry/split.d.ts +68 -0
- package/dist/geometry/split.js +430 -0
- package/dist/geometry/types.d.ts +95 -0
- package/dist/geometry/types.js +3 -0
- package/dist/geometry/units.d.ts +35 -0
- package/dist/geometry/units.js +41 -0
- package/dist/index.d.ts +72 -0
- package/dist/index.js +20 -0
- package/dist/maplibre-gl-draw.d.ts +47 -0
- package/dist/maplibre-gl-draw.js +407 -0
- package/dist/messages.d.ts +64 -0
- package/dist/messages.js +36 -0
- package/dist/modes/cursor.d.ts +1 -0
- package/dist/modes/cursor.js +72 -0
- package/dist/modes/draw/circle.d.ts +1 -0
- package/dist/modes/draw/circle.js +222 -0
- package/dist/modes/draw/commit-layer.d.ts +26 -0
- package/dist/modes/draw/commit-layer.js +31 -0
- package/dist/modes/draw/freehand.d.ts +1 -0
- package/dist/modes/draw/freehand.js +264 -0
- package/dist/modes/draw/image.d.ts +1 -0
- package/dist/modes/draw/image.js +60 -0
- package/dist/modes/draw/index.d.ts +9 -0
- package/dist/modes/draw/index.js +11 -0
- package/dist/modes/draw/line.d.ts +1 -0
- package/dist/modes/draw/line.js +363 -0
- package/dist/modes/draw/point.d.ts +1 -0
- package/dist/modes/draw/point.js +87 -0
- package/dist/modes/draw/polygon.d.ts +1 -0
- package/dist/modes/draw/polygon.js +378 -0
- package/dist/modes/draw/trace-support.d.ts +79 -0
- package/dist/modes/draw/trace-support.js +161 -0
- package/dist/modes/handler.d.ts +285 -0
- package/dist/modes/handler.js +3 -0
- package/dist/modes/index.d.ts +7 -0
- package/dist/modes/index.js +3 -0
- package/dist/modes/manager.d.ts +15 -0
- package/dist/modes/manager.js +196 -0
- package/dist/modes/select/box-selection.d.ts +52 -0
- package/dist/modes/select/box-selection.js +140 -0
- package/dist/modes/select/click-handler.d.ts +32 -0
- package/dist/modes/select/click-handler.js +166 -0
- package/dist/modes/select/cursor-handler.d.ts +15 -0
- package/dist/modes/select/cursor-handler.js +59 -0
- package/dist/modes/select/drag/auxiliary.d.ts +26 -0
- package/dist/modes/select/drag/auxiliary.js +56 -0
- package/dist/modes/select/drag/intermediate-writes.d.ts +1 -0
- package/dist/modes/select/drag/intermediate-writes.js +171 -0
- package/dist/modes/select/drag/move.d.ts +24 -0
- package/dist/modes/select/drag/move.js +59 -0
- package/dist/modes/select/drag/operation.d.ts +30 -0
- package/dist/modes/select/drag/operation.js +18 -0
- package/dist/modes/select/drag/radius.d.ts +15 -0
- package/dist/modes/select/drag/radius.js +49 -0
- package/dist/modes/select/drag/transform.d.ts +17 -0
- package/dist/modes/select/drag/transform.js +155 -0
- package/dist/modes/select/drag/vertex.d.ts +17 -0
- package/dist/modes/select/drag/vertex.js +163 -0
- package/dist/modes/select/drag-handler.d.ts +1 -0
- package/dist/modes/select/drag-handler.js +254 -0
- package/dist/modes/select/hit-helpers.d.ts +40 -0
- package/dist/modes/select/hit-helpers.js +51 -0
- package/dist/modes/select/mode.d.ts +1 -0
- package/dist/modes/select/mode.js +397 -0
- package/dist/modes/select/shortcut-handler.d.ts +40 -0
- package/dist/modes/select/shortcut-handler.js +128 -0
- package/dist/operations/index.d.ts +9 -0
- package/dist/operations/index.js +3 -0
- package/dist/operations/layer-operations.d.ts +1 -0
- package/dist/operations/layer-operations.js +350 -0
- package/dist/operations/resize.d.ts +71 -0
- package/dist/operations/resize.js +252 -0
- package/dist/operations/rotate.d.ts +17 -0
- package/dist/operations/rotate.js +166 -0
- package/dist/operations/selection-operations.d.ts +20 -0
- package/dist/operations/selection-operations.js +159 -0
- package/dist/operations/shared-vertex.d.ts +1 -0
- package/dist/operations/shared-vertex.js +210 -0
- package/dist/operations/trace-graph.d.ts +96 -0
- package/dist/operations/trace-graph.js +283 -0
- package/dist/operations/vertex.d.ts +1 -0
- package/dist/operations/vertex.js +538 -0
- package/dist/plugins/index.d.ts +10 -0
- package/dist/plugins/index.js +3 -0
- package/dist/plugins/mutation-hooks.d.ts +28 -0
- package/dist/plugins/mutation-hooks.js +84 -0
- package/dist/plugins/plugin-context.d.ts +1 -0
- package/dist/plugins/plugin-context.js +367 -0
- package/dist/plugins/plugin-manager.d.ts +103 -0
- package/dist/plugins/plugin-manager.js +316 -0
- package/dist/plugins/plugin.d.ts +529 -0
- package/dist/plugins/plugin.js +3 -0
- package/dist/shared/config/constants.d.ts +66 -0
- package/dist/shared/config/constants.js +60 -0
- package/dist/shared/config/feature-style.d.ts +155 -0
- package/dist/shared/config/feature-style.js +154 -0
- package/dist/shared/config/index.d.ts +17 -0
- package/dist/shared/config/index.js +8 -0
- package/dist/shared/config/rendering.d.ts +107 -0
- package/dist/shared/config/rendering.js +33 -0
- package/dist/shared/config/selection-highlight.d.ts +29 -0
- package/dist/shared/config/selection-highlight.js +35 -0
- package/dist/shared/config/selection.d.ts +273 -0
- package/dist/shared/config/selection.js +266 -0
- package/dist/shared/config/topology.d.ts +33 -0
- package/dist/shared/config/topology.js +17 -0
- package/dist/shared/config/trace.d.ts +40 -0
- package/dist/shared/config/trace.js +17 -0
- package/dist/shared/math/angle.d.ts +21 -0
- package/dist/shared/math/angle.js +34 -0
- package/dist/shared/math/circle.d.ts +6 -0
- package/dist/shared/math/circle.js +10 -0
- package/dist/shared/math/constants.d.ts +48 -0
- package/dist/shared/math/constants.js +59 -0
- package/dist/shared/math/distance.d.ts +78 -0
- package/dist/shared/math/distance.js +147 -0
- package/dist/shared/math/globe-subdivision.d.ts +62 -0
- package/dist/shared/math/globe-subdivision.js +99 -0
- package/dist/shared/math/index.d.ts +17 -0
- package/dist/shared/math/index.js +21 -0
- package/dist/shared/math/intersection.d.ts +63 -0
- package/dist/shared/math/intersection.js +236 -0
- package/dist/shared/math/longitude.d.ts +20 -0
- package/dist/shared/math/longitude.js +31 -0
- package/dist/shared/math/mercator-plane.d.ts +27 -0
- package/dist/shared/math/mercator-plane.js +26 -0
- package/dist/shared/math/obb.d.ts +65 -0
- package/dist/shared/math/obb.js +107 -0
- package/dist/shared/math/rotation.d.ts +93 -0
- package/dist/shared/math/rotation.js +186 -0
- package/dist/shared/math/segment-grid.d.ts +69 -0
- package/dist/shared/math/segment-grid.js +159 -0
- package/dist/shared/math/transform.d.ts +140 -0
- package/dist/shared/math/transform.js +189 -0
- package/dist/shared/types/events.d.ts +128 -0
- package/dist/shared/types/events.js +3 -0
- package/dist/shared/types/model.d.ts +950 -0
- package/dist/shared/types/model.js +3 -0
- package/dist/shared/types/selection-box.d.ts +23 -0
- package/dist/shared/types/selection-box.js +3 -0
- package/dist/shared/types/style.d.ts +68 -0
- package/dist/shared/types/style.js +3 -0
- package/dist/shared/utils/color.d.ts +49 -0
- package/dist/shared/utils/color.js +180 -0
- package/dist/shared/utils/coordinates.d.ts +52 -0
- package/dist/shared/utils/coordinates.js +75 -0
- package/dist/shared/utils/embedded-image.d.ts +34 -0
- package/dist/shared/utils/embedded-image.js +161 -0
- package/dist/shared/utils/event-emitter.d.ts +262 -0
- package/dist/shared/utils/event-emitter.js +44 -0
- package/dist/shared/utils/feature-bbox.d.ts +8 -0
- package/dist/shared/utils/feature-bbox.js +207 -0
- package/dist/shared/utils/feature-segments.d.ts +23 -0
- package/dist/shared/utils/feature-segments.js +179 -0
- package/dist/shared/utils/id.d.ts +1 -0
- package/dist/shared/utils/id.js +35 -0
- package/dist/shared/utils/image.d.ts +34 -0
- package/dist/shared/utils/image.js +106 -0
- package/dist/shared/utils/index.d.ts +15 -0
- package/dist/shared/utils/index.js +24 -0
- package/dist/shared/utils/map.d.ts +26 -0
- package/dist/shared/utils/map.js +35 -0
- package/dist/shared/utils/name-generator.d.ts +197 -0
- package/dist/shared/utils/name-generator.js +337 -0
- package/dist/shared/utils/pixel-ratio.d.ts +111 -0
- package/dist/shared/utils/pixel-ratio.js +85 -0
- package/dist/shared/utils/property.d.ts +88 -0
- package/dist/shared/utils/property.js +140 -0
- package/dist/shared/utils/vertex-ref.d.ts +23 -0
- package/dist/shared/utils/vertex-ref.js +20 -0
- package/dist/snapping/custom-targets.d.ts +1 -0
- package/dist/snapping/custom-targets.js +21 -0
- package/dist/snapping/geometry.d.ts +1 -0
- package/dist/snapping/geometry.js +61 -0
- package/dist/snapping/index.d.ts +14 -0
- package/dist/snapping/index.js +4 -0
- package/dist/snapping/indicator.d.ts +19 -0
- package/dist/snapping/indicator.js +145 -0
- package/dist/snapping/providers/display.d.ts +72 -0
- package/dist/snapping/providers/display.js +268 -0
- package/dist/snapping/providers/guide.d.ts +69 -0
- package/dist/snapping/providers/guide.js +187 -0
- package/dist/snapping/providers/intersection.d.ts +1 -0
- package/dist/snapping/providers/intersection.js +92 -0
- package/dist/snapping/providers/shared.d.ts +39 -0
- package/dist/snapping/providers/shared.js +146 -0
- package/dist/snapping/providers/store.d.ts +1 -0
- package/dist/snapping/providers/store.js +132 -0
- package/dist/snapping/service.d.ts +1 -0
- package/dist/snapping/service.js +272 -0
- package/dist/snapping/types.d.ts +267 -0
- package/dist/snapping/types.js +66 -0
- package/dist/store/change-merger.d.ts +1 -0
- package/dist/store/change-merger.js +102 -0
- package/dist/store/draw-store.d.ts +1 -0
- package/dist/store/draw-store.js +396 -0
- package/dist/store/event-bridge.d.ts +1 -0
- package/dist/store/event-bridge.js +161 -0
- package/dist/store/index.d.ts +12 -0
- package/dist/store/index.js +4 -0
- package/dist/store/local-visibility.d.ts +21 -0
- package/dist/store/local-visibility.js +27 -0
- package/dist/store/lock.d.ts +67 -0
- package/dist/store/lock.js +54 -0
- package/dist/store/memory/change-bus.d.ts +60 -0
- package/dist/store/memory/change-bus.js +232 -0
- package/dist/store/memory/file-store.d.ts +15 -0
- package/dist/store/memory/file-store.js +33 -0
- package/dist/store/memory/frozen.d.ts +21 -0
- package/dist/store/memory/frozen.js +51 -0
- package/dist/store/memory/ui-state.d.ts +51 -0
- package/dist/store/memory/ui-state.js +223 -0
- package/dist/store/memory.d.ts +26 -0
- package/dist/store/memory.js +708 -0
- package/dist/store/spatial/index.d.ts +6 -0
- package/dist/store/spatial/index.js +4 -0
- package/dist/store/spatial/spatial-index.d.ts +90 -0
- package/dist/store/spatial/spatial-index.js +148 -0
- package/dist/store/spatial/store-spatial-index.d.ts +60 -0
- package/dist/store/spatial/store-spatial-index.js +125 -0
- package/dist/store/store.d.ts +417 -0
- package/dist/store/store.js +3 -0
- package/dist/store/types.d.ts +8 -0
- package/dist/store/types.js +3 -0
- package/dist/store/writable-layer.d.ts +35 -0
- package/dist/store/writable-layer.js +20 -0
- package/dist/view/cache/buffer.d.ts +28 -0
- package/dist/view/cache/buffer.js +176 -0
- package/dist/view/cache/earcut.d.ts +1 -0
- package/dist/view/cache/earcut.js +122 -0
- package/dist/view/cache/style-rule.d.ts +1 -0
- package/dist/view/cache/style-rule.js +97 -0
- package/dist/view/cache/terrain-fill.d.ts +30 -0
- package/dist/view/cache/terrain-fill.js +60 -0
- package/dist/view/cache/texture.d.ts +14 -0
- package/dist/view/cache/texture.js +292 -0
- package/dist/view/coordinator.d.ts +27 -0
- package/dist/view/coordinator.js +72 -0
- package/dist/view/feature-companion.d.ts +173 -0
- package/dist/view/feature-companion.js +108 -0
- package/dist/view/globe-subdivision.d.ts +78 -0
- package/dist/view/globe-subdivision.js +128 -0
- package/dist/view/index.d.ts +47 -0
- package/dist/view/index.js +20 -0
- package/dist/view/layer/attach.d.ts +20 -0
- package/dist/view/layer/attach.js +47 -0
- package/dist/view/layer/blend.d.ts +57 -0
- package/dist/view/layer/blend.js +14 -0
- package/dist/view/layer/custom-layer.d.ts +1 -0
- package/dist/view/layer/custom-layer.js +509 -0
- package/dist/view/layer/depth-state.d.ts +14 -0
- package/dist/view/layer/depth-state.js +44 -0
- package/dist/view/layer/display-list.d.ts +1 -0
- package/dist/view/layer/display-list.js +111 -0
- package/dist/view/layer/drape-planner.d.ts +139 -0
- package/dist/view/layer/drape-planner.js +726 -0
- package/dist/view/layer/frame-render.d.ts +57 -0
- package/dist/view/layer/frame-render.js +209 -0
- package/dist/view/layer/frame-state.d.ts +147 -0
- package/dist/view/layer/frame-state.js +484 -0
- package/dist/view/layer/gl-state.d.ts +77 -0
- package/dist/view/layer/gl-state.js +132 -0
- package/dist/view/layer/index.d.ts +6 -0
- package/dist/view/layer/index.js +5 -0
- package/dist/view/layer/render-scope.d.ts +30 -0
- package/dist/view/layer/render-scope.js +28 -0
- package/dist/view/layer/render.d.ts +87 -0
- package/dist/view/layer/render.js +187 -0
- package/dist/view/layer/renderers.d.ts +81 -0
- package/dist/view/layer/renderers.js +142 -0
- package/dist/view/layer/slot-manager.d.ts +26 -0
- package/dist/view/layer/slot-manager.js +133 -0
- package/dist/view/layer/slots.d.ts +33 -0
- package/dist/view/layer/slots.js +50 -0
- package/dist/view/layer/store-retained-bbox.d.ts +36 -0
- package/dist/view/layer/store-retained-bbox.js +188 -0
- package/dist/view/layer/store-retained-chunk.d.ts +97 -0
- package/dist/view/layer/store-retained-chunk.js +94 -0
- package/dist/view/layer/store-retained-classify.d.ts +34 -0
- package/dist/view/layer/store-retained-classify.js +88 -0
- package/dist/view/layer/store-retained-collect.d.ts +24 -0
- package/dist/view/layer/store-retained-collect.js +121 -0
- package/dist/view/layer/store-retained-coord-patch.d.ts +119 -0
- package/dist/view/layer/store-retained-coord-patch.js +168 -0
- package/dist/view/layer/store-retained-immediate.d.ts +63 -0
- package/dist/view/layer/store-retained-immediate.js +49 -0
- package/dist/view/layer/store-retained-invalidation.d.ts +96 -0
- package/dist/view/layer/store-retained-invalidation.js +192 -0
- package/dist/view/layer/store-retained.d.ts +198 -0
- package/dist/view/layer/store-retained.js +430 -0
- package/dist/view/layer/terrain-resolver.d.ts +1 -0
- package/dist/view/layer/terrain-resolver.js +174 -0
- package/dist/view/renderers/batch-manager.d.ts +61 -0
- package/dist/view/renderers/batch-manager.js +718 -0
- package/dist/view/renderers/draw-factors.d.ts +60 -0
- package/dist/view/renderers/draw-factors.js +35 -0
- package/dist/view/renderers/drawer.d.ts +1 -0
- package/dist/view/renderers/drawer.js +346 -0
- package/dist/view/renderers/image.d.ts +1 -0
- package/dist/view/renderers/image.js +255 -0
- package/dist/view/renderers/line/dash.d.ts +31 -0
- package/dist/view/renderers/line/dash.js +152 -0
- package/dist/view/renderers/line/line-geometry.d.ts +39 -0
- package/dist/view/renderers/line/line-geometry.js +460 -0
- package/dist/view/renderers/line/line-gl.d.ts +1 -0
- package/dist/view/renderers/line/line-gl.js +236 -0
- package/dist/view/renderers/line/line-shader.d.ts +1 -0
- package/dist/view/renderers/line/line-shader.js +364 -0
- package/dist/view/renderers/line/line-types.d.ts +43 -0
- package/dist/view/renderers/line/line-types.js +3 -0
- package/dist/view/renderers/line/line-uniforms.d.ts +1 -0
- package/dist/view/renderers/line/line-uniforms.js +390 -0
- package/dist/view/renderers/line/sdf-line.d.ts +92 -0
- package/dist/view/renderers/line/sdf-line.js +567 -0
- package/dist/view/renderers/point/billboard-depth.d.ts +10 -0
- package/dist/view/renderers/point/billboard-depth.js +56 -0
- package/dist/view/renderers/point/point-instance.d.ts +124 -0
- package/dist/view/renderers/point/point-instance.js +738 -0
- package/dist/view/renderers/point/point-sdf.d.ts +58 -0
- package/dist/view/renderers/point/point-sdf.js +170 -0
- package/dist/view/renderers/point/point-shape.d.ts +99 -0
- package/dist/view/renderers/point/point-shape.js +504 -0
- package/dist/view/renderers/point/point-style.d.ts +1 -0
- package/dist/view/renderers/point/point-style.js +46 -0
- package/dist/view/renderers/polygon/batch.d.ts +26 -0
- package/dist/view/renderers/polygon/batch.js +336 -0
- package/dist/view/renderers/polygon/earcut-input.d.ts +37 -0
- package/dist/view/renderers/polygon/earcut-input.js +55 -0
- package/dist/view/renderers/polygon/earcut-sliced.d.ts +69 -0
- package/dist/view/renderers/polygon/earcut-sliced.js +960 -0
- package/dist/view/renderers/polygon/fill.d.ts +74 -0
- package/dist/view/renderers/polygon/fill.js +251 -0
- package/dist/view/renderers/polygon/sdf-polygon.d.ts +62 -0
- package/dist/view/renderers/polygon/sdf-polygon.js +919 -0
- package/dist/view/renderers/polygon/terrain-cull.d.ts +3 -0
- package/dist/view/renderers/polygon/terrain-cull.js +14 -0
- package/dist/view/renderers/polygon/triangulator.d.ts +41 -0
- package/dist/view/renderers/polygon/triangulator.js +3 -0
- package/dist/view/renderers/retained.d.ts +43 -0
- package/dist/view/renderers/retained.js +3 -0
- package/dist/view/renderers/stroke.d.ts +121 -0
- package/dist/view/renderers/stroke.js +621 -0
- package/dist/view/shaders/frame.d.ts +8 -0
- package/dist/view/shaders/frame.js +37 -0
- package/dist/view/shaders/helpers.d.ts +238 -0
- package/dist/view/shaders/helpers.js +611 -0
- package/dist/view/shaders/initializer.d.ts +27 -0
- package/dist/view/shaders/initializer.js +125 -0
- package/dist/view/shaders/projection.d.ts +123 -0
- package/dist/view/shaders/projection.js +299 -0
- package/dist/view/shaders/quad-grid.d.ts +77 -0
- package/dist/view/shaders/quad-grid.js +128 -0
- package/dist/view/shaders/quad.d.ts +189 -0
- package/dist/view/shaders/quad.js +582 -0
- package/dist/view/shaders/retained-origin.d.ts +50 -0
- package/dist/view/shaders/retained-origin.js +67 -0
- package/dist/view/shaders/terrain-shade.d.ts +23 -0
- package/dist/view/shaders/terrain-shade.js +93 -0
- package/dist/view/style-rule.d.ts +166 -0
- package/dist/view/style-rule.js +300 -0
- package/dist/view/terrain/anchor.d.ts +135 -0
- package/dist/view/terrain/anchor.js +226 -0
- package/dist/view/terrain/context.d.ts +132 -0
- package/dist/view/terrain/context.js +437 -0
- package/dist/view/terrain/dem-atlas.d.ts +97 -0
- package/dist/view/terrain/dem-atlas.js +534 -0
- package/dist/view/terrain/detect.d.ts +126 -0
- package/dist/view/terrain/detect.js +198 -0
- package/dist/view/terrain/drape/bin-store.d.ts +179 -0
- package/dist/view/terrain/drape/bin-store.js +529 -0
- package/dist/view/terrain/drape/binning.d.ts +259 -0
- package/dist/view/terrain/drape/binning.js +604 -0
- package/dist/view/terrain/drape/edge-constrain.d.ts +37 -0
- package/dist/view/terrain/drape/edge-constrain.js +175 -0
- package/dist/view/terrain/drape/geometry.d.ts +95 -0
- package/dist/view/terrain/drape/geometry.js +260 -0
- package/dist/view/terrain/drape/mesh.d.ts +50 -0
- package/dist/view/terrain/drape/mesh.js +86 -0
- package/dist/view/terrain/drape/pass.d.ts +122 -0
- package/dist/view/terrain/drape/pass.js +379 -0
- package/dist/view/terrain/drape/quad-glyphs.d.ts +64 -0
- package/dist/view/terrain/drape/quad-glyphs.js +117 -0
- package/dist/view/terrain/drape/quad.d.ts +249 -0
- package/dist/view/terrain/drape/quad.js +835 -0
- package/dist/view/terrain/drape/renderer.d.ts +184 -0
- package/dist/view/terrain/drape/renderer.js +706 -0
- package/dist/view/terrain/drape/shared.d.ts +80 -0
- package/dist/view/terrain/drape/shared.js +173 -0
- package/dist/view/terrain/drape/stitch.d.ts +155 -0
- package/dist/view/terrain/drape/stitch.js +228 -0
- package/dist/view/terrain/ground.d.ts +72 -0
- package/dist/view/terrain/ground.js +151 -0
- package/dist/view/terrain/metrics.d.ts +180 -0
- package/dist/view/terrain/metrics.js +231 -0
- package/dist/view/terrain/occlusion.d.ts +11 -0
- package/dist/view/terrain/occlusion.js +129 -0
- package/dist/view/terrain/polygon.d.ts +86 -0
- package/dist/view/terrain/polygon.js +301 -0
- package/dist/view/terrain/shade.d.ts +48 -0
- package/dist/view/terrain/shade.js +45 -0
- package/dist/view/terrain/state.d.ts +99 -0
- package/dist/view/terrain/state.js +186 -0
- package/dist/view/terrain/tessellation.d.ts +265 -0
- package/dist/view/terrain/tessellation.js +924 -0
- package/dist/view/terrain/tiling.d.ts +56 -0
- package/dist/view/terrain/tiling.js +155 -0
- package/dist/view/terrain/upstream-terrain.d.ts +82 -0
- package/dist/view/terrain/upstream-terrain.js +116 -0
- package/dist/view/ui/auxiliary-handles.d.ts +151 -0
- package/dist/view/ui/auxiliary-handles.js +22 -0
- package/dist/view/ui/bounds.d.ts +53 -0
- package/dist/view/ui/bounds.js +149 -0
- package/dist/view/ui/box-selection.d.ts +1 -0
- package/dist/view/ui/box-selection.js +83 -0
- package/dist/view/ui/handle-test.d.ts +1 -0
- package/dist/view/ui/handle-test.js +437 -0
- package/dist/view/ui/handle-thinning.d.ts +122 -0
- package/dist/view/ui/handle-thinning.js +430 -0
- package/dist/view/ui/handles.d.ts +25 -0
- package/dist/view/ui/handles.js +673 -0
- package/dist/view/ui/helper.d.ts +19 -0
- package/dist/view/ui/helper.js +76 -0
- package/dist/view/ui/index.d.ts +15 -0
- package/dist/view/ui/index.js +15 -0
- package/dist/view/ui/selection-scope.d.ts +25 -0
- package/dist/view/ui/selection-scope.js +34 -0
- package/dist/view/ui/selection-ui/bounding-box.d.ts +44 -0
- package/dist/view/ui/selection-ui/bounding-box.js +240 -0
- package/dist/view/ui/selection-ui/extension-registry.d.ts +76 -0
- package/dist/view/ui/selection-ui/extension-registry.js +78 -0
- package/dist/view/ui/selection-ui/index.d.ts +12 -0
- package/dist/view/ui/selection-ui/index.js +12 -0
- package/dist/view/ui/selection-ui/renderer.d.ts +29 -0
- package/dist/view/ui/selection-ui/renderer.js +227 -0
- package/dist/view/ui/selection-ui/types.d.ts +55 -0
- package/dist/view/ui/selection-ui/types.js +3 -0
- package/dist/view/ui/selection-ui-drawer.d.ts +52 -0
- package/dist/view/ui/selection-ui-drawer.js +329 -0
- package/dist/view/ui/tentative.d.ts +1 -0
- package/dist/view/ui/tentative.js +320 -0
- package/dist/view/viewport.d.ts +119 -0
- package/dist/view/viewport.js +254 -0
- package/package.json +113 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MapLibre GL Draw - public entry point
|
|
3
|
+
*
|
|
4
|
+
* The caller accesses the whole public API through the single entry
|
|
5
|
+
* `import { ... } from '@sakuzu/maplibre-gl-draw'` (plus the pure geometry functions of
|
|
6
|
+
* `@sakuzu/maplibre-gl-draw/geometry`). Tree-shaking is applied by the ESM bundler, which
|
|
7
|
+
* looks at `"sideEffects": false` in package.json.
|
|
8
|
+
*
|
|
9
|
+
* Every public symbol is listed here by name, in one of two layers (see "The public
|
|
10
|
+
* surface" in CONTRIBUTING.md and "The two layers of the public API" in
|
|
11
|
+
* docs/reference/README.md):
|
|
12
|
+
*
|
|
13
|
+
* - Layer 1, the public API: the factory, the instance and its options, the data model,
|
|
14
|
+
* the events, the extension points and the pure functions. It follows semver.
|
|
15
|
+
* - Layer 2, building blocks for extension authors: the rendering parts, the math and the
|
|
16
|
+
* core services that a plugin, a custom feature type or a custom mode may reuse. Its
|
|
17
|
+
* guarantee is weaker: it may change in a minor release.
|
|
18
|
+
*
|
|
19
|
+
* Anything not listed here is internal. Where it would otherwise appear in the emitted
|
|
20
|
+
* declarations, its JSDoc carries the internal tag and `stripInternal` drops it from them.
|
|
21
|
+
* The list is pinned by src/index.test.ts, so every addition or removal is deliberate.
|
|
22
|
+
*/
|
|
23
|
+
export type { EventPayloads, MapLibreGLDraw, Options } from './api/index.js';
|
|
24
|
+
export { createMapLibreGLDraw } from './maplibre-gl-draw.js';
|
|
25
|
+
export type { BoundingBoxStyle, BoxSelectionStyleConfig, CenterMarkerStyle, FeatureStyleConfig, FillStyle, LineStringFeatureStyle, MidpointHandleStyle, PointFeatureStyle, PolygonFeatureStyle, RadiusHandleStyle, RadiusLineStyle, RenderingConfig, ResizeHandleStyle, RotateHandleStyle, SelectionUIConfig, TentativeStyle, TopologyConfig, TraceOptions, VertexHandleStyle, } from './shared/config/index.js';
|
|
26
|
+
export type { AutoNameConfig, AutoNameType, PixelRatioInput, PixelRatioProvider, } from './shared/utils/index.js';
|
|
27
|
+
export type { SnapDisableKey, SnapOptions, SnapTargetKind } from './snapping/index.js';
|
|
28
|
+
export type { Color, LineStyle, PointShape, PointStyle, StrokeStyle } from './view/index.js';
|
|
29
|
+
export { MESSAGES_EN, type Messages } from './messages.js';
|
|
30
|
+
export type { BoundingBox, BoundingBoxCoordsSimple, BoxSelection, Coordinate, Data, DragOperationType, DragState, ExportFormat, ExportOptions, ExportResult, Feature, FeatureCoordinates, FeatureInput, FeatureStyle, FeatureType, FileData, Group, ImageProperties, ImageStyle, Layer, LoadOptions, LoadResult, Metadata, Mode, RotateInfo, Selection, SelectionType, SkippedFeature, StateChanges, StyleRule, TentativeState, UpdateFeatureOptions, UpdateSource, VertexRef, VertexSelection, } from './store/index.js';
|
|
31
|
+
export type { LegendEntry } from './view/index.js';
|
|
32
|
+
export type { DocumentStore, FeatureLockStore, InteractionGateStore, Store, StoreView, UiState, } from './store/index.js';
|
|
33
|
+
export { isFeatureLocked, isGroupLocked, isInteractionBlocked, MemoryStore, } from './store/index.js';
|
|
34
|
+
export type { MapClickEventPayload } from './dispatcher/index.js';
|
|
35
|
+
export type { DatasetClickEventPayload } from './display/index.js';
|
|
36
|
+
export type { EventListener, EventMap, FeaturesChangePayload, GeometryAppliedPayload, GeometryOperationName, LoadErrorPayload, } from './shared/utils/index.js';
|
|
37
|
+
export type { GeometryBufferOptions, GeometryOperations, InputOperations, SnappingOperations, SyntheticInputOptions, SyntheticKeyOptions, SyntheticLngLat, SyntheticModifiers, TopologyOperations, TracingOperations, } from './api/index.js';
|
|
38
|
+
export type { DatasetBaseStyle, DatasetChangePayload, DatasetClickPayload, Dataset, DatasetEventMap, DatasetOptions, DatasetOrder, DatasetPlacement, DatasetCollisionThinning, DatasetColumn, DatasetColumnarGeometry, DatasetColumnarGeometryType, DatasetColumnarInput, DatasetColumnarMixedGeometry, DatasetColumnarPrepared, DatasetDictionaryCodes, DatasetDictionaryColumn, DatasetFeatureInput, DatasetFeatureProvider, DatasetHoverPayload, DatasetThinningStats, DatasetZoomScale, ResolvedCollisionThinning, } from './display/index.js';
|
|
39
|
+
export type { GuideSnapProviderDeps, GuideSnapProviderOptions, ResolvedSnapOptions, SnapCandidate, SnapContext, SnapExcludeVertex, SnapIndicatorStyles, SnapLngLat, SnapPointCandidate, SnapProvider, SnapProviderContext, SnapResult, SnapSegmentCandidate, SnapTarget, SnapTargetSegment, } from './snapping/index.js';
|
|
40
|
+
export { createGuideSnapProvider, DEFAULT_SNAP_GUIDE_LINE_STYLE, DEFAULT_SNAP_INDICATOR_STYLES, } from './snapping/index.js';
|
|
41
|
+
export type { TraceGraph, TraceGraphEdge, TraceGraphEndpoint, TraceGraphNode, } from './operations/index.js';
|
|
42
|
+
export { buildTraceGraph, findTracePath } from './operations/index.js';
|
|
43
|
+
export type { StyleRuleChannel } from './view/index.js';
|
|
44
|
+
export { applyRuleColor, deriveLegend, evaluateStyleRule, getStyleRuleChannel, resolveFeatureStyle, resolveRuleColor, } from './view/index.js';
|
|
45
|
+
export { getCreatedZoom, getRotation, getScale, setCreatedZoom, setRotation, } from './shared/utils/index.js';
|
|
46
|
+
export type { CustomFeatureHandler, CustomFeatureRenderer, CustomOverlayRenderer, CustomRendererDrawContext, CustomResizeResult, LayerAwareOverlayRenderer, } from './extension/index.js';
|
|
47
|
+
export type { BoxSelectionStrategy, DragNormalizedEvent, HitTestOptions, HitTestResult, HitTestStrategy, KeyNormalizedEvent, ModifierKeys, MouseNormalizedEvent, NormalizedEvent, PointerOriginalEvent, PointerType, VertexHit, } from './dispatcher/index.js';
|
|
48
|
+
export type { ModeContext, ModeFactory, ModeHandler, SnapInputType } from './modes/index.js';
|
|
49
|
+
export type { ResizeState } from './operations/index.js';
|
|
50
|
+
export type { DragEndData, DragStartData, Hooks, HoverEvent, MouseLeaveEvent, MutationContext, Plugin, PluginContext, } from './plugins/index.js';
|
|
51
|
+
export type { HandleType } from './shared/config/index.js';
|
|
52
|
+
export type { LngLat, ScreenPoint } from './shared/math/index.js';
|
|
53
|
+
export type { AdditionalHandleInfo, AdditionalResizeHandlesCalculator, AuxiliaryHandle, AuxiliaryHandleContext, AuxiliaryHandleHit, AuxiliaryHandleProvider, BoundingBoxCoords, CompanionHit, CompanionHitContext, CustomBoundingBoxCalculator, CustomResizeCalculator, FeatureCompanionProvider, HandleInfo, PointFrameExtent, PointFrameExtentProvider, RenderSlot, ResizeStrategy, } from './view/index.js';
|
|
54
|
+
export type { BoxSelectionStrategyRegistry, HitTestService, HitTestTopmost, TopHit, TopmostHitTestOptions, UnprojectFunction, } from './dispatcher/index.js';
|
|
55
|
+
export type { HookName, PluginManager } from './plugins/index.js';
|
|
56
|
+
export type { TraceConfig } from './shared/config/index.js';
|
|
57
|
+
export type { AutoNameGenerator, EventEmitter } from './shared/utils/index.js';
|
|
58
|
+
export type { SpatialQuery } from './store/index.js';
|
|
59
|
+
export type { AuxiliaryHandleRegistry, FeatureCompanionHitResult, FeatureCompanionRegistry, FillShaderManager, PointShapeRenderer, SDFLineRenderer, SDFStrokeOptions, SDFStrokeStyle, SelectionExtensionRegistry, SelectionScope, TerrainContext, TerrainRenderState, WidthUnit, } from './view/index.js';
|
|
60
|
+
export type { TerrainDiagnostics, TerrainRenderDiagnostics } from './api/index.js';
|
|
61
|
+
export type { TerrainDrapeDebug } from './view/index.js';
|
|
62
|
+
export { resolvePixelRatio } from './shared/utils/index.js';
|
|
63
|
+
export type { BlendCapableGL, DashSegment, DrapeQuadCorners, OffsetUniforms, ProjectionUniformLocations, QuadDrapeColor, QuadDrapeFill, QuadDrapeSurface, QuadDrapeGlyphs, QuadVertices, ShaderData, } from './view/index.js';
|
|
64
|
+
export { applyDrawBlendState, calculateLngLatOffset, calculateOffsetUniforms, computeQuadVertices, createProgram, drawBillboardsWithoutDepth, drawQuadSurfaceOnTerrain, getProjectionTransitionUniform, getStrokeDashPattern, OFFSET_MODE_GLSL, ProjectionUniformManager, QUAD_GLYPH_STRIDE, QuadShader, splitIntoDashes, } from './view/index.js';
|
|
65
|
+
export type { MercatorRect, TessellationStep, TessellationTiling } from './view/index.js';
|
|
66
|
+
export { anchorElevationMeters, anchorGhostOpacity, densifyPath, getAnchorElevationGeneration, getTerrainTessellationStep, metersToMercatorScale, } from './view/index.js';
|
|
67
|
+
export type { MercatorCoord, OBB, OBBCorners } from './shared/math/index.js';
|
|
68
|
+
export { createOBB, DEFAULT_TILE_SIZE, distanceToOBB, generateCirclePolygon, getOBBAABB, lngLatToMercator, metersToDegreesLat, metersToDegreesLng, pixelsToDegreesLat, pixelsToDegreesLng, rectangleIntersectsOBB, } from './shared/math/index.js';
|
|
69
|
+
export { getContrastColor } from './shared/utils/index.js';
|
|
70
|
+
export { PointHitTestStrategy } from './dispatcher/index.js';
|
|
71
|
+
export { createGeometryApi, type GeometryApi, type GeometryApiDeps } from './api/index.js';
|
|
72
|
+
export { computeBoundingBox, createFeatureCompanionRegistry, createSelectionExtensionRegistry, DEFAULT_POINT_FRAME_SIZE, DEFAULT_VIEWPORT_EXPANSION_FACTOR, getExpandedViewportBounds, getSelectedFeatureIds, hasZeroArea, } from './view/index.js';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
export { createMapLibreGLDraw } from './maplibre-gl-draw.js';
|
|
4
|
+
export { MESSAGES_EN } from './messages.js';
|
|
5
|
+
export { isFeatureLocked, isGroupLocked, isInteractionBlocked, MemoryStore, } from './store/index.js';
|
|
6
|
+
export { createGuideSnapProvider, DEFAULT_SNAP_GUIDE_LINE_STYLE, DEFAULT_SNAP_INDICATOR_STYLES, } from './snapping/index.js';
|
|
7
|
+
export { buildTraceGraph, findTracePath } from './operations/index.js';
|
|
8
|
+
export { applyRuleColor, deriveLegend, evaluateStyleRule, getStyleRuleChannel, resolveFeatureStyle, resolveRuleColor, } from './view/index.js';
|
|
9
|
+
// Property accessors
|
|
10
|
+
export { getCreatedZoom, getRotation, getScale, setCreatedZoom, setRotation, } from './shared/utils/index.js';
|
|
11
|
+
// WebGL building blocks
|
|
12
|
+
export { resolvePixelRatio } from './shared/utils/index.js';
|
|
13
|
+
export { applyDrawBlendState, calculateLngLatOffset, calculateOffsetUniforms, computeQuadVertices, createProgram, drawBillboardsWithoutDepth, drawQuadSurfaceOnTerrain, getProjectionTransitionUniform, getStrokeDashPattern, OFFSET_MODE_GLSL, ProjectionUniformManager, QUAD_GLYPH_STRIDE, QuadShader, splitIntoDashes, } from './view/index.js';
|
|
14
|
+
export { anchorElevationMeters, anchorGhostOpacity, densifyPath, getAnchorElevationGeneration, getTerrainTessellationStep, metersToMercatorScale, } from './view/index.js';
|
|
15
|
+
export { createOBB, DEFAULT_TILE_SIZE, distanceToOBB, generateCirclePolygon, getOBBAABB, lngLatToMercator, metersToDegreesLat, metersToDegreesLng, pixelsToDegreesLat, pixelsToDegreesLng, rectangleIntersectsOBB, } from './shared/math/index.js';
|
|
16
|
+
export { getContrastColor } from './shared/utils/index.js';
|
|
17
|
+
// Selection UI, hit testing and viewport helpers
|
|
18
|
+
export { PointHitTestStrategy } from './dispatcher/index.js';
|
|
19
|
+
export { createGeometryApi } from './api/index.js';
|
|
20
|
+
export { computeBoundingBox, createFeatureCompanionRegistry, createSelectionExtensionRegistry, DEFAULT_POINT_FRAME_SIZE, DEFAULT_VIEWPORT_EXPANSION_FACTOR, getExpandedViewportBounds, getSelectedFeatureIds, hasZeroArea, } from './view/index.js';
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The factory of a draw instance: it builds the context, the event bridge, the rendering,
|
|
3
|
+
* the input handling, the modes and the plugin manager, and registers the release of each
|
|
4
|
+
* one for destroy.
|
|
5
|
+
*
|
|
6
|
+
* The Store is the single source of truth: input goes through the dispatcher into the Store,
|
|
7
|
+
* and the view and the events follow the Store's notifications.
|
|
8
|
+
*/
|
|
9
|
+
import type { Map as MapLibreMap } from 'maplibre-gl';
|
|
10
|
+
import type { MapLibreGLDraw } from './api/api.js';
|
|
11
|
+
import type { Options } from './api/context.js';
|
|
12
|
+
export type { EventPayloads, MapLibreGLDraw } from './api/api.js';
|
|
13
|
+
export type { Options } from './api/context.js';
|
|
14
|
+
export type { ImportExportAPI } from './api/import-export/index.js';
|
|
15
|
+
export type { Data, LoadResult, Metadata } from './store/types.js';
|
|
16
|
+
/**
|
|
17
|
+
* Creates a draw instance on a MapLibre map: the drawing and editing tools, their rendering and
|
|
18
|
+
* their input handling.
|
|
19
|
+
*
|
|
20
|
+
* It can be called before, while or after the map loads. The render layers are added as soon
|
|
21
|
+
* as the style accepts layers, and added again after `setStyle`. Unless
|
|
22
|
+
* `initDefaultLayer: false` is given, the document starts with one empty layer. The instance
|
|
23
|
+
* turns off the map's box zoom (Shift + drag selects features instead) and gives it back on
|
|
24
|
+
* {@link MapLibreGLDraw.destroy}. Several instances can share a page, each on its own map.
|
|
25
|
+
*
|
|
26
|
+
* @param map the MapLibre map to draw on
|
|
27
|
+
* @param options the options; every one can be omitted (see {@link Options})
|
|
28
|
+
* @returns the draw instance
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* ```typescript
|
|
32
|
+
* import { createMapLibreGLDraw } from '@sakuzu/maplibre-gl-draw';
|
|
33
|
+
* import * as maplibregl from 'maplibre-gl';
|
|
34
|
+
*
|
|
35
|
+
* const map = new maplibregl.Map({
|
|
36
|
+
* container: 'map',
|
|
37
|
+
* style: 'https://demotiles.maplibre.org/style.json',
|
|
38
|
+
* center: [139.767, 35.681],
|
|
39
|
+
* zoom: 12,
|
|
40
|
+
* });
|
|
41
|
+
* const draw = createMapLibreGLDraw(map, { defaultMode: 'select' });
|
|
42
|
+
*
|
|
43
|
+
* draw.setMode('draw_polygon');
|
|
44
|
+
* draw.on('draw.feature.create', ({ feature }) => console.log('Created', feature.id));
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
export declare function createMapLibreGLDraw(map: MapLibreMap, options?: Options): MapLibreGLDraw;
|
|
@@ -0,0 +1,407 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
import { createDrawAPI } from './api/api.js';
|
|
4
|
+
import { createContext } from './api/context.js';
|
|
5
|
+
import { createImportExportAPI } from './api/import-export/index.js';
|
|
6
|
+
import { toleranceDegrees } from './dispatcher/hit-test/local-frame.js';
|
|
7
|
+
import { createTopmostHitTester } from './dispatcher/hit-test/topmost.js';
|
|
8
|
+
import { createInputRouter } from './dispatcher/input-router.js';
|
|
9
|
+
import { createInputNormalizer } from './dispatcher/normalizer.js';
|
|
10
|
+
import { createDisplayInteractions } from './display/interaction.js';
|
|
11
|
+
import { createDatasetManager } from './display/manager.js';
|
|
12
|
+
import { effectiveZoomForCamera } from './display/thinning.js';
|
|
13
|
+
import { TriangulationScheduler } from './display/triangulation.js';
|
|
14
|
+
import { DrawCircleMode, DrawFreehandMode, DrawImageMode, DrawLineMode, DrawPointMode, DrawPolygonMode, } from './modes/draw/index.js';
|
|
15
|
+
import { SelectMode } from './modes/select/mode.js';
|
|
16
|
+
import { createPluginContext } from './plugins/plugin-context.js';
|
|
17
|
+
import { createPluginManager } from './plugins/plugin-manager.js';
|
|
18
|
+
import { SnapIndicatorRenderer } from './snapping/indicator.js';
|
|
19
|
+
import { createDisplaySnapProviders } from './snapping/providers/display.js';
|
|
20
|
+
import { EventBridgeImpl } from './store/event-bridge.js';
|
|
21
|
+
import { createRenderCoordinator } from './view/coordinator.js';
|
|
22
|
+
import { createFeatureCompanionRegistry } from './view/feature-companion.js';
|
|
23
|
+
import { attachSlotLayers } from './view/layer/attach.js';
|
|
24
|
+
import { createCustomLayer } from './view/layer/index.js';
|
|
25
|
+
import { DEFAULT_VIEWPORT_EXPANSION_FACTOR, getExpandedViewportBounds } from './view/viewport.js';
|
|
26
|
+
/**
|
|
27
|
+
* The releases of one draw instance, run in the reverse order of the acquisitions
|
|
28
|
+
*
|
|
29
|
+
* Each resource is registered right where it is acquired, so nothing acquired can be missed
|
|
30
|
+
* by destroy. Running is done once: a second run is ignored. A release that throws does not
|
|
31
|
+
* stop the others; the first error is rethrown after all of them have run.
|
|
32
|
+
*/
|
|
33
|
+
function createTeardown() {
|
|
34
|
+
const releases = [];
|
|
35
|
+
let done = false;
|
|
36
|
+
return {
|
|
37
|
+
get done() {
|
|
38
|
+
return done;
|
|
39
|
+
},
|
|
40
|
+
add(release) {
|
|
41
|
+
releases.push(release);
|
|
42
|
+
},
|
|
43
|
+
run() {
|
|
44
|
+
if (done)
|
|
45
|
+
return;
|
|
46
|
+
done = true;
|
|
47
|
+
let firstError = null;
|
|
48
|
+
while (releases.length > 0) {
|
|
49
|
+
const release = releases.pop();
|
|
50
|
+
try {
|
|
51
|
+
release();
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
firstError ?? (firstError = error);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
if (firstError !== null)
|
|
58
|
+
throw firstError;
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Creates a draw instance on a MapLibre map: the drawing and editing tools, their rendering and
|
|
64
|
+
* their input handling.
|
|
65
|
+
*
|
|
66
|
+
* It can be called before, while or after the map loads. The render layers are added as soon
|
|
67
|
+
* as the style accepts layers, and added again after `setStyle`. Unless
|
|
68
|
+
* `initDefaultLayer: false` is given, the document starts with one empty layer. The instance
|
|
69
|
+
* turns off the map's box zoom (Shift + drag selects features instead) and gives it back on
|
|
70
|
+
* {@link MapLibreGLDraw.destroy}. Several instances can share a page, each on its own map.
|
|
71
|
+
*
|
|
72
|
+
* @param map the MapLibre map to draw on
|
|
73
|
+
* @param options the options; every one can be omitted (see {@link Options})
|
|
74
|
+
* @returns the draw instance
|
|
75
|
+
*
|
|
76
|
+
* @example
|
|
77
|
+
* ```typescript
|
|
78
|
+
* import { createMapLibreGLDraw } from '@sakuzu/maplibre-gl-draw';
|
|
79
|
+
* import * as maplibregl from 'maplibre-gl';
|
|
80
|
+
*
|
|
81
|
+
* const map = new maplibregl.Map({
|
|
82
|
+
* container: 'map',
|
|
83
|
+
* style: 'https://demotiles.maplibre.org/style.json',
|
|
84
|
+
* center: [139.767, 35.681],
|
|
85
|
+
* zoom: 12,
|
|
86
|
+
* });
|
|
87
|
+
* const draw = createMapLibreGLDraw(map, { defaultMode: 'select' });
|
|
88
|
+
*
|
|
89
|
+
* draw.setMode('draw_polygon');
|
|
90
|
+
* draw.on('draw.feature.create', ({ feature }) => console.log('Created', feature.id));
|
|
91
|
+
* ```
|
|
92
|
+
*/
|
|
93
|
+
export function createMapLibreGLDraw(map, options = {}) {
|
|
94
|
+
// 1. Create the context
|
|
95
|
+
const context = createContext(map, options);
|
|
96
|
+
const { store, modeManager, eventEmitter, spatialIndex, hitTestService, featureStyle, selectionStyle, renderingConfig, topology, trace, snapService, pixelRatioSource, } = context;
|
|
97
|
+
// Everything acquired below is released by destroy, in the reverse order
|
|
98
|
+
const teardown = createTeardown();
|
|
99
|
+
// The registrations of the extension points belong to this instance and end with it
|
|
100
|
+
teardown.add(() => {
|
|
101
|
+
context.selectionScope.clear();
|
|
102
|
+
context.snapTargets.clear();
|
|
103
|
+
});
|
|
104
|
+
// 2. Create the EventBridge
|
|
105
|
+
const eventBridge = new EventBridgeImpl(store, eventEmitter);
|
|
106
|
+
// 2.5 Create the manager of the datasets.
|
|
107
|
+
// Culls with the same expanded viewport as the rendering loop, and calls the
|
|
108
|
+
// provider on a change of the displayed range (moveend). It never touches the
|
|
109
|
+
// Store.
|
|
110
|
+
const datasets = createDatasetManager({
|
|
111
|
+
getViewportBounds: () => getExpandedViewportBounds(map, DEFAULT_VIEWPORT_EXPANSION_FACTOR),
|
|
112
|
+
getZoom: () => map.getZoom(),
|
|
113
|
+
// The band of the collision thinning is decided by "the shallowest
|
|
114
|
+
// effective zoom on screen" (pitch correction)
|
|
115
|
+
getEffectiveZoom: () => effectiveZoomForCamera(map),
|
|
116
|
+
// The providers are called when the displayed range changed
|
|
117
|
+
onViewportChange: (handler) => {
|
|
118
|
+
// A destroyed instance attaches nothing to the map again
|
|
119
|
+
if (teardown.done)
|
|
120
|
+
return () => { };
|
|
121
|
+
map.on('moveend', handler);
|
|
122
|
+
return () => {
|
|
123
|
+
map.off('moveend', handler);
|
|
124
|
+
};
|
|
125
|
+
},
|
|
126
|
+
requestRepaint: () => map.triggerRepaint(),
|
|
127
|
+
pixelRatio: pixelRatioSource,
|
|
128
|
+
// Read so that the collision thinning knows "the size of the point that is
|
|
129
|
+
// actually drawn"
|
|
130
|
+
featureStyle,
|
|
131
|
+
// The time slicing of the triangulation belongs to this instance (its queue
|
|
132
|
+
// and its finished triangles are never shared with another instance).
|
|
133
|
+
// Rendering that draws complete frames (printing, thumbnails) turns off time
|
|
134
|
+
// slicing and triangulates on the spot: setting the threshold to infinity
|
|
135
|
+
// puts every polygon on the synchronous path
|
|
136
|
+
triangulationScheduler: renderingConfig.timeSlicing === false
|
|
137
|
+
? new TriangulationScheduler({ vertexThreshold: Number.POSITIVE_INFINITY })
|
|
138
|
+
: new TriangulationScheduler(),
|
|
139
|
+
timeSlicing: renderingConfig.timeSlicing,
|
|
140
|
+
// Announce the datasets that come and go and their reordering (draw.dataset.add,
|
|
141
|
+
// draw.dataset.remove and draw.dataset.reorder)
|
|
142
|
+
onDatasetAdd: (datasetId) => eventEmitter.emit('dataset.add', { datasetId }),
|
|
143
|
+
onDatasetRemove: (datasetId) => eventEmitter.emit('dataset.remove', { datasetId }),
|
|
144
|
+
onDatasetsReorder: (order) => eventEmitter.emit('dataset.reorder', { order }),
|
|
145
|
+
});
|
|
146
|
+
// Also disposes of the timers and the subscriptions of the datasets
|
|
147
|
+
teardown.add(() => datasets.destroy());
|
|
148
|
+
// 2.6 Hit testing with a unified z traversal.
|
|
149
|
+
// Walks the features of the Store and the datasets in a
|
|
150
|
+
// single stacking order (above-store -> the stacking order from the front ->
|
|
151
|
+
// below-store) and returns the frontmost one.
|
|
152
|
+
// The select mode and the interception of the datasets see
|
|
153
|
+
// the same result.
|
|
154
|
+
// The providers of companion rendering and companion hits are held one per
|
|
155
|
+
// draw instance (the same scope as the renderers of custom feature types).
|
|
156
|
+
// If they were shared, the provider of the hidden renderer used for printing,
|
|
157
|
+
// thumbnails and previews would intercept with the geometry of its
|
|
158
|
+
// own Store.
|
|
159
|
+
const featureCompanions = createFeatureCompanionRegistry();
|
|
160
|
+
const unproject = (p) => map.unproject([p.x, p.y]);
|
|
161
|
+
const hitTestTopmost = createTopmostHitTester({
|
|
162
|
+
store,
|
|
163
|
+
hitTestService,
|
|
164
|
+
unproject,
|
|
165
|
+
// The same bearing-independent tolerance as the HitTestService
|
|
166
|
+
toleranceLngLat: (point) => toleranceDegrees(unproject, point, context.options.clickTolerance),
|
|
167
|
+
datasets,
|
|
168
|
+
// Context of the companion hits (feature companion). A companion decides
|
|
169
|
+
// its hit by its appearance in screen px, so the projection, the zoom and
|
|
170
|
+
// the tolerance are passed.
|
|
171
|
+
project: (lngLat) => {
|
|
172
|
+
const projected = map.project(lngLat);
|
|
173
|
+
return { x: projected.x, y: projected.y };
|
|
174
|
+
},
|
|
175
|
+
getZoom: () => map.getZoom(),
|
|
176
|
+
clickTolerancePx: context.options.clickTolerance,
|
|
177
|
+
companions: featureCompanions,
|
|
178
|
+
});
|
|
179
|
+
// 2.7 Snapping to data (datasets).
|
|
180
|
+
// Adds the vertices, edges and intersections of the displayed datasets as
|
|
181
|
+
// snapping candidates. The data itself is only read, and whether it is
|
|
182
|
+
// enabled is held by options.datasets of the SnapService.
|
|
183
|
+
const displaySnap = createDisplaySnapProviders({
|
|
184
|
+
datasets,
|
|
185
|
+
store,
|
|
186
|
+
spatialIndex,
|
|
187
|
+
snapTargets: context.snapTargets,
|
|
188
|
+
isEnabled: () => snapService.isDatasetsEnabled(),
|
|
189
|
+
// The resolved messages table of this instance (the description of an intersection)
|
|
190
|
+
messages: context.messages,
|
|
191
|
+
});
|
|
192
|
+
for (const provider of displaySnap.providers) {
|
|
193
|
+
teardown.add(snapService.register(provider));
|
|
194
|
+
}
|
|
195
|
+
// 3. Create the CustomLayer
|
|
196
|
+
const customLayer = createCustomLayer({
|
|
197
|
+
map,
|
|
198
|
+
store,
|
|
199
|
+
spatialIndex,
|
|
200
|
+
featureStyle,
|
|
201
|
+
selectionConfig: selectionStyle,
|
|
202
|
+
renderingConfig,
|
|
203
|
+
datasets,
|
|
204
|
+
pixelRatio: pixelRatioSource,
|
|
205
|
+
featureCompanions,
|
|
206
|
+
// The selection UI extension points, the auxiliary handles and the thinned handle sets of
|
|
207
|
+
// this instance (the modes hit test against the same scope)
|
|
208
|
+
selectionScope: context.selectionScope,
|
|
209
|
+
// The separators of the stacking order (external entries) and the frames.
|
|
210
|
+
// Additions and removals of separators are announced by an event
|
|
211
|
+
// (draw.renderslots.change)
|
|
212
|
+
isExternalEntry: context.isExternalEntry,
|
|
213
|
+
onSlotsChange: (slots) => eventEmitter.emit('renderslots.change', { slots }),
|
|
214
|
+
// The failure to load the image of an Image feature (draw.load.error)
|
|
215
|
+
onImageError: (featureId, error) => eventEmitter.emit('load.error', { source: 'image', featureId, error }),
|
|
216
|
+
});
|
|
217
|
+
// 3.5 Add the snapping indicator as a built-in overlay
|
|
218
|
+
// (it comes in front of the selection UI because order: 'overlay')
|
|
219
|
+
customLayer.addOverlayRenderer(new SnapIndicatorRenderer({ snapService }));
|
|
220
|
+
// Repaint when the snapping result changes (the Store does not change, so
|
|
221
|
+
// the RenderCoordinator does not run)
|
|
222
|
+
const repaintOnSnapChange = () => map.triggerRepaint();
|
|
223
|
+
eventEmitter.on('snap.change', repaintOnSnapChange);
|
|
224
|
+
teardown.add(() => eventEmitter.off('snap.change', repaintOnSnapChange));
|
|
225
|
+
// 4. Create the RenderCoordinator (triggers a repaint automatically when the
|
|
226
|
+
// Store changes)
|
|
227
|
+
const renderCoordinator = createRenderCoordinator({ map, store });
|
|
228
|
+
// 5. Set up the ModeManager
|
|
229
|
+
modeManager.registerMode('select', () => new SelectMode());
|
|
230
|
+
modeManager.registerMode('draw_point', () => new DrawPointMode());
|
|
231
|
+
modeManager.registerMode('draw_line', () => new DrawLineMode());
|
|
232
|
+
modeManager.registerMode('draw_polygon', () => new DrawPolygonMode());
|
|
233
|
+
modeManager.registerMode('draw_image', () => new DrawImageMode());
|
|
234
|
+
modeManager.registerMode('draw_circle', () => new DrawCircleMode());
|
|
235
|
+
modeManager.registerMode('draw_freehand', () => new DrawFreehandMode());
|
|
236
|
+
// 6. Create the PluginManager.
|
|
237
|
+
// The PluginContext is initialized lazily after the PluginManager is created
|
|
238
|
+
let pluginContext = null;
|
|
239
|
+
const pluginManager = createPluginManager(() => {
|
|
240
|
+
if (!pluginContext) {
|
|
241
|
+
throw new Error('PluginContext not initialized');
|
|
242
|
+
}
|
|
243
|
+
return pluginContext;
|
|
244
|
+
}, modeManager);
|
|
245
|
+
// 7. Create the import/export API
|
|
246
|
+
const importExportAPI = createImportExportAPI(context);
|
|
247
|
+
const modeContext = {
|
|
248
|
+
map,
|
|
249
|
+
store,
|
|
250
|
+
spatialIndex,
|
|
251
|
+
hitTestService,
|
|
252
|
+
hitTestTopmost,
|
|
253
|
+
featureCompanions,
|
|
254
|
+
selectionScope: context.selectionScope,
|
|
255
|
+
eventEmitter,
|
|
256
|
+
selectionStyle,
|
|
257
|
+
topology,
|
|
258
|
+
trace,
|
|
259
|
+
autoNameGenerator: context.autoNameGenerator,
|
|
260
|
+
boxSelectionRegistry: context.boxSelectionRegistry,
|
|
261
|
+
pluginManager,
|
|
262
|
+
generateFeatureId: context.generateFeatureId,
|
|
263
|
+
getCurrentLayerId: context.getWritableLayerId,
|
|
264
|
+
scaleWithZoom: context.options.scaleWithZoom,
|
|
265
|
+
setMode: (mode) => modeManager.setMode(mode),
|
|
266
|
+
// The key that temporarily disables shared vertices is shared with the
|
|
267
|
+
// disableKey of the snapping
|
|
268
|
+
snapOptions: context.snapOptions,
|
|
269
|
+
// The only opening through which a mode learns about snapping (the
|
|
270
|
+
// SnapService itself is not passed)
|
|
271
|
+
getSnapResult: () => snapService?.getResult() ?? null,
|
|
272
|
+
// The opening that resolves a snap target on data into a feature (read by
|
|
273
|
+
// the tracing)
|
|
274
|
+
getDatasetFeature: (datasetId, featureId) => displaySnap.getFeature(datasetId, featureId),
|
|
275
|
+
// The features of the data put on the edge graph of the tracing (empty
|
|
276
|
+
// when snapping to data is disabled)
|
|
277
|
+
getDatasetTraceFeatures: (bbox) => snapService.isDatasetsEnabled() ? displaySnap.queryFeatures(bbox) : [],
|
|
278
|
+
};
|
|
279
|
+
modeManager.setContext(modeContext);
|
|
280
|
+
// 7. Initialize the PluginContext.
|
|
281
|
+
// Helper function that looks up which layer an item belongs to
|
|
282
|
+
const findLayerForItem = (itemId) => {
|
|
283
|
+
for (const layer of store.getAllLayers()) {
|
|
284
|
+
if (layer.order.includes(itemId)) {
|
|
285
|
+
return layer.id;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
return undefined;
|
|
289
|
+
};
|
|
290
|
+
// Helper function that looks up which group a feature belongs to
|
|
291
|
+
const findGroupForFeature = (featureId) => {
|
|
292
|
+
for (const group of store.getAllGroups()) {
|
|
293
|
+
if (group.featureIds.includes(featureId)) {
|
|
294
|
+
return group.id;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
return undefined;
|
|
298
|
+
};
|
|
299
|
+
// Initialize the PluginContext.
|
|
300
|
+
// The implementations of all PluginContext methods are gathered in
|
|
301
|
+
// createPluginContext.
|
|
302
|
+
// The draw instance is referenced lazily (through the closure, to cope
|
|
303
|
+
// with the circular initialization).
|
|
304
|
+
let drawApi = null;
|
|
305
|
+
pluginContext = createPluginContext({
|
|
306
|
+
store,
|
|
307
|
+
eventEmitter,
|
|
308
|
+
autoNameGenerator: context.autoNameGenerator,
|
|
309
|
+
spatialIndex,
|
|
310
|
+
getActiveLayerId: context.getActiveLayerId,
|
|
311
|
+
findLayerForItem,
|
|
312
|
+
findGroupForFeature,
|
|
313
|
+
getModeManager: () => modeManager,
|
|
314
|
+
// The anchors and the selection extents of this instance (never another instance's)
|
|
315
|
+
terrain: customLayer.getTerrainContext(),
|
|
316
|
+
selectionExtensions: context.selectionScope.extensions,
|
|
317
|
+
getDraw: () => {
|
|
318
|
+
if (!drawApi) {
|
|
319
|
+
throw new Error('MapLibreGLDraw not initialized');
|
|
320
|
+
}
|
|
321
|
+
return drawApi;
|
|
322
|
+
},
|
|
323
|
+
});
|
|
324
|
+
// 7. Create the InputNormalizer and the InputRouter.
|
|
325
|
+
// The hit testing of the datasets comes in as an
|
|
326
|
+
// interception of the InputRouter.
|
|
327
|
+
// The delivery target is decided by the result of the unified z traversal
|
|
328
|
+
// (only the dataset in front receives it).
|
|
329
|
+
const displayInteractions = createDisplayInteractions({
|
|
330
|
+
manager: datasets,
|
|
331
|
+
hitTestTopmost: (event) => hitTestTopmost(event.point),
|
|
332
|
+
// Emit the resolved result of a click as a public event
|
|
333
|
+
// (draw.dataset.click)
|
|
334
|
+
notifyClick: (payload) => eventEmitter.emit('dataset.click', payload),
|
|
335
|
+
});
|
|
336
|
+
// The drag threshold of the options is the one of the mouse (a finger and a pen take a
|
|
337
|
+
// larger one of their own)
|
|
338
|
+
const inputNormalizer = createInputNormalizer(map, {
|
|
339
|
+
dragThreshold: context.options.dragThreshold,
|
|
340
|
+
});
|
|
341
|
+
const inputRouter = createInputRouter({
|
|
342
|
+
normalizer: inputNormalizer,
|
|
343
|
+
modeManager,
|
|
344
|
+
context: modeContext,
|
|
345
|
+
map,
|
|
346
|
+
pluginManager,
|
|
347
|
+
displayInteractions,
|
|
348
|
+
// Emit a click in select mode as a public event (draw.map.click)
|
|
349
|
+
notifyMapClick: (payload) => eventEmitter.emit('map.click', payload),
|
|
350
|
+
snapService,
|
|
351
|
+
});
|
|
352
|
+
// 7. Set up
|
|
353
|
+
eventBridge.start();
|
|
354
|
+
renderCoordinator.start();
|
|
355
|
+
// Keep the render slots on the map. The slots are added as soon as the style
|
|
356
|
+
// accepts layers, whenever the draw instance is created (before, during or
|
|
357
|
+
// after the map loads), and they are restored after a style change. The
|
|
358
|
+
// native layers of the separators are placed between the slots by the host,
|
|
359
|
+
// which receives 'draw.renderslots.change'
|
|
360
|
+
teardown.add(attachSlotLayers(map, () => customLayer.getSlotLayers()));
|
|
361
|
+
inputNormalizer.attach();
|
|
362
|
+
inputRouter.start();
|
|
363
|
+
modeManager.start();
|
|
364
|
+
// Disable the boxZoom of MapLibre (because Shift + drag is used for box
|
|
365
|
+
// selection), and give it back in the state it was found in: the host or another draw
|
|
366
|
+
// instance may have turned it off already.
|
|
367
|
+
// It must be called after inputNormalizer.attach()
|
|
368
|
+
const boxZoomWasEnabled = map.boxZoom.isEnabled();
|
|
369
|
+
map.boxZoom.disable();
|
|
370
|
+
teardown.add(() => {
|
|
371
|
+
if (boxZoomWasEnabled)
|
|
372
|
+
map.boxZoom.enable();
|
|
373
|
+
else
|
|
374
|
+
map.boxZoom.disable();
|
|
375
|
+
});
|
|
376
|
+
// Set the default mode
|
|
377
|
+
modeManager.setMode(context.options.defaultMode);
|
|
378
|
+
// 9. Create the public API
|
|
379
|
+
drawApi = createDrawAPI(context, { inputNormalizer, inputRouter }, eventBridge, customLayer, importExportAPI, { modeManager, renderCoordinator }, { pluginManager, spatialIndex, datasets, featureCompanions });
|
|
380
|
+
// The public API releases what it created itself (the input, the modes, the rendering, the
|
|
381
|
+
// plugins and the layers on the map) first, then the rest goes in the reverse order
|
|
382
|
+
teardown.add(drawApi.destroy);
|
|
383
|
+
drawApi.destroy = () => teardown.run();
|
|
384
|
+
ignoreRegistrationsAfterDestroy(drawApi, () => teardown.done);
|
|
385
|
+
return drawApi;
|
|
386
|
+
}
|
|
387
|
+
/**
|
|
388
|
+
* Makes the registrations of a destroyed instance do nothing
|
|
389
|
+
*
|
|
390
|
+
* Every other call on a destroyed instance works on its inert Store and reaches neither the
|
|
391
|
+
* map nor a timer, but a registration would install something (a plugin, a mode, a renderer,
|
|
392
|
+
* a provider) that nothing is left to release. They are ignored instead and return a cancel
|
|
393
|
+
* function that does nothing.
|
|
394
|
+
*/
|
|
395
|
+
function ignoreRegistrationsAfterDestroy(draw, isDestroyed) {
|
|
396
|
+
const noop = () => { };
|
|
397
|
+
const guard = (fn, whenDestroyed) => {
|
|
398
|
+
return (...args) => (isDestroyed() ? whenDestroyed : fn(...args));
|
|
399
|
+
};
|
|
400
|
+
draw.addPlugin = guard(draw.addPlugin, noop);
|
|
401
|
+
draw.registerMode = guard(draw.registerMode, noop);
|
|
402
|
+
draw.registerFeatureHandler = guard(draw.registerFeatureHandler, noop);
|
|
403
|
+
draw.addOverlayRenderer = guard(draw.addOverlayRenderer, noop);
|
|
404
|
+
draw.registerAuxiliaryHandleProvider = guard(draw.registerAuxiliaryHandleProvider, noop);
|
|
405
|
+
draw.registerFeatureCompanionProvider = guard(draw.registerFeatureCompanionProvider, noop);
|
|
406
|
+
draw.snapping.register = guard(draw.snapping.register, noop);
|
|
407
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Messages
|
|
3
|
+
*
|
|
4
|
+
* The table of every string the library returns as a value (legend labels, the
|
|
5
|
+
* descriptions of the snapping guides). The library never builds such a string inline;
|
|
6
|
+
* it reads it from the table of the instance, so the host application can show them in
|
|
7
|
+
* its own language.
|
|
8
|
+
*
|
|
9
|
+
* - The keys are typed. A value is either a string or a function that formats one (it
|
|
10
|
+
* receives numbers already turned into strings)
|
|
11
|
+
* - `MESSAGES_EN` is the default, in English. The library ships no other language
|
|
12
|
+
* - `Options.messages` overrides part of the table for one instance. The table belongs to
|
|
13
|
+
* the instance and is never module-level state
|
|
14
|
+
* - There is no locale detection and no automatic switching: the host passes the table
|
|
15
|
+
* it wants
|
|
16
|
+
* - The words of the names generated for features, layers and groups are not in this table:
|
|
17
|
+
* they come from the naming configuration (`AutoNameConfig`, the `autoName` option)
|
|
18
|
+
*/
|
|
19
|
+
/**
|
|
20
|
+
* The table of the strings the library returns as values: legend labels and the descriptions
|
|
21
|
+
* of the snapping guides
|
|
22
|
+
*
|
|
23
|
+
* The library builds no such string inline; it reads it from the table of the instance, so
|
|
24
|
+
* the host can show them in its own language. Pass the entries to replace as the `messages`
|
|
25
|
+
* option of `createMapLibreGLDraw`; the entries left out keep {@link MESSAGES_EN}. A value is
|
|
26
|
+
* a string, or a function that formats one from numbers already turned into strings. There is
|
|
27
|
+
* no locale detection and no other built-in language. The words of generated names ("Layer 1")
|
|
28
|
+
* are translated through the `autoName` option (`AutoNameConfig`), not here.
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* ```ts
|
|
32
|
+
* const draw = createMapLibreGLDraw(map, {
|
|
33
|
+
* messages: {
|
|
34
|
+
* legendOther: 'Sonstige',
|
|
35
|
+
* legendRange: (lower, upper) => `${lower} bis unter ${upper}`,
|
|
36
|
+
* },
|
|
37
|
+
* });
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
export interface Messages {
|
|
41
|
+
/** The label of the single legend entry of a `single` style rule */
|
|
42
|
+
legendAll: string;
|
|
43
|
+
/** The label of the legend entry for values the rule could not resolve (`other`) */
|
|
44
|
+
legendOther: string;
|
|
45
|
+
/** The label of the first class of a `graduated` rule (values below `upper`) */
|
|
46
|
+
legendBelow: (upper: string) => string;
|
|
47
|
+
/** The label of the last class of a `graduated` rule (values of `lower` or more) */
|
|
48
|
+
legendAtLeast: (lower: string) => string;
|
|
49
|
+
/** The label of a middle class of a `graduated` rule (`lower` or more, below `upper`) */
|
|
50
|
+
legendRange: (lower: string, upper: string) => string;
|
|
51
|
+
/** The description of the north-based snapping guide */
|
|
52
|
+
snapNorth: string;
|
|
53
|
+
/** The description of the snapping guide that extends the previous segment */
|
|
54
|
+
snapExtension: string;
|
|
55
|
+
/** The description of the snapping guide perpendicular to the previous segment */
|
|
56
|
+
snapPerpendicular: string;
|
|
57
|
+
/** The description of a snapping candidate at the intersection of two edges */
|
|
58
|
+
snapIntersection: string;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* The default table of {@link Messages}, in English (`'All'`, `'Other'`, `` `Below ${upper}` ``
|
|
62
|
+
* and so on)
|
|
63
|
+
*/
|
|
64
|
+
export declare const MESSAGES_EN: Readonly<Messages>;
|
package/dist/messages.js
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
/**
|
|
4
|
+
* The default table of {@link Messages}, in English (`'All'`, `'Other'`, `` `Below ${upper}` ``
|
|
5
|
+
* and so on)
|
|
6
|
+
*/
|
|
7
|
+
export const MESSAGES_EN = Object.freeze({
|
|
8
|
+
legendAll: 'All',
|
|
9
|
+
legendOther: 'Other',
|
|
10
|
+
legendBelow: (upper) => `Below ${upper}`,
|
|
11
|
+
legendAtLeast: (lower) => `${lower} or more`,
|
|
12
|
+
legendRange: (lower, upper) => `${lower} to below ${upper}`,
|
|
13
|
+
snapNorth: 'North',
|
|
14
|
+
snapExtension: 'Extension',
|
|
15
|
+
snapPerpendicular: 'Perpendicular',
|
|
16
|
+
snapIntersection: 'Intersection',
|
|
17
|
+
});
|
|
18
|
+
/**
|
|
19
|
+
* Resolves a table: the given entries over the English default
|
|
20
|
+
*
|
|
21
|
+
* Entries that are `undefined` keep the default, and keys the table does not know are
|
|
22
|
+
* ignored.
|
|
23
|
+
*
|
|
24
|
+
* @internal
|
|
25
|
+
*/
|
|
26
|
+
export function resolveMessages(overrides) {
|
|
27
|
+
const resolved = { ...MESSAGES_EN };
|
|
28
|
+
if (!overrides)
|
|
29
|
+
return resolved;
|
|
30
|
+
for (const key of Object.keys(MESSAGES_EN)) {
|
|
31
|
+
const value = overrides[key];
|
|
32
|
+
if (value !== undefined)
|
|
33
|
+
resolved[key] = value;
|
|
34
|
+
}
|
|
35
|
+
return resolved;
|
|
36
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|