@haniffalab/cherita-react 1.3.0 → 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 (137) 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 +85 -57
  4. package/dist/cjs/components/dotplot/DotplotControls.js +103 -83
  5. package/dist/cjs/components/full-page/FullPage.js +167 -114
  6. package/dist/cjs/components/full-page/PlotAlert.js +45 -0
  7. package/dist/cjs/components/full-page/PlotTypeSelector.js +102 -0
  8. package/dist/cjs/components/heatmap/Heatmap.js +83 -53
  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 +83 -54
  18. package/dist/cjs/components/matrixplot/MatrixplotControls.js +8 -5
  19. package/dist/cjs/components/obs-list/ObsItem.js +305 -216
  20. package/dist/cjs/components/obs-list/ObsList.js +164 -128
  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 +223 -175
  27. package/dist/cjs/components/scatterplot/ScatterplotControls.js +45 -31
  28. package/dist/cjs/components/scatterplot/SpatialControls.js +143 -116
  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 +79 -85
  32. package/dist/cjs/components/search-bar/SearchResults.js +93 -71
  33. package/dist/cjs/components/toolbar/Toolbar.js +111 -0
  34. package/dist/cjs/components/var-list/VarItem.js +131 -103
  35. package/dist/cjs/components/var-list/VarList.js +96 -74
  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 +124 -81
  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 +54 -39
  42. package/dist/cjs/context/DatasetContext.js +27 -17
  43. package/dist/cjs/context/FilterContext.js +11 -9
  44. package/dist/cjs/context/SettingsContext.js +339 -125
  45. package/dist/cjs/context/ZarrDataContext.js +6 -5
  46. package/dist/cjs/helpers/color-helper.js +2 -2
  47. package/dist/cjs/helpers/map-helper.js +2 -1
  48. package/dist/cjs/helpers/zarr-helper.js +3 -3
  49. package/dist/cjs/index.js +15 -21
  50. package/dist/cjs/utils/Filter.js +16 -11
  51. package/dist/cjs/utils/Histogram.js +35 -33
  52. package/dist/cjs/utils/ImageViewer.js +11 -8
  53. package/dist/cjs/utils/Legend.js +37 -30
  54. package/dist/cjs/utils/LoadingIndicators.js +15 -13
  55. package/dist/cjs/utils/Resolver.js +213 -0
  56. package/dist/cjs/utils/Skeleton.js +10 -10
  57. package/dist/cjs/utils/StyledTooltip.js +44 -0
  58. package/dist/cjs/utils/VirtualizedList.js +36 -29
  59. package/dist/cjs/utils/errors.js +15 -15
  60. package/dist/cjs/utils/requests.js +21 -9
  61. package/dist/cjs/utils/search.js +4 -4
  62. package/dist/cjs/utils/string.js +6 -6
  63. package/dist/cjs/utils/zarrData.js +20 -21
  64. package/dist/css/cherita.css +188 -65
  65. package/dist/css/cherita.css.map +1 -1
  66. package/dist/esm/components/controls/Controls.js +43 -35
  67. package/dist/esm/components/dotplot/Dotplot.js +93 -64
  68. package/dist/esm/components/dotplot/DotplotControls.js +106 -85
  69. package/dist/esm/components/full-page/FullPage.js +180 -124
  70. package/dist/esm/components/full-page/PlotAlert.js +39 -0
  71. package/dist/esm/components/full-page/PlotTypeSelector.js +95 -0
  72. package/dist/esm/components/heatmap/Heatmap.js +91 -60
  73. package/dist/esm/components/heatmap/HeatmapControls.js +8 -4
  74. package/dist/esm/components/icons/DotPlotIcon.js +58 -0
  75. package/dist/esm/components/icons/HeatmapIcon.js +39 -0
  76. package/dist/esm/components/icons/MatrixPlotIcon.1.js +51 -0
  77. package/dist/esm/components/icons/MatrixPlotIcon.js +53 -0
  78. package/dist/esm/components/icons/ScatterplotIcon.1.js +158 -0
  79. package/dist/esm/components/icons/ScatterplotIcon.js +138 -0
  80. package/dist/esm/components/icons/ViolinPlotIcon.js +36 -0
  81. package/dist/esm/components/matrixplot/Matrixplot.js +91 -61
  82. package/dist/esm/components/matrixplot/MatrixplotControls.js +10 -6
  83. package/dist/esm/components/obs-list/ObsItem.js +320 -228
  84. package/dist/esm/components/obs-list/ObsList.js +179 -142
  85. package/dist/esm/components/obs-list/ObsToolbar.js +3 -3
  86. package/dist/esm/components/obsm-list/ObsmList.js +71 -32
  87. package/dist/esm/components/offcanvas/index.js +68 -33
  88. package/dist/esm/components/pseudospatial/Pseudospatial.js +145 -88
  89. package/dist/esm/components/pseudospatial/PseudospatialToolbar.js +127 -78
  90. package/dist/esm/components/scatterplot/Scatterplot.js +243 -194
  91. package/dist/esm/components/scatterplot/ScatterplotControls.js +50 -35
  92. package/dist/esm/components/scatterplot/SpatialControls.js +155 -127
  93. package/dist/esm/components/scatterplot/Toolbox.js +44 -32
  94. package/dist/esm/components/search-bar/SearchBar.js +187 -130
  95. package/dist/esm/components/search-bar/SearchInfo.js +86 -91
  96. package/dist/esm/components/search-bar/SearchResults.js +100 -77
  97. package/dist/esm/components/toolbar/Toolbar.js +101 -0
  98. package/dist/esm/components/var-list/VarItem.js +142 -113
  99. package/dist/esm/components/var-list/VarList.js +108 -88
  100. package/dist/esm/components/var-list/VarListToolbar.js +64 -58
  101. package/dist/esm/components/var-list/VarSet.js +134 -115
  102. package/dist/esm/components/violin/Violin.js +135 -91
  103. package/dist/esm/components/violin/ViolinControls.js +10 -6
  104. package/dist/esm/constants/colorscales.js +19 -19
  105. package/dist/esm/constants/constants.js +53 -38
  106. package/dist/esm/context/DatasetContext.js +34 -23
  107. package/dist/esm/context/FilterContext.js +11 -8
  108. package/dist/esm/context/SettingsContext.js +341 -126
  109. package/dist/esm/context/ZarrDataContext.js +8 -6
  110. package/dist/esm/helpers/color-helper.js +5 -5
  111. package/dist/esm/helpers/map-helper.js +4 -3
  112. package/dist/esm/helpers/zarr-helper.js +6 -6
  113. package/dist/esm/index.js +22 -22
  114. package/dist/esm/utils/Filter.js +22 -17
  115. package/dist/esm/utils/Histogram.js +39 -37
  116. package/dist/esm/utils/ImageViewer.js +12 -8
  117. package/dist/esm/utils/Legend.js +44 -36
  118. package/dist/esm/utils/LoadingIndicators.js +16 -13
  119. package/dist/esm/utils/Resolver.js +201 -0
  120. package/dist/esm/utils/Skeleton.js +11 -10
  121. package/dist/esm/utils/StyledTooltip.js +38 -0
  122. package/dist/esm/utils/VirtualizedList.js +37 -29
  123. package/dist/esm/utils/errors.js +15 -15
  124. package/dist/esm/utils/requests.js +24 -12
  125. package/dist/esm/utils/search.js +7 -7
  126. package/dist/esm/utils/string.js +7 -7
  127. package/dist/esm/utils/zarrData.js +27 -28
  128. package/package.json +24 -10
  129. package/scss/cherita-bootstrap.scss +2 -2
  130. package/scss/cherita.scss +65 -17
  131. package/scss/components/accordions.scss +15 -2
  132. package/scss/components/layouts.scss +116 -30
  133. package/scss/components/lists.scss +16 -5
  134. package/scss/components/plotly.scss +40 -23
  135. package/scss/components/plots.scss +14 -1
  136. package/dist/cjs/components/full-page/FullPagePseudospatial.js +0 -157
  137. package/dist/esm/components/full-page/FullPagePseudospatial.js +0 -149
