@honua/app-platform 0.1.2-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.
Files changed (383) hide show
  1. package/collaboration/client.d.ts.map +1 -1
  2. package/connect-url-safety.d.ts +53 -0
  3. package/connect-url-safety.js +189 -0
  4. package/contract/discovery.d.ts +34 -0
  5. package/contract/discovery.d.ts.map +1 -1
  6. package/contract/index.d.ts +7 -5
  7. package/contract/index.d.ts.map +1 -1
  8. package/contract/index.js +3 -2
  9. package/contract/pmtiles.d.ts +10 -1
  10. package/contract/pmtiles.d.ts.map +1 -1
  11. package/contract/pmtiles.js +10 -2
  12. package/contract/protocol-module.d.ts +84 -9
  13. package/contract/protocol-module.d.ts.map +1 -1
  14. package/contract/query-filter-fes.d.ts +18 -0
  15. package/contract/query-filter-fes.d.ts.map +1 -0
  16. package/contract/query-filter-fes.js +122 -0
  17. package/contract/query-filter.d.ts +300 -0
  18. package/contract/query-filter.d.ts.map +1 -0
  19. package/contract/query-filter.js +883 -0
  20. package/contract/schema.d.ts +12 -0
  21. package/contract/schema.d.ts.map +1 -1
  22. package/contract/schema.js +34 -0
  23. package/contract/source-capability-support.d.ts.map +1 -1
  24. package/contract/source-capability-support.js +15 -3
  25. package/contract/source.d.ts +45 -25
  26. package/contract/source.d.ts.map +1 -1
  27. package/contract/source.js +719 -479
  28. package/contract/types.d.ts +87 -18
  29. package/contract/types.d.ts.map +1 -1
  30. package/contract/widget-source.d.ts.map +1 -1
  31. package/controls/basemap-switcher.d.ts +19 -11
  32. package/controls/basemap-switcher.d.ts.map +1 -1
  33. package/controls/basemap-switcher.js +58 -25
  34. package/controls/catalog.d.ts +105 -0
  35. package/controls/catalog.d.ts.map +1 -0
  36. package/controls/catalog.js +341 -0
  37. package/controls/element-utils.d.ts +9 -0
  38. package/controls/element-utils.d.ts.map +1 -1
  39. package/controls/element-utils.js +17 -0
  40. package/controls/index.d.ts +29 -8
  41. package/controls/index.d.ts.map +1 -1
  42. package/controls/index.js +26 -8
  43. package/controls/layer-list.d.ts +13 -5
  44. package/controls/layer-list.d.ts.map +1 -1
  45. package/controls/layer-list.js +72 -15
  46. package/controls/legend.d.ts +32 -5
  47. package/controls/legend.d.ts.map +1 -1
  48. package/controls/legend.js +95 -25
  49. package/controls/qualification.d.ts +152 -0
  50. package/controls/qualification.d.ts.map +1 -0
  51. package/controls/qualification.js +1265 -0
  52. package/controls/registry.d.ts +104 -0
  53. package/controls/registry.d.ts.map +1 -0
  54. package/controls/registry.js +150 -0
  55. package/controls/swipe-control.d.ts +6 -1
  56. package/controls/swipe-control.d.ts.map +1 -1
  57. package/controls/swipe-control.js +82 -20
  58. package/core/client.d.ts +45 -21
  59. package/core/client.d.ts.map +1 -1
  60. package/core/client.js +224 -46
  61. package/core/error-classifications.d.ts +6 -0
  62. package/core/error-classifications.d.ts.map +1 -1
  63. package/core/error-classifications.js +6 -0
  64. package/core/error-code-registry.d.ts +6 -0
  65. package/core/error-code-registry.d.ts.map +1 -1
  66. package/core/error-code-registry.js +6 -0
  67. package/core/error-envelope.js +2 -0
  68. package/core/errors.d.ts +1 -1
  69. package/core/errors.js +1 -1
  70. package/core/geoparquet-sql.d.ts +68 -4
  71. package/core/geoparquet-sql.d.ts.map +1 -1
  72. package/core/geoparquet-sql.js +325 -8
  73. package/core/odata-write-codec.d.ts.map +1 -1
  74. package/core/odata-write-codec.js +0 -1
  75. package/core/odata.d.ts +6 -0
  76. package/core/odata.d.ts.map +1 -1
  77. package/core/odata.js +6 -1
  78. package/core/ogc-processes.d.ts +182 -25
  79. package/core/ogc-processes.d.ts.map +1 -1
  80. package/core/ogc-processes.js +602 -30
  81. package/core/process-runner.d.ts +8 -1
  82. package/core/process-runner.d.ts.map +1 -1
  83. package/core/process-runner.js +1 -0
  84. package/core/protocol-transport.d.ts +2 -0
  85. package/core/protocol-transport.d.ts.map +1 -1
  86. package/core/stac.d.ts +31 -0
  87. package/core/stac.d.ts.map +1 -1
  88. package/core/stac.js +136 -19
  89. package/core/surfaces.d.ts.map +1 -1
  90. package/core/surfaces.js +273 -68
  91. package/core/types.d.ts +123 -9
  92. package/core/types.d.ts.map +1 -1
  93. package/core/wfs-axis-order.d.ts +18 -0
  94. package/core/wfs-axis-order.d.ts.map +1 -0
  95. package/core/wfs-axis-order.js +108 -0
  96. package/core/wfs-capabilities.d.ts +65 -24
  97. package/core/wfs-capabilities.d.ts.map +1 -1
  98. package/core/wfs-capabilities.js +237 -27
  99. package/core/wfs-filter.d.ts +26 -3
  100. package/core/wfs-filter.d.ts.map +1 -1
  101. package/core/wfs-filter.js +48 -53
  102. package/core/wfs-protocol-error.d.ts +12 -0
  103. package/core/wfs-protocol-error.d.ts.map +1 -0
  104. package/core/wfs-protocol-error.js +13 -0
  105. package/core/wfs.d.ts +53 -1
  106. package/core/wfs.d.ts.map +1 -1
  107. package/core/wfs.js +251 -29
  108. package/core/wms-feature-info.d.ts +92 -0
  109. package/core/wms-feature-info.d.ts.map +1 -0
  110. package/core/wms-feature-info.js +285 -0
  111. package/core/wms.d.ts +9 -0
  112. package/core/wms.d.ts.map +1 -1
  113. package/core/wms.js +17 -5
  114. package/esri-compat/event-bus.d.ts +20 -0
  115. package/esri-compat/event-bus.d.ts.map +1 -1
  116. package/esri-compat/feature-filter.d.ts +46 -1
  117. package/esri-compat/feature-filter.d.ts.map +1 -1
  118. package/esri-compat/feature-filter.js +49 -0
  119. package/esri-compat/geojson-layer.d.ts +4 -2
  120. package/esri-compat/geojson-layer.d.ts.map +1 -1
  121. package/esri-compat/geojson-layer.js +4 -2
  122. package/esri-compat/identity-manager.js +2 -2
  123. package/esri-compat/imagery-layer.d.ts +2 -1
  124. package/esri-compat/imagery-layer.d.ts.map +1 -1
  125. package/esri-compat/imagery-layer.js +2 -1
  126. package/esri-compat/layer-list.d.ts +8 -1
  127. package/esri-compat/layer-list.d.ts.map +1 -1
  128. package/esri-compat/layer-list.js +11 -4
  129. package/esri-compat/legend.d.ts.map +1 -1
  130. package/esri-compat/legend.js +1 -1
  131. package/esri-compat/locator.d.ts +297 -0
  132. package/esri-compat/locator.d.ts.map +1 -0
  133. package/esri-compat/locator.js +579 -0
  134. package/esri-compat/map-image-layer.d.ts.map +1 -1
  135. package/esri-compat/map-view.d.ts.map +1 -1
  136. package/esri-compat/map-view.js +1 -1
  137. package/esri-compat/scene-view.d.ts.map +1 -1
  138. package/esri-compat/time-slider.d.ts +29 -0
  139. package/esri-compat/time-slider.d.ts.map +1 -1
  140. package/esri-compat/time-slider.js +117 -0
  141. package/esri-compat/wfs-layer.d.ts +2 -1
  142. package/esri-compat/wfs-layer.d.ts.map +1 -1
  143. package/esri-compat/wfs-layer.js +2 -1
  144. package/esri-compat/widget-host.d.ts +42 -6
  145. package/esri-compat/widget-host.d.ts.map +1 -1
  146. package/esri-compat/widget-host.js +99 -10
  147. package/generated-app/projection.d.ts.map +1 -1
  148. package/generated-app/runtime.d.ts.map +1 -1
  149. package/map/data-to-map-bridge.d.ts +1 -1
  150. package/map/data-to-map-bridge.d.ts.map +1 -1
  151. package/map/data-to-map-bridge.js +1 -2
  152. package/map/honua-map.d.ts.map +1 -1
  153. package/map/honua-map.js +1 -1
  154. package/map/index.d.ts +2 -0
  155. package/map/index.d.ts.map +1 -1
  156. package/map/index.js +2 -0
  157. package/map/realtime-reconciliation-adapter.d.ts +98 -0
  158. package/map/realtime-reconciliation-adapter.d.ts.map +1 -0
  159. package/map/realtime-reconciliation-adapter.js +84 -0
  160. package/map/temporal-playback.d.ts +25 -0
  161. package/map/temporal-playback.d.ts.map +1 -1
  162. package/map/temporal-playback.js +29 -1
  163. package/operator/workspace/workspace.d.ts.map +1 -1
  164. package/operator/workspace/workspace.js +0 -2
  165. package/package.json +4 -3
  166. package/query-planner/canonical-filter.d.ts +30 -0
  167. package/query-planner/canonical-filter.d.ts.map +1 -0
  168. package/query-planner/canonical-filter.js +30 -0
  169. package/query-planner/columnar-plan.d.ts +63 -0
  170. package/query-planner/columnar-plan.d.ts.map +1 -0
  171. package/query-planner/columnar-plan.js +94 -0
  172. package/query-planner/diagnostics.d.ts +3 -3
  173. package/query-planner/diagnostics.d.ts.map +1 -1
  174. package/query-planner/diagnostics.js +17 -4
  175. package/query-planner/duckdb.d.ts.map +1 -1
  176. package/query-planner/duckdb.js +16 -2
  177. package/query-planner/execution-context.d.ts.map +1 -1
  178. package/query-planner/execution-context.js +3 -1
  179. package/query-planner/executor.d.ts.map +1 -1
  180. package/query-planner/executor.js +7 -1
  181. package/query-planner/geoservices.d.ts.map +1 -1
  182. package/query-planner/geoservices.js +24 -5
  183. package/query-planner/grpc.d.ts.map +1 -1
  184. package/query-planner/grpc.js +29 -5
  185. package/query-planner/index.d.ts +20 -5
  186. package/query-planner/index.d.ts.map +1 -1
  187. package/query-planner/index.js +16 -3
  188. package/query-planner/ir.d.ts +6 -1
  189. package/query-planner/ir.d.ts.map +1 -1
  190. package/query-planner/ir.js +63 -1
  191. package/query-planner/odata-protocol-module.d.ts +54 -0
  192. package/query-planner/odata-protocol-module.d.ts.map +1 -0
  193. package/query-planner/odata-protocol-module.js +199 -0
  194. package/query-planner/odata-v1.d.ts +23 -0
  195. package/query-planner/odata-v1.d.ts.map +1 -0
  196. package/query-planner/odata-v1.js +202 -0
  197. package/query-planner/odata.d.ts +0 -3
  198. package/query-planner/odata.d.ts.map +1 -1
  199. package/query-planner/odata.js +0 -143
  200. package/query-planner/ogc-features.d.ts.map +1 -1
  201. package/query-planner/ogc-features.js +23 -1
  202. package/query-planner/planner.d.ts +2 -2
  203. package/query-planner/planner.d.ts.map +1 -1
  204. package/query-planner/planner.js +146 -27
  205. package/query-planner/representation.d.ts +59 -0
  206. package/query-planner/representation.d.ts.map +1 -0
  207. package/query-planner/representation.js +140 -0
  208. package/query-planner/types.d.ts +153 -3
  209. package/query-planner/types.d.ts.map +1 -1
  210. package/query-planner/wfs-protocol-module.d.ts +57 -0
  211. package/query-planner/wfs-protocol-module.d.ts.map +1 -0
  212. package/query-planner/wfs-protocol-module.js +731 -0
  213. package/query-planner/wfs-v1.d.ts +41 -0
  214. package/query-planner/wfs-v1.d.ts.map +1 -0
  215. package/query-planner/wfs-v1.js +366 -0
  216. package/query-planner/wfs.d.ts +1 -3
  217. package/query-planner/wfs.d.ts.map +1 -1
  218. package/query-planner/wfs.js +1 -70
  219. package/realtime/checkpoint-store.d.ts +206 -0
  220. package/realtime/checkpoint-store.d.ts.map +1 -0
  221. package/realtime/checkpoint-store.js +504 -0
  222. package/realtime/honua-server.d.ts +8 -0
  223. package/realtime/honua-server.d.ts.map +1 -1
  224. package/realtime/honua-server.js +123 -14
  225. package/realtime/index.d.ts +4 -0
  226. package/realtime/index.d.ts.map +1 -1
  227. package/realtime/index.js +2 -0
  228. package/realtime/reconciliation.d.ts +245 -0
  229. package/realtime/reconciliation.d.ts.map +1 -0
  230. package/realtime/reconciliation.js +377 -0
  231. package/realtime/resumable-transport.d.ts.map +1 -1
  232. package/realtime/sse.d.ts.map +1 -1
  233. package/realtime/websocket.d.ts.map +1 -1
  234. package/realtime/wire.d.ts +2 -1
  235. package/realtime/wire.d.ts.map +1 -1
  236. package/realtime/wire.js +24 -8
  237. package/replica-sync/errors.d.ts +19 -1
  238. package/replica-sync/errors.d.ts.map +1 -1
  239. package/replica-sync/errors.js +16 -0
  240. package/replica-sync/geoservices.d.ts +260 -0
  241. package/replica-sync/geoservices.d.ts.map +1 -0
  242. package/replica-sync/geoservices.js +1093 -0
  243. package/replica-sync/index.d.ts +5 -1
  244. package/replica-sync/index.d.ts.map +1 -1
  245. package/replica-sync/index.js +3 -1
  246. package/replica-sync/transport-conformance.d.ts +58 -0
  247. package/replica-sync/transport-conformance.d.ts.map +1 -0
  248. package/replica-sync/transport-conformance.js +265 -0
  249. package/replica-sync/types.d.ts +22 -0
  250. package/replica-sync/types.d.ts.map +1 -1
  251. package/runtime/index.d.ts +6 -2
  252. package/runtime/index.d.ts.map +1 -1
  253. package/runtime/index.js +3 -1
  254. package/runtime/load-package.d.ts +24 -0
  255. package/runtime/load-package.d.ts.map +1 -1
  256. package/runtime/load-package.js +45 -1
  257. package/runtime/maplibre-renderer.d.ts +11 -0
  258. package/runtime/maplibre-renderer.d.ts.map +1 -1
  259. package/runtime/maplibre-renderer.js +32 -7
  260. package/runtime/offline-region-protocol.d.ts +73 -0
  261. package/runtime/offline-region-protocol.d.ts.map +1 -0
  262. package/runtime/offline-region-protocol.js +63 -0
  263. package/runtime/offline-region-style.d.ts +78 -0
  264. package/runtime/offline-region-style.d.ts.map +1 -0
  265. package/runtime/offline-region-style.js +147 -0
  266. package/runtime/pmtiles-protocol.d.ts +7 -8
  267. package/runtime/pmtiles-protocol.d.ts.map +1 -1
  268. package/runtime/pmtiles-protocol.js +19 -66
  269. package/runtime/protocol-registry.d.ts +55 -0
  270. package/runtime/protocol-registry.d.ts.map +1 -0
  271. package/runtime/protocol-registry.js +103 -0
  272. package/runtime/runtime.d.ts +2 -0
  273. package/runtime/runtime.d.ts.map +1 -1
  274. package/runtime/runtime.js +6 -1
  275. package/scene-workspace/analysis-widgets.d.ts +4 -2
  276. package/scene-workspace/analysis-widgets.d.ts.map +1 -1
  277. package/scene-workspace/analysis-widgets.js +4 -2
  278. package/scene-workspace/camera-correspondence.d.ts +151 -0
  279. package/scene-workspace/camera-correspondence.d.ts.map +1 -0
  280. package/scene-workspace/camera-correspondence.js +220 -0
  281. package/scene-workspace/cesium-adapter.d.ts +230 -29
  282. package/scene-workspace/cesium-adapter.d.ts.map +1 -1
  283. package/scene-workspace/cesium-adapter.js +741 -56
  284. package/scene-workspace/cesium-mount.d.ts +205 -0
  285. package/scene-workspace/cesium-mount.d.ts.map +1 -0
  286. package/scene-workspace/cesium-mount.js +392 -0
  287. package/scene-workspace/cesium-scene-owner.d.ts +160 -0
  288. package/scene-workspace/cesium-scene-owner.d.ts.map +1 -0
  289. package/scene-workspace/cesium-scene-owner.js +205 -0
  290. package/scene-workspace/cesium-state-sync.d.ts +101 -0
  291. package/scene-workspace/cesium-state-sync.d.ts.map +1 -0
  292. package/scene-workspace/cesium-state-sync.js +432 -0
  293. package/scene-workspace/cesium-time.d.ts +346 -0
  294. package/scene-workspace/cesium-time.d.ts.map +1 -0
  295. package/scene-workspace/cesium-time.js +403 -0
  296. package/scene-workspace/index.d.ts +42 -10
  297. package/scene-workspace/index.d.ts.map +1 -1
  298. package/scene-workspace/index.js +32 -7
  299. package/scene-workspace/maplibre-state-sync.d.ts +112 -0
  300. package/scene-workspace/maplibre-state-sync.d.ts.map +1 -0
  301. package/scene-workspace/maplibre-state-sync.js +400 -0
  302. package/scene-workspace/primitives.d.ts +237 -3
  303. package/scene-workspace/primitives.d.ts.map +1 -1
  304. package/scene-workspace/primitives.js +1087 -17
  305. package/scene-workspace/scene-discovery.d.ts +5 -2
  306. package/scene-workspace/scene-discovery.d.ts.map +1 -1
  307. package/scene-workspace/scene-discovery.js +5 -2
  308. package/scene-workspace/scene-view.d.ts +5 -2
  309. package/scene-workspace/scene-view.d.ts.map +1 -1
  310. package/scene-workspace/scene-view.js +5 -2
  311. package/scene-workspace/source-to-cesium.d.ts +141 -8
  312. package/scene-workspace/source-to-cesium.d.ts.map +1 -1
  313. package/scene-workspace/source-to-cesium.js +497 -72
  314. package/scene-workspace/state-sync-port-kit.d.ts +156 -0
  315. package/scene-workspace/state-sync-port-kit.d.ts.map +1 -0
  316. package/scene-workspace/state-sync-port-kit.js +319 -0
  317. package/scene-workspace/state-sync.d.ts +34 -1
  318. package/scene-workspace/state-sync.d.ts.map +1 -1
  319. package/scene-workspace/state-sync.js +48 -0
  320. package/scene-workspace/types.d.ts +8 -0
  321. package/scene-workspace/types.d.ts.map +1 -1
  322. package/scene-workspace/types.js +2 -0
  323. package/scene-workspace/workspace.d.ts +12 -1
  324. package/scene-workspace/workspace.d.ts.map +1 -1
  325. package/scene-workspace/workspace.js +13 -0
  326. package/studio/index.d.ts +24 -7
  327. package/studio/index.d.ts.map +1 -1
  328. package/studio/index.js +21 -7
  329. package/studio/lifecycle-client.d.ts +164 -0
  330. package/studio/lifecycle-client.d.ts.map +1 -0
  331. package/studio/lifecycle-client.js +299 -0
  332. package/studio/lifecycle-errors.d.ts +91 -0
  333. package/studio/lifecycle-errors.d.ts.map +1 -0
  334. package/studio/lifecycle-errors.js +77 -0
  335. package/studio/lifecycle-types.d.ts +321 -0
  336. package/studio/lifecycle-types.d.ts.map +1 -0
  337. package/studio/lifecycle-types.js +22 -0
  338. package/web-components/controller.d.ts.map +1 -1
  339. package/web-components/csp-styles.d.ts +6 -0
  340. package/web-components/csp-styles.d.ts.map +1 -0
  341. package/web-components/csp-styles.js +53 -0
  342. package/web-components/elements.d.ts +158 -2
  343. package/web-components/elements.d.ts.map +1 -1
  344. package/web-components/elements.js +1302 -215
  345. package/web-components/export-redaction.d.ts +252 -0
  346. package/web-components/export-redaction.d.ts.map +1 -0
  347. package/web-components/export-redaction.js +588 -0
  348. package/web-components/export.d.ts +417 -0
  349. package/web-components/export.d.ts.map +1 -0
  350. package/web-components/export.js +719 -0
  351. package/web-components/feature-editor-model.d.ts +265 -0
  352. package/web-components/feature-editor-model.d.ts.map +1 -0
  353. package/web-components/feature-editor-model.js +438 -0
  354. package/web-components/feature-editor-sketch.d.ts +125 -0
  355. package/web-components/feature-editor-sketch.d.ts.map +1 -0
  356. package/web-components/feature-editor-sketch.js +194 -0
  357. package/web-components/feature-editor-workflow.d.ts +286 -0
  358. package/web-components/feature-editor-workflow.d.ts.map +1 -0
  359. package/web-components/feature-editor-workflow.js +889 -0
  360. package/web-components/feature-editor.d.ts +83 -0
  361. package/web-components/feature-editor.d.ts.map +1 -0
  362. package/web-components/feature-editor.js +829 -0
  363. package/web-components/feature-table-engine.d.ts +465 -0
  364. package/web-components/feature-table-engine.d.ts.map +1 -0
  365. package/web-components/feature-table-engine.js +1360 -0
  366. package/web-components/feature-table-view.d.ts +95 -0
  367. package/web-components/feature-table-view.d.ts.map +1 -0
  368. package/web-components/feature-table-view.js +343 -0
  369. package/web-components/index.d.ts +34 -3
  370. package/web-components/index.d.ts.map +1 -1
  371. package/web-components/index.js +35 -2
  372. package/web-components/maplibre-renderer.d.ts.map +1 -1
  373. package/web-components/maplibre-renderer.js +13 -4
  374. package/web-components/measurement.d.ts +3 -1
  375. package/web-components/measurement.d.ts.map +1 -1
  376. package/web-components/measurement.js +62 -18
  377. package/web-components/time-slider.d.ts +122 -0
  378. package/web-components/time-slider.d.ts.map +1 -0
  379. package/web-components/time-slider.js +740 -0
  380. package/web-components/types.d.ts +310 -0
  381. package/web-components/types.d.ts.map +1 -1
  382. package/webmap/convert-label.js +0 -1
  383. 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 label = this.#attr("label") ?? "Measure";
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.innerHTML = `
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"}>Finish</button>
376
- <button type="button" part="cancel" data-measure-cancel${this.#vertices.length > 0 ? "" : " disabled"}>Cancel</button>
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
- : "Click adds a vertex; double-click or Finish completes; Escape or Cancel discards.")}</p>
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" ? "Click the map to start a line." : "Click the map to outline an area.";
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 `${this.#vertices.length} vertex — add another to measure.`;
405
- return `Distance: ${formatDistance(result.distance)}${this.#finished ? " (finished)" : ""}`;
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 `${this.#vertices.length} of 3 vertices needed for an area.`;
429
+ return (this.#messages.vertexArea?.(this.#vertices.length) ??
430
+ `${this.#vertices.length} of 3 vertices needed for an area.`);
409
431
  }
410
- return `Area: ${formatArea(result.area)}${this.#finished ? " (finished)" : ""}`;
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"}