@opengeoweb/core 19.4.0 → 19.5.1-nightly-20260831

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/dist/index.esm.js CHANGED
@@ -9,7 +9,7 @@ import { mapSelectors, layerSelectors, layerActions, layerTypes, filterLayers, m
9
9
  import i18n from 'i18next';
10
10
  import { useTranslation, Trans, I18nextProvider } from 'react-i18next';
11
11
  import { TIME_SLIDER_NAMESPACE, timesliderTranslations, defaultTimeSpan, AnimationLengthButton, AnimationLength, AutoUpdateButton, BackwardForwardStepButton, NowButton, handleSetNowEvent, PlayButton, defaultTimeStep, SpeedButton, TimeSpanButton, secondsPerPxFromCanvasWidth, getNewCenterOfFixedPointZoom, TimeStepButton, OptionsMenuButton, TimeSliderButtons, TimeSliderCurrentTimeBox, TimeSliderLegend, onsetNewDateDebounced, getFilteredTime, defaultSecondsPerPx, moveSelectedTimePx, TimeSlider } from '@opengeoweb/time-slider';
12
- import { webmapReactTranslations, WEBMAP_REACT_NAMESPACE, webmapTranslations, WEBMAP_NAMESPACE, openLayersGetMapImageStore, LayerInfoButton, useGetWMLayerInstance, useEDRGetCollectionDetails, useStacCollection, getRendersAsStyles, defaultEdrStyles, LayerInfoDialog, MapControlButton, MapDimensionSelect, dimensionConfig, DimensionSelectDialog, DimensionSelectButton, Clock, LegendDialog, LegendButton, MapContext, emptyGeoJSON, MapFeatureClass, setMapCenter, makeTimeList, getIsInsideAcceptanceTime, OpenLayersLayer, isGeoJSONGeometryEmpty, OpenLayersFeatureLayer, OpenLayersMapDraw, MapMeasure, useSetIntervalWhenVisible, TimeContext, OpenLayersMapView, WMSLayer, genericOpenLayersFeatureStyle, OpenLayersGetFeatureInfo, MapControls, OpenLayersZoomControl, getLayerUpdateInfo, publicLayers } from '@opengeoweb/webmap-react';
12
+ import { webmapReactTranslations, WEBMAP_REACT_NAMESPACE, webmapTranslations, WEBMAP_NAMESPACE, openLayersGetMapImageStore, LayerInfoButton, useStacCollection, useGetWMLayerInstance, useEDRGetCollectionDetails, getStacCollectionStyles, resolvePreferredStyleName, defaultEdrStyles, LayerInfoDialog, MapControlButton, MapDimensionSelect, dimensionConfig, DimensionSelectDialog, DimensionSelectButton, Clock, LegendDialog, LegendButton, MapContext, emptyGeoJSON, MapFeatureClass, setMapCenter, makeTimeList, getIsInsideAcceptanceTime, OpenLayersLayer, isGeoJSONGeometryEmpty, OpenLayersFeatureLayer, OpenLayersMapDraw, MapMeasure, useSetIntervalWhenVisible, TimeContext, OpenLayersMapView, WMSLayer, genericOpenLayersFeatureStyle, OpenLayersGetFeatureInfo, MapControls, OpenLayersZoomControl, getLayerUpdateInfo, publicLayers } from '@opengeoweb/webmap-react';
13
13
  import { Cached, Add, MapAdd, CollapseSmall, CollapseMedium, CollapseLarge, CollapseWindow, ExpandWindow, LayersAdd, CloudLoading, ColumnCollapsed, ColumnCollapse, DragHandle as DragHandle$1, None, FastForward, AutoUpdateActive, Both, Delete, Visibility, VisibilityOff, Copy, ZoomToLayer, Overlayers, WorldMapProjection, Layers, Search, Exclamation, MyLocation, Airplane, Region, Pinned, Close, ExitDomain, LocationInfo, Measure, Options, Info, ThemeWrapper, lightTheme, FlagBritain, FlagNetherlands, FlagFinland, FlagNorway } from '@opengeoweb/theme';
14
14
  import { ReactSortable } from 'react-sortablejs';
15
15
  import Sortable from 'sortablejs';
@@ -73,6 +73,10 @@ var en = {
73
73
  "layermanager-layer-duplicate-to-other-maps": "Copy layer to other maps",
74
74
  "layermanager-layer-remove-from-other-maps": "Remove layer from other maps",
75
75
  "layermanager-layer-zoom-to-extent": "Zoom to layer",
76
+ "layermanager-stac-layout-title": "Raster layout",
77
+ "layermanager-stac-layout-auto": "Automatic",
78
+ "layermanager-stac-layout-temporal": "One image per time",
79
+ "layermanager-stac-layout-spatial-tiles": "Spatially tiled images",
76
80
  "layermanager-options": "Options",
77
81
  "layermanager-baselayers-tooltip": "Add base layers",
78
82
  "layermanager-header-button-small": "small",
@@ -170,6 +174,10 @@ var fi = {
170
174
  "layermanager-layer-duplicate-to-other-maps": "Kopioi karttataso muihin karttoihin",
171
175
  "layermanager-layer-remove-from-other-maps": "Poista karttataso muista kartoista",
172
176
  "layermanager-layer-zoom-to-extent": "Zoomaa karttatasoon",
177
+ "layermanager-stac-layout-title": "Rasteriaineiston rakenne",
178
+ "layermanager-stac-layout-auto": "Automaattinen",
179
+ "layermanager-stac-layout-temporal": "Yksi kuva ajanhetkeä kohti",
180
+ "layermanager-stac-layout-spatial-tiles": "Alueellisesti tiilitetyt kuvat",
173
181
  "layermanager-options": "Valinnat",
174
182
  "layermanager-baselayers-tooltip": "Lisää pohjakartta",
175
183
  "layermanager-header-button-small": "Pieni",
@@ -258,6 +266,10 @@ var no = {
258
266
  "layermanager-layer-duplicate-to-other-maps": "Kopier lag til andre kart",
259
267
  "layermanager-layer-remove-from-other-maps": "Fjern lag fra andre kart",
260
268
  "layermanager-layer-zoom-to-extent": "Zoom til lag",
269
+ "layermanager-stac-layout-title": "Rasteroppsett",
270
+ "layermanager-stac-layout-auto": "Automatisk",
271
+ "layermanager-stac-layout-temporal": "Ett bilde per tidspunkt",
272
+ "layermanager-stac-layout-spatial-tiles": "Romlig flislagte bilder",
261
273
  "layermanager-options": "Laginnstillinger",
262
274
  "layermanager-baselayers-tooltip": "Legg til basislag",
263
275
  "layermanager-header-button-small": "liten",
@@ -347,6 +359,10 @@ var nl = {
347
359
  "layermanager-layer-duplicate-to-other-maps": "Kopieer laag naar andere kaarten",
348
360
  "layermanager-layer-remove-from-other-maps": "Verwijder laag van andere kaarten",
349
361
  "layermanager-layer-zoom-to-extent": "Zoom naar laag",
362
+ "layermanager-stac-layout-title": "Rasterindeling",
363
+ "layermanager-stac-layout-auto": "Automatisch",
364
+ "layermanager-stac-layout-temporal": "Eén afbeelding per tijdstip",
365
+ "layermanager-stac-layout-spatial-tiles": "Ruimtelijk opgedeelde afbeeldingen",
350
366
  "layermanager-options": "Opties",
351
367
  "layermanager-baselayers-tooltip": "Basislagen toevoegen",
352
368
  "layermanager-header-button-small": "klein",
@@ -2094,7 +2110,7 @@ var DragHandle = function DragHandle(_ref) {
2094
2110
  var nonEmptyTooltipTitle = tooltipTitle != null ? tooltipTitle : t('layermanager-layer-drag');
2095
2111
  var usedTooltipTitle = hideTooltip ? '' : nonEmptyTooltipTitle;
2096
2112
  return jsx(CustomIconButton, {
2097
- className: "handle",
2113
+ className: isDisabled ? undefined : 'handle',
2098
2114
  "data-testid": "dragHandle",
2099
2115
  disableTouchRipple: true,
2100
2116
  disabled: isDisabled,
@@ -3373,7 +3389,10 @@ var LayerManagerMenuButton = function LayerManagerMenuButton(_ref) {
3373
3389
  _ref$canZoomToLayerEx = _ref.canZoomToLayerExtent,
3374
3390
  canZoomToLayerExtent = _ref$canZoomToLayerEx === void 0 ? true : _ref$canZoomToLayerEx,
3375
3391
  tooltipTitle = _ref.tooltipTitle,
3376
- icon = _ref.icon;
3392
+ icon = _ref.icon,
3393
+ stacDataLayout = _ref.stacDataLayout,
3394
+ isTiledStacCollection = _ref.isTiledStacCollection,
3395
+ onChangeStacDataLayout = _ref.onChangeStacDataLayout;
3377
3396
  var _useCoreTranslation = useCoreTranslation(),
3378
3397
  t = _useCoreTranslation.t;
3379
3398
  var nonEmptyTooltipTitle = tooltipTitle != null ? tooltipTitle : t('layermanager-options');
@@ -3392,6 +3411,32 @@ var LayerManagerMenuButton = function LayerManagerMenuButton(_ref) {
3392
3411
  var onClickZoomToExtent = function onClickZoomToExtent() {
3393
3412
  onLayerZoomToExtent == null || onLayerZoomToExtent();
3394
3413
  };
3414
+ var stacDataLayoutMenuItem = onChangeStacDataLayout ? {
3415
+ text: t('layermanager-stac-layout-title'),
3416
+ action: function action() {},
3417
+ subMenuItems: [{
3418
+ text: t('layermanager-stac-layout-auto'),
3419
+ action: function action() {
3420
+ return onChangeStacDataLayout('auto');
3421
+ },
3422
+ controlType: 'radio',
3423
+ isSelected: !stacDataLayout || stacDataLayout === 'auto'
3424
+ }].concat(!isTiledStacCollection ? [{
3425
+ text: t('layermanager-stac-layout-temporal'),
3426
+ action: function action() {
3427
+ return onChangeStacDataLayout('temporal');
3428
+ },
3429
+ controlType: 'radio',
3430
+ isSelected: stacDataLayout === 'temporal'
3431
+ }] : [], [{
3432
+ text: t('layermanager-stac-layout-spatial-tiles'),
3433
+ action: function action() {
3434
+ return onChangeStacDataLayout('spatial-tiles');
3435
+ },
3436
+ controlType: 'radio',
3437
+ isSelected: stacDataLayout === 'spatial-tiles'
3438
+ }])
3439
+ } : undefined;
3395
3440
  return jsx(ToggleMenu, {
3396
3441
  buttonIcon: icon,
3397
3442
  buttonSx: {
@@ -3422,7 +3467,7 @@ var LayerManagerMenuButton = function LayerManagerMenuButton(_ref) {
3422
3467
  action: onClickZoomToExtent,
3423
3468
  icon: jsx(ZoomToLayer, {}),
3424
3469
  isDisabled: !canZoomToLayerExtent
3425
- }],
3470
+ }].concat(stacDataLayoutMenuItem ? [stacDataLayoutMenuItem] : []),
3426
3471
  menuPosition: "bottom",
3427
3472
  tooltipTitle: nonEmptyTooltipTitle,
3428
3473
  children: !!isFeatureLayer && jsx(SelectableFeaturesCheckboxConnect, {
@@ -4330,6 +4375,7 @@ var wmLayerHasZoomExtent = function wmLayerHasZoomExtent(wmLayer, mapSrs) {
4330
4375
  return !!wmLayer.geographicBoundingBox;
4331
4376
  };
4332
4377
  var LayerManagerMenuButtonConnect = function LayerManagerMenuButtonConnect(_ref) {
4378
+ var _layer$service;
4333
4379
  var layerId = _ref.layerId,
4334
4380
  mapId = _ref.mapId,
4335
4381
  tooltipTitle = _ref.tooltipTitle,
@@ -4345,6 +4391,11 @@ var LayerManagerMenuButtonConnect = function LayerManagerMenuButtonConnect(_ref)
4345
4391
  return layerSelectors.getIsFeatureSyncLayer(store, layerId);
4346
4392
  });
4347
4393
  var isFeatureLayer = layerType === LayerType.featureLayer;
4394
+ var isStacGeoTIFFLayer = layerType === LayerType.stacGeoTIFFLayer;
4395
+ var _useStacCollection = useStacCollection(isStacGeoTIFFLayer ? (_layer$service = layer == null ? void 0 : layer.service) != null ? _layer$service : '' : ''),
4396
+ stacCollectionData = _useStacCollection.data;
4397
+ var isTiledStacCollection = Boolean(stacCollectionData == null ? void 0 : stacCollectionData.item_assets);
4398
+ var stacOptions = layer != null && layer.options && !('parameterNames' in layer.options) ? layer.options : undefined;
4348
4399
  var mapSrs = useSelector(function (store) {
4349
4400
  return mapSelectors.getSrs(store, mapId);
4350
4401
  });
@@ -4448,6 +4499,19 @@ var LayerManagerMenuButtonConnect = function LayerManagerMenuButtonConnect(_ref)
4448
4499
  origin: layerTypes.LayerActionOrigin.layerManager
4449
4500
  }));
4450
4501
  }, [dispatch, layerId]);
4502
+ var changeStacDataLayout = React.useCallback(function (dataLayout) {
4503
+ if (!layerId) {
4504
+ return;
4505
+ }
4506
+ dispatch(layerActions.layerChangeOptions({
4507
+ layerId: layerId,
4508
+ mapId: mapId,
4509
+ options: Object.assign({}, stacOptions, {
4510
+ dataLayout: dataLayout
4511
+ }),
4512
+ origin: layerTypes.LayerActionOrigin.layerManager
4513
+ }));
4514
+ }, [dispatch, layerId, mapId, stacOptions]);
4451
4515
  return jsx(LayerManagerMenuButton, {
4452
4516
  canZoomToLayerExtent: canZoomToLayerExtent,
4453
4517
  icon: icon,
@@ -4455,6 +4519,8 @@ var LayerManagerMenuButtonConnect = function LayerManagerMenuButtonConnect(_ref)
4455
4519
  isFeatureSyncLayer: isFeatureSyncLayer,
4456
4520
  layerId: layerId,
4457
4521
  mapId: mapId,
4522
+ isTiledStacCollection: isStacGeoTIFFLayer ? isTiledStacCollection : undefined,
4523
+ onChangeStacDataLayout: isStacGeoTIFFLayer ? changeStacDataLayout : undefined,
4458
4524
  onLayerCopyToOtherMaps: copyLayerToOtherMaps,
4459
4525
  onLayerDuplicate: function onLayerDuplicate() {
4460
4526
  duplicateLayer({
@@ -4464,6 +4530,7 @@ var LayerManagerMenuButtonConnect = function LayerManagerMenuButtonConnect(_ref)
4464
4530
  },
4465
4531
  onLayerRemoveFromOtherMaps: removeLayerFromAllMaps,
4466
4532
  onLayerZoomToExtent: zoomToLayerExtent,
4533
+ stacDataLayout: stacOptions == null ? void 0 : stacOptions.dataLayout,
4467
4534
  tooltipTitle: tooltipTitle
4468
4535
  });
4469
4536
  };
@@ -4650,30 +4717,12 @@ var formatParameterTitle = function formatParameterTitle(baseTitle, parameterKey
4650
4717
  var title = baseTitle + " (" + parameterKey;
4651
4718
  return title.length > 100 ? title.substring(0, 100) + "...)" : title + ")";
4652
4719
  };
4653
- var getSTACServiceRootUrl$1 = function getSTACServiceRootUrl(serviceUrl) {
4654
- return serviceUrl.replace(/\/collections\/[^/]+\/?$/, '');
4655
- };
4656
- var getTrailingSlashVariant = function getTrailingSlashVariant(url) {
4657
- return url.endsWith('/') ? url.slice(0, -1) : url + "/";
4658
- };
4659
4720
  var getSTACCollectionUrl = function getSTACCollectionUrl(serviceRootUrl, collectionName) {
4660
4721
  var normalizedRoot = serviceRootUrl.replace(/\/$/, '');
4661
4722
  // Only encode if not already encoded to avoid double-encoding
4662
4723
  var encodedName = collectionName.includes('%') ? collectionName : encodeURIComponent(collectionName);
4663
4724
  return normalizedRoot + "/collections/" + encodedName;
4664
4725
  };
4665
- var resolvePreferredStyleName = function resolvePreferredStyleName(styleNames, currentStyle) {
4666
- if (styleNames.length === 0) {
4667
- return WMDefaultStyleName;
4668
- }
4669
- if (currentStyle && styleNames.includes(currentStyle)) {
4670
- return currentStyle;
4671
- }
4672
- if (styleNames.includes(WMDefaultStyleName)) {
4673
- return WMDefaultStyleName;
4674
- }
4675
- return styleNames[0];
4676
- };
4677
4726
  var RenderLayersConnect = function RenderLayersConnect(_ref) {
4678
4727
  var _service$layers;
4679
4728
  var layerId = _ref.layerId,
@@ -4696,7 +4745,7 @@ var RenderLayersConnect = function RenderLayersConnect(_ref) {
4696
4745
  var serviceUrl = useSelector(function (store) {
4697
4746
  return layerSelectors.getLayerService(store, layerId);
4698
4747
  });
4699
- var resolvedServiceUrl = isStacGeoTIFFLayer ? getSTACServiceRootUrl$1(serviceUrl) : serviceUrl;
4748
+ var resolvedServiceUrl = isStacGeoTIFFLayer ? layerUtils.getSTACServiceRootUrl(serviceUrl) : serviceUrl;
4700
4749
  var isLayerEnabled = useSelector(function (store) {
4701
4750
  return layerSelectors.getLayerEnabled(store, layerId);
4702
4751
  });
@@ -4707,7 +4756,7 @@ var RenderLayersConnect = function RenderLayersConnect(_ref) {
4707
4756
  if (!isStacGeoTIFFLayer) {
4708
4757
  return serviceSelectors.getServiceByUrl(store, serviceUrl);
4709
4758
  }
4710
- return serviceSelectors.getServiceByUrl(store, resolvedServiceUrl) || serviceSelectors.getServiceByUrl(store, getTrailingSlashVariant(resolvedServiceUrl));
4759
+ return serviceSelectors.getServiceByUrl(store, resolvedServiceUrl) || serviceSelectors.getServiceByUrl(store, layerUtils.getTrailingSlashVariant(resolvedServiceUrl));
4711
4760
  });
4712
4761
  var layerOptions = useSelector(function (store) {
4713
4762
  return layerSelectors.getLayerOptions(store, layerId);
@@ -4773,17 +4822,20 @@ var RenderLayersConnect = function RenderLayersConnect(_ref) {
4773
4822
  if (!isStacGeoTIFFLayer || !isStacCollectionFetched) {
4774
4823
  return;
4775
4824
  }
4776
- var renderNames = Object.keys((stacCollectionData == null ? void 0 : stacCollectionData.renders) || {});
4777
- var nextStyle = resolvePreferredStyleName(renderNames, currentLayerStyle);
4825
+ var styleNames = getStacCollectionStyles(stacCollectionData == null ? void 0 : stacCollectionData.renders, stacCollectionData == null ? void 0 : stacCollectionData.item_assets).map(function (_ref3) {
4826
+ var name = _ref3.name;
4827
+ return name;
4828
+ });
4829
+ var nextStyle = resolvePreferredStyleName(styleNames, currentLayerStyle);
4778
4830
  if (currentLayerStyle !== nextStyle) {
4779
4831
  layerChangeStyle(nextStyle);
4780
4832
  }
4781
4833
  }, [stacCollectionData, isStacCollectionFetched, isStacGeoTIFFLayer, currentLayerStyle, layerChangeStyle]);
4782
4834
  React.useEffect(function () {
4783
- if (!isStacGeoTIFFLayer || !(stacCollectionData != null && stacCollectionData.renders) || !layerName) {
4835
+ if (!isStacGeoTIFFLayer || !stacCollectionData || !layerName) {
4784
4836
  return;
4785
4837
  }
4786
- var styles = getRendersAsStyles(stacCollectionData.renders);
4838
+ var styles = getStacCollectionStyles(stacCollectionData.renders, stacCollectionData.item_assets);
4787
4839
  if (styles.length === 0) {
4788
4840
  return;
4789
4841
  }
@@ -4797,7 +4849,9 @@ var RenderLayersConnect = function RenderLayersConnect(_ref) {
4797
4849
  path: [],
4798
4850
  styles: styles
4799
4851
  }],
4800
- scope: 'system'
4852
+ scope: 'system',
4853
+ isUpdating: true,
4854
+ type: 'STAC'
4801
4855
  });
4802
4856
  }, [stacCollectionData, isStacGeoTIFFLayer, layerName, serviceUrl, serviceSetLayers]);
4803
4857
  React.useEffect(function () {
@@ -4805,8 +4859,8 @@ var RenderLayersConnect = function RenderLayersConnect(_ref) {
4805
4859
  return;
4806
4860
  }
4807
4861
  var layers = Object.entries(data == null ? void 0 : data.parameter_names).map(function (parameter) {
4808
- var _ref3, _parameter$1$label;
4809
- var parameterTitle = (_ref3 = (_parameter$1$label = parameter[1].label) != null ? _parameter$1$label : parameter[1].description) != null ? _ref3 : parameter[0];
4862
+ var _ref4, _parameter$1$label;
4863
+ var parameterTitle = (_ref4 = (_parameter$1$label = parameter[1].label) != null ? _parameter$1$label : parameter[1].description) != null ? _ref4 : parameter[0];
4810
4864
  var title = formatParameterTitle(parameterTitle, parameter[0]);
4811
4865
  return {
4812
4866
  name: parameter[0],
@@ -4830,9 +4884,9 @@ var RenderLayersConnect = function RenderLayersConnect(_ref) {
4830
4884
  });
4831
4885
  }, [data, serviceUrl, service, serviceSetLayers]);
4832
4886
  var layers = (_service$layers = service == null ? void 0 : service.layers) != null ? _service$layers : [];
4833
- var layerChangeName = React.useCallback(function (_ref4) {
4834
- var layerId = _ref4.layerId,
4835
- name = _ref4.name;
4887
+ var layerChangeName = React.useCallback(function (_ref5) {
4888
+ var layerId = _ref5.layerId,
4889
+ name = _ref5.name;
4836
4890
  return dispatch(layerActions.layerChangeName({
4837
4891
  layerId: layerId,
4838
4892
  name: name,
@@ -4840,9 +4894,9 @@ var RenderLayersConnect = function RenderLayersConnect(_ref) {
4840
4894
  origin: layerTypes.LayerActionOrigin.layerManager
4841
4895
  }));
4842
4896
  }, [dispatch, mapId]);
4843
- var layerChangeOptions = React.useCallback(function (_ref5) {
4844
- var layerId = _ref5.layerId,
4845
- options = _ref5.options;
4897
+ var layerChangeOptions = React.useCallback(function (_ref6) {
4898
+ var layerId = _ref6.layerId,
4899
+ options = _ref6.options;
4846
4900
  return dispatch(layerActions.layerChangeOptions({
4847
4901
  layerId: layerId,
4848
4902
  options: options,
@@ -4850,9 +4904,9 @@ var RenderLayersConnect = function RenderLayersConnect(_ref) {
4850
4904
  origin: layerTypes.LayerActionOrigin.layerManager
4851
4905
  }));
4852
4906
  }, [dispatch, mapId]);
4853
- var layerChangeService = React.useCallback(function (_ref6) {
4854
- var layerId = _ref6.layerId,
4855
- service = _ref6.service;
4907
+ var layerChangeService = React.useCallback(function (_ref7) {
4908
+ var layerId = _ref7.layerId,
4909
+ service = _ref7.service;
4856
4910
  return dispatch(layerActions.layerChangeService({
4857
4911
  layerId: layerId,
4858
4912
  service: service,
@@ -4861,9 +4915,10 @@ var RenderLayersConnect = function RenderLayersConnect(_ref) {
4861
4915
  }));
4862
4916
  }, [dispatch, mapId]);
4863
4917
  if (layerType === LayerType.edrFeatureLayer) {
4864
- var _layerOptions$paramet;
4865
- var selectedParams = (_layerOptions$paramet = layerOptions == null ? void 0 : layerOptions.parameterNames) != null ? _layerOptions$paramet : [];
4866
- var collectionId = (layerOptions == null ? void 0 : layerOptions.collectionId) || '';
4918
+ var _edrLayerOptions$para;
4919
+ var edrLayerOptions = layerOptions && 'parameterNames' in layerOptions ? layerOptions : undefined;
4920
+ var selectedParams = (_edrLayerOptions$para = edrLayerOptions == null ? void 0 : edrLayerOptions.parameterNames) != null ? _edrLayerOptions$para : [];
4921
+ var collectionId = (edrLayerOptions == null ? void 0 : edrLayerOptions.collectionId) || '';
4867
4922
  return jsx(RenderEDRLayers, {
4868
4923
  collectionId: collectionId,
4869
4924
  isEnabled: isLayerEnabled,
@@ -5005,20 +5060,14 @@ var LayerInfoButtonConnect = function LayerInfoButtonConnect(_ref) {
5005
5060
  });
5006
5061
  };
5007
5062
 
5008
- var getSTACServiceRootUrl = function getSTACServiceRootUrl(serviceUrl) {
5009
- return serviceUrl.replace(/\/+$/, '').replace(/\/collections\/[^/]+$/, '');
5010
- };
5011
- var trimTrailingSlashes = function trimTrailingSlashes(url) {
5012
- return url.replace(/\/+$/, '');
5013
- };
5014
5063
  var hasSameServiceUrl = function hasSameServiceUrl(urlA, urlB) {
5015
- return trimTrailingSlashes(urlA) === trimTrailingSlashes(urlB);
5064
+ return layerUtils.trimTrailingSlashes(urlA) === layerUtils.trimTrailingSlashes(urlB);
5016
5065
  };
5017
5066
  var hasSameSTACServiceUrl = function hasSameSTACServiceUrl(urlA, urlB) {
5018
- return hasSameServiceUrl(getSTACServiceRootUrl(urlA), getSTACServiceRootUrl(urlB));
5067
+ return hasSameServiceUrl(layerUtils.getSTACServiceRootUrl(urlA), layerUtils.getSTACServiceRootUrl(urlB));
5019
5068
  };
5020
5069
  var isSTACCollectionUrl = function isSTACCollectionUrl(serviceUrl) {
5021
- return trimTrailingSlashes(serviceUrl) !== getSTACServiceRootUrl(serviceUrl);
5070
+ return layerUtils.trimTrailingSlashes(serviceUrl) !== layerUtils.getSTACServiceRootUrl(serviceUrl);
5022
5071
  };
5023
5072
  var hasMatchingSTACLayerServiceUrl = function hasMatchingSTACLayerServiceUrl(layerServiceUrl, layerInfoServiceUrl) {
5024
5073
  if (hasSameServiceUrl(layerServiceUrl, layerInfoServiceUrl)) {
@@ -5050,7 +5099,7 @@ var LayerInfoDialogConnect = function LayerInfoDialogConnect(_ref) {
5050
5099
  });
5051
5100
  var layerInfoServiceUrl = (_layerInfo$serviceUrl = layerInfo == null ? void 0 : layerInfo.serviceUrl) != null ? _layerInfo$serviceUrl : '';
5052
5101
  var isSelectedSTACLayer = (selectedMapLayer == null ? void 0 : selectedMapLayer.layerType) === LayerType.stacGeoTIFFLayer;
5053
- var serviceLookupUrl = isSelectedSTACLayer ? getSTACServiceRootUrl((_selectedMapLayer$ser = selectedMapLayer.service) != null ? _selectedMapLayer$ser : layerInfoServiceUrl) : layerInfoServiceUrl;
5102
+ var serviceLookupUrl = isSelectedSTACLayer ? layerUtils.getSTACServiceRootUrl((_selectedMapLayer$ser = selectedMapLayer.service) != null ? _selectedMapLayer$ser : layerInfoServiceUrl) : layerInfoServiceUrl;
5054
5103
  var currentService = useSelector(function (store) {
5055
5104
  if (!isSelectedSTACLayer) {
5056
5105
  return serviceSelectors.getServiceByUrl(store, serviceLookupUrl);
@@ -5250,13 +5299,16 @@ var LayerContainerRow = /*#__PURE__*/React.memo(function (_ref) {
5250
5299
  var _React$useState4 = React.useState(0),
5251
5300
  rowsToDisplayFeature = _React$useState4[0],
5252
5301
  setRowsToDisplayFeature = _React$useState4[1];
5253
- var featureLayerIds = React.useMemo(function () {
5302
+ var displayFeatureLayers = React.useMemo(function () {
5254
5303
  return featureLayers.filter(function (layer) {
5255
5304
  return layer.name !== undefined && layer.id !== undefined;
5256
- }).map(function (layer) {
5257
- return layer.id;
5258
5305
  });
5259
5306
  }, [featureLayers]);
5307
+ var featureLayerIds = React.useMemo(function () {
5308
+ return displayFeatureLayers.map(function (layer) {
5309
+ return layer.id;
5310
+ });
5311
+ }, [displayFeatureLayers]);
5260
5312
  var layerMove = React.useCallback(function (_ref2) {
5261
5313
  var mapId = _ref2.mapId,
5262
5314
  oldIndex = _ref2.oldIndex,
@@ -5341,21 +5393,21 @@ var LayerContainerRow = /*#__PURE__*/React.memo(function (_ref) {
5341
5393
  settings: settings
5342
5394
  }, "layerRowConnect-map-" + layerId);
5343
5395
  });
5344
- var featureLayerContents = featureLayerIds.map(function (layerId) {
5396
+ var featureLayerContents = displayFeatureLayers.map(function (layer) {
5345
5397
  var _settings$dragHandle3, _settings$dragHandle4;
5346
5398
  return jsx(LayerRowConnect, {
5347
5399
  collapsedColumns: collapsedColumns,
5348
5400
  dragHandle: jsx(DragHandle, {
5349
- hideTooltip: isSortingFeature || isDragDisabledFeature,
5401
+ hideTooltip: isSortingFeature || isDragDisabledFeature || Boolean(layer.featureSync),
5350
5402
  icon: settings == null || (_settings$dragHandle3 = settings.dragHandle) == null ? void 0 : _settings$dragHandle3.icon,
5351
- isDisabled: isDragDisabledFeature,
5403
+ isDisabled: isDragDisabledFeature || Boolean(layer.featureSync),
5352
5404
  isSorting: isSortingFeature,
5353
5405
  tooltipTitle: settings == null || (_settings$dragHandle4 = settings.dragHandle) == null ? void 0 : _settings$dragHandle4.tooltipTitle
5354
5406
  }),
5355
- layerId: layerId,
5407
+ layerId: layer.id,
5356
5408
  mapId: mapId,
5357
5409
  settings: settings
5358
- }, "layerRowConnect-feature-" + layerId);
5410
+ }, "layerRowConnect-feature-" + layer.id);
5359
5411
  });
5360
5412
  React.useEffect(function () {
5361
5413
  if (rowsToDisplayMap < mapLayerIds.length) {
@@ -7899,14 +7951,15 @@ var createLinkedFeatureCollection = function createLinkedFeatureCollection(linke
7899
7951
  var originalId = getFeatureKey((_geoFeature$propertie = geoFeature.properties) == null ? void 0 : _geoFeature$propertie.originalId) || getFeatureKey(featureLayer.originalId);
7900
7952
  return !(featureId && warningDialogFeatureKeys.has(featureId) || originalId && warningDialogFeatureKeys.has(originalId));
7901
7953
  }).map(function (geoFeature) {
7902
- var _featureLayer$feature, _getGeoFeatureSelecti;
7954
+ var _featureLayer$feature, _getGeoFeatureSelecti, _featureLayer$opacity;
7903
7955
  var featureLayerKey = ((_featureLayer$feature = featureLayer.featureSync) == null ? void 0 : _featureLayer$feature.featureLayerKey) || featureLayer.id;
7904
7956
  var selectedFeatureIds = featureLayerKey ? selectedFeatureIdsByLayerKey.get(featureLayerKey) : undefined;
7905
7957
  var isSelected = selectedFeatureIds == null ? void 0 : selectedFeatureIds.has((_getGeoFeatureSelecti = getGeoFeatureSelectionKey(geoFeature)) != null ? _getGeoFeatureSelecti : '');
7906
7958
  var existingProperties = geoFeature.properties && typeof geoFeature.properties === 'object' ? geoFeature.properties : {};
7907
7959
  return Object.assign({}, geoFeature, {
7908
7960
  properties: Object.assign({}, existingProperties, {
7909
- sourceLayerId: featureLayer.id
7961
+ sourceLayerId: featureLayer.id,
7962
+ layerOpacity: (_featureLayer$opacity = featureLayer.opacity) != null ? _featureLayer$opacity : 1
7910
7963
  }, isSelected ? {
7911
7964
  highlightSelectedFeature: true
7912
7965
  } : undefined, featureLayer.originalId ? {
@@ -8012,6 +8065,23 @@ var makeLayerInfoPayload = function makeLayerInfoPayload(payload, mapDimensions,
8012
8065
  };
8013
8066
  return updatedPayLoad;
8014
8067
  };
8068
+ var getRenderedDimensions = function getRenderedDimensions(_ref) {
8069
+ var layerType = _ref.layerType,
8070
+ layerDimensions = _ref.layerDimensions,
8071
+ mapTimeDimension = _ref.mapTimeDimension;
8072
+ if (layerType !== LayerType.stacGeoTIFFLayer || !mapTimeDimension) {
8073
+ return layerDimensions;
8074
+ }
8075
+ var hasLayerTimeDimension = layerDimensions == null ? void 0 : layerDimensions.some(function (_ref2) {
8076
+ var name = _ref2.name;
8077
+ return name === 'time';
8078
+ });
8079
+ return hasLayerTimeDimension ? layerDimensions.map(function (dimension) {
8080
+ return dimension.name === 'time' ? Object.assign({}, dimension, {
8081
+ currentValue: mapTimeDimension.currentValue
8082
+ }) : dimension;
8083
+ }) : [].concat(layerDimensions != null ? layerDimensions : [], [Object.assign({}, mapTimeDimension)]);
8084
+ };
8015
8085
  var getCenterOfLinkedFeature = function getCenterOfLinkedFeature(feature, srs) {
8016
8086
  var _feature$getGeometry;
8017
8087
  if (feature && ((_feature$getGeometry = feature.getGeometry()) == null ? void 0 : _feature$getGeometry.getType()) === 'Point') {
@@ -8029,11 +8099,11 @@ var getCenterOfLinkedFeature = function getCenterOfLinkedFeature(feature, srs) {
8029
8099
  }
8030
8100
  return null;
8031
8101
  };
8032
- function useFitAndHighlightWarningFeature(_ref) {
8033
- var view = _ref.view,
8034
- warningDialogFeatures = _ref.warningDialogFeatures,
8035
- srs = _ref.srs,
8036
- mapId = _ref.mapId;
8102
+ function useFitAndHighlightWarningFeature(_ref3) {
8103
+ var view = _ref3.view,
8104
+ warningDialogFeatures = _ref3.warningDialogFeatures,
8105
+ srs = _ref3.srs,
8106
+ mapId = _ref3.mapId;
8037
8107
  var dispatch = useDispatch();
8038
8108
  useEffect(function () {
8039
8109
  var _warningDialogFeature, _geoJsonFeature$prope, _warningDialogFeature2, _geoJsonFeature$bbox;
@@ -8117,6 +8187,9 @@ var OlMapViewLayerConnect = function OlMapViewLayerConnect(layerProps) {
8117
8187
  var mapDimensions = useSelector(function (store) {
8118
8188
  return mapSelectors.getMapDimensions(store, mapId);
8119
8189
  });
8190
+ var mapTimeDimension = useSelector(function (store) {
8191
+ return mapSelectors.getMapDimension(store, mapId, 'time');
8192
+ });
8120
8193
  var dispatch = useDispatch();
8121
8194
  var onInitializeLayer = useCallback(function (initProps) {
8122
8195
  var updatedPayLoad = makeLayerInfoPayload(initProps, mapDimensions || [], mapId);
@@ -8124,17 +8197,26 @@ var OlMapViewLayerConnect = function OlMapViewLayerConnect(layerProps) {
8124
8197
  }, [dispatch, mapDimensions, mapId]);
8125
8198
  var _useGetWMLayerInstanc = useGetWMLayerInstance(layer),
8126
8199
  wmLayer = _useGetWMLayerInstanc.wmLayer;
8200
+ var effectiveLayerType = (wmLayer == null ? void 0 : wmLayer.layerType) || (layer == null ? void 0 : layer.layerType);
8201
+ var renderedDimensions = getRenderedDimensions({
8202
+ layerType: effectiveLayerType,
8203
+ layerDimensions: layer == null ? void 0 : layer.dimensions,
8204
+ mapTimeDimension: mapTimeDimension
8205
+ });
8127
8206
  if (!wmLayer || !layer) {
8128
8207
  return null;
8129
8208
  }
8130
- var isInsideAcceptanceTime = getIsInsideAcceptanceTime(layer.acceptanceTimeInMinutes, mapDimensions, layer.dimensions);
8209
+ // STAC layers query the exact map time, which is reflected in
8210
+ // renderedDimensions even when the layer metadata still points at its latest time.
8211
+ var isInsideAcceptanceTime = getIsInsideAcceptanceTime(layer.acceptanceTimeInMinutes, mapDimensions, renderedDimensions);
8131
8212
  return jsx(OpenLayersLayer, Object.assign({
8132
8213
  id: "layer-" + (layer == null ? void 0 : layer.id),
8133
8214
  zIndex: zIndex
8134
8215
  }, layer, {
8135
8216
  debugMode: debugMode,
8217
+ dimensions: renderedDimensions,
8136
8218
  enabled: !!isInsideAcceptanceTime && layer.enabled,
8137
- layerType: (wmLayer == null ? void 0 : wmLayer.layerType) || layer.layerType,
8219
+ layerType: effectiveLayerType,
8138
8220
  onInitializeLayer: onInitializeLayer
8139
8221
  }), "layer-" + (layer == null ? void 0 : layer.id));
8140
8222
  };
@@ -12055,4 +12137,4 @@ var storyUtils = /*#__PURE__*/Object.freeze({
12055
12137
  useDefaultMapSettings: useDefaultMapSettings
12056
12138
  });
12057
12139
 
12058
- export { CORE_NAMESPACE, _ConfigurableMapConnect as ConfigurableMapConnect, CoreI18nProvider, CoreStoreProvider, CoreThemeProvider, CoreThemeStoreProvider, DemoWrapper, DemoWrapperConnect, HarmonieTempAndPrecipPreset, LanguageSelect, LayerInfoButtonConnect, LayerInfoDialogConnect, _LayerManager as LayerManager, BaseLayerRow as LayerManagerBaseLayerRow, LayerManagerConnect, DescriptionRow as LayerManagerDescriptionRow, HeaderOptions as LayerManagerHeaderOptions, LayerContainerRow as LayerManagerLayerContainerRow, LayerManagerMapButtonConnect, LegendConnect, LegendMapButtonConnect, LoadingIndicatorProgressBar, LocationSearch, LocationSearchConnect, MultiDimensionSelectMapButtonsConnect, MultiMapMultiDimensionSelectConnect as MultiMapDimensionSelectConnect, MultiMapViewConnect, MyMapLocation, OlMapViewConnect, RouterWrapperConnect, SearchControlButtonConnect, SelectedFeaturesDialogConnect, SyncGroupViewerConnect, TimeSliderConnect, componentsLookUp, coreTranslations, defaultBbox, defaultConfigurations, filterMapPresets, filterServices, filterTimeSeriesServices, getCenterOfLinkedFeature, getIsOutdated, getLanguageFromLocalStorage, languageLocalStorageKey, makeLayerInfoPayload, makePrefetchTimeSpan, saveLanguageToLocalStorage, storyUtils, testLayers, useFetchServices, useFitAndHighlightWarningFeature, useGetOpenLayersView, useLocationDetail, useLocationList, usePrefetchTimeSpan, useUpdateTimeSpan, useUpdateTimestep };
12140
+ export { CORE_NAMESPACE, _ConfigurableMapConnect as ConfigurableMapConnect, CoreI18nProvider, CoreStoreProvider, CoreThemeProvider, CoreThemeStoreProvider, DemoWrapper, DemoWrapperConnect, HarmonieTempAndPrecipPreset, LanguageSelect, LayerInfoButtonConnect, LayerInfoDialogConnect, _LayerManager as LayerManager, BaseLayerRow as LayerManagerBaseLayerRow, LayerManagerConnect, DescriptionRow as LayerManagerDescriptionRow, HeaderOptions as LayerManagerHeaderOptions, LayerContainerRow as LayerManagerLayerContainerRow, LayerManagerMapButtonConnect, LegendConnect, LegendMapButtonConnect, LoadingIndicatorProgressBar, LocationSearch, LocationSearchConnect, MultiDimensionSelectMapButtonsConnect, MultiMapMultiDimensionSelectConnect as MultiMapDimensionSelectConnect, MultiMapViewConnect, MyMapLocation, OlMapViewConnect, RouterWrapperConnect, SearchControlButtonConnect, SelectedFeaturesDialogConnect, SyncGroupViewerConnect, TimeSliderConnect, componentsLookUp, coreTranslations, defaultBbox, defaultConfigurations, filterMapPresets, filterServices, filterTimeSeriesServices, getCenterOfLinkedFeature, getIsOutdated, getLanguageFromLocalStorage, getRenderedDimensions, languageLocalStorageKey, makeLayerInfoPayload, makePrefetchTimeSpan, saveLanguageToLocalStorage, storyUtils, testLayers, useFetchServices, useFitAndHighlightWarningFeature, useGetOpenLayersView, useLocationDetail, useLocationList, usePrefetchTimeSpan, useUpdateTimeSpan, useUpdateTimestep };
@@ -27,6 +27,15 @@ export interface InitialTimeSeriesProps {
27
27
  services: TimeSeriesService[];
28
28
  hideLocationMarkers?: boolean;
29
29
  syncGroupsIds: string[];
30
+ locationMenuSize?: {
31
+ width: number;
32
+ height: number;
33
+ };
34
+ locationMenuPosition?: {
35
+ x: number;
36
+ y: number;
37
+ };
38
+ isLocationsDialogOpen?: boolean;
30
39
  }
31
40
  export interface InitialSoundingsProps {
32
41
  selectedSources: Record<string, SourceSelection>;
@@ -1,4 +1,5 @@
1
1
  import React from 'react';
2
+ import type { STACGeoTIFFLayerOptions } from '@opengeoweb/webmap';
2
3
  interface LayerManagerMenuButtonProps {
3
4
  mapId: string;
4
5
  layerId?: string;
@@ -14,6 +15,9 @@ interface LayerManagerMenuButtonProps {
14
15
  canZoomToLayerExtent?: boolean;
15
16
  tooltipTitle?: string;
16
17
  icon?: React.ReactNode;
18
+ stacDataLayout?: STACGeoTIFFLayerOptions['dataLayout'];
19
+ isTiledStacCollection?: boolean;
20
+ onChangeStacDataLayout?: (dataLayout: NonNullable<STACGeoTIFFLayerOptions['dataLayout']>) => void;
17
21
  }
18
22
  declare const LayerManagerMenuButton: React.FC<LayerManagerMenuButtonProps>;
19
23
  export default LayerManagerMenuButton;
@@ -1,10 +1,17 @@
1
1
  import type { Feature, View } from 'ol';
2
2
  import type { TimeSliderStartEndStep } from '@opengeoweb/store';
3
3
  import type { Dimension, RefTimeDimensionModes } from '@opengeoweb/webmap';
4
+ import { LayerType } from '@opengeoweb/webmap';
4
5
  import type { MapLocation, OnInitializeLayerProps, TimeContextType, UpdateLayerInfoPayload } from '@opengeoweb/webmap-react';
5
6
  export declare const makePrefetchTimeSpan: (timeSliderStartCenterEndTime: TimeSliderStartEndStep, isAnimating: boolean, prefetchList: number[]) => TimeContextType;
6
7
  export declare const usePrefetchTimeSpan: (timeSliderStartCenterEndTime: TimeSliderStartEndStep, isAnimating: boolean, animationList: number[], refTimeDimensionModes?: RefTimeDimensionModes) => TimeContextType;
7
8
  export declare const makeLayerInfoPayload: (payload: OnInitializeLayerProps, mapDimensions: Dimension[], mapId: string) => UpdateLayerInfoPayload;
9
+ interface GetRenderedDimensionsProps {
10
+ layerType?: LayerType;
11
+ layerDimensions?: Dimension[];
12
+ mapTimeDimension?: Dimension;
13
+ }
14
+ export declare const getRenderedDimensions: ({ layerType, layerDimensions, mapTimeDimension, }: GetRenderedDimensionsProps) => Dimension[] | undefined;
8
15
  export declare const getCenterOfLinkedFeature: (feature: Feature | undefined, srs: string) => MapLocation | null;
9
16
  interface UseFitAndHighlightWarningFeatureOptions {
10
17
  view: View | undefined;
package/package.json CHANGED
@@ -1,64 +1,64 @@
1
1
  {
2
- "name": "@opengeoweb/core",
3
- "version": "19.4.0",
4
- "description": "GeoWeb Core library for the opengeoweb project",
5
- "license": "Apache-2.0",
6
- "repository": {
7
- "type": "git",
8
- "url": "git@gitlab.com:opengeoweb/opengeoweb.git"
9
- },
10
- "main": "./dist/index.esm.js",
11
- "module": "./dist/index.esm.js",
12
- "types": "./dist/index.d.ts",
13
- "exports": {
14
- "./package.json": "./package.json",
15
- ".": {
16
- "@opengeoweb/source": "./src/index.ts",
17
- "types": "./dist/index.d.ts",
18
- "import": "./dist/index.esm.js",
19
- "default": "./dist/index.esm.js"
20
- }
21
- },
22
- "dependencies": {
23
- "@opengeoweb/shared": "*",
24
- "react-redux": "^9.2.0",
25
- "@opengeoweb/store": "*",
26
- "@opengeoweb/time-slider": "*",
27
- "@reduxjs/toolkit": "^2.6.1",
28
- "@opengeoweb/webmap-react": "*",
29
- "@opengeoweb/webmap": "*",
30
- "@opengeoweb/theme": "*",
31
- "@opengeoweb/layer-select": "*",
32
- "lodash": "^4.18.1",
33
- "ol": "^10.4.0",
34
- "react-sortablejs": "^6.1.4",
35
- "sortablejs": "^1.15.1",
36
- "@mui/system": "^9.0.1",
37
- "@opengeoweb/snackbar": "*",
38
- "react-draggable": "^4.4.6",
39
- "i18next": "^25.0.1",
40
- "react-i18next": "^15.1.1",
41
- "dompurify": "^3.4.0",
42
- "@mui/material": "^9.0.1",
43
- "@tanstack/react-query": "^5.85.5",
44
- "@opengeoweb/api": "*",
45
- "@types/geojson": "^7946.0.14",
46
- "@turf/turf": "^7.2.0",
47
- "proj4": "^2.15.0",
48
- "react-router": "^7.15.1"
49
- },
50
- "peerDependencies": {
51
- "react": "19",
52
- "@emotion/react": "*",
53
- "@emotion/styled": "*"
54
- },
55
- "devDependencies": {
56
- "eslint-plugin-storybook": "10.3.3"
57
- },
58
- "files": [
59
- "dist",
60
- "!dist/package.json",
61
- "README.md",
62
- "package.json"
63
- ]
64
- }
2
+ "name": "@opengeoweb/core",
3
+ "version": "19.5.1-nightly-20260831",
4
+ "description": "GeoWeb Core library for the opengeoweb project",
5
+ "license": "Apache-2.0",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git@gitlab.com:opengeoweb/opengeoweb.git"
9
+ },
10
+ "main": "./dist/index.esm.js",
11
+ "module": "./dist/index.esm.js",
12
+ "types": "./dist/index.d.ts",
13
+ "exports": {
14
+ "./package.json": "./package.json",
15
+ ".": {
16
+ "@opengeoweb/source": "./src/index.ts",
17
+ "types": "./dist/index.d.ts",
18
+ "import": "./dist/index.esm.js",
19
+ "default": "./dist/index.esm.js"
20
+ }
21
+ },
22
+ "dependencies": {
23
+ "@opengeoweb/shared": "19.5.1-nightly-20260831",
24
+ "react-redux": "^9.2.0",
25
+ "@opengeoweb/store": "19.5.1-nightly-20260831",
26
+ "@opengeoweb/time-slider": "19.5.1-nightly-20260831",
27
+ "@reduxjs/toolkit": "^2.6.1",
28
+ "@opengeoweb/webmap-react": "19.5.1-nightly-20260831",
29
+ "@opengeoweb/webmap": "19.5.1-nightly-20260831",
30
+ "@opengeoweb/theme": "19.5.1-nightly-20260831",
31
+ "@opengeoweb/layer-select": "19.5.1-nightly-20260831",
32
+ "lodash": "^4.18.1",
33
+ "ol": "^10.4.0",
34
+ "react-sortablejs": "^6.1.4",
35
+ "sortablejs": "^1.15.1",
36
+ "@mui/system": "^9.0.1",
37
+ "@opengeoweb/snackbar": "19.5.1-nightly-20260831",
38
+ "react-draggable": "^4.4.6",
39
+ "i18next": "^25.0.1",
40
+ "react-i18next": "^15.1.1",
41
+ "dompurify": "^3.4.0",
42
+ "@mui/material": "^9.0.1",
43
+ "@tanstack/react-query": "^5.85.5",
44
+ "@opengeoweb/api": "19.5.1-nightly-20260831",
45
+ "@types/geojson": "^7946.0.14",
46
+ "@turf/turf": "^7.2.0",
47
+ "proj4": "^2.15.0",
48
+ "react-router": "^7.15.1"
49
+ },
50
+ "peerDependencies": {
51
+ "react": "19",
52
+ "@emotion/react": "*",
53
+ "@emotion/styled": "*"
54
+ },
55
+ "devDependencies": {
56
+ "eslint-plugin-storybook": "10.3.3"
57
+ },
58
+ "files": [
59
+ "dist",
60
+ "!dist/package.json",
61
+ "README.md",
62
+ "package.json"
63
+ ]
64
+ }