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,95 @@
1
+ import type { SvgBox } from './svgBounds.ts';
2
+ import { SVG_NAMESPACE } from './svgNamespace.ts';
3
+
4
+ export interface SvgDocumentOptions {
5
+ /**
6
+ * The rectangle of the drawing to write out, in drawing units.
7
+ * @default what the element is currently showing
8
+ */
9
+ box?: SvgBox | null;
10
+ /**
11
+ * How wide the document is, in pixels.
12
+ * @default the width the element is drawn at
13
+ */
14
+ width?: number;
15
+ /**
16
+ * How tall the document is, in pixels.
17
+ * @default the height the element is drawn at
18
+ */
19
+ height?: number;
20
+ /**
21
+ * What the document is read out as. Given one, the copy becomes a picture
22
+ * rather than the thing on screen: it is no longer reachable by the keyboard,
23
+ * and it is described as what it shows rather than as what could be done to
24
+ * it.
25
+ * @default the label the element already carries
26
+ */
27
+ label?: string;
28
+ }
29
+
30
+ /**
31
+ * Write a rendered SVG element out as a standalone SVG document.
32
+ *
33
+ * On the page the element takes its size from the box it sits in, which is not
34
+ * something that travels with it: opened on its own the same markup would be
35
+ * sized by whatever it is opened in. The copy therefore carries a size, as
36
+ * attributes, so the file is a picture rather than a drawing to be laid out
37
+ * again.
38
+ *
39
+ * A rectangle can be given to write out part of the drawing — the symbols
40
+ * rather than the canvas around them — and a size to write it out bigger than
41
+ * it is on screen. Neither turns the picture into pixels: an SVG holds shapes,
42
+ * so the numbers only say how big it opens.
43
+ * @param svg - The element to write out, as it is rendered.
44
+ * @param options - What part of it to write out, and how big.
45
+ * @returns The SVG document, ready to be saved or rasterized.
46
+ */
47
+ export function svgToString(
48
+ svg: SVGSVGElement,
49
+ options: SvgDocumentOptions = {},
50
+ ): string {
51
+ const { box = null, width, height, label } = options;
52
+
53
+ const clone = svg.cloneNode(true) as SVGSVGElement;
54
+ if (label !== undefined) {
55
+ clone.setAttribute('role', 'img');
56
+ clone.setAttribute('aria-label', label);
57
+ // A canvas is focused to be drawn on; a file of it is only looked at.
58
+ clone.removeAttribute('tabindex');
59
+ }
60
+ const rendered = svg.getBoundingClientRect();
61
+ const drawnWidth = side(width ?? box?.width ?? rendered.width);
62
+ const drawnHeight = side(height ?? box?.height ?? rendered.height);
63
+
64
+ clone.setAttribute('xmlns', SVG_NAMESPACE);
65
+ clone.setAttribute('width', String(drawnWidth));
66
+ clone.setAttribute('height', String(drawnHeight));
67
+ if (box) {
68
+ clone.setAttribute(
69
+ 'viewBox',
70
+ `${round(box.x)} ${round(box.y)} ${round(box.width)} ${round(box.height)}`,
71
+ );
72
+ } else if (!clone.hasAttribute('viewBox')) {
73
+ clone.setAttribute('viewBox', `0 0 ${drawnWidth} ${drawnHeight}`);
74
+ }
75
+
76
+ return new XMLSerializer().serializeToString(clone);
77
+ }
78
+
79
+ /**
80
+ * A side of the document, as an attribute takes it.
81
+ * @param value - How long it is.
82
+ * @returns Whole pixels, never zero: a document sized zero is an empty file.
83
+ */
84
+ function side(value: number): number {
85
+ return Math.max(1, Math.round(value));
86
+ }
87
+
88
+ /**
89
+ * A drawing coordinate, short enough to read.
90
+ * @param value - The coordinate.
91
+ * @returns It, to two decimals.
92
+ */
93
+ function round(value: number): number {
94
+ return Math.round(value * 100) / 100;
95
+ }
@@ -0,0 +1,86 @@
1
+ import type { IconName } from '@blueprintjs/core';
2
+ import { Button, Dialog, DialogBody, DialogFooter } from '@blueprintjs/core';
3
+ import type { ReactNode } from 'react';
4
+ import { useState } from 'react';
5
+
6
+ import { useConfirmOnEnter } from '../../panel/ui/useConfirmOnEnter.ts';
7
+ import { exportNoteStyle } from '../core/exportStyles.ts';
8
+
9
+ export interface ExportDialogFrameProps {
10
+ /** Whether the dialog is showing. */
11
+ isOpen: boolean;
12
+ /** What it is about, along the top. */
13
+ title: string;
14
+ /** The icon beside that title. */
15
+ icon: IconName;
16
+ /**
17
+ * The name saved files take, without their extension; the section is keyed on
18
+ * it, so a file saved under a new name is what the name box opens on next
19
+ * time rather than what was typed and then thought better of.
20
+ */
21
+ filename: string;
22
+ /**
23
+ * How wide the dialog opens, in pixels. A section showing text needs the room
24
+ * to show a molfile line whole; one showing controls does not.
25
+ * @default 560
26
+ */
27
+ width?: number;
28
+ /**
29
+ * Whether the section is mounted only while the dialog is open, for a section
30
+ * whose work — measuring a picture off the page — is only worth doing while
31
+ * it is being looked at.
32
+ * @default false
33
+ */
34
+ mountWhileOpen?: boolean;
35
+ /** The section, built with the status setter the footer reads. */
36
+ children: (onStatus: (status: string) => void) => ReactNode;
37
+ /** Called when the dialog is dismissed. */
38
+ onClose: () => void;
39
+ }
40
+
41
+ /**
42
+ * The frame every export dialog shares: the section, and what it last did.
43
+ *
44
+ * Each thing the editor writes out gets a dialog of its own rather than one
45
+ * shared dialog of tabs, since a picture, a structure and a sequence are asked
46
+ * for at different moments; what they have in common is only the frame, which
47
+ * is here so the three cannot come to differ in how they close or where they
48
+ * say what they wrote.
49
+ * @param props - Component props.
50
+ * @returns The dialog.
51
+ */
52
+ export function ExportDialogFrame(props: ExportDialogFrameProps) {
53
+ const {
54
+ isOpen,
55
+ title,
56
+ icon,
57
+ filename,
58
+ width = DEFAULT_WIDTH,
59
+ mountWhileOpen = false,
60
+ children,
61
+ onClose,
62
+ } = props;
63
+
64
+ const [status, setStatus] = useState<string | null>(null);
65
+
66
+ useConfirmOnEnter(isOpen, onClose);
67
+
68
+ return (
69
+ <Dialog
70
+ isOpen={isOpen}
71
+ title={title}
72
+ icon={icon}
73
+ style={{ width, maxWidth: '92vw' }}
74
+ onClose={onClose}
75
+ >
76
+ <DialogBody key={filename}>
77
+ {mountWhileOpen && !isOpen ? null : children(setStatus)}
78
+ </DialogBody>
79
+ <DialogFooter actions={<Button text="Close" onClick={onClose} />}>
80
+ <span style={exportNoteStyle}>{status}</span>
81
+ </DialogFooter>
82
+ </Dialog>
83
+ );
84
+ }
85
+
86
+ const DEFAULT_WIDTH = 560;
@@ -0,0 +1,91 @@
1
+ import { useState } from 'react';
2
+
3
+ import { DEFAULT_IMAGE_RESOLUTION } from '../core/imageResolution.ts';
4
+ import type { PictureFrame } from '../core/pictureExport.ts';
5
+
6
+ import { ExportDialogFrame } from './ExportDialogFrame.tsx';
7
+ import { ExportPictureSection } from './ExportPictureSection.tsx';
8
+
9
+ export interface ExportImageDialogProps {
10
+ /** Whether the dialog is showing. */
11
+ isOpen: boolean;
12
+ /**
13
+ * The drawing the picture is taken of, as it is rendered. Read when a button
14
+ * is pressed rather than passed in, since a drawing is laid out again on
15
+ * every resize. `null` when nothing is drawn.
16
+ */
17
+ getDrawing: () => SVGSVGElement | null;
18
+ /**
19
+ * The name saved files take, without their extension.
20
+ * @default 'picture'
21
+ */
22
+ filename?: string;
23
+ /**
24
+ * What the picture is read out as in the file it is written to, in place of
25
+ * the instructions the element carries for whoever is working it.
26
+ * @default 'Drawing'
27
+ */
28
+ label?: string;
29
+ /**
30
+ * Whether the picture is the drawing inside the element — a canvas, which is
31
+ * mostly the empty space around what is on it — or the element as it is laid
32
+ * out, which is what a chart drawn to the box it was given is.
33
+ * @default 'content'
34
+ */
35
+ frame?: PictureFrame;
36
+ /** Called when the dialog is dismissed. */
37
+ onClose: () => void;
38
+ }
39
+
40
+ /**
41
+ * A drawing as a picture: PNG at a chosen resolution, or SVG.
42
+ *
43
+ * How big it comes out is asked rather than guessed, since only one size could
44
+ * be the default and neither a figure nor a thumbnail is it. SVG is the honest
45
+ * answer wherever it is accepted — it is drawn again at whatever size it is
46
+ * printed — so the resolution there is only the size the file opens at.
47
+ *
48
+ * The same dialog writes out a glycan, a molecule and a spectrum, because none
49
+ * of what it does depends on what is drawn: it is handed an SVG element that is
50
+ * already on the page, and asks it how big it is.
51
+ * @param props - Component props.
52
+ * @returns The dialog.
53
+ */
54
+ export function ExportImageDialog(props: ExportImageDialogProps) {
55
+ const {
56
+ isOpen,
57
+ getDrawing,
58
+ filename = 'picture',
59
+ label = 'Drawing',
60
+ frame,
61
+ onClose,
62
+ } = props;
63
+
64
+ const [resolutionId, setResolutionId] = useState<string>(
65
+ DEFAULT_IMAGE_RESOLUTION.id,
66
+ );
67
+
68
+ return (
69
+ <ExportDialogFrame
70
+ isOpen={isOpen}
71
+ title="Export as an image"
72
+ icon="media"
73
+ filename={filename}
74
+ width={460}
75
+ mountWhileOpen
76
+ onClose={onClose}
77
+ >
78
+ {(onStatus) => (
79
+ <ExportPictureSection
80
+ getDrawing={getDrawing}
81
+ resolutionId={resolutionId}
82
+ onResolutionChange={setResolutionId}
83
+ filename={filename}
84
+ label={label}
85
+ frame={frame}
86
+ onStatus={onStatus}
87
+ />
88
+ )}
89
+ </ExportDialogFrame>
90
+ );
91
+ }
@@ -0,0 +1,148 @@
1
+ import { useLayoutEffect, useRef } from 'react';
2
+
3
+ import { TOKEN } from '../../tokens/core/familyTokens.ts';
4
+
5
+ export interface ExportNameFieldProps {
6
+ /** What is in the box, without an extension. */
7
+ name: string;
8
+ /**
9
+ * The extension the file is about to take, shown after what is typed.
10
+ * @default ''
11
+ */
12
+ extension?: string;
13
+ /** Called with what was typed. */
14
+ onChange: (name: string) => void;
15
+ }
16
+
17
+ /**
18
+ * What the file about to be written out is called.
19
+ *
20
+ * It sits at the right of the row of buttons, against the one that writes the
21
+ * file, because that is what it is about — copying takes no name, and puts
22
+ * itself at the other end of the row. The name the editor came in with is
23
+ * offered, since that is what a glycan is usually saved under, but a picture
24
+ * for a slide and a molfile for a docking run are rarely wanted under it.
25
+ *
26
+ * The box grows with what is typed, so the extension sits directly against the
27
+ * name and the two read as the one filename they are about to become. Held to a
28
+ * fixed width instead, the extension hangs at the far edge with the gap between
29
+ * them reading as part of neither.
30
+ * @param props - Component props.
31
+ * @returns The field.
32
+ */
33
+ export function ExportNameField(props: ExportNameFieldProps) {
34
+ const { name, extension = '', onChange } = props;
35
+
36
+ const input = useRef<HTMLInputElement>(null);
37
+ const mirror = useRef<HTMLSpanElement>(null);
38
+ const ruler = useRef<HTMLSpanElement>(null);
39
+
40
+ // Measured off a copy of the text in the same font rather than counted in
41
+ // characters, which only holds for a monospace one. The width is set on the
42
+ // element instead of kept in state: it is what the browser has just measured,
43
+ // so rendering again to store it would measure the same thing twice.
44
+ useLayoutEffect(() => {
45
+ if (!input.current || !mirror.current || !ruler.current) return;
46
+ const measured = mirror.current.offsetWidth + CARET;
47
+ const floor = ruler.current.offsetWidth;
48
+ input.current.style.width = `${Math.min(Math.max(measured, floor), MAXIMUM)}px`;
49
+ });
50
+
51
+ return (
52
+ <div style={fieldStyle}>
53
+ <div className="bp6-input" style={boxStyle}>
54
+ <input
55
+ ref={input}
56
+ value={name}
57
+ aria-label="File name"
58
+ placeholder={PLACEHOLDER}
59
+ spellCheck={false}
60
+ autoComplete="off"
61
+ style={inputStyle}
62
+ onChange={(event) => onChange(event.target.value)}
63
+ // The name is in force as it is typed, so Enter has nothing left to
64
+ // confirm — and is kept off the dialog, whose answer is to close.
65
+ onKeyDown={(event) => {
66
+ if (event.key === 'Enter') event.stopPropagation();
67
+ }}
68
+ />
69
+ {extension === '' ? null : (
70
+ <span style={extensionStyle}>{extension}</span>
71
+ )}
72
+ {/* Inside the box rather than beside it, so the copy the width is
73
+ measured off is in the font the box gives its own text and not in
74
+ whatever the dialog around it happens to use. */}
75
+ <span ref={mirror} style={mirrorStyle} aria-hidden="true">
76
+ {name === '' ? PLACEHOLDER : name}
77
+ </span>
78
+ <span ref={ruler} style={mirrorStyle} aria-hidden="true">
79
+ {FLOOR_SAMPLE}
80
+ </span>
81
+ </div>
82
+ </div>
83
+ );
84
+ }
85
+
86
+ /** What the box says when nothing has been typed into it. */
87
+ const PLACEHOLDER = 'File name';
88
+
89
+ /** Room for the caret past the last character, so it is never clipped. */
90
+ const CARET = 2;
91
+
92
+ /**
93
+ * Twenty characters, which the box is never narrower than.
94
+ *
95
+ * A name is typed into this box as often as it is read out of it, and a box cut
96
+ * to `glycan` leaves no room to do that in — so the floor is a name of the
97
+ * length one usually is, measured in the box's own font rather than counted at
98
+ * some assumed character width. `n` is about the average width of a lowercase
99
+ * letter, which is what a filename is mostly made of.
100
+ */
101
+ const FLOOR_SAMPLE = 'n'.repeat(20);
102
+
103
+ /** Past this a name scrolls inside the box rather than pushing the dialog. */
104
+ const MAXIMUM = 260;
105
+
106
+ // Held against the right of the row beside the button that writes the file, so
107
+ // the space in the row falls between copying and saving rather than inside the
108
+ // name.
109
+ const fieldStyle = { marginLeft: 'auto', flexShrink: 0 } as const;
110
+
111
+ // Blueprint's own input chrome, worn by the box rather than by the field inside
112
+ // it, so the name and the extension sit within one border. Positioned, so the
113
+ // hidden copy the width is measured off can be taken out of the layout without
114
+ // leaving the box it takes its font from.
115
+ const boxStyle = {
116
+ position: 'relative',
117
+ display: 'flex',
118
+ alignItems: 'center',
119
+ width: 'fit-content',
120
+ } as const;
121
+
122
+ // The field itself brings nothing of its own: the box around it is what is
123
+ // seen, and the text has to be in the font the width was measured in.
124
+ const inputStyle = {
125
+ font: 'inherit',
126
+ border: 'none',
127
+ outline: 'none',
128
+ padding: 0,
129
+ margin: 0,
130
+ background: 'transparent',
131
+ color: 'inherit',
132
+ } as const;
133
+
134
+ const extensionStyle = {
135
+ color: TOKEN.textMuted,
136
+ whiteSpace: 'pre',
137
+ } as const;
138
+
139
+ // A copy of what is typed, in the same font, laid out but never painted.
140
+ const mirrorStyle = {
141
+ position: 'absolute',
142
+ top: 0,
143
+ left: 0,
144
+ visibility: 'hidden',
145
+ pointerEvents: 'none',
146
+ whiteSpace: 'pre',
147
+ font: 'inherit',
148
+ } as const;
@@ -0,0 +1,142 @@
1
+ import { Button, HTMLSelect } from '@blueprintjs/core';
2
+ import { useState } from 'react';
3
+
4
+ import {
5
+ exportButtonsStyle,
6
+ exportNoteStyle,
7
+ exportSectionStyle,
8
+ } from '../core/exportStyles.ts';
9
+ import {
10
+ IMAGE_RESOLUTIONS,
11
+ formatImageSize,
12
+ imageResolution,
13
+ } from '../core/imageResolution.ts';
14
+ import type { PictureFrame } from '../core/pictureExport.ts';
15
+ import {
16
+ copyPicture,
17
+ pictureSize,
18
+ savePngPicture,
19
+ saveSvgPicture,
20
+ } from '../core/pictureExport.ts';
21
+ import { sanitizeFileName } from '../core/sanitizeFileName.ts';
22
+
23
+ import { ExportNameField } from './ExportNameField.tsx';
24
+
25
+ export interface ExportPictureSectionProps {
26
+ /** The drawing a picture is taken of, as it is rendered. */
27
+ getDrawing: () => SVGSVGElement | null;
28
+ /** Which of the resolutions is picked. */
29
+ resolutionId: string;
30
+ /** Called with the resolution that was picked. */
31
+ onResolutionChange: (id: string) => void;
32
+ /**
33
+ * The name the name box opens on, and falls back to when it is cleared,
34
+ * without its extension.
35
+ */
36
+ filename: string;
37
+ /** What the picture is read out as in the file it is written to. */
38
+ label: string;
39
+ /**
40
+ * Whether the picture is the drawing inside the element or the element as it
41
+ * is laid out.
42
+ * @default 'content'
43
+ */
44
+ frame?: PictureFrame;
45
+ /** Called with what became of the last thing written out. */
46
+ onStatus: (status: string) => void;
47
+ }
48
+
49
+ /**
50
+ * The drawing as a picture: how big it comes out, and where it goes.
51
+ *
52
+ * The size the file will be is shown beside the resolution rather than after
53
+ * the fact, since that is the number the choice is made on — a figure for a
54
+ * paper and a thumbnail for a slide are the same drawing at very different
55
+ * sizes. What is measured is what the picture will be of and not whatever is on
56
+ * screen, so the answer does not change when the window is resized or the
57
+ * drawing panned.
58
+ * @param props - Component props.
59
+ * @returns The section.
60
+ */
61
+ export function ExportPictureSection(props: ExportPictureSectionProps) {
62
+ const {
63
+ getDrawing,
64
+ resolutionId,
65
+ onResolutionChange,
66
+ filename,
67
+ label,
68
+ frame,
69
+ onStatus,
70
+ } = props;
71
+
72
+ const [name, setName] = useState(filename);
73
+
74
+ const savedName = sanitizeFileName(name, filename);
75
+ const { scale } = imageResolution(resolutionId);
76
+ const size = pictureSize(getDrawing(), scale, { frame });
77
+ const options = { scale, filename: savedName, label, frame };
78
+
79
+ return (
80
+ <section style={exportSectionStyle}>
81
+ <div style={resolutionStyle}>
82
+ <HTMLSelect
83
+ value={resolutionId}
84
+ aria-label="Resolution"
85
+ onChange={(event) => onResolutionChange(event.currentTarget.value)}
86
+ >
87
+ {IMAGE_RESOLUTIONS.map((resolution) => (
88
+ <option key={resolution.id} value={resolution.id}>
89
+ {resolution.label}
90
+ </option>
91
+ ))}
92
+ </HTMLSelect>
93
+ <span style={exportNoteStyle}>{formatImageSize(size)}</span>
94
+ </div>
95
+ <div style={exportButtonsStyle}>
96
+ <Button
97
+ icon="duplicate"
98
+ disabled={size === null}
99
+ text="Copy PNG"
100
+ onClick={() => {
101
+ // The rasterization is started here rather than awaited: Safari
102
+ // only allows a clipboard write the click itself started.
103
+ void copyPicture(getDrawing(), options).then(
104
+ (copied) =>
105
+ onStatus(copied ? 'Picture copied.' : 'Nothing was copied.'),
106
+ () => onStatus('Nothing was copied.'),
107
+ );
108
+ }}
109
+ />
110
+ <ExportNameField name={name} onChange={setName} />
111
+ <Button
112
+ icon="download"
113
+ disabled={size === null}
114
+ text="Save PNG"
115
+ title={`Save as ${savedName}.png`}
116
+ onClick={() => {
117
+ void savePngPicture(getDrawing(), options).then((saved) => {
118
+ if (saved) onStatus(`Saved as ${savedName}.png.`);
119
+ });
120
+ }}
121
+ />
122
+ <Button
123
+ icon="download"
124
+ disabled={size === null}
125
+ text="Save SVG"
126
+ title={`Save as ${savedName}.svg`}
127
+ onClick={() => {
128
+ if (saveSvgPicture(getDrawing(), options)) {
129
+ onStatus(`Saved as ${savedName}.svg.`);
130
+ }
131
+ }}
132
+ />
133
+ </div>
134
+ </section>
135
+ );
136
+ }
137
+
138
+ const resolutionStyle = {
139
+ display: 'flex',
140
+ alignItems: 'center',
141
+ gap: 8,
142
+ } as const;
@@ -11,3 +11,14 @@ export type { FigureDownloadProps } from './FigureDownload.tsx';
11
11
  export { FigureDownload } from './FigureDownload.tsx';
12
12
  export type { FigureDownloadPanelProps } from './FigureDownloadPanel.tsx';
13
13
  export { FigureDownloadPanel } from './FigureDownloadPanel.tsx';
14
+
15
+ export type { ExportDialogFrameProps } from './ExportDialogFrame.tsx';
16
+ export { ExportDialogFrame } from './ExportDialogFrame.tsx';
17
+ export type { ExportImageDialogProps } from './ExportImageDialog.tsx';
18
+ export { ExportImageDialog } from './ExportImageDialog.tsx';
19
+ export type { ExportNameFieldProps } from './ExportNameField.tsx';
20
+ export { ExportNameField } from './ExportNameField.tsx';
21
+ export type { ExportPictureSectionProps } from './ExportPictureSection.tsx';
22
+ export { ExportPictureSection } from './ExportPictureSection.tsx';
23
+ export type { DrawingBox } from './useDrawingBox.ts';
24
+ export { useDrawingBox } from './useDrawingBox.ts';
@@ -0,0 +1,37 @@
1
+ import { useCallback, useRef } from 'react';
2
+
3
+ import { drawingIn } from '../core/stackedDrawing.ts';
4
+
5
+ /** The box a picture is taken out of. */
6
+ export interface DrawingBox {
7
+ /** Put on the box the drawing sits in, so it can be found again. */
8
+ attach: (element: HTMLElement | null) => void;
9
+ /**
10
+ * The drawing a picture is taken of, `null` when the box holds none — which
11
+ * is what an editor showing nothing yet, or one whose box has not been
12
+ * mounted, hands the export dialog.
13
+ */
14
+ getDrawing: () => SVGSVGElement | null;
15
+ }
16
+
17
+ /**
18
+ * Find the drawing a picture is to be taken of, when it is asked for.
19
+ *
20
+ * A drawing is laid out again on every resize, so the element itself is never
21
+ * held onto: what is kept is the box it sits in, and the drawing is read out of
22
+ * it at the moment a button is pressed. What counts as the drawing in there —
23
+ * the one element for an editor showing one, the panes composed for an editor
24
+ * showing a stack of charts — is `drawingIn`.
25
+ * @returns The box to attach, and the drawing inside it.
26
+ */
27
+ export function useDrawingBox(): DrawingBox {
28
+ const box = useRef<HTMLElement | null>(null);
29
+
30
+ const attach = useCallback((element: HTMLElement | null) => {
31
+ box.current = element;
32
+ }, []);
33
+
34
+ const getDrawing = useCallback(() => drawingIn(box.current), []);
35
+
36
+ return { attach, getDrawing };
37
+ }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Name the source of a failed read.
3
+ *
4
+ * A reader is met by a user exactly once — when it fails — so what it says
5
+ * then is the whole of its interface, and saying it in one voice across a site
6
+ * matters more than in most code.
7
+ *
8
+ * A message that opens with the file's own name tells whoever dropped eleven
9
+ * files which of them is the problem; one that opens with `The pasted text`
10
+ * tells them the message is about the box they just typed into.
11
+ * @param fileName - The file's name, absent for a paste.
12
+ * @returns A subject a sentence can start with.
13
+ * @example
14
+ * `${describeSource(fileName)} holds no readable peak list.`
15
+ */
16
+ export function describeSource(fileName?: string): string {
17
+ return fileName === undefined ? 'The pasted text' : fileName;
18
+ }
@@ -1 +1,2 @@
1
+ export { describeSource } from './describeSource.ts';
1
2
  export { errorMessage, toError } from './toError.ts';