@honua/react 0.0.20-alpha.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/LICENSE +201 -0
- package/README.md +9 -0
- package/contract/analytics-sources.d.ts +149 -0
- package/contract/analytics-sources.d.ts.map +1 -0
- package/contract/analytics-sources.js +235 -0
- package/contract/edit-session.d.ts +203 -0
- package/contract/edit-session.d.ts.map +1 -0
- package/contract/edit-session.js +760 -0
- package/contract/edit-sketch.d.ts +91 -0
- package/contract/edit-sketch.d.ts.map +1 -0
- package/contract/edit-sketch.js +281 -0
- package/contract/index.d.ts +61 -0
- package/contract/index.d.ts.map +1 -0
- package/contract/index.js +51 -0
- package/contract/jobs.d.ts +149 -0
- package/contract/jobs.d.ts.map +1 -0
- package/contract/jobs.js +40 -0
- package/contract/source.d.ts +423 -0
- package/contract/source.d.ts.map +1 -0
- package/contract/source.js +3802 -0
- package/contract/spatial-aggregation.d.ts +336 -0
- package/contract/spatial-aggregation.d.ts.map +1 -0
- package/contract/spatial-aggregation.js +298 -0
- package/contract/temporal.d.ts +455 -0
- package/contract/temporal.d.ts.map +1 -0
- package/contract/temporal.js +146 -0
- package/contract/tiles.d.ts +370 -0
- package/contract/tiles.d.ts.map +1 -0
- package/contract/tiles.js +519 -0
- package/contract/types.d.ts +665 -0
- package/contract/types.d.ts.map +1 -0
- package/contract/types.js +175 -0
- package/contract/widget-source.d.ts +205 -0
- package/contract/widget-source.d.ts.map +1 -0
- package/contract/widget-source.js +1473 -0
- package/control-plane/client.d.ts +95 -0
- package/control-plane/client.d.ts.map +1 -0
- package/control-plane/client.js +374 -0
- package/control-plane/index.d.ts +18 -0
- package/control-plane/index.d.ts.map +1 -0
- package/control-plane/index.js +14 -0
- package/control-plane/types.d.ts +233 -0
- package/control-plane/types.d.ts.map +1 -0
- package/control-plane/types.js +7 -0
- package/core/batch.d.ts +37 -0
- package/core/batch.d.ts.map +1 -0
- package/core/batch.js +79 -0
- package/core/cache-state.d.ts +79 -0
- package/core/cache-state.d.ts.map +1 -0
- package/core/cache-state.js +87 -0
- package/core/client.d.ts +577 -0
- package/core/client.d.ts.map +1 -0
- package/core/client.js +1664 -0
- package/core/compatibility.d.ts +18 -0
- package/core/compatibility.d.ts.map +1 -0
- package/core/compatibility.js +245 -0
- package/core/errors.d.ts +107 -0
- package/core/errors.d.ts.map +1 -0
- package/core/errors.js +156 -0
- package/core/esri-geojson.d.ts +66 -0
- package/core/esri-geojson.d.ts.map +1 -0
- package/core/esri-geojson.js +363 -0
- package/core/geoservices.d.ts +34 -0
- package/core/geoservices.d.ts.map +1 -0
- package/core/geoservices.js +434 -0
- package/core/grpc-adapter.d.ts +23 -0
- package/core/grpc-adapter.d.ts.map +1 -0
- package/core/grpc-adapter.js +688 -0
- package/core/odata.d.ts +347 -0
- package/core/odata.d.ts.map +1 -0
- package/core/odata.js +913 -0
- package/core/ogc-conformance.d.ts +35 -0
- package/core/ogc-conformance.d.ts.map +1 -0
- package/core/ogc-conformance.js +134 -0
- package/core/ogc-features.d.ts +23 -0
- package/core/ogc-features.d.ts.map +1 -0
- package/core/ogc-features.js +114 -0
- package/core/ogc-maps.d.ts +49 -0
- package/core/ogc-maps.d.ts.map +1 -0
- package/core/ogc-maps.js +126 -0
- package/core/ogc-processes.d.ts +118 -0
- package/core/ogc-processes.d.ts.map +1 -0
- package/core/ogc-processes.js +423 -0
- package/core/ogc-records.d.ts +75 -0
- package/core/ogc-records.d.ts.map +1 -0
- package/core/ogc-records.js +251 -0
- package/core/ogc-tiles.d.ts +125 -0
- package/core/ogc-tiles.d.ts.map +1 -0
- package/core/ogc-tiles.js +183 -0
- package/core/path-utils.d.ts +69 -0
- package/core/path-utils.d.ts.map +1 -0
- package/core/path-utils.js +123 -0
- package/core/pbf-decoder.d.ts +39 -0
- package/core/pbf-decoder.d.ts.map +1 -0
- package/core/pbf-decoder.js +702 -0
- package/core/process-runner.d.ts +104 -0
- package/core/process-runner.d.ts.map +1 -0
- package/core/process-runner.js +315 -0
- package/core/protocol-transport.d.ts +76 -0
- package/core/protocol-transport.d.ts.map +1 -0
- package/core/protocol-transport.js +15 -0
- package/core/query-builder.d.ts +261 -0
- package/core/query-builder.d.ts.map +1 -0
- package/core/query-builder.js +538 -0
- package/core/request-pipeline.d.ts +88 -0
- package/core/request-pipeline.d.ts.map +1 -0
- package/core/request-pipeline.js +273 -0
- package/core/spatial-filter.d.ts +93 -0
- package/core/spatial-filter.d.ts.map +1 -0
- package/core/spatial-filter.js +153 -0
- package/core/stac.d.ts +55 -0
- package/core/stac.d.ts.map +1 -0
- package/core/stac.js +229 -0
- package/core/surfaces.d.ts +527 -0
- package/core/surfaces.d.ts.map +1 -0
- package/core/surfaces.js +1917 -0
- package/core/terrain-elevation.d.ts +114 -0
- package/core/terrain-elevation.d.ts.map +1 -0
- package/core/terrain-elevation.js +150 -0
- package/core/types.d.ts +1355 -0
- package/core/types.d.ts.map +1 -0
- package/core/types.js +13 -0
- package/core/wfs-capabilities.d.ts +143 -0
- package/core/wfs-capabilities.d.ts.map +1 -0
- package/core/wfs-capabilities.js +478 -0
- package/core/wfs-filter.d.ts +118 -0
- package/core/wfs-filter.d.ts.map +1 -0
- package/core/wfs-filter.js +634 -0
- package/core/wfs.d.ts +219 -0
- package/core/wfs.d.ts.map +1 -0
- package/core/wfs.js +406 -0
- package/core/wire-shared.d.ts +32 -0
- package/core/wire-shared.d.ts.map +1 -0
- package/core/wire-shared.js +76 -0
- package/core/wms-axis.d.ts +36 -0
- package/core/wms-axis.d.ts.map +1 -0
- package/core/wms-axis.js +73 -0
- package/core/wms-capabilities.d.ts +110 -0
- package/core/wms-capabilities.d.ts.map +1 -0
- package/core/wms-capabilities.js +559 -0
- package/core/wms-types.d.ts +128 -0
- package/core/wms-types.d.ts.map +1 -0
- package/core/wms-types.js +32 -0
- package/core/wms.d.ts +144 -0
- package/core/wms.d.ts.map +1 -0
- package/core/wms.js +338 -0
- package/core/wmts-capabilities.d.ts +82 -0
- package/core/wmts-capabilities.d.ts.map +1 -0
- package/core/wmts-capabilities.js +402 -0
- package/core/wmts.d.ts +103 -0
- package/core/wmts.d.ts.map +1 -0
- package/core/wmts.js +332 -0
- package/core/xml-text.d.ts +20 -0
- package/core/xml-text.d.ts.map +1 -0
- package/core/xml-text.js +85 -0
- package/esri-compat/basemap-gallery.d.ts +38 -0
- package/esri-compat/basemap-gallery.d.ts.map +1 -0
- package/esri-compat/basemap-gallery.js +159 -0
- package/esri-compat/basemap-layer-list.d.ts +35 -0
- package/esri-compat/basemap-layer-list.d.ts.map +1 -0
- package/esri-compat/basemap-layer-list.js +139 -0
- package/esri-compat/basemap.d.ts +32 -0
- package/esri-compat/basemap.d.ts.map +1 -0
- package/esri-compat/basemap.js +84 -0
- package/esri-compat/bookmarks.d.ts +36 -0
- package/esri-compat/bookmarks.d.ts.map +1 -0
- package/esri-compat/bookmarks.js +108 -0
- package/esri-compat/class-breaks-renderer.d.ts +50 -0
- package/esri-compat/class-breaks-renderer.d.ts.map +1 -0
- package/esri-compat/class-breaks-renderer.js +164 -0
- package/esri-compat/color.d.ts +22 -0
- package/esri-compat/color.d.ts.map +1 -0
- package/esri-compat/color.js +106 -0
- package/esri-compat/controls.d.ts +174 -0
- package/esri-compat/controls.d.ts.map +1 -0
- package/esri-compat/controls.js +479 -0
- package/esri-compat/coordinate-conversion.d.ts +41 -0
- package/esri-compat/coordinate-conversion.d.ts.map +1 -0
- package/esri-compat/coordinate-conversion.js +125 -0
- package/esri-compat/directions.d.ts +45 -0
- package/esri-compat/directions.d.ts.map +1 -0
- package/esri-compat/directions.js +123 -0
- package/esri-compat/editor.d.ts +47 -0
- package/esri-compat/editor.d.ts.map +1 -0
- package/esri-compat/editor.js +170 -0
- package/esri-compat/esri-config.d.ts +16 -0
- package/esri-compat/esri-config.d.ts.map +1 -0
- package/esri-compat/esri-config.js +23 -0
- package/esri-compat/esri-request.d.ts +17 -0
- package/esri-compat/esri-request.d.ts.map +1 -0
- package/esri-compat/esri-request.js +127 -0
- package/esri-compat/event-bus.d.ts +106 -0
- package/esri-compat/event-bus.d.ts.map +1 -0
- package/esri-compat/event-bus.js +90 -0
- package/esri-compat/expand.d.ts +36 -0
- package/esri-compat/expand.d.ts.map +1 -0
- package/esri-compat/expand.js +97 -0
- package/esri-compat/extent.d.ts +43 -0
- package/esri-compat/extent.d.ts.map +1 -0
- package/esri-compat/extent.js +140 -0
- package/esri-compat/feature-filter.d.ts +55 -0
- package/esri-compat/feature-filter.d.ts.map +1 -0
- package/esri-compat/feature-filter.js +109 -0
- package/esri-compat/feature-form.d.ts +64 -0
- package/esri-compat/feature-form.d.ts.map +1 -0
- package/esri-compat/feature-form.js +137 -0
- package/esri-compat/feature-layer.d.ts +173 -0
- package/esri-compat/feature-layer.d.ts.map +1 -0
- package/esri-compat/feature-layer.js +661 -0
- package/esri-compat/feature-set.d.ts +32 -0
- package/esri-compat/feature-set.d.ts.map +1 -0
- package/esri-compat/feature-set.js +80 -0
- package/esri-compat/feature-table.d.ts +141 -0
- package/esri-compat/feature-table.d.ts.map +1 -0
- package/esri-compat/feature-table.js +500 -0
- package/esri-compat/feature-templates.d.ts +41 -0
- package/esri-compat/feature-templates.d.ts.map +1 -0
- package/esri-compat/feature-templates.js +97 -0
- package/esri-compat/feature.d.ts +33 -0
- package/esri-compat/feature.d.ts.map +1 -0
- package/esri-compat/feature.js +83 -0
- package/esri-compat/geojson-layer.d.ts +86 -0
- package/esri-compat/geojson-layer.d.ts.map +1 -0
- package/esri-compat/geojson-layer.js +191 -0
- package/esri-compat/geometry-engine.d.ts +107 -0
- package/esri-compat/geometry-engine.d.ts.map +1 -0
- package/esri-compat/geometry-engine.js +266 -0
- package/esri-compat/graphic.d.ts +46 -0
- package/esri-compat/graphic.d.ts.map +1 -0
- package/esri-compat/graphic.js +103 -0
- package/esri-compat/graphics-layer.d.ts +49 -0
- package/esri-compat/graphics-layer.d.ts.map +1 -0
- package/esri-compat/graphics-layer.js +185 -0
- package/esri-compat/group-layer.d.ts +48 -0
- package/esri-compat/group-layer.d.ts.map +1 -0
- package/esri-compat/group-layer.js +212 -0
- package/esri-compat/identify.d.ts +71 -0
- package/esri-compat/identify.d.ts.map +1 -0
- package/esri-compat/identify.js +299 -0
- package/esri-compat/identity-manager.d.ts +31 -0
- package/esri-compat/identity-manager.d.ts.map +1 -0
- package/esri-compat/identity-manager.js +115 -0
- package/esri-compat/imagery-layer.d.ts +78 -0
- package/esri-compat/imagery-layer.d.ts.map +1 -0
- package/esri-compat/imagery-layer.js +167 -0
- package/esri-compat/label-class.d.ts +31 -0
- package/esri-compat/label-class.d.ts.map +1 -0
- package/esri-compat/label-class.js +102 -0
- package/esri-compat/layer-list.d.ts +77 -0
- package/esri-compat/layer-list.d.ts.map +1 -0
- package/esri-compat/layer-list.js +342 -0
- package/esri-compat/legend.d.ts +53 -0
- package/esri-compat/legend.d.ts.map +1 -0
- package/esri-compat/legend.js +254 -0
- package/esri-compat/map-image-layer.d.ts +162 -0
- package/esri-compat/map-image-layer.d.ts.map +1 -0
- package/esri-compat/map-image-layer.js +709 -0
- package/esri-compat/map-view.d.ts +323 -0
- package/esri-compat/map-view.d.ts.map +1 -0
- package/esri-compat/map-view.js +1175 -0
- package/esri-compat/map.d.ts +47 -0
- package/esri-compat/map.d.ts.map +1 -0
- package/esri-compat/map.js +209 -0
- package/esri-compat/measurement-2d.d.ts +61 -0
- package/esri-compat/measurement-2d.d.ts.map +1 -0
- package/esri-compat/measurement-2d.js +184 -0
- package/esri-compat/measurement.d.ts +45 -0
- package/esri-compat/measurement.d.ts.map +1 -0
- package/esri-compat/measurement.js +193 -0
- package/esri-compat/oauth-info.d.ts +35 -0
- package/esri-compat/oauth-info.d.ts.map +1 -0
- package/esri-compat/oauth-info.js +115 -0
- package/esri-compat/picture-marker-symbol.d.ts +35 -0
- package/esri-compat/picture-marker-symbol.d.ts.map +1 -0
- package/esri-compat/picture-marker-symbol.js +126 -0
- package/esri-compat/point.d.ts +31 -0
- package/esri-compat/point.d.ts.map +1 -0
- package/esri-compat/point.js +102 -0
- package/esri-compat/polygon.d.ts +31 -0
- package/esri-compat/polygon.d.ts.map +1 -0
- package/esri-compat/polygon.js +107 -0
- package/esri-compat/polyline.d.ts +31 -0
- package/esri-compat/polyline.d.ts.map +1 -0
- package/esri-compat/polyline.js +107 -0
- package/esri-compat/popup-template.d.ts +55 -0
- package/esri-compat/popup-template.d.ts.map +1 -0
- package/esri-compat/popup-template.js +128 -0
- package/esri-compat/popup.d.ts +54 -0
- package/esri-compat/popup.d.ts.map +1 -0
- package/esri-compat/popup.js +312 -0
- package/esri-compat/print.d.ts +47 -0
- package/esri-compat/print.d.ts.map +1 -0
- package/esri-compat/print.js +105 -0
- package/esri-compat/query.d.ts +58 -0
- package/esri-compat/query.d.ts.map +1 -0
- package/esri-compat/query.js +128 -0
- package/esri-compat/reactive-utils.d.ts +24 -0
- package/esri-compat/reactive-utils.d.ts.map +1 -0
- package/esri-compat/reactive-utils.js +193 -0
- package/esri-compat/request.d.ts +41 -0
- package/esri-compat/request.d.ts.map +1 -0
- package/esri-compat/request.js +253 -0
- package/esri-compat/route-layer.d.ts +59 -0
- package/esri-compat/route-layer.d.ts.map +1 -0
- package/esri-compat/route-layer.js +223 -0
- package/esri-compat/route-task.d.ts +88 -0
- package/esri-compat/route-task.d.ts.map +1 -0
- package/esri-compat/route-task.js +225 -0
- package/esri-compat/scene-view.d.ts +41 -0
- package/esri-compat/scene-view.d.ts.map +1 -0
- package/esri-compat/scene-view.js +68 -0
- package/esri-compat/search.d.ts +112 -0
- package/esri-compat/search.d.ts.map +1 -0
- package/esri-compat/search.js +820 -0
- package/esri-compat/simple-fill-symbol.d.ts +27 -0
- package/esri-compat/simple-fill-symbol.d.ts.map +1 -0
- package/esri-compat/simple-fill-symbol.js +85 -0
- package/esri-compat/simple-line-symbol.d.ts +27 -0
- package/esri-compat/simple-line-symbol.d.ts.map +1 -0
- package/esri-compat/simple-line-symbol.js +85 -0
- package/esri-compat/simple-marker-symbol.d.ts +29 -0
- package/esri-compat/simple-marker-symbol.d.ts.map +1 -0
- package/esri-compat/simple-marker-symbol.js +92 -0
- package/esri-compat/simple-renderer.d.ts +29 -0
- package/esri-compat/simple-renderer.d.ts.map +1 -0
- package/esri-compat/simple-renderer.js +92 -0
- package/esri-compat/sketch.d.ts +64 -0
- package/esri-compat/sketch.d.ts.map +1 -0
- package/esri-compat/sketch.js +227 -0
- package/esri-compat/spatial-reference.d.ts +31 -0
- package/esri-compat/spatial-reference.d.ts.map +1 -0
- package/esri-compat/spatial-reference.js +102 -0
- package/esri-compat/swipe.d.ts +34 -0
- package/esri-compat/swipe.d.ts.map +1 -0
- package/esri-compat/swipe.js +93 -0
- package/esri-compat/table-list.d.ts +36 -0
- package/esri-compat/table-list.d.ts.map +1 -0
- package/esri-compat/table-list.js +126 -0
- package/esri-compat/text-symbol.d.ts +37 -0
- package/esri-compat/text-symbol.d.ts.map +1 -0
- package/esri-compat/text-symbol.js +123 -0
- package/esri-compat/tile-layer.d.ts +52 -0
- package/esri-compat/tile-layer.d.ts.map +1 -0
- package/esri-compat/tile-layer.js +168 -0
- package/esri-compat/time-slider.d.ts +70 -0
- package/esri-compat/time-slider.d.ts.map +1 -0
- package/esri-compat/time-slider.js +208 -0
- package/esri-compat/track.d.ts +51 -0
- package/esri-compat/track.d.ts.map +1 -0
- package/esri-compat/track.js +174 -0
- package/esri-compat/unique-value-renderer.d.ts +41 -0
- package/esri-compat/unique-value-renderer.d.ts.map +1 -0
- package/esri-compat/unique-value-renderer.js +127 -0
- package/esri-compat/url.d.ts +13 -0
- package/esri-compat/url.d.ts.map +1 -0
- package/esri-compat/url.js +68 -0
- package/esri-compat/vector-tile-layer.d.ts +47 -0
- package/esri-compat/vector-tile-layer.d.ts.map +1 -0
- package/esri-compat/vector-tile-layer.js +130 -0
- package/esri-compat/web-map.d.ts +14 -0
- package/esri-compat/web-map.d.ts.map +1 -0
- package/esri-compat/web-map.js +24 -0
- package/esri-compat/wfs-layer.d.ts +64 -0
- package/esri-compat/wfs-layer.d.ts.map +1 -0
- package/esri-compat/wfs-layer.js +145 -0
- package/esri-compat/wms-layer.d.ts +76 -0
- package/esri-compat/wms-layer.d.ts.map +1 -0
- package/esri-compat/wms-layer.js +157 -0
- package/exploration/context.d.ts +25 -0
- package/exploration/context.d.ts.map +1 -0
- package/exploration/context.js +396 -0
- package/exploration/index.d.ts +27 -0
- package/exploration/index.d.ts.map +1 -0
- package/exploration/index.js +24 -0
- package/exploration/presets.d.ts +27 -0
- package/exploration/presets.d.ts.map +1 -0
- package/exploration/presets.js +114 -0
- package/exploration/reducer.d.ts +23 -0
- package/exploration/reducer.d.ts.map +1 -0
- package/exploration/reducer.js +332 -0
- package/exploration/selection.d.ts +25 -0
- package/exploration/selection.d.ts.map +1 -0
- package/exploration/selection.js +34 -0
- package/exploration/selectors.d.ts +56 -0
- package/exploration/selectors.d.ts.map +1 -0
- package/exploration/selectors.js +110 -0
- package/exploration/types.d.ts +294 -0
- package/exploration/types.d.ts.map +1 -0
- package/exploration/types.js +33 -0
- package/expr/expression.d.ts +457 -0
- package/expr/expression.d.ts.map +1 -0
- package/expr/expression.js +663 -0
- package/expr/index.d.ts +32 -0
- package/expr/index.d.ts.map +1 -0
- package/expr/index.js +30 -0
- package/gen/honua/v1/feature_service_pb.d.ts +918 -0
- package/gen/honua/v1/feature_service_pb.d.ts.map +1 -0
- package/gen/honua/v1/feature_service_pb.js +375 -0
- package/generated-app/errors.d.ts +41 -0
- package/generated-app/errors.d.ts.map +1 -0
- package/generated-app/errors.js +41 -0
- package/generated-app/index.d.ts +17 -0
- package/generated-app/index.d.ts.map +1 -0
- package/generated-app/index.js +12 -0
- package/generated-app/manifest.d.ts +183 -0
- package/generated-app/manifest.d.ts.map +1 -0
- package/generated-app/manifest.js +14 -0
- package/generated-app/projection.d.ts +44 -0
- package/generated-app/projection.d.ts.map +1 -0
- package/generated-app/projection.js +234 -0
- package/generated-app/runtime.d.ts +215 -0
- package/generated-app/runtime.d.ts.map +1 -0
- package/generated-app/runtime.js +1196 -0
- package/interactions/detail-model.d.ts +54 -0
- package/interactions/detail-model.d.ts.map +1 -0
- package/interactions/detail-model.js +105 -0
- package/interactions/exploration-bindings.d.ts +120 -0
- package/interactions/exploration-bindings.d.ts.map +1 -0
- package/interactions/exploration-bindings.js +218 -0
- package/interactions/feature-state.d.ts +144 -0
- package/interactions/feature-state.d.ts.map +1 -0
- package/interactions/feature-state.js +169 -0
- package/interactions/hit-test.d.ts +112 -0
- package/interactions/hit-test.d.ts.map +1 -0
- package/interactions/hit-test.js +291 -0
- package/interactions/index.d.ts +31 -0
- package/interactions/index.d.ts.map +1 -0
- package/interactions/index.js +24 -0
- package/interactions/share-state.d.ts +36 -0
- package/interactions/share-state.d.ts.map +1 -0
- package/interactions/share-state.js +123 -0
- package/map/feature-service-adapter.d.ts +138 -0
- package/map/feature-service-adapter.d.ts.map +1 -0
- package/map/feature-service-adapter.js +279 -0
- package/map/honua-map.d.ts +203 -0
- package/map/honua-map.d.ts.map +1 -0
- package/map/honua-map.js +347 -0
- package/map/index.d.ts +27 -0
- package/map/index.d.ts.map +1 -0
- package/map/index.js +22 -0
- package/map/maplibre-target.d.ts +103 -0
- package/map/maplibre-target.d.ts.map +1 -0
- package/map/maplibre-target.js +164 -0
- package/map/webmap-maplibre.d.ts +60 -0
- package/map/webmap-maplibre.d.ts.map +1 -0
- package/map/webmap-maplibre.js +212 -0
- package/package.json +37 -0
- package/react/context.d.ts +32 -0
- package/react/context.d.ts.map +1 -0
- package/react/context.js +19 -0
- package/react/honua-layer.d.ts +35 -0
- package/react/honua-layer.d.ts.map +1 -0
- package/react/honua-layer.js +47 -0
- package/react/honua-map.d.ts +83 -0
- package/react/honua-map.d.ts.map +1 -0
- package/react/honua-map.js +109 -0
- package/react/honua-popup.d.ts +26 -0
- package/react/honua-popup.d.ts.map +1 -0
- package/react/honua-popup.js +34 -0
- package/react/hooks.d.ts +127 -0
- package/react/hooks.d.ts.map +1 -0
- package/react/hooks.js +206 -0
- package/react/index.d.ts +42 -0
- package/react/index.d.ts.map +1 -0
- package/react/index.js +34 -0
- package/react/provider.d.ts +36 -0
- package/react/provider.d.ts.map +1 -0
- package/react/provider.js +35 -0
- package/react/query-cache.d.ts +76 -0
- package/react/query-cache.d.ts.map +1 -0
- package/react/query-cache.js +188 -0
- package/runtime/diff.d.ts +31 -0
- package/runtime/diff.d.ts.map +1 -0
- package/runtime/diff.js +143 -0
- package/runtime/errors.d.ts +40 -0
- package/runtime/errors.d.ts.map +1 -0
- package/runtime/errors.js +35 -0
- package/runtime/index.d.ts +59 -0
- package/runtime/index.d.ts.map +1 -0
- package/runtime/index.js +43 -0
- package/runtime/legend.d.ts +23 -0
- package/runtime/legend.d.ts.map +1 -0
- package/runtime/legend.js +38 -0
- package/runtime/load-package.d.ts +125 -0
- package/runtime/load-package.d.ts.map +1 -0
- package/runtime/load-package.js +264 -0
- package/runtime/map-package-fetch.d.ts +107 -0
- package/runtime/map-package-fetch.d.ts.map +1 -0
- package/runtime/map-package-fetch.js +336 -0
- package/runtime/map-package-realtime.d.ts +169 -0
- package/runtime/map-package-realtime.d.ts.map +1 -0
- package/runtime/map-package-realtime.js +350 -0
- package/runtime/map-package-validation.d.ts +43 -0
- package/runtime/map-package-validation.d.ts.map +1 -0
- package/runtime/map-package-validation.js +269 -0
- package/runtime/map-package-watch.d.ts +78 -0
- package/runtime/map-package-watch.d.ts.map +1 -0
- package/runtime/map-package-watch.js +695 -0
- package/runtime/map-package.d.ts +167 -0
- package/runtime/map-package.d.ts.map +1 -0
- package/runtime/map-package.js +15 -0
- package/runtime/ogc-styles.d.ts +110 -0
- package/runtime/ogc-styles.d.ts.map +1 -0
- package/runtime/ogc-styles.js +195 -0
- package/runtime/popups.d.ts +62 -0
- package/runtime/popups.d.ts.map +1 -0
- package/runtime/popups.js +95 -0
- package/runtime/query-tiles.d.ts +217 -0
- package/runtime/query-tiles.d.ts.map +1 -0
- package/runtime/query-tiles.js +801 -0
- package/runtime/runtime.d.ts +243 -0
- package/runtime/runtime.d.ts.map +1 -0
- package/runtime/runtime.js +1147 -0
- package/runtime/source-bridge.d.ts +99 -0
- package/runtime/source-bridge.d.ts.map +1 -0
- package/runtime/source-bridge.js +401 -0
- package/runtime/style-compose.d.ts +46 -0
- package/runtime/style-compose.d.ts.map +1 -0
- package/runtime/style-compose.js +144 -0
- package/runtime/style-interactions.d.ts +141 -0
- package/runtime/style-interactions.d.ts.map +1 -0
- package/runtime/style-interactions.js +574 -0
- package/runtime/style-spec-validation.d.ts +23 -0
- package/runtime/style-spec-validation.d.ts.map +1 -0
- package/runtime/style-spec-validation.js +357 -0
- package/studio/capability-manifest.d.ts +285 -0
- package/studio/capability-manifest.d.ts.map +1 -0
- package/studio/capability-manifest.js +59 -0
- package/studio/chart-spec.d.ts +85 -0
- package/studio/chart-spec.d.ts.map +1 -0
- package/studio/chart-spec.js +106 -0
- package/studio/index.d.ts +34 -0
- package/studio/index.d.ts.map +1 -0
- package/studio/index.js +27 -0
- package/studio/provenance.d.ts +131 -0
- package/studio/provenance.d.ts.map +1 -0
- package/studio/provenance.js +39 -0
- package/studio/publish.d.ts +64 -0
- package/studio/publish.d.ts.map +1 -0
- package/studio/publish.js +13 -0
- package/studio/types.d.ts +278 -0
- package/studio/types.d.ts.map +1 -0
- package/studio/types.js +71 -0
- package/studio/validate.d.ts +45 -0
- package/studio/validate.d.ts.map +1 -0
- package/studio/validate.js +255 -0
- package/studio/validation.d.ts +112 -0
- package/studio/validation.d.ts.map +1 -0
- package/studio/validation.js +42 -0
- package/style/factory.d.ts +30 -0
- package/style/factory.d.ts.map +1 -0
- package/style/factory.js +61 -0
- package/style/index.d.ts +25 -0
- package/style/index.d.ts.map +1 -0
- package/style/index.js +24 -0
- package/style/specification.d.ts +203 -0
- package/style/specification.d.ts.map +1 -0
- package/style/specification.js +178 -0
- package/style/wms-wmts-resolvers.d.ts +38 -0
- package/style/wms-wmts-resolvers.d.ts.map +1 -0
- package/style/wms-wmts-resolvers.js +92 -0
- package/webmap/contract.d.ts +28 -0
- package/webmap/contract.d.ts.map +1 -0
- package/webmap/contract.js +130 -0
- package/webmap/convert-basemap.d.ts +17 -0
- package/webmap/convert-basemap.d.ts.map +1 -0
- package/webmap/convert-basemap.js +78 -0
- package/webmap/convert-extent.d.ts +17 -0
- package/webmap/convert-extent.d.ts.map +1 -0
- package/webmap/convert-extent.js +114 -0
- package/webmap/convert-label.d.ts +13 -0
- package/webmap/convert-label.d.ts.map +1 -0
- package/webmap/convert-label.js +125 -0
- package/webmap/convert-layer.d.ts +22 -0
- package/webmap/convert-layer.d.ts.map +1 -0
- package/webmap/convert-layer.js +181 -0
- package/webmap/convert-popup.d.ts +34 -0
- package/webmap/convert-popup.d.ts.map +1 -0
- package/webmap/convert-popup.js +68 -0
- package/webmap/convert-renderer.d.ts +17 -0
- package/webmap/convert-renderer.d.ts.map +1 -0
- package/webmap/convert-renderer.js +161 -0
- package/webmap/convert-symbol.d.ts +17 -0
- package/webmap/convert-symbol.d.ts.map +1 -0
- package/webmap/convert-symbol.js +122 -0
- package/webmap/index.d.ts +44 -0
- package/webmap/index.d.ts.map +1 -0
- package/webmap/index.js +33 -0
- package/webmap/parse.d.ts +25 -0
- package/webmap/parse.d.ts.map +1 -0
- package/webmap/parse.js +83 -0
- package/webmap/types.d.ts +264 -0
- package/webmap/types.d.ts.map +1 -0
- package/webmap/types.js +13 -0
- package/webmap/warnings.d.ts +30 -0
- package/webmap/warnings.d.ts.map +1 -0
- package/webmap/warnings.js +37 -0
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Framework-neutral popup/detail data preparation helpers.
|
|
3
|
+
*
|
|
4
|
+
* These helpers consume selection targets and query results from the existing
|
|
5
|
+
* exploration surfaces. They do not own interaction state.
|
|
6
|
+
*
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
import type { FeatureId, SourceId } from "../contract/types.js";
|
|
10
|
+
import type { FeatureSelectionTarget } from "../exploration/types.js";
|
|
11
|
+
export interface DetailFeatureLike {
|
|
12
|
+
readonly id?: FeatureId;
|
|
13
|
+
readonly sourceId?: SourceId;
|
|
14
|
+
readonly sourceLayer?: string;
|
|
15
|
+
readonly attributes?: Readonly<Record<string, unknown>>;
|
|
16
|
+
readonly properties?: Readonly<Record<string, unknown>>;
|
|
17
|
+
readonly geometry?: unknown;
|
|
18
|
+
}
|
|
19
|
+
export interface DetailFieldDefinition {
|
|
20
|
+
readonly name: string;
|
|
21
|
+
readonly label?: string;
|
|
22
|
+
readonly visible?: boolean;
|
|
23
|
+
readonly formatter?: (value: unknown, feature: DetailFeatureLike) => unknown;
|
|
24
|
+
}
|
|
25
|
+
export interface DetailModelOptions {
|
|
26
|
+
readonly selection: ReadonlyArray<FeatureSelectionTarget>;
|
|
27
|
+
readonly features?: ReadonlyArray<DetailFeatureLike>;
|
|
28
|
+
readonly sourceId?: SourceId;
|
|
29
|
+
readonly sourceLayer?: string;
|
|
30
|
+
readonly objectIdField?: string;
|
|
31
|
+
readonly titleField?: string;
|
|
32
|
+
readonly fields?: ReadonlyArray<DetailFieldDefinition | string>;
|
|
33
|
+
readonly includeHiddenFields?: boolean;
|
|
34
|
+
}
|
|
35
|
+
export type DetailSelectionStatus = "empty" | "ready" | "stale";
|
|
36
|
+
export interface DetailFieldModel {
|
|
37
|
+
readonly name: string;
|
|
38
|
+
readonly label: string;
|
|
39
|
+
readonly value: unknown;
|
|
40
|
+
}
|
|
41
|
+
export interface DetailModel {
|
|
42
|
+
readonly status: DetailSelectionStatus;
|
|
43
|
+
readonly target?: FeatureSelectionTarget;
|
|
44
|
+
readonly feature?: DetailFeatureLike;
|
|
45
|
+
readonly title?: string;
|
|
46
|
+
readonly attributes: Readonly<Record<string, unknown>>;
|
|
47
|
+
readonly fields: ReadonlyArray<DetailFieldModel>;
|
|
48
|
+
readonly geometry?: unknown;
|
|
49
|
+
}
|
|
50
|
+
/** Build one detail model per selected target. */
|
|
51
|
+
export declare function prepareSelectionDetailModels(options: DetailModelOptions): DetailModel[];
|
|
52
|
+
/** Build the primary popup/detail model for the first selected target. */
|
|
53
|
+
export declare function preparePrimaryDetailModel(options: DetailModelOptions): DetailModel;
|
|
54
|
+
//# sourceMappingURL=detail-model.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detail-model.d.ts","sourceRoot":"","sources":["../../../src/interactions/detail-model.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAMhE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAEtE,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAC7B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACxD,QAAQ,CAAC,UAAU,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACxD,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,iBAAiB,KAAK,OAAO,CAAC;CAC9E;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC,sBAAsB,CAAC,CAAC;IAC1D,QAAQ,CAAC,QAAQ,CAAC,EAAE,aAAa,CAAC,iBAAiB,CAAC,CAAC;IACrD,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAC7B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,CAAC,EAAE,aAAa,CAAC,qBAAqB,GAAG,MAAM,CAAC,CAAC;IAChE,QAAQ,CAAC,mBAAmB,CAAC,EAAE,OAAO,CAAC;CACxC;AAED,MAAM,MAAM,qBAAqB,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;AAEhE,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,MAAM,EAAE,qBAAqB,CAAC;IACvC,QAAQ,CAAC,MAAM,CAAC,EAAE,sBAAsB,CAAC;IACzC,QAAQ,CAAC,OAAO,CAAC,EAAE,iBAAiB,CAAC;IACrC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACvD,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,gBAAgB,CAAC,CAAC;IACjD,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,kDAAkD;AAClD,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,kBAAkB,GAAG,WAAW,EAAE,CAgBvF;AAED,0EAA0E;AAC1E,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,kBAAkB,GAAG,WAAW,CAElF"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Framework-neutral popup/detail data preparation helpers.
|
|
3
|
+
*
|
|
4
|
+
* These helpers consume selection targets and query results from the existing
|
|
5
|
+
* exploration surfaces. They do not own interaction state.
|
|
6
|
+
*
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
import { featureSelectionKey, isSourceQualifiedSelectionTarget, sourceFeatureSelectionTarget, } from "../exploration/selection.js";
|
|
10
|
+
/** Build one detail model per selected target. */
|
|
11
|
+
export function prepareSelectionDetailModels(options) {
|
|
12
|
+
const selection = options.selection;
|
|
13
|
+
if (selection.length === 0)
|
|
14
|
+
return [emptyDetailModel()];
|
|
15
|
+
const features = options.features ?? [];
|
|
16
|
+
const bySelectionKey = new Map();
|
|
17
|
+
for (const feature of features) {
|
|
18
|
+
const target = featureToSelectionTarget(feature, options);
|
|
19
|
+
if (target)
|
|
20
|
+
bySelectionKey.set(featureSelectionKey(target), feature);
|
|
21
|
+
}
|
|
22
|
+
return selection.map((target) => {
|
|
23
|
+
const feature = bySelectionKey.get(featureSelectionKey(target));
|
|
24
|
+
if (!feature)
|
|
25
|
+
return staleDetailModel(target);
|
|
26
|
+
return readyDetailModel(target, feature, options);
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
/** Build the primary popup/detail model for the first selected target. */
|
|
30
|
+
export function preparePrimaryDetailModel(options) {
|
|
31
|
+
return prepareSelectionDetailModels(options)[0] ?? emptyDetailModel();
|
|
32
|
+
}
|
|
33
|
+
function readyDetailModel(target, feature, options) {
|
|
34
|
+
const attributes = featureAttributes(feature);
|
|
35
|
+
return {
|
|
36
|
+
status: "ready",
|
|
37
|
+
target,
|
|
38
|
+
feature,
|
|
39
|
+
title: detailTitle(attributes, options.titleField, target),
|
|
40
|
+
attributes,
|
|
41
|
+
fields: detailFields(feature, attributes, options),
|
|
42
|
+
geometry: feature.geometry,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
function emptyDetailModel() {
|
|
46
|
+
return {
|
|
47
|
+
status: "empty",
|
|
48
|
+
attributes: {},
|
|
49
|
+
fields: [],
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
function staleDetailModel(target) {
|
|
53
|
+
return {
|
|
54
|
+
status: "stale",
|
|
55
|
+
target,
|
|
56
|
+
attributes: {},
|
|
57
|
+
fields: [],
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
function featureToSelectionTarget(feature, options) {
|
|
61
|
+
const id = featureId(feature, options.objectIdField);
|
|
62
|
+
if (id === undefined)
|
|
63
|
+
return undefined;
|
|
64
|
+
const sourceId = feature.sourceId ?? options.sourceId;
|
|
65
|
+
if (!sourceId)
|
|
66
|
+
return id;
|
|
67
|
+
return sourceFeatureSelectionTarget(sourceId, id, { sourceLayer: feature.sourceLayer ?? options.sourceLayer });
|
|
68
|
+
}
|
|
69
|
+
function featureId(feature, objectIdField) {
|
|
70
|
+
if (feature.id !== undefined)
|
|
71
|
+
return feature.id;
|
|
72
|
+
const attributes = featureAttributes(feature);
|
|
73
|
+
const value = (objectIdField ? attributes[objectIdField] : undefined) ??
|
|
74
|
+
attributes.OBJECTID ??
|
|
75
|
+
attributes.objectid ??
|
|
76
|
+
attributes.ObjectID ??
|
|
77
|
+
attributes.id;
|
|
78
|
+
return typeof value === "string" || typeof value === "number" ? value : undefined;
|
|
79
|
+
}
|
|
80
|
+
function featureAttributes(feature) {
|
|
81
|
+
return feature.attributes ?? feature.properties ?? {};
|
|
82
|
+
}
|
|
83
|
+
function detailTitle(attributes, titleField, target) {
|
|
84
|
+
const title = titleField ? attributes[titleField] : undefined;
|
|
85
|
+
if (title !== undefined && title !== null && String(title).length > 0)
|
|
86
|
+
return String(title);
|
|
87
|
+
if (isSourceQualifiedSelectionTarget(target))
|
|
88
|
+
return `${target.sourceId} ${String(target.id)}`;
|
|
89
|
+
return String(target);
|
|
90
|
+
}
|
|
91
|
+
function detailFields(feature, attributes, options) {
|
|
92
|
+
const definitions = options.fields ?? Object.keys(attributes);
|
|
93
|
+
const out = [];
|
|
94
|
+
for (const definition of definitions) {
|
|
95
|
+
const field = typeof definition === "string" ? { name: definition } : definition;
|
|
96
|
+
if (field.visible === false && !options.includeHiddenFields)
|
|
97
|
+
continue;
|
|
98
|
+
out.push({
|
|
99
|
+
name: field.name,
|
|
100
|
+
label: field.label ?? field.name,
|
|
101
|
+
value: field.formatter ? field.formatter(attributes[field.name], feature) : attributes[field.name],
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
return out;
|
|
105
|
+
}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Interaction bindings between map/table/detail surfaces and
|
|
3
|
+
* `ExplorationViewController`.
|
|
4
|
+
*
|
|
5
|
+
* These helpers keep component adapters small: maps publish source-qualified
|
|
6
|
+
* selection targets, tables publish the same targets, maps observe shared
|
|
7
|
+
* selection to update feature-state, and detail panels subscribe to the
|
|
8
|
+
* shared selection slice.
|
|
9
|
+
*
|
|
10
|
+
* @module
|
|
11
|
+
*/
|
|
12
|
+
import type { AggregationSpec } from "../contract/types.js";
|
|
13
|
+
import type { HonuaExtent } from "../core/types.js";
|
|
14
|
+
import type { ExplorationSelectorListener, ExplorationSelectorSubscribeOptions, LinkedViewQueryProjection, LinkedViewQueryProjectionOptions } from "../exploration/selectors.js";
|
|
15
|
+
import type { ExplorationViewChangeEvent, ExplorationViewController, ExplorationViewSubscribeOptions, ExplorationViewSubscription, FeatureSelectionTarget, FilterClause, Unsubscribe } from "../exploration/types.js";
|
|
16
|
+
import type { FeatureStateMap, InteractiveMap, SelectionHandle, SelectionHandlerOptions } from "./feature-state.js";
|
|
17
|
+
export interface MapSelectionExplorationBindingOptions extends SelectionHandlerOptions {
|
|
18
|
+
/** Replace the exploration selection with the map selection. @default true */
|
|
19
|
+
readonly replaceSelection?: boolean;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Bind a MapLibre-style selection handler to an exploration view.
|
|
23
|
+
*
|
|
24
|
+
* The map handler already knows its source and source layer, so this publishes
|
|
25
|
+
* source-qualified targets into the shared exploration selection slice.
|
|
26
|
+
*/
|
|
27
|
+
export declare function bindMapSelectionToExploration(map: InteractiveMap, view: ExplorationViewController, options: MapSelectionExplorationBindingOptions): SelectionHandle;
|
|
28
|
+
export interface FeatureStateSelectionSyncOptions {
|
|
29
|
+
readonly source: string;
|
|
30
|
+
readonly sourceLayer?: string;
|
|
31
|
+
readonly stateKey?: string;
|
|
32
|
+
/** Apply raw legacy ids to this source. @default true */
|
|
33
|
+
readonly includeRawIds?: boolean;
|
|
34
|
+
/** Apply current view state immediately. @default true */
|
|
35
|
+
readonly applyInitial?: boolean;
|
|
36
|
+
readonly subscribeOptions?: ExplorationViewSubscribeOptions;
|
|
37
|
+
}
|
|
38
|
+
export interface InteractionBindingHandle {
|
|
39
|
+
remove(): void;
|
|
40
|
+
}
|
|
41
|
+
export interface LinkedViewQueryBindingOptions extends LinkedViewQueryProjectionOptions, ExplorationViewSubscribeOptions {
|
|
42
|
+
/** Slices that should recompute the projection. */
|
|
43
|
+
readonly subscription?: ExplorationViewSubscription;
|
|
44
|
+
/** Emit the current projection before waiting for changes. @default true */
|
|
45
|
+
readonly applyInitial?: boolean;
|
|
46
|
+
/** Equality check used to suppress unchanged projections. @default deep value equality */
|
|
47
|
+
readonly equals?: (a: LinkedViewQueryProjection, b: LinkedViewQueryProjection) => boolean;
|
|
48
|
+
}
|
|
49
|
+
export interface MapExtentExplorationSource {
|
|
50
|
+
current?(): HonuaExtent | undefined;
|
|
51
|
+
subscribe(listener: (extent: HonuaExtent | undefined) => void): Unsubscribe | InteractionBindingHandle;
|
|
52
|
+
}
|
|
53
|
+
export interface MapExtentExplorationBindingOptions {
|
|
54
|
+
/** Publish the source's current extent on bind when available. @default true */
|
|
55
|
+
readonly applyInitial?: boolean;
|
|
56
|
+
/** Also mirror the extent into `spatialFilter`. @default false */
|
|
57
|
+
readonly publishSpatialFilter?: boolean;
|
|
58
|
+
/** Coalesce same-tick move events before dispatching. @default true */
|
|
59
|
+
readonly coalesce?: boolean;
|
|
60
|
+
}
|
|
61
|
+
export interface FilterControlsExplorationBinding {
|
|
62
|
+
setFilter(id: string, clause: FilterClause): void;
|
|
63
|
+
clearFilter(id: string): void;
|
|
64
|
+
subscribe(listener: ExplorationSelectorListener<Readonly<Record<string, FilterClause>>>, options?: ExplorationSelectorSubscribeOptions<Readonly<Record<string, FilterClause>>>): Unsubscribe;
|
|
65
|
+
}
|
|
66
|
+
export interface ChartBucketSelection {
|
|
67
|
+
readonly targets?: ReadonlyArray<FeatureSelectionTarget>;
|
|
68
|
+
readonly filters?: Readonly<Record<string, FilterClause>>;
|
|
69
|
+
}
|
|
70
|
+
export interface ChartBucketSelectionOptions {
|
|
71
|
+
/** Replace the current selection when the bucket supplies targets. @default true */
|
|
72
|
+
readonly replaceSelection?: boolean;
|
|
73
|
+
}
|
|
74
|
+
export interface ChartExplorationBinding {
|
|
75
|
+
setGrouping(grouping: ReadonlyArray<string>): void;
|
|
76
|
+
setAggregation(aggregation: AggregationSpec | undefined): void;
|
|
77
|
+
selectTargets(targets: ReadonlyArray<FeatureSelectionTarget>, options?: {
|
|
78
|
+
readonly replace?: boolean;
|
|
79
|
+
}): void;
|
|
80
|
+
selectBucket(bucket: ChartBucketSelection, options?: ChartBucketSelectionOptions): void;
|
|
81
|
+
subscribeQuery(listener: ExplorationSelectorListener<LinkedViewQueryProjection>, options?: LinkedViewQueryBindingOptions): Unsubscribe;
|
|
82
|
+
}
|
|
83
|
+
export interface MapLayerFilterTarget {
|
|
84
|
+
setFilter(layerId: string, filter: unknown): void;
|
|
85
|
+
}
|
|
86
|
+
export interface MapLayerFilterExplorationBindingOptions extends LinkedViewQueryBindingOptions {
|
|
87
|
+
readonly layerId: string;
|
|
88
|
+
readonly translate: (projection: LinkedViewQueryProjection) => unknown;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Reflect exploration selection into MapLibre feature-state.
|
|
92
|
+
*
|
|
93
|
+
* This is the table-to-map path: a table or detail panel can call
|
|
94
|
+
* `view.select(...)`; the map observes the shared selection slice and toggles
|
|
95
|
+
* feature-state for matching source-qualified targets.
|
|
96
|
+
*/
|
|
97
|
+
export declare function syncFeatureStateSelection(map: FeatureStateMap, view: ExplorationViewController, options: FeatureStateSelectionSyncOptions): InteractionBindingHandle;
|
|
98
|
+
/** Publish viewport extent changes from a map adapter into an exploration view. */
|
|
99
|
+
export declare function bindMapExtentToExploration(view: ExplorationViewController, source: MapExtentExplorationSource, options?: MapExtentExplorationBindingOptions): InteractionBindingHandle;
|
|
100
|
+
/** Subscribe a table, chart, or result adapter to the shared query projection. */
|
|
101
|
+
export declare function bindQueryProjectionToExploration(view: ExplorationViewController, listener: ExplorationSelectorListener<LinkedViewQueryProjection>, options?: LinkedViewQueryBindingOptions): Unsubscribe;
|
|
102
|
+
/** Adapter for filter bars and query-builder controls. */
|
|
103
|
+
export declare function bindFilterControlsToExploration(view: ExplorationViewController): FilterControlsExplorationBinding;
|
|
104
|
+
/** Adapter for chart/grouped-result controls that publish grouping, aggregation, filters, and selection. */
|
|
105
|
+
export declare function bindChartToExploration(view: ExplorationViewController): ChartExplorationBinding;
|
|
106
|
+
/** Reflect linked filter/query state into a MapLibre-style layer filter. */
|
|
107
|
+
export declare function syncMapLayerFilterToExploration(map: MapLayerFilterTarget, view: ExplorationViewController, options: MapLayerFilterExplorationBindingOptions): InteractionBindingHandle;
|
|
108
|
+
export type SelectionDetailListener = (selection: ReadonlyArray<FeatureSelectionTarget>, event: ExplorationViewChangeEvent) => void;
|
|
109
|
+
/** Subscribe a detail panel to the shared exploration selection. */
|
|
110
|
+
export declare function bindDetailToSelection(view: ExplorationViewController, listener: SelectionDetailListener, options?: ExplorationViewSubscribeOptions): Unsubscribe;
|
|
111
|
+
export interface TableSelectionExplorationBinding {
|
|
112
|
+
select(targets: ReadonlyArray<FeatureSelectionTarget>, options?: {
|
|
113
|
+
readonly replace?: boolean;
|
|
114
|
+
}): void;
|
|
115
|
+
clearSelection(): void;
|
|
116
|
+
subscribe(listener: SelectionDetailListener, options?: ExplorationViewSubscribeOptions): Unsubscribe;
|
|
117
|
+
}
|
|
118
|
+
/** Small adapter for table/grid components that publish and observe selection. */
|
|
119
|
+
export declare function bindTableSelectionToExploration(view: ExplorationViewController): TableSelectionExplorationBinding;
|
|
120
|
+
//# sourceMappingURL=exploration-bindings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exploration-bindings.d.ts","sourceRoot":"","sources":["../../../src/interactions/exploration-bindings.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Interaction bindings between map/table/detail surfaces and
|
|
3
|
+
* `ExplorationViewController`.
|
|
4
|
+
*
|
|
5
|
+
* These helpers keep component adapters small: maps publish source-qualified
|
|
6
|
+
* selection targets, tables publish the same targets, maps observe shared
|
|
7
|
+
* selection to update feature-state, and detail panels subscribe to the
|
|
8
|
+
* shared selection slice.
|
|
9
|
+
*
|
|
10
|
+
* @module
|
|
11
|
+
*/
|
|
12
|
+
import { featureSelectionKey, isSourceQualifiedSelectionTarget, sourceFeatureSelectionTarget, } from "../exploration/selection.js";
|
|
13
|
+
import { extentToSpatialFilter, selectLinkedViewQueryProjection, subscribeExplorationSelector, } from "../exploration/selectors.js";
|
|
14
|
+
import { createSelectionHandler } from "./feature-state.js";
|
|
15
|
+
/**
|
|
16
|
+
* Bind a MapLibre-style selection handler to an exploration view.
|
|
17
|
+
*
|
|
18
|
+
* The map handler already knows its source and source layer, so this publishes
|
|
19
|
+
* source-qualified targets into the shared exploration selection slice.
|
|
20
|
+
*/
|
|
21
|
+
export function bindMapSelectionToExploration(map, view, options) {
|
|
22
|
+
const { replaceSelection = true, onSelectionTargetsChange } = options;
|
|
23
|
+
return createSelectionHandler(map, {
|
|
24
|
+
...options,
|
|
25
|
+
onSelectionTargetsChange(targets) {
|
|
26
|
+
view.select(targets, { replace: replaceSelection });
|
|
27
|
+
onSelectionTargetsChange?.(targets);
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Reflect exploration selection into MapLibre feature-state.
|
|
33
|
+
*
|
|
34
|
+
* This is the table-to-map path: a table or detail panel can call
|
|
35
|
+
* `view.select(...)`; the map observes the shared selection slice and toggles
|
|
36
|
+
* feature-state for matching source-qualified targets.
|
|
37
|
+
*/
|
|
38
|
+
export function syncFeatureStateSelection(map, view, options) {
|
|
39
|
+
const { source, sourceLayer, stateKey = "selected", includeRawIds = true, applyInitial = true } = options;
|
|
40
|
+
let active = new Map();
|
|
41
|
+
function apply(selection) {
|
|
42
|
+
const next = new Map();
|
|
43
|
+
for (const target of selection) {
|
|
44
|
+
const featureTarget = toFeatureTarget(target, source, sourceLayer, includeRawIds);
|
|
45
|
+
if (!featureTarget)
|
|
46
|
+
continue;
|
|
47
|
+
next.set(featureTargetKey(featureTarget), featureTarget);
|
|
48
|
+
}
|
|
49
|
+
for (const [key, target] of active) {
|
|
50
|
+
if (!next.has(key))
|
|
51
|
+
map.setFeatureState(target, { [stateKey]: false });
|
|
52
|
+
}
|
|
53
|
+
for (const [key, target] of next) {
|
|
54
|
+
if (!active.has(key))
|
|
55
|
+
map.setFeatureState(target, { [stateKey]: true });
|
|
56
|
+
}
|
|
57
|
+
active = next;
|
|
58
|
+
}
|
|
59
|
+
const unsubscribe = view.subscribe("selection", (event) => apply(event.state.selection), options.subscribeOptions);
|
|
60
|
+
if (applyInitial)
|
|
61
|
+
apply(view.state.selection);
|
|
62
|
+
return {
|
|
63
|
+
remove() {
|
|
64
|
+
unsubscribe();
|
|
65
|
+
for (const target of active.values()) {
|
|
66
|
+
map.setFeatureState(target, { [stateKey]: false });
|
|
67
|
+
}
|
|
68
|
+
active.clear();
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
/** Publish viewport extent changes from a map adapter into an exploration view. */
|
|
73
|
+
export function bindMapExtentToExploration(view, source, options = {}) {
|
|
74
|
+
const { applyInitial = true, publishSpatialFilter = false, coalesce = true } = options;
|
|
75
|
+
let active = true;
|
|
76
|
+
let pending = false;
|
|
77
|
+
let latest;
|
|
78
|
+
function publish(extent) {
|
|
79
|
+
if (!active)
|
|
80
|
+
return;
|
|
81
|
+
view.setExtent(extent);
|
|
82
|
+
if (publishSpatialFilter) {
|
|
83
|
+
view.setSpatialFilter(extent ? extentToSpatialFilter(extent) : undefined);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
function enqueue(extent) {
|
|
87
|
+
latest = extent;
|
|
88
|
+
if (!coalesce) {
|
|
89
|
+
publish(latest);
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
if (pending)
|
|
93
|
+
return;
|
|
94
|
+
pending = true;
|
|
95
|
+
queueMicrotask(() => {
|
|
96
|
+
pending = false;
|
|
97
|
+
publish(latest);
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
const handle = source.subscribe(enqueue);
|
|
101
|
+
if (applyInitial && source.current)
|
|
102
|
+
enqueue(source.current());
|
|
103
|
+
return {
|
|
104
|
+
remove() {
|
|
105
|
+
if (!active)
|
|
106
|
+
return;
|
|
107
|
+
active = false;
|
|
108
|
+
removeSourceHandle(handle);
|
|
109
|
+
},
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
/** Subscribe a table, chart, or result adapter to the shared query projection. */
|
|
113
|
+
export function bindQueryProjectionToExploration(view, listener, options = {}) {
|
|
114
|
+
const { subscription = [
|
|
115
|
+
"filters",
|
|
116
|
+
"spatialFilter",
|
|
117
|
+
"extent",
|
|
118
|
+
"sort",
|
|
119
|
+
"page",
|
|
120
|
+
"visibleFields",
|
|
121
|
+
"grouping",
|
|
122
|
+
"aggregation",
|
|
123
|
+
"selection",
|
|
124
|
+
], applyInitial = true, equals, includeSelf, sourceId, spatialMode, } = options;
|
|
125
|
+
return subscribeExplorationSelector(view, subscription, (state) => selectLinkedViewQueryProjection(state, { sourceId, spatialMode }), listener, { fireImmediately: applyInitial, equals, includeSelf });
|
|
126
|
+
}
|
|
127
|
+
/** Adapter for filter bars and query-builder controls. */
|
|
128
|
+
export function bindFilterControlsToExploration(view) {
|
|
129
|
+
return {
|
|
130
|
+
setFilter(id, clause) {
|
|
131
|
+
view.setFilter(id, clause);
|
|
132
|
+
},
|
|
133
|
+
clearFilter(id) {
|
|
134
|
+
view.clearFilter(id);
|
|
135
|
+
},
|
|
136
|
+
subscribe(listener, options) {
|
|
137
|
+
return subscribeExplorationSelector(view, "filters", (state) => state.filters, listener, options);
|
|
138
|
+
},
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
/** Adapter for chart/grouped-result controls that publish grouping, aggregation, filters, and selection. */
|
|
142
|
+
export function bindChartToExploration(view) {
|
|
143
|
+
return {
|
|
144
|
+
setGrouping(grouping) {
|
|
145
|
+
view.setGrouping(grouping);
|
|
146
|
+
},
|
|
147
|
+
setAggregation(aggregation) {
|
|
148
|
+
view.setAggregation(aggregation);
|
|
149
|
+
},
|
|
150
|
+
selectTargets(targets, options) {
|
|
151
|
+
view.select(targets, options);
|
|
152
|
+
},
|
|
153
|
+
selectBucket(bucket, options) {
|
|
154
|
+
for (const [id, clause] of Object.entries(bucket.filters ?? {})) {
|
|
155
|
+
view.setFilter(id, clause);
|
|
156
|
+
}
|
|
157
|
+
if (bucket.targets) {
|
|
158
|
+
view.select(bucket.targets, { replace: options?.replaceSelection ?? true });
|
|
159
|
+
}
|
|
160
|
+
},
|
|
161
|
+
subscribeQuery(listener, options) {
|
|
162
|
+
return bindQueryProjectionToExploration(view, listener, options);
|
|
163
|
+
},
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
/** Reflect linked filter/query state into a MapLibre-style layer filter. */
|
|
167
|
+
export function syncMapLayerFilterToExploration(map, view, options) {
|
|
168
|
+
const unsubscribe = bindQueryProjectionToExploration(view, (projection) => map.setFilter(options.layerId, options.translate(projection)), {
|
|
169
|
+
...options,
|
|
170
|
+
subscription: options.subscription ?? ["filters", "spatialFilter", "extent"],
|
|
171
|
+
});
|
|
172
|
+
return {
|
|
173
|
+
remove() {
|
|
174
|
+
unsubscribe();
|
|
175
|
+
},
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
/** Subscribe a detail panel to the shared exploration selection. */
|
|
179
|
+
export function bindDetailToSelection(view, listener, options) {
|
|
180
|
+
return view.subscribe("selection", (event) => listener(event.state.selection, event), options);
|
|
181
|
+
}
|
|
182
|
+
/** Small adapter for table/grid components that publish and observe selection. */
|
|
183
|
+
export function bindTableSelectionToExploration(view) {
|
|
184
|
+
return {
|
|
185
|
+
select(targets, options) {
|
|
186
|
+
view.select(targets, options);
|
|
187
|
+
},
|
|
188
|
+
clearSelection() {
|
|
189
|
+
view.deselect();
|
|
190
|
+
},
|
|
191
|
+
subscribe(listener, options) {
|
|
192
|
+
return bindDetailToSelection(view, listener, options);
|
|
193
|
+
},
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
function toFeatureTarget(target, source, sourceLayer, includeRawIds) {
|
|
197
|
+
if (isSourceQualifiedSelectionTarget(target)) {
|
|
198
|
+
if (target.sourceId !== source)
|
|
199
|
+
return undefined;
|
|
200
|
+
if ((target.sourceLayer ?? "") !== (sourceLayer ?? ""))
|
|
201
|
+
return undefined;
|
|
202
|
+
return { source, id: target.id, sourceLayer };
|
|
203
|
+
}
|
|
204
|
+
if (!includeRawIds)
|
|
205
|
+
return undefined;
|
|
206
|
+
return { source, id: target, sourceLayer };
|
|
207
|
+
}
|
|
208
|
+
function featureTargetKey(target) {
|
|
209
|
+
const selectionTarget = sourceFeatureSelectionTarget(target.source, target.id, { sourceLayer: target.sourceLayer });
|
|
210
|
+
return featureSelectionKey(selectionTarget);
|
|
211
|
+
}
|
|
212
|
+
function removeSourceHandle(handle) {
|
|
213
|
+
if (typeof handle === "function") {
|
|
214
|
+
handle();
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
handle.remove();
|
|
218
|
+
}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Feature-state interaction helpers.
|
|
3
|
+
*
|
|
4
|
+
* These utilities wrap MapLibre GL JS's `setFeatureState` / `removeFeatureState`
|
|
5
|
+
* behind duck-typed interfaces so the SDK carries no hard runtime dependency on
|
|
6
|
+
* `maplibre-gl`. Any object that implements {@link FeatureStateMap} works.
|
|
7
|
+
*
|
|
8
|
+
* @module
|
|
9
|
+
*/
|
|
10
|
+
import type { SourceQualifiedFeatureSelectionTarget } from "../exploration/types.js";
|
|
11
|
+
/** Minimal subset of a MapLibre `Map` needed for feature-state operations. */
|
|
12
|
+
export interface FeatureStateMap {
|
|
13
|
+
setFeatureState(target: {
|
|
14
|
+
source: string;
|
|
15
|
+
id: string | number;
|
|
16
|
+
sourceLayer?: string;
|
|
17
|
+
}, state: Record<string, unknown>): void;
|
|
18
|
+
getFeatureState(target: {
|
|
19
|
+
source: string;
|
|
20
|
+
id: string | number;
|
|
21
|
+
sourceLayer?: string;
|
|
22
|
+
}): Record<string, unknown>;
|
|
23
|
+
removeFeatureState(target: {
|
|
24
|
+
source: string;
|
|
25
|
+
id: string | number;
|
|
26
|
+
sourceLayer?: string;
|
|
27
|
+
}, key?: string): void;
|
|
28
|
+
}
|
|
29
|
+
/** Minimal subset of a MapLibre `Map` needed for event subscription. */
|
|
30
|
+
export interface MapEventTarget {
|
|
31
|
+
on(event: string, layerOrHandler: string | ((...args: unknown[]) => void), handler?: (...args: unknown[]) => void): void;
|
|
32
|
+
off(event: string, layerOrHandler: string | ((...args: unknown[]) => void), handler?: (...args: unknown[]) => void): void;
|
|
33
|
+
}
|
|
34
|
+
/** A map that supports both feature state and events. */
|
|
35
|
+
export type InteractiveMap = FeatureStateMap & MapEventTarget;
|
|
36
|
+
/** Identifies a feature within a source for state operations. */
|
|
37
|
+
export interface FeatureTarget {
|
|
38
|
+
source: string;
|
|
39
|
+
id: string | number;
|
|
40
|
+
sourceLayer?: string;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Set state on a feature.
|
|
44
|
+
*
|
|
45
|
+
* Thin wrapper that constructs the MapLibre target object. Prefer this over
|
|
46
|
+
* calling `map.setFeatureState()` directly when working with Honua source IDs
|
|
47
|
+
* and feature IDs from query results.
|
|
48
|
+
*/
|
|
49
|
+
export declare function setFeatureState(map: FeatureStateMap, source: string, id: string | number, state: Record<string, unknown>, sourceLayer?: string): void;
|
|
50
|
+
/** Get current state for a feature. */
|
|
51
|
+
export declare function getFeatureState(map: FeatureStateMap, source: string, id: string | number, sourceLayer?: string): Record<string, unknown>;
|
|
52
|
+
/** Remove a single state key (or all state) from a feature. */
|
|
53
|
+
export declare function removeFeatureState(map: FeatureStateMap, source: string, id: string | number, key?: string, sourceLayer?: string): void;
|
|
54
|
+
/** Options for {@link createHoverHandler}. */
|
|
55
|
+
export interface HoverHandlerOptions {
|
|
56
|
+
/** Source ID to set feature state on. */
|
|
57
|
+
source: string;
|
|
58
|
+
/** Layer ID to listen for mouse events on. */
|
|
59
|
+
layer: string;
|
|
60
|
+
/** Feature-state key to toggle. @default "hover" */
|
|
61
|
+
stateKey?: string;
|
|
62
|
+
/** Source layer (required for vector-tile sources). */
|
|
63
|
+
sourceLayer?: string;
|
|
64
|
+
}
|
|
65
|
+
/** Handle returned by {@link createHoverHandler} for cleanup. */
|
|
66
|
+
export interface HoverHandle {
|
|
67
|
+
/** Remove all event listeners. Call this on component teardown. */
|
|
68
|
+
remove(): void;
|
|
69
|
+
/** The currently hovered feature ID, or `undefined`. */
|
|
70
|
+
readonly hoveredId: string | number | undefined;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Create a hover handler that manages `feature-state` hover state.
|
|
74
|
+
*
|
|
75
|
+
* Wires up `mousemove` / `mouseleave` events on the specified layer and
|
|
76
|
+
* toggles a boolean state key (default `"hover"`) on the underlying source.
|
|
77
|
+
* Pair with a paint expression like:
|
|
78
|
+
*
|
|
79
|
+
* ```ts
|
|
80
|
+
* import { expr } from "@honua/sdk";
|
|
81
|
+
* const opacity = expr.case([expr.featureState("hover"), 1.0], 0.5);
|
|
82
|
+
* ```
|
|
83
|
+
*
|
|
84
|
+
* @example
|
|
85
|
+
* ```ts
|
|
86
|
+
* const hover = createHoverHandler(map, {
|
|
87
|
+
* source: "parcels",
|
|
88
|
+
* layer: "parcel-fill",
|
|
89
|
+
* });
|
|
90
|
+
* // Later:
|
|
91
|
+
* hover.remove();
|
|
92
|
+
* ```
|
|
93
|
+
*/
|
|
94
|
+
export declare function createHoverHandler(map: InteractiveMap, options: HoverHandlerOptions): HoverHandle;
|
|
95
|
+
/** Options for {@link createSelectionHandler}. */
|
|
96
|
+
export interface SelectionHandlerOptions {
|
|
97
|
+
/** Source ID to set feature state on. */
|
|
98
|
+
source: string;
|
|
99
|
+
/** Layer ID to listen for click events on. */
|
|
100
|
+
layer: string;
|
|
101
|
+
/** Feature-state key to toggle. @default "selected" */
|
|
102
|
+
stateKey?: string;
|
|
103
|
+
/** Allow multiple features to be selected simultaneously. @default false */
|
|
104
|
+
multiSelect?: boolean;
|
|
105
|
+
/** Source layer (required for vector-tile sources). */
|
|
106
|
+
sourceLayer?: string;
|
|
107
|
+
/** Called whenever the selection changes. */
|
|
108
|
+
onChange?: (selectedIds: ReadonlySet<string | number>) => void;
|
|
109
|
+
/** Called whenever the source-qualified selection changes. */
|
|
110
|
+
onSelectionTargetsChange?: (selectedTargets: ReadonlyArray<SourceQualifiedFeatureSelectionTarget>) => void;
|
|
111
|
+
}
|
|
112
|
+
/** Handle returned by {@link createSelectionHandler} for cleanup. */
|
|
113
|
+
export interface SelectionHandle {
|
|
114
|
+
/** Remove all event listeners and clear selection state. */
|
|
115
|
+
remove(): void;
|
|
116
|
+
/** The set of currently selected feature IDs. */
|
|
117
|
+
readonly selectedIds: ReadonlySet<string | number>;
|
|
118
|
+
/** The current source-qualified selection targets. */
|
|
119
|
+
readonly selectedTargets: ReadonlyArray<SourceQualifiedFeatureSelectionTarget>;
|
|
120
|
+
/** Programmatically clear the selection. */
|
|
121
|
+
clearSelection(): void;
|
|
122
|
+
/** Programmatically select a feature by ID. */
|
|
123
|
+
select(id: string | number): void;
|
|
124
|
+
/** Programmatically deselect a feature by ID. */
|
|
125
|
+
deselect(id: string | number): void;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Create a selection handler that manages `feature-state` selection.
|
|
129
|
+
*
|
|
130
|
+
* Wires up `click` events on the specified layer and toggles a boolean state
|
|
131
|
+
* key (default `"selected"`) on the underlying source. Supports single-select
|
|
132
|
+
* (default) and multi-select modes.
|
|
133
|
+
*
|
|
134
|
+
* @example
|
|
135
|
+
* ```ts
|
|
136
|
+
* const selection = createSelectionHandler(map, {
|
|
137
|
+
* source: "parcels",
|
|
138
|
+
* layer: "parcel-fill",
|
|
139
|
+
* onChange: (ids) => updateSidebar(ids),
|
|
140
|
+
* });
|
|
141
|
+
* ```
|
|
142
|
+
*/
|
|
143
|
+
export declare function createSelectionHandler(map: InteractiveMap, options: SelectionHandlerOptions): SelectionHandle;
|
|
144
|
+
//# sourceMappingURL=feature-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feature-state.d.ts","sourceRoot":"","sources":["../../../src/interactions/feature-state.ts"],"names":[],"mappings":"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"}
|