@jbrowse/plugin-circular-view 1.7.11 → 2.1.0

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 (98) hide show
  1. package/dist/BaseChordDisplay/components/BaseChordDisplay.d.ts +2 -7
  2. package/dist/BaseChordDisplay/components/BaseChordDisplay.js +18 -48
  3. package/dist/BaseChordDisplay/components/BaseChordDisplay.js.map +1 -0
  4. package/dist/BaseChordDisplay/components/DisplayError.d.ts +9 -4
  5. package/dist/BaseChordDisplay/components/DisplayError.js +24 -67
  6. package/dist/BaseChordDisplay/components/DisplayError.js.map +1 -0
  7. package/dist/BaseChordDisplay/components/Loading.d.ts +2 -3
  8. package/dist/BaseChordDisplay/components/Loading.js +98 -112
  9. package/dist/BaseChordDisplay/components/Loading.js.map +1 -0
  10. package/dist/BaseChordDisplay/components/RpcRenderedSvgGroup.d.ts +3 -3
  11. package/dist/BaseChordDisplay/components/RpcRenderedSvgGroup.js +80 -91
  12. package/dist/BaseChordDisplay/components/RpcRenderedSvgGroup.js.map +1 -0
  13. package/dist/BaseChordDisplay/index.d.ts +1 -1
  14. package/dist/BaseChordDisplay/index.js +12 -30
  15. package/dist/BaseChordDisplay/index.js.map +1 -0
  16. package/dist/BaseChordDisplay/models/BaseChordDisplayModel.d.ts +10 -10
  17. package/dist/BaseChordDisplay/models/BaseChordDisplayModel.js +204 -232
  18. package/dist/BaseChordDisplay/models/BaseChordDisplayModel.js.map +1 -0
  19. package/dist/BaseChordDisplay/models/baseChordDisplayConfig.js +12 -18
  20. package/dist/BaseChordDisplay/models/baseChordDisplayConfig.js.map +1 -0
  21. package/dist/BaseChordDisplay/models/renderReaction.js +115 -138
  22. package/dist/BaseChordDisplay/models/renderReaction.js.map +1 -0
  23. package/dist/CircularView/components/CircularView.js +111 -185
  24. package/dist/CircularView/components/CircularView.js.map +1 -0
  25. package/dist/CircularView/components/ImportForm.js +77 -92
  26. package/dist/CircularView/components/ImportForm.js.map +1 -0
  27. package/dist/CircularView/components/Ruler.js +148 -194
  28. package/dist/CircularView/components/Ruler.js.map +1 -0
  29. package/dist/CircularView/models/CircularView.d.ts +3 -3
  30. package/dist/CircularView/models/CircularView.js +346 -409
  31. package/dist/CircularView/models/CircularView.js.map +1 -0
  32. package/dist/CircularView/models/slices.js +90 -104
  33. package/dist/CircularView/models/slices.js.map +1 -0
  34. package/dist/CircularView/models/viewportVisibleRegion.js +229 -264
  35. package/dist/CircularView/models/viewportVisibleRegion.js.map +1 -0
  36. package/dist/index.d.ts +3 -1
  37. package/dist/index.js +147 -176
  38. package/dist/index.js.map +1 -0
  39. package/esm/BaseChordDisplay/components/BaseChordDisplay.d.ts +4 -0
  40. package/esm/BaseChordDisplay/components/BaseChordDisplay.js +17 -0
  41. package/esm/BaseChordDisplay/components/BaseChordDisplay.js.map +1 -0
  42. package/esm/BaseChordDisplay/components/DisplayError.d.ts +9 -0
  43. package/esm/BaseChordDisplay/components/DisplayError.js +21 -0
  44. package/esm/BaseChordDisplay/components/DisplayError.js.map +1 -0
  45. package/esm/BaseChordDisplay/components/Loading.d.ts +9 -0
  46. package/esm/BaseChordDisplay/components/Loading.js +66 -0
  47. package/esm/BaseChordDisplay/components/Loading.js.map +1 -0
  48. package/esm/BaseChordDisplay/components/RpcRenderedSvgGroup.d.ts +4 -0
  49. package/esm/BaseChordDisplay/components/RpcRenderedSvgGroup.js +48 -0
  50. package/esm/BaseChordDisplay/components/RpcRenderedSvgGroup.js.map +1 -0
  51. package/esm/BaseChordDisplay/index.d.ts +3 -0
  52. package/esm/BaseChordDisplay/index.js +4 -0
  53. package/esm/BaseChordDisplay/index.js.map +1 -0
  54. package/esm/BaseChordDisplay/models/BaseChordDisplayModel.d.ts +99 -0
  55. package/esm/BaseChordDisplay/models/BaseChordDisplayModel.js +181 -0
  56. package/esm/BaseChordDisplay/models/BaseChordDisplayModel.js.map +1 -0
  57. package/esm/BaseChordDisplay/models/baseChordDisplayConfig.d.ts +2 -0
  58. package/esm/BaseChordDisplay/models/baseChordDisplayConfig.js +11 -0
  59. package/esm/BaseChordDisplay/models/baseChordDisplayConfig.js.map +1 -0
  60. package/esm/BaseChordDisplay/models/renderReaction.d.ts +30 -0
  61. package/esm/BaseChordDisplay/models/renderReaction.js +52 -0
  62. package/esm/BaseChordDisplay/models/renderReaction.js.map +1 -0
  63. package/esm/CircularView/components/CircularView.d.ts +4 -0
  64. package/esm/CircularView/components/CircularView.js +121 -0
  65. package/esm/CircularView/components/CircularView.js.map +1 -0
  66. package/esm/CircularView/components/ImportForm.d.ts +5 -0
  67. package/esm/CircularView/components/ImportForm.js +40 -0
  68. package/esm/CircularView/components/ImportForm.js.map +1 -0
  69. package/esm/CircularView/components/Ruler.d.ts +5 -0
  70. package/esm/CircularView/components/Ruler.js +126 -0
  71. package/esm/CircularView/components/Ruler.js.map +1 -0
  72. package/esm/CircularView/models/CircularView.d.ts +97 -0
  73. package/esm/CircularView/models/CircularView.js +317 -0
  74. package/esm/CircularView/models/CircularView.js.map +1 -0
  75. package/esm/CircularView/models/slices.d.ts +27 -0
  76. package/esm/CircularView/models/slices.js +53 -0
  77. package/esm/CircularView/models/slices.js.map +1 -0
  78. package/esm/CircularView/models/viewportVisibleRegion.d.ts +6 -0
  79. package/esm/CircularView/models/viewportVisibleRegion.js +223 -0
  80. package/esm/CircularView/models/viewportVisibleRegion.js.map +1 -0
  81. package/esm/index.d.ts +10 -0
  82. package/esm/index.js +49 -0
  83. package/esm/index.js.map +1 -0
  84. package/package.json +20 -12
  85. package/src/BaseChordDisplay/components/BaseChordDisplay.tsx +13 -25
  86. package/src/BaseChordDisplay/components/DisplayError.js +64 -66
  87. package/src/BaseChordDisplay/components/Loading.tsx +104 -107
  88. package/src/BaseChordDisplay/components/RpcRenderedSvgGroup.js +44 -51
  89. package/src/BaseChordDisplay/index.ts +1 -1
  90. package/src/BaseChordDisplay/models/BaseChordDisplayModel.ts +2 -1
  91. package/src/CircularView/components/CircularView.js +17 -16
  92. package/src/CircularView/components/ImportForm.tsx +5 -5
  93. package/src/CircularView/components/Ruler.js +4 -3
  94. package/src/CircularView/models/CircularView.ts +29 -42
  95. package/src/CircularView/models/slices.ts +2 -7
  96. package/src/index.ts +5 -2
  97. package/dist/CircularView/models/slices.test.js +0 -83
  98. package/dist/CircularView/models/viewportVisibleRegion.test.js +0 -130
@@ -0,0 +1,6 @@
1
+ export declare function cartesianToPolar(x: number, y: number): number[];
2
+ export declare function thetaRangesOverlap(r1start: number, r1length: number, r2start: number, r2length: number): boolean;
3
+ export declare function viewportVisibleSection(viewSides: [number, number, number, number], circleCenter: [number, number], circleRadius: number): {
4
+ rho: number[];
5
+ theta: number[];
6
+ };
@@ -0,0 +1,223 @@
1
+ function findCircleIntersectionX(y, cx, cy, r, resultArray) {
2
+ const d = Math.abs(y - cy);
3
+ if (d > r) {
4
+ return;
5
+ }
6
+ if (d === r) {
7
+ resultArray.push([cx, y]);
8
+ }
9
+ const solution = Math.sqrt(r * r - d * d);
10
+ resultArray.push([cx - solution, y]);
11
+ resultArray.push([cx + solution, y]);
12
+ }
13
+ function findCircleIntersectionY(x, cx, cy, r, resultArray) {
14
+ const d = Math.abs(x - cx);
15
+ if (d > r) {
16
+ return;
17
+ }
18
+ if (d === r) {
19
+ resultArray.push([x, cy]);
20
+ }
21
+ const solution = Math.sqrt(r * r - d * d);
22
+ resultArray.push([x, cy - solution]);
23
+ resultArray.push([x, cy + solution]);
24
+ }
25
+ function cartesianToTheta(x, y) {
26
+ let theta = (Math.atan(y / x) + 2 * Math.PI) % (2 * Math.PI);
27
+ if (x < 0) {
28
+ if (y <= 0) {
29
+ theta += Math.PI;
30
+ }
31
+ else {
32
+ theta -= Math.PI;
33
+ }
34
+ }
35
+ return theta;
36
+ }
37
+ export function cartesianToPolar(x, y) {
38
+ const rho = Math.sqrt(x * x + y * y);
39
+ if (rho === 0) {
40
+ return [0, 0];
41
+ }
42
+ const theta = cartesianToTheta(x, y);
43
+ return [rho, theta];
44
+ }
45
+ const twoPi = 2 * Math.PI;
46
+ export function thetaRangesOverlap(r1start, r1length, r2start, r2length) {
47
+ if (r1length <= 0 || r2length <= 0) {
48
+ return false;
49
+ }
50
+ if (r1length + 0.0001 >= twoPi || r2length + 0.0001 >= twoPi) {
51
+ return true;
52
+ }
53
+ // put both range starts between 2π and 4π
54
+ r1start = (((r1start % twoPi) + twoPi) % twoPi) + twoPi;
55
+ r2start = (((r2start % twoPi) + twoPi) % twoPi) + twoPi;
56
+ if (r1start < r2start + r2length && r1start + r1length > r2start) {
57
+ return true;
58
+ }
59
+ // move r2 2π to the left and check
60
+ r2start -= twoPi;
61
+ if (r1start < r2start + r2length && r1start + r1length > r2start) {
62
+ return true;
63
+ }
64
+ // move it 2π to the right and check
65
+ r2start += twoPi + twoPi;
66
+ return r1start < r2start + r2length && r1start + r1length > r2start;
67
+ }
68
+ // return which arc range has any part of the circle visible in the viewport
69
+ export function viewportVisibleSection(viewSides, circleCenter, circleRadius) {
70
+ let [viewL, viewR, viewT, viewB] = viewSides;
71
+ const [cx, cy] = circleCenter;
72
+ // transform coordinate system to center of circle
73
+ viewL -= cx;
74
+ viewR -= cx;
75
+ viewT -= cy;
76
+ viewB -= cy;
77
+ const centerIsInsideViewport = viewL < 0 && viewR > 0 && viewT < 0 && viewB > 0;
78
+ if (centerIsInsideViewport) {
79
+ const vertices = [
80
+ [viewL, viewT],
81
+ [viewR, viewT],
82
+ [viewL, viewB],
83
+ [viewR, viewB],
84
+ ];
85
+ let maxRho = -Infinity;
86
+ for (let i = 0; i < vertices.length; i += 1) {
87
+ const [x, y] = vertices[i];
88
+ const rho = Math.sqrt(x * x + y * y);
89
+ if (rho > maxRho) {
90
+ maxRho = rho;
91
+ }
92
+ }
93
+ return {
94
+ rho: [0, Math.min(circleRadius, maxRho)],
95
+ theta: [0, 2 * Math.PI],
96
+ };
97
+ }
98
+ // const viewportCompletelyContainsCircle =
99
+ // circleCenter[0] - viewL >= circleRadius &&
100
+ // viewR - circleCenter[0] >= circleRadius &&
101
+ // circleCenter[1] - viewT >= circleRadius &&
102
+ // viewB - circleCenter[1] >= circleRadius
103
+ // if (viewportCompletelyContainsCircle) {
104
+ // return [0, 2 * Math.PI]
105
+ // }
106
+ // const distToCenterSquared = ([x, y]) => {
107
+ // const [cx, cy] = circleCenter
108
+ // const sq = n => n * n
109
+ // return sq(x - cx) + sq(y - cy)
110
+ // }
111
+ // const circleRadiusSquared = circleRadius * circleRadius
112
+ // const tlInside = distToCenterSquared([viewL, viewT]) <= circleRadiusSquared
113
+ // const trInside = distToCenterSquared([viewR, viewT]) <= circleRadiusSquared
114
+ // const blInside = distToCenterSquared([viewL, viewB]) <= circleRadiusSquared
115
+ // const brInside = distToCenterSquared([viewR, viewB]) <= circleRadiusSquared
116
+ // const noIntersection = !tlInside && !trInside && !blInside && !brInside
117
+ // if (noIntersection) return undefined
118
+ // const circleCompletelyContainsViewport =
119
+ // tlInside && trInside && blInside && brInside
120
+ // if (circleCompletelyContainsViewport) {
121
+ // // viewport is in the circle, but the center is not in it, so take max
122
+ // // and min of thetas to the center
123
+ // const thetas = [
124
+ // Math.atan(viewT / viewL),
125
+ // Math.atan(viewT / viewR),
126
+ // Math.atan(viewB / viewL),
127
+ // Math.atan(viewB / viewR),
128
+ // ]
129
+ // return [Math.min(...thetas), Math.max(...thetas)]
130
+ // }
131
+ // if we get here, the viewport is partly in, partly out of the circle
132
+ // const viewLIntersects = Math.abs(viewL - circleCenter[0]) <= circleRadius
133
+ // const viewRIntersects = Math.abs(viewR - circleCenter[0]) <= circleRadius
134
+ // const viewTIntersects = Math.abs(viewT - circleCenter[1]) <= circleRadius
135
+ // const viewBIntersects = Math.abs(viewB - circleCenter[1]) <= circleRadius
136
+ // const numIntersectingSides =
137
+ // Number(viewLIntersects) +
138
+ // Number(viewRIntersects) +
139
+ // Number(viewTIntersects) +
140
+ // Number(viewBIntersects)
141
+ // if (numIntersectingSides === 4) return [0, 2 * Math.PI]
142
+ // if (numIntersectingSides === 3) {
143
+ // // TODO calculate the thetas of the
144
+ // } else if (numIntersectingSides === 2) {
145
+ // // TODO calculate the thetas of the 2 intersection points
146
+ // } else if (numIntersectingSides === 1) {
147
+ // // TODO calculate the thetas of the 1-2 intersection points of the line, and the angle between
148
+ // }
149
+ // make a list of vertices-of-interest that lie inside both shapes to examine
150
+ // to determine the range covered by their intersection
151
+ // transform coordinates to have the circle as the origin and find the intersections
152
+ // of the circle and the view rectangle
153
+ const vertices = [
154
+ [viewL, viewT],
155
+ [viewR, viewT],
156
+ [viewL, viewB],
157
+ [viewR, viewB],
158
+ ];
159
+ findCircleIntersectionY(viewL, 0, 0, circleRadius, vertices);
160
+ findCircleIntersectionY(viewR, 0, 0, circleRadius, vertices);
161
+ findCircleIntersectionX(viewT, 0, 0, circleRadius, vertices);
162
+ findCircleIntersectionX(viewB, 0, 0, circleRadius, vertices);
163
+ // for each edge, also look at the closest point to center if it is inside the circle
164
+ if (-viewL < circleRadius) {
165
+ vertices.push([viewL, 0]);
166
+ }
167
+ if (viewR < circleRadius) {
168
+ vertices.push([viewR, 0]);
169
+ }
170
+ if (-viewT < circleRadius) {
171
+ vertices.push([0, viewT]);
172
+ }
173
+ if (viewB < circleRadius) {
174
+ vertices.push([0, viewB]);
175
+ }
176
+ // const verticesOriginal = vertices.map(([x, y]) => [x + cx, y + cy])
177
+ // now convert them all to polar and take the max and min of rho and theta
178
+ // const viewportCenterTheta = cartesianToTheta(viewR + viewL, viewT + viewB)
179
+ const reflect = viewL >= 0 ? -1 : 1;
180
+ // viewportCenterTheta < Math.PI / 2 || viewportCenterTheta > 1.5 * Math.PI
181
+ // ? -1
182
+ // : 1
183
+ let rhoMin = Infinity;
184
+ let rhoMax = -Infinity;
185
+ let thetaMin = Infinity;
186
+ let thetaMax = -Infinity;
187
+ for (let i = 0; i < vertices.length; i += 1) {
188
+ // ignore vertex if outside the viewport
189
+ const [vx, vy] = vertices[i];
190
+ if (vx >= viewL && vx <= viewR && vy >= viewT && vy <= viewB) {
191
+ const [rho, theta] = cartesianToPolar(vx * reflect, vy * reflect);
192
+ // ignore vertex if outside the circle
193
+ if (rho <= circleRadius + 0.001) {
194
+ // ignore theta if rho is 0
195
+ if (theta < thetaMin && rho > 0.0001) {
196
+ thetaMin = theta;
197
+ }
198
+ if (theta > thetaMax && rho > 0.0001) {
199
+ thetaMax = theta;
200
+ }
201
+ if (rho < rhoMin) {
202
+ rhoMin = rho;
203
+ }
204
+ if (rho > rhoMax) {
205
+ rhoMax = rho;
206
+ }
207
+ }
208
+ }
209
+ }
210
+ if (reflect === -1) {
211
+ thetaMin += Math.PI;
212
+ thetaMax += Math.PI;
213
+ }
214
+ if (thetaMin > 2 * Math.PI && thetaMax > 2 * Math.PI) {
215
+ thetaMin -= 2 * Math.PI;
216
+ thetaMax -= 2 * Math.PI;
217
+ }
218
+ return {
219
+ rho: [rhoMin, Math.min(circleRadius, rhoMax)],
220
+ theta: [thetaMin, thetaMax],
221
+ };
222
+ }
223
+ //# sourceMappingURL=viewportVisibleRegion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"viewportVisibleRegion.js","sourceRoot":"","sources":["../../../src/CircularView/models/viewportVisibleRegion.ts"],"names":[],"mappings":"AAAA,SAAS,uBAAuB,CAC9B,CAAS,EACT,EAAU,EACV,EAAU,EACV,CAAS,EACT,WAA+B;IAE/B,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAA;IAC1B,IAAI,CAAC,GAAG,CAAC,EAAE;QACT,OAAM;KACP;IACD,IAAI,CAAC,KAAK,CAAC,EAAE;QACX,WAAW,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAA;KAC1B;IACD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA;IACzC,WAAW,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAA;IACpC,WAAW,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAA;AACtC,CAAC;AAED,SAAS,uBAAuB,CAC9B,CAAS,EACT,EAAU,EACV,EAAU,EACV,CAAS,EACT,WAA+B;IAE/B,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAA;IAC1B,IAAI,CAAC,GAAG,CAAC,EAAE;QACT,OAAM;KACP;IACD,IAAI,CAAC,KAAK,CAAC,EAAE;QACX,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;KAC1B;IACD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA;IACzC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAA;IACpC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAA;AACtC,CAAC;AAED,SAAS,gBAAgB,CAAC,CAAS,EAAE,CAAS;IAC5C,IAAI,KAAK,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAA;IAC5D,IAAI,CAAC,GAAG,CAAC,EAAE;QACT,IAAI,CAAC,IAAI,CAAC,EAAE;YACV,KAAK,IAAI,IAAI,CAAC,EAAE,CAAA;SACjB;aAAM;YACL,KAAK,IAAI,IAAI,CAAC,EAAE,CAAA;SACjB;KACF;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,CAAS,EAAE,CAAS;IACnD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA;IACpC,IAAI,GAAG,KAAK,CAAC,EAAE;QACb,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;KACd;IACD,MAAM,KAAK,GAAG,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IACpC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;AACrB,CAAC;AAED,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,CAAA;AACzB,MAAM,UAAU,kBAAkB,CAChC,OAAe,EACf,QAAgB,EAChB,OAAe,EACf,QAAgB;IAEhB,IAAI,QAAQ,IAAI,CAAC,IAAI,QAAQ,IAAI,CAAC,EAAE;QAClC,OAAO,KAAK,CAAA;KACb;IACD,IAAI,QAAQ,GAAG,MAAM,IAAI,KAAK,IAAI,QAAQ,GAAG,MAAM,IAAI,KAAK,EAAE;QAC5D,OAAO,IAAI,CAAA;KACZ;IAED,0CAA0C;IAC1C,OAAO,GAAG,CAAC,CAAC,CAAC,OAAO,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAA;IACvD,OAAO,GAAG,CAAC,CAAC,CAAC,OAAO,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAA;IAEvD,IAAI,OAAO,GAAG,OAAO,GAAG,QAAQ,IAAI,OAAO,GAAG,QAAQ,GAAG,OAAO,EAAE;QAChE,OAAO,IAAI,CAAA;KACZ;IAED,mCAAmC;IACnC,OAAO,IAAI,KAAK,CAAA;IAChB,IAAI,OAAO,GAAG,OAAO,GAAG,QAAQ,IAAI,OAAO,GAAG,QAAQ,GAAG,OAAO,EAAE;QAChE,OAAO,IAAI,CAAA;KACZ;IAED,oCAAoC;IACpC,OAAO,IAAI,KAAK,GAAG,KAAK,CAAA;IACxB,OAAO,OAAO,GAAG,OAAO,GAAG,QAAQ,IAAI,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAA;AACrE,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,sBAAsB,CACpC,SAA2C,EAC3C,YAA8B,EAC9B,YAAoB;IAEpB,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,SAAS,CAAA;IAC5C,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,YAAY,CAAA;IAE7B,kDAAkD;IAClD,KAAK,IAAI,EAAE,CAAA;IACX,KAAK,IAAI,EAAE,CAAA;IACX,KAAK,IAAI,EAAE,CAAA;IACX,KAAK,IAAI,EAAE,CAAA;IAEX,MAAM,sBAAsB,GAC1B,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,CAAA;IAElD,IAAI,sBAAsB,EAAE;QAC1B,MAAM,QAAQ,GAAG;YACf,CAAC,KAAK,EAAE,KAAK,CAAC;YACd,CAAC,KAAK,EAAE,KAAK,CAAC;YACd,CAAC,KAAK,EAAE,KAAK,CAAC;YACd,CAAC,KAAK,EAAE,KAAK,CAAC;SACf,CAAA;QACD,IAAI,MAAM,GAAG,CAAC,QAAQ,CAAA;QACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE;YAC3C,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;YAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA;YACpC,IAAI,GAAG,GAAG,MAAM,EAAE;gBAChB,MAAM,GAAG,GAAG,CAAA;aACb;SACF;QACD,OAAO;YACL,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;YACxC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC;SACxB,CAAA;KACF;IACD,2CAA2C;IAC3C,+CAA+C;IAC/C,+CAA+C;IAC/C,+CAA+C;IAC/C,4CAA4C;IAE5C,0CAA0C;IAC1C,4BAA4B;IAC5B,IAAI;IAEJ,4CAA4C;IAC5C,kCAAkC;IAClC,0BAA0B;IAC1B,mCAAmC;IACnC,IAAI;IACJ,0DAA0D;IAE1D,8EAA8E;IAC9E,8EAA8E;IAC9E,8EAA8E;IAC9E,8EAA8E;IAE9E,0EAA0E;IAC1E,uCAAuC;IAEvC,2CAA2C;IAC3C,iDAAiD;IACjD,0CAA0C;IAC1C,2EAA2E;IAC3E,uCAAuC;IACvC,qBAAqB;IACrB,gCAAgC;IAChC,gCAAgC;IAChC,gCAAgC;IAChC,gCAAgC;IAChC,MAAM;IAEN,sDAAsD;IACtD,IAAI;IAEJ,sEAAsE;IAEtE,4EAA4E;IAC5E,4EAA4E;IAC5E,4EAA4E;IAC5E,4EAA4E;IAE5E,+BAA+B;IAC/B,8BAA8B;IAC9B,8BAA8B;IAC9B,8BAA8B;IAC9B,4BAA4B;IAE5B,0DAA0D;IAC1D,oCAAoC;IACpC,wCAAwC;IACxC,2CAA2C;IAC3C,8DAA8D;IAC9D,2CAA2C;IAC3C,mGAAmG;IACnG,IAAI;IAEJ,6EAA6E;IAC7E,uDAAuD;IAEvD,oFAAoF;IACpF,uCAAuC;IACvC,MAAM,QAAQ,GAAuB;QACnC,CAAC,KAAK,EAAE,KAAK,CAAC;QACd,CAAC,KAAK,EAAE,KAAK,CAAC;QACd,CAAC,KAAK,EAAE,KAAK,CAAC;QACd,CAAC,KAAK,EAAE,KAAK,CAAC;KACf,CAAA;IACD,uBAAuB,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAA;IAC5D,uBAAuB,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAA;IAC5D,uBAAuB,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAA;IAC5D,uBAAuB,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAA;IAE5D,qFAAqF;IACrF,IAAI,CAAC,KAAK,GAAG,YAAY,EAAE;QACzB,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAA;KAC1B;IACD,IAAI,KAAK,GAAG,YAAY,EAAE;QACxB,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAA;KAC1B;IACD,IAAI,CAAC,KAAK,GAAG,YAAY,EAAE;QACzB,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAA;KAC1B;IACD,IAAI,KAAK,GAAG,YAAY,EAAE;QACxB,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAA;KAC1B;IAED,sEAAsE;IAEtE,0EAA0E;IAE1E,6EAA6E;IAC7E,MAAM,OAAO,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACnC,2EAA2E;IAC3E,SAAS;IACT,QAAQ;IACR,IAAI,MAAM,GAAG,QAAQ,CAAA;IACrB,IAAI,MAAM,GAAG,CAAC,QAAQ,CAAA;IACtB,IAAI,QAAQ,GAAG,QAAQ,CAAA;IACvB,IAAI,QAAQ,GAAG,CAAC,QAAQ,CAAA;IACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE;QAC3C,wCAAwC;QACxC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;QAC5B,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE,IAAI,KAAK,EAAE;YAC5D,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,gBAAgB,CAAC,EAAE,GAAG,OAAO,EAAE,EAAE,GAAG,OAAO,CAAC,CAAA;YACjE,sCAAsC;YACtC,IAAI,GAAG,IAAI,YAAY,GAAG,KAAK,EAAE;gBAC/B,2BAA2B;gBAC3B,IAAI,KAAK,GAAG,QAAQ,IAAI,GAAG,GAAG,MAAM,EAAE;oBACpC,QAAQ,GAAG,KAAK,CAAA;iBACjB;gBACD,IAAI,KAAK,GAAG,QAAQ,IAAI,GAAG,GAAG,MAAM,EAAE;oBACpC,QAAQ,GAAG,KAAK,CAAA;iBACjB;gBACD,IAAI,GAAG,GAAG,MAAM,EAAE;oBAChB,MAAM,GAAG,GAAG,CAAA;iBACb;gBACD,IAAI,GAAG,GAAG,MAAM,EAAE;oBAChB,MAAM,GAAG,GAAG,CAAA;iBACb;aACF;SACF;KACF;IAED,IAAI,OAAO,KAAK,CAAC,CAAC,EAAE;QAClB,QAAQ,IAAI,IAAI,CAAC,EAAE,CAAA;QACnB,QAAQ,IAAI,IAAI,CAAC,EAAE,CAAA;KACpB;IAED,IAAI,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,IAAI,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE;QACpD,QAAQ,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,CAAA;QACvB,QAAQ,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,CAAA;KACxB;IAED,OAAO;QACL,GAAG,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QAC7C,KAAK,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC;KAC5B,CAAA;AACH,CAAC"}
package/esm/index.d.ts ADDED
@@ -0,0 +1,10 @@
1
+ import PluginManager from '@jbrowse/core/PluginManager';
2
+ import Plugin from '@jbrowse/core/Plugin';
3
+ import { CircularViewModel, CircularViewStateModel } from './CircularView/models/CircularView';
4
+ export default class CircularViewPlugin extends Plugin {
5
+ name: string;
6
+ install(pluginManager: PluginManager): void;
7
+ configure(pluginManager: PluginManager): void;
8
+ }
9
+ export { BaseChordDisplayModel, baseChordDisplayConfig, BaseChordDisplayComponent, } from './BaseChordDisplay';
10
+ export type { CircularViewModel, CircularViewStateModel };
package/esm/index.js ADDED
@@ -0,0 +1,49 @@
1
+ import { lazy } from 'react';
2
+ import { when } from 'mobx';
3
+ import { isAbstractMenuManager } from '@jbrowse/core/util';
4
+ import Plugin from '@jbrowse/core/Plugin';
5
+ import ViewType from '@jbrowse/core/pluggableElementTypes/ViewType';
6
+ import DataUsageIcon from '@mui/icons-material/DataUsage';
7
+ import stateModelFactory from './CircularView/models/CircularView';
8
+ export default class CircularViewPlugin extends Plugin {
9
+ constructor() {
10
+ super(...arguments);
11
+ this.name = 'CircularViewPlugin';
12
+ }
13
+ install(pluginManager) {
14
+ pluginManager.addViewType(() => new ViewType({
15
+ ReactComponent: lazy(() => import('./CircularView/components/CircularView')),
16
+ stateModel: stateModelFactory(pluginManager),
17
+ name: 'CircularView',
18
+ }));
19
+ pluginManager.addToExtensionPoint('LaunchView-CircularView',
20
+ // @ts-ignore
21
+ async ({ session, assembly, loc, tracks = [], }) => {
22
+ const { assemblyManager } = session;
23
+ const view = session.addView('CircularView', {});
24
+ await when(() => view.initialized);
25
+ if (!assembly) {
26
+ throw new Error('No assembly provided when launching circular genome view');
27
+ }
28
+ const asm = await assemblyManager.waitForAssembly(assembly);
29
+ if (!asm) {
30
+ throw new Error(`Assembly "${assembly}" not found when launching circular genome view`);
31
+ }
32
+ view.setDisplayedRegions(asm.regions || []);
33
+ tracks.forEach(track => view.showTrack(track));
34
+ });
35
+ }
36
+ configure(pluginManager) {
37
+ if (isAbstractMenuManager(pluginManager.rootModel)) {
38
+ pluginManager.rootModel.appendToSubMenu(['Add'], {
39
+ label: 'Circular view',
40
+ icon: DataUsageIcon,
41
+ onClick: (session) => {
42
+ session.addView('CircularView', {});
43
+ },
44
+ });
45
+ }
46
+ }
47
+ }
48
+ export { BaseChordDisplayModel, baseChordDisplayConfig, BaseChordDisplayComponent, } from './BaseChordDisplay';
49
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,OAAO,CAAA;AAC5B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,EAAwB,qBAAqB,EAAE,MAAM,oBAAoB,CAAA;AAEhF,OAAO,MAAM,MAAM,sBAAsB,CAAA;AACzC,OAAO,QAAQ,MAAM,8CAA8C,CAAA;AACnE,OAAO,aAAa,MAAM,+BAA+B,CAAA;AACzD,OAAO,iBAGN,MAAM,oCAAoC,CAAA;AAI3C,MAAM,CAAC,OAAO,OAAO,kBAAmB,SAAQ,MAAM;IAAtD;;QACE,SAAI,GAAG,oBAAoB,CAAA;IAgE7B,CAAC;IA9DC,OAAO,CAAC,aAA4B;QAClC,aAAa,CAAC,WAAW,CACvB,GAAG,EAAE,CACH,IAAI,QAAQ,CAAC;YACX,cAAc,EAAE,IAAI,CAClB,GAAG,EAAE,CAAC,MAAM,CAAC,wCAAwC,CAAC,CACvD;YACD,UAAU,EAAE,iBAAiB,CAAC,aAAa,CAAC;YAC5C,IAAI,EAAE,cAAc;SACrB,CAAC,CACL,CAAA;QAED,aAAa,CAAC,mBAAmB,CAC/B,yBAAyB;QACzB,aAAa;QACb,KAAK,EAAE,EACL,OAAO,EACP,QAAQ,EACR,GAAG,EACH,MAAM,GAAG,EAAE,GAMZ,EAAE,EAAE;YACH,MAAM,EAAE,eAAe,EAAE,GAAG,OAAO,CAAA;YACnC,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAQ,CAAA;YAEvD,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;YAElC,IAAI,CAAC,QAAQ,EAAE;gBACb,MAAM,IAAI,KAAK,CACb,0DAA0D,CAC3D,CAAA;aACF;YAED,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAA;YAC3D,IAAI,CAAC,GAAG,EAAE;gBACR,MAAM,IAAI,KAAK,CACb,aAAa,QAAQ,iDAAiD,CACvE,CAAA;aACF;YAED,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAA;YAE3C,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAA;QAChD,CAAC,CACF,CAAA;IACH,CAAC;IAED,SAAS,CAAC,aAA4B;QACpC,IAAI,qBAAqB,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE;YAClD,aAAa,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,EAAE;gBAC/C,KAAK,EAAE,eAAe;gBACtB,IAAI,EAAE,aAAa;gBACnB,OAAO,EAAE,CAAC,OAA6B,EAAE,EAAE;oBACzC,OAAO,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAA;gBACrC,CAAC;aACF,CAAC,CAAA;SACH;IACH,CAAC;CACF;AAED,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,yBAAyB,GAC1B,MAAM,oBAAoB,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jbrowse/plugin-circular-view",
3
- "version": "1.7.11",
3
+ "version": "2.1.0",
4
4
  "description": "JBrowse 2 circular view",
5
5
  "keywords": [
6
6
  "jbrowse",
@@ -20,33 +20,41 @@
20
20
  "main": "dist/index.js",
21
21
  "files": [
22
22
  "dist",
23
- "src"
23
+ "src",
24
+ "esm"
24
25
  ],
25
26
  "scripts": {
26
- "build": "babel src --root-mode upward --out-dir dist --extensions .ts,.js,.tsx,.jsx",
27
+ "build": "npm-run-all build:*",
27
28
  "test": "cd ../..; jest plugins/circular-view",
28
29
  "prepublishOnly": "yarn test",
29
30
  "prepack": "yarn build; yarn useDist",
30
31
  "postpack": "yarn useSrc",
31
32
  "useDist": "node ../../scripts/useDist.js",
32
33
  "useSrc": "node ../../scripts/useSrc.js",
33
- "postbuild": "tsc --build tsconfig.build.json"
34
+ "prebuild": "npm run clean",
35
+ "build:esm": "tsc --build tsconfig.build.esm.json",
36
+ "build:es5": "tsc --build tsconfig.build.es5.json",
37
+ "clean": "rimraf dist esm *.tsbuildinfo"
34
38
  },
35
39
  "dependencies": {
36
40
  "@babel/runtime": "^7.17.9",
37
- "@material-ui/icons": "^4.9.1"
41
+ "@mui/icons-material": "^5.0.1"
38
42
  },
39
43
  "peerDependencies": {
40
- "@jbrowse/core": "^1.0.0",
41
- "@material-ui/core": "^4.12.2",
42
- "mobx": "^5.0.0",
43
- "mobx-react": "^6.0.0",
44
- "mobx-state-tree": "3.14.1",
44
+ "@jbrowse/core": "^2.0.0",
45
+ "@mui/material": "^5.0.0",
46
+ "mobx": "^6.0.0",
47
+ "mobx-react": "^7.0.0",
48
+ "mobx-state-tree": "^5.0.0",
45
49
  "react": ">=16.8.0",
46
- "react-dom": ">=16.8.0"
50
+ "react-dom": ">=16.8.0",
51
+ "tss-react": "^3.0.0"
47
52
  },
48
53
  "publishConfig": {
49
54
  "access": "public"
50
55
  },
51
- "gitHead": "5c21beb48a21f08b0091d293f09ac99174c48f77"
56
+ "distModule": "esm/index.js",
57
+ "srcModule": "src/index.ts",
58
+ "module": "esm/index.js",
59
+ "gitHead": "0db0462fa1f9f15ab4869da085bcab032b9483c3"
52
60
  }
@@ -1,28 +1,16 @@
1
- import PluginManager from '@jbrowse/core/PluginManager'
2
- import ChordDisplayLoadingFactory from './Loading'
3
- import ChordDisplayErrorFactory from './DisplayError'
4
- import RpcRenderedSvgGroupF from './RpcRenderedSvgGroup'
5
-
6
- export default ({ lib, load }: PluginManager) => {
7
- const React = lib.react
8
- const { observer, PropTypes: MobxPropTypes } = lib['mobx-react']
9
-
10
- const Loading = load(ChordDisplayLoadingFactory)
11
- const DisplayError = load(ChordDisplayErrorFactory)
12
- const RpcRenderedSvgGroup = load(RpcRenderedSvgGroupF)
13
-
14
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
15
- function BaseChordDisplay({ display }: any) {
16
- if (display.error) {
17
- return <DisplayError model={display} />
18
- }
19
- if (!display.filled) {
20
- return <Loading model={display} />
21
- }
22
- return <RpcRenderedSvgGroup model={display} />
1
+ import React from 'react'
2
+ import { observer } from 'mobx-react'
3
+ import Loading from './Loading'
4
+ import DisplayError from './DisplayError'
5
+ import RpcRenderedSvgGroup from './RpcRenderedSvgGroup'
6
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
7
+ function BaseChordDisplay({ display }: any) {
8
+ if (display.error) {
9
+ return <DisplayError model={display} />
23
10
  }
24
- BaseChordDisplay.propTypes = {
25
- display: MobxPropTypes.observableObject.isRequired,
11
+ if (!display.filled) {
12
+ return <Loading model={display} />
26
13
  }
27
- return observer(BaseChordDisplay)
14
+ return <RpcRenderedSvgGroup model={display} />
28
15
  }
16
+ export default observer(BaseChordDisplay)
@@ -1,70 +1,68 @@
1
- export default ({ jbrequire }) => {
2
- const React = jbrequire('react')
3
- const { makeStyles } = jbrequire('@material-ui/core/styles')
4
- const { observer } = jbrequire('mobx-react')
1
+ import React from 'react'
2
+ import { observer } from 'mobx-react'
3
+ import { makeStyles } from 'tss-react/mui'
5
4
 
6
- const useStyles = makeStyles({
7
- errorMessage: {},
8
- errorBackground: {},
9
- errorText: {},
10
- })
5
+ const useStyles = makeStyles()({
6
+ errorMessage: {},
7
+ errorBackground: {},
8
+ errorText: {},
9
+ })
11
10
 
12
- // 'repeating-linear-gradient(45deg, transparent, transparent 5px, rgba(255,255,255,.5) 5px, rgba(255,255,255,.5) 10px)',
13
- const DisplayError = observer(
14
- ({
15
- model: {
16
- renderProps: { radius },
17
- error,
18
- },
19
- }) => {
20
- const classes = useStyles()
21
- return (
22
- <g className={classes.errorMessage}>
23
- <defs>
24
- <pattern
25
- id="diagonalHatch"
26
- width="10"
27
- height="10"
28
- patternTransform="rotate(45 0 0)"
29
- patternUnits="userSpaceOnUse"
30
- >
31
- <line
32
- x1="0"
33
- y1="0"
34
- x2="0"
35
- y2="10"
36
- style={{ stroke: 'rgba(255,0,0,0.5)', strokeWidth: 10 }}
37
- />
38
- </pattern>
39
- </defs>
40
- <circle
41
- className={classes.errorBackground}
42
- cx="0"
43
- cy="0"
44
- r={radius}
45
- fill="#ffb4b4"
46
- />
47
- <circle
48
- className={classes.errorPattern}
49
- cx="0"
50
- cy="0"
51
- r={radius}
52
- fill="url(#diagonalHatch)"
53
- />
54
- <text
55
- className={classes.errorText}
56
- x="0"
57
- y="0"
58
- transform="rotate(90 0 0)"
59
- dominantBaseline="middle"
60
- textAnchor="middle"
61
- >
62
- {String(error)}
63
- </text>
64
- </g>
65
- )
11
+ // 'repeating-linear-gradient(45deg, transparent, transparent 5px, rgba(255,255,255,.5) 5px, rgba(255,255,255,.5) 10px)',
12
+ const DisplayError = observer(
13
+ ({
14
+ model: {
15
+ renderProps: { radius },
16
+ error,
66
17
  },
67
- )
18
+ }) => {
19
+ const { classes } = useStyles()
20
+ return (
21
+ <g className={classes.errorMessage}>
22
+ <defs>
23
+ <pattern
24
+ id="diagonalHatch"
25
+ width="10"
26
+ height="10"
27
+ patternTransform="rotate(45 0 0)"
28
+ patternUnits="userSpaceOnUse"
29
+ >
30
+ <line
31
+ x1="0"
32
+ y1="0"
33
+ x2="0"
34
+ y2="10"
35
+ style={{ stroke: 'rgba(255,0,0,0.5)', strokeWidth: 10 }}
36
+ />
37
+ </pattern>
38
+ </defs>
39
+ <circle
40
+ className={classes.errorBackground}
41
+ cx="0"
42
+ cy="0"
43
+ r={radius}
44
+ fill="#ffb4b4"
45
+ />
46
+ <circle
47
+ className={classes.errorPattern}
48
+ cx="0"
49
+ cy="0"
50
+ r={radius}
51
+ fill="url(#diagonalHatch)"
52
+ />
53
+ <text
54
+ className={classes.errorText}
55
+ x="0"
56
+ y="0"
57
+ transform="rotate(90 0 0)"
58
+ dominantBaseline="middle"
59
+ textAnchor="middle"
60
+ >
61
+ {String(error)}
62
+ </text>
63
+ </g>
64
+ )
65
+ },
66
+ )
68
67
 
69
- return DisplayError
70
- }
68
+ export default DisplayError