@haniffalab/cherita-react 1.4.1-dev.2025-10-20.528e0f75 → 1.4.1-dev.2025-10-22.61540191
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/cjs/components/dotplot/Dotplot.js +23 -15
- package/dist/cjs/components/full-page/FullPage.js +32 -30
- package/dist/cjs/components/full-page/PlotAlert.js +36 -0
- package/dist/cjs/components/full-page/PlotTypeSelector.js +77 -39
- package/dist/cjs/components/heatmap/Heatmap.js +23 -15
- package/dist/cjs/components/icons/DotPlotIcon.js +58 -0
- package/dist/cjs/components/icons/HeatmapIcon.js +39 -0
- package/dist/cjs/components/icons/MatrixPlotIcon.1.js +51 -0
- package/dist/cjs/components/icons/MatrixPlotIcon.js +53 -0
- package/dist/cjs/components/icons/ScatterplotIcon.1.js +158 -0
- package/dist/cjs/components/icons/ScatterplotIcon.js +138 -0
- package/dist/cjs/components/icons/ViolinPlotIcon.js +34 -0
- package/dist/cjs/components/matrixplot/Matrixplot.js +25 -17
- package/dist/cjs/components/pseudospatial/Pseudospatial.js +64 -25
- package/dist/cjs/components/pseudospatial/PseudospatialToolbar.js +63 -15
- package/dist/cjs/components/violin/Violin.js +41 -30
- package/dist/cjs/context/DatasetContext.js +1 -1
- package/dist/cjs/context/SettingsContext.js +27 -3
- package/dist/cjs/utils/StyledTooltip.js +39 -0
- package/dist/css/cherita.css +37 -22
- package/dist/css/cherita.css.map +1 -1
- package/dist/esm/components/dotplot/Dotplot.js +22 -13
- package/dist/esm/components/full-page/FullPage.js +6 -3
- package/dist/esm/components/full-page/PlotAlert.js +30 -0
- package/dist/esm/components/full-page/PlotTypeSelector.js +76 -38
- package/dist/esm/components/heatmap/Heatmap.js +22 -13
- package/dist/esm/components/icons/DotPlotIcon.js +52 -0
- package/dist/esm/components/icons/HeatmapIcon.js +33 -0
- package/dist/esm/components/icons/MatrixPlotIcon.1.js +45 -0
- package/dist/esm/components/icons/MatrixPlotIcon.js +47 -0
- package/dist/esm/components/icons/ScatterplotIcon.1.js +152 -0
- package/dist/esm/components/icons/ScatterplotIcon.js +132 -0
- package/dist/esm/components/icons/ViolinPlotIcon.js +28 -0
- package/dist/esm/components/matrixplot/Matrixplot.js +24 -15
- package/dist/esm/components/pseudospatial/Pseudospatial.js +58 -18
- package/dist/esm/components/pseudospatial/PseudospatialToolbar.js +52 -4
- package/dist/esm/components/violin/Violin.js +36 -24
- package/dist/esm/context/DatasetContext.js +1 -1
- package/dist/esm/context/SettingsContext.js +27 -3
- package/dist/esm/utils/StyledTooltip.js +33 -0
- package/package.json +2 -2
- package/scss/cherita.scss +19 -1
- package/scss/components/layouts.scss +2 -21
- package/scss/components/plotly.scss +37 -26
- package/scss/components/plots.scss +14 -1
- package/dist/assets/images/plots/dotplot.svg +0 -152
- package/dist/assets/images/plots/heatmap.svg +0 -193
- package/dist/assets/images/plots/matrixplot.svg +0 -275
- package/dist/assets/images/plots/scatterplot.svg +0 -198
- package/dist/assets/images/plots/violin.svg +0 -50
|
@@ -4,7 +4,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.Dotplot = Dotplot;
|
|
7
|
-
var _react =
|
|
7
|
+
var _react = require("react");
|
|
8
8
|
var _lodash = _interopRequireDefault(require("lodash"));
|
|
9
9
|
var _reactBootstrap = require("react-bootstrap");
|
|
10
10
|
var _reactPlotly = _interopRequireDefault(require("react-plotly.js"));
|
|
@@ -15,9 +15,9 @@ var _SettingsContext = require("../../context/SettingsContext");
|
|
|
15
15
|
var _LoadingIndicators = require("../../utils/LoadingIndicators");
|
|
16
16
|
var _requests = require("../../utils/requests");
|
|
17
17
|
var _Resolver = require("../../utils/Resolver");
|
|
18
|
+
var _PlotAlert = require("../full-page/PlotAlert");
|
|
18
19
|
var _Toolbar = require("../toolbar/Toolbar");
|
|
19
20
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
20
|
-
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
21
21
|
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
22
22
|
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
23
23
|
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
|
@@ -30,7 +30,9 @@ function Dotplot(_ref) {
|
|
|
30
30
|
showCtrlsBtn = false,
|
|
31
31
|
setShowObs,
|
|
32
32
|
setShowVars,
|
|
33
|
-
setShowControls
|
|
33
|
+
setShowControls,
|
|
34
|
+
plotType,
|
|
35
|
+
setPlotType
|
|
34
36
|
} = _ref;
|
|
35
37
|
const ENDPOINT = "dotplot";
|
|
36
38
|
const dataset = (0, _DatasetContext.useDataset)();
|
|
@@ -142,9 +144,9 @@ function Dotplot(_ref) {
|
|
|
142
144
|
const modeBarButtons = customModeBarButtons.length ? [customModeBarButtons, _constants.PLOTLY_MODEBAR_BUTTONS] : [_constants.PLOTLY_MODEBAR_BUTTONS];
|
|
143
145
|
if (!serverError) {
|
|
144
146
|
if (hasSelections) {
|
|
145
|
-
return /*#__PURE__*/
|
|
147
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
146
148
|
className: "cherita-plot cherita-dotplot position-relative"
|
|
147
|
-
}, isPending && /*#__PURE__*/
|
|
149
|
+
}, isPending && /*#__PURE__*/React.createElement(_LoadingIndicators.LoadingSpinner, null), /*#__PURE__*/React.createElement(_reactPlotly.default, {
|
|
148
150
|
data: data,
|
|
149
151
|
layout: layout,
|
|
150
152
|
useResizeHandler: true,
|
|
@@ -158,22 +160,28 @@ function Dotplot(_ref) {
|
|
|
158
160
|
}
|
|
159
161
|
}));
|
|
160
162
|
}
|
|
161
|
-
return /*#__PURE__*/
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
163
|
+
return /*#__PURE__*/React.createElement(_PlotAlert.PlotAlert, {
|
|
164
|
+
variant: "info",
|
|
165
|
+
heading: "Dotplot",
|
|
166
|
+
plotType: plotType,
|
|
167
|
+
setPlotType: setPlotType
|
|
168
|
+
}, /*#__PURE__*/React.createElement("p", {
|
|
169
|
+
className: "p-0 m-0"
|
|
170
|
+
}, "Select one or more", " ", showVarsBtn ? /*#__PURE__*/React.createElement(_reactBootstrap.Button, {
|
|
166
171
|
variant: "link",
|
|
167
172
|
className: "border-0 p-0 align-baseline",
|
|
168
173
|
onClick: setShowVars
|
|
169
|
-
}, "features") : "features", " ", "
|
|
174
|
+
}, "features") : "features", " ", "to display their expression across groups, then choose a", " ", showObsBtn ? /*#__PURE__*/React.createElement(_reactBootstrap.Button, {
|
|
170
175
|
variant: "link",
|
|
171
176
|
className: "border-0 p-0 align-baseline",
|
|
172
177
|
onClick: setShowObs
|
|
173
|
-
}, "category") : "category"));
|
|
178
|
+
}, "category") : "category", " ", "to group observations in the dotplot."));
|
|
174
179
|
} else {
|
|
175
|
-
return /*#__PURE__*/
|
|
176
|
-
variant: "danger"
|
|
177
|
-
|
|
180
|
+
return /*#__PURE__*/React.createElement(_PlotAlert.PlotAlert, {
|
|
181
|
+
variant: "danger",
|
|
182
|
+
heading: "Dotplot",
|
|
183
|
+
plotType: plotType,
|
|
184
|
+
setPlotType: setPlotType
|
|
185
|
+
}, serverError.message || "An unexpected error occurred while generating the plot.");
|
|
178
186
|
}
|
|
179
187
|
}
|
|
@@ -4,7 +4,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.FullPage = FullPage;
|
|
7
|
-
var _react =
|
|
7
|
+
var _react = require("react");
|
|
8
8
|
var _material = require("@mui/material");
|
|
9
9
|
var _reactBootstrap = require("react-bootstrap");
|
|
10
10
|
var _constants = require("../../constants/constants");
|
|
@@ -27,7 +27,6 @@ var _VarList = require("../var-list/VarList");
|
|
|
27
27
|
var _Violin = require("../violin/Violin");
|
|
28
28
|
var _ViolinControls = require("../violin/ViolinControls");
|
|
29
29
|
const _excluded = ["searchDiseases", "defaultPlotType"];
|
|
30
|
-
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
31
30
|
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
|
|
32
31
|
function _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }
|
|
33
32
|
function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }
|
|
@@ -55,6 +54,7 @@ function FullPage(_ref) {
|
|
|
55
54
|
const XlBreakpoint = (0, _material.useMediaQuery)(_constants.BREAKPOINTS.XL);
|
|
56
55
|
const showObsBtn = LgBreakpoint;
|
|
57
56
|
const showVarsBtn = XlBreakpoint;
|
|
57
|
+
const showPlotBtn = showVarsBtn;
|
|
58
58
|
const {
|
|
59
59
|
plotControls,
|
|
60
60
|
varMode,
|
|
@@ -91,85 +91,87 @@ function FullPage(_ref) {
|
|
|
91
91
|
showObsBtn,
|
|
92
92
|
showVarsBtn,
|
|
93
93
|
showCtrlsBtn: true,
|
|
94
|
+
plotType,
|
|
94
95
|
setShowObs,
|
|
95
96
|
setShowVars,
|
|
96
|
-
setShowControls
|
|
97
|
+
setShowControls,
|
|
98
|
+
setPlotType
|
|
97
99
|
};
|
|
98
100
|
switch (plotType) {
|
|
99
101
|
case _constants.PLOT_TYPES.DOTPLOT:
|
|
100
|
-
return /*#__PURE__*/
|
|
102
|
+
return /*#__PURE__*/React.createElement(_Dotplot.Dotplot, commonProps);
|
|
101
103
|
case _constants.PLOT_TYPES.MATRIXPLOT:
|
|
102
|
-
return /*#__PURE__*/
|
|
104
|
+
return /*#__PURE__*/React.createElement(_Matrixplot.Matrixplot, commonProps);
|
|
103
105
|
case _constants.PLOT_TYPES.HEATMAP:
|
|
104
|
-
return /*#__PURE__*/
|
|
106
|
+
return /*#__PURE__*/React.createElement(_Heatmap.Heatmap, commonProps);
|
|
105
107
|
case _constants.PLOT_TYPES.VIOLINPLOT:
|
|
106
|
-
return /*#__PURE__*/
|
|
108
|
+
return /*#__PURE__*/React.createElement(_Violin.Violin, _extends({
|
|
107
109
|
mode: _constants.VIOLIN_MODES.MULTIKEY
|
|
108
110
|
}, commonProps));
|
|
109
111
|
case _constants.PLOT_TYPES.SCATTERPLOT:
|
|
110
112
|
default:
|
|
111
|
-
return /*#__PURE__*/
|
|
113
|
+
return /*#__PURE__*/React.createElement(_Scatterplot.Scatterplot, _extends({}, commonProps, {
|
|
112
114
|
isFullscreen: true
|
|
113
115
|
}));
|
|
114
116
|
}
|
|
115
117
|
}, [plotType, showObsBtn, showVarsBtn]);
|
|
116
|
-
return /*#__PURE__*/
|
|
118
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
117
119
|
className: "cherita-app"
|
|
118
|
-
}, /*#__PURE__*/
|
|
120
|
+
}, /*#__PURE__*/React.createElement(_DatasetContext.DatasetProvider, props, /*#__PURE__*/React.createElement(_reactBootstrap.Container, {
|
|
119
121
|
fluid: true,
|
|
120
122
|
className: "cherita-app-container"
|
|
121
|
-
}, /*#__PURE__*/
|
|
123
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
122
124
|
className: "cherita-app-obs modern-scrollbars border-end h-100"
|
|
123
|
-
}, /*#__PURE__*/
|
|
125
|
+
}, /*#__PURE__*/React.createElement(_ObsList.ObsColsList, _extends({}, props, {
|
|
124
126
|
showSelectedAsActive: showSelectedAsActive,
|
|
125
127
|
showHistograms: varMode === _constants.SELECTION_MODES.SINGLE,
|
|
126
128
|
showColor: varMode === _constants.SELECTION_MODES.SINGLE
|
|
127
|
-
}))), /*#__PURE__*/
|
|
129
|
+
}))), /*#__PURE__*/React.createElement("div", {
|
|
128
130
|
className: "cherita-app-canvas"
|
|
129
|
-
}, plot), /*#__PURE__*/
|
|
131
|
+
}, plot), /*#__PURE__*/React.createElement("div", {
|
|
130
132
|
className: "cherita-app-sidebar p-3"
|
|
131
|
-
}, /*#__PURE__*/
|
|
132
|
-
className: "
|
|
133
|
-
}, /*#__PURE__*/
|
|
133
|
+
}, /*#__PURE__*/React.createElement(_reactBootstrap.Card, null, /*#__PURE__*/React.createElement(_reactBootstrap.Card.Body, null, /*#__PURE__*/React.createElement("div", {
|
|
134
|
+
className: "plotselector"
|
|
135
|
+
}, /*#__PURE__*/React.createElement(_PlotTypeSelector.PlotTypeSelector, {
|
|
134
136
|
currentType: plotType,
|
|
135
137
|
onChange: type => setPlotType(type)
|
|
136
|
-
})), plotType === _constants.PLOT_TYPES.SCATTERPLOT && isPseudospatial ? /*#__PURE__*/
|
|
138
|
+
})), plotType === _constants.PLOT_TYPES.SCATTERPLOT && isPseudospatial ? /*#__PURE__*/React.createElement("div", {
|
|
137
139
|
className: "sidebar-pseudospatial"
|
|
138
|
-
}, /*#__PURE__*/
|
|
140
|
+
}, /*#__PURE__*/React.createElement(_Pseudospatial.Pseudospatial, {
|
|
139
141
|
plotType: pseudospatialPlotType,
|
|
140
142
|
setPlotType: setpseudospatialPlotType,
|
|
141
143
|
setShowControls: setShowPseudospatialControls
|
|
142
|
-
})) : /*#__PURE__*/
|
|
144
|
+
})) : /*#__PURE__*/React.createElement(React.Fragment, null), /*#__PURE__*/React.createElement("div", {
|
|
143
145
|
className: "sidebar-features"
|
|
144
|
-
}, /*#__PURE__*/
|
|
146
|
+
}, /*#__PURE__*/React.createElement(_SearchBar.SearchBar, {
|
|
145
147
|
searchDiseases: searchDiseases,
|
|
146
148
|
searchVar: true
|
|
147
|
-
}), /*#__PURE__*/
|
|
149
|
+
}), /*#__PURE__*/React.createElement("div", {
|
|
148
150
|
className: "sidebar-features-list"
|
|
149
|
-
}, /*#__PURE__*/
|
|
151
|
+
}, /*#__PURE__*/React.createElement(_VarList.VarNamesList, {
|
|
150
152
|
mode: varMode
|
|
151
|
-
}))))))), /*#__PURE__*/
|
|
153
|
+
}))))))), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(_reactBootstrap.Modal, {
|
|
152
154
|
show: showModal,
|
|
153
155
|
onHide: () => setShowModal(false),
|
|
154
156
|
centered: true
|
|
155
|
-
}, /*#__PURE__*/
|
|
157
|
+
}, /*#__PURE__*/React.createElement(_reactBootstrap.Modal.Header, {
|
|
156
158
|
closeButton: true
|
|
157
|
-
}), /*#__PURE__*/
|
|
159
|
+
}), /*#__PURE__*/React.createElement(_reactBootstrap.Modal.Body, null)), /*#__PURE__*/React.createElement(_offcanvas.OffcanvasObs, _extends({}, props, {
|
|
158
160
|
showSelectedAsActive: showSelectedAsActive,
|
|
159
161
|
show: showObs,
|
|
160
162
|
handleClose: () => setShowObs(false)
|
|
161
|
-
})), /*#__PURE__*/
|
|
163
|
+
})), /*#__PURE__*/React.createElement(_offcanvas.OffcanvasVars, {
|
|
162
164
|
show: showVars,
|
|
163
165
|
handleClose: () => setShowVars(false),
|
|
164
166
|
mode: varMode
|
|
165
|
-
}), plotControls && /*#__PURE__*/
|
|
167
|
+
}), plotControls && /*#__PURE__*/React.createElement(_offcanvas.OffcanvasControls, {
|
|
166
168
|
show: showControls,
|
|
167
169
|
handleClose: () => setShowControls(false),
|
|
168
170
|
Controls: plotControls
|
|
169
|
-
}), /*#__PURE__*/
|
|
171
|
+
}), /*#__PURE__*/React.createElement(_offcanvas.OffcanvasObsm, {
|
|
170
172
|
show: showObsm,
|
|
171
173
|
handleClose: () => setShowObsm(false)
|
|
172
|
-
}), /*#__PURE__*/
|
|
174
|
+
}), /*#__PURE__*/React.createElement(_offcanvas.OffcanvasControls, {
|
|
173
175
|
show: showPseudospatialControls,
|
|
174
176
|
handleClose: () => setShowPseudospatialControls(false),
|
|
175
177
|
Controls: _PseudospatialToolbar.PseudospatialToolbar,
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.PlotAlert = PlotAlert;
|
|
7
|
+
var _material = require("@mui/material");
|
|
8
|
+
var _reactBootstrap = require("react-bootstrap");
|
|
9
|
+
var _constants = require("../../constants/constants");
|
|
10
|
+
var _PlotTypeSelector = require("./PlotTypeSelector");
|
|
11
|
+
function PlotAlert(_ref) {
|
|
12
|
+
let {
|
|
13
|
+
variant = "warning",
|
|
14
|
+
plotType = _constants.PLOT_TYPES.SCATTERPLOT,
|
|
15
|
+
setPlotType,
|
|
16
|
+
heading,
|
|
17
|
+
children
|
|
18
|
+
} = _ref;
|
|
19
|
+
const XlBreakpoint = (0, _material.useMediaQuery)(_constants.BREAKPOINTS.XL);
|
|
20
|
+
const showPlotSelector = XlBreakpoint;
|
|
21
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, showPlotSelector && /*#__PURE__*/React.createElement("div", {
|
|
22
|
+
className: "plotselector"
|
|
23
|
+
}, /*#__PURE__*/React.createElement(_PlotTypeSelector.PlotTypeSelector, {
|
|
24
|
+
currentType: plotType,
|
|
25
|
+
onChange: type => {
|
|
26
|
+
if (setPlotType) setPlotType(type);
|
|
27
|
+
}
|
|
28
|
+
})), /*#__PURE__*/React.createElement("div", {
|
|
29
|
+
className: "cherita-plot-alert h-100"
|
|
30
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
31
|
+
className: "w-100 h-100 d-flex justify-content-center align-items-center"
|
|
32
|
+
}, /*#__PURE__*/React.createElement(_reactBootstrap.Alert, {
|
|
33
|
+
variant: variant,
|
|
34
|
+
className: "m-0 w-75 w-lg-50 text-center"
|
|
35
|
+
}, heading && /*#__PURE__*/React.createElement(_reactBootstrap.Alert.Heading, null, heading), " ", children))));
|
|
36
|
+
}
|
|
@@ -4,54 +4,92 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.PlotTypeSelector = PlotTypeSelector;
|
|
7
|
-
var _react =
|
|
8
|
-
var _dotplot = _interopRequireDefault(require("../../../assets/images/plots/dotplot.svg"));
|
|
9
|
-
var _heatmap = _interopRequireDefault(require("../../../assets/images/plots/heatmap.svg"));
|
|
10
|
-
var _matrixplot = _interopRequireDefault(require("../../../assets/images/plots/matrixplot.svg"));
|
|
11
|
-
var _scatterplot = _interopRequireDefault(require("../../../assets/images/plots/scatterplot.svg"));
|
|
12
|
-
var _violin = _interopRequireDefault(require("../../../assets/images/plots/violin.svg"));
|
|
7
|
+
var _react = require("react");
|
|
13
8
|
var _constants = require("../../constants/constants");
|
|
9
|
+
var _StyledTooltip = require("../../utils/StyledTooltip");
|
|
10
|
+
var _DotPlotIcon = _interopRequireDefault(require("../icons/DotPlotIcon"));
|
|
11
|
+
var _HeatmapIcon = _interopRequireDefault(require("../icons/HeatmapIcon"));
|
|
12
|
+
var _MatrixPlotIcon = _interopRequireDefault(require("../icons/MatrixPlotIcon"));
|
|
13
|
+
var _ScatterplotIcon = _interopRequireDefault(require("../icons/ScatterplotIcon"));
|
|
14
|
+
var _ViolinPlotIcon = _interopRequireDefault(require("../icons/ViolinPlotIcon"));
|
|
14
15
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
16
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
17
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
18
|
+
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
|
19
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
|
|
20
|
+
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
21
|
+
const plotTypes = [{
|
|
22
|
+
type: _constants.PLOT_TYPES.SCATTERPLOT,
|
|
23
|
+
icon: _ScatterplotIcon.default,
|
|
24
|
+
name: "Scatterplot",
|
|
25
|
+
description: "Displays cells in 2D based on dimensionality reduction."
|
|
26
|
+
}, {
|
|
27
|
+
type: _constants.PLOT_TYPES.MATRIXPLOT,
|
|
28
|
+
icon: _MatrixPlotIcon.default,
|
|
29
|
+
name: "Matrix Plot",
|
|
30
|
+
description: "Shows expression values of genes across categories."
|
|
31
|
+
}, {
|
|
32
|
+
type: _constants.PLOT_TYPES.DOTPLOT,
|
|
33
|
+
icon: _DotPlotIcon.default,
|
|
34
|
+
name: "Dot Plot",
|
|
35
|
+
description: "Shows proportion and expression of genes across groups."
|
|
36
|
+
}, {
|
|
37
|
+
type: _constants.PLOT_TYPES.HEATMAP,
|
|
38
|
+
icon: _HeatmapIcon.default,
|
|
39
|
+
name: "Heatmap",
|
|
40
|
+
description: "Visualises gene expression or feature activity as a colour-coded matrix."
|
|
41
|
+
}, {
|
|
42
|
+
type: _constants.PLOT_TYPES.VIOLINPLOT,
|
|
43
|
+
icon: _ViolinPlotIcon.default,
|
|
44
|
+
name: "Violin Plot",
|
|
45
|
+
description: "Displays distribution of gene expression across categories."
|
|
46
|
+
}];
|
|
47
|
+
function PlotTypeSelector(_ref) {
|
|
31
48
|
let {
|
|
32
49
|
currentType,
|
|
33
50
|
onChange
|
|
34
|
-
} =
|
|
35
|
-
|
|
51
|
+
} = _ref;
|
|
52
|
+
const [hoveredMap, setHoveredMap] = (0, _react.useState)({});
|
|
53
|
+
const handleMouseEnter = type => setHoveredMap(prev => _objectSpread(_objectSpread({}, prev), {}, {
|
|
54
|
+
[type]: true
|
|
55
|
+
}));
|
|
56
|
+
const handleMouseLeave = type => setHoveredMap(prev => _objectSpread(_objectSpread({}, prev), {}, {
|
|
57
|
+
[type]: false
|
|
58
|
+
}));
|
|
59
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
36
60
|
className: "d-flex gap-2 justify-content-between"
|
|
37
|
-
}, plotTypes.map(
|
|
61
|
+
}, plotTypes.map(_ref2 => {
|
|
38
62
|
let {
|
|
39
63
|
type,
|
|
40
|
-
icon,
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
64
|
+
icon: Icon,
|
|
65
|
+
name,
|
|
66
|
+
description
|
|
67
|
+
} = _ref2;
|
|
68
|
+
const isActive = currentType === type;
|
|
69
|
+
const hovered = hoveredMap[type] || false;
|
|
70
|
+
const colour = isActive ? "#005a86" : hovered ? "#0071a7" : "#000";
|
|
71
|
+
return /*#__PURE__*/React.createElement(_StyledTooltip.StyledTooltip, {
|
|
44
72
|
key: type,
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
73
|
+
title: /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("strong", null, name), /*#__PURE__*/React.createElement("br", null), description),
|
|
74
|
+
placement: "bottom",
|
|
75
|
+
slotProps: {
|
|
76
|
+
popper: {
|
|
77
|
+
modifiers: [{
|
|
78
|
+
name: "offset",
|
|
79
|
+
options: {
|
|
80
|
+
offset: [0, -12]
|
|
81
|
+
}
|
|
82
|
+
}]
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
86
|
+
onMouseEnter: () => handleMouseEnter(type),
|
|
87
|
+
onMouseLeave: () => handleMouseLeave(type),
|
|
50
88
|
onClick: () => onChange(type),
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
});
|
|
89
|
+
className: "plotselector-icon".concat(isActive ? " active" : "")
|
|
90
|
+
}, /*#__PURE__*/React.createElement(Icon, {
|
|
91
|
+
size: 34,
|
|
92
|
+
colour: colour
|
|
93
|
+
})));
|
|
56
94
|
}));
|
|
57
95
|
}
|
|
@@ -4,7 +4,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.Heatmap = Heatmap;
|
|
7
|
-
var _react =
|
|
7
|
+
var _react = require("react");
|
|
8
8
|
var _lodash = _interopRequireDefault(require("lodash"));
|
|
9
9
|
var _reactBootstrap = require("react-bootstrap");
|
|
10
10
|
var _reactPlotly = _interopRequireDefault(require("react-plotly.js"));
|
|
@@ -15,9 +15,9 @@ var _SettingsContext = require("../../context/SettingsContext");
|
|
|
15
15
|
var _LoadingIndicators = require("../../utils/LoadingIndicators");
|
|
16
16
|
var _requests = require("../../utils/requests");
|
|
17
17
|
var _Resolver = require("../../utils/Resolver");
|
|
18
|
+
var _PlotAlert = require("../full-page/PlotAlert");
|
|
18
19
|
var _Toolbar = require("../toolbar/Toolbar");
|
|
19
20
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
20
|
-
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
21
21
|
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
22
22
|
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
23
23
|
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
|
@@ -30,7 +30,9 @@ function Heatmap(_ref) {
|
|
|
30
30
|
showCtrlsBtn = false,
|
|
31
31
|
setShowObs,
|
|
32
32
|
setShowVars,
|
|
33
|
-
setShowControls
|
|
33
|
+
setShowControls,
|
|
34
|
+
plotType,
|
|
35
|
+
setPlotType
|
|
34
36
|
} = _ref;
|
|
35
37
|
const ENDPOINT = "heatmap";
|
|
36
38
|
const dataset = (0, _DatasetContext.useDataset)();
|
|
@@ -113,9 +115,9 @@ function Heatmap(_ref) {
|
|
|
113
115
|
const modeBarButtons = customModeBarButtons.length ? [customModeBarButtons, _constants.PLOTLY_MODEBAR_BUTTONS] : [_constants.PLOTLY_MODEBAR_BUTTONS];
|
|
114
116
|
if (!serverError) {
|
|
115
117
|
if (hasSelections) {
|
|
116
|
-
return /*#__PURE__*/
|
|
118
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
117
119
|
className: "cherita-plot cherita-heatmap position-relative"
|
|
118
|
-
}, isPending && /*#__PURE__*/
|
|
120
|
+
}, isPending && /*#__PURE__*/React.createElement(_LoadingIndicators.LoadingSpinner, null), /*#__PURE__*/React.createElement(_reactPlotly.default, {
|
|
119
121
|
data: data,
|
|
120
122
|
layout: layout,
|
|
121
123
|
useResizeHandler: true,
|
|
@@ -129,22 +131,28 @@ function Heatmap(_ref) {
|
|
|
129
131
|
}
|
|
130
132
|
}));
|
|
131
133
|
}
|
|
132
|
-
return /*#__PURE__*/
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
134
|
+
return /*#__PURE__*/React.createElement(_PlotAlert.PlotAlert, {
|
|
135
|
+
variant: "info",
|
|
136
|
+
heading: "Heatmap",
|
|
137
|
+
plotType: plotType,
|
|
138
|
+
setPlotType: setPlotType
|
|
139
|
+
}, /*#__PURE__*/React.createElement("p", {
|
|
140
|
+
className: "p-0 m-0"
|
|
141
|
+
}, "Select one or more", " ", showVarsBtn ? /*#__PURE__*/React.createElement(_reactBootstrap.Button, {
|
|
137
142
|
variant: "link",
|
|
138
143
|
className: "border-0 p-0 align-baseline",
|
|
139
144
|
onClick: setShowVars
|
|
140
|
-
}, "features") : "features", " ", "
|
|
145
|
+
}, "features") : "features", " ", "to display their expression, then choose a", " ", showObsBtn ? /*#__PURE__*/React.createElement(_reactBootstrap.Button, {
|
|
141
146
|
variant: "link",
|
|
142
147
|
className: "border-0 p-0 align-baseline",
|
|
143
148
|
onClick: setShowObs
|
|
144
|
-
}, "category") : "category"));
|
|
149
|
+
}, "category") : "category", " ", "to group observations in the heatmap."));
|
|
145
150
|
} else {
|
|
146
|
-
return /*#__PURE__*/
|
|
147
|
-
variant: "danger"
|
|
148
|
-
|
|
151
|
+
return /*#__PURE__*/React.createElement(_PlotAlert.PlotAlert, {
|
|
152
|
+
variant: "danger",
|
|
153
|
+
heading: "Heatmap",
|
|
154
|
+
plotType: plotType,
|
|
155
|
+
setPlotType: setPlotType
|
|
156
|
+
}, serverError.message || "An unexpected error occurred while generating the plot.");
|
|
149
157
|
}
|
|
150
158
|
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = DotPlotIcon;
|
|
7
|
+
const _excluded = ["size", "colour", "gap"];
|
|
8
|
+
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
|
|
9
|
+
function _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }
|
|
10
|
+
function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }
|
|
11
|
+
function DotPlotIcon(_ref) {
|
|
12
|
+
let {
|
|
13
|
+
size = 40,
|
|
14
|
+
colour = "#000",
|
|
15
|
+
gap = 20
|
|
16
|
+
} = _ref,
|
|
17
|
+
props = _objectWithoutProperties(_ref, _excluded);
|
|
18
|
+
const rows = 3;
|
|
19
|
+
const cols = 3;
|
|
20
|
+
|
|
21
|
+
// Define two radii: small and large
|
|
22
|
+
const smallR = 10;
|
|
23
|
+
const largeR = 16;
|
|
24
|
+
|
|
25
|
+
// Indices for large circles
|
|
26
|
+
const largeIndices = [1, 4, 5, 6, 7];
|
|
27
|
+
|
|
28
|
+
// Indices for semi-transparent circles
|
|
29
|
+
const semiTransparentIndices = [0, 4, 8];
|
|
30
|
+
const circles = [];
|
|
31
|
+
for (let row = 0; row < rows; row++) {
|
|
32
|
+
for (let col = 0; col < cols; col++) {
|
|
33
|
+
const index = row * cols + col;
|
|
34
|
+
const r = largeIndices.includes(index) ? largeR : smallR;
|
|
35
|
+
circles.push({
|
|
36
|
+
cx: col * (2 * largeR + gap) + largeR,
|
|
37
|
+
cy: row * (2 * largeR + gap) + largeR,
|
|
38
|
+
r,
|
|
39
|
+
fill: colour,
|
|
40
|
+
fillOpacity: semiTransparentIndices.includes(index) ? 0.5 : 1
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
const viewBoxSize = (cols - 1) * (2 * largeR + gap) + 2 * largeR;
|
|
45
|
+
return /*#__PURE__*/React.createElement("svg", _extends({
|
|
46
|
+
width: size,
|
|
47
|
+
height: size,
|
|
48
|
+
viewBox: "0 0 ".concat(viewBoxSize, " ").concat(viewBoxSize),
|
|
49
|
+
xmlns: "http://www.w3.org/2000/svg"
|
|
50
|
+
}, props), circles.map((circle, i) => /*#__PURE__*/React.createElement("circle", {
|
|
51
|
+
key: i,
|
|
52
|
+
cx: circle.cx,
|
|
53
|
+
cy: circle.cy,
|
|
54
|
+
r: circle.r,
|
|
55
|
+
fill: circle.fill,
|
|
56
|
+
fillOpacity: circle.fillOpacity
|
|
57
|
+
})));
|
|
58
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = HeatmapIcon;
|
|
7
|
+
const _excluded = ["size", "colour", "gap"];
|
|
8
|
+
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
|
|
9
|
+
function _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }
|
|
10
|
+
function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }
|
|
11
|
+
function HeatmapIcon(_ref) {
|
|
12
|
+
let {
|
|
13
|
+
size = 40,
|
|
14
|
+
colour = "#000",
|
|
15
|
+
gap = 1
|
|
16
|
+
} = _ref,
|
|
17
|
+
props = _objectWithoutProperties(_ref, _excluded);
|
|
18
|
+
const rows = 6; // genes
|
|
19
|
+
const cols = 8; // cells
|
|
20
|
+
|
|
21
|
+
// Example expression pattern for visual clusters
|
|
22
|
+
const expressionLevels = [[1, 0.8, 0.2, 0.2, 0.5, 0.9, 1, 0.7], [0.9, 0.7, 0.1, 0.2, 0.4, 0.8, 0.9, 0.6], [0.1, 0.2, 0.8, 0.9, 0.7, 0.2, 0.1, 0.3], [0.2, 0.3, 0.9, 1, 0.8, 0.3, 0.2, 0.4], [0.5, 0.6, 0.2, 0.1, 0.9, 0.7, 0.6, 0.8], [0.6, 0.7, 0.3, 0.2, 0.8, 0.6, 0.7, 0.9]];
|
|
23
|
+
const cellWidth = (size - (cols - 1) * gap) / cols;
|
|
24
|
+
const cellHeight = (size - (rows - 1) * gap) / rows;
|
|
25
|
+
return /*#__PURE__*/React.createElement("svg", _extends({
|
|
26
|
+
width: size,
|
|
27
|
+
height: size,
|
|
28
|
+
viewBox: "0 0 ".concat(size, " ").concat(size),
|
|
29
|
+
xmlns: "http://www.w3.org/2000/svg"
|
|
30
|
+
}, props), expressionLevels.map((row, rowIndex) => row.map((value, colIndex) => /*#__PURE__*/React.createElement("rect", {
|
|
31
|
+
key: "".concat(rowIndex, "-").concat(colIndex),
|
|
32
|
+
x: colIndex * (cellWidth + gap),
|
|
33
|
+
y: rowIndex * (cellHeight + gap),
|
|
34
|
+
width: cellWidth,
|
|
35
|
+
height: cellHeight,
|
|
36
|
+
fill: colour,
|
|
37
|
+
fillOpacity: value
|
|
38
|
+
}))));
|
|
39
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = MatrixPlotIcon;
|
|
7
|
+
const _excluded = ["size", "colour", "gap"];
|
|
8
|
+
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
|
|
9
|
+
function _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }
|
|
10
|
+
function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }
|
|
11
|
+
function MatrixPlotIcon(_ref) {
|
|
12
|
+
let {
|
|
13
|
+
size = 40,
|
|
14
|
+
colour = "#000",
|
|
15
|
+
gap = 2
|
|
16
|
+
} = _ref,
|
|
17
|
+
props = _objectWithoutProperties(_ref, _excluded);
|
|
18
|
+
const rows = 4;
|
|
19
|
+
const cols = 4;
|
|
20
|
+
const squareSize = (size - gap * (cols - 1)) / cols;
|
|
21
|
+
const squares = [];
|
|
22
|
+
for (let row = 0; row < rows; row++) {
|
|
23
|
+
for (let col = 0; col < cols; col++) {
|
|
24
|
+
squares.push({
|
|
25
|
+
x: col * (squareSize + gap),
|
|
26
|
+
y: row * (squareSize + gap)
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
const semiTransparentSquares = [0, 5, 10, 15];
|
|
31
|
+
return /*#__PURE__*/React.createElement("svg", _extends({
|
|
32
|
+
width: size,
|
|
33
|
+
height: size,
|
|
34
|
+
viewBox: "0 0 ".concat(size, " ").concat(size),
|
|
35
|
+
xmlns: "http://www.w3.org/2000/svg"
|
|
36
|
+
}, props), squares.map((_ref2, i) => {
|
|
37
|
+
let {
|
|
38
|
+
x,
|
|
39
|
+
y
|
|
40
|
+
} = _ref2;
|
|
41
|
+
return /*#__PURE__*/React.createElement("rect", {
|
|
42
|
+
key: i,
|
|
43
|
+
x: x,
|
|
44
|
+
y: y,
|
|
45
|
+
width: squareSize,
|
|
46
|
+
height: squareSize,
|
|
47
|
+
fill: colour,
|
|
48
|
+
fillOpacity: semiTransparentSquares.includes(i) ? 0.5 : 1
|
|
49
|
+
});
|
|
50
|
+
}));
|
|
51
|
+
}
|