@haniffalab/cherita-react 1.4.1 → 1.4.2-dev.2025-10-29.81a6b906

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 +100 -74
  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 +258 -210
  20. package/dist/cjs/components/obs-list/ObsList.js +161 -133
  21. package/dist/cjs/components/obs-list/ObsToolbar.js +2 -3
  22. package/dist/cjs/components/obsm-list/ObsmList.js +53 -38
  23. package/dist/cjs/components/offcanvas/index.js +61 -31
  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 +127 -99
  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 +168 -121
  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 +115 -88
  35. package/dist/cjs/components/var-list/VarList.js +85 -69
  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 -107
  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 +47 -47
  42. package/dist/cjs/context/DatasetContext.js +24 -16
  43. package/dist/cjs/context/FilterContext.js +11 -9
  44. package/dist/cjs/context/SettingsContext.js +255 -89
  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 +34 -27
  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 +64 -42
  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 +120 -93
  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 +273 -222
  82. package/dist/esm/components/obs-list/ObsList.js +176 -147
  83. package/dist/esm/components/obs-list/ObsToolbar.js +3 -3
  84. package/dist/esm/components/obsm-list/ObsmList.js +60 -44
  85. package/dist/esm/components/offcanvas/index.js +67 -37
  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 +148 -119
  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 +180 -132
  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 +126 -98
  97. package/dist/esm/components/var-list/VarList.js +99 -82
  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 -118
  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 +47 -47
  104. package/dist/esm/context/DatasetContext.js +31 -22
  105. package/dist/esm/context/FilterContext.js +11 -8
  106. package/dist/esm/context/SettingsContext.js +257 -90
  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 +35 -27
  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 +21 -9
  127. package/scss/cherita-bootstrap.scss +2 -2
  128. package/scss/cherita.scss +43 -17
  129. package/scss/components/accordions.scss +4 -1
  130. package/scss/components/layouts.scss +15 -33
  131. package/scss/components/lists.scss +8 -4
  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.4.1",
3
+ "version": "1.4.2-dev.2025-10-29.81a6b906",
4
4
  "author": "Haniffa Lab",
5
5
  "license": "MIT",
6
6
  "keywords": [
@@ -64,6 +64,12 @@
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",
@@ -71,19 +77,24 @@
71
77
  "babel-plugin-transform-define": "^2.1.4",
72
78
  "cpx": "^1.5.0",
73
79
  "eslint": "^8.57.1",
74
- "eslint-config-prettier": "^8.10.0",
80
+ "eslint-config-prettier": "^8.10.2",
75
81
  "eslint-config-react-app": "^7.0.1",
76
- "eslint-plugin-import": "^2.29.1",
77
- "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",
78
87
  "jest": "^29.7.0",
79
88
  "jest-environment-jsdom": "^29.7.0",
80
- "prettier": "^3.5.3",
89
+ "prettier": "^3.6.2",
81
90
  "react": "^18.2.0",
82
91
  "react-dom": "^18.2.0",
83
92
  "sass": "1.77.6",
93
+ "semantic-release": "^24.2.9",
84
94
  "stylelint": "^16.10.0",
85
95
  "stylelint-config-prettier": "^9.0.5",
86
- "stylelint-config-standard-scss": "^13.1.0"
96
+ "stylelint-config-standard-scss": "^13.1.0",
97
+ "stylelint-prettier": "^5.0.3"
87
98
  },
88
99
  "scripts": {
89
100
  "build:esm": "babel src/lib --out-dir dist/esm --copy-files --env-name esm",
@@ -93,7 +104,7 @@
93
104
  "copy:scss": "cpx 'src/scss/**/*' 'scss'",
94
105
  "copy:assets": "cpx 'src/assets/**/*' 'dist/assets'",
95
106
  "build": "npm run build:babel && npm run build:scss && npm run copy:scss && npm run copy:assets",
96
- "test": "jest --watchAll",
107
+ "test": "jest",
97
108
  "test:ci": "jest --coverage --ci --no-watch",
98
109
  "lint:scss": "stylelint 'src/**/*.scss' --fix",
99
110
  "lint:js": "eslint 'src/**/*.js' --fix",
@@ -127,5 +138,6 @@
127
138
  "bugs": {
128
139
  "url": "https://github.com/haniffalab/cherita-react/issues"
129
140
  },
130
- "homepage": "https://github.com/haniffalab/cherita-react#readme"
131
- }
141
+ "homepage": "https://github.com/haniffalab/cherita-react#readme",
142
+ "prereleaseSha": "81a6b90679f886873ce44078223c0a41d115df2d"
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;
@@ -119,6 +119,7 @@ $prefix: "bs-" !default;
119
119
  white-space: nowrap;
120
120
  text-overflow: ellipsis;
121
121
  pointer-events: auto;
122
+
122
123
  .legend-text {
123
124
  overflow: hidden;
124
125
  text-overflow: ellipsis;
@@ -128,7 +129,7 @@ $prefix: "bs-" !default;
128
129
  }
129
130
  }
130
131
 
131
- @media (max-width: 600px) {
132
+ @media (width <= 600px) {
132
133
  .cherita-spatial-footer {
133
134
  flex-direction: column;
134
135
  align-items: center;
@@ -232,13 +233,14 @@ $prefix: "bs-" !default;
232
233
  }
233
234
 
234
235
  .value-count-badge {
235
- color: #000000 !important;
236
+ color: #000 !important;
236
237
  background-color: #dedede !important;
237
238
  font-weight: lighter;
238
239
  }
239
240
 
240
241
  .filtered-value-count-badge {
241
- color: #ffffff !important;
242
+ color: #fff !important;
243
+
242
244
  // background-color: $alt-color !important;
243
245
  font-weight: normal;
244
246
  }
@@ -269,28 +271,32 @@ $gauge-padding: 0.15rem;
269
271
 
270
272
  .feature-histogram {
271
273
  @extend .feature-histogram-container;
272
- border-radius: 5px;
273
274
 
275
+ border-radius: 5px;
274
276
  background-color: #dedede;
275
277
  }
276
278
 
279
+ .feature-histogram-tooltip td > p {
280
+ font-size: 0.85rem !important;
281
+ }
282
+
283
+ /* stylelint-disable-next-line selector-class-pattern */
277
284
  .feature-histogram-tooltip .MuiChartsTooltip-markCell,
285
+ /* stylelint-disable-next-line selector-class-pattern */
278
286
  .MuiChartsTooltip-labelCell {
279
287
  display: none;
280
288
  }
281
289
 
290
+ /* stylelint-disable-next-line selector-class-pattern */
282
291
  .feature-histogram-tooltip .MuiChartsTooltip-valueCell {
283
292
  padding: 0.5rem !important;
284
293
  }
285
294
 
295
+ /* stylelint-disable-next-line selector-class-pattern */
286
296
  .feature-histogram-tooltip .MuiChartsTooltip-valueCell > p {
287
297
  font-size: 0.85rem !important;
288
298
  }
289
299
 
290
- .feature-histogram-tooltip td > p {
291
- font-size: 0.85rem !important;
292
- }
293
-
294
300
  .feature-disease-info-list {
295
301
  max-height: 300px;
296
302
  overflow-y: auto;
@@ -354,6 +360,7 @@ $gauge-padding: 0.15rem;
354
360
 
355
361
  .cherita-pseudospatial {
356
362
  width: 100%;
363
+ position: relative;
357
364
  }
358
365
 
359
366
  .cherita-pseudospatial-plot {
@@ -419,12 +426,31 @@ $gauge-padding: 0.15rem;
419
426
 
420
427
  .var-item-name {
421
428
  @extend .me-auto;
429
+
422
430
  padding-right: 0.5rem;
423
431
  white-space: nowrap;
424
432
  overflow: hidden;
425
433
  text-overflow: ellipsis;
426
434
  }
427
435
 
428
- input[type="checkbox"] {
436
+ input[type='checkbox'] {
429
437
  cursor: pointer;
430
- }
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,6 +19,7 @@
19
19
  height: 20px;
20
20
  margin-right: 10px;
21
21
  }
22
+
22
23
  .obs-accordion-header-span {
23
24
  font-size: 1rem;
24
25
  width: 100%;
@@ -36,6 +37,7 @@
36
37
  @extend .flex-nowrap;
37
38
  }
38
39
  }
40
+
39
41
  .active-icon {
40
42
  color: #0c63e4;
41
43
  }
@@ -43,5 +45,6 @@
43
45
 
44
46
  .obs-group-accordion-body {
45
47
  @extend .accordion-flush;
48
+
46
49
  padding: 0;
47
- }
50
+ }
@@ -3,9 +3,7 @@
3
3
  display: flex;
4
4
  flex-direction: column;
5
5
  overflow: auto;
6
- }
7
6
 
8
- .cherita-app {
9
7
  .cherita-navbar {
10
8
  @extend .m-3;
11
9
  @extend .d-block;
@@ -17,16 +15,13 @@
17
15
  left: 0;
18
16
  right: 0;
19
17
  border-radius: 0.25rem;
20
- @media (min-width: 992px) and (max-width: 1199px) {
21
- margin-left: calc(33.33333333% + 1rem) !important;
18
+
19
+ @media (width >= 992px) and (width <= 1199px) {
20
+ margin-left: calc(33.3333% + 1rem) !important;
22
21
  }
23
22
  }
24
23
  }
25
24
 
26
- .cherita-app-canvas {
27
- position: relative;
28
- }
29
-
30
25
  .cherita-app-obs {
31
26
  @extend .col;
32
27
  @extend .d-none;
@@ -73,8 +68,8 @@
73
68
  align-items: center;
74
69
  width: 100%;
75
70
 
76
- &:after {
77
- content: "";
71
+ &::after {
72
+ content: '';
78
73
  flex-shrink: 0;
79
74
  width: var(--geeks-accordion-btn-icon-width);
80
75
  height: var(--geeks-accordion-btn-icon-width);
@@ -90,28 +85,13 @@
90
85
  color: var(--geeks-accordion-active-color);
91
86
  background-color: var(--geeks-accordion-active-bg);
92
87
 
93
- &:after {
88
+ &::after {
94
89
  background-image: var(--geeks-accordion-btn-active-icon);
95
90
  transform: var(--geeks-accordion-btn-icon-transform);
96
91
  }
97
92
  }
98
93
  }
99
94
 
100
- .sidebar-plotselector {
101
- padding: 6px;
102
- border-bottom: 1px solid #dee2e6;
103
-
104
- .plotselector-icon {
105
- padding-bottom: 2px;
106
- cursor: pointer;
107
-
108
- .active {
109
- opacity: 1;
110
- border-bottom: 2px solid #007bff;
111
- }
112
- }
113
- }
114
-
115
95
  .sidebar-pseudospatial {
116
96
  padding: 10px;
117
97
  border-bottom: 1px solid #dee2e6;
@@ -141,6 +121,7 @@
141
121
  .offcanvas-header {
142
122
  @extend .pb-0;
143
123
  }
124
+
144
125
  .offcanvas-body {
145
126
  @extend .pt-1;
146
127
 
@@ -160,6 +141,8 @@
160
141
  }
161
142
 
162
143
  .cherita-app-canvas {
144
+ position: relative;
145
+
163
146
  .cherita-plot {
164
147
  position: relative;
165
148
  height: 100%;
@@ -169,6 +152,7 @@
169
152
 
170
153
  .cherita-app-container {
171
154
  @extend .p-0;
155
+
172
156
  display: flex;
173
157
  flex-wrap: nowrap;
174
158
  width: 100%;
@@ -182,9 +166,10 @@
182
166
  }
183
167
 
184
168
  .cherita-app-canvas {
185
- @extend .p-1;
169
+ @extend .p-0;
170
+
186
171
  flex: 1 1 auto;
187
- min-width: 400px;
172
+ min-width: 375px;
188
173
  position: relative;
189
174
  max-height: 100%;
190
175
  display: flex;
@@ -193,6 +178,7 @@
193
178
  .cherita-navbar {
194
179
  @extend .m-0;
195
180
  @extend .d-block;
181
+
196
182
  position: relative;
197
183
  }
198
184
  }
@@ -204,14 +190,10 @@
204
190
  position: relative;
205
191
  }
206
192
 
207
- @media (max-width: 1400px) {
193
+ @media (width <= 1400px) {
208
194
  .cherita-app-obs,
209
195
  .cherita-app-sidebar {
210
196
  max-width: 25%;
211
197
  }
212
198
  }
213
199
  }
214
-
215
- .ps-xs-1 {
216
- padding-left: 0.15rem !important;
217
- }
@@ -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;
@@ -14,13 +16,15 @@
14
16
  background-color: var(--#{$prefix}tertiary-bg);
15
17
  border-radius: var(--#{$prefix}border-radius);
16
18
  }
19
+
17
20
  .list-group-item.active {
18
21
  background-color: var(--#{$prefix}secondary-bg);
19
22
  }
20
23
  }
24
+
21
25
  .obs-statistics {
22
26
  border: 0;
23
- margin: 0 0.25rem 0.25rem 0.25rem;
27
+ margin: 0 0.25rem 0.25rem;
24
28
  padding: 0.375rem 0.75rem;
25
29
  line-height: 1.5;
26
30
  color: var(--#{$prefix}body-color);
@@ -29,7 +33,7 @@
29
33
  }
30
34
 
31
35
  .cherita-list.var-set-list > .list-group-item {
32
- filter: brightness(0.95); // darken background
36
+ filter: brightness(0.95);
33
37
  padding-right: 0;
34
38
  padding-left: 0.35rem;
35
39
  }
@@ -40,4 +44,4 @@
40
44
  cursor: pointer;
41
45
  }
42
46
  }
43
- }
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
- }
@@ -1,11 +1,24 @@
1
1
  .cherita-spatial-controls {
2
2
  position: absolute;
3
- z-index: 10;
4
3
  top: 1rem;
5
4
  left: 1rem;
5
+ z-index: 10;
6
6
  width: 3rem;
7
+
8
+ // Target buttons inside the controls
7
9
  .btn {
8
10
  padding-left: 0;
9
11
  padding-right: 0;
10
12
  }
11
13
  }
14
+
15
+ .plotselector {
16
+ padding: 0 10px;
17
+ border-bottom: 1px solid #dee2e6;
18
+
19
+ // Individual plot selector icons
20
+ .plotselector-icon {
21
+ padding: 6px;
22
+ cursor: pointer;
23
+ }
24
+ }