@honua/app-platform 0.1.1-beta.0 → 0.1.4-beta.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/collaboration/client.d.ts.map +1 -1
- package/connect-url-safety.d.ts +53 -0
- package/connect-url-safety.js +189 -0
- package/contract/discovery.d.ts +34 -0
- package/contract/discovery.d.ts.map +1 -1
- package/contract/index.d.ts +7 -5
- package/contract/index.d.ts.map +1 -1
- package/contract/index.js +3 -2
- package/contract/pmtiles.d.ts +10 -1
- package/contract/pmtiles.d.ts.map +1 -1
- package/contract/pmtiles.js +10 -2
- package/contract/protocol-module.d.ts +84 -9
- package/contract/protocol-module.d.ts.map +1 -1
- package/contract/query-filter-fes.d.ts +18 -0
- package/contract/query-filter-fes.d.ts.map +1 -0
- package/contract/query-filter-fes.js +122 -0
- package/contract/query-filter.d.ts +300 -0
- package/contract/query-filter.d.ts.map +1 -0
- package/contract/query-filter.js +883 -0
- package/contract/schema.d.ts +12 -0
- package/contract/schema.d.ts.map +1 -1
- package/contract/schema.js +34 -0
- package/contract/source-capability-support.d.ts.map +1 -1
- package/contract/source-capability-support.js +15 -3
- package/contract/source.d.ts +45 -25
- package/contract/source.d.ts.map +1 -1
- package/contract/source.js +719 -479
- package/contract/types.d.ts +87 -18
- package/contract/types.d.ts.map +1 -1
- package/contract/widget-source.d.ts.map +1 -1
- package/controls/basemap-switcher.d.ts +19 -11
- package/controls/basemap-switcher.d.ts.map +1 -1
- package/controls/basemap-switcher.js +58 -25
- package/controls/catalog.d.ts +105 -0
- package/controls/catalog.d.ts.map +1 -0
- package/controls/catalog.js +341 -0
- package/controls/element-utils.d.ts +9 -0
- package/controls/element-utils.d.ts.map +1 -1
- package/controls/element-utils.js +17 -0
- package/controls/index.d.ts +29 -8
- package/controls/index.d.ts.map +1 -1
- package/controls/index.js +26 -8
- package/controls/layer-list.d.ts +13 -5
- package/controls/layer-list.d.ts.map +1 -1
- package/controls/layer-list.js +72 -15
- package/controls/legend.d.ts +32 -5
- package/controls/legend.d.ts.map +1 -1
- package/controls/legend.js +95 -25
- package/controls/qualification.d.ts +152 -0
- package/controls/qualification.d.ts.map +1 -0
- package/controls/qualification.js +1265 -0
- package/controls/registry.d.ts +104 -0
- package/controls/registry.d.ts.map +1 -0
- package/controls/registry.js +150 -0
- package/controls/swipe-control.d.ts +6 -1
- package/controls/swipe-control.d.ts.map +1 -1
- package/controls/swipe-control.js +82 -20
- package/core/client.d.ts +45 -21
- package/core/client.d.ts.map +1 -1
- package/core/client.js +224 -46
- package/core/error-classifications.d.ts +6 -0
- package/core/error-classifications.d.ts.map +1 -1
- package/core/error-classifications.js +6 -0
- package/core/error-code-registry.d.ts +6 -0
- package/core/error-code-registry.d.ts.map +1 -1
- package/core/error-code-registry.js +6 -0
- package/core/error-envelope.js +2 -0
- package/core/errors.d.ts +1 -1
- package/core/errors.js +1 -1
- package/core/geoparquet-sql.d.ts +68 -4
- package/core/geoparquet-sql.d.ts.map +1 -1
- package/core/geoparquet-sql.js +325 -8
- package/core/odata-write-codec.d.ts.map +1 -1
- package/core/odata-write-codec.js +0 -1
- package/core/odata.d.ts +6 -0
- package/core/odata.d.ts.map +1 -1
- package/core/odata.js +6 -1
- package/core/ogc-processes.d.ts +182 -25
- package/core/ogc-processes.d.ts.map +1 -1
- package/core/ogc-processes.js +602 -30
- package/core/process-runner.d.ts +8 -1
- package/core/process-runner.d.ts.map +1 -1
- package/core/process-runner.js +1 -0
- package/core/protocol-transport.d.ts +2 -0
- package/core/protocol-transport.d.ts.map +1 -1
- package/core/stac.d.ts +31 -0
- package/core/stac.d.ts.map +1 -1
- package/core/stac.js +136 -19
- package/core/surfaces.d.ts.map +1 -1
- package/core/surfaces.js +273 -68
- package/core/types.d.ts +123 -9
- package/core/types.d.ts.map +1 -1
- package/core/wfs-axis-order.d.ts +18 -0
- package/core/wfs-axis-order.d.ts.map +1 -0
- package/core/wfs-axis-order.js +108 -0
- package/core/wfs-capabilities.d.ts +65 -24
- package/core/wfs-capabilities.d.ts.map +1 -1
- package/core/wfs-capabilities.js +237 -27
- package/core/wfs-filter.d.ts +26 -3
- package/core/wfs-filter.d.ts.map +1 -1
- package/core/wfs-filter.js +48 -53
- package/core/wfs-protocol-error.d.ts +12 -0
- package/core/wfs-protocol-error.d.ts.map +1 -0
- package/core/wfs-protocol-error.js +13 -0
- package/core/wfs.d.ts +53 -1
- package/core/wfs.d.ts.map +1 -1
- package/core/wfs.js +251 -29
- package/core/wms-feature-info.d.ts +92 -0
- package/core/wms-feature-info.d.ts.map +1 -0
- package/core/wms-feature-info.js +285 -0
- package/core/wms.d.ts +9 -0
- package/core/wms.d.ts.map +1 -1
- package/core/wms.js +17 -5
- package/esri-compat/event-bus.d.ts +20 -0
- package/esri-compat/event-bus.d.ts.map +1 -1
- package/esri-compat/feature-filter.d.ts +46 -1
- package/esri-compat/feature-filter.d.ts.map +1 -1
- package/esri-compat/feature-filter.js +49 -0
- package/esri-compat/geojson-layer.d.ts +4 -2
- package/esri-compat/geojson-layer.d.ts.map +1 -1
- package/esri-compat/geojson-layer.js +4 -2
- package/esri-compat/identity-manager.js +2 -2
- package/esri-compat/imagery-layer.d.ts +2 -1
- package/esri-compat/imagery-layer.d.ts.map +1 -1
- package/esri-compat/imagery-layer.js +2 -1
- package/esri-compat/layer-list.d.ts +8 -1
- package/esri-compat/layer-list.d.ts.map +1 -1
- package/esri-compat/layer-list.js +11 -4
- package/esri-compat/legend.d.ts.map +1 -1
- package/esri-compat/legend.js +1 -1
- package/esri-compat/locator.d.ts +297 -0
- package/esri-compat/locator.d.ts.map +1 -0
- package/esri-compat/locator.js +579 -0
- package/esri-compat/map-image-layer.d.ts.map +1 -1
- package/esri-compat/map-view.d.ts.map +1 -1
- package/esri-compat/map-view.js +1 -1
- package/esri-compat/scene-view.d.ts.map +1 -1
- package/esri-compat/time-slider.d.ts +29 -0
- package/esri-compat/time-slider.d.ts.map +1 -1
- package/esri-compat/time-slider.js +117 -0
- package/esri-compat/wfs-layer.d.ts +2 -1
- package/esri-compat/wfs-layer.d.ts.map +1 -1
- package/esri-compat/wfs-layer.js +2 -1
- package/esri-compat/widget-host.d.ts +42 -6
- package/esri-compat/widget-host.d.ts.map +1 -1
- package/esri-compat/widget-host.js +99 -10
- package/generated-app/projection.d.ts.map +1 -1
- package/generated-app/runtime.d.ts.map +1 -1
- package/map/data-to-map-bridge.d.ts +1 -1
- package/map/data-to-map-bridge.d.ts.map +1 -1
- package/map/data-to-map-bridge.js +1 -2
- package/map/honua-map.d.ts.map +1 -1
- package/map/honua-map.js +1 -1
- package/map/index.d.ts +2 -0
- package/map/index.d.ts.map +1 -1
- package/map/index.js +2 -0
- package/map/realtime-reconciliation-adapter.d.ts +98 -0
- package/map/realtime-reconciliation-adapter.d.ts.map +1 -0
- package/map/realtime-reconciliation-adapter.js +84 -0
- package/map/temporal-playback.d.ts +25 -0
- package/map/temporal-playback.d.ts.map +1 -1
- package/map/temporal-playback.js +29 -1
- package/operator/workspace/workspace.d.ts.map +1 -1
- package/operator/workspace/workspace.js +0 -2
- package/package.json +4 -3
- package/query-planner/canonical-filter.d.ts +30 -0
- package/query-planner/canonical-filter.d.ts.map +1 -0
- package/query-planner/canonical-filter.js +30 -0
- package/query-planner/columnar-plan.d.ts +63 -0
- package/query-planner/columnar-plan.d.ts.map +1 -0
- package/query-planner/columnar-plan.js +94 -0
- package/query-planner/diagnostics.d.ts +3 -3
- package/query-planner/diagnostics.d.ts.map +1 -1
- package/query-planner/diagnostics.js +17 -4
- package/query-planner/duckdb.d.ts.map +1 -1
- package/query-planner/duckdb.js +16 -2
- package/query-planner/execution-context.d.ts.map +1 -1
- package/query-planner/execution-context.js +3 -1
- package/query-planner/executor.d.ts.map +1 -1
- package/query-planner/executor.js +7 -1
- package/query-planner/geoservices.d.ts.map +1 -1
- package/query-planner/geoservices.js +24 -5
- package/query-planner/grpc.d.ts.map +1 -1
- package/query-planner/grpc.js +29 -5
- package/query-planner/index.d.ts +20 -5
- package/query-planner/index.d.ts.map +1 -1
- package/query-planner/index.js +16 -3
- package/query-planner/ir.d.ts +6 -1
- package/query-planner/ir.d.ts.map +1 -1
- package/query-planner/ir.js +63 -1
- package/query-planner/odata-protocol-module.d.ts +54 -0
- package/query-planner/odata-protocol-module.d.ts.map +1 -0
- package/query-planner/odata-protocol-module.js +199 -0
- package/query-planner/odata-v1.d.ts +23 -0
- package/query-planner/odata-v1.d.ts.map +1 -0
- package/query-planner/odata-v1.js +202 -0
- package/query-planner/odata.d.ts +0 -3
- package/query-planner/odata.d.ts.map +1 -1
- package/query-planner/odata.js +0 -143
- package/query-planner/ogc-features.d.ts.map +1 -1
- package/query-planner/ogc-features.js +23 -1
- package/query-planner/planner.d.ts +2 -2
- package/query-planner/planner.d.ts.map +1 -1
- package/query-planner/planner.js +146 -27
- package/query-planner/representation.d.ts +59 -0
- package/query-planner/representation.d.ts.map +1 -0
- package/query-planner/representation.js +140 -0
- package/query-planner/types.d.ts +153 -3
- package/query-planner/types.d.ts.map +1 -1
- package/query-planner/wfs-protocol-module.d.ts +57 -0
- package/query-planner/wfs-protocol-module.d.ts.map +1 -0
- package/query-planner/wfs-protocol-module.js +731 -0
- package/query-planner/wfs-v1.d.ts +41 -0
- package/query-planner/wfs-v1.d.ts.map +1 -0
- package/query-planner/wfs-v1.js +366 -0
- package/query-planner/wfs.d.ts +1 -3
- package/query-planner/wfs.d.ts.map +1 -1
- package/query-planner/wfs.js +1 -70
- package/realtime/checkpoint-store.d.ts +206 -0
- package/realtime/checkpoint-store.d.ts.map +1 -0
- package/realtime/checkpoint-store.js +504 -0
- package/realtime/honua-server.d.ts +8 -0
- package/realtime/honua-server.d.ts.map +1 -1
- package/realtime/honua-server.js +123 -14
- package/realtime/index.d.ts +4 -0
- package/realtime/index.d.ts.map +1 -1
- package/realtime/index.js +2 -0
- package/realtime/reconciliation.d.ts +245 -0
- package/realtime/reconciliation.d.ts.map +1 -0
- package/realtime/reconciliation.js +377 -0
- package/realtime/resumable-transport.d.ts.map +1 -1
- package/realtime/sse.d.ts.map +1 -1
- package/realtime/websocket.d.ts.map +1 -1
- package/realtime/wire.d.ts +2 -1
- package/realtime/wire.d.ts.map +1 -1
- package/realtime/wire.js +24 -8
- package/replica-sync/errors.d.ts +19 -1
- package/replica-sync/errors.d.ts.map +1 -1
- package/replica-sync/errors.js +16 -0
- package/replica-sync/geoservices.d.ts +260 -0
- package/replica-sync/geoservices.d.ts.map +1 -0
- package/replica-sync/geoservices.js +1093 -0
- package/replica-sync/index.d.ts +5 -1
- package/replica-sync/index.d.ts.map +1 -1
- package/replica-sync/index.js +3 -1
- package/replica-sync/transport-conformance.d.ts +58 -0
- package/replica-sync/transport-conformance.d.ts.map +1 -0
- package/replica-sync/transport-conformance.js +265 -0
- package/replica-sync/types.d.ts +22 -0
- package/replica-sync/types.d.ts.map +1 -1
- package/runtime/index.d.ts +6 -2
- package/runtime/index.d.ts.map +1 -1
- package/runtime/index.js +3 -1
- package/runtime/load-package.d.ts +24 -0
- package/runtime/load-package.d.ts.map +1 -1
- package/runtime/load-package.js +45 -1
- package/runtime/maplibre-renderer.d.ts +11 -0
- package/runtime/maplibre-renderer.d.ts.map +1 -1
- package/runtime/maplibre-renderer.js +32 -7
- package/runtime/offline-region-protocol.d.ts +73 -0
- package/runtime/offline-region-protocol.d.ts.map +1 -0
- package/runtime/offline-region-protocol.js +63 -0
- package/runtime/offline-region-style.d.ts +78 -0
- package/runtime/offline-region-style.d.ts.map +1 -0
- package/runtime/offline-region-style.js +147 -0
- package/runtime/pmtiles-protocol.d.ts +7 -8
- package/runtime/pmtiles-protocol.d.ts.map +1 -1
- package/runtime/pmtiles-protocol.js +19 -66
- package/runtime/protocol-registry.d.ts +55 -0
- package/runtime/protocol-registry.d.ts.map +1 -0
- package/runtime/protocol-registry.js +103 -0
- package/runtime/runtime.d.ts +2 -0
- package/runtime/runtime.d.ts.map +1 -1
- package/runtime/runtime.js +6 -1
- package/scene-workspace/analysis-widgets.d.ts +4 -2
- package/scene-workspace/analysis-widgets.d.ts.map +1 -1
- package/scene-workspace/analysis-widgets.js +4 -2
- package/scene-workspace/camera-correspondence.d.ts +151 -0
- package/scene-workspace/camera-correspondence.d.ts.map +1 -0
- package/scene-workspace/camera-correspondence.js +220 -0
- package/scene-workspace/cesium-adapter.d.ts +230 -29
- package/scene-workspace/cesium-adapter.d.ts.map +1 -1
- package/scene-workspace/cesium-adapter.js +741 -56
- package/scene-workspace/cesium-mount.d.ts +205 -0
- package/scene-workspace/cesium-mount.d.ts.map +1 -0
- package/scene-workspace/cesium-mount.js +392 -0
- package/scene-workspace/cesium-scene-owner.d.ts +160 -0
- package/scene-workspace/cesium-scene-owner.d.ts.map +1 -0
- package/scene-workspace/cesium-scene-owner.js +205 -0
- package/scene-workspace/cesium-state-sync.d.ts +101 -0
- package/scene-workspace/cesium-state-sync.d.ts.map +1 -0
- package/scene-workspace/cesium-state-sync.js +432 -0
- package/scene-workspace/cesium-time.d.ts +346 -0
- package/scene-workspace/cesium-time.d.ts.map +1 -0
- package/scene-workspace/cesium-time.js +403 -0
- package/scene-workspace/index.d.ts +42 -10
- package/scene-workspace/index.d.ts.map +1 -1
- package/scene-workspace/index.js +32 -7
- package/scene-workspace/maplibre-state-sync.d.ts +112 -0
- package/scene-workspace/maplibre-state-sync.d.ts.map +1 -0
- package/scene-workspace/maplibre-state-sync.js +400 -0
- package/scene-workspace/primitives.d.ts +237 -3
- package/scene-workspace/primitives.d.ts.map +1 -1
- package/scene-workspace/primitives.js +1087 -17
- package/scene-workspace/scene-discovery.d.ts +5 -2
- package/scene-workspace/scene-discovery.d.ts.map +1 -1
- package/scene-workspace/scene-discovery.js +5 -2
- package/scene-workspace/scene-view.d.ts +5 -2
- package/scene-workspace/scene-view.d.ts.map +1 -1
- package/scene-workspace/scene-view.js +5 -2
- package/scene-workspace/source-to-cesium.d.ts +141 -8
- package/scene-workspace/source-to-cesium.d.ts.map +1 -1
- package/scene-workspace/source-to-cesium.js +497 -72
- package/scene-workspace/state-sync-port-kit.d.ts +156 -0
- package/scene-workspace/state-sync-port-kit.d.ts.map +1 -0
- package/scene-workspace/state-sync-port-kit.js +319 -0
- package/scene-workspace/state-sync.d.ts +34 -1
- package/scene-workspace/state-sync.d.ts.map +1 -1
- package/scene-workspace/state-sync.js +48 -0
- package/scene-workspace/types.d.ts +8 -0
- package/scene-workspace/types.d.ts.map +1 -1
- package/scene-workspace/types.js +2 -0
- package/scene-workspace/workspace.d.ts +12 -1
- package/scene-workspace/workspace.d.ts.map +1 -1
- package/scene-workspace/workspace.js +13 -0
- package/studio/index.d.ts +24 -7
- package/studio/index.d.ts.map +1 -1
- package/studio/index.js +21 -7
- package/studio/lifecycle-client.d.ts +164 -0
- package/studio/lifecycle-client.d.ts.map +1 -0
- package/studio/lifecycle-client.js +299 -0
- package/studio/lifecycle-errors.d.ts +91 -0
- package/studio/lifecycle-errors.d.ts.map +1 -0
- package/studio/lifecycle-errors.js +77 -0
- package/studio/lifecycle-types.d.ts +321 -0
- package/studio/lifecycle-types.d.ts.map +1 -0
- package/studio/lifecycle-types.js +22 -0
- package/web-components/controller.d.ts.map +1 -1
- package/web-components/csp-styles.d.ts +6 -0
- package/web-components/csp-styles.d.ts.map +1 -0
- package/web-components/csp-styles.js +53 -0
- package/web-components/elements.d.ts +158 -2
- package/web-components/elements.d.ts.map +1 -1
- package/web-components/elements.js +1302 -215
- package/web-components/export-redaction.d.ts +252 -0
- package/web-components/export-redaction.d.ts.map +1 -0
- package/web-components/export-redaction.js +588 -0
- package/web-components/export.d.ts +417 -0
- package/web-components/export.d.ts.map +1 -0
- package/web-components/export.js +719 -0
- package/web-components/feature-editor-model.d.ts +265 -0
- package/web-components/feature-editor-model.d.ts.map +1 -0
- package/web-components/feature-editor-model.js +438 -0
- package/web-components/feature-editor-sketch.d.ts +125 -0
- package/web-components/feature-editor-sketch.d.ts.map +1 -0
- package/web-components/feature-editor-sketch.js +194 -0
- package/web-components/feature-editor-workflow.d.ts +286 -0
- package/web-components/feature-editor-workflow.d.ts.map +1 -0
- package/web-components/feature-editor-workflow.js +889 -0
- package/web-components/feature-editor.d.ts +83 -0
- package/web-components/feature-editor.d.ts.map +1 -0
- package/web-components/feature-editor.js +829 -0
- package/web-components/feature-table-engine.d.ts +465 -0
- package/web-components/feature-table-engine.d.ts.map +1 -0
- package/web-components/feature-table-engine.js +1360 -0
- package/web-components/feature-table-view.d.ts +95 -0
- package/web-components/feature-table-view.d.ts.map +1 -0
- package/web-components/feature-table-view.js +343 -0
- package/web-components/index.d.ts +34 -3
- package/web-components/index.d.ts.map +1 -1
- package/web-components/index.js +35 -2
- package/web-components/maplibre-renderer.d.ts.map +1 -1
- package/web-components/maplibre-renderer.js +13 -4
- package/web-components/measurement.d.ts +3 -1
- package/web-components/measurement.d.ts.map +1 -1
- package/web-components/measurement.js +62 -18
- package/web-components/time-slider.d.ts +122 -0
- package/web-components/time-slider.d.ts.map +1 -0
- package/web-components/time-slider.js +740 -0
- package/web-components/types.d.ts +310 -0
- package/web-components/types.d.ts.map +1 -1
- package/webmap/convert-label.js +0 -1
- package/webmap/convert-symbol.d.ts.map +1 -1
|
@@ -34,6 +34,7 @@
|
|
|
34
34
|
* @module
|
|
35
35
|
*/
|
|
36
36
|
import { area as geodesicArea, length as geodesicLength } from "../geometry/index.js";
|
|
37
|
+
import { renderCspSafeShadowHtml } from "./csp-styles.js";
|
|
37
38
|
const globalDom = globalThis;
|
|
38
39
|
const HTMLElementBase = globalDom.HTMLElement ?? class {
|
|
39
40
|
};
|
|
@@ -49,6 +50,14 @@ export class HonuaMeasurementElement extends HTMLElementBase {
|
|
|
49
50
|
#vertices = [];
|
|
50
51
|
#finished = false;
|
|
51
52
|
#result;
|
|
53
|
+
#messages = {};
|
|
54
|
+
get messages() {
|
|
55
|
+
return this.#messages;
|
|
56
|
+
}
|
|
57
|
+
set messages(messages) {
|
|
58
|
+
this.#messages = messages ?? {};
|
|
59
|
+
this.render();
|
|
60
|
+
}
|
|
52
61
|
#connected = false;
|
|
53
62
|
#disposeMapReadyListener;
|
|
54
63
|
#clickListener;
|
|
@@ -353,33 +362,35 @@ export class HonuaMeasurementElement extends HTMLElementBase {
|
|
|
353
362
|
const root = this.shadowRoot;
|
|
354
363
|
if (!root || !this.#connected)
|
|
355
364
|
return;
|
|
356
|
-
const
|
|
365
|
+
const focusedMode = root.activeElement?.getAttribute("data-measure-mode");
|
|
366
|
+
const label = this.#messages.label ?? this.#attr("label") ?? "Measure";
|
|
357
367
|
const ready = this.#map !== undefined;
|
|
358
368
|
const sketchActive = this.#mode !== "off" && this.#vertices.length > 0 && !this.#finished;
|
|
359
|
-
root
|
|
369
|
+
renderCspSafeShadowHtml(root, `
|
|
360
370
|
<style>${structuralStyles()}</style>
|
|
361
371
|
<section class="panel" part="panel" aria-label="${escapeAttribute(label)}">
|
|
362
372
|
<div class="bar">
|
|
363
373
|
<h2>${escapeHtml(label)}</h2>
|
|
364
|
-
<span class="state">${escapeHtml(ready ? "ready" : "waiting for map")}</span>
|
|
374
|
+
<span class="state">${escapeHtml(ready ? (this.#messages.ready ?? "ready") : (this.#messages.waitingForMap ?? "waiting for map"))}</span>
|
|
365
375
|
</div>
|
|
366
|
-
<div class="segmented" role="group" aria-label="${escapeAttribute(`${label} mode`)}">
|
|
376
|
+
<div class="segmented" role="group" aria-label="${escapeAttribute(this.#messages.modeGroupLabel?.(label) ?? `${label} mode`)}">
|
|
367
377
|
${["off", "distance", "area"]
|
|
368
378
|
.map((mode) => `
|
|
369
|
-
<button type="button" part="mode" data-measure-mode="${mode}" aria-pressed="${String(this.#mode === mode)}"${ready || mode === "off" ? "" : " disabled"}>${escapeHtml(modeLabel(mode))}</button>
|
|
379
|
+
<button type="button" part="mode" data-measure-mode="${mode}" aria-pressed="${String(this.#mode === mode)}"${ready || mode === "off" ? "" : " disabled"}>${escapeHtml(this.#messages.modeLabel?.[mode] ?? modeLabel(mode))}</button>
|
|
370
380
|
`)
|
|
371
381
|
.join("")}
|
|
372
382
|
</div>
|
|
373
383
|
<p class="value" part="value" role="status" aria-live="polite">${escapeHtml(this.#resultText())}</p>
|
|
374
384
|
<div class="actions">
|
|
375
|
-
<button type="button" part="finish" data-measure-finish${sketchActive ? "" : " disabled"}
|
|
376
|
-
<button type="button" part="cancel" data-measure-cancel${this.#vertices.length > 0 ? "" : " disabled"}
|
|
385
|
+
<button type="button" part="finish" data-measure-finish${sketchActive ? "" : " disabled"}>${escapeHtml(this.#messages.finish ?? "Finish")}</button>
|
|
386
|
+
<button type="button" part="cancel" data-measure-cancel${this.#vertices.length > 0 ? "" : " disabled"}>${escapeHtml(this.#messages.cancel ?? "Cancel")}</button>
|
|
377
387
|
</div>
|
|
378
388
|
<p class="hint">${escapeHtml(this.#mode === "off"
|
|
379
|
-
? "Pick a mode, then click the map to add vertices."
|
|
380
|
-
:
|
|
389
|
+
? (this.#messages.hintOff ?? "Pick a mode, then click the map to add vertices.")
|
|
390
|
+
: (this.#messages.hintActive ??
|
|
391
|
+
"Click adds a vertex; double-click or Finish completes; Escape or Cancel discards."))}</p>
|
|
381
392
|
</section>
|
|
382
|
-
|
|
393
|
+
`);
|
|
383
394
|
root.querySelectorAll("button[data-measure-mode]").forEach((button) => {
|
|
384
395
|
button.addEventListener("click", () => {
|
|
385
396
|
this.setMode((button.dataset.measureMode ?? "off"));
|
|
@@ -391,23 +402,35 @@ export class HonuaMeasurementElement extends HTMLElementBase {
|
|
|
391
402
|
root.querySelector("button[data-measure-cancel]")?.addEventListener("click", () => {
|
|
392
403
|
this.cancel();
|
|
393
404
|
});
|
|
405
|
+
if (focusedMode) {
|
|
406
|
+
[...root.querySelectorAll("[data-measure-mode]")]
|
|
407
|
+
.find((button) => button.getAttribute("data-measure-mode") === focusedMode)
|
|
408
|
+
?.focus({ preventScroll: true });
|
|
409
|
+
}
|
|
394
410
|
}
|
|
395
411
|
#resultText() {
|
|
396
412
|
const result = this.#result;
|
|
397
413
|
if (this.#mode === "off")
|
|
398
|
-
return "Measurement off.";
|
|
414
|
+
return this.#messages.offStatus ?? "Measurement off.";
|
|
399
415
|
if (!result || this.#vertices.length === 0) {
|
|
400
|
-
return this.#mode === "distance"
|
|
416
|
+
return this.#mode === "distance"
|
|
417
|
+
? (this.#messages.startDistance ?? "Click the map to start a line.")
|
|
418
|
+
: (this.#messages.startArea ?? "Click the map to outline an area.");
|
|
401
419
|
}
|
|
402
420
|
if (this.#mode === "distance") {
|
|
403
|
-
if (result.distance === undefined)
|
|
404
|
-
return
|
|
405
|
-
|
|
421
|
+
if (result.distance === undefined) {
|
|
422
|
+
return (this.#messages.vertexDistance?.(this.#vertices.length) ??
|
|
423
|
+
`${this.#vertices.length} vertex — add another to measure.`);
|
|
424
|
+
}
|
|
425
|
+
const value = formatDistance(result.distance);
|
|
426
|
+
return (this.#messages.distance?.(value, this.#finished) ?? `Distance: ${value}${this.#finished ? " (finished)" : ""}`);
|
|
406
427
|
}
|
|
407
428
|
if (result.area === undefined) {
|
|
408
|
-
return
|
|
429
|
+
return (this.#messages.vertexArea?.(this.#vertices.length) ??
|
|
430
|
+
`${this.#vertices.length} of 3 vertices needed for an area.`);
|
|
409
431
|
}
|
|
410
|
-
|
|
432
|
+
const value = formatArea(result.area);
|
|
433
|
+
return this.#messages.area?.(value, this.#finished) ?? `Area: ${value}${this.#finished ? " (finished)" : ""}`;
|
|
411
434
|
}
|
|
412
435
|
#dispatchChange() {
|
|
413
436
|
if (!globalDom.CustomEvent || typeof this.dispatchEvent !== "function")
|
|
@@ -477,9 +500,11 @@ function structuralStyles() {
|
|
|
477
500
|
--honua-ui-accent-fg: #ffffff;
|
|
478
501
|
box-sizing: border-box;
|
|
479
502
|
color: var(--honua-ui-fg);
|
|
503
|
+
direction: inherit;
|
|
480
504
|
display: block;
|
|
481
505
|
font: 14px/1.4 system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
|
|
482
506
|
}
|
|
507
|
+
:host([dir="rtl"]) { direction: rtl; }
|
|
483
508
|
*, *::before, *::after { box-sizing: inherit; }
|
|
484
509
|
button {
|
|
485
510
|
border: 1px solid var(--honua-ui-border);
|
|
@@ -505,14 +530,33 @@ function structuralStyles() {
|
|
|
505
530
|
display: grid;
|
|
506
531
|
gap: 10px;
|
|
507
532
|
min-width: 180px;
|
|
508
|
-
padding: 10px;
|
|
533
|
+
padding-block: 10px;
|
|
534
|
+
padding-inline: 10px;
|
|
509
535
|
}
|
|
536
|
+
button { padding-block: 0; padding-inline: 10px; }
|
|
510
537
|
.bar { align-items: center; display: flex; gap: 8px; justify-content: space-between; }
|
|
511
538
|
.state { color: var(--honua-ui-muted); font-size: 12px; }
|
|
512
539
|
.segmented { display: grid; gap: 6px; grid-template-columns: repeat(auto-fit, minmax(72px, 1fr)); }
|
|
540
|
+
.segmented button { min-width: 0; overflow-wrap: anywhere; white-space: normal; }
|
|
513
541
|
.actions { display: flex; gap: 6px; }
|
|
514
542
|
.value { margin: 0; }
|
|
515
543
|
.hint { color: var(--honua-ui-muted); font-size: 12px; margin: 0; }
|
|
544
|
+
@media (max-width: 320px) {
|
|
545
|
+
.panel { min-width: 0; }
|
|
546
|
+
.bar { align-items: flex-start; flex-direction: column; }
|
|
547
|
+
.segmented { grid-template-columns: minmax(0, 1fr); }
|
|
548
|
+
.actions { flex-wrap: wrap; }
|
|
549
|
+
.actions button { flex: 1 1 120px; min-width: 0; }
|
|
550
|
+
.hint { overflow-wrap: anywhere; }
|
|
551
|
+
}
|
|
552
|
+
@media (forced-colors: active), (prefers-contrast: more) {
|
|
553
|
+
.panel { background: Canvas; border-color: CanvasText; color: CanvasText; }
|
|
554
|
+
.state, .hint { color: GrayText; }
|
|
555
|
+
button { background: ButtonFace; border-color: ButtonText; color: ButtonText; }
|
|
556
|
+
button[aria-pressed="true"] { background: Highlight; border-color: Highlight; color: HighlightText; }
|
|
557
|
+
button:disabled { color: GrayText; }
|
|
558
|
+
button:focus-visible { outline: 2px solid Highlight; outline-offset: 2px; }
|
|
559
|
+
}
|
|
516
560
|
`;
|
|
517
561
|
}
|
|
518
562
|
function escapeHtml(value) {
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `<honua-time-slider>` — the time-slider UI over the existing temporal
|
|
3
|
+
* playback controller (issue #959, epic #486 "Esri Widget Cliff").
|
|
4
|
+
*
|
|
5
|
+
* Temporal playback has been headless since issue #497: `createTemporalPlayback`
|
|
6
|
+
* (`@honua/sdk-js/map`) owns the window, the frame timer, and the filter sinks
|
|
7
|
+
* that drive the map. This element is the missing *view* over that controller —
|
|
8
|
+
* it introduces no second temporal model, keeps no window state of its own, and
|
|
9
|
+
* never fetches or caches data. Every user gesture becomes one controller call,
|
|
10
|
+
* and every rendered value comes back from the controller's own `tick` /
|
|
11
|
+
* `play` / `pause` / `end` events. Layered over a realtime feed the controller
|
|
12
|
+
* keeps issue #393's snapshot-plus-delta semantics untouched, because the
|
|
13
|
+
* element adds nothing between the controller and its sinks.
|
|
14
|
+
*
|
|
15
|
+
* ## Wiring
|
|
16
|
+
* ```ts doc-test=skip reason="wiring snippet requires an application host"
|
|
17
|
+
* import { createTemporalPlayback } from "@honua/sdk-js/map";
|
|
18
|
+
* import "@honua/sdk-js/web-components";
|
|
19
|
+
*
|
|
20
|
+
* const playback = createTemporalPlayback({ handle: mounted, timeField: "event_time", ... });
|
|
21
|
+
* document.querySelector("honua-time-slider").playback = playback;
|
|
22
|
+
* ```
|
|
23
|
+
*
|
|
24
|
+
* The `playback` property (or the equivalent {@link HonuaTimeSliderElement.connect})
|
|
25
|
+
* accepts anything shaped like {@link HonuaTimeSliderPlayback}; the element
|
|
26
|
+
* never imports the controller module, so the component kit's bundle does not
|
|
27
|
+
* gain the `/map` entrypoint's closure.
|
|
28
|
+
*
|
|
29
|
+
* ## Attributes
|
|
30
|
+
* - `label` — accessible name and heading of the panel.
|
|
31
|
+
* - `unavailable-reason` — honest degraded state: set this when the mounted
|
|
32
|
+
* source has no usable temporal metadata. The panel still renders, names the
|
|
33
|
+
* reason, and disables every transport control rather than offering a
|
|
34
|
+
* scrubber that cannot move anything.
|
|
35
|
+
* - `speeds` — comma-separated playback rate multipliers for the speed control
|
|
36
|
+
* (default `0.5,1,2,4`). The control is hidden entirely when the bound
|
|
37
|
+
* controller exposes no `setSpeed`.
|
|
38
|
+
*
|
|
39
|
+
* ## Events
|
|
40
|
+
* - `honua-time-change` — `CustomEvent<HonuaTimeChangeDetail>` whenever the
|
|
41
|
+
* window moves (controller tick, scrub, step, or keyboard).
|
|
42
|
+
* - `honua-time-playback-change` — `CustomEvent<HonuaTimePlaybackChangeDetail>`
|
|
43
|
+
* whenever transport or rate changes (play, pause, end, speed, binding).
|
|
44
|
+
*
|
|
45
|
+
* ## Accessibility
|
|
46
|
+
* The scrubber follows the WAI-ARIA slider pattern: `role="slider"` with
|
|
47
|
+
* `aria-valuemin` / `aria-valuemax` / `aria-valuenow` in epoch milliseconds,
|
|
48
|
+
* a human-readable `aria-valuetext` naming the window, `aria-orientation`, and
|
|
49
|
+
* an accessible name derived from the panel label. It is a single tab stop
|
|
50
|
+
* (`tabindex="0"`, pinned to `-1` while degraded) and is operable from the
|
|
51
|
+
* keyboard alone: ArrowRight/ArrowUp step forward, ArrowLeft/ArrowDown step
|
|
52
|
+
* back (mirrored on the inline axis under `dir="rtl"`), PageUp/PageDown move
|
|
53
|
+
* ten steps, Home/End jump to the first/last window. Transport is a
|
|
54
|
+
* `role="group"` of buttons with `aria-pressed` on the play/pause toggle, and
|
|
55
|
+
* the window readout is a `role="status"` live region.
|
|
56
|
+
*
|
|
57
|
+
* Rendering is CSP-safe (`renderCspSafeShadowHtml`) and the shadow tree is
|
|
58
|
+
* built exactly once: state updates mutate the existing nodes in place, so
|
|
59
|
+
* handlers never accumulate, an active drag is never torn out from under the
|
|
60
|
+
* pointer, and the focused control is never replaced. Theme via the shared
|
|
61
|
+
* `--honua-ui-*` custom properties.
|
|
62
|
+
*
|
|
63
|
+
* @module
|
|
64
|
+
*/
|
|
65
|
+
import type { HonuaComponentStatus, HonuaTimeSliderMessages, HonuaTimeSliderPlayback, HonuaTimeSliderWindow } from "./types.js";
|
|
66
|
+
declare const HTMLElementBase: typeof HTMLElement;
|
|
67
|
+
export declare class HonuaTimeSliderElement extends HTMLElementBase {
|
|
68
|
+
#private;
|
|
69
|
+
static get observedAttributes(): string[];
|
|
70
|
+
/** The temporal playback controller this slider drives and reflects. */
|
|
71
|
+
get playback(): HonuaTimeSliderPlayback | undefined;
|
|
72
|
+
set playback(playback: HonuaTimeSliderPlayback | undefined);
|
|
73
|
+
/** Binds a playback controller. Equivalent to assigning `.playback`. */
|
|
74
|
+
connect(playback: HonuaTimeSliderPlayback): void;
|
|
75
|
+
/** Caller-supplied message source; assigning re-renders the panel text. */
|
|
76
|
+
get messages(): HonuaTimeSliderMessages;
|
|
77
|
+
set messages(messages: HonuaTimeSliderMessages | undefined);
|
|
78
|
+
/**
|
|
79
|
+
* Why playback is unavailable, e.g. the mounted source exposes no temporal
|
|
80
|
+
* field. Reflects the `unavailable-reason` attribute.
|
|
81
|
+
*/
|
|
82
|
+
get unavailableReason(): string | undefined;
|
|
83
|
+
set unavailableReason(reason: string | undefined);
|
|
84
|
+
/** Playback rate multipliers offered by the speed control. */
|
|
85
|
+
get speeds(): readonly number[];
|
|
86
|
+
set speeds(values: readonly number[] | undefined);
|
|
87
|
+
/** `unsupported` when a reason is declared, `ready` when bound, else `idle`. */
|
|
88
|
+
get status(): HonuaComponentStatus;
|
|
89
|
+
/** The controller's current window, when one is bound. */
|
|
90
|
+
get window(): HonuaTimeSliderWindow | undefined;
|
|
91
|
+
/** The controller's full playable extent, when one is bound. */
|
|
92
|
+
get extent(): HonuaTimeSliderWindow | undefined;
|
|
93
|
+
get playing(): boolean;
|
|
94
|
+
get speed(): number;
|
|
95
|
+
/** Window-start position within the scrubbable range, 0..1. */
|
|
96
|
+
get progress(): number;
|
|
97
|
+
play(): void;
|
|
98
|
+
pause(): void;
|
|
99
|
+
/** Play when paused, pause when playing. */
|
|
100
|
+
toggle(): void;
|
|
101
|
+
/** Moves the window `count` steps forward (positive) or back (negative). */
|
|
102
|
+
step(direction?: 1 | -1, count?: number): void;
|
|
103
|
+
/** Jumps the window start to `epochMs`, clamped by the controller. */
|
|
104
|
+
scrubTo(epochMs: number): void;
|
|
105
|
+
/** Changes the playback rate multiplier when the controller supports it. */
|
|
106
|
+
setSpeed(multiplier: number): void;
|
|
107
|
+
attributeChangedCallback(): void;
|
|
108
|
+
connectedCallback(): void;
|
|
109
|
+
disconnectedCallback(): void;
|
|
110
|
+
/**
|
|
111
|
+
* Builds the shadow tree once per structural shape, then updates it in place.
|
|
112
|
+
* The shape only changes when the speed control appears/disappears or its
|
|
113
|
+
* options change, so a playback tick never replaces a node — which is what
|
|
114
|
+
* keeps handlers from accumulating and the focused control (or an active
|
|
115
|
+
* pointer drag) intact.
|
|
116
|
+
*/
|
|
117
|
+
protected render(): void;
|
|
118
|
+
}
|
|
119
|
+
/** Registers `<honua-time-slider>`; skipped when the tag is already defined. */
|
|
120
|
+
export declare function defineHonuaTimeSlider(registry?: CustomElementRegistry): void;
|
|
121
|
+
export {};
|
|
122
|
+
//# sourceMappingURL=time-slider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"time-slider.d.ts","sourceRoot":"","sources":["../../../src/web-components/time-slider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+DG;AAGH,OAAO,KAAK,EACV,oBAAoB,EAGpB,uBAAuB,EACvB,uBAAuB,EACvB,qBAAqB,EACtB,MAAM,YAAY,CAAC;AASpB,QAAA,MAAM,eAAe,EAAE,OAAO,WAAkF,CAAC;AAQjH,qBAAa,sBAAuB,SAAQ,eAAe;;IACzD,WAAkB,kBAAkB,IAAI,MAAM,EAAE,CAE/C;IAYD,wEAAwE;IACxE,IAAW,QAAQ,IAAI,uBAAuB,GAAG,SAAS,CAEzD;IAED,IAAW,QAAQ,CAAC,QAAQ,EAAE,uBAAuB,GAAG,SAAS,EAOhE;IAED,wEAAwE;IACjE,OAAO,CAAC,QAAQ,EAAE,uBAAuB,GAAG,IAAI;IAIvD,2EAA2E;IAC3E,IAAW,QAAQ,IAAI,uBAAuB,CAE7C;IAED,IAAW,QAAQ,CAAC,QAAQ,EAAE,uBAAuB,GAAG,SAAS,EAGhE;IAED;;;OAGG;IACH,IAAW,iBAAiB,IAAI,MAAM,GAAG,SAAS,CAEjD;IAED,IAAW,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAItD;IAED,8DAA8D;IAC9D,IAAW,MAAM,IAAI,SAAS,MAAM,EAAE,CAQrC;IAED,IAAW,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,EAItD;IAID,gFAAgF;IAChF,IAAW,MAAM,IAAI,oBAAoB,CAGxC;IAED,0DAA0D;IAC1D,IAAW,MAAM,IAAI,qBAAqB,GAAG,SAAS,CAErD;IAED,gEAAgE;IAChE,IAAW,MAAM,IAAI,qBAAqB,GAAG,SAAS,CAErD;IAED,IAAW,OAAO,IAAI,OAAO,CAE5B;IAED,IAAW,KAAK,IAAI,MAAM,CAEzB;IAED,+DAA+D;IAC/D,IAAW,QAAQ,IAAI,MAAM,CAM5B;IAIM,IAAI,IAAI,IAAI;IAKZ,KAAK,IAAI,IAAI;IAIpB,4CAA4C;IACrC,MAAM,IAAI,IAAI;IAKrB,4EAA4E;IACrE,IAAI,CAAC,SAAS,GAAE,CAAC,GAAG,CAAC,CAAK,EAAE,KAAK,SAAI,GAAG,IAAI;IAYnD,sEAAsE;IAC/D,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAOrC,4EAA4E;IACrE,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAWlC,wBAAwB,IAAI,IAAI;IAIhC,iBAAiB,IAAI,IAAI;IASzB,oBAAoB,IAAI,IAAI;IAyCnC;;;;;;OAMG;IACH,SAAS,CAAC,MAAM,IAAI,IAAI;CA2UzB;AAED,gFAAgF;AAChF,wBAAgB,qBAAqB,CAAC,QAAQ,wBAA2B,GAAG,IAAI,CAK/E"}
|