@opengeoweb/soundings 19.6.1 → 20.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.esm.js CHANGED
@@ -1,16 +1,17 @@
1
1
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
2
  import { Stack, Box, Tooltip, Typography, styled, Card, IconButton, Menu, ListSubheader, MenuItem, LinearProgress, List as List$1, ListItem, ListItemIcon, Checkbox, ListItemText, Grid, ListItemButton, Switch, ToggleButtonGroup, ToggleButton } from '@mui/material';
3
3
  import { range, isEqual } from 'lodash';
4
- import React, { useMemo, useRef, useEffect, useId, useState, Fragment as Fragment$1, useCallback } from 'react';
4
+ import React, { useMemo, useRef, useEffect, useId, useCallback, useState, Fragment as Fragment$1 } from 'react';
5
5
  import { useDispatch, useSelector, shallowEqual } from 'react-redux';
6
- import { dateUtils, referenceTimeUtils, safelyInitI18nForTestsAndStories, sharedTranslations, SHARED_NAMESPACE, SwitchButton, CustomToggleButton, LegendToggleButton, CustomSlider, AlertBanner, ToolContainerDraggable, TooltipSelect, AlertIcon, useResizeObserver, SearchField, CustomAccordion } from '@opengeoweb/shared';
7
- import { selectorMemoizationOptions, uiSelectors, uiTypes, uiActions, genericActions, useSyncgroupTimeState, useRegisterFeatureSyncSource, genericSelectors, mapSelectors, mapActions, useUpdateFeatureSyncLayers, layerActions, useSetupDialog, storeReducerMap, storeMiddlewares } from '@opengeoweb/store';
6
+ import { dateUtils, referenceTimeUtils, safelyInitI18nForTestsAndStories, sharedTranslations, SHARED_NAMESPACE, SwitchButton, CustomToggleButton, LegendToggleButton, useScrollingInIsolation, CustomSlider, AlertBanner, ToolContainerDraggable, TooltipSelect, AlertIcon, useResizeObserver, SearchField, CustomAccordion } from '@opengeoweb/shared';
7
+ import { selectorMemoizationOptions, uiSelectors, uiTypes, uiActions, syncGroupsSelectors, genericActions, useSyncgroupTimeState, useRegisterFeatureSyncSource, genericSelectors, mapSelectors, mapActions, useUpdateFeatureSyncLayers, layerActions, useSetupDialog, storeReducerMap, storeMiddlewares } from '@opengeoweb/store';
8
8
  import { Layers, Sources, Location, Equalizer, ArrowDropDownDown, DragHandle, Close, Visibility, VisibilityOff } from '@opengeoweb/theme';
9
9
  import { ParseISOTimeRangeDuration, parseISO8601IntervalToDateInterval, handleDateUtilsISOString, webmapUtils } from '@opengeoweb/webmap';
10
10
  import { MapFeatureClass } from '@opengeoweb/webmap-react';
11
11
  import * as d3 from 'd3';
12
12
  import { queryOptions, useQueryClient, useQueries } from '@tanstack/react-query';
13
13
  import { withJsonFormat, getHeaders, handleResponse } from '@opengeoweb/api';
14
+ import { authFetch } from '@opengeoweb/authentication';
14
15
  import { createSlice, createSelector, combineReducers, configureStore } from '@reduxjs/toolkit';
15
16
  import i18n from 'i18next';
16
17
  export { default as i18n } from 'i18next';
