@jbrowse/plugin-circular-view 1.6.9 → 1.7.2

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 (41) hide show
  1. package/dist/BaseChordDisplay/components/BaseChordDisplay.d.ts +9 -9
  2. package/dist/BaseChordDisplay/components/BaseChordDisplay.js +53 -0
  3. package/dist/BaseChordDisplay/components/DisplayError.d.ts +4 -4
  4. package/dist/BaseChordDisplay/components/DisplayError.js +70 -0
  5. package/dist/BaseChordDisplay/components/Loading.d.ts +10 -10
  6. package/dist/BaseChordDisplay/components/Loading.js +122 -0
  7. package/dist/BaseChordDisplay/components/RpcRenderedSvgGroup.d.ts +4 -4
  8. package/dist/BaseChordDisplay/components/RpcRenderedSvgGroup.js +96 -0
  9. package/dist/BaseChordDisplay/index.d.ts +3 -3
  10. package/dist/BaseChordDisplay/index.js +31 -0
  11. package/dist/BaseChordDisplay/models/BaseChordDisplayModel.d.ts +99 -99
  12. package/dist/BaseChordDisplay/models/BaseChordDisplayModel.js +261 -0
  13. package/dist/BaseChordDisplay/models/baseChordDisplayConfig.d.ts +2 -2
  14. package/dist/BaseChordDisplay/models/baseChordDisplayConfig.js +20 -0
  15. package/dist/BaseChordDisplay/models/renderReaction.d.ts +30 -30
  16. package/dist/BaseChordDisplay/models/renderReaction.js +142 -0
  17. package/dist/CircularView/components/CircularView.d.ts +4 -4
  18. package/dist/CircularView/components/CircularView.js +203 -0
  19. package/dist/CircularView/components/ImportForm.d.ts +5 -5
  20. package/dist/CircularView/components/ImportForm.js +97 -0
  21. package/dist/CircularView/components/Ruler.d.ts +5 -5
  22. package/dist/CircularView/components/Ruler.js +205 -0
  23. package/dist/CircularView/models/CircularView.d.ts +97 -97
  24. package/dist/CircularView/models/CircularView.js +422 -0
  25. package/dist/CircularView/models/slices.d.ts +27 -27
  26. package/dist/CircularView/models/slices.js +111 -0
  27. package/dist/CircularView/models/slices.test.js +83 -0
  28. package/dist/CircularView/models/viewportVisibleRegion.d.ts +6 -6
  29. package/dist/CircularView/models/viewportVisibleRegion.js +280 -0
  30. package/dist/CircularView/models/viewportVisibleRegion.test.js +130 -0
  31. package/dist/index.d.ts +8 -8
  32. package/dist/index.js +180 -6
  33. package/package.json +5 -7
  34. package/dist/CircularView/models/slices.test.d.ts +0 -1
  35. package/dist/CircularView/models/viewportVisibleRegion.test.d.ts +0 -1
  36. package/dist/plugin-circular-view.cjs.development.js +0 -3013
  37. package/dist/plugin-circular-view.cjs.development.js.map +0 -1
  38. package/dist/plugin-circular-view.cjs.production.min.js +0 -2
  39. package/dist/plugin-circular-view.cjs.production.min.js.map +0 -1
  40. package/dist/plugin-circular-view.esm.js +0 -3004
  41. package/dist/plugin-circular-view.esm.js.map +0 -1
@@ -0,0 +1,203 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports["default"] = void 0;
9
+
10
+ var _react = _interopRequireDefault(require("react"));
11
+
12
+ var _mobxReact = require("mobx-react");
13
+
14
+ var _ui = require("@jbrowse/core/ui");
15
+
16
+ var _util = require("@jbrowse/core/util");
17
+
18
+ var _core = require("@material-ui/core");
19
+
20
+ var _colors = require("@material-ui/core/colors");
21
+
22
+ var _ZoomOut = _interopRequireDefault(require("@material-ui/icons/ZoomOut"));
23
+
24
+ var _ZoomIn = _interopRequireDefault(require("@material-ui/icons/ZoomIn"));
25
+
26
+ var _RotateLeft = _interopRequireDefault(require("@material-ui/icons/RotateLeft"));
27
+
28
+ var _RotateRight = _interopRequireDefault(require("@material-ui/icons/RotateRight"));
29
+
30
+ var _LockOutlined = _interopRequireDefault(require("@material-ui/icons/LockOutlined"));
31
+
32
+ var _LockOpen = _interopRequireDefault(require("@material-ui/icons/LockOpen"));
33
+
34
+ var _Icons = require("@jbrowse/core/ui/Icons");
35
+
36
+ var _Ruler = _interopRequireDefault(require("./Ruler"));
37
+
38
+ var _ImportForm = _interopRequireDefault(require("./ImportForm"));
39
+
40
+ // icons
41
+ // locals
42
+ var dragHandleHeight = 3;
43
+ var useStyles = (0, _core.makeStyles)(function (theme) {
44
+ return {
45
+ root: {
46
+ position: 'relative',
47
+ marginBottom: theme.spacing(1),
48
+ overflow: 'hidden',
49
+ background: 'white'
50
+ },
51
+ scroller: {
52
+ overflow: 'auto'
53
+ },
54
+ sliceRoot: {
55
+ background: 'none',
56
+ // background: theme.palette.background.paper,
57
+ boxSizing: 'content-box',
58
+ display: 'block'
59
+ },
60
+ iconButton: {
61
+ padding: '4px',
62
+ margin: '0 2px 0 2px'
63
+ },
64
+ controls: {
65
+ overflow: 'hidden',
66
+ whiteSpace: 'nowrap',
67
+ position: 'absolute',
68
+ background: _colors.grey[200],
69
+ boxSizing: 'border-box',
70
+ borderRight: '1px solid #a2a2a2',
71
+ borderBottom: '1px solid #a2a2a2',
72
+ left: 0,
73
+ top: 0
74
+ },
75
+ importFormContainer: {
76
+ marginBottom: theme.spacing(4)
77
+ }
78
+ };
79
+ });
80
+ var Slices = (0, _mobxReact.observer)(function (_ref) {
81
+ var model = _ref.model;
82
+ return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, model.staticSlices.map(function (slice) {
83
+ return /*#__PURE__*/_react["default"].createElement(_Ruler["default"], {
84
+ key: (0, _util.assembleLocString)(slice.region.elided ? slice.region.regions[0] : slice.region),
85
+ model: model,
86
+ slice: slice
87
+ });
88
+ }), model.tracks.map(function (track) {
89
+ var display = track.displays[0];
90
+ return /*#__PURE__*/_react["default"].createElement(display.RenderingComponent, {
91
+ key: display.id,
92
+ display: display,
93
+ view: model
94
+ });
95
+ }));
96
+ });
97
+ var Controls = (0, _mobxReact.observer)(function (_ref2) {
98
+ var model = _ref2.model,
99
+ showingFigure = _ref2.showingFigure;
100
+ var classes = useStyles();
101
+ return /*#__PURE__*/_react["default"].createElement("div", {
102
+ className: classes.controls
103
+ }, /*#__PURE__*/_react["default"].createElement(_core.IconButton, {
104
+ onClick: model.zoomOutButton,
105
+ className: classes.iconButton,
106
+ title: model.lockedFitToWindow ? 'unlock to zoom out' : 'zoom out',
107
+ disabled: !showingFigure || model.atMaxBpPerPx || model.lockedFitToWindow,
108
+ color: "secondary"
109
+ }, /*#__PURE__*/_react["default"].createElement(_ZoomOut["default"], null)), /*#__PURE__*/_react["default"].createElement(_core.IconButton, {
110
+ onClick: model.zoomInButton,
111
+ className: classes.iconButton,
112
+ title: "zoom in",
113
+ disabled: !showingFigure || model.atMinBpPerPx,
114
+ color: "secondary"
115
+ }, /*#__PURE__*/_react["default"].createElement(_ZoomIn["default"], null)), /*#__PURE__*/_react["default"].createElement(_core.IconButton, {
116
+ onClick: model.rotateCounterClockwiseButton,
117
+ className: classes.iconButton,
118
+ title: "rotate counter-clockwise",
119
+ disabled: !showingFigure,
120
+ color: "secondary"
121
+ }, /*#__PURE__*/_react["default"].createElement(_RotateLeft["default"], null)), /*#__PURE__*/_react["default"].createElement(_core.IconButton, {
122
+ onClick: model.rotateClockwiseButton,
123
+ className: classes.iconButton,
124
+ title: "rotate clockwise",
125
+ disabled: !showingFigure,
126
+ color: "secondary"
127
+ }, /*#__PURE__*/_react["default"].createElement(_RotateRight["default"], null)), /*#__PURE__*/_react["default"].createElement(_core.IconButton, {
128
+ onClick: model.toggleFitToWindowLock,
129
+ className: classes.iconButton,
130
+ title: model.lockedFitToWindow ? 'locked model to window size' : 'unlocked model to zoom further',
131
+ disabled: model.tooSmallToLock,
132
+ color: "secondary"
133
+ }, model.lockedFitToWindow ? /*#__PURE__*/_react["default"].createElement(_LockOutlined["default"], null) : /*#__PURE__*/_react["default"].createElement(_LockOpen["default"], null)), model.hideTrackSelectorButton ? null : /*#__PURE__*/_react["default"].createElement(_core.IconButton, {
134
+ onClick: model.activateTrackSelector,
135
+ title: "Open track selector",
136
+ "data-testid": "circular_track_select",
137
+ color: "secondary"
138
+ }, /*#__PURE__*/_react["default"].createElement(_Icons.TrackSelector, null)));
139
+ });
140
+ var CircularView = (0, _mobxReact.observer)(function (_ref3) {
141
+ var model = _ref3.model;
142
+ var classes = useStyles();
143
+ var initialized = !!model.displayedRegions.length && model.figureWidth && model.figureHeight;
144
+ var showImportForm = !initialized && !model.disableImportForm;
145
+ var showFigure = initialized && !showImportForm;
146
+ return /*#__PURE__*/_react["default"].createElement("div", {
147
+ className: classes.root,
148
+ style: {
149
+ width: model.width,
150
+ height: model.height
151
+ },
152
+ "data-testid": model.id
153
+ }, model.error ? /*#__PURE__*/_react["default"].createElement(_ui.ErrorMessage, {
154
+ error: model.error
155
+ }) : /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, showImportForm ? /*#__PURE__*/_react["default"].createElement(_ImportForm["default"], {
156
+ model: model
157
+ }) : null, /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, !showFigure ? null : /*#__PURE__*/_react["default"].createElement("div", {
158
+ className: classes.scroller,
159
+ style: {
160
+ width: model.width,
161
+ height: model.height
162
+ }
163
+ }, /*#__PURE__*/_react["default"].createElement("div", {
164
+ className: classes.rotator,
165
+ style: {
166
+ transform: ["rotate(".concat(model.offsetRadians, "rad)")].join(' '),
167
+ transition: 'transform 0.5s',
168
+ transformOrigin: model.centerXY.map(function (x) {
169
+ return "".concat(x, "px");
170
+ }).join(' ')
171
+ }
172
+ }, /*#__PURE__*/_react["default"].createElement("svg", {
173
+ style: {
174
+ position: 'absolute',
175
+ left: 0,
176
+ top: 0
177
+ },
178
+ className: classes.sliceRoot,
179
+ width: "".concat(model.figureWidth, "px"),
180
+ height: "".concat(model.figureHeight, "px"),
181
+ version: "1.1"
182
+ }, /*#__PURE__*/_react["default"].createElement("g", {
183
+ transform: "translate(".concat(model.centerXY, ")")
184
+ }, /*#__PURE__*/_react["default"].createElement(Slices, {
185
+ model: model
186
+ }))))), /*#__PURE__*/_react["default"].createElement(Controls, {
187
+ model: model,
188
+ showingFigure: showFigure
189
+ }), model.hideVerticalResizeHandle ? null : /*#__PURE__*/_react["default"].createElement(_ui.ResizeHandle, {
190
+ onDrag: model.resizeHeight,
191
+ style: {
192
+ height: dragHandleHeight,
193
+ position: 'absolute',
194
+ bottom: 0,
195
+ left: 0,
196
+ background: '#ccc',
197
+ boxSizing: 'border-box',
198
+ borderTop: '1px solid #fafafa'
199
+ }
200
+ }))));
201
+ });
202
+ var _default = CircularView;
203
+ exports["default"] = _default;
@@ -1,5 +1,5 @@
1
- /// <reference types="react" />
2
- declare const ImportForm: ({ model }: {
3
- model: any;
4
- }) => JSX.Element;
5
- export default ImportForm;
1
+ /// <reference types="react" />
2
+ declare const ImportForm: ({ model }: {
3
+ model: any;
4
+ }) => JSX.Element;
5
+ export default ImportForm;
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ var _typeof = require("@babel/runtime/helpers/typeof");
6
+
7
+ Object.defineProperty(exports, "__esModule", {
8
+ value: true
9
+ });
10
+ exports["default"] = void 0;
11
+
12
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
13
+
14
+ var _react = _interopRequireWildcard(require("react"));
15
+
16
+ var _core = require("@material-ui/core");
17
+
18
+ var _mobxReact = require("mobx-react");
19
+
20
+ var _util = require("@jbrowse/core/util");
21
+
22
+ var _ErrorMessage = _interopRequireDefault(require("@jbrowse/core/ui/ErrorMessage"));
23
+
24
+ var _AssemblySelector = _interopRequireDefault(require("@jbrowse/core/ui/AssemblySelector"));
25
+
26
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
27
+
28
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
29
+
30
+ var useStyles = (0, _core.makeStyles)(function (theme) {
31
+ return {
32
+ importFormContainer: {
33
+ marginBottom: theme.spacing(4)
34
+ }
35
+ };
36
+ }); // eslint-disable-next-line @typescript-eslint/no-explicit-any
37
+
38
+ var ImportForm = (0, _mobxReact.observer)(function (_ref) {
39
+ var model = _ref.model;
40
+ var classes = useStyles();
41
+ var session = (0, _util.getSession)(model);
42
+ var modelError = model.error;
43
+ var assemblyNames = session.assemblyNames,
44
+ assemblyManager = session.assemblyManager;
45
+
46
+ var _useState = (0, _react.useState)(assemblyNames[0]),
47
+ _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
48
+ selectedAsm = _useState2[0],
49
+ setSelectedAsm = _useState2[1];
50
+
51
+ var _useState3 = (0, _react.useState)(modelError),
52
+ _useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
53
+ error = _useState4[0],
54
+ setError = _useState4[1];
55
+
56
+ var assembly = assemblyManager.get(selectedAsm);
57
+ var assemblyError = assemblyNames.length ? assembly === null || assembly === void 0 ? void 0 : assembly.error : 'No configured assemblies';
58
+ var regions = (assembly === null || assembly === void 0 ? void 0 : assembly.regions) || [];
59
+ var err = assemblyError || error;
60
+ return /*#__PURE__*/_react["default"].createElement(_core.Container, {
61
+ className: classes.importFormContainer
62
+ }, err ? /*#__PURE__*/_react["default"].createElement(_core.Grid, {
63
+ container: true,
64
+ spacing: 1,
65
+ justifyContent: "center",
66
+ alignItems: "center"
67
+ }, /*#__PURE__*/_react["default"].createElement(_core.Grid, {
68
+ item: true
69
+ }, /*#__PURE__*/_react["default"].createElement(_ErrorMessage["default"], {
70
+ error: err
71
+ }))) : null, /*#__PURE__*/_react["default"].createElement(_core.Grid, {
72
+ container: true,
73
+ spacing: 1,
74
+ justifyContent: "center",
75
+ alignItems: "center"
76
+ }, /*#__PURE__*/_react["default"].createElement(_core.Grid, {
77
+ item: true
78
+ }, /*#__PURE__*/_react["default"].createElement(_AssemblySelector["default"], {
79
+ onChange: function onChange(val) {
80
+ setError(undefined);
81
+ setSelectedAsm(val);
82
+ },
83
+ session: session,
84
+ selected: selectedAsm
85
+ })), /*#__PURE__*/_react["default"].createElement(_core.Grid, {
86
+ item: true
87
+ }, /*#__PURE__*/_react["default"].createElement(_core.Button, {
88
+ disabled: !(regions !== null && regions !== void 0 && regions.length),
89
+ onClick: function onClick() {
90
+ return model.setDisplayedRegions(regions);
91
+ },
92
+ variant: "contained",
93
+ color: "primary"
94
+ }, regions.length ? 'Open' : 'Loading…'))));
95
+ });
96
+ var _default = ImportForm;
97
+ exports["default"] = _default;
@@ -1,5 +1,5 @@
1
- export default CircularRuler;
2
- declare function CircularRuler({ model, slice }: {
3
- model: any;
4
- slice: any;
5
- }): JSX.Element;
1
+ export default CircularRuler;
2
+ declare function CircularRuler({ model, slice }: {
3
+ model: any;
4
+ slice: any;
5
+ }): JSX.Element;
@@ -0,0 +1,205 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports["default"] = void 0;
9
+
10
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
11
+
12
+ var _react = _interopRequireDefault(require("react"));
13
+
14
+ var _mobxReact = require("mobx-react");
15
+
16
+ var _util = require("@jbrowse/core/util");
17
+
18
+ var _color = require("@jbrowse/core/util/color");
19
+
20
+ var _styles = require("@material-ui/core/styles");
21
+
22
+ var useStyles = (0, _styles.makeStyles)({
23
+ rulerLabel: {
24
+ fontSize: '0.8rem',
25
+ fontWeight: 500,
26
+ lineHeight: 1.6,
27
+ letterSpacing: '0.0075em'
28
+ }
29
+ });
30
+
31
+ function sliceArcPath(slice, radiusPx, startBase, endBase) {
32
+ // A rx ry x-axis-rotation large-arc-flag sweep-flag x y
33
+ if (slice.flipped) {
34
+ ;
35
+ var _ref = [endBase, startBase];
36
+ startBase = _ref[0];
37
+ endBase = _ref[1];
38
+ }
39
+
40
+ var startXY = slice.bpToXY(startBase, radiusPx);
41
+ var endXY = slice.bpToXY(endBase, radiusPx);
42
+ var largeArc = Math.abs(endBase - startBase) / slice.bpPerRadian > Math.PI ? '1' : '0';
43
+ var sweepFlag = '1';
44
+ return ['M'].concat((0, _toConsumableArray2["default"])(startXY), ['A', radiusPx, radiusPx, '0', largeArc, sweepFlag], (0, _toConsumableArray2["default"])(endXY)).join(' ');
45
+ }
46
+
47
+ var ElisionRulerArc = (0, _mobxReact.observer)(function (_ref2) {
48
+ var model = _ref2.model,
49
+ slice = _ref2.slice;
50
+ var theme = (0, _styles.useTheme)();
51
+ var modelRadiusPx = model.radiusPx;
52
+ var radiusPx = modelRadiusPx + 1;
53
+ var endRadians = slice.endRadians,
54
+ startRadians = slice.startRadians,
55
+ region = slice.region;
56
+ var startXY = (0, _util.polarToCartesian)(radiusPx, startRadians);
57
+ var endXY = (0, _util.polarToCartesian)(radiusPx, endRadians);
58
+ var widthPx = (endRadians - startRadians) * radiusPx;
59
+ var largeArc = endRadians - startRadians > Math.PI ? '1' : '0'; // TODO: draw the elision
60
+
61
+ var centerRadians = (endRadians + startRadians) / 2;
62
+ var regionCountString = "[".concat(Number(region.regions.length).toLocaleString(), "]");
63
+ return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(RulerLabel, {
64
+ text: regionCountString,
65
+ view: model,
66
+ maxWidthPx: widthPx,
67
+ radians: centerRadians,
68
+ radiusPx: radiusPx,
69
+ title: "".concat(Number(region.regions.length).toLocaleString(), " more regions"),
70
+ color: theme.palette.text.primary
71
+ }), /*#__PURE__*/_react["default"].createElement("path", {
72
+ d: ['M'].concat((0, _toConsumableArray2["default"])(startXY), ['A', radiusPx, radiusPx, '0', largeArc, '1'], (0, _toConsumableArray2["default"])(endXY)).join(' '),
73
+ stroke: theme.palette.text.secondary,
74
+ strokeWidth: 2,
75
+ strokeDasharray: "2,2",
76
+ fill: "none"
77
+ }));
78
+ });
79
+ var RulerLabel = (0, _mobxReact.observer)(function (_ref3) {
80
+ var view = _ref3.view,
81
+ text = _ref3.text,
82
+ maxWidthPx = _ref3.maxWidthPx,
83
+ radians = _ref3.radians,
84
+ radiusPx = _ref3.radiusPx,
85
+ title = _ref3.title,
86
+ color = _ref3.color;
87
+ var classes = useStyles();
88
+ var textXY = (0, _util.polarToCartesian)(radiusPx + 5, radians);
89
+
90
+ if (!text) {
91
+ return null;
92
+ }
93
+
94
+ if (text.length * 6.5 < maxWidthPx) {
95
+ // text is rotated parallel to the ruler arc
96
+ return /*#__PURE__*/_react["default"].createElement("text", {
97
+ x: 0,
98
+ y: 0,
99
+ className: classes.rulerLabel,
100
+ textAnchor: "middle",
101
+ dominantBaseline: "baseline",
102
+ transform: "translate(".concat(textXY, ") rotate(").concat((0, _util.radToDeg)(radians) + 90, ")"),
103
+ style: {
104
+ fill: color
105
+ }
106
+ }, text, /*#__PURE__*/_react["default"].createElement("title", null, title || text));
107
+ }
108
+
109
+ if (maxWidthPx > 4) {
110
+ // text is rotated perpendicular to the ruler arc
111
+ var overallRotation = (0, _util.radToDeg)(radians + view.offsetRadians - Math.PI / 2);
112
+
113
+ if (overallRotation >= 180) {
114
+ return /*#__PURE__*/_react["default"].createElement("text", {
115
+ x: 0,
116
+ y: 0,
117
+ className: classes.rulerLabel,
118
+ textAnchor: "start",
119
+ dominantBaseline: "middle",
120
+ transform: "translate(".concat(textXY, ") rotate(").concat((0, _util.radToDeg)(radians), ")"),
121
+ style: {
122
+ fill: color
123
+ }
124
+ }, text, /*#__PURE__*/_react["default"].createElement("title", null, title || text));
125
+ }
126
+
127
+ return /*#__PURE__*/_react["default"].createElement("text", {
128
+ x: 0,
129
+ y: 0,
130
+ className: classes.rulerLabel,
131
+ textAnchor: "end",
132
+ dominantBaseline: "middle",
133
+ transform: "translate(".concat(textXY, ") rotate(").concat((0, _util.radToDeg)(radians) + 180, ")"),
134
+ style: {
135
+ fill: color
136
+ }
137
+ }, text, /*#__PURE__*/_react["default"].createElement("title", null, title || text));
138
+ } // if you get here there is no room for the text at all
139
+
140
+
141
+ return null;
142
+ });
143
+ var RegionRulerArc = (0, _mobxReact.observer)(function (_ref4) {
144
+ var model = _ref4.model,
145
+ slice = _ref4.slice;
146
+ var theme = (0, _styles.useTheme)();
147
+ var radiusPx = model.radiusPx;
148
+ var region = slice.region,
149
+ endRadians = slice.endRadians,
150
+ startRadians = slice.startRadians;
151
+ var centerRadians = (endRadians + startRadians) / 2;
152
+ var widthPx = (endRadians - startRadians) * radiusPx;
153
+ var session = (0, _util.getSession)(model);
154
+ var color;
155
+ var assembly = session.assemblyManager.get(slice.region.assemblyName);
156
+
157
+ if (assembly) {
158
+ color = assembly.getRefNameColor(region.refName);
159
+ }
160
+
161
+ if (color) {
162
+ try {
163
+ color = (0, _color.makeContrasting)(color, theme.palette.background.paper);
164
+ } catch (error) {
165
+ color = theme.palette.text.primary;
166
+ }
167
+ } else {
168
+ color = theme.palette.text.primary;
169
+ } // TODO: slice flipping
170
+
171
+
172
+ return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(RulerLabel, {
173
+ text: region.refName,
174
+ view: model,
175
+ maxWidthPx: widthPx,
176
+ radians: centerRadians,
177
+ radiusPx: radiusPx,
178
+ color: color
179
+ }), /*#__PURE__*/_react["default"].createElement("path", {
180
+ d: sliceArcPath(slice, radiusPx + 1, region.start, region.end),
181
+ stroke: color,
182
+ strokeWidth: 2,
183
+ fill: "none"
184
+ }, /*#__PURE__*/_react["default"].createElement("title", null, region.refName)));
185
+ });
186
+ var CircularRuler = (0, _mobxReact.observer)(function Ruler(_ref5) {
187
+ var model = _ref5.model,
188
+ slice = _ref5.slice;
189
+
190
+ if (slice.region.elided) {
191
+ return /*#__PURE__*/_react["default"].createElement(ElisionRulerArc, {
192
+ key: (0, _util.assembleLocString)(slice.region.regions[0]),
193
+ model: model,
194
+ slice: slice
195
+ });
196
+ }
197
+
198
+ return /*#__PURE__*/_react["default"].createElement(RegionRulerArc, {
199
+ key: (0, _util.assembleLocString)(slice.region),
200
+ model: model,
201
+ slice: slice
202
+ });
203
+ });
204
+ var _default = CircularRuler;
205
+ exports["default"] = _default;