react-cheminfo 0.28.0 → 0.30.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 (742) hide show
  1. package/README.md +79 -26
  2. package/lib/chart/core/axisLabels.d.ts +82 -0
  3. package/lib/chart/core/axisLabels.d.ts.map +1 -0
  4. package/lib/chart/core/axisLabels.js +111 -0
  5. package/lib/chart/core/axisLabels.js.map +1 -0
  6. package/lib/chart/core/boxLayout.d.ts +53 -0
  7. package/lib/chart/core/boxLayout.d.ts.map +1 -0
  8. package/lib/chart/core/boxLayout.js +112 -0
  9. package/lib/chart/core/boxLayout.js.map +1 -0
  10. package/lib/chart/core/chartAxisScale.d.ts +23 -2
  11. package/lib/chart/core/chartAxisScale.d.ts.map +1 -1
  12. package/lib/chart/core/chartAxisScale.js +64 -13
  13. package/lib/chart/core/chartAxisScale.js.map +1 -1
  14. package/lib/chart/core/chartDomain.d.ts +160 -0
  15. package/lib/chart/core/chartDomain.d.ts.map +1 -0
  16. package/lib/chart/core/chartDomain.js +46 -0
  17. package/lib/chart/core/chartDomain.js.map +1 -0
  18. package/lib/chart/core/chartGeometry.d.ts +131 -0
  19. package/lib/chart/core/chartGeometry.d.ts.map +1 -0
  20. package/lib/chart/core/chartGeometry.js +101 -0
  21. package/lib/chart/core/chartGeometry.js.map +1 -0
  22. package/lib/chart/core/chartPane.d.ts +11 -0
  23. package/lib/chart/core/chartPane.d.ts.map +1 -0
  24. package/lib/chart/core/chartPane.js +11 -0
  25. package/lib/chart/core/chartPane.js.map +1 -0
  26. package/lib/chart/core/chartScale.d.ts +4 -1
  27. package/lib/chart/core/chartScale.d.ts.map +1 -1
  28. package/lib/chart/core/chartScale.js +8 -4
  29. package/lib/chart/core/chartScale.js.map +1 -1
  30. package/lib/chart/core/chartTheme.d.ts +156 -0
  31. package/lib/chart/core/chartTheme.d.ts.map +1 -0
  32. package/lib/chart/core/chartTheme.js +156 -0
  33. package/lib/chart/core/chartTheme.js.map +1 -0
  34. package/lib/chart/core/chartViewport.d.ts +32 -5
  35. package/lib/chart/core/chartViewport.d.ts.map +1 -1
  36. package/lib/chart/core/chartViewport.js +40 -11
  37. package/lib/chart/core/chartViewport.js.map +1 -1
  38. package/lib/chart/core/guidePlacement.d.ts +52 -0
  39. package/lib/chart/core/guidePlacement.d.ts.map +1 -0
  40. package/lib/chart/core/guidePlacement.js +52 -0
  41. package/lib/chart/core/guidePlacement.js.map +1 -0
  42. package/lib/chart/core/index.d.ts +29 -2
  43. package/lib/chart/core/index.d.ts.map +1 -1
  44. package/lib/chart/core/index.js +19 -2
  45. package/lib/chart/core/index.js.map +1 -1
  46. package/lib/chart/core/labelStack.d.ts +27 -0
  47. package/lib/chart/core/labelStack.d.ts.map +1 -0
  48. package/lib/chart/core/labelStack.js +62 -0
  49. package/lib/chart/core/labelStack.js.map +1 -0
  50. package/lib/chart/core/legendBox.d.ts +152 -0
  51. package/lib/chart/core/legendBox.d.ts.map +1 -0
  52. package/lib/chart/core/legendBox.js +169 -0
  53. package/lib/chart/core/legendBox.js.map +1 -0
  54. package/lib/chart/core/selectionGeometry.d.ts +45 -0
  55. package/lib/chart/core/selectionGeometry.d.ts.map +1 -0
  56. package/lib/chart/core/selectionGeometry.js +49 -0
  57. package/lib/chart/core/selectionGeometry.js.map +1 -0
  58. package/lib/chart/core/spectrumColor.d.ts +80 -0
  59. package/lib/chart/core/spectrumColor.d.ts.map +1 -0
  60. package/lib/chart/core/spectrumColor.js +120 -0
  61. package/lib/chart/core/spectrumColor.js.map +1 -0
  62. package/lib/chart/core/stackCapacity.d.ts +136 -0
  63. package/lib/chart/core/stackCapacity.d.ts.map +1 -0
  64. package/lib/chart/core/stackCapacity.js +153 -0
  65. package/lib/chart/core/stackCapacity.js.map +1 -0
  66. package/lib/chart/core/svgPoint.d.ts +62 -0
  67. package/lib/chart/core/svgPoint.d.ts.map +1 -0
  68. package/lib/chart/core/svgPoint.js +43 -0
  69. package/lib/chart/core/svgPoint.js.map +1 -0
  70. package/lib/chart/core/tracePath.d.ts +94 -0
  71. package/lib/chart/core/tracePath.d.ts.map +1 -0
  72. package/lib/chart/core/tracePath.js +191 -0
  73. package/lib/chart/core/tracePath.js.map +1 -0
  74. package/lib/chart/core/trackerReadout.d.ts +55 -0
  75. package/lib/chart/core/trackerReadout.d.ts.map +1 -0
  76. package/lib/chart/core/trackerReadout.js +53 -0
  77. package/lib/chart/core/trackerReadout.js.map +1 -0
  78. package/lib/chart/core/viewTransform.d.ts +167 -0
  79. package/lib/chart/core/viewTransform.d.ts.map +1 -0
  80. package/lib/chart/core/viewTransform.js +188 -0
  81. package/lib/chart/core/viewTransform.js.map +1 -0
  82. package/lib/chart/core/zoomDomain.d.ts +127 -0
  83. package/lib/chart/core/zoomDomain.d.ts.map +1 -0
  84. package/lib/chart/core/zoomDomain.js +175 -0
  85. package/lib/chart/core/zoomDomain.js.map +1 -0
  86. package/lib/chart/ui/Axes.d.ts +104 -0
  87. package/lib/chart/ui/Axes.d.ts.map +1 -0
  88. package/lib/chart/ui/Axes.js +155 -0
  89. package/lib/chart/ui/Axes.js.map +1 -0
  90. package/lib/chart/ui/AxisGuide.d.ts +60 -0
  91. package/lib/chart/ui/AxisGuide.d.ts.map +1 -0
  92. package/lib/chart/ui/AxisGuide.js +111 -0
  93. package/lib/chart/ui/AxisGuide.js.map +1 -0
  94. package/lib/chart/ui/ChartStack.d.ts +81 -0
  95. package/lib/chart/ui/ChartStack.d.ts.map +1 -0
  96. package/lib/chart/ui/ChartStack.js +42 -0
  97. package/lib/chart/ui/ChartStack.js.map +1 -0
  98. package/lib/chart/ui/ChartTracker.d.ts +36 -0
  99. package/lib/chart/ui/ChartTracker.d.ts.map +1 -0
  100. package/lib/chart/ui/ChartTracker.js +27 -0
  101. package/lib/chart/ui/ChartTracker.js.map +1 -0
  102. package/lib/chart/ui/PlotCaption.d.ts +44 -0
  103. package/lib/chart/ui/PlotCaption.d.ts.map +1 -0
  104. package/lib/chart/ui/PlotCaption.js +68 -0
  105. package/lib/chart/ui/PlotCaption.js.map +1 -0
  106. package/lib/chart/ui/SelectionRect.d.ts +27 -0
  107. package/lib/chart/ui/SelectionRect.d.ts.map +1 -0
  108. package/lib/chart/ui/SelectionRect.js +31 -0
  109. package/lib/chart/ui/SelectionRect.js.map +1 -0
  110. package/lib/chart/ui/TraceLegend.d.ts +99 -0
  111. package/lib/chart/ui/TraceLegend.d.ts.map +1 -0
  112. package/lib/chart/ui/TraceLegend.js +45 -0
  113. package/lib/chart/ui/TraceLegend.js.map +1 -0
  114. package/lib/chart/ui/chartGestures.d.ts +158 -0
  115. package/lib/chart/ui/chartGestures.d.ts.map +1 -0
  116. package/lib/chart/ui/chartGestures.js +145 -0
  117. package/lib/chart/ui/chartGestures.js.map +1 -0
  118. package/lib/chart/ui/chartStackLevel.d.ts +115 -0
  119. package/lib/chart/ui/chartStackLevel.d.ts.map +1 -0
  120. package/lib/chart/ui/chartStackLevel.js +96 -0
  121. package/lib/chart/ui/chartStackLevel.js.map +1 -0
  122. package/lib/chart/ui/chartSurface.d.ts +35 -0
  123. package/lib/chart/ui/chartSurface.d.ts.map +1 -0
  124. package/lib/chart/ui/chartSurface.js +58 -0
  125. package/lib/chart/ui/chartSurface.js.map +1 -0
  126. package/lib/chart/ui/index.d.ts +24 -0
  127. package/lib/chart/ui/index.d.ts.map +1 -1
  128. package/lib/chart/ui/index.js +13 -0
  129. package/lib/chart/ui/index.js.map +1 -1
  130. package/lib/chart/ui/useChartPointer.d.ts +124 -0
  131. package/lib/chart/ui/useChartPointer.d.ts.map +1 -0
  132. package/lib/chart/ui/useChartPointer.js +152 -0
  133. package/lib/chart/ui/useChartPointer.js.map +1 -0
  134. package/lib/chart/ui/useChartSize.d.ts +49 -0
  135. package/lib/chart/ui/useChartSize.d.ts.map +1 -0
  136. package/lib/chart/ui/useChartSize.js +91 -0
  137. package/lib/chart/ui/useChartSize.js.map +1 -0
  138. package/lib/chart/ui/useChartWindow.d.ts +147 -0
  139. package/lib/chart/ui/useChartWindow.d.ts.map +1 -0
  140. package/lib/chart/ui/useChartWindow.js +135 -0
  141. package/lib/chart/ui/useChartWindow.js.map +1 -0
  142. package/lib/chart/ui/useChartZoom.d.ts +88 -0
  143. package/lib/chart/ui/useChartZoom.d.ts.map +1 -0
  144. package/lib/chart/ui/useChartZoom.js +142 -0
  145. package/lib/chart/ui/useChartZoom.js.map +1 -0
  146. package/lib/chart/ui/useWheelListener.d.ts +30 -0
  147. package/lib/chart/ui/useWheelListener.d.ts.map +1 -0
  148. package/lib/chart/ui/useWheelListener.js +57 -0
  149. package/lib/chart/ui/useWheelListener.js.map +1 -0
  150. package/lib/chrome/ui/AccountButton.d.ts +76 -0
  151. package/lib/chrome/ui/AccountButton.d.ts.map +1 -0
  152. package/lib/chrome/ui/AccountButton.js +66 -0
  153. package/lib/chrome/ui/AccountButton.js.map +1 -0
  154. package/lib/chrome/ui/index.d.ts +2 -0
  155. package/lib/chrome/ui/index.d.ts.map +1 -1
  156. package/lib/chrome/ui/index.js +1 -0
  157. package/lib/chrome/ui/index.js.map +1 -1
  158. package/lib/clipboard/core/copyPng.d.ts +13 -0
  159. package/lib/clipboard/core/copyPng.d.ts.map +1 -0
  160. package/lib/clipboard/core/copyPng.js +19 -0
  161. package/lib/clipboard/core/copyPng.js.map +1 -0
  162. package/lib/clipboard/core/index.d.ts +1 -0
  163. package/lib/clipboard/core/index.d.ts.map +1 -1
  164. package/lib/clipboard/core/index.js +1 -0
  165. package/lib/clipboard/core/index.js.map +1 -1
  166. package/lib/clipboard/ui/ClickToCopy.d.ts +6 -0
  167. package/lib/clipboard/ui/ClickToCopy.d.ts.map +1 -1
  168. package/lib/clipboard/ui/ClickToCopy.js +3 -3
  169. package/lib/clipboard/ui/ClickToCopy.js.map +1 -1
  170. package/lib/core.d.ts +1 -0
  171. package/lib/core.d.ts.map +1 -1
  172. package/lib/core.js +1 -0
  173. package/lib/core.js.map +1 -1
  174. package/lib/download/core/exportStyles.d.ts +22 -0
  175. package/lib/download/core/exportStyles.d.ts.map +1 -0
  176. package/lib/download/core/exportStyles.js +19 -0
  177. package/lib/download/core/exportStyles.js.map +1 -0
  178. package/lib/download/core/imageResolution.d.ts +88 -0
  179. package/lib/download/core/imageResolution.d.ts.map +1 -0
  180. package/lib/download/core/imageResolution.js +77 -0
  181. package/lib/download/core/imageResolution.js.map +1 -0
  182. package/lib/download/core/index.d.ts +13 -0
  183. package/lib/download/core/index.d.ts.map +1 -1
  184. package/lib/download/core/index.js +8 -0
  185. package/lib/download/core/index.js.map +1 -1
  186. package/lib/download/core/pictureExport.d.ts +93 -0
  187. package/lib/download/core/pictureExport.d.ts.map +1 -0
  188. package/lib/download/core/pictureExport.js +116 -0
  189. package/lib/download/core/pictureExport.js.map +1 -0
  190. package/lib/download/core/stackedDrawing.d.ts +36 -0
  191. package/lib/download/core/stackedDrawing.d.ts.map +1 -0
  192. package/lib/download/core/stackedDrawing.js +98 -0
  193. package/lib/download/core/stackedDrawing.js.map +1 -0
  194. package/lib/download/core/svgBounds.d.ts +44 -0
  195. package/lib/download/core/svgBounds.d.ts.map +1 -0
  196. package/lib/download/core/svgBounds.js +69 -0
  197. package/lib/download/core/svgBounds.js.map +1 -0
  198. package/lib/download/core/svgNamespace.d.ts +9 -0
  199. package/lib/download/core/svgNamespace.d.ts.map +1 -0
  200. package/lib/download/core/svgNamespace.js +10 -0
  201. package/lib/download/core/svgNamespace.js.map +1 -0
  202. package/lib/download/core/svgToPng.d.ts +43 -0
  203. package/lib/download/core/svgToPng.d.ts.map +1 -0
  204. package/lib/download/core/svgToPng.js +79 -0
  205. package/lib/download/core/svgToPng.js.map +1 -0
  206. package/lib/download/core/svgToString.d.ts +45 -0
  207. package/lib/download/core/svgToString.d.ts.map +1 -0
  208. package/lib/download/core/svgToString.js +58 -0
  209. package/lib/download/core/svgToString.js.map +1 -0
  210. package/lib/download/ui/ExportDialogFrame.d.ts +46 -0
  211. package/lib/download/ui/ExportDialogFrame.d.ts.map +1 -0
  212. package/lib/download/ui/ExportDialogFrame.js +24 -0
  213. package/lib/download/ui/ExportDialogFrame.js.map +1 -0
  214. package/lib/download/ui/ExportImageDialog.d.ts +47 -0
  215. package/lib/download/ui/ExportImageDialog.d.ts.map +1 -0
  216. package/lib/download/ui/ExportImageDialog.js +25 -0
  217. package/lib/download/ui/ExportImageDialog.js.map +1 -0
  218. package/lib/download/ui/ExportNameField.d.ts +29 -0
  219. package/lib/download/ui/ExportNameField.d.ts.map +1 -0
  220. package/lib/download/ui/ExportNameField.js +99 -0
  221. package/lib/download/ui/ExportNameField.js.map +1 -0
  222. package/lib/download/ui/ExportPictureSection.d.ts +38 -0
  223. package/lib/download/ui/ExportPictureSection.d.ts.map +1 -0
  224. package/lib/download/ui/ExportPictureSection.js +48 -0
  225. package/lib/download/ui/ExportPictureSection.js.map +1 -0
  226. package/lib/download/ui/index.d.ts +10 -0
  227. package/lib/download/ui/index.d.ts.map +1 -1
  228. package/lib/download/ui/index.js +5 -0
  229. package/lib/download/ui/index.js.map +1 -1
  230. package/lib/download/ui/useDrawingBox.d.ts +23 -0
  231. package/lib/download/ui/useDrawingBox.d.ts.map +1 -0
  232. package/lib/download/ui/useDrawingBox.js +21 -0
  233. package/lib/download/ui/useDrawingBox.js.map +1 -0
  234. package/lib/error/core/describeSource.d.ts +17 -0
  235. package/lib/error/core/describeSource.d.ts.map +1 -0
  236. package/lib/error/core/describeSource.js +19 -0
  237. package/lib/error/core/describeSource.js.map +1 -0
  238. package/lib/error/core/index.d.ts +1 -0
  239. package/lib/error/core/index.d.ts.map +1 -1
  240. package/lib/error/core/index.js +1 -0
  241. package/lib/error/core/index.js.map +1 -1
  242. package/lib/help/ui/HelpBody.d.ts +10 -1
  243. package/lib/help/ui/HelpBody.d.ts.map +1 -1
  244. package/lib/help/ui/HelpBody.js +24 -1
  245. package/lib/help/ui/HelpBody.js.map +1 -1
  246. package/lib/help/ui/index.d.ts +1 -1
  247. package/lib/help/ui/index.d.ts.map +1 -1
  248. package/lib/help/ui/index.js.map +1 -1
  249. package/lib/i18n/core/chromeCatalog.d.ts +1 -1
  250. package/lib/i18n/core/chromeCatalog.d.ts.map +1 -1
  251. package/lib/ir/core/analysisSpectra.d.ts +46 -0
  252. package/lib/ir/core/analysisSpectra.d.ts.map +1 -0
  253. package/lib/ir/core/analysisSpectra.js +187 -0
  254. package/lib/ir/core/analysisSpectra.js.map +1 -0
  255. package/lib/ir/core/assignBands.d.ts +83 -0
  256. package/lib/ir/core/assignBands.d.ts.map +1 -0
  257. package/lib/ir/core/assignBands.js +83 -0
  258. package/lib/ir/core/assignBands.js.map +1 -0
  259. package/lib/ir/core/bandAssignments.d.ts +47 -0
  260. package/lib/ir/core/bandAssignments.d.ts.map +1 -0
  261. package/lib/ir/core/bandAssignments.js +305 -0
  262. package/lib/ir/core/bandAssignments.js.map +1 -0
  263. package/lib/ir/core/bandLabelPlan.d.ts +93 -0
  264. package/lib/ir/core/bandLabelPlan.d.ts.map +1 -0
  265. package/lib/ir/core/bandLabelPlan.js +104 -0
  266. package/lib/ir/core/bandLabelPlan.js.map +1 -0
  267. package/lib/ir/core/detectIrFormat.d.ts +23 -0
  268. package/lib/ir/core/detectIrFormat.d.ts.map +1 -0
  269. package/lib/ir/core/detectIrFormat.js +133 -0
  270. package/lib/ir/core/detectIrFormat.js.map +1 -0
  271. package/lib/ir/core/downloadSpectra.d.ts +26 -0
  272. package/lib/ir/core/downloadSpectra.d.ts.map +1 -0
  273. package/lib/ir/core/downloadSpectra.js +37 -0
  274. package/lib/ir/core/downloadSpectra.js.map +1 -0
  275. package/lib/ir/core/fromJcamp.d.ts +35 -0
  276. package/lib/ir/core/fromJcamp.d.ts.map +1 -0
  277. package/lib/ir/core/fromJcamp.js +48 -0
  278. package/lib/ir/core/fromJcamp.js.map +1 -0
  279. package/lib/ir/core/fromSpc.d.ts +30 -0
  280. package/lib/ir/core/fromSpc.d.ts.map +1 -0
  281. package/lib/ir/core/fromSpc.js +40 -0
  282. package/lib/ir/core/fromSpc.js.map +1 -0
  283. package/lib/ir/core/index.d.ts +51 -0
  284. package/lib/ir/core/index.d.ts.map +1 -0
  285. package/lib/ir/core/index.js +35 -0
  286. package/lib/ir/core/index.js.map +1 -0
  287. package/lib/ir/core/irBand.d.ts +45 -0
  288. package/lib/ir/core/irBand.d.ts.map +1 -0
  289. package/lib/ir/core/irBand.js +30 -0
  290. package/lib/ir/core/irBand.js.map +1 -0
  291. package/lib/ir/core/irCommands.d.ts +168 -0
  292. package/lib/ir/core/irCommands.d.ts.map +1 -0
  293. package/lib/ir/core/irCommands.js +94 -0
  294. package/lib/ir/core/irCommands.js.map +1 -0
  295. package/lib/ir/core/irDomain.d.ts +63 -0
  296. package/lib/ir/core/irDomain.d.ts.map +1 -0
  297. package/lib/ir/core/irDomain.js +136 -0
  298. package/lib/ir/core/irDomain.js.map +1 -0
  299. package/lib/ir/core/irEditorApi.d.ts +42 -0
  300. package/lib/ir/core/irEditorApi.d.ts.map +1 -0
  301. package/lib/ir/core/irEditorApi.js +10 -0
  302. package/lib/ir/core/irEditorApi.js.map +1 -0
  303. package/lib/ir/core/irFormat.d.ts +42 -0
  304. package/lib/ir/core/irFormat.d.ts.map +1 -0
  305. package/lib/ir/core/irFormat.js +51 -0
  306. package/lib/ir/core/irFormat.js.map +1 -0
  307. package/lib/ir/core/irMode.d.ts +160 -0
  308. package/lib/ir/core/irMode.d.ts.map +1 -0
  309. package/lib/ir/core/irMode.js +175 -0
  310. package/lib/ir/core/irMode.js.map +1 -0
  311. package/lib/ir/core/irReducer.d.ts +101 -0
  312. package/lib/ir/core/irReducer.d.ts.map +1 -0
  313. package/lib/ir/core/irReducer.js +207 -0
  314. package/lib/ir/core/irReducer.js.map +1 -0
  315. package/lib/ir/core/irSidePanels.d.ts +22 -0
  316. package/lib/ir/core/irSidePanels.d.ts.map +1 -0
  317. package/lib/ir/core/irSidePanels.js +12 -0
  318. package/lib/ir/core/irSidePanels.js.map +1 -0
  319. package/lib/ir/core/irSpectrum.d.ts +140 -0
  320. package/lib/ir/core/irSpectrum.d.ts.map +1 -0
  321. package/lib/ir/core/irSpectrum.js +34 -0
  322. package/lib/ir/core/irSpectrum.js.map +1 -0
  323. package/lib/ir/core/irState.d.ts +119 -0
  324. package/lib/ir/core/irState.d.ts.map +1 -0
  325. package/lib/ir/core/irState.js +92 -0
  326. package/lib/ir/core/irState.js.map +1 -0
  327. package/lib/ir/core/loadIrSpectra.d.ts +36 -0
  328. package/lib/ir/core/loadIrSpectra.d.ts.map +1 -0
  329. package/lib/ir/core/loadIrSpectra.js +44 -0
  330. package/lib/ir/core/loadIrSpectra.js.map +1 -0
  331. package/lib/ir/core/nearestBand.d.ts +35 -0
  332. package/lib/ir/core/nearestBand.d.ts.map +1 -0
  333. package/lib/ir/core/nearestBand.js +47 -0
  334. package/lib/ir/core/nearestBand.js.map +1 -0
  335. package/lib/ir/core/pickBands.d.ts +70 -0
  336. package/lib/ir/core/pickBands.d.ts.map +1 -0
  337. package/lib/ir/core/pickBands.js +125 -0
  338. package/lib/ir/core/pickBands.js.map +1 -0
  339. package/lib/ir/core/spectrumJcamp.d.ts +58 -0
  340. package/lib/ir/core/spectrumJcamp.d.ts.map +1 -0
  341. package/lib/ir/core/spectrumJcamp.js +156 -0
  342. package/lib/ir/core/spectrumJcamp.js.map +1 -0
  343. package/lib/ir/core/toIrSpectrum.d.ts +59 -0
  344. package/lib/ir/core/toIrSpectrum.d.ts.map +1 -0
  345. package/lib/ir/core/toIrSpectrum.js +56 -0
  346. package/lib/ir/core/toIrSpectrum.js.map +1 -0
  347. package/lib/ir/ui/BandMarks.d.ts +52 -0
  348. package/lib/ir/ui/BandMarks.d.ts.map +1 -0
  349. package/lib/ir/ui/BandMarks.js +71 -0
  350. package/lib/ir/ui/BandMarks.js.map +1 -0
  351. package/lib/ir/ui/BandsPanel.d.ts +31 -0
  352. package/lib/ir/ui/BandsPanel.d.ts.map +1 -0
  353. package/lib/ir/ui/BandsPanel.js +94 -0
  354. package/lib/ir/ui/BandsPanel.js.map +1 -0
  355. package/lib/ir/ui/IrAboutDialog.d.ts +18 -0
  356. package/lib/ir/ui/IrAboutDialog.d.ts.map +1 -0
  357. package/lib/ir/ui/IrAboutDialog.js +32 -0
  358. package/lib/ir/ui/IrAboutDialog.js.map +1 -0
  359. package/lib/ir/ui/IrCanvas.d.ts +38 -0
  360. package/lib/ir/ui/IrCanvas.d.ts.map +1 -0
  361. package/lib/ir/ui/IrCanvas.js +41 -0
  362. package/lib/ir/ui/IrCanvas.js.map +1 -0
  363. package/lib/ir/ui/IrChart.d.ts +28 -0
  364. package/lib/ir/ui/IrChart.d.ts.map +1 -0
  365. package/lib/ir/ui/IrChart.js +114 -0
  366. package/lib/ir/ui/IrChart.js.map +1 -0
  367. package/lib/ir/ui/IrCommandProvider.d.ts +15 -0
  368. package/lib/ir/ui/IrCommandProvider.d.ts.map +1 -0
  369. package/lib/ir/ui/IrCommandProvider.js +14 -0
  370. package/lib/ir/ui/IrCommandProvider.js.map +1 -0
  371. package/lib/ir/ui/IrCommandTooltip.d.ts +16 -0
  372. package/lib/ir/ui/IrCommandTooltip.d.ts.map +1 -0
  373. package/lib/ir/ui/IrCommandTooltip.js +22 -0
  374. package/lib/ir/ui/IrCommandTooltip.js.map +1 -0
  375. package/lib/ir/ui/IrDocumentationDialog.d.ts +18 -0
  376. package/lib/ir/ui/IrDocumentationDialog.d.ts.map +1 -0
  377. package/lib/ir/ui/IrDocumentationDialog.js +68 -0
  378. package/lib/ir/ui/IrDocumentationDialog.js.map +1 -0
  379. package/lib/ir/ui/IrEditor.d.ts +60 -0
  380. package/lib/ir/ui/IrEditor.d.ts.map +1 -0
  381. package/lib/ir/ui/IrEditor.js +42 -0
  382. package/lib/ir/ui/IrEditor.js.map +1 -0
  383. package/lib/ir/ui/IrHeader.d.ts +13 -0
  384. package/lib/ir/ui/IrHeader.d.ts.map +1 -0
  385. package/lib/ir/ui/IrHeader.js +21 -0
  386. package/lib/ir/ui/IrHeader.js.map +1 -0
  387. package/lib/ir/ui/IrLogo.d.ts +20 -0
  388. package/lib/ir/ui/IrLogo.d.ts.map +1 -0
  389. package/lib/ir/ui/IrLogo.js +17 -0
  390. package/lib/ir/ui/IrLogo.js.map +1 -0
  391. package/lib/ir/ui/IrPointerTracker.d.ts +29 -0
  392. package/lib/ir/ui/IrPointerTracker.d.ts.map +1 -0
  393. package/lib/ir/ui/IrPointerTracker.js +47 -0
  394. package/lib/ir/ui/IrPointerTracker.js.map +1 -0
  395. package/lib/ir/ui/IrShell.d.ts +25 -0
  396. package/lib/ir/ui/IrShell.d.ts.map +1 -0
  397. package/lib/ir/ui/IrShell.js +178 -0
  398. package/lib/ir/ui/IrShell.js.map +1 -0
  399. package/lib/ir/ui/IrSidePanel.d.ts +26 -0
  400. package/lib/ir/ui/IrSidePanel.d.ts.map +1 -0
  401. package/lib/ir/ui/IrSidePanel.js +39 -0
  402. package/lib/ir/ui/IrSidePanel.js.map +1 -0
  403. package/lib/ir/ui/IrStateProvider.d.ts +19 -0
  404. package/lib/ir/ui/IrStateProvider.d.ts.map +1 -0
  405. package/lib/ir/ui/IrStateProvider.js +16 -0
  406. package/lib/ir/ui/IrStateProvider.js.map +1 -0
  407. package/lib/ir/ui/IrStatusBar.d.ts +14 -0
  408. package/lib/ir/ui/IrStatusBar.d.ts.map +1 -0
  409. package/lib/ir/ui/IrStatusBar.js +48 -0
  410. package/lib/ir/ui/IrStatusBar.js.map +1 -0
  411. package/lib/ir/ui/IrToolbar.d.ts +18 -0
  412. package/lib/ir/ui/IrToolbar.d.ts.map +1 -0
  413. package/lib/ir/ui/IrToolbar.js +32 -0
  414. package/lib/ir/ui/IrToolbar.js.map +1 -0
  415. package/lib/ir/ui/IrTraces.d.ts +63 -0
  416. package/lib/ir/ui/IrTraces.d.ts.map +1 -0
  417. package/lib/ir/ui/IrTraces.js +72 -0
  418. package/lib/ir/ui/IrTraces.js.map +1 -0
  419. package/lib/ir/ui/MetadataPanel.d.ts +15 -0
  420. package/lib/ir/ui/MetadataPanel.d.ts.map +1 -0
  421. package/lib/ir/ui/MetadataPanel.js +49 -0
  422. package/lib/ir/ui/MetadataPanel.js.map +1 -0
  423. package/lib/ir/ui/SpectraPanel.d.ts +20 -0
  424. package/lib/ir/ui/SpectraPanel.d.ts.map +1 -0
  425. package/lib/ir/ui/SpectraPanel.js +42 -0
  426. package/lib/ir/ui/SpectraPanel.js.map +1 -0
  427. package/lib/ir/ui/SpectrumRow.d.ts +26 -0
  428. package/lib/ir/ui/SpectrumRow.d.ts.map +1 -0
  429. package/lib/ir/ui/SpectrumRow.js +41 -0
  430. package/lib/ir/ui/SpectrumRow.js.map +1 -0
  431. package/lib/ir/ui/index.d.ts +56 -0
  432. package/lib/ir/ui/index.d.ts.map +1 -0
  433. package/lib/ir/ui/index.js +36 -0
  434. package/lib/ir/ui/index.js.map +1 -0
  435. package/lib/ir/ui/irActions.d.ts +52 -0
  436. package/lib/ir/ui/irActions.d.ts.map +1 -0
  437. package/lib/ir/ui/irActions.js +62 -0
  438. package/lib/ir/ui/irActions.js.map +1 -0
  439. package/lib/ir/ui/irChartProps.d.ts +116 -0
  440. package/lib/ir/ui/irChartProps.d.ts.map +1 -0
  441. package/lib/ir/ui/irChartProps.js +14 -0
  442. package/lib/ir/ui/irChartProps.js.map +1 -0
  443. package/lib/ir/ui/irCommandContext.d.ts +35 -0
  444. package/lib/ir/ui/irCommandContext.d.ts.map +1 -0
  445. package/lib/ir/ui/irCommandContext.js +44 -0
  446. package/lib/ir/ui/irCommandContext.js.map +1 -0
  447. package/lib/ir/ui/irStateContext.d.ts +26 -0
  448. package/lib/ir/ui/irStateContext.d.ts.map +1 -0
  449. package/lib/ir/ui/irStateContext.js +37 -0
  450. package/lib/ir/ui/irStateContext.js.map +1 -0
  451. package/lib/ir/ui/useIrEditor.d.ts +51 -0
  452. package/lib/ir/ui/useIrEditor.d.ts.map +1 -0
  453. package/lib/ir/ui/useIrEditor.js +88 -0
  454. package/lib/ir/ui/useIrEditor.js.map +1 -0
  455. package/lib/ir/ui/useIrPointer.d.ts +66 -0
  456. package/lib/ir/ui/useIrPointer.d.ts.map +1 -0
  457. package/lib/ir/ui/useIrPointer.js +53 -0
  458. package/lib/ir/ui/useIrPointer.js.map +1 -0
  459. package/lib/ir/ui/useIrShortcuts.d.ts +24 -0
  460. package/lib/ir/ui/useIrShortcuts.d.ts.map +1 -0
  461. package/lib/ir/ui/useIrShortcuts.js +73 -0
  462. package/lib/ir/ui/useIrShortcuts.js.map +1 -0
  463. package/lib/ir/ui/useIrZoom.d.ts +51 -0
  464. package/lib/ir/ui/useIrZoom.d.ts.map +1 -0
  465. package/lib/ir/ui/useIrZoom.js +46 -0
  466. package/lib/ir/ui/useIrZoom.js.map +1 -0
  467. package/lib/ir.d.ts +13 -0
  468. package/lib/ir.d.ts.map +1 -0
  469. package/lib/ir.js +13 -0
  470. package/lib/ir.js.map +1 -0
  471. package/lib/locales/de.json +3 -0
  472. package/lib/locales/en.json +3 -0
  473. package/lib/locales/es.json +3 -0
  474. package/lib/locales/fr.json +3 -0
  475. package/lib/panel/core/dialogStyles.d.ts +13 -0
  476. package/lib/panel/core/dialogStyles.d.ts.map +1 -0
  477. package/lib/panel/core/dialogStyles.js +11 -0
  478. package/lib/panel/core/dialogStyles.js.map +1 -0
  479. package/lib/panel/core/index.d.ts +19 -0
  480. package/lib/panel/core/index.d.ts.map +1 -0
  481. package/lib/panel/core/index.js +18 -0
  482. package/lib/panel/core/index.js.map +1 -0
  483. package/lib/panel/core/isEditingField.d.ts +17 -0
  484. package/lib/panel/core/isEditingField.d.ts.map +1 -0
  485. package/lib/panel/core/isEditingField.js +25 -0
  486. package/lib/panel/core/isEditingField.js.map +1 -0
  487. package/lib/panel/core/panelStyles.d.ts +242 -0
  488. package/lib/panel/core/panelStyles.d.ts.map +1 -0
  489. package/lib/panel/core/panelStyles.js +228 -0
  490. package/lib/panel/core/panelStyles.js.map +1 -0
  491. package/lib/panel/core/rowSpacers.d.ts +38 -0
  492. package/lib/panel/core/rowSpacers.d.ts.map +1 -0
  493. package/lib/panel/core/rowSpacers.js +31 -0
  494. package/lib/panel/core/rowSpacers.js.map +1 -0
  495. package/lib/panel/core/statusBar.d.ts +44 -0
  496. package/lib/panel/core/statusBar.d.ts.map +1 -0
  497. package/lib/panel/core/statusBar.js +40 -0
  498. package/lib/panel/core/statusBar.js.map +1 -0
  499. package/lib/panel/core/textFilter.d.ts +22 -0
  500. package/lib/panel/core/textFilter.d.ts.map +1 -0
  501. package/lib/panel/core/textFilter.js +32 -0
  502. package/lib/panel/core/textFilter.js.map +1 -0
  503. package/lib/panel/core/yieldToPainting.d.ts +17 -0
  504. package/lib/panel/core/yieldToPainting.d.ts.map +1 -0
  505. package/lib/panel/core/yieldToPainting.js +21 -0
  506. package/lib/panel/core/yieldToPainting.js.map +1 -0
  507. package/lib/panel/ui/AboutDialogFrame.d.ts +36 -0
  508. package/lib/panel/ui/AboutDialogFrame.d.ts.map +1 -0
  509. package/lib/panel/ui/AboutDialogFrame.js +43 -0
  510. package/lib/panel/ui/AboutDialogFrame.js.map +1 -0
  511. package/lib/panel/ui/ClearButton.d.ts +28 -0
  512. package/lib/panel/ui/ClearButton.d.ts.map +1 -0
  513. package/lib/panel/ui/ClearButton.js +23 -0
  514. package/lib/panel/ui/ClearButton.js.map +1 -0
  515. package/lib/panel/ui/DocumentationDialogFrame.d.ts +39 -0
  516. package/lib/panel/ui/DocumentationDialogFrame.d.ts.map +1 -0
  517. package/lib/panel/ui/DocumentationDialogFrame.js +29 -0
  518. package/lib/panel/ui/DocumentationDialogFrame.js.map +1 -0
  519. package/lib/panel/ui/FilterInput.d.ts +31 -0
  520. package/lib/panel/ui/FilterInput.d.ts.map +1 -0
  521. package/lib/panel/ui/FilterInput.js +23 -0
  522. package/lib/panel/ui/FilterInput.js.map +1 -0
  523. package/lib/panel/ui/HelpLabel.d.ts +24 -0
  524. package/lib/panel/ui/HelpLabel.d.ts.map +1 -0
  525. package/lib/panel/ui/HelpLabel.js +23 -0
  526. package/lib/panel/ui/HelpLabel.js.map +1 -0
  527. package/lib/panel/ui/PanelMessage.d.ts +41 -0
  528. package/lib/panel/ui/PanelMessage.d.ts.map +1 -0
  529. package/lib/panel/ui/PanelMessage.js +30 -0
  530. package/lib/panel/ui/PanelMessage.js.map +1 -0
  531. package/lib/panel/ui/PanelRail.d.ts +41 -0
  532. package/lib/panel/ui/PanelRail.d.ts.map +1 -0
  533. package/lib/panel/ui/PanelRail.js +12 -0
  534. package/lib/panel/ui/PanelRail.js.map +1 -0
  535. package/lib/panel/ui/Section.d.ts +25 -0
  536. package/lib/panel/ui/Section.d.ts.map +1 -0
  537. package/lib/panel/ui/Section.js +41 -0
  538. package/lib/panel/ui/Section.js.map +1 -0
  539. package/lib/panel/ui/SidePanelStack.d.ts +62 -0
  540. package/lib/panel/ui/SidePanelStack.d.ts.map +1 -0
  541. package/lib/panel/ui/SidePanelStack.js +40 -0
  542. package/lib/panel/ui/SidePanelStack.js.map +1 -0
  543. package/lib/panel/ui/SpectrumColorSwatch.d.ts +33 -0
  544. package/lib/panel/ui/SpectrumColorSwatch.d.ts.map +1 -0
  545. package/lib/panel/ui/SpectrumColorSwatch.js +76 -0
  546. package/lib/panel/ui/SpectrumColorSwatch.js.map +1 -0
  547. package/lib/panel/ui/index.d.ts +37 -0
  548. package/lib/panel/ui/index.d.ts.map +1 -0
  549. package/lib/panel/ui/index.js +24 -0
  550. package/lib/panel/ui/index.js.map +1 -0
  551. package/lib/panel/ui/useConfirmOnEnter.d.ts +19 -0
  552. package/lib/panel/ui/useConfirmOnEnter.d.ts.map +1 -0
  553. package/lib/panel/ui/useConfirmOnEnter.js +64 -0
  554. package/lib/panel/ui/useConfirmOnEnter.js.map +1 -0
  555. package/lib/panel/ui/useFilterBox.d.ts +23 -0
  556. package/lib/panel/ui/useFilterBox.d.ts.map +1 -0
  557. package/lib/panel/ui/useFilterBox.js +22 -0
  558. package/lib/panel/ui/useFilterBox.js.map +1 -0
  559. package/lib/panel/ui/useVirtualRows.d.ts +46 -0
  560. package/lib/panel/ui/useVirtualRows.d.ts.map +1 -0
  561. package/lib/panel/ui/useVirtualRows.js +56 -0
  562. package/lib/panel/ui/useVirtualRows.js.map +1 -0
  563. package/lib/panel/ui/useVirtualWindowRows.d.ts +40 -0
  564. package/lib/panel/ui/useVirtualWindowRows.d.ts.map +1 -0
  565. package/lib/panel/ui/useVirtualWindowRows.js +65 -0
  566. package/lib/panel/ui/useVirtualWindowRows.js.map +1 -0
  567. package/lib/structure/core/conformerBoltzmann.d.ts +56 -0
  568. package/lib/structure/core/conformerBoltzmann.d.ts.map +1 -0
  569. package/lib/structure/core/conformerBoltzmann.js +96 -0
  570. package/lib/structure/core/conformerBoltzmann.js.map +1 -0
  571. package/lib/structure/core/conformerEnergy.d.ts +69 -0
  572. package/lib/structure/core/conformerEnergy.d.ts.map +1 -0
  573. package/lib/structure/core/conformerEnergy.js +47 -0
  574. package/lib/structure/core/conformerEnergy.js.map +1 -0
  575. package/lib/structure/core/index.d.ts +3 -0
  576. package/lib/structure/core/index.d.ts.map +1 -1
  577. package/lib/structure/core/index.js +2 -0
  578. package/lib/structure/core/index.js.map +1 -1
  579. package/lib/structure/ui/ConformerTable.d.ts +73 -0
  580. package/lib/structure/ui/ConformerTable.d.ts.map +1 -0
  581. package/lib/structure/ui/ConformerTable.js +259 -0
  582. package/lib/structure/ui/ConformerTable.js.map +1 -0
  583. package/lib/structure/ui/conformerColumns.d.ts +30 -0
  584. package/lib/structure/ui/conformerColumns.d.ts.map +1 -0
  585. package/lib/structure/ui/conformerColumns.js +37 -0
  586. package/lib/structure/ui/conformerColumns.js.map +1 -0
  587. package/lib/ui.d.ts +5 -0
  588. package/lib/ui.d.ts.map +1 -1
  589. package/lib/ui.js +3 -0
  590. package/lib/ui.js.map +1 -1
  591. package/package.json +8 -1
  592. package/src/chart/core/axisLabels.ts +117 -0
  593. package/src/chart/core/boxLayout.ts +126 -0
  594. package/src/chart/core/chartAxisScale.ts +92 -10
  595. package/src/chart/core/chartDomain.ts +185 -0
  596. package/src/chart/core/chartGeometry.ts +159 -0
  597. package/src/chart/core/chartPane.ts +10 -0
  598. package/src/chart/core/chartScale.ts +7 -4
  599. package/src/chart/core/chartTheme.ts +161 -0
  600. package/src/chart/core/chartViewport.ts +40 -13
  601. package/src/chart/core/guidePlacement.ts +66 -0
  602. package/src/chart/core/index.ts +121 -2
  603. package/src/chart/core/labelStack.ts +72 -0
  604. package/src/chart/core/legendBox.ts +263 -0
  605. package/src/chart/core/selectionGeometry.ts +68 -0
  606. package/src/chart/core/spectrumColor.ts +129 -0
  607. package/src/chart/core/stackCapacity.ts +162 -0
  608. package/src/chart/core/svgPoint.ts +77 -0
  609. package/src/chart/core/tracePath.ts +228 -0
  610. package/src/chart/core/trackerReadout.ts +78 -0
  611. package/src/chart/core/viewTransform.ts +287 -0
  612. package/src/chart/core/zoomDomain.ts +235 -0
  613. package/src/chart/ui/Axes.tsx +361 -0
  614. package/src/chart/ui/AxisGuide.tsx +187 -0
  615. package/src/chart/ui/ChartStack.tsx +130 -0
  616. package/src/chart/ui/ChartTracker.tsx +101 -0
  617. package/src/chart/ui/PlotCaption.tsx +108 -0
  618. package/src/chart/ui/SelectionRect.tsx +52 -0
  619. package/src/chart/ui/TraceLegend.tsx +193 -0
  620. package/src/chart/ui/chartGestures.ts +270 -0
  621. package/src/chart/ui/chartStackLevel.tsx +210 -0
  622. package/src/chart/ui/chartSurface.ts +66 -0
  623. package/src/chart/ui/index.ts +35 -0
  624. package/src/chart/ui/useChartPointer.ts +223 -0
  625. package/src/chart/ui/useChartSize.ts +115 -0
  626. package/src/chart/ui/useChartWindow.ts +240 -0
  627. package/src/chart/ui/useChartZoom.ts +255 -0
  628. package/src/chart/ui/useWheelListener.ts +62 -0
  629. package/src/chrome/ui/AccountButton.tsx +185 -0
  630. package/src/chrome/ui/index.ts +2 -0
  631. package/src/clipboard/core/copyPng.ts +20 -0
  632. package/src/clipboard/core/index.ts +1 -0
  633. package/src/clipboard/ui/ClickToCopy.tsx +9 -1
  634. package/src/core.ts +1 -0
  635. package/src/download/core/exportStyles.ts +20 -0
  636. package/src/download/core/imageResolution.ts +118 -0
  637. package/src/download/core/index.ts +34 -0
  638. package/src/download/core/pictureExport.ts +207 -0
  639. package/src/download/core/stackedDrawing.ts +108 -0
  640. package/src/download/core/svgBounds.ts +80 -0
  641. package/src/download/core/svgNamespace.ts +9 -0
  642. package/src/download/core/svgToPng.ts +121 -0
  643. package/src/download/core/svgToString.ts +95 -0
  644. package/src/download/ui/ExportDialogFrame.tsx +86 -0
  645. package/src/download/ui/ExportImageDialog.tsx +91 -0
  646. package/src/download/ui/ExportNameField.tsx +148 -0
  647. package/src/download/ui/ExportPictureSection.tsx +142 -0
  648. package/src/download/ui/index.ts +11 -0
  649. package/src/download/ui/useDrawingBox.ts +37 -0
  650. package/src/error/core/describeSource.ts +18 -0
  651. package/src/error/core/index.ts +1 -0
  652. package/src/help/ui/HelpBody.tsx +41 -2
  653. package/src/help/ui/index.ts +6 -1
  654. package/src/ir/core/analysisSpectra.ts +231 -0
  655. package/src/ir/core/assignBands.ts +144 -0
  656. package/src/ir/core/bandAssignments.ts +329 -0
  657. package/src/ir/core/bandLabelPlan.ts +194 -0
  658. package/src/ir/core/detectIrFormat.ts +139 -0
  659. package/src/ir/core/downloadSpectra.ts +57 -0
  660. package/src/ir/core/fromJcamp.ts +70 -0
  661. package/src/ir/core/fromSpc.ts +61 -0
  662. package/src/ir/core/index.ts +113 -0
  663. package/src/ir/core/irBand.ts +57 -0
  664. package/src/ir/core/irCommands.ts +154 -0
  665. package/src/ir/core/irDomain.ts +163 -0
  666. package/src/ir/core/irEditorApi.ts +44 -0
  667. package/src/ir/core/irFormat.ts +57 -0
  668. package/src/ir/core/irMode.ts +203 -0
  669. package/src/ir/core/irReducer.ts +273 -0
  670. package/src/ir/core/irSidePanels.ts +20 -0
  671. package/src/ir/core/irSpectrum.ts +155 -0
  672. package/src/ir/core/irState.ts +173 -0
  673. package/src/ir/core/loadIrSpectra.ts +79 -0
  674. package/src/ir/core/nearestBand.ts +57 -0
  675. package/src/ir/core/pickBands.ts +181 -0
  676. package/src/ir/core/spectrumJcamp.ts +178 -0
  677. package/src/ir/core/toIrSpectrum.ts +102 -0
  678. package/src/ir/ui/BandMarks.tsx +166 -0
  679. package/src/ir/ui/BandsPanel.tsx +271 -0
  680. package/src/ir/ui/IrAboutDialog.tsx +121 -0
  681. package/src/ir/ui/IrCanvas.tsx +91 -0
  682. package/src/ir/ui/IrChart.tsx +215 -0
  683. package/src/ir/ui/IrCommandProvider.tsx +32 -0
  684. package/src/ir/ui/IrCommandTooltip.tsx +36 -0
  685. package/src/ir/ui/IrDocumentationDialog.tsx +174 -0
  686. package/src/ir/ui/IrEditor.tsx +99 -0
  687. package/src/ir/ui/IrHeader.tsx +39 -0
  688. package/src/ir/ui/IrLogo.tsx +49 -0
  689. package/src/ir/ui/IrPointerTracker.tsx +102 -0
  690. package/src/ir/ui/IrShell.tsx +285 -0
  691. package/src/ir/ui/IrSidePanel.tsx +78 -0
  692. package/src/ir/ui/IrStateProvider.tsx +32 -0
  693. package/src/ir/ui/IrStatusBar.tsx +97 -0
  694. package/src/ir/ui/IrToolbar.tsx +102 -0
  695. package/src/ir/ui/IrTraces.tsx +134 -0
  696. package/src/ir/ui/MetadataPanel.tsx +88 -0
  697. package/src/ir/ui/SpectraPanel.tsx +114 -0
  698. package/src/ir/ui/SpectrumRow.tsx +127 -0
  699. package/src/ir/ui/index.ts +56 -0
  700. package/src/ir/ui/irActions.ts +103 -0
  701. package/src/ir/ui/irChartProps.ts +118 -0
  702. package/src/ir/ui/irCommandContext.tsx +62 -0
  703. package/src/ir/ui/irStateContext.ts +48 -0
  704. package/src/ir/ui/useIrEditor.ts +139 -0
  705. package/src/ir/ui/useIrPointer.ts +109 -0
  706. package/src/ir/ui/useIrShortcuts.ts +95 -0
  707. package/src/ir/ui/useIrZoom.ts +86 -0
  708. package/src/ir.ts +13 -0
  709. package/src/locales/de.json +3 -0
  710. package/src/locales/en.json +3 -0
  711. package/src/locales/es.json +3 -0
  712. package/src/locales/fr.json +3 -0
  713. package/src/panel/core/dialogStyles.ts +11 -0
  714. package/src/panel/core/index.ts +47 -0
  715. package/src/panel/core/isEditingField.ts +23 -0
  716. package/src/panel/core/panelStyles.ts +248 -0
  717. package/src/panel/core/rowSpacers.ts +50 -0
  718. package/src/panel/core/statusBar.ts +48 -0
  719. package/src/panel/core/textFilter.ts +33 -0
  720. package/src/panel/core/yieldToPainting.ts +20 -0
  721. package/src/panel/ui/AboutDialogFrame.tsx +100 -0
  722. package/src/panel/ui/ClearButton.tsx +42 -0
  723. package/src/panel/ui/DocumentationDialogFrame.tsx +86 -0
  724. package/src/panel/ui/FilterInput.tsx +60 -0
  725. package/src/panel/ui/HelpLabel.tsx +43 -0
  726. package/src/panel/ui/PanelMessage.tsx +64 -0
  727. package/src/panel/ui/PanelRail.tsx +64 -0
  728. package/src/panel/ui/Section.tsx +66 -0
  729. package/src/panel/ui/SidePanelStack.tsx +109 -0
  730. package/src/panel/ui/SpectrumColorSwatch.tsx +119 -0
  731. package/src/panel/ui/index.ts +47 -0
  732. package/src/panel/ui/useConfirmOnEnter.ts +68 -0
  733. package/src/panel/ui/useFilterBox.ts +35 -0
  734. package/src/panel/ui/useVirtualRows.ts +82 -0
  735. package/src/panel/ui/useVirtualWindowRows.ts +86 -0
  736. package/src/structure/core/conformerBoltzmann.ts +102 -0
  737. package/src/structure/core/conformerEnergy.ts +97 -0
  738. package/src/structure/core/index.ts +15 -0
  739. package/src/structure/ui/ConformerTable.tsx +429 -0
  740. package/src/structure/ui/conformerColumns.ts +55 -0
  741. package/src/ui.ts +13 -0
  742. package/styles/chrome.css +55 -0
@@ -0,0 +1,187 @@
1
+ import type { ReactElement } from 'react';
2
+ import { useMemo } from 'react';
3
+
4
+ import type { PlotRect } from '../core/chartGeometry.ts';
5
+ import type { ChartScale } from '../core/chartScale.ts';
6
+ import { CHART_COLORS, CHART_FONT, LABEL_HALO } from '../core/chartTheme.ts';
7
+ import type { GuidePlacement } from '../core/guidePlacement.ts';
8
+ import { guidePlacement } from '../core/guidePlacement.ts';
9
+
10
+ /** What the rule is drawn at, and what it says about itself. */
11
+ export interface AxisGuideProps {
12
+ /**
13
+ * The place on the horizontal axis being pointed at, in whatever that axis
14
+ * measures, and `null` when nothing is being looked at.
15
+ */
16
+ value: number | null;
17
+ /** Where the plot sits inside the SVG. */
18
+ plot: PlotRect;
19
+ /** The horizontal axis as it is currently zoomed. */
20
+ xScale: ChartScale;
21
+ /**
22
+ * What the guide is drawn in.
23
+ * @default the theme's highlight colour
24
+ */
25
+ color?: string;
26
+ /**
27
+ * A few words written beside the rule, for a chart carrying more than one of
28
+ * them — `MS2 456.7`, `scan 314`. Nothing is written when it is absent, which
29
+ * is right for a chart whose single guide answers a hover the reader is
30
+ * already making.
31
+ * @default nothing is written
32
+ */
33
+ label?: string;
34
+ }
35
+
36
+ /**
37
+ * The vertical rule marking the place on the horizontal axis being looked at.
38
+ *
39
+ * A peak hovered in a table, a fragment hovered on a structure beside the chart,
40
+ * a search result rested on, the retention time whose scan is drawn in the pane
41
+ * below: each of them asks the chart the same question, and this is its whole
42
+ * answer. It sits below the viewers rather than inside one of them because a
43
+ * mass viewer's precursor rule and a chromatogram's time cursor are not two
44
+ * pictures that resemble each other — they are one picture, drawn from a value
45
+ * and a scale, and neither half of it can tell what it is measuring.
46
+ *
47
+ * When the value is inside the window the rule stands on it, solid. When it is
48
+ * not, the rule is parked on the edge the value went out of, dashed, and
49
+ * carries an arrow pointing that way. That is the case the component exists
50
+ * for: a chart zoomed onto one isotopologue cluster has almost everything a
51
+ * panel can point at outside its window, and answering with nothing drawn
52
+ * leaves a fragment the spectrum does not carry looking exactly like one that
53
+ * is two hundred mass units to the left. Dashed says *not here*, and the arrow
54
+ * says where to go.
55
+ *
56
+ * The arrow is a triangle rather than a `◀` glyph, because whether that
57
+ * character has one is the host's font's business and a missing one draws a
58
+ * hollow box in the middle of the chart. It sits just under the top edge, the
59
+ * strip of the plot a trace is least often in.
60
+ *
61
+ * Nothing here takes a pointer event: the guide is an answer, never a target.
62
+ * @param props - Component props.
63
+ * @returns The guide, or nothing when there is no value to point at and when
64
+ * the scale maps it nowhere.
65
+ */
66
+ export function AxisGuide(props: AxisGuideProps): ReactElement | null {
67
+ const { value, plot, xScale, color = CHART_COLORS.highlight, label } = props;
68
+
69
+ const placement = value === null ? null : guidePlacement(value, plot, xScale);
70
+ const lineStyle = useMemo(() => ({ stroke: color }), [color]);
71
+ const arrowStyle = useMemo(() => ({ fill: color }), [color]);
72
+ const labelStyle = useMemo(
73
+ () => ({ fill: color, fontSize: CHART_FONT.label, ...LABEL_HALO }),
74
+ [color],
75
+ );
76
+
77
+ if (placement === null) return null;
78
+ const { x, direction } = placement;
79
+ const labelPlace = labelPlacement(placement, plot);
80
+
81
+ return (
82
+ <g pointerEvents="none">
83
+ <line
84
+ x1={x}
85
+ y1={plot.top}
86
+ x2={x}
87
+ y2={plot.bottom}
88
+ strokeWidth={GUIDE_WIDTH}
89
+ strokeDasharray={direction === null ? undefined : PARKED_DASH}
90
+ style={lineStyle}
91
+ />
92
+ {direction === null ? null : (
93
+ <path d={arrowPath({ x, direction }, plot)} style={arrowStyle} />
94
+ )}
95
+ {label === undefined ? null : (
96
+ <text
97
+ x={labelPlace.x}
98
+ y={plot.top + ARROW_TOP_INSET}
99
+ textAnchor={labelPlace.anchor}
100
+ dominantBaseline="central"
101
+ style={labelStyle}
102
+ >
103
+ {label}
104
+ </text>
105
+ )}
106
+ </g>
107
+ );
108
+ }
109
+
110
+ /** How thick the rule is: thin enough to read a peak beside, not through. */
111
+ const GUIDE_WIDTH = 1.5;
112
+
113
+ /** What a parked guide is dashed with. */
114
+ const PARKED_DASH = '4 3';
115
+
116
+ /** How far the arrow reaches back into the plot from its point. */
117
+ const ARROW_LENGTH = 7;
118
+
119
+ /** Half the width of its base. */
120
+ const ARROW_HALF_HEIGHT = 5;
121
+
122
+ /** How far below the top of the plot it sits. */
123
+ const ARROW_TOP_INSET = 8;
124
+
125
+ /** The clear space between the rule, or its arrow, and the label beside it. */
126
+ const LABEL_GAP = 4;
127
+
128
+ /**
129
+ * How much room a label is assumed to want.
130
+ *
131
+ * Measuring the text would mean rendering it first, which is a whole layout
132
+ * pass for a decision that only has to be right at the edges. Sixty pixels is
133
+ * about eight characters at the label size — `MS2 456.7` — and a label longer
134
+ * than that is one written for a panel rather than for a plot.
135
+ */
136
+ const LABEL_ROOM = 60;
137
+
138
+ /**
139
+ * The triangle a parked guide carries, pointing off the edge it is parked on.
140
+ *
141
+ * Only a parked guide has one, and the parameter says so rather than a guard
142
+ * inside: a guide standing on its own value has no edge to point at, and the
143
+ * caller has already told the two apart to decide whether to draw a path at all.
144
+ * @param placement - Where the guide is parked, and which edge its value lies past.
145
+ * @param plot - The plotting area, whose top the arrow hangs under.
146
+ * @returns The `d` of the triangle.
147
+ */
148
+ function arrowPath(
149
+ placement: GuidePlacement & { direction: 'left' | 'right' },
150
+ plot: PlotRect,
151
+ ): string {
152
+ const { x, direction } = placement;
153
+ const back = direction === 'left' ? x + ARROW_LENGTH : x - ARROW_LENGTH;
154
+ const y = plot.top + ARROW_TOP_INSET;
155
+ return `M${x} ${y}L${back} ${y - ARROW_HALF_HEIGHT}L${back} ${y + ARROW_HALF_HEIGHT}Z`;
156
+ }
157
+
158
+ /**
159
+ * Which side of the rule the label is written on.
160
+ *
161
+ * It runs to the right and flips to the left as soon as it would otherwise
162
+ * cross the right edge — flipping rather than sliding, for the reason the
163
+ * pointer readout flips: a label pinned to the edge drifts away from the rule
164
+ * it belongs to and the pair stops reading as one thing. A guide parked on an
165
+ * edge has only one side that is inside the plot at all, so there the flip is
166
+ * forced, and the gap clears the arrow rather than the rule.
167
+ * @param placement - Where the guide ended up, and which way its value lies.
168
+ * @param plot - The plotting area the label has to stay inside.
169
+ * @returns The anchor, and which way the text runs from it.
170
+ */
171
+ function labelPlacement(
172
+ placement: GuidePlacement,
173
+ plot: PlotRect,
174
+ ): { x: number; anchor: 'start' | 'end' } {
175
+ const { x, direction } = placement;
176
+ if (direction === 'left') {
177
+ return { x: x + ARROW_LENGTH + LABEL_GAP, anchor: 'start' };
178
+ }
179
+ if (direction === 'right') {
180
+ return { x: x - ARROW_LENGTH - LABEL_GAP, anchor: 'end' };
181
+ }
182
+ const runsRight = x + LABEL_GAP + LABEL_ROOM <= plot.right;
183
+ return {
184
+ x: runsRight ? x + LABEL_GAP : x - LABEL_GAP,
185
+ anchor: runsRight ? 'start' : 'end',
186
+ };
187
+ }
@@ -0,0 +1,130 @@
1
+ /**
2
+ * Charts stacked one above another, each resized by the splitter under it.
3
+ *
4
+ * One measurement is often read on more than one chart at once — the separation
5
+ * a sample was run through, the spectrum taken where the cursor stands, and what
6
+ * that spectrum broke into — and those are windows over different axes rather
7
+ * than traces on one. Stacking them is layout and nothing else, which is the
8
+ * whole of what this component knows: N panes, one above another, sharing the
9
+ * gutter their value axes are drawn in, the one at the foot writing the
10
+ * horizontal axis under all of them. Which pane holds what, and what makes one
11
+ * appear at all, is a fact about the measurement and stays in the viewer.
12
+ *
13
+ * How N panes become N nested splits is in `chartStackLevel.tsx`; what is held
14
+ * here is the one thing that outlives a render, which is how tall each of them
15
+ * was last left.
16
+ *
17
+ * Two things `SplitPane` does not do, and both of them draw a plausible wrong
18
+ * picture rather than failing outright:
19
+ *
20
+ * - **It has no minimum.** `useSplitPaneSize` clamps a drag to
21
+ * `{ min: 0, max: parentDimension }`, so a splitter dragged to the top of the
22
+ * stack leaves the pane above it at nothing at all; `plotRect` then holds the
23
+ * plot at `MINIMUM_PLOT_SIDE` and what is left is a ten-pixel stub with a full
24
+ * set of axes over it. Every height is held above the pane's own minimum —
25
+ * the default it starts at as much as the one a drag arrives at — because
26
+ * nothing underneath will do it.
27
+ * - **Its controlled side gets no `min-height: 0`.** `getItemStyle` resets that
28
+ * on the *other* side only, and a chart is an `<svg>` carrying a real `height`
29
+ * attribute, so the controlled pane's min-content height is whatever the
30
+ * chart was last measured at: the pane grows and then refuses to shrink back.
31
+ * Every pane is wrapped in a box that carries the reset itself.
32
+ *
33
+ * A pane keeps its children mounted whether it is open or shut — `unmountChildren`
34
+ * stays false — so a closed pane measures 0 × 0 behind a `display: none`, its
35
+ * `ResizeObserver` fires again the moment it is revealed, and it comes back
36
+ * through the window it was being looked at through. A remounted chart is empty.
37
+ */
38
+
39
+ import type { ReactElement } from 'react';
40
+ import { useCallback, useMemo, useState } from 'react';
41
+ import type { SplitPaneSize } from 'react-science/ui';
42
+
43
+ import type { ChartStackPane, StackLevel } from './chartStackLevel.tsx';
44
+ import { keptHeight, paneHeight, stackFrom } from './chartStackLevel.tsx';
45
+
46
+ export type { ChartStackPane } from './chartStackLevel.tsx';
47
+
48
+ /** What the stack is drawn from. */
49
+ export interface ChartStackProps {
50
+ /**
51
+ * The panes, in the order they are stacked, top to bottom.
52
+ *
53
+ * A pane with nothing to draw is left out of this array rather than handed in
54
+ * empty — that is what makes its splitter go away with it. Appending a pane,
55
+ * and dropping the one at the foot, cost nothing: every pane is a split
56
+ * whether or not anything follows it, so no chart already stacked is stood up
57
+ * again. Taking one out of the *middle* still is expensive — every split
58
+ * below it takes on the identity of the one that was under it, and the charts
59
+ * in them are all remounted, coming back fitted to what they draw rather than
60
+ * through the window they were left at. So a pane is still better dropped
61
+ * from the foot of the stack than out of its middle.
62
+ */
63
+ panes: readonly ChartStackPane[];
64
+ /**
65
+ * Told when a splitter is let go, with the height the pane came to rest at.
66
+ *
67
+ * On release rather than on every pixel of the drag, because a viewer that
68
+ * hears this puts it in its own state, and a store per pointer move renders
69
+ * every pane of the stack again on each one. The height reported is the one
70
+ * that was kept, minimum already applied.
71
+ * @default the height is remembered inside the stack and nowhere else
72
+ * @param id - Which pane was resized.
73
+ * @param height - How tall it now stands, in pixels.
74
+ */
75
+ onHeightChange?: (id: string, height: number) => void;
76
+ }
77
+
78
+ /**
79
+ * Stack charts vertically, with a splitter between each pair.
80
+ *
81
+ * Everything a level of the nesting is handed is memoised, and for the reason
82
+ * the release is told apart from the drag: `resize` fires on every pointer move,
83
+ * and a `StackLevel` rebuilt there would recurse through every `SplitPane` of
84
+ * the stack on each one, taking every chart in it with them.
85
+ * @param props - Component props.
86
+ * @returns The stack, filling the box it is given.
87
+ */
88
+ export function ChartStack(props: ChartStackProps): ReactElement {
89
+ const { panes, onHeightChange } = props;
90
+ const [heights, setHeights] = useState<Readonly<Record<string, number>>>({});
91
+
92
+ const heightOf = useCallback(
93
+ (pane: ChartStackPane) => paneHeight(pane, heights[pane.id]),
94
+ [heights],
95
+ );
96
+
97
+ const resize = useCallback((pane: ChartStackPane, asked: SplitPaneSize) => {
98
+ const height = keptHeight(asked, pane);
99
+ if (height === null) return;
100
+ setHeights((current) =>
101
+ current[pane.id] === height ? current : { ...current, [pane.id]: height },
102
+ );
103
+ }, []);
104
+
105
+ const rest = useCallback(
106
+ (pane: ChartStackPane, asked: SplitPaneSize) => {
107
+ const height = keptHeight(asked, pane);
108
+ if (height !== null) onHeightChange?.(pane.id, height);
109
+ },
110
+ [onHeightChange],
111
+ );
112
+
113
+ const level = useMemo<StackLevel>(
114
+ () => ({ panes, heightOf, resize, rest }),
115
+ [panes, heightOf, resize, rest],
116
+ );
117
+
118
+ return <div style={stackStyle}>{stackFrom(level, 0)}</div>;
119
+ }
120
+
121
+ /** The box the whole stack fills, whatever it was given by way of a parent. */
122
+ const stackStyle = {
123
+ display: 'flex',
124
+ flexDirection: 'column',
125
+ width: '100%',
126
+ height: '100%',
127
+ minWidth: 0,
128
+ minHeight: 0,
129
+ overflow: 'hidden',
130
+ } as const;
@@ -0,0 +1,101 @@
1
+ /**
2
+ * The crosshair a chart follows the pointer with, and the lines it reads out.
3
+ *
4
+ * Every viewer draws the same two dashed rules and writes the same stack of
5
+ * short lines beside them; what differs is the words, which are the one thing
6
+ * only the viewer knows — an m/z and a height here, a retention time and a
7
+ * summed current there. So the geometry, the dashes and the placement live
8
+ * here, and the caller hands over the lines already written.
9
+ *
10
+ * The first line is the one being pointed at and is written plainly; the rest
11
+ * are quieter, because they answer the question the first one raises rather
12
+ * than being asked for in their own right.
13
+ */
14
+
15
+ import type { ReactElement } from 'react';
16
+
17
+ import type { PlotRect } from '../core/chartGeometry.ts';
18
+ import {
19
+ CHART_COLORS,
20
+ CHART_FONT,
21
+ LABEL_HALO,
22
+ LABEL_QUIET,
23
+ PEAK_LABEL,
24
+ } from '../core/chartTheme.ts';
25
+ import type { ChartPoint } from '../core/svgPoint.ts';
26
+ import { readoutPlacement } from '../core/trackerReadout.ts';
27
+
28
+ /** What the tracker is given. */
29
+ export interface ChartTrackerProps {
30
+ /** Where the pointer is, `null` whenever it is off the plot. */
31
+ position: ChartPoint | null;
32
+ /** Where the plot sits inside the SVG. */
33
+ plot: PlotRect;
34
+ /**
35
+ * What to write beside the crosshair, most important first, `null` where the
36
+ * axes read nothing under the pointer.
37
+ * @default null
38
+ */
39
+ lines?: readonly string[] | null;
40
+ }
41
+
42
+ /**
43
+ * Draw the crosshair and its readout.
44
+ * @param props - The pointer, the plot and the lines to write.
45
+ * @returns The crosshair, or nothing while the pointer is off the plot.
46
+ */
47
+ export function ChartTracker(props: ChartTrackerProps): ReactElement | null {
48
+ const { position, plot, lines = null } = props;
49
+ if (position === null) return null;
50
+
51
+ const place = readoutPlacement(position, plot);
52
+
53
+ return (
54
+ <g pointerEvents="none">
55
+ <line
56
+ x1={position.x}
57
+ y1={plot.top}
58
+ x2={position.x}
59
+ y2={plot.bottom}
60
+ strokeDasharray={TRACKER_DASH}
61
+ style={crosshairStyle}
62
+ />
63
+ <line
64
+ x1={plot.left}
65
+ y1={position.y}
66
+ x2={plot.right}
67
+ y2={position.y}
68
+ strokeDasharray={TRACKER_DASH}
69
+ style={crosshairStyle}
70
+ />
71
+ {lines === null || lines.length === 0 ? null : (
72
+ <text textAnchor={place.anchor} style={readoutStyle}>
73
+ {lines.map((line, at) => (
74
+ <tspan
75
+ key={line}
76
+ x={place.x}
77
+ y={place.y + at * PEAK_LABEL.lineHeight}
78
+ fillOpacity={at === 0 ? undefined : LABEL_QUIET}
79
+ >
80
+ {line}
81
+ </tspan>
82
+ ))}
83
+ </text>
84
+ )}
85
+ </g>
86
+ );
87
+ }
88
+
89
+ /** What the crosshair is dashed with, so it is never read as a trace. */
90
+ const TRACKER_DASH = '3 3';
91
+
92
+ const crosshairStyle = { stroke: CHART_COLORS.tracker } as const;
93
+
94
+ const readoutStyle = {
95
+ fill: CHART_COLORS.trackerText,
96
+ fontSize: CHART_FONT.readout,
97
+ // Haloed like every other label written onto the plot, and it needs it more
98
+ // than any of them: the pointer is put wherever the question is, which is over
99
+ // the trace rather than beside it.
100
+ ...LABEL_HALO,
101
+ } as const;
@@ -0,0 +1,108 @@
1
+ import type { ReactElement } from 'react';
2
+
3
+ import type { PlotRect } from '../core/chartGeometry.ts';
4
+ import { CHART_COLORS, LABEL_HALO } from '../core/chartTheme.ts';
5
+ import {
6
+ CHARACTER_WIDTH,
7
+ FONT_SIZE,
8
+ GAP,
9
+ MARGIN,
10
+ ROW_HEIGHT,
11
+ } from '../core/legendBox.ts';
12
+
13
+ /** What the caption says, and how much of the plot it may say it across. */
14
+ export interface PlotCaptionProps {
15
+ /** What the plot is a picture of, in one line. */
16
+ text: string;
17
+ /** The plot it is written on. */
18
+ plot: PlotRect;
19
+ /**
20
+ * The x it must stop short of, in the plot's own pixels.
21
+ *
22
+ * The left edge of a legend sharing the top of the plot, which `legendBox`
23
+ * answers for whoever is drawing one. Nothing here works that out on its own:
24
+ * a caption is written wherever a caller asks and only the caller knows what
25
+ * else it put up there.
26
+ * @default the plot's right edge
27
+ */
28
+ until?: number;
29
+ }
30
+
31
+ /**
32
+ * What a plot is a picture of, written in its top left corner.
33
+ *
34
+ * The opposite corner from the legend, and it says the opposite kind of thing:
35
+ * a legend names the curves against each other, while a caption says which
36
+ * measurement the whole pane is of — which file, which acquisition of it, when
37
+ * it was measured. A stack of panes is where that matters, since three charts
38
+ * one above another are three pictures of three different scans and the axes
39
+ * say nothing about which.
40
+ *
41
+ * Drawn **inside the SVG**, for the reason `TraceLegend` states: a picture is
42
+ * exported by cloning the chart's own `SVGSVGElement`, so a caption living in a
43
+ * `<div>` beside it would be missing from every figure while looking perfectly
44
+ * right on screen — and a figure that does not say what it is a picture of is
45
+ * the one thing a caption exists to prevent.
46
+ *
47
+ * It is written on the plot rather than above it. The room over a plot belongs
48
+ * to the tallest peak's label, and taking it for a caption would either push
49
+ * the measurement down or have the two collide on whichever spectrum happens to
50
+ * peak at the left.
51
+ * @param props - Component props.
52
+ * @returns The caption, or nothing where there is no room to write it.
53
+ */
54
+ export function PlotCaption(props: PlotCaptionProps): ReactElement | null {
55
+ const { text, plot, until } = props;
56
+
57
+ const said = elide(text, (until ?? plot.right) - GAP - plot.left - MARGIN);
58
+ if (said === '') return null;
59
+
60
+ return (
61
+ <text
62
+ x={plot.left + MARGIN}
63
+ y={plot.top + MARGIN + ROW_HEIGHT / 2}
64
+ fontSize={FONT_SIZE}
65
+ dominantBaseline="middle"
66
+ style={captionStyle}
67
+ pointerEvents="none"
68
+ aria-hidden="true"
69
+ >
70
+ {said}
71
+ </text>
72
+ );
73
+ }
74
+
75
+ /**
76
+ * The caption cut to the room it has, with an ellipsis where it was cut.
77
+ *
78
+ * Measured from character counts rather than from the DOM, for the reason
79
+ * `legendBox` gives: the text is decided during render, where a
80
+ * `getComputedTextLength` would need a layout pass that has not happened, and
81
+ * the clone an export takes gets no layout at all — so a caption that measured
82
+ * itself would come out one length on screen and another in the figure.
83
+ * @param text - What the pane would say.
84
+ * @param room - How wide it may be, in pixels.
85
+ * @returns What it says, or nothing where a caption would be a stub.
86
+ */
87
+ function elide(text: string, room: number): string {
88
+ const fits = Math.floor(room / CHARACTER_WIDTH);
89
+ if (fits >= text.length) return text;
90
+ // A caption cut to three characters is not a caption, and a reader has to
91
+ // guess at what it was — better a pane that says nothing than one that
92
+ // appears to answer and does not.
93
+ if (fits < MINIMUM_CHARACTERS) return '';
94
+ return `${text.slice(0, fits - 1).trimEnd()}…`;
95
+ }
96
+
97
+ /** The shortest caption still worth writing, in characters. */
98
+ const MINIMUM_CHARACTERS = 8;
99
+
100
+ /**
101
+ * The face it is set in: the axis titles' ink, haloed like a peak label.
102
+ *
103
+ * The halo is what lets it be written straight onto the plot rather than in a
104
+ * box: a box in the top left would hide the very trace the pane is a picture
105
+ * of, while a hairline of paper around each glyph clears the letters and
106
+ * nothing else.
107
+ */
108
+ const captionStyle = { fill: CHART_COLORS.title, ...LABEL_HALO } as const;
@@ -0,0 +1,52 @@
1
+ import type { ReactElement } from 'react';
2
+
3
+ import type { PlotRect } from '../core/chartGeometry.ts';
4
+ import { CHART_COLORS } from '../core/chartTheme.ts';
5
+ import { selectionRectangle } from '../core/selectionGeometry.ts';
6
+ import type { ZoomSelection } from '../core/zoomDomain.ts';
7
+
8
+ export interface SelectionRectProps {
9
+ /** The drag being made, `null` when none is. */
10
+ selection: ZoomSelection | null;
11
+ /** Where the plot sits inside the SVG, which the drag is confined to. */
12
+ plot: PlotRect;
13
+ }
14
+
15
+ /**
16
+ * What the drag being made promises, drawn before the button is let go.
17
+ *
18
+ * It is painted over the data rather than under it, which is the one place a
19
+ * preview may cover a trace: a rectangle drawn behind a dense spectrum is a
20
+ * rectangle nobody sees, and the whole point of it is to be seen while the hand
21
+ * is still moving. The fill is faint enough for the peaks inside it to be read
22
+ * through, so the window being asked for can be judged against what is in it.
23
+ *
24
+ * Nothing here takes a pointer event: the drag is already captured on the SVG,
25
+ * and a rectangle that swallowed the pointer would end the very gesture it is
26
+ * drawing.
27
+ * @param props - Component props.
28
+ * @returns The rectangle, or nothing when no drag is being made and when the one
29
+ * being made is too short to zoom.
30
+ */
31
+ export function SelectionRect(props: SelectionRectProps): ReactElement | null {
32
+ const { selection, plot } = props;
33
+
34
+ const rectangle = selectionRectangle(selection, plot);
35
+ if (rectangle === null) return null;
36
+
37
+ return (
38
+ <rect
39
+ x={rectangle.x}
40
+ y={rectangle.y}
41
+ width={rectangle.width}
42
+ height={rectangle.height}
43
+ pointerEvents="none"
44
+ style={selectionStyle}
45
+ />
46
+ );
47
+ }
48
+
49
+ const selectionStyle = {
50
+ fill: CHART_COLORS.selection,
51
+ stroke: CHART_COLORS.selectionBorder,
52
+ } as const;