@@ -31,7 +32,6 @@ var en = {
31
32
  "diagram-SKEWT": "Skew-T",
32
33
  "diagram-BIJVOET": "Bijvoet",
33
34
  "diagram-EMAGRAM": "Emagram",
34
- "coming-soon": "Coming soon",
35
35
  "soundings-time-mismatch-title": "Selected time in the sounding view does not match map view time.",
36
36
  "soundings-toggle-location-markers-label": "Markers",
37
37
  "soundings-toggle-location-markers-tooltip": "Show/hide location markers",
@@ -51,7 +51,6 @@ var no = {
51
51
  "diagram-SKEWT": "Skew-T",
52
52
  "diagram-BIJVOET": "Bijvoet",
53
53
  "diagram-EMAGRAM": "Emagram",
54
- "coming-soon": "Kommer snart",
55
54
  "soundings-time-mismatch-title": "Selected time in the sounding view does not match map view time.",
56
55
  "soundings-toggle-location-markers-label": "Lokasjoner",
57
56
  "soundings-toggle-location-markers-tooltip": "Vis/skjul lokasjoner",
@@ -71,14 +70,13 @@ var nl = {
71
70
  "diagram-SKEWT": "Skew-T",
72
71
  "diagram-BIJVOET": "Bijvoet",
73
72
  "diagram-EMAGRAM": "Emagram",
74
- "coming-soon": "Binnenkort beschikbaar",
75
- "soundings-time-mismatch-title": "Selected time in the sounding view does not match map view time.",
73
+ "soundings-time-mismatch-title": "Geselecteerde tijd in de sounding view komt niet overeen met de tijd in de kaart.",
76
74
  "soundings-toggle-location-markers-label": "Kaart locaties",
77
75
  "soundings-toggle-location-markers-tooltip": "Toon/Verberg locatie punten",
78
76
  "soundings-legend": "Legenda",
79
77
  "soundings-legend-tooltip-show": "Toon legenda",
80
78
  "soundings-legend-tooltip-hide": "Verberg legenda",
81
- "no-sounding-data-available": "No sounding data available"
79
+ "no-sounding-data-available": "Geen sounding data beschikbaar"
82
80
  };
83
81
  var fi = {
84
82
  sources: "Lähteet",
@@ -91,7 +89,6 @@ var fi = {
91
89
  "diagram-SKEWT": "Skew-T",
92
90
  "diagram-BIJVOET": "Bijvoet",
93
91
  "diagram-EMAGRAM": "Emagram",
94
- "coming-soon": "Tulossa pian",
95
92
  "soundings-time-mismatch-title": "Valittu aika luotausnäytöllä ei vastaa karttanäytön aikaa",
96
93
  "soundings-toggle-location-markers-label": "Kohdemerkit",
97
94
  "soundings-toggle-location-markers-tooltip": "Näytä/piilota kohdemerkit",
@@ -1054,7 +1051,7 @@ var getCollectionLocations = /*#__PURE__*/function () {
1054
1051
  return _regenerator().w(function (_context) {
1055
1052
  while (1) switch (_context.n) {
1056
1053
  case 0:
1057
- return _context.a(2, fetch(withJsonFormat(baseUrl + "/collections/" + collectionId + "/locations"), {
1054
+ return _context.a(2, authFetch(withJsonFormat(baseUrl + "/collections/" + collectionId + "/locations"), {
1058
1055
  headers: getHeaders()
1059
1056
  }).then(handleResponse));
1060
1057
  }
@@ -1084,7 +1081,7 @@ var getCollectionInstances = /*#__PURE__*/function () {
1084
1081
  return _regenerator().w(function (_context3) {
1085
1082
  while (1) switch (_context3.n) {
1086
1083
  case 0:
1087
- return _context3.a(2, fetch(withJsonFormat(baseUrl + "/collections/" + collectionId + "/instances"), {
1084
+ return _context3.a(2, authFetch(withJsonFormat(baseUrl + "/collections/" + collectionId + "/instances"), {
1088
1085
  headers: getHeaders()
1089
1086
  }).then(handleResponse));
1090
1087
  }
@@ -1099,7 +1096,7 @@ var getCollectionDetails = /*#__PURE__*/function () {
1099
1096
  return _regenerator().w(function (_context4) {
1100
1097
  while (1) switch (_context4.n) {
1101
1098
  case 0:
1102
- return _context4.a(2, fetch(withJsonFormat(baseUrl + "/collections/" + collectionId), {
1099
+ return _context4.a(2, authFetch(withJsonFormat(baseUrl + "/collections/" + collectionId), {
1103
1100
  headers: getHeaders()
1104
1101
  }).then(handleResponse));
1105
1102
  }
@@ -1114,7 +1111,7 @@ var getInstanceDetails = /*#__PURE__*/function () {
1114
1111
  return _regenerator().w(function (_context5) {
1115
1112
  while (1) switch (_context5.n) {
1116
1113
  case 0:
1117
- return _context5.a(2, fetch(withJsonFormat(baseUrl + "/collections/" + collectionId + "/instances/" + instanceId), {
1114
+ return _context5.a(2, authFetch(withJsonFormat(baseUrl + "/collections/" + collectionId + "/instances/" + instanceId), {
1118
1115
  headers: getHeaders()
1119
1116
  }).then(handleResponse));
1120
1117
  }
@@ -1135,7 +1132,7 @@ var getEdrCollectionForLocation = /*#__PURE__*/function () {
1135
1132
  url.searchParams.append('datetime', datetime);
1136
1133
  url.searchParams.append('z', verticalRange);
1137
1134
  url.searchParams.append('f', 'CoverageJSON');
1138
- return _context6.a(2, fetch(url.toString(), {
1135
+ return _context6.a(2, authFetch(url.toString(), {
1139
1136
  headers: getHeaders()
1140
1137
  }).then(handleResponse));
1141
1138
  }
@@ -1159,7 +1156,7 @@ var getEdrCollectionForPosition = /*#__PURE__*/function () {
1159
1156
  url.searchParams.append('z', verticalRange);
1160
1157
  }
1161
1158
  url.searchParams.append('f', 'CoverageJSON');
1162
- return _context7.a(2, fetch(url.toString(), {
1159
+ return _context7.a(2, authFetch(url.toString(), {
1163
1160
  headers: getHeaders()
1164
1161
  }).then(handleResponse));
1165
1162
  }
@@ -1191,7 +1188,7 @@ var getEdrCollectionForRadius = /*#__PURE__*/function () {
1191
1188
  url.searchParams.append('z', verticalRange);
1192
1189
  }
1193
1190
  url.searchParams.append('f', 'CoverageJSON');
1194
- return _context8.a(2, fetch(url.toString(), {
1191
+ return _context8.a(2, authFetch(url.toString(), {
1195
1192
  headers: getHeaders()
1196
1193
  }).then(handleResponse));
1197
1194
  }
@@ -1524,7 +1521,7 @@ var getVerticalRangeFromInstance = function getVerticalRangeFromInstance(instanc
1524
1521
  return '';
1525
1522
  }
1526
1523
  if (typeof interval[0] === 'string') {
1527
- return interval.toSorted(function (dimA, dimB) {
1524
+ return interval.slice().sort(function (dimA, dimB) {
1528
1525
  return dimA.localeCompare(dimB, undefined, {
1529
1526
  numeric: true
1530
1527
  });
@@ -1532,7 +1529,7 @@ var getVerticalRangeFromInstance = function getVerticalRangeFromInstance(instanc
1532
1529
  }
1533
1530
  var firstEl = interval[0][0];
1534
1531
  var lastEl = interval[interval.length - 1][1];
1535
- return [firstEl, lastEl].toSorted(function (dimA, dimB) {
1532
+ return [firstEl, lastEl].sort(function (dimA, dimB) {
1536
1533
  return dimA.localeCompare(dimB, undefined, {
1537
1534
  numeric: true
1538
1535
  });
@@ -1563,7 +1560,7 @@ function extractGridPointsFromCoverage(response) {
1563
1560
  }
1564
1561
 
1565
1562
  var sortSoundingFeatures = function sortSoundingFeatures(data) {
1566
- return data.sort(function (featureA, featureB) {
1563
+ return [].concat(data).sort(function (featureA, featureB) {
1567
1564
  // Sort by date (ascending)
1568
1565
  if (featureA.properties.time !== featureB.properties.time) {
1569
1566
  return featureA.properties.time > featureB.properties.time ? 1 : -1;
@@ -1702,6 +1699,7 @@ var useMultipleSources = function useMultipleSources(sources, locations, datetim
1702
1699
  }
1703
1700
  }
1704
1701
  return Object.assign({}, constructQueryParams(collectionId, url, instanceId, location, intervalDatetime, resolvedParamMappings, resolvedWindUnit, resolvedVerticalRange), {
1702
+ placeholderData: [],
1705
1703
  select: function select(allFeatures) {
1706
1704
  if (!timeToShow || allFeatures.length === 0) {
1707
1705
  return [];
@@ -1724,7 +1722,9 @@ var useMultipleSources = function useMultipleSources(sources, locations, datetim
1724
1722
  dateToUse = exactMatch || '';
1725
1723
  }
1726
1724
  }
1727
- return constructQueryParams(collectionId, url, instanceId, location, dateToUse, resolvedParamMappings, resolvedWindUnit, resolvedVerticalRange);
1725
+ return Object.assign({}, constructQueryParams(collectionId, url, instanceId, location, dateToUse, resolvedParamMappings, resolvedWindUnit, resolvedVerticalRange), {
1726
+ placeholderData: []
1727
+ });
1728
1728
  });
1729
1729
  }, [datetime, locations, sources, timesteps]);
1730
1730
  return useQueries({
@@ -1734,12 +1734,12 @@ var useMultipleSources = function useMultipleSources(sources, locations, datetim
1734
1734
  var data = queryResults.map(function (result) {
1735
1735
  return result.data || [];
1736
1736
  });
1737
- var isPending = timestepsPending || queryResults.some(function (result) {
1738
- return result.isPending;
1739
- });
1740
1737
  var error = timestepsError || ((_queryResults$find = queryResults.find(function (result) {
1741
1738
  return result == null ? void 0 : result.error;
1742
1739
  })) == null ? void 0 : _queryResults$find.error);
1740
+ var isPending = !error && (timestepsPending || queryResults.some(function (result) {
1741
+ return result.isPending || result.isPlaceholderData && result.isFetching;
1742
+ }));
1743
1743
  return {
1744
1744
  data: data,
1745
1745
  isPending: isPending,
@@ -3957,7 +3957,7 @@ var filterDomainRangeForHodograph = function filterDomainRangeForHodograph(press
3957
3957
  });
3958
3958
  // If first pressure value is smallest, reverse arrays to ensure we draw starting from surface
3959
3959
  if (filteredPressureDomain[0] < filteredPressureDomain[filteredPressureDomain.length - 1]) {
3960
- return [filteredPressureDomain.reverse(), filteredParameterDomain.reverse()];
3960
+ return [filteredPressureDomain.slice().reverse(), filteredParameterDomain.slice().reverse()];
3961
3961
  }
3962
3962
  return [filteredPressureDomain, filteredParameterDomain];
3963
3963
  };
@@ -4059,7 +4059,8 @@ var plotHodograph = function plotHodograph(_ref3) {
4059
4059
  };
4060
4060
 
4061
4061
  var Hodograph = function Hodograph(_ref) {
4062
- var data = _ref.data;
4062
+ var data = _ref.data,
4063
+ isMouseWheelZoomEnabled = _ref.isMouseWheelZoomEnabled;
4063
4064
  var svgRef = useRef(null);
4064
4065
  var widthHeight = 400;
4065
4066
  useEffect(function () {
@@ -4105,13 +4106,15 @@ var Hodograph = function Hodograph(_ref) {
4105
4106
  var zoomBehavior = d3.zoom().scaleExtent([1, 7]).translateExtent([[0, 0], [widthHeight, widthHeight]]).on('zoom', function (event) {
4106
4107
  svg.select('g.hodograph').attr('transform', event.transform);
4107
4108
  });
4108
- svg.call(zoomBehavior);
4109
+ if (isMouseWheelZoomEnabled) {
4110
+ svg.call(zoomBehavior);
4111
+ }
4109
4112
  // eslint-disable-next-line consistent-return
4110
4113
  return function () {
4111
- svg.on('zoom', null);
4114
+ svg.on('.zoom', null);
4112
4115
  svg.select('g.hodograph').selectAll('*').remove();
4113
4116
  };
4114
- }, [data, widthHeight]);
4117
+ }, [data, isMouseWheelZoomEnabled, widthHeight]);
4115
4118
  return jsx("svg", {
4116
4119
  height: "100%",
4117
4120
  ref: svgRef,
@@ -4153,13 +4156,15 @@ var HodographLegend = function HodographLegend() {
4153
4156
  };
4154
4157
 
4155
4158
  var HodographCollection = function HodographCollection(_ref) {
4156
- var data = _ref.data;
4159
+ var data = _ref.data,
4160
+ isMouseWheelZoomEnabled = _ref.isMouseWheelZoomEnabled;
4157
4161
  return jsxs(Box, {
4158
4162
  sx: {
4159
4163
  padding: '5px'
4160
4164
  },
4161
4165
  children: [jsx(Hodograph, {
4162
- data: data
4166
+ data: data,
4167
+ isMouseWheelZoomEnabled: isMouseWheelZoomEnabled
4163
4168
  }), jsx(HodographLegend, {})]
4164
4169
  });
4165
4170
  };
@@ -5314,7 +5319,8 @@ var Soundings = function Soundings(_ref) {
5314
5319
  _ref$showTooltip = _ref.showTooltip,
5315
5320
  showTooltip = _ref$showTooltip === void 0 ? true : _ref$showTooltip,
5316
5321
  _ref$diagramType = _ref.diagramType,
5317
- diagramType = _ref$diagramType === void 0 ? 'SKEWT' : _ref$diagramType;
5322
+ diagramType = _ref$diagramType === void 0 ? 'SKEWT' : _ref$diagramType,
5323
+ isMouseWheelZoomEnabled = _ref.isMouseWheelZoomEnabled;
5318
5324
  var instanceId = useId().replace(/:/g, '_');
5319
5325
  var scopedGraphId = d3GraphId + "-" + instanceId;
5320
5326
  var svgRef = useRef(null);
@@ -5496,7 +5502,9 @@ var Soundings = function Soundings(_ref) {
5496
5502
  }
5497
5503
  });
5498
5504
  zoomBehaviorRef.current = zoomBehavior;
5499
- svg.call(zoomBehavior);
5505
+ if (isMouseWheelZoomEnabled) {
5506
+ svg.call(zoomBehavior);
5507
+ }
5500
5508
  var previousTransform = updateTransformToViewport(persistedZoomTransformRef.current, width, height);
5501
5509
  var hasPersistedTransform = previousTransform.k > 1 || Math.abs(previousTransform.x) > 1e-3 || Math.abs(previousTransform.y) > 1e-3;
5502
5510
  // Re-apply the previous transform after rebuilding the SVG so resize
@@ -5524,7 +5532,7 @@ var Soundings = function Soundings(_ref) {
5524
5532
  zoomTargetRef.current = null;
5525
5533
  root.selectAll('*').remove();
5526
5534
  };
5527
- }, [data, diagramType, width, height, scopedGraphId, margin, publishVerticalZoom, resetVerticalZoom]);
5535
+ }, [data, diagramType, width, height, scopedGraphId, margin, publishVerticalZoom, resetVerticalZoom, isMouseWheelZoomEnabled]);
5528
5536
  useEffect(function () {
5529
5537
  var _svgRectRef$current;
5530
5538
  if (!showTooltip || !svgRef.current) {
@@ -5634,7 +5642,9 @@ var shouldHideLabel = function shouldHideLabel(nItems, index, maxLabelCount) {
5634
5642
  var SoundingsTimeSlider = function SoundingsTimeSlider(_ref) {
5635
5643
  var timesteps = _ref.timesteps,
5636
5644
  selectedTime = _ref.selectedTime,
5637
- updateSelectedTime = _ref.updateSelectedTime;
5645
+ updateSelectedTime = _ref.updateSelectedTime,
5646
+ isTimeScrollingEnabled = _ref.isTimeScrollingEnabled,
5647
+ soundingsWindowRef = _ref.soundingsWindowRef;
5638
5648
  var sliderRef = React.useRef(null);
5639
5649
  var maxLabelCount = useMaxLabelCount(sliderRef);
5640
5650
  var _useSoundingsTranslat = useSoundingsTranslation(),
@@ -5696,72 +5706,105 @@ var SoundingsTimeSlider = function SoundingsTimeSlider(_ref) {
5696
5706
  var followingIndex = Math.min(currentTimeIndex + 1, timesteps.length - 1);
5697
5707
  updateSelectedTime(timesteps[followingIndex]);
5698
5708
  }, [currentTimeIndex, updateSelectedTime, timesteps]);
5699
- return jsxs("div", {
5700
- ref: sliderRef,
5701
- style: {
5702
- display: 'flex',
5703
- paddingTop: '32px',
5704
- marginRight: '80px',
5705
- marginLeft: '24px',
5706
- height: TIMESLIDER_HEIGHT + "px"
5707
- },
5708
- children: [jsxs("div", {
5709
+ var onWheel = useCallback(function (event) {
5710
+ if (event.ctrlKey || event.metaKey || event.shiftKey || event.altKey || event.deltaY === 0) {
5711
+ return;
5712
+ }
5713
+ // Kind of "one frame debouncer", meant to dampen too fast slider movement
5714
+ requestAnimationFrame(function () {
5715
+ if (event.deltaY > 0) {
5716
+ onStepBackward();
5717
+ } else {
5718
+ onStepForward();
5719
+ }
5720
+ });
5721
+ }, [onStepBackward, onStepForward]);
5722
+ var scrollRef = useScrollingInIsolation({
5723
+ onWheel: onWheel
5724
+ });
5725
+ React.useEffect(function () {
5726
+ if (!isTimeScrollingEnabled || !(soundingsWindowRef != null && soundingsWindowRef.current)) {
5727
+ return undefined;
5728
+ }
5729
+ var handleWheel = function handleWheel(event) {
5730
+ event.preventDefault();
5731
+ onWheel(event);
5732
+ };
5733
+ var element = soundingsWindowRef.current;
5734
+ element.addEventListener('wheel', handleWheel);
5735
+ return function () {
5736
+ element.removeEventListener('wheel', handleWheel);
5737
+ };
5738
+ }, [isTimeScrollingEnabled, soundingsWindowRef, onWheel]);
5739
+ return jsx("div", {
5740
+ ref: scrollRef,
5741
+ children: jsxs("div", {
5742
+ ref: sliderRef,
5709
5743
  style: {
5710
- minWidth: '60px',
5711
- marginTop: '2px',
5712
5744
  display: 'flex',
5713
- gap: '4px'
5745
+ paddingTop: '32px',
5746
+ marginRight: '80px',
5747
+ marginLeft: '24px',
5748
+ height: TIMESLIDER_HEIGHT + "px"
5714
5749
  },
5715
- children: [jsx(BackwardForwardStepButton, {
5716
- isDisabled: marks.length === 0,
5717
- isForwardStep: false,
5718
- onClickBFButton: onStepBackward
5719
- }), jsx(BackwardForwardStepButton, {
5720
- isDisabled: marks.length === 0,
5721
- isForwardStep: true,
5722
- onClickBFButton: onStepForward
5723
- })]
5724
- }), marks.length === 0 ? jsx(CustomSlider, {
5725
- disabled: true,
5726
- max: 1,
5727
- min: 0,
5728
- orientation: "horizontal",
5729
- value: 0.5
5730
- }) : jsx(CustomSlider, {
5731
- extraStyles: {
5732
- margin: '0px 20px 0px 20px',
5733
- '.MuiSlider-markLabel': {
5734
- transform: 'translate(-90%, 20px) rotate(-45deg)',
5735
- transformOrigin: 'top center'
5736
- }
5737
- },
5738
- marks: marks,
5739
- max: marks[marks.length - 1].value,
5740
- min: marks[0].value,
5741
- onChange: function onChange(_, value) {
5742
- updateSelectedTime(dateUtils.fromUnix(value).toISOString());
5743
- },
5744
- orientation: "horizontal",
5745
- slotProps: {
5746
- // Workaround for MUI bug where labels are just draggable area and clicking on one
5747
- // does not necessarily select the described timestep
5748
- markLabel: {
5749
- onPointerDown: function onPointerDown(event) {
5750
- event.preventDefault();
5751
- var markIndex = event.currentTarget.getAttribute('data-index');
5752
- var mark = marks[Number(markIndex)];
5753
- var value = mark.value;
5754
- updateSelectedTime(dateUtils.fromUnix(value).toISOString());
5750
+ children: [jsxs("div", {
5751
+ style: {
5752
+ minWidth: '60px',
5753
+ marginTop: '2px',
5754
+ display: 'flex',
5755
+ gap: '4px'
5756
+ },
5757
+ children: [jsx(BackwardForwardStepButton, {
5758
+ isDisabled: marks.length === 0,
5759
+ isForwardStep: false,
5760
+ onClickBFButton: onStepBackward
5761
+ }), jsx(BackwardForwardStepButton, {
5762
+ isDisabled: marks.length === 0,
5763
+ isForwardStep: true,
5764
+ onClickBFButton: onStepForward
5765
+ })]
5766
+ }), marks.length === 0 ? jsx(CustomSlider, {
5767
+ disabled: true,
5768
+ max: 1,
5769
+ min: 0,
5770
+ orientation: "horizontal",
5771
+ value: 0.5
5772
+ }) : jsx(CustomSlider, {
5773
+ extraStyles: {
5774
+ margin: '0px 20px 0px 20px',
5775
+ '.MuiSlider-markLabel': {
5776
+ transform: 'translate(-90%, 20px) rotate(-45deg)',
5777
+ transformOrigin: 'top center'
5755
5778
  }
5779
+ },
5780
+ marks: marks,
5781
+ max: marks[marks.length - 1].value,
5782
+ min: marks[0].value,
5783
+ onChange: function onChange(_, value) {
5784
+ updateSelectedTime(dateUtils.fromUnix(value).toISOString());
5785
+ },
5786
+ orientation: "horizontal",
5787
+ slotProps: {
5788
+ // Workaround for MUI bug where labels are just draggable area and clicking on one
5789
+ // does not necessarily select the described timestep
5790
+ markLabel: {
5791
+ onPointerDown: function onPointerDown(event) {
5792
+ event.preventDefault();
5793
+ var markIndex = event.currentTarget.getAttribute('data-index');
5794
+ var mark = marks[Number(markIndex)];
5795
+ var value = mark.value;
5796
+ updateSelectedTime(dateUtils.fromUnix(value).toISOString());
5797
+ }
5798
+ }
5799
+ },
5800
+ step: null,
5801
+ value: dateUtils.unix(dateUtils.getUtcFromString(selectedTime)),
5802
+ valueLabelDisplay: "on",
5803
+ valueLabelFormat: function valueLabelFormat(value) {
5804
+ return dateUtils.dateToString(dateUtils.fromUnix(value), "yyyy iii dd MMM HH:mm 'UTC'", true, i18n.language);
5756
5805
  }
5757
- },
5758
- step: null,
5759
- value: dateUtils.unix(dateUtils.getUtcFromString(selectedTime)),
5760
- valueLabelDisplay: "on",
5761
- valueLabelFormat: function valueLabelFormat(value) {
5762
- return dateUtils.dateToString(dateUtils.fromUnix(value), "yyyy iii dd MMM HH:mm 'UTC'", true, i18n.language);
5763
- }
5764
- })]
5806
+ })]
5807
+ })
5765
5808
  });
5766
5809
  };
5767
5810
 
@@ -6296,7 +6339,8 @@ var SoundingsPanels = function SoundingsPanels(_ref) {
6296
6339
  setChosenDiagramType = _ref.setChosenDiagramType,
6297
6340
  onOrderChange = _ref.onOrderChange,
6298
6341
  panelComponent = _ref.panelComponent,
6299
- profileDataPreferences = _ref.profileDataPreferences;
6342
+ profileDataPreferences = _ref.profileDataPreferences,
6343
+ isMouseWheelZoomEnabled = _ref.isMouseWheelZoomEnabled;
6300
6344
  var soundingsContentRef = React.useRef(null);
6301
6345
  var windBarbsContentRef = React.useRef(null);
6302
6346
  var diagramSize = useSoundingsDiagramSize(soundingsContentRef);
@@ -6370,6 +6414,7 @@ var SoundingsPanels = function SoundingsPanels(_ref) {
6370
6414
  d3GraphId: normalizedId,
6371
6415
  data: data,
6372
6416
  diagramType: chosenDiagramType,
6417
+ isMouseWheelZoomEnabled: isMouseWheelZoomEnabled,
6373
6418
  svgDimensions: {
6374
6419
  width: diagramSize,
6375
6420
  height: diagramSize,
@@ -6417,7 +6462,8 @@ var SoundingsPanels = function SoundingsPanels(_ref) {
6417
6462
  maxWidth: 500,
6418
6463
  render: function render() {
6419
6464
  return jsx(HodographCollection, {
6420
- data: data
6465
+ data: data,
6466
+ isMouseWheelZoomEnabled: isMouseWheelZoomEnabled
6421
6467
  });
6422
6468
  }
6423
6469
  }];
@@ -6451,7 +6497,8 @@ var SoundingsTimeSliderConnect = function SoundingsTimeSliderConnect(_ref) {
6451
6497
  var viewId = _ref.viewId,
6452
6498
  timeInUse = _ref.timeInUse,
6453
6499
  _ref$syncEnabled = _ref.syncEnabled,
6454
- syncEnabled = _ref$syncEnabled === void 0 ? false : _ref$syncEnabled;
6500
+ syncEnabled = _ref$syncEnabled === void 0 ? false : _ref$syncEnabled,
6501
+ soundingsWindowRef = _ref.soundingsWindowRef;
6455
6502
  var selectedTimeInStore = useSelector(function (state) {
6456
6503
  return getSelectedTime(state, viewId);
6457
6504
  });
@@ -6462,6 +6509,7 @@ var SoundingsTimeSliderConnect = function SoundingsTimeSliderConnect(_ref) {
6462
6509
  var isTimeSliderVisible = useSelector(function (state) {
6463
6510
  return getIsTimeSliderVisible(state, viewId);
6464
6511
  });
6512
+ var isTimeScrollingEnabled = useSelector(syncGroupsSelectors.isTimeScrollingEnabled);
6465
6513
  var dispatch = useDispatch();
6466
6514
  var toggleTimeSliderVisibility = React.useCallback(function (nextIsVisible) {
6467
6515
  dispatch(soundingsActions.toggleTimeSliderVisibility({
@@ -6503,37 +6551,36 @@ var SoundingsTimeSliderConnect = function SoundingsTimeSliderConnect(_ref) {
6503
6551
  origin: SoundingsActionOrigin.soundingsComponent
6504
6552
  }));
6505
6553
  }, [dispatch, selectedTimeInStore, syncEnabled, validSelectedTime, viewId]);
6506
- if (!isTimeSliderVisible) {
6507
- return jsx(Box, {
6508
- sx: {
6509
- display: 'flex',
6510
- justifyContent: 'flex-end',
6511
- paddingRight: 1,
6512
- paddingBottom: 1
6513
- },
6514
- children: jsx(HideSliderButton, {
6515
- isVisible: false,
6516
- toggleTimeSliderIsVisible: toggleTimeSliderVisibility
6517
- })
6518
- });
6519
- }
6520
6554
  return jsxs(Box, {
6521
6555
  sx: {
6522
6556
  position: 'relative'
6523
6557
  },
6524
- children: [jsx(SoundingsTimeSlider, {
6525
- selectedTime: selectedTime,
6526
- timesteps: mergedTimesteps,
6527
- updateSelectedTime: updateSelectedTime
6528
- }), jsx(Box, {
6558
+ children: [jsx(Box, {
6529
6559
  sx: {
6560
+ visibility: isTimeSliderVisible ? 'visible' : 'hidden',
6561
+ maxHeight: isTimeSliderVisible ? 'inherit' : '0px'
6562
+ },
6563
+ children: jsx(SoundingsTimeSlider, {
6564
+ isTimeScrollingEnabled: isTimeScrollingEnabled,
6565
+ selectedTime: selectedTime,
6566
+ soundingsWindowRef: soundingsWindowRef,
6567
+ timesteps: mergedTimesteps,
6568
+ updateSelectedTime: updateSelectedTime
6569
+ })
6570
+ }), jsx(Box, {
6571
+ sx: isTimeSliderVisible ? {
6530
6572
  position: 'absolute',
6531
6573
  right: 0,
6532
6574
  bottom: 0,
6533
6575
  padding: 1
6576
+ } : {
6577
+ display: 'flex',
6578
+ justifyContent: 'flex-end',
6579
+ paddingRight: 1,
6580
+ paddingBottom: 1
6534
6581
  },
6535
6582
  children: jsx(HideSliderButton, {
6536
- isVisible: true,
6583
+ isVisible: isTimeSliderVisible,
6537
6584
  toggleTimeSliderIsVisible: toggleTimeSliderVisibility
6538
6585
  })
6539
6586
  })]
@@ -6543,6 +6590,7 @@ var SoundingsTimeSliderConnect = function SoundingsTimeSliderConnect(_ref) {
6543
6590
  var SoundingsConnect = function SoundingsConnect(_ref) {
6544
6591
  var viewId = _ref.viewId,
6545
6592
  soundingsPreset = _ref.soundingsPreset;
6593
+ var soundingsRef = useRef(null);
6546
6594
  var _useSoundingsTranslat = useSoundingsTranslation(),
6547
6595
  t = _useSoundingsTranslat.t;
6548
6596
  var geojsonLayerId = React.useRef(webmapUtils.generateLayerId()).current;
@@ -6570,6 +6618,7 @@ var SoundingsConnect = function SoundingsConnect(_ref) {
6570
6618
  var currentSoundingsPreset = useSelector(function (state) {
6571
6619
  return getSoundingsPreset(state, viewId);
6572
6620
  });
6621
+ var isTimeScrollingEnabled = useSelector(syncGroupsSelectors.isTimeScrollingEnabled);
6573
6622
  React.useLayoutEffect(function () {
6574
6623
  dispatch(soundingsActions.registerSoundingsView({
6575
6624
  viewId: viewId
@@ -6882,11 +6931,13 @@ var SoundingsConnect = function SoundingsConnect(_ref) {
6882
6931
  // Compute target location from map pin or selected feature
6883
6932
  var targetLocation = useMemo(function () {
6884
6933
  var newLocation;
6934
+ var hasSelectedMapPinLocation = typeof (selectedMapPin == null ? void 0 : selectedMapPin.lon) === 'number' && typeof selectedMapPin.lat === 'number';
6935
+ var hasSelectedFeatureLocation = typeof (selectedFeature == null ? void 0 : selectedFeature.lon) === 'number' && typeof selectedFeature.lat === 'number';
6885
6936
  // Prioritize selectedMapPin for target location if it has valid coordinates,
6886
6937
  // otherwise fall back to selectedFeature
6887
- if (selectedMapPin != null && selectedMapPin.lon && selectedMapPin.lat) {
6938
+ if (hasSelectedMapPinLocation) {
6888
6939
  newLocation = [selectedMapPin.lon, selectedMapPin.lat];
6889
- } else if (selectedFeature != null && selectedFeature.lon && selectedFeature != null && selectedFeature.lat) {
6940
+ } else if (hasSelectedFeatureLocation) {
6890
6941
  newLocation = [selectedFeature.lon, selectedFeature.lat];
6891
6942
  }
6892
6943
  // Stabilize targetLocation reference
@@ -6907,8 +6958,9 @@ var SoundingsConnect = function SoundingsConnect(_ref) {
6907
6958
  // 1. selectedFeature doesn't have an id (not a named location marker), OR
6908
6959
  // 2. selectedMapPin is a grid point marker (starts with 'grid-point-')
6909
6960
  var isGridPointMarkerClick = typeof (selectedMapPin == null ? void 0 : selectedMapPin.id) === 'string' && selectedMapPin.id.startsWith('grid-point-');
6910
- return !(selectedFeature != null && selectedFeature.id) || isGridPointMarkerClick;
6911
- }, [targetLocation, selectedMapPin == null ? void 0 : selectedMapPin.id, selectedFeature == null ? void 0 : selectedFeature.id]);
6961
+ var isMapPinForSelectedFeature = !!(selectedMapPin != null && selectedMapPin.id) && selectedMapPin.id === (selectedFeature == null ? void 0 : selectedFeature.id) && selectedMapPin.lon === (selectedFeature == null ? void 0 : selectedFeature.lon) && selectedMapPin.lat === (selectedFeature == null ? void 0 : selectedFeature.lat);
6962
+ return !(selectedFeature != null && selectedFeature.id) || isGridPointMarkerClick || !isMapPinForSelectedFeature;
6963
+ }, [targetLocation, selectedMapPin == null ? void 0 : selectedMapPin.id, selectedMapPin == null ? void 0 : selectedMapPin.lon, selectedMapPin == null ? void 0 : selectedMapPin.lat, selectedFeature == null ? void 0 : selectedFeature.id, selectedFeature == null ? void 0 : selectedFeature.lon, selectedFeature == null ? void 0 : selectedFeature.lat]);
6912
6964
  // Fetch grid points within radius for each source when user clicks on free position
6913
6965
  var _useGridPointsFromRad = useGridPointsFromRadius(resolvedSourceSelections, radiusQuerySupportBySource, targetLocation, selectedTimeInUse, isFreePositionClick),
6914
6966
  gridPointData = _useGridPointsFromRad.data;
@@ -7043,6 +7095,7 @@ var SoundingsConnect = function SoundingsConnect(_ref) {
7043
7095
  }
7044
7096
  // Check if this source supports EDR position queries
7045
7097
  var supportsPosition = (_positionQuerySupport = positionQuerySupportBySource[source.collectionId]) != null ? _positionQuerySupport : false;
7098
+ var currentLocation = locationSelectionsRef.current[source.collectionId];
7046
7099
  // Detect if user clicked directly on a location marker owned by this source
7047
7100
  // A direct click means selectedFeature has an id that matches a feature owned by this source
7048
7101
  var isDirectClickOnOwnedMarker = !!(currentSelectedFeature != null && currentSelectedFeature.id) && (nearestOwnedFeature == null ? void 0 : nearestOwnedFeature.id) === (currentSelectedFeature == null ? void 0 : currentSelectedFeature.id);
@@ -7050,7 +7103,9 @@ var SoundingsConnect = function SoundingsConnect(_ref) {
7050
7103
  // so the sounding data comes from an actual model grid point rather than an arbitrary coordinate.
7051
7104
  var supportsRadius = (_radiusQuerySupportBy = radiusQuerySupportBySource[source.collectionId]) != null ? _radiusQuerySupportBy : false;
7052
7105
  var isGridPointMarkerClick = typeof (currentMapPin == null ? void 0 : currentMapPin.id) === 'string' && currentMapPin.id.startsWith('grid-point-');
7053
- var isLocalFreePositionClick = !(currentSelectedFeature != null && currentSelectedFeature.id) || isGridPointMarkerClick;
7106
+ var isMapPinForSelectedFeature = !!(currentMapPin != null && currentMapPin.id) && currentMapPin.id === (currentSelectedFeature == null ? void 0 : currentSelectedFeature.id) && currentMapPin.lon === (currentSelectedFeature == null ? void 0 : currentSelectedFeature.lon) && currentMapPin.lat === (currentSelectedFeature == null ? void 0 : currentSelectedFeature.lat);
7107
+ var isMapPinForCurrentLocation = typeof currentLocation === 'string' && (currentMapPin == null ? void 0 : currentMapPin.id) === currentLocation;
7108
+ var isLocalFreePositionClick = !isMapPinForCurrentLocation && (!(currentSelectedFeature != null && currentSelectedFeature.id) || isGridPointMarkerClick || !isMapPinForSelectedFeature);
7054
7109
  var gridPoint = isLocalFreePositionClick && supportsRadius ? gridPointData == null || (_gridPointData$source = gridPointData[source.collectionId]) == null ? void 0 : _gridPointData$source.gridPoint : undefined;
7055
7110
  var radiusPending = isLocalFreePositionClick && supportsRadius && !(gridPointData != null && gridPointData[source.collectionId]);
7056
7111
  // Determine the location to use:
@@ -7072,10 +7127,12 @@ var SoundingsConnect = function SoundingsConnect(_ref) {
7072
7127
  } else if (nearestOwnedFeature) {
7073
7128
  // Fall back to location query with nearest marker
7074
7129
  newLocation = nearestOwnedFeature.id;
7130
+ } else if (isLocalFreePositionClick) {
7131
+ newLocation = undefined;
7075
7132
  }
7076
- var currentLocation = locationSelectionsRef.current[source.collectionId];
7133
+ var hasInitialLocation = Object.hasOwn(initialLocationsRef.current, source.collectionId);
7077
7134
  var initialLocation = initialLocationsRef.current[source.collectionId];
7078
- if (!isEqual(currentLocation, newLocation) && !isEqual(initialLocation, newLocation)) {
7135
+ if (!isEqual(currentLocation, newLocation) && (!hasInitialLocation || !isEqual(initialLocation, newLocation))) {
7079
7136
  dispatch(soundingsActions.updateSelectedLocation({
7080
7137
  sourceId: source.collectionId,
7081
7138
  location: newLocation,
@@ -7268,6 +7325,7 @@ var SoundingsConnect = function SoundingsConnect(_ref) {
7268
7325
  zIndex: 20
7269
7326
  }
7270
7327
  }), jsxs(Stack, {
7328
+ ref: soundingsRef,
7271
7329
  sx: {
7272
7330
  padding: '12px',
7273
7331
  width: '100%',
@@ -7356,6 +7414,7 @@ var SoundingsConnect = function SoundingsConnect(_ref) {
7356
7414
  children: jsx(SoundingsPanels, {
7357
7415
  chosenDiagramType: diagramType,
7358
7416
  data: data,
7417
+ isMouseWheelZoomEnabled: !isTimeScrollingEnabled,
7359
7418
  onOrderChange: changeOrder,
7360
7419
  panelComponent: SoundingsPanelConnect,
7361
7420
  profileDataPreferences: profileDataPreferences,
@@ -7370,6 +7429,7 @@ var SoundingsConnect = function SoundingsConnect(_ref) {
7370
7429
  flex: '0 0 auto'
7371
7430
  },
7372
7431
  children: jsx(SoundingsTimeSliderConnect, {
7432
+ soundingsWindowRef: soundingsRef,
7373
7433
  syncEnabled: isTimeSynced,
7374
7434
  timeInUse: selectedTimeInUse,
7375
7435
  viewId: viewId
@@ -2,5 +2,6 @@ import React from 'react';
2
2
  import type { SoundingFeature } from '../../api/edr-api/types';
3
3
  export interface HodographProps {
4
4
  data: SoundingFeature[][];
5
+ isMouseWheelZoomEnabled: boolean;
5
6
  }
6
7
  export declare const Hodograph: React.FC<HodographProps>;
@@ -2,5 +2,6 @@ import React from 'react';
2
2
  import type { SoundingFeature } from '../../api/edr-api/types';
3
3
  export interface HodographCollectionProps {
4
4
  data: SoundingFeature[][];
5
+ isMouseWheelZoomEnabled: boolean;
5
6
  }
6
7
  export declare const HodographCollection: React.FC<HodographCollectionProps>;
@@ -11,5 +11,6 @@ export interface SoundingProps {
11
11
  };
12
12
  showTooltip?: boolean;
13
13
  diagramType?: SoundingDiagramType;
14
+ isMouseWheelZoomEnabled: boolean;
14
15
  }
15
16
  export declare const Soundings: React.FC<SoundingProps>;
@@ -16,5 +16,6 @@ export interface SoundingsPanelsProps {
16
16
  }[]) => void;
17
17
  panelComponent?: ResizablePanelComponent;
18
18
  profileDataPreferences?: SoundingsProfileDataPreferences;
19
+ isMouseWheelZoomEnabled: boolean;
19
20
  }
20
- export declare const SoundingsPanels: ({ viewId, soundingPanelsInOrder, data, chosenDiagramType, setChosenDiagramType, onOrderChange, panelComponent, profileDataPreferences, }: SoundingsPanelsProps) => React.ReactElement;
21
+ export declare const SoundingsPanels: ({ viewId, soundingPanelsInOrder, data, chosenDiagramType, setChosenDiagramType, onOrderChange, panelComponent, profileDataPreferences, isMouseWheelZoomEnabled, }: SoundingsPanelsProps) => React.ReactElement;
@@ -4,5 +4,7 @@ export interface SoundingsTimeSliderProps {
4
4
  timesteps: string[];
5
5
  selectedTime: string;
6
6
  updateSelectedTime: (date: string) => void;
7
+ isTimeScrollingEnabled: boolean;
8
+ soundingsWindowRef?: React.RefObject<HTMLElement | null>;
7
9
  }
8
- export declare const SoundingsTimeSlider: ({ timesteps, selectedTime, updateSelectedTime, }: SoundingsTimeSliderProps) => React.ReactElement;
10
+ export declare const SoundingsTimeSlider: ({ timesteps, selectedTime, updateSelectedTime, isTimeScrollingEnabled, soundingsWindowRef, }: SoundingsTimeSliderProps) => React.ReactElement;
@@ -3,6 +3,7 @@ interface SoundingsTimeSliderConnectProps {
3
3
  viewId: string;
4
4
  timeInUse?: string;
5
5
  syncEnabled?: boolean;
6
+ soundingsWindowRef?: React.RefObject<HTMLElement | null>;
6
7
  }
7
- export declare const SoundingsTimeSliderConnect: ({ viewId, timeInUse, syncEnabled, }: SoundingsTimeSliderConnectProps) => React.ReactElement;
8
+ export declare const SoundingsTimeSliderConnect: ({ viewId, timeInUse, syncEnabled, soundingsWindowRef, }: SoundingsTimeSliderConnectProps) => React.ReactElement;
8
9
  export {};
package/package.json CHANGED
@@ -1,55 +1,56 @@
1
1
  {
2
- "name": "@opengeoweb/soundings",
3
- "version": "19.6.1",
4
- "description": "GeoWeb soundings 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/api": "*",
24
- "@tanstack/react-query": "^5.85.5",
25
- "d3": "^7.9.0",
26
- "react-i18next": "^15.1.1",
27
- "i18next": "^25.0.1",
28
- "@opengeoweb/shared": "*",
29
- "@mui/material": "^9.0.1",
30
- "@opengeoweb/store": "*",
31
- "react-redux": "^9.2.0",
32
- "@opengeoweb/theme": "*",
33
- "@reduxjs/toolkit": "^2.6.1",
34
- "@opengeoweb/time-slider": "*",
35
- "react-window": "^2.2.6",
36
- "@opengeoweb/webmap": "*",
37
- "lodash": "^4.18.1",
38
- "@types/geojson": "^7946.0.14",
39
- "@opengeoweb/webmap-react": "*",
40
- "react-resizable-layout": "^0.7.3",
41
- "react-sortablejs": "^6.1.4"
42
- },
43
- "devDependencies": {
44
- "eslint-plugin-storybook": "10.3.3"
45
- },
46
- "peerDependencies": {
47
- "react": "19"
48
- },
49
- "files": [
50
- "dist",
51
- "!dist/package.json",
52
- "README.md",
53
- "package.json"
54
- ]
55
- }
2
+ "name": "@opengeoweb/soundings",
3
+ "version": "20.0.0",
4
+ "description": "GeoWeb soundings 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/api": "20.0.0",
24
+ "@opengeoweb/authentication": "20.0.0",
25
+ "@tanstack/react-query": "^5.85.5",
26
+ "d3": "^7.9.0",
27
+ "react-i18next": "^15.1.1",
28
+ "i18next": "^25.0.1",
29
+ "@opengeoweb/shared": "20.0.0",
30
+ "@mui/material": "^9.0.1",
31
+ "@opengeoweb/store": "20.0.0",
32
+ "react-redux": "^9.2.0",
33
+ "@opengeoweb/theme": "20.0.0",
34
+ "@reduxjs/toolkit": "^2.6.1",
35
+ "@opengeoweb/time-slider": "20.0.0",
36
+ "react-window": "^2.2.6",
37
+ "@opengeoweb/webmap": "20.0.0",
38
+ "lodash": "^4.18.1",
39
+ "@types/geojson": "^7946.0.14",
40
+ "@opengeoweb/webmap-react": "20.0.0",
41
+ "react-resizable-layout": "^0.7.3",
42
+ "react-sortablejs": "^6.1.4"
43
+ },
44
+ "devDependencies": {
45
+ "eslint-plugin-storybook": "10.3.3"
46
+ },
47
+ "peerDependencies": {
48
+ "react": "19"
49
+ },
50
+ "files": [
51
+ "dist",
52
+ "!dist/package.json",
53
+ "README.md",
54
+ "package.json"
55
+ ]
56
+ }
@@ -1,5 +0,0 @@
1
- import React from 'react';
2
- export interface SoundingPanelPlaceholderProps {
3
- panelName: string;
4
- }
5
- export declare const SoundingPanelPlaceholder: React.FC<SoundingPanelPlaceholderProps>;
@@ -1 +0,0 @@
1
- export * from './SoundingPanelPlaceholder';