@haniffalab/cherita-react 1.3.0-dev.2025-06-06.f1eddad0 → 1.3.1-dev.2025-10-29.6de4119f

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 (138) hide show
  1. package/README.md +1 -1
  2. package/dist/cjs/components/controls/Controls.js +38 -30
  3. package/dist/cjs/components/dotplot/Dotplot.js +67 -69
  4. package/dist/cjs/components/dotplot/DotplotControls.js +103 -83
  5. package/dist/cjs/components/full-page/FullPage.js +99 -105
  6. package/dist/cjs/components/full-page/PlotAlert.js +45 -0
  7. package/dist/cjs/components/full-page/PlotTypeSelector.js +89 -44
  8. package/dist/cjs/components/heatmap/Heatmap.js +65 -65
  9. package/dist/cjs/components/heatmap/HeatmapControls.js +6 -3
  10. package/dist/cjs/components/icons/DotPlotIcon.js +64 -0
  11. package/dist/cjs/components/icons/HeatmapIcon.js +45 -0
  12. package/dist/cjs/components/icons/MatrixPlotIcon.1.js +57 -0
  13. package/dist/cjs/components/icons/MatrixPlotIcon.js +59 -0
  14. package/dist/cjs/components/icons/ScatterplotIcon.1.js +164 -0
  15. package/dist/cjs/components/icons/ScatterplotIcon.js +144 -0
  16. package/dist/cjs/components/icons/ViolinPlotIcon.js +42 -0
  17. package/dist/cjs/components/matrixplot/Matrixplot.js +65 -66
  18. package/dist/cjs/components/matrixplot/MatrixplotControls.js +8 -5
  19. package/dist/cjs/components/obs-list/ObsItem.js +267 -205
  20. package/dist/cjs/components/obs-list/ObsList.js +161 -129
  21. package/dist/cjs/components/obs-list/ObsToolbar.js +2 -3
  22. package/dist/cjs/components/obsm-list/ObsmList.js +67 -28
  23. package/dist/cjs/components/offcanvas/index.js +62 -27
  24. package/dist/cjs/components/pseudospatial/Pseudospatial.js +132 -76
  25. package/dist/cjs/components/pseudospatial/PseudospatialToolbar.js +122 -74
  26. package/dist/cjs/components/scatterplot/Scatterplot.js +128 -100
  27. package/dist/cjs/components/scatterplot/ScatterplotControls.js +45 -31
  28. package/dist/cjs/components/scatterplot/SpatialControls.js +140 -113
  29. package/dist/cjs/components/scatterplot/Toolbox.js +41 -30
  30. package/dist/cjs/components/search-bar/SearchBar.js +176 -120
  31. package/dist/cjs/components/search-bar/SearchInfo.js +76 -50
  32. package/dist/cjs/components/search-bar/SearchResults.js +93 -71
  33. package/dist/cjs/components/toolbar/Toolbar.js +46 -37
  34. package/dist/cjs/components/var-list/VarItem.js +131 -103
  35. package/dist/cjs/components/var-list/VarList.js +85 -71
  36. package/dist/cjs/components/var-list/VarListToolbar.js +59 -54
  37. package/dist/cjs/components/var-list/VarSet.js +126 -108
  38. package/dist/cjs/components/violin/Violin.js +109 -97
  39. package/dist/cjs/components/violin/ViolinControls.js +8 -5
  40. package/dist/cjs/constants/colorscales.js +19 -19
  41. package/dist/cjs/constants/constants.js +51 -48
  42. package/dist/cjs/context/DatasetContext.js +26 -17
  43. package/dist/cjs/context/FilterContext.js +11 -9
  44. package/dist/cjs/context/SettingsContext.js +271 -88
  45. package/dist/cjs/context/ZarrDataContext.js +6 -5
  46. package/dist/cjs/helpers/color-helper.js +2 -2
  47. package/dist/cjs/helpers/zarr-helper.js +3 -3
  48. package/dist/cjs/utils/Filter.js +16 -11
  49. package/dist/cjs/utils/Histogram.js +35 -33
  50. package/dist/cjs/utils/ImageViewer.js +11 -8
  51. package/dist/cjs/utils/Legend.js +37 -30
  52. package/dist/cjs/utils/LoadingIndicators.js +15 -13
  53. package/dist/cjs/utils/Resolver.js +213 -0
  54. package/dist/cjs/utils/Skeleton.js +10 -10
  55. package/dist/cjs/utils/StyledTooltip.js +44 -0
  56. package/dist/cjs/utils/VirtualizedList.js +36 -29
  57. package/dist/cjs/utils/errors.js +15 -15
  58. package/dist/cjs/utils/requests.js +21 -9
  59. package/dist/cjs/utils/search.js +4 -4
  60. package/dist/cjs/utils/string.js +6 -6
  61. package/dist/cjs/utils/zarrData.js +20 -21
  62. package/dist/css/cherita.css +135 -65
  63. package/dist/css/cherita.css.map +1 -1
  64. package/dist/esm/components/controls/Controls.js +43 -35
  65. package/dist/esm/components/dotplot/Dotplot.js +77 -78
  66. package/dist/esm/components/dotplot/DotplotControls.js +106 -85
  67. package/dist/esm/components/full-page/FullPage.js +119 -124
  68. package/dist/esm/components/full-page/PlotAlert.js +39 -0
  69. package/dist/esm/components/full-page/PlotTypeSelector.js +90 -45
  70. package/dist/esm/components/heatmap/Heatmap.js +75 -74
  71. package/dist/esm/components/heatmap/HeatmapControls.js +8 -4
  72. package/dist/esm/components/icons/DotPlotIcon.js +58 -0
  73. package/dist/esm/components/icons/HeatmapIcon.js +39 -0
  74. package/dist/esm/components/icons/MatrixPlotIcon.1.js +51 -0
  75. package/dist/esm/components/icons/MatrixPlotIcon.js +53 -0
  76. package/dist/esm/components/icons/ScatterplotIcon.1.js +158 -0
  77. package/dist/esm/components/icons/ScatterplotIcon.js +138 -0
  78. package/dist/esm/components/icons/ViolinPlotIcon.js +36 -0
  79. package/dist/esm/components/matrixplot/Matrixplot.js +75 -75
  80. package/dist/esm/components/matrixplot/MatrixplotControls.js +10 -6
  81. package/dist/esm/components/obs-list/ObsItem.js +282 -217
  82. package/dist/esm/components/obs-list/ObsList.js +176 -143
  83. package/dist/esm/components/obs-list/ObsToolbar.js +3 -3
  84. package/dist/esm/components/obsm-list/ObsmList.js +71 -32
  85. package/dist/esm/components/offcanvas/index.js +68 -33
  86. package/dist/esm/components/pseudospatial/Pseudospatial.js +145 -88
  87. package/dist/esm/components/pseudospatial/PseudospatialToolbar.js +127 -78
  88. package/dist/esm/components/scatterplot/Scatterplot.js +149 -120
  89. package/dist/esm/components/scatterplot/ScatterplotControls.js +50 -35
  90. package/dist/esm/components/scatterplot/SpatialControls.js +153 -125
  91. package/dist/esm/components/scatterplot/Toolbox.js +44 -32
  92. package/dist/esm/components/search-bar/SearchBar.js +187 -130
  93. package/dist/esm/components/search-bar/SearchInfo.js +86 -59
  94. package/dist/esm/components/search-bar/SearchResults.js +100 -77
  95. package/dist/esm/components/toolbar/Toolbar.js +49 -39
  96. package/dist/esm/components/var-list/VarItem.js +142 -113
  97. package/dist/esm/components/var-list/VarList.js +99 -84
  98. package/dist/esm/components/var-list/VarListToolbar.js +64 -58
  99. package/dist/esm/components/var-list/VarSet.js +134 -115
  100. package/dist/esm/components/violin/Violin.js +121 -108
  101. package/dist/esm/components/violin/ViolinControls.js +10 -6
  102. package/dist/esm/constants/colorscales.js +19 -19
  103. package/dist/esm/constants/constants.js +50 -47
  104. package/dist/esm/context/DatasetContext.js +33 -23
  105. package/dist/esm/context/FilterContext.js +11 -8
  106. package/dist/esm/context/SettingsContext.js +273 -89
  107. package/dist/esm/context/ZarrDataContext.js +8 -6
  108. package/dist/esm/helpers/color-helper.js +5 -5
  109. package/dist/esm/helpers/map-helper.js +2 -2
  110. package/dist/esm/helpers/zarr-helper.js +6 -6
  111. package/dist/esm/index.js +22 -22
  112. package/dist/esm/utils/Filter.js +22 -17
  113. package/dist/esm/utils/Histogram.js +39 -37
  114. package/dist/esm/utils/ImageViewer.js +12 -8
  115. package/dist/esm/utils/Legend.js +44 -36
  116. package/dist/esm/utils/LoadingIndicators.js +16 -13
  117. package/dist/esm/utils/Resolver.js +201 -0
  118. package/dist/esm/utils/Skeleton.js +11 -10
  119. package/dist/esm/utils/StyledTooltip.js +38 -0
  120. package/dist/esm/utils/VirtualizedList.js +37 -29
  121. package/dist/esm/utils/errors.js +15 -15
  122. package/dist/esm/utils/requests.js +24 -12
  123. package/dist/esm/utils/search.js +7 -7
  124. package/dist/esm/utils/string.js +7 -7
  125. package/dist/esm/utils/zarrData.js +27 -28
  126. package/package.json +20 -8
  127. package/scss/cherita-bootstrap.scss +2 -2
  128. package/scss/cherita.scss +65 -16
  129. package/scss/components/accordions.scss +15 -2
  130. package/scss/components/layouts.scss +68 -50
  131. package/scss/components/lists.scss +16 -5
  132. package/scss/components/plotly.scss +38 -26
  133. package/scss/components/plots.scss +14 -1
  134. package/dist/assets/images/plots/dotplot.svg +0 -152
  135. package/dist/assets/images/plots/heatmap.svg +0 -193
  136. package/dist/assets/images/plots/matrixplot.svg +0 -275
  137. package/dist/assets/images/plots/scatterplot.svg +0 -198
  138. package/dist/assets/images/plots/violin.svg +0 -50
@@ -1,10 +1,11 @@
1
- import { useMemo } from "react";
2
- import _ from "lodash";
3
- import { slice } from "zarr";
4
- import { OBS_TYPES } from "../constants/constants";
5
- import { useDataset } from "../context/DatasetContext";
6
- import { useSettings } from "../context/SettingsContext";
7
- import { GET_OPTIONS, useZarr, useMultipleZarr } from "../helpers/zarr-helper";
1
+ import { useMemo } from 'react';
2
+ import _ from 'lodash';
3
+ import { slice } from 'zarr';
4
+ import { useSelectedObs, useSelectedVar } from './Resolver';
5
+ import { OBS_TYPES } from '../constants/constants';
6
+ import { useDataset } from '../context/DatasetContext';
7
+ import { useSettings } from '../context/SettingsContext';
8
+ import { GET_OPTIONS, useZarr, useMultipleZarr } from '../helpers/zarr-helper';
8
9
 
9
10
  // @TODO: support specifying slice to load from context
10
11
  export const useObsmData = function () {
@@ -14,7 +15,7 @@ export const useObsmData = function () {
14
15
  obsm = obsm || settings.selectedObsm;
15
16
  const obsmParams = useMemo(() => ({
16
17
  url: dataset.url,
17
- path: "obsm/" + obsm,
18
+ path: 'obsm/' + obsm,
18
19
  s: [null, slice(null, 2)] // load only [:, :2]
19
20
  }), [dataset.url, obsm]);
20
21
  return useZarr(obsmParams, GET_OPTIONS, {
@@ -32,21 +33,18 @@ const meanData = (_i, data) => {
32
33
  export const useXData = function () {
33
34
  let agg = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : meanData;
34
35
  const dataset = useDataset();
35
- const settings = useSettings();
36
- const xParams = useMemo(() => {
37
- var _settings$selectedVar, _settings$selectedVar2, _settings$selectedVar3;
38
- return !settings.selectedVar ? [] : !((_settings$selectedVar = settings.selectedVar) !== null && _settings$selectedVar !== void 0 && _settings$selectedVar.isSet) ? [{
36
+ const selectedVar = useSelectedVar();
37
+ const xParams = useMemo(() => !selectedVar ? [] : !(selectedVar !== null && selectedVar !== void 0 && selectedVar.isSet) ? [{
38
+ url: dataset.url,
39
+ path: 'X',
40
+ s: [null, selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.matrix_index]
41
+ }] : _.map(selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.vars, v => {
42
+ return {
39
43
  url: dataset.url,
40
- path: "X",
41
- s: [null, (_settings$selectedVar2 = settings.selectedVar) === null || _settings$selectedVar2 === void 0 ? void 0 : _settings$selectedVar2.matrix_index]
42
- }] : _.map((_settings$selectedVar3 = settings.selectedVar) === null || _settings$selectedVar3 === void 0 ? void 0 : _settings$selectedVar3.vars, v => {
43
- return {
44
- url: dataset.url,
45
- path: "X",
46
- s: [null, v.matrix_index]
47
- };
48
- });
49
- }, [dataset.url, settings.selectedVar]);
44
+ path: 'X',
45
+ s: [null, v.matrix_index]
46
+ };
47
+ }), [dataset.url, selectedVar]);
50
48
  return useMultipleZarr(xParams, GET_OPTIONS, {
51
49
  enabled: !!xParams.length
52
50
  }, agg);
@@ -55,13 +53,13 @@ export const useObsData = function () {
55
53
  var _obs3, _obs4;
56
54
  let obs = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
57
55
  const dataset = useDataset();
58
- const settings = useSettings();
59
- obs = obs || settings.selectedObs;
56
+ const selectedObs = useSelectedObs();
57
+ obs = obs || selectedObs;
60
58
  const obsParams = useMemo(() => {
61
59
  var _obs, _obs2;
62
60
  return {
63
61
  url: dataset.url,
64
- path: "obs/" + ((_obs = obs) === null || _obs === void 0 ? void 0 : _obs.name) + (((_obs2 = obs) === null || _obs2 === void 0 ? void 0 : _obs2.type) === OBS_TYPES.CATEGORICAL ? "/codes" : "")
62
+ path: 'obs/' + ((_obs = obs) === null || _obs === void 0 ? void 0 : _obs.name) + (((_obs2 = obs) === null || _obs2 === void 0 ? void 0 : _obs2.type) === OBS_TYPES.CATEGORICAL ? '/codes' : '')
65
63
  };
66
64
  }, [dataset.url, (_obs3 = obs) === null || _obs3 === void 0 ? void 0 : _obs3.name, (_obs4 = obs) === null || _obs4 === void 0 ? void 0 : _obs4.type]);
67
65
  return useZarr(obsParams, GET_OPTIONS, {
@@ -71,13 +69,14 @@ export const useObsData = function () {
71
69
  export const useLabelObsData = () => {
72
70
  const dataset = useDataset();
73
71
  const settings = useSettings();
74
- const labelObsParams = useMemo(() => _.map(settings.labelObs, obs => {
72
+ const labelObsParams = useMemo(() => _.map(settings.labelObs, obsName => {
73
+ const obs = settings.data.obs[obsName] || null;
75
74
  return {
76
75
  url: dataset.url,
77
- path: "obs/" + obs.name + (obs.type === OBS_TYPES.CATEGORICAL ? "/codes" : ""),
76
+ path: 'obs/' + obs.name + (obs.type === OBS_TYPES.CATEGORICAL ? '/codes' : ''),
78
77
  key: obs.name
79
78
  };
80
- }), [dataset.url, settings.labelObs]);
79
+ }), [dataset.url, settings.data.obs, settings.labelObs]);
81
80
  return useMultipleZarr(labelObsParams, GET_OPTIONS, {
82
81
  enabled: !!labelObsParams.length
83
82
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@haniffalab/cherita-react",
3
- "version": "1.3.0-dev.2025-06-06.f1eddad0",
3
+ "version": "1.3.1-dev.2025-10-29.6de4119f",
4
4
  "author": "Haniffa Lab",
5
5
  "license": "MIT",
6
6
  "keywords": [
@@ -64,25 +64,37 @@
64
64
  "@babel/plugin-proposal-private-property-in-object": "^7.21.11",
65
65
  "@babel/preset-env": "^7.22.5",
66
66
  "@babel/preset-react": "^7.22.5",
67
+ "@semantic-release/changelog": "^6.0.3",
68
+ "@semantic-release/commit-analyzer": "^13.0.1",
69
+ "@semantic-release/git": "^10.0.1",
70
+ "@semantic-release/github": "^11.0.6",
71
+ "@semantic-release/npm": "^12.0.2",
72
+ "@semantic-release/release-notes-generator": "^14.1.0",
67
73
  "@testing-library/dom": "^10.4.0",
68
74
  "@testing-library/jest-dom": "^6.6.3",
69
75
  "@testing-library/react": "^16.2.0",
70
76
  "babel-jest": "^29.7.0",
77
+ "babel-plugin-transform-define": "^2.1.4",
71
78
  "cpx": "^1.5.0",
72
79
  "eslint": "^8.57.1",
73
- "eslint-config-prettier": "^8.10.0",
80
+ "eslint-config-prettier": "^8.10.2",
74
81
  "eslint-config-react-app": "^7.0.1",
75
- "eslint-plugin-import": "^2.29.1",
76
- "eslint-plugin-prettier": "^5.2.3",
82
+ "eslint-import-resolver-alias": "^1.1.2",
83
+ "eslint-plugin-import": "^2.32.0",
84
+ "eslint-plugin-prettier": "^5.5.4",
85
+ "eslint-plugin-react": "^7.37.5",
86
+ "eslint-plugin-unused-imports": "^4.3.0",
77
87
  "jest": "^29.7.0",
78
88
  "jest-environment-jsdom": "^29.7.0",
79
- "prettier": "^3.5.3",
89
+ "prettier": "^3.6.2",
80
90
  "react": "^18.2.0",
81
91
  "react-dom": "^18.2.0",
82
92
  "sass": "1.77.6",
93
+ "semantic-release": "^24.2.9",
83
94
  "stylelint": "^16.10.0",
84
95
  "stylelint-config-prettier": "^9.0.5",
85
- "stylelint-config-standard-scss": "^13.1.0"
96
+ "stylelint-config-standard-scss": "^13.1.0",
97
+ "stylelint-prettier": "^5.0.3"
86
98
  },
87
99
  "scripts": {
88
100
  "build:esm": "babel src/lib --out-dir dist/esm --copy-files --env-name esm",
@@ -92,7 +104,7 @@
92
104
  "copy:scss": "cpx 'src/scss/**/*' 'scss'",
93
105
  "copy:assets": "cpx 'src/assets/**/*' 'dist/assets'",
94
106
  "build": "npm run build:babel && npm run build:scss && npm run copy:scss && npm run copy:assets",
95
- "test": "jest --watchAll",
107
+ "test": "jest",
96
108
  "test:ci": "jest --coverage --ci --no-watch",
97
109
  "lint:scss": "stylelint 'src/**/*.scss' --fix",
98
110
  "lint:js": "eslint 'src/**/*.js' --fix",
@@ -127,5 +139,5 @@
127
139
  "url": "https://github.com/haniffalab/cherita-react/issues"
128
140
  },
129
141
  "homepage": "https://github.com/haniffalab/cherita-react#readme",
130
- "prereleaseSha": "f1eddad0f8fea03ef886db127e9a9d50766aab8e"
142
+ "prereleaseSha": "6de4119f78f1a4b4e402b157c62c4119daab028f"
131
143
  }
@@ -1,2 +1,2 @@
1
- @use "bootstrap/scss/bootstrap";
2
- @import "cherita";
1
+ @use 'bootstrap/scss/bootstrap';
2
+ @import 'cherita';
package/scss/cherita.scss CHANGED
@@ -1,12 +1,12 @@
1
1
  // Define $prefix only if it hasn't been set already
2
- $prefix: "bs-" !default;
2
+ $prefix: 'bs-' !default;
3
3
 
4
- @import "components/accordions";
5
- @import "components/lists";
6
- @import "components/layouts";
7
- @import "components/plotly";
8
- @import "components/plots";
9
- @import "components/scrollbars";
4
+ @import 'components/accordions';
5
+ @import 'components/lists';
6
+ @import 'components/layouts';
7
+ @import 'components/plotly';
8
+ @import 'components/plots';
9
+ @import 'components/scrollbars';
10
10
 
11
11
  .loading-spinner {
12
12
  @extend .bg-light;
@@ -21,6 +21,10 @@ $prefix: "bs-" !default;
21
21
  align-items: center;
22
22
  }
23
23
 
24
+ .cursor-pointer {
25
+ cursor: pointer;
26
+ }
27
+
24
28
  .cherita-container {
25
29
  margin: 40px auto;
26
30
  background-color: #fff;
@@ -115,6 +119,7 @@ $prefix: "bs-" !default;
115
119
  white-space: nowrap;
116
120
  text-overflow: ellipsis;
117
121
  pointer-events: auto;
122
+
118
123
  .legend-text {
119
124
  overflow: hidden;
120
125
  text-overflow: ellipsis;
@@ -124,7 +129,7 @@ $prefix: "bs-" !default;
124
129
  }
125
130
  }
126
131
 
127
- @media (max-width: 600px) {
132
+ @media (width <= 600px) {
128
133
  .cherita-spatial-footer {
129
134
  flex-direction: column;
130
135
  align-items: center;
@@ -151,6 +156,13 @@ $prefix: "bs-" !default;
151
156
  padding-right: 1rem;
152
157
  word-break: auto-phrase;
153
158
  overflow-wrap: anywhere;
159
+
160
+ .form-check-label {
161
+ white-space: nowrap;
162
+ overflow: hidden;
163
+ text-overflow: ellipsis;
164
+ display: block;
165
+ }
154
166
  }
155
167
 
156
168
  .grad-step {
@@ -221,13 +233,14 @@ $prefix: "bs-" !default;
221
233
  }
222
234
 
223
235
  .value-count-badge {
224
- color: #000000 !important;
236
+ color: #000 !important;
225
237
  background-color: #dedede !important;
226
238
  font-weight: lighter;
227
239
  }
228
240
 
229
241
  .filtered-value-count-badge {
230
- color: #ffffff !important;
242
+ color: #fff !important;
243
+
231
244
  // background-color: $alt-color !important;
232
245
  font-weight: normal;
233
246
  }
@@ -258,28 +271,32 @@ $gauge-padding: 0.15rem;
258
271
 
259
272
  .feature-histogram {
260
273
  @extend .feature-histogram-container;
261
- border-radius: 5px;
262
274
 
275
+ border-radius: 5px;
263
276
  background-color: #dedede;
264
277
  }
265
278
 
279
+ .feature-histogram-tooltip td > p {
280
+ font-size: 0.85rem !important;
281
+ }
282
+
283
+ /* stylelint-disable-next-line selector-class-pattern */
266
284
  .feature-histogram-tooltip .MuiChartsTooltip-markCell,
285
+ /* stylelint-disable-next-line selector-class-pattern */
267
286
  .MuiChartsTooltip-labelCell {
268
287
  display: none;
269
288
  }
270
289
 
290
+ /* stylelint-disable-next-line selector-class-pattern */
271
291
  .feature-histogram-tooltip .MuiChartsTooltip-valueCell {
272
292
  padding: 0.5rem !important;
273
293
  }
274
294
 
295
+ /* stylelint-disable-next-line selector-class-pattern */
275
296
  .feature-histogram-tooltip .MuiChartsTooltip-valueCell > p {
276
297
  font-size: 0.85rem !important;
277
298
  }
278
299
 
279
- .feature-histogram-tooltip td > p {
280
- font-size: 0.85rem !important;
281
- }
282
-
283
300
  .feature-disease-info-list {
284
301
  max-height: 300px;
285
302
  overflow-y: auto;
@@ -343,6 +360,7 @@ $gauge-padding: 0.15rem;
343
360
 
344
361
  .cherita-pseudospatial {
345
362
  width: 100%;
363
+ position: relative;
346
364
  }
347
365
 
348
366
  .cherita-pseudospatial-plot {
@@ -404,4 +422,35 @@ $gauge-padding: 0.15rem;
404
422
  white-space: nowrap;
405
423
  overflow: hidden;
406
424
  text-overflow: ellipsis;
407
- }
425
+ }
426
+
427
+ .var-item-name {
428
+ @extend .me-auto;
429
+
430
+ padding-right: 0.5rem;
431
+ white-space: nowrap;
432
+ overflow: hidden;
433
+ text-overflow: ellipsis;
434
+ }
435
+
436
+ input[type='checkbox'] {
437
+ cursor: pointer;
438
+ }
439
+
440
+ .ps-xs-1 {
441
+ padding-left: 0.15rem !important;
442
+ }
443
+
444
+ .resampled-tooltip-container {
445
+ position: absolute;
446
+ bottom: 16px;
447
+ right: 16px;
448
+ z-index: 10;
449
+ width: max-content;
450
+
451
+ @media (width >= 991px) {
452
+ top: 16px;
453
+ left: 16px;
454
+ bottom: auto;
455
+ }
456
+ }
@@ -19,13 +19,25 @@
19
19
  height: 20px;
20
20
  margin-right: 10px;
21
21
  }
22
- .obs-accordion-header-title {
22
+
23
+ .obs-accordion-header-span {
23
24
  font-size: 1rem;
24
25
  width: 100%;
25
26
  display: flex;
26
27
  justify-content: space-between;
27
28
  align-items: center;
29
+
30
+ .accordion-header-title {
31
+ @extend .text-break;
32
+ @extend .me-1;
33
+ }
34
+
35
+ .accordion-header-toolbar {
36
+ @extend .d-flex;
37
+ @extend .flex-nowrap;
38
+ }
28
39
  }
40
+
29
41
  .active-icon {
30
42
  color: #0c63e4;
31
43
  }
@@ -33,5 +45,6 @@
33
45
 
34
46
  .obs-group-accordion-body {
35
47
  @extend .accordion-flush;
48
+
36
49
  padding: 0;
37
- }
50
+ }
@@ -1,9 +1,9 @@
1
1
  .cherita-app {
2
- position: relative;
3
- width: 100%;
4
- }
2
+ flex-grow: 1;
3
+ display: flex;
4
+ flex-direction: column;
5
+ overflow: auto;
5
6
 
6
- .cherita-app {
7
7
  .cherita-navbar {
8
8
  @extend .m-3;
9
9
  @extend .d-block;
@@ -15,16 +15,13 @@
15
15
  left: 0;
16
16
  right: 0;
17
17
  border-radius: 0.25rem;
18
- @media (min-width: 992px) and (max-width: 1199px) {
19
- margin-left: calc(33.33333333% + 1rem) !important;
18
+
19
+ @media (width >= 992px) and (width <= 1199px) {
20
+ margin-left: calc(33.3333% + 1rem) !important;
20
21
  }
21
22
  }
22
23
  }
23
24
 
24
- .cherita-app-canvas {
25
- position: relative;
26
- }
27
-
28
25
  .cherita-app-obs {
29
26
  @extend .col;
30
27
  @extend .d-none;
@@ -40,46 +37,22 @@
40
37
  @extend .d-none;
41
38
  @extend .d-xl-flex;
42
39
 
40
+ height: 100%;
43
41
  width: 20%;
44
42
  position: relative;
45
43
 
46
44
  .card {
47
45
  width: 100%;
46
+ height: 100%;
48
47
  }
49
48
 
50
49
  .card-body {
51
- overflow-y: hidden;
52
- }
53
-
54
- .sidebar-plotselector {
55
- padding: 6px;
56
- border-bottom: 1px solid #dee2e6;
50
+ @extend .p-0;
57
51
 
58
- .plotselector-icon {
59
- padding-bottom: 2px;
60
- cursor: pointer;
61
-
62
- .active {
63
- opacity: 1;
64
- border-bottom: 2px solid #007bff;
65
- }
66
- }
67
- }
68
-
69
- .sidebar-pseudospatial {
70
- padding: 10px;
71
- border-bottom: 1px solid #dee2e6;
72
-
73
- .cherita-legend {
74
- margin: 0 auto;
75
- }
76
- }
77
-
78
- .sidebar-features {
79
- padding: 10px;
80
- margin-bottom: 10px;
52
+ overflow-y: hidden;
53
+ display: flex;
54
+ flex-direction: column;
81
55
  height: 100%;
82
- overflow-y: auto;
83
56
  }
84
57
 
85
58
  .accordion-header-wrapper {
@@ -95,8 +68,8 @@
95
68
  align-items: center;
96
69
  width: 100%;
97
70
 
98
- &:after {
99
- content: "";
71
+ &::after {
72
+ content: '';
100
73
  flex-shrink: 0;
101
74
  width: var(--geeks-accordion-btn-icon-width);
102
75
  height: var(--geeks-accordion-btn-icon-width);
@@ -112,20 +85,66 @@
112
85
  color: var(--geeks-accordion-active-color);
113
86
  background-color: var(--geeks-accordion-active-bg);
114
87
 
115
- &:after {
88
+ &::after {
116
89
  background-image: var(--geeks-accordion-btn-active-icon);
117
90
  transform: var(--geeks-accordion-btn-icon-transform);
118
91
  }
119
92
  }
120
93
  }
121
94
 
95
+ .sidebar-pseudospatial {
96
+ padding: 10px;
97
+ border-bottom: 1px solid #dee2e6;
98
+
99
+ .cherita-legend {
100
+ margin: 0 auto;
101
+ }
102
+ }
103
+
104
+ .sidebar-features {
105
+ padding: 10px;
106
+ margin-bottom: 10px;
107
+ height: 100%;
108
+ display: flex;
109
+ flex-direction: column;
110
+ flex-grow: 1;
111
+ min-height: 0;
112
+
113
+ .sidebar-features-list {
114
+ position: relative;
115
+ flex-grow: 1;
116
+ min-height: 0;
117
+ }
118
+ }
119
+
120
+ .offcanvas-vars {
121
+ .offcanvas-header {
122
+ @extend .pb-0;
123
+ }
124
+
125
+ .offcanvas-body {
126
+ @extend .pt-1;
127
+
128
+ display: flex;
129
+ flex-direction: column;
130
+ height: 100%;
131
+
132
+ .sidebar-features {
133
+ @extend .px-0;
134
+ }
135
+ }
136
+ }
137
+
122
138
  .search-modal-info {
123
139
  overflow-y: auto;
124
140
  border-left: 1px solid #dee2e6;
125
141
  }
126
142
 
127
143
  .cherita-app-canvas {
144
+ position: relative;
145
+
128
146
  .cherita-plot {
147
+ position: relative;
129
148
  height: 100%;
130
149
  min-height: 400px;
131
150
  }
@@ -133,6 +152,7 @@
133
152
 
134
153
  .cherita-app-container {
135
154
  @extend .p-0;
155
+
136
156
  display: flex;
137
157
  flex-wrap: nowrap;
138
158
  width: 100%;
@@ -146,9 +166,10 @@
146
166
  }
147
167
 
148
168
  .cherita-app-canvas {
149
- @extend .p-1;
169
+ @extend .p-0;
170
+
150
171
  flex: 1 1 auto;
151
- min-width: 400px;
172
+ min-width: 375px;
152
173
  position: relative;
153
174
  max-height: 100%;
154
175
  display: flex;
@@ -157,6 +178,7 @@
157
178
  .cherita-navbar {
158
179
  @extend .m-0;
159
180
  @extend .d-block;
181
+
160
182
  position: relative;
161
183
  }
162
184
  }
@@ -168,14 +190,10 @@
168
190
  position: relative;
169
191
  }
170
192
 
171
- @media (max-width: 1400px) {
193
+ @media (width <= 1400px) {
172
194
  .cherita-app-obs,
173
195
  .cherita-app-sidebar {
174
196
  max-width: 25%;
175
197
  }
176
198
  }
177
199
  }
178
-
179
- .ps-xs-1 {
180
- padding-left: 0.15rem !important;
181
- }
@@ -1,11 +1,13 @@
1
1
  .list-group.cherita-list {
2
2
  .virtualized-list-wrapper {
3
- padding: 0 0.25rem 0.25rem 0.25rem;
3
+ padding: 0 0.25rem 0.25rem;
4
4
  }
5
+
5
6
  .list-group-item.unstyled {
6
7
  background-color: transparent;
7
8
  padding-left: 1rem;
8
9
  }
10
+
9
11
  .list-group-item {
10
12
  border: 0;
11
13
  padding: 0.375rem 0.75rem;
@@ -13,15 +15,16 @@
13
15
  color: var(--#{$prefix}body-color);
14
16
  background-color: var(--#{$prefix}tertiary-bg);
15
17
  border-radius: var(--#{$prefix}border-radius);
16
- cursor: pointer;
17
18
  }
19
+
18
20
  .list-group-item.active {
19
21
  background-color: var(--#{$prefix}secondary-bg);
20
22
  }
21
23
  }
24
+
22
25
  .obs-statistics {
23
26
  border: 0;
24
- margin: 0 0.25rem 0.25rem 0.25rem;
27
+ margin: 0 0.25rem 0.25rem;
25
28
  padding: 0.375rem 0.75rem;
26
29
  line-height: 1.5;
27
30
  color: var(--#{$prefix}body-color);
@@ -30,7 +33,15 @@
30
33
  }
31
34
 
32
35
  .cherita-list.var-set-list > .list-group-item {
33
- filter: brightness(0.95); // darken background
36
+ filter: brightness(0.95);
34
37
  padding-right: 0;
35
38
  padding-left: 0.35rem;
36
- }
39
+ }
40
+
41
+ .search-results {
42
+ .cherita-list.list-group {
43
+ .list-group-item {
44
+ cursor: pointer;
45
+ }
46
+ }
47
+ }
@@ -1,35 +1,47 @@
1
- .js-plotly-plot .plotly .modebar {
1
+ // Plotly modebar customisation
2
+ .js-plotly-plot {
3
+ .plotly {
4
+ .modebar {
5
+ top: 16px;
6
+ right: 0;
2
7
 
3
- .modebar-group {
4
- @extend .bg-primary;
5
- @extend .mx-1;
6
- border-radius: 5px;
7
- padding: 4px !important;
8
+ // Each button group in the modebar
9
+ .modebar-group {
10
+ @extend .bg-primary;
11
+ @extend .mx-1;
8
12
 
9
- .modebar-btn {
10
- display: inline-flex;
11
- justify-content: center;
12
- position: relative;
13
- font-size: 1.25rem;
14
- padding: 0.25rem;
15
- height: auto;
16
- cursor: pointer;
17
- line-height: normal;
13
+ border-radius: 5px;
14
+ padding: 4px !important;
18
15
 
19
- svg {
20
- position: relative;
21
- top: 1px;
16
+ // Individual buttons
17
+ .modebar-btn {
18
+ display: inline-flex;
19
+ justify-content: center;
20
+ align-items: center;
21
+ position: relative;
22
+ font-size: 1.25rem;
23
+ padding: 0.25rem;
24
+ height: auto;
25
+ cursor: pointer;
26
+ line-height: normal;
22
27
 
23
- path {
24
- fill: white !important;
25
- color: white !important;
28
+ svg {
29
+ position: relative;
30
+ top: 1px;
31
+
32
+ path {
33
+ fill: white !important;
34
+ color: white !important;
35
+ }
36
+ }
26
37
  }
27
38
  }
39
+
40
+ // Hover effect for modebar buttons except watermark
41
+ &--hover > :not(.watermark) {
42
+ opacity: 1;
43
+ transition: opacity 0.3s;
44
+ }
28
45
  }
29
46
  }
30
47
  }
31
-
32
- .js-plotly-plot .plotly .modebar--hover > :not(.watermark) {
33
- opacity: 0.5;
34
- transition: opacity 0.3s;
35
- }