@@ -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",
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",
@@ -90,8 +102,9 @@
90
102
  "build:babel": "npm run build:esm && npm run build:cjs",
91
103
  "build:scss": "sass --load-path=node_modules src/scss/cherita-bootstrap.scss dist/css/cherita.css",
92
104
  "copy:scss": "cpx 'src/scss/**/*' 'scss'",
93
- "build": "npm run build:babel && npm run build:scss && npm run copy:scss",
94
- "test": "jest --watchAll",
105
+ "copy:assets": "cpx 'src/assets/**/*' 'dist/assets'",
106
+ "build": "npm run build:babel && npm run build:scss && npm run copy:scss && npm run copy:assets",
107
+ "test": "jest",
95
108
  "test:ci": "jest --coverage --ci --no-watch",
96
109
  "lint:scss": "stylelint 'src/**/*.scss' --fix",
97
110
  "lint:js": "eslint 'src/**/*.js' --fix",
@@ -125,5 +138,6 @@
125
138
  "bugs": {
126
139
  "url": "https://github.com/haniffalab/cherita-react/issues"
127
140
  },
128
- "homepage": "https://github.com/haniffalab/cherita-react#readme"
129
- }
141
+ "homepage": "https://github.com/haniffalab/cherita-react#readme",
142
+ "prereleaseSha": "6de4119f78f1a4b4e402b157c62c4119daab028f"
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;
@@ -58,7 +62,6 @@ $prefix: "bs-" !default;
58
62
  /* End scrollbar styling */
59
63
 
60
64
  .cherita-container-plot {
61
- margin-top: 76px;
62
65
  padding: 20px;
63
66
  position: relative;
64
67
  min-height: 400px;
@@ -116,6 +119,7 @@ $prefix: "bs-" !default;
116
119
  white-space: nowrap;
117
120
  text-overflow: ellipsis;
118
121
  pointer-events: auto;
122
+
119
123
  .legend-text {
120
124
  overflow: hidden;
121
125
  text-overflow: ellipsis;
@@ -125,7 +129,7 @@ $prefix: "bs-" !default;
125
129
  }
126
130
  }
127
131
 
128
- @media (max-width: 600px) {
132
+ @media (width <= 600px) {
129
133
  .cherita-spatial-footer {
130
134
  flex-direction: column;
131
135
  align-items: center;
@@ -152,6 +156,13 @@ $prefix: "bs-" !default;
152
156
  padding-right: 1rem;
153
157
  word-break: auto-phrase;
154
158
  overflow-wrap: anywhere;
159
+
160
+ .form-check-label {
161
+ white-space: nowrap;
162
+ overflow: hidden;
163
+ text-overflow: ellipsis;
164
+ display: block;
165
+ }
155
166
  }
156
167
 
157
168
  .grad-step {
@@ -222,13 +233,14 @@ $prefix: "bs-" !default;
222
233
  }
223
234
 
224
235
  .value-count-badge {
225
- color: #000000 !important;
236
+ color: #000 !important;
226
237
  background-color: #dedede !important;
227
238
  font-weight: lighter;
228
239
  }
229
240
 
230
241
  .filtered-value-count-badge {
231
- color: #ffffff !important;
242
+ color: #fff !important;
243
+
232
244
  // background-color: $alt-color !important;
233
245
  font-weight: normal;
234
246
  }
@@ -259,28 +271,32 @@ $gauge-padding: 0.15rem;
259
271
 
260
272
  .feature-histogram {
261
273
  @extend .feature-histogram-container;
262
- border-radius: 5px;
263
274
 
275
+ border-radius: 5px;
264
276
  background-color: #dedede;
265
277
  }
266
278
 
279
+ .feature-histogram-tooltip td > p {
280
+ font-size: 0.85rem !important;
281
+ }
282
+
283
+ /* stylelint-disable-next-line selector-class-pattern */
267
284
  .feature-histogram-tooltip .MuiChartsTooltip-markCell,
285
+ /* stylelint-disable-next-line selector-class-pattern */
268
286
  .MuiChartsTooltip-labelCell {
269
287
  display: none;
270
288
  }
271
289
 
290
+ /* stylelint-disable-next-line selector-class-pattern */
272
291
  .feature-histogram-tooltip .MuiChartsTooltip-valueCell {
273
292
  padding: 0.5rem !important;
274
293
  }
275
294
 
295
+ /* stylelint-disable-next-line selector-class-pattern */
276
296
  .feature-histogram-tooltip .MuiChartsTooltip-valueCell > p {
277
297
  font-size: 0.85rem !important;
278
298
  }
279
299
 
280
- .feature-histogram-tooltip td > p {
281
- font-size: 0.85rem !important;
282
- }
283
-
284
300
  .feature-disease-info-list {
285
301
  max-height: 300px;
286
302
  overflow-y: auto;
@@ -344,6 +360,7 @@ $gauge-padding: 0.15rem;
344
360
 
345
361
  .cherita-pseudospatial {
346
362
  width: 100%;
363
+ position: relative;
347
364
  }
348
365
 
349
366
  .cherita-pseudospatial-plot {
@@ -405,4 +422,35 @@ $gauge-padding: 0.15rem;
405
422
  white-space: nowrap;
406
423
  overflow: hidden;
407
424
  text-overflow: ellipsis;
408
- }
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,8 +1,9 @@
1
1
  .cherita-app {
2
- position: relative;
3
- }
2
+ flex-grow: 1;
3
+ display: flex;
4
+ flex-direction: column;
5
+ overflow: auto;
4
6
 
5
- .cherita-app {
6
7
  .cherita-navbar {
7
8
  @extend .m-3;
8
9
  @extend .d-block;
@@ -14,16 +15,13 @@
14
15
  left: 0;
15
16
  right: 0;
16
17
  border-radius: 0.25rem;
17
- @media (min-width: 992px) and (max-width: 1199px) {
18
- margin-left: calc(33.33333333% + 1rem) !important;
18
+
19
+ @media (width >= 992px) and (width <= 1199px) {
20
+ margin-left: calc(33.3333% + 1rem) !important;
19
21
  }
20
22
  }
21
23
  }
22
24
 
23
- .cherita-app-canvas {
24
- position: relative;
25
- }
26
-
27
25
  .cherita-app-obs {
28
26
  @extend .col;
29
27
  @extend .d-none;
@@ -39,31 +37,22 @@
39
37
  @extend .d-none;
40
38
  @extend .d-xl-flex;
41
39
 
40
+ height: 100%;
42
41
  width: 20%;
43
42
  position: relative;
44
43
 
45
44
  .card {
46
45
  width: 100%;
46
+ height: 100%;
47
47
  }
48
48
 
49
49
  .card-body {
50
- overflow-y: hidden;
51
- }
52
-
53
- .sidebar-pseudospatial {
54
- padding: 10px;
55
- border-bottom: 1px solid #dee2e6;
56
-
57
- .cherita-legend {
58
- margin: 0 auto;
59
- }
60
- }
50
+ @extend .p-0;
61
51
 
62
- .sidebar-features {
63
- padding: 10px;
64
- margin-bottom: 10px;
52
+ overflow-y: hidden;
53
+ display: flex;
54
+ flex-direction: column;
65
55
  height: 100%;
66
- overflow-y: auto;
67
56
  }
68
57
 
69
58
  .accordion-header-wrapper {
@@ -79,8 +68,8 @@
79
68
  align-items: center;
80
69
  width: 100%;
81
70
 
82
- &:after {
83
- content: "";
71
+ &::after {
72
+ content: '';
84
73
  flex-shrink: 0;
85
74
  width: var(--geeks-accordion-btn-icon-width);
86
75
  height: var(--geeks-accordion-btn-icon-width);
@@ -96,18 +85,115 @@
96
85
  color: var(--geeks-accordion-active-color);
97
86
  background-color: var(--geeks-accordion-active-bg);
98
87
 
99
- &:after {
88
+ &::after {
100
89
  background-image: var(--geeks-accordion-btn-active-icon);
101
90
  transform: var(--geeks-accordion-btn-icon-transform);
102
91
  }
103
92
  }
104
93
  }
105
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
+
106
138
  .search-modal-info {
107
139
  overflow-y: auto;
108
140
  border-left: 1px solid #dee2e6;
109
141
  }
110
142
 
111
- .ps-xs-1 {
112
- padding-left: 0.15rem !important;
113
- }
143
+ .cherita-app-canvas {
144
+ position: relative;
145
+
146
+ .cherita-plot {
147
+ position: relative;
148
+ height: 100%;
149
+ min-height: 400px;
150
+ }
151
+ }
152
+
153
+ .cherita-app-container {
154
+ @extend .p-0;
155
+
156
+ display: flex;
157
+ flex-wrap: nowrap;
158
+ width: 100%;
159
+ height: 100%;
160
+
161
+ .cherita-app-obs {
162
+ flex: 0 0 auto;
163
+ min-width: 350px;
164
+ max-width: 20%;
165
+ overflow-y: auto;
166
+ }
167
+
168
+ .cherita-app-canvas {
169
+ @extend .p-0;
170
+
171
+ flex: 1 1 auto;
172
+ min-width: 375px;
173
+ position: relative;
174
+ max-height: 100%;
175
+ display: flex;
176
+ flex-direction: column;
177
+
178
+ .cherita-navbar {
179
+ @extend .m-0;
180
+ @extend .d-block;
181
+
182
+ position: relative;
183
+ }
184
+ }
185
+
186
+ .cherita-app-sidebar {
187
+ flex: 0 0 auto;
188
+ min-width: 350px;
189
+ max-width: 20%;
190
+ position: relative;
191
+ }
192
+
193
+ @media (width <= 1400px) {
194
+ .cherita-app-obs,
195
+ .cherita-app-sidebar {
196
+ max-width: 25%;
197
+ }
198
+ }
199
+ }
@@ -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,29 +1,46 @@
1
- .js-plotly-plot .plotly .modebar {
2
- border-radius: 5px;
3
- background-color: rgba(0, 0, 0, 0.6);
4
- padding: 0 4px !important;
1
+ // Plotly modebar customisation
2
+ .js-plotly-plot {
3
+ .plotly {
4
+ .modebar {
5
+ top: 16px;
6
+ right: 0;
5
7
 
6
- .modebar-group {
7
- margin: 0 !important;
8
- padding: 0 !important;
9
- background-color: transparent !important;
8
+ // Each button group in the modebar
9
+ .modebar-group {
10
+ @extend .bg-primary;
11
+ @extend .mx-1;
10
12
 
11
- .modebar-btn {
12
- fill: white !important; /* Ensures white icons */
13
- color: white !important; /* Ensures text/icons are visible */
14
- position: relative;
15
- font-size: 16px;
16
- padding: 4px;
17
- height: auto;
18
- cursor: pointer;
19
- line-height: normal;
13
+ border-radius: 5px;
14
+ padding: 4px !important;
20
15
 
21
- svg {
22
- position: relative;
23
- top: auto;
24
- bottom: auto;
25
- left: auto;
26
- right: auto;
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;
27
+
28
+ svg {
29
+ position: relative;
30
+ top: 1px;
31
+
32
+ path {
33
+ fill: white !important;
34
+ color: white !important;
35
+ }
36
+ }
37
+ }
38
+ }
39
+
40
+ // Hover effect for modebar buttons except watermark
41
+ &--hover > :not(.watermark) {
42
+ opacity: 1;
43
+ transition: opacity 0.3s;
27
44
  }
28
45
  }
29
46
  }