react-cheminfo 0.28.0 → 0.29.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 (691) hide show
  1. package/README.md +38 -25
  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/clipboard/core/copyPng.d.ts +13 -0
  151. package/lib/clipboard/core/copyPng.d.ts.map +1 -0
  152. package/lib/clipboard/core/copyPng.js +19 -0
  153. package/lib/clipboard/core/copyPng.js.map +1 -0
  154. package/lib/clipboard/core/index.d.ts +1 -0
  155. package/lib/clipboard/core/index.d.ts.map +1 -1
  156. package/lib/clipboard/core/index.js +1 -0
  157. package/lib/clipboard/core/index.js.map +1 -1
  158. package/lib/core.d.ts +1 -0
  159. package/lib/core.d.ts.map +1 -1
  160. package/lib/core.js +1 -0
  161. package/lib/core.js.map +1 -1
  162. package/lib/download/core/exportStyles.d.ts +22 -0
  163. package/lib/download/core/exportStyles.d.ts.map +1 -0
  164. package/lib/download/core/exportStyles.js +19 -0
  165. package/lib/download/core/exportStyles.js.map +1 -0
  166. package/lib/download/core/imageResolution.d.ts +88 -0
  167. package/lib/download/core/imageResolution.d.ts.map +1 -0
  168. package/lib/download/core/imageResolution.js +77 -0
  169. package/lib/download/core/imageResolution.js.map +1 -0
  170. package/lib/download/core/index.d.ts +13 -0
  171. package/lib/download/core/index.d.ts.map +1 -1
  172. package/lib/download/core/index.js +8 -0
  173. package/lib/download/core/index.js.map +1 -1
  174. package/lib/download/core/pictureExport.d.ts +93 -0
  175. package/lib/download/core/pictureExport.d.ts.map +1 -0
  176. package/lib/download/core/pictureExport.js +116 -0
  177. package/lib/download/core/pictureExport.js.map +1 -0
  178. package/lib/download/core/stackedDrawing.d.ts +36 -0
  179. package/lib/download/core/stackedDrawing.d.ts.map +1 -0
  180. package/lib/download/core/stackedDrawing.js +98 -0
  181. package/lib/download/core/stackedDrawing.js.map +1 -0
  182. package/lib/download/core/svgBounds.d.ts +44 -0
  183. package/lib/download/core/svgBounds.d.ts.map +1 -0
  184. package/lib/download/core/svgBounds.js +69 -0
  185. package/lib/download/core/svgBounds.js.map +1 -0
  186. package/lib/download/core/svgNamespace.d.ts +9 -0
  187. package/lib/download/core/svgNamespace.d.ts.map +1 -0
  188. package/lib/download/core/svgNamespace.js +10 -0
  189. package/lib/download/core/svgNamespace.js.map +1 -0
  190. package/lib/download/core/svgToPng.d.ts +43 -0
  191. package/lib/download/core/svgToPng.d.ts.map +1 -0
  192. package/lib/download/core/svgToPng.js +79 -0
  193. package/lib/download/core/svgToPng.js.map +1 -0
  194. package/lib/download/core/svgToString.d.ts +45 -0
  195. package/lib/download/core/svgToString.d.ts.map +1 -0
  196. package/lib/download/core/svgToString.js +58 -0
  197. package/lib/download/core/svgToString.js.map +1 -0
  198. package/lib/download/ui/ExportDialogFrame.d.ts +46 -0
  199. package/lib/download/ui/ExportDialogFrame.d.ts.map +1 -0
  200. package/lib/download/ui/ExportDialogFrame.js +24 -0
  201. package/lib/download/ui/ExportDialogFrame.js.map +1 -0
  202. package/lib/download/ui/ExportImageDialog.d.ts +47 -0
  203. package/lib/download/ui/ExportImageDialog.d.ts.map +1 -0
  204. package/lib/download/ui/ExportImageDialog.js +25 -0
  205. package/lib/download/ui/ExportImageDialog.js.map +1 -0
  206. package/lib/download/ui/ExportNameField.d.ts +29 -0
  207. package/lib/download/ui/ExportNameField.d.ts.map +1 -0
  208. package/lib/download/ui/ExportNameField.js +99 -0
  209. package/lib/download/ui/ExportNameField.js.map +1 -0
  210. package/lib/download/ui/ExportPictureSection.d.ts +38 -0
  211. package/lib/download/ui/ExportPictureSection.d.ts.map +1 -0
  212. package/lib/download/ui/ExportPictureSection.js +48 -0
  213. package/lib/download/ui/ExportPictureSection.js.map +1 -0
  214. package/lib/download/ui/index.d.ts +10 -0
  215. package/lib/download/ui/index.d.ts.map +1 -1
  216. package/lib/download/ui/index.js +5 -0
  217. package/lib/download/ui/index.js.map +1 -1
  218. package/lib/download/ui/useDrawingBox.d.ts +23 -0
  219. package/lib/download/ui/useDrawingBox.d.ts.map +1 -0
  220. package/lib/download/ui/useDrawingBox.js +21 -0
  221. package/lib/download/ui/useDrawingBox.js.map +1 -0
  222. package/lib/error/core/describeSource.d.ts +17 -0
  223. package/lib/error/core/describeSource.d.ts.map +1 -0
  224. package/lib/error/core/describeSource.js +19 -0
  225. package/lib/error/core/describeSource.js.map +1 -0
  226. package/lib/error/core/index.d.ts +1 -0
  227. package/lib/error/core/index.d.ts.map +1 -1
  228. package/lib/error/core/index.js +1 -0
  229. package/lib/error/core/index.js.map +1 -1
  230. package/lib/help/ui/HelpBody.d.ts +10 -1
  231. package/lib/help/ui/HelpBody.d.ts.map +1 -1
  232. package/lib/help/ui/HelpBody.js +24 -1
  233. package/lib/help/ui/HelpBody.js.map +1 -1
  234. package/lib/help/ui/index.d.ts +1 -1
  235. package/lib/help/ui/index.d.ts.map +1 -1
  236. package/lib/help/ui/index.js.map +1 -1
  237. package/lib/ir/core/analysisSpectra.d.ts +46 -0
  238. package/lib/ir/core/analysisSpectra.d.ts.map +1 -0
  239. package/lib/ir/core/analysisSpectra.js +187 -0
  240. package/lib/ir/core/analysisSpectra.js.map +1 -0
  241. package/lib/ir/core/assignBands.d.ts +83 -0
  242. package/lib/ir/core/assignBands.d.ts.map +1 -0
  243. package/lib/ir/core/assignBands.js +83 -0
  244. package/lib/ir/core/assignBands.js.map +1 -0
  245. package/lib/ir/core/bandAssignments.d.ts +47 -0
  246. package/lib/ir/core/bandAssignments.d.ts.map +1 -0
  247. package/lib/ir/core/bandAssignments.js +305 -0
  248. package/lib/ir/core/bandAssignments.js.map +1 -0
  249. package/lib/ir/core/bandLabelPlan.d.ts +93 -0
  250. package/lib/ir/core/bandLabelPlan.d.ts.map +1 -0
  251. package/lib/ir/core/bandLabelPlan.js +104 -0
  252. package/lib/ir/core/bandLabelPlan.js.map +1 -0
  253. package/lib/ir/core/detectIrFormat.d.ts +23 -0
  254. package/lib/ir/core/detectIrFormat.d.ts.map +1 -0
  255. package/lib/ir/core/detectIrFormat.js +133 -0
  256. package/lib/ir/core/detectIrFormat.js.map +1 -0
  257. package/lib/ir/core/downloadSpectra.d.ts +26 -0
  258. package/lib/ir/core/downloadSpectra.d.ts.map +1 -0
  259. package/lib/ir/core/downloadSpectra.js +37 -0
  260. package/lib/ir/core/downloadSpectra.js.map +1 -0
  261. package/lib/ir/core/fromJcamp.d.ts +35 -0
  262. package/lib/ir/core/fromJcamp.d.ts.map +1 -0
  263. package/lib/ir/core/fromJcamp.js +48 -0
  264. package/lib/ir/core/fromJcamp.js.map +1 -0
  265. package/lib/ir/core/fromSpc.d.ts +30 -0
  266. package/lib/ir/core/fromSpc.d.ts.map +1 -0
  267. package/lib/ir/core/fromSpc.js +40 -0
  268. package/lib/ir/core/fromSpc.js.map +1 -0
  269. package/lib/ir/core/index.d.ts +51 -0
  270. package/lib/ir/core/index.d.ts.map +1 -0
  271. package/lib/ir/core/index.js +35 -0
  272. package/lib/ir/core/index.js.map +1 -0
  273. package/lib/ir/core/irBand.d.ts +45 -0
  274. package/lib/ir/core/irBand.d.ts.map +1 -0
  275. package/lib/ir/core/irBand.js +30 -0
  276. package/lib/ir/core/irBand.js.map +1 -0
  277. package/lib/ir/core/irCommands.d.ts +168 -0
  278. package/lib/ir/core/irCommands.d.ts.map +1 -0
  279. package/lib/ir/core/irCommands.js +94 -0
  280. package/lib/ir/core/irCommands.js.map +1 -0
  281. package/lib/ir/core/irDomain.d.ts +63 -0
  282. package/lib/ir/core/irDomain.d.ts.map +1 -0
  283. package/lib/ir/core/irDomain.js +136 -0
  284. package/lib/ir/core/irDomain.js.map +1 -0
  285. package/lib/ir/core/irEditorApi.d.ts +42 -0
  286. package/lib/ir/core/irEditorApi.d.ts.map +1 -0
  287. package/lib/ir/core/irEditorApi.js +10 -0
  288. package/lib/ir/core/irEditorApi.js.map +1 -0
  289. package/lib/ir/core/irFormat.d.ts +42 -0
  290. package/lib/ir/core/irFormat.d.ts.map +1 -0
  291. package/lib/ir/core/irFormat.js +51 -0
  292. package/lib/ir/core/irFormat.js.map +1 -0
  293. package/lib/ir/core/irMode.d.ts +160 -0
  294. package/lib/ir/core/irMode.d.ts.map +1 -0
  295. package/lib/ir/core/irMode.js +175 -0
  296. package/lib/ir/core/irMode.js.map +1 -0
  297. package/lib/ir/core/irReducer.d.ts +101 -0
  298. package/lib/ir/core/irReducer.d.ts.map +1 -0
  299. package/lib/ir/core/irReducer.js +207 -0
  300. package/lib/ir/core/irReducer.js.map +1 -0
  301. package/lib/ir/core/irSidePanels.d.ts +22 -0
  302. package/lib/ir/core/irSidePanels.d.ts.map +1 -0
  303. package/lib/ir/core/irSidePanels.js +12 -0
  304. package/lib/ir/core/irSidePanels.js.map +1 -0
  305. package/lib/ir/core/irSpectrum.d.ts +140 -0
  306. package/lib/ir/core/irSpectrum.d.ts.map +1 -0
  307. package/lib/ir/core/irSpectrum.js +34 -0
  308. package/lib/ir/core/irSpectrum.js.map +1 -0
  309. package/lib/ir/core/irState.d.ts +119 -0
  310. package/lib/ir/core/irState.d.ts.map +1 -0
  311. package/lib/ir/core/irState.js +92 -0
  312. package/lib/ir/core/irState.js.map +1 -0
  313. package/lib/ir/core/loadIrSpectra.d.ts +36 -0
  314. package/lib/ir/core/loadIrSpectra.d.ts.map +1 -0
  315. package/lib/ir/core/loadIrSpectra.js +44 -0
  316. package/lib/ir/core/loadIrSpectra.js.map +1 -0
  317. package/lib/ir/core/nearestBand.d.ts +35 -0
  318. package/lib/ir/core/nearestBand.d.ts.map +1 -0
  319. package/lib/ir/core/nearestBand.js +47 -0
  320. package/lib/ir/core/nearestBand.js.map +1 -0
  321. package/lib/ir/core/pickBands.d.ts +70 -0
  322. package/lib/ir/core/pickBands.d.ts.map +1 -0
  323. package/lib/ir/core/pickBands.js +125 -0
  324. package/lib/ir/core/pickBands.js.map +1 -0
  325. package/lib/ir/core/spectrumJcamp.d.ts +58 -0
  326. package/lib/ir/core/spectrumJcamp.d.ts.map +1 -0
  327. package/lib/ir/core/spectrumJcamp.js +156 -0
  328. package/lib/ir/core/spectrumJcamp.js.map +1 -0
  329. package/lib/ir/core/toIrSpectrum.d.ts +59 -0
  330. package/lib/ir/core/toIrSpectrum.d.ts.map +1 -0
  331. package/lib/ir/core/toIrSpectrum.js +56 -0
  332. package/lib/ir/core/toIrSpectrum.js.map +1 -0
  333. package/lib/ir/ui/BandMarks.d.ts +52 -0
  334. package/lib/ir/ui/BandMarks.d.ts.map +1 -0
  335. package/lib/ir/ui/BandMarks.js +71 -0
  336. package/lib/ir/ui/BandMarks.js.map +1 -0
  337. package/lib/ir/ui/BandsPanel.d.ts +31 -0
  338. package/lib/ir/ui/BandsPanel.d.ts.map +1 -0
  339. package/lib/ir/ui/BandsPanel.js +94 -0
  340. package/lib/ir/ui/BandsPanel.js.map +1 -0
  341. package/lib/ir/ui/IrAboutDialog.d.ts +18 -0
  342. package/lib/ir/ui/IrAboutDialog.d.ts.map +1 -0
  343. package/lib/ir/ui/IrAboutDialog.js +32 -0
  344. package/lib/ir/ui/IrAboutDialog.js.map +1 -0
  345. package/lib/ir/ui/IrCanvas.d.ts +38 -0
  346. package/lib/ir/ui/IrCanvas.d.ts.map +1 -0
  347. package/lib/ir/ui/IrCanvas.js +41 -0
  348. package/lib/ir/ui/IrCanvas.js.map +1 -0
  349. package/lib/ir/ui/IrChart.d.ts +28 -0
  350. package/lib/ir/ui/IrChart.d.ts.map +1 -0
  351. package/lib/ir/ui/IrChart.js +114 -0
  352. package/lib/ir/ui/IrChart.js.map +1 -0
  353. package/lib/ir/ui/IrCommandProvider.d.ts +15 -0
  354. package/lib/ir/ui/IrCommandProvider.d.ts.map +1 -0
  355. package/lib/ir/ui/IrCommandProvider.js +14 -0
  356. package/lib/ir/ui/IrCommandProvider.js.map +1 -0
  357. package/lib/ir/ui/IrCommandTooltip.d.ts +16 -0
  358. package/lib/ir/ui/IrCommandTooltip.d.ts.map +1 -0
  359. package/lib/ir/ui/IrCommandTooltip.js +22 -0
  360. package/lib/ir/ui/IrCommandTooltip.js.map +1 -0
  361. package/lib/ir/ui/IrDocumentationDialog.d.ts +18 -0
  362. package/lib/ir/ui/IrDocumentationDialog.d.ts.map +1 -0
  363. package/lib/ir/ui/IrDocumentationDialog.js +68 -0
  364. package/lib/ir/ui/IrDocumentationDialog.js.map +1 -0
  365. package/lib/ir/ui/IrEditor.d.ts +60 -0
  366. package/lib/ir/ui/IrEditor.d.ts.map +1 -0
  367. package/lib/ir/ui/IrEditor.js +42 -0
  368. package/lib/ir/ui/IrEditor.js.map +1 -0
  369. package/lib/ir/ui/IrHeader.d.ts +13 -0
  370. package/lib/ir/ui/IrHeader.d.ts.map +1 -0
  371. package/lib/ir/ui/IrHeader.js +21 -0
  372. package/lib/ir/ui/IrHeader.js.map +1 -0
  373. package/lib/ir/ui/IrLogo.d.ts +20 -0
  374. package/lib/ir/ui/IrLogo.d.ts.map +1 -0
  375. package/lib/ir/ui/IrLogo.js +17 -0
  376. package/lib/ir/ui/IrLogo.js.map +1 -0
  377. package/lib/ir/ui/IrPointerTracker.d.ts +29 -0
  378. package/lib/ir/ui/IrPointerTracker.d.ts.map +1 -0
  379. package/lib/ir/ui/IrPointerTracker.js +47 -0
  380. package/lib/ir/ui/IrPointerTracker.js.map +1 -0
  381. package/lib/ir/ui/IrShell.d.ts +25 -0
  382. package/lib/ir/ui/IrShell.d.ts.map +1 -0
  383. package/lib/ir/ui/IrShell.js +178 -0
  384. package/lib/ir/ui/IrShell.js.map +1 -0
  385. package/lib/ir/ui/IrSidePanel.d.ts +26 -0
  386. package/lib/ir/ui/IrSidePanel.d.ts.map +1 -0
  387. package/lib/ir/ui/IrSidePanel.js +39 -0
  388. package/lib/ir/ui/IrSidePanel.js.map +1 -0
  389. package/lib/ir/ui/IrStateProvider.d.ts +19 -0
  390. package/lib/ir/ui/IrStateProvider.d.ts.map +1 -0
  391. package/lib/ir/ui/IrStateProvider.js +16 -0
  392. package/lib/ir/ui/IrStateProvider.js.map +1 -0
  393. package/lib/ir/ui/IrStatusBar.d.ts +14 -0
  394. package/lib/ir/ui/IrStatusBar.d.ts.map +1 -0
  395. package/lib/ir/ui/IrStatusBar.js +48 -0
  396. package/lib/ir/ui/IrStatusBar.js.map +1 -0
  397. package/lib/ir/ui/IrToolbar.d.ts +18 -0
  398. package/lib/ir/ui/IrToolbar.d.ts.map +1 -0
  399. package/lib/ir/ui/IrToolbar.js +32 -0
  400. package/lib/ir/ui/IrToolbar.js.map +1 -0
  401. package/lib/ir/ui/IrTraces.d.ts +63 -0
  402. package/lib/ir/ui/IrTraces.d.ts.map +1 -0
  403. package/lib/ir/ui/IrTraces.js +72 -0
  404. package/lib/ir/ui/IrTraces.js.map +1 -0
  405. package/lib/ir/ui/MetadataPanel.d.ts +15 -0
  406. package/lib/ir/ui/MetadataPanel.d.ts.map +1 -0
  407. package/lib/ir/ui/MetadataPanel.js +49 -0
  408. package/lib/ir/ui/MetadataPanel.js.map +1 -0
  409. package/lib/ir/ui/SpectraPanel.d.ts +20 -0
  410. package/lib/ir/ui/SpectraPanel.d.ts.map +1 -0
  411. package/lib/ir/ui/SpectraPanel.js +42 -0
  412. package/lib/ir/ui/SpectraPanel.js.map +1 -0
  413. package/lib/ir/ui/SpectrumRow.d.ts +26 -0
  414. package/lib/ir/ui/SpectrumRow.d.ts.map +1 -0
  415. package/lib/ir/ui/SpectrumRow.js +41 -0
  416. package/lib/ir/ui/SpectrumRow.js.map +1 -0
  417. package/lib/ir/ui/index.d.ts +56 -0
  418. package/lib/ir/ui/index.d.ts.map +1 -0
  419. package/lib/ir/ui/index.js +36 -0
  420. package/lib/ir/ui/index.js.map +1 -0
  421. package/lib/ir/ui/irActions.d.ts +52 -0
  422. package/lib/ir/ui/irActions.d.ts.map +1 -0
  423. package/lib/ir/ui/irActions.js +62 -0
  424. package/lib/ir/ui/irActions.js.map +1 -0
  425. package/lib/ir/ui/irChartProps.d.ts +116 -0
  426. package/lib/ir/ui/irChartProps.d.ts.map +1 -0
  427. package/lib/ir/ui/irChartProps.js +14 -0
  428. package/lib/ir/ui/irChartProps.js.map +1 -0
  429. package/lib/ir/ui/irCommandContext.d.ts +35 -0
  430. package/lib/ir/ui/irCommandContext.d.ts.map +1 -0
  431. package/lib/ir/ui/irCommandContext.js +44 -0
  432. package/lib/ir/ui/irCommandContext.js.map +1 -0
  433. package/lib/ir/ui/irStateContext.d.ts +26 -0
  434. package/lib/ir/ui/irStateContext.d.ts.map +1 -0
  435. package/lib/ir/ui/irStateContext.js +37 -0
  436. package/lib/ir/ui/irStateContext.js.map +1 -0
  437. package/lib/ir/ui/useIrEditor.d.ts +51 -0
  438. package/lib/ir/ui/useIrEditor.d.ts.map +1 -0
  439. package/lib/ir/ui/useIrEditor.js +88 -0
  440. package/lib/ir/ui/useIrEditor.js.map +1 -0
  441. package/lib/ir/ui/useIrPointer.d.ts +66 -0
  442. package/lib/ir/ui/useIrPointer.d.ts.map +1 -0
  443. package/lib/ir/ui/useIrPointer.js +53 -0
  444. package/lib/ir/ui/useIrPointer.js.map +1 -0
  445. package/lib/ir/ui/useIrShortcuts.d.ts +24 -0
  446. package/lib/ir/ui/useIrShortcuts.d.ts.map +1 -0
  447. package/lib/ir/ui/useIrShortcuts.js +73 -0
  448. package/lib/ir/ui/useIrShortcuts.js.map +1 -0
  449. package/lib/ir/ui/useIrZoom.d.ts +51 -0
  450. package/lib/ir/ui/useIrZoom.d.ts.map +1 -0
  451. package/lib/ir/ui/useIrZoom.js +46 -0
  452. package/lib/ir/ui/useIrZoom.js.map +1 -0
  453. package/lib/ir.d.ts +13 -0
  454. package/lib/ir.d.ts.map +1 -0
  455. package/lib/ir.js +13 -0
  456. package/lib/ir.js.map +1 -0
  457. package/lib/panel/core/dialogStyles.d.ts +13 -0
  458. package/lib/panel/core/dialogStyles.d.ts.map +1 -0
  459. package/lib/panel/core/dialogStyles.js +11 -0
  460. package/lib/panel/core/dialogStyles.js.map +1 -0
  461. package/lib/panel/core/index.d.ts +19 -0
  462. package/lib/panel/core/index.d.ts.map +1 -0
  463. package/lib/panel/core/index.js +18 -0
  464. package/lib/panel/core/index.js.map +1 -0
  465. package/lib/panel/core/isEditingField.d.ts +17 -0
  466. package/lib/panel/core/isEditingField.d.ts.map +1 -0
  467. package/lib/panel/core/isEditingField.js +25 -0
  468. package/lib/panel/core/isEditingField.js.map +1 -0
  469. package/lib/panel/core/panelStyles.d.ts +242 -0
  470. package/lib/panel/core/panelStyles.d.ts.map +1 -0
  471. package/lib/panel/core/panelStyles.js +228 -0
  472. package/lib/panel/core/panelStyles.js.map +1 -0
  473. package/lib/panel/core/rowSpacers.d.ts +38 -0
  474. package/lib/panel/core/rowSpacers.d.ts.map +1 -0
  475. package/lib/panel/core/rowSpacers.js +31 -0
  476. package/lib/panel/core/rowSpacers.js.map +1 -0
  477. package/lib/panel/core/statusBar.d.ts +44 -0
  478. package/lib/panel/core/statusBar.d.ts.map +1 -0
  479. package/lib/panel/core/statusBar.js +40 -0
  480. package/lib/panel/core/statusBar.js.map +1 -0
  481. package/lib/panel/core/textFilter.d.ts +22 -0
  482. package/lib/panel/core/textFilter.d.ts.map +1 -0
  483. package/lib/panel/core/textFilter.js +32 -0
  484. package/lib/panel/core/textFilter.js.map +1 -0
  485. package/lib/panel/core/yieldToPainting.d.ts +17 -0
  486. package/lib/panel/core/yieldToPainting.d.ts.map +1 -0
  487. package/lib/panel/core/yieldToPainting.js +21 -0
  488. package/lib/panel/core/yieldToPainting.js.map +1 -0
  489. package/lib/panel/ui/AboutDialogFrame.d.ts +36 -0
  490. package/lib/panel/ui/AboutDialogFrame.d.ts.map +1 -0
  491. package/lib/panel/ui/AboutDialogFrame.js +43 -0
  492. package/lib/panel/ui/AboutDialogFrame.js.map +1 -0
  493. package/lib/panel/ui/ClearButton.d.ts +28 -0
  494. package/lib/panel/ui/ClearButton.d.ts.map +1 -0
  495. package/lib/panel/ui/ClearButton.js +23 -0
  496. package/lib/panel/ui/ClearButton.js.map +1 -0
  497. package/lib/panel/ui/DocumentationDialogFrame.d.ts +39 -0
  498. package/lib/panel/ui/DocumentationDialogFrame.d.ts.map +1 -0
  499. package/lib/panel/ui/DocumentationDialogFrame.js +29 -0
  500. package/lib/panel/ui/DocumentationDialogFrame.js.map +1 -0
  501. package/lib/panel/ui/FilterInput.d.ts +31 -0
  502. package/lib/panel/ui/FilterInput.d.ts.map +1 -0
  503. package/lib/panel/ui/FilterInput.js +23 -0
  504. package/lib/panel/ui/FilterInput.js.map +1 -0
  505. package/lib/panel/ui/HelpLabel.d.ts +24 -0
  506. package/lib/panel/ui/HelpLabel.d.ts.map +1 -0
  507. package/lib/panel/ui/HelpLabel.js +23 -0
  508. package/lib/panel/ui/HelpLabel.js.map +1 -0
  509. package/lib/panel/ui/PanelMessage.d.ts +41 -0
  510. package/lib/panel/ui/PanelMessage.d.ts.map +1 -0
  511. package/lib/panel/ui/PanelMessage.js +30 -0
  512. package/lib/panel/ui/PanelMessage.js.map +1 -0
  513. package/lib/panel/ui/PanelRail.d.ts +41 -0
  514. package/lib/panel/ui/PanelRail.d.ts.map +1 -0
  515. package/lib/panel/ui/PanelRail.js +12 -0
  516. package/lib/panel/ui/PanelRail.js.map +1 -0
  517. package/lib/panel/ui/Section.d.ts +25 -0
  518. package/lib/panel/ui/Section.d.ts.map +1 -0
  519. package/lib/panel/ui/Section.js +41 -0
  520. package/lib/panel/ui/Section.js.map +1 -0
  521. package/lib/panel/ui/SidePanelStack.d.ts +62 -0
  522. package/lib/panel/ui/SidePanelStack.d.ts.map +1 -0
  523. package/lib/panel/ui/SidePanelStack.js +40 -0
  524. package/lib/panel/ui/SidePanelStack.js.map +1 -0
  525. package/lib/panel/ui/SpectrumColorSwatch.d.ts +33 -0
  526. package/lib/panel/ui/SpectrumColorSwatch.d.ts.map +1 -0
  527. package/lib/panel/ui/SpectrumColorSwatch.js +76 -0
  528. package/lib/panel/ui/SpectrumColorSwatch.js.map +1 -0
  529. package/lib/panel/ui/index.d.ts +37 -0
  530. package/lib/panel/ui/index.d.ts.map +1 -0
  531. package/lib/panel/ui/index.js +24 -0
  532. package/lib/panel/ui/index.js.map +1 -0
  533. package/lib/panel/ui/useConfirmOnEnter.d.ts +19 -0
  534. package/lib/panel/ui/useConfirmOnEnter.d.ts.map +1 -0
  535. package/lib/panel/ui/useConfirmOnEnter.js +64 -0
  536. package/lib/panel/ui/useConfirmOnEnter.js.map +1 -0
  537. package/lib/panel/ui/useFilterBox.d.ts +23 -0
  538. package/lib/panel/ui/useFilterBox.d.ts.map +1 -0
  539. package/lib/panel/ui/useFilterBox.js +22 -0
  540. package/lib/panel/ui/useFilterBox.js.map +1 -0
  541. package/lib/panel/ui/useVirtualRows.d.ts +46 -0
  542. package/lib/panel/ui/useVirtualRows.d.ts.map +1 -0
  543. package/lib/panel/ui/useVirtualRows.js +56 -0
  544. package/lib/panel/ui/useVirtualRows.js.map +1 -0
  545. package/lib/panel/ui/useVirtualWindowRows.d.ts +40 -0
  546. package/lib/panel/ui/useVirtualWindowRows.d.ts.map +1 -0
  547. package/lib/panel/ui/useVirtualWindowRows.js +65 -0
  548. package/lib/panel/ui/useVirtualWindowRows.js.map +1 -0
  549. package/lib/ui.d.ts +1 -0
  550. package/lib/ui.d.ts.map +1 -1
  551. package/lib/ui.js +1 -0
  552. package/lib/ui.js.map +1 -1
  553. package/package.json +8 -1
  554. package/src/chart/core/axisLabels.ts +117 -0
  555. package/src/chart/core/boxLayout.ts +126 -0
  556. package/src/chart/core/chartAxisScale.ts +92 -10
  557. package/src/chart/core/chartDomain.ts +185 -0
  558. package/src/chart/core/chartGeometry.ts +159 -0
  559. package/src/chart/core/chartPane.ts +10 -0
  560. package/src/chart/core/chartScale.ts +7 -4
  561. package/src/chart/core/chartTheme.ts +161 -0
  562. package/src/chart/core/chartViewport.ts +40 -13
  563. package/src/chart/core/guidePlacement.ts +66 -0
  564. package/src/chart/core/index.ts +121 -2
  565. package/src/chart/core/labelStack.ts +72 -0
  566. package/src/chart/core/legendBox.ts +263 -0
  567. package/src/chart/core/selectionGeometry.ts +68 -0
  568. package/src/chart/core/spectrumColor.ts +129 -0
  569. package/src/chart/core/stackCapacity.ts +162 -0
  570. package/src/chart/core/svgPoint.ts +77 -0
  571. package/src/chart/core/tracePath.ts +228 -0
  572. package/src/chart/core/trackerReadout.ts +78 -0
  573. package/src/chart/core/viewTransform.ts +287 -0
  574. package/src/chart/core/zoomDomain.ts +235 -0
  575. package/src/chart/ui/Axes.tsx +361 -0
  576. package/src/chart/ui/AxisGuide.tsx +187 -0
  577. package/src/chart/ui/ChartStack.tsx +130 -0
  578. package/src/chart/ui/ChartTracker.tsx +101 -0
  579. package/src/chart/ui/PlotCaption.tsx +108 -0
  580. package/src/chart/ui/SelectionRect.tsx +52 -0
  581. package/src/chart/ui/TraceLegend.tsx +193 -0
  582. package/src/chart/ui/chartGestures.ts +270 -0
  583. package/src/chart/ui/chartStackLevel.tsx +210 -0
  584. package/src/chart/ui/chartSurface.ts +66 -0
  585. package/src/chart/ui/index.ts +35 -0
  586. package/src/chart/ui/useChartPointer.ts +223 -0
  587. package/src/chart/ui/useChartSize.ts +115 -0
  588. package/src/chart/ui/useChartWindow.ts +240 -0
  589. package/src/chart/ui/useChartZoom.ts +255 -0
  590. package/src/chart/ui/useWheelListener.ts +62 -0
  591. package/src/clipboard/core/copyPng.ts +20 -0
  592. package/src/clipboard/core/index.ts +1 -0
  593. package/src/core.ts +1 -0
  594. package/src/download/core/exportStyles.ts +20 -0
  595. package/src/download/core/imageResolution.ts +118 -0
  596. package/src/download/core/index.ts +34 -0
  597. package/src/download/core/pictureExport.ts +207 -0
  598. package/src/download/core/stackedDrawing.ts +108 -0
  599. package/src/download/core/svgBounds.ts +80 -0
  600. package/src/download/core/svgNamespace.ts +9 -0
  601. package/src/download/core/svgToPng.ts +121 -0
  602. package/src/download/core/svgToString.ts +95 -0
  603. package/src/download/ui/ExportDialogFrame.tsx +86 -0
  604. package/src/download/ui/ExportImageDialog.tsx +91 -0
  605. package/src/download/ui/ExportNameField.tsx +148 -0
  606. package/src/download/ui/ExportPictureSection.tsx +142 -0
  607. package/src/download/ui/index.ts +11 -0
  608. package/src/download/ui/useDrawingBox.ts +37 -0
  609. package/src/error/core/describeSource.ts +18 -0
  610. package/src/error/core/index.ts +1 -0
  611. package/src/help/ui/HelpBody.tsx +41 -2
  612. package/src/help/ui/index.ts +6 -1
  613. package/src/ir/core/analysisSpectra.ts +231 -0
  614. package/src/ir/core/assignBands.ts +144 -0
  615. package/src/ir/core/bandAssignments.ts +329 -0
  616. package/src/ir/core/bandLabelPlan.ts +194 -0
  617. package/src/ir/core/detectIrFormat.ts +139 -0
  618. package/src/ir/core/downloadSpectra.ts +57 -0
  619. package/src/ir/core/fromJcamp.ts +70 -0
  620. package/src/ir/core/fromSpc.ts +61 -0
  621. package/src/ir/core/index.ts +113 -0
  622. package/src/ir/core/irBand.ts +57 -0
  623. package/src/ir/core/irCommands.ts +154 -0
  624. package/src/ir/core/irDomain.ts +163 -0
  625. package/src/ir/core/irEditorApi.ts +44 -0
  626. package/src/ir/core/irFormat.ts +57 -0
  627. package/src/ir/core/irMode.ts +203 -0
  628. package/src/ir/core/irReducer.ts +273 -0
  629. package/src/ir/core/irSidePanels.ts +20 -0
  630. package/src/ir/core/irSpectrum.ts +155 -0
  631. package/src/ir/core/irState.ts +173 -0
  632. package/src/ir/core/loadIrSpectra.ts +79 -0
  633. package/src/ir/core/nearestBand.ts +57 -0
  634. package/src/ir/core/pickBands.ts +181 -0
  635. package/src/ir/core/spectrumJcamp.ts +178 -0
  636. package/src/ir/core/toIrSpectrum.ts +102 -0
  637. package/src/ir/ui/BandMarks.tsx +166 -0
  638. package/src/ir/ui/BandsPanel.tsx +271 -0
  639. package/src/ir/ui/IrAboutDialog.tsx +121 -0
  640. package/src/ir/ui/IrCanvas.tsx +91 -0
  641. package/src/ir/ui/IrChart.tsx +215 -0
  642. package/src/ir/ui/IrCommandProvider.tsx +32 -0
  643. package/src/ir/ui/IrCommandTooltip.tsx +36 -0
  644. package/src/ir/ui/IrDocumentationDialog.tsx +174 -0
  645. package/src/ir/ui/IrEditor.tsx +99 -0
  646. package/src/ir/ui/IrHeader.tsx +39 -0
  647. package/src/ir/ui/IrLogo.tsx +49 -0
  648. package/src/ir/ui/IrPointerTracker.tsx +102 -0
  649. package/src/ir/ui/IrShell.tsx +285 -0
  650. package/src/ir/ui/IrSidePanel.tsx +78 -0
  651. package/src/ir/ui/IrStateProvider.tsx +32 -0
  652. package/src/ir/ui/IrStatusBar.tsx +97 -0
  653. package/src/ir/ui/IrToolbar.tsx +102 -0
  654. package/src/ir/ui/IrTraces.tsx +134 -0
  655. package/src/ir/ui/MetadataPanel.tsx +88 -0
  656. package/src/ir/ui/SpectraPanel.tsx +114 -0
  657. package/src/ir/ui/SpectrumRow.tsx +127 -0
  658. package/src/ir/ui/index.ts +56 -0
  659. package/src/ir/ui/irActions.ts +103 -0
  660. package/src/ir/ui/irChartProps.ts +118 -0
  661. package/src/ir/ui/irCommandContext.tsx +62 -0
  662. package/src/ir/ui/irStateContext.ts +48 -0
  663. package/src/ir/ui/useIrEditor.ts +139 -0
  664. package/src/ir/ui/useIrPointer.ts +109 -0
  665. package/src/ir/ui/useIrShortcuts.ts +95 -0
  666. package/src/ir/ui/useIrZoom.ts +86 -0
  667. package/src/ir.ts +13 -0
  668. package/src/panel/core/dialogStyles.ts +11 -0
  669. package/src/panel/core/index.ts +47 -0
  670. package/src/panel/core/isEditingField.ts +23 -0
  671. package/src/panel/core/panelStyles.ts +248 -0
  672. package/src/panel/core/rowSpacers.ts +50 -0
  673. package/src/panel/core/statusBar.ts +48 -0
  674. package/src/panel/core/textFilter.ts +33 -0
  675. package/src/panel/core/yieldToPainting.ts +20 -0
  676. package/src/panel/ui/AboutDialogFrame.tsx +100 -0
  677. package/src/panel/ui/ClearButton.tsx +42 -0
  678. package/src/panel/ui/DocumentationDialogFrame.tsx +86 -0
  679. package/src/panel/ui/FilterInput.tsx +60 -0
  680. package/src/panel/ui/HelpLabel.tsx +43 -0
  681. package/src/panel/ui/PanelMessage.tsx +64 -0
  682. package/src/panel/ui/PanelRail.tsx +64 -0
  683. package/src/panel/ui/Section.tsx +66 -0
  684. package/src/panel/ui/SidePanelStack.tsx +109 -0
  685. package/src/panel/ui/SpectrumColorSwatch.tsx +119 -0
  686. package/src/panel/ui/index.ts +47 -0
  687. package/src/panel/ui/useConfirmOnEnter.ts +68 -0
  688. package/src/panel/ui/useFilterBox.ts +35 -0
  689. package/src/panel/ui/useVirtualRows.ts +82 -0
  690. package/src/panel/ui/useVirtualWindowRows.ts +86 -0
  691. package/src/ui.ts +1 -0
@@ -0,0 +1,255 @@
1
+ /**
2
+ * The gestures that move the window a chart is showing.
3
+ *
4
+ * A drag zooms the x axis, because that is the axis a chemist reads: the
5
+ * question is nearly always "what is between 366 and 372", never "what is
6
+ * between forty and sixty percent". The y axis comes along only when the drag is
7
+ * released past the baseline, a gesture that cannot be made by accident and one
8
+ * the preview rectangle announces before the button is let go. The wheel scales
9
+ * the y axis on its own, bringing up the small features being asked about far
10
+ * more often than any box around them, and a double click puts the window back.
11
+ *
12
+ * Which of them a chart answers is `ZoomGestures`, and a viewer is free to offer
13
+ * fewer: a drag can be the rectangle it sweeps out, and the wheel can be left to
14
+ * the page. Neither is a preference to be toggled — it is what the measurement
15
+ * makes worth doing, and `chartDomain.ts` says why.
16
+ *
17
+ * Not every gesture moves the window. A drag can be asked to report the range it
18
+ * swept out, a press that went nowhere is a click, and a host can refuse a press
19
+ * outright so that a handle drawn on the chart keeps the gesture aimed at it;
20
+ * `chartGestures.ts` holds all three, and `zoomDomain.ts` holds what a gesture
21
+ * does to a window. Neither knows anything of React, which is what lets the
22
+ * answer to a gesture be read without a chart on screen.
23
+ *
24
+ * What the window is fitted *to* is handed in rather than worked out here, and
25
+ * that is what makes one hook serve every kind of spectrum: fitting reads the
26
+ * traces, and a mass spectrum's are two per spectrum where an infrared
27
+ * spectrum's are one in either of two units. `useChartWindow` then holds the
28
+ * answer each viewer hands over.
29
+ */
30
+
31
+ import type { PointerEvent as ReactPointerEvent, RefObject } from 'react';
32
+ import { useCallback, useMemo, useState } from 'react';
33
+
34
+ import type {
35
+ ChartDomain,
36
+ YAxisRules,
37
+ ZoomGestures,
38
+ ZoomRules,
39
+ } from '../core/chartDomain.ts';
40
+ import { DEFAULT_ZOOM_GESTURES } from '../core/chartDomain.ts';
41
+ import type { ChartScale } from '../core/chartScale.ts';
42
+ import { chartWheelFactor } from '../core/chartViewport.ts';
43
+ import type { ZoomSelection } from '../core/zoomDomain.ts';
44
+ import { scaledYAxis, zoomSelection } from '../core/zoomDomain.ts';
45
+
46
+ import type {
47
+ ChartGestureReports,
48
+ ChartZoomHandlers,
49
+ Drag,
50
+ } from './chartGestures.ts';
51
+ import {
52
+ answeredRelease,
53
+ draggedTo,
54
+ releaseDrag,
55
+ startedDrag,
56
+ } from './chartGestures.ts';
57
+ import type { ChartWindowOptions } from './useChartWindow.ts';
58
+ import { useChartWindow } from './useChartWindow.ts';
59
+ import { useWheelListener } from './useWheelListener.ts';
60
+
61
+ /** The chart, what it is fitted to, and which gestures it answers. */
62
+ export interface ChartZoomOptions
63
+ extends ChartWindowOptions, ChartGestureReports {
64
+ /** The SVG the gestures are made on, as it was handed to its `ref`. */
65
+ svgRef: RefObject<SVGSVGElement | null>;
66
+ /**
67
+ * How the y axis behaves under a gesture — where its baseline is, and whether
68
+ * that baseline is held in the window.
69
+ * @default a stick spectrum's: a baseline of zero, always kept
70
+ */
71
+ yAxis?: YAxisRules;
72
+ /**
73
+ * Which gestures the chart answers: what a drag asks for, and whether the
74
+ * wheel scales the value axis at all.
75
+ *
76
+ * Both together rather than one at a time, because they are one decision. A
77
+ * viewer that reads its data in more than one way — an infrared spectrum is
78
+ * read as absorbance or as percent transmittance — settles the whole set from
79
+ * whatever it is currently reading, and hands it over as it stands.
80
+ * @default every gesture: a drag along the horizontal axis, and the wheel
81
+ */
82
+ gestures?: ZoomGestures;
83
+ }
84
+
85
+ /** The window, the drag being made in it, and how to work both. */
86
+ export interface ChartZoom {
87
+ /** What the chart is showing. */
88
+ domain: ChartDomain;
89
+ /**
90
+ * The horizontal axis, as every gesture was measured against it: **draw with
91
+ * this rather than building one**, since a second scale beside it is a second
92
+ * chance to get a reversed axis the wrong way round.
93
+ */
94
+ xScale: ChartScale;
95
+ /** The vertical axis, likewise. */
96
+ yScale: ChartScale;
97
+ /** The drag being made, `null` when none is. */
98
+ selection: ZoomSelection | null;
99
+ /** Put the window back to everything that is drawn. */
100
+ reset: () => void;
101
+ /** Put on the SVG. */
102
+ handlers: ChartZoomHandlers;
103
+ }
104
+
105
+ /**
106
+ * Zoom a chart by dragging it, by the wheel and by double clicking it.
107
+ *
108
+ * Which window is on screen — the fit, the one a gesture arrived at, or the one
109
+ * a host imposes — is `useChartWindow`. What is here is what a gesture *is*: the
110
+ * drag as it is made, the rules it is read under, and the answer it comes to.
111
+ * @param options - The chart, the fit and how its y axis behaves.
112
+ * @returns The window and the gestures that move it.
113
+ */
114
+ export function useChartZoom(options: ChartZoomOptions): ChartZoom {
115
+ const {
116
+ fitted,
117
+ fitKey,
118
+ yFitKey,
119
+ svgRef,
120
+ plot,
121
+ yAxis,
122
+ gestures,
123
+ reverseX = false,
124
+ domain: imposed = null,
125
+ onSelectRange,
126
+ onClick,
127
+ shouldStartDrag,
128
+ } = options;
129
+
130
+ const { domain, xScale, yScale, show, reset } = useChartWindow({
131
+ fitted,
132
+ fitKey,
133
+ ...(yFitKey === undefined ? {} : { yFitKey }),
134
+ plot,
135
+ domain: imposed,
136
+ reverseX,
137
+ });
138
+
139
+ // Taken apart field by field rather than depending on the object, so a viewer
140
+ // rebuilding an equal `yAxis` or `gestures` on every render does not rebuild
141
+ // the rules and every callback hanging off them. Every field has to be listed
142
+ // here: one left out silently falls back to its default, which is how a
143
+ // transmittance chart came to answer a mass spectrum's question about its own
144
+ // baseline.
145
+ const baseline = yAxis?.baseline;
146
+ const keepBaseline = yAxis?.keepBaseline;
147
+ const pointsDown = yAxis?.pointsDown;
148
+ const dragMode = gestures?.drag ?? DEFAULT_ZOOM_GESTURES.drag;
149
+ const wheel = gestures?.wheel ?? DEFAULT_ZOOM_GESTURES.wheel;
150
+ const rules = useMemo<ZoomRules>(
151
+ () => ({ baseline, keepBaseline, pointsDown, drag: dragMode }),
152
+ [baseline, keepBaseline, pointsDown, dragMode],
153
+ );
154
+
155
+ const [drag, setDrag] = useState<Drag | null>(null);
156
+
157
+ const onWheel = useCallback(
158
+ (event: WheelEvent) => {
159
+ // Refused before the event is touched, so a chart that does not answer the
160
+ // wheel scrolls the page under the pointer exactly as the rest of it does.
161
+ // Swallowing the gesture and doing nothing with it would be the one
162
+ // outcome nobody asked for.
163
+ if (!wheel) return;
164
+ const factor = chartWheelFactor(event.deltaY, event.deltaMode);
165
+ if (factor === 1) return;
166
+ // Heard non-passively for exactly this: without the refusal the chart
167
+ // zooms and the page scrolls out from under it at the same time.
168
+ event.preventDefault();
169
+ show(scaledYAxis(domain, factor, rules.baseline));
170
+ },
171
+ [domain, rules.baseline, wheel, show],
172
+ );
173
+ useWheelListener(svgRef, onWheel);
174
+
175
+ const onPointerDown = useCallback(
176
+ (event: ReactPointerEvent<SVGSVGElement>) => {
177
+ const started = startedDrag(event, svgRef.current, shouldStartDrag);
178
+ if (started !== null) setDrag(started);
179
+ },
180
+ [svgRef, shouldStartDrag],
181
+ );
182
+
183
+ const onPointerMove = useCallback(
184
+ (event: ReactPointerEvent<SVGSVGElement>) => {
185
+ const moved = draggedTo(drag, event, svgRef.current);
186
+ if (moved !== null) setDrag(moved);
187
+ },
188
+ [drag, svgRef],
189
+ );
190
+
191
+ const onPointerUp = useCallback(
192
+ (event: ReactPointerEvent<SVGSVGElement>) => {
193
+ if (drag?.pointerId !== event.pointerId) return;
194
+ releaseDrag(event);
195
+ setDrag(null);
196
+ const released = draggedTo(drag, event, svgRef.current) ?? drag;
197
+ const next = answeredRelease(
198
+ domain,
199
+ released,
200
+ plot,
201
+ xScale,
202
+ yScale,
203
+ rules,
204
+ { onSelectRange, onClick },
205
+ // Read off the release rather than off the press, because that is where
206
+ // the reader was looking and what `reportClick` already inverts.
207
+ { shift: event.shiftKey, alt: event.altKey },
208
+ );
209
+ if (next !== null) show(next);
210
+ },
211
+ [
212
+ drag,
213
+ domain,
214
+ plot,
215
+ xScale,
216
+ yScale,
217
+ svgRef,
218
+ rules,
219
+ onSelectRange,
220
+ onClick,
221
+ show,
222
+ ],
223
+ );
224
+
225
+ const onPointerCancel = useCallback(
226
+ (event: ReactPointerEvent<SVGSVGElement>) => {
227
+ if (drag?.pointerId !== event.pointerId) return;
228
+ releaseDrag(event);
229
+ setDrag(null);
230
+ },
231
+ [drag],
232
+ );
233
+
234
+ const selection = useMemo(
235
+ () => zoomSelection(drag, yScale, rules),
236
+ [drag, yScale, rules],
237
+ );
238
+
239
+ return {
240
+ domain,
241
+ xScale,
242
+ yScale,
243
+ selection,
244
+ reset,
245
+ handlers: {
246
+ onPointerDown,
247
+ onPointerMove,
248
+ onPointerUp,
249
+ onPointerCancel,
250
+ onDoubleClick: reset,
251
+ },
252
+ };
253
+ }
254
+
255
+ export { type ChartZoomHandlers } from './chartGestures.ts';
@@ -0,0 +1,62 @@
1
+ /**
2
+ * The wheel over an element, heard loudly enough to refuse the page its
3
+ * scroll.
4
+ *
5
+ * React's `onWheel` is registered passively — the browser is told in advance
6
+ * that the page may scroll before the handler has had its say — so calling
7
+ * `preventDefault` inside it does nothing at all: the chart zooms and the page
8
+ * scrolls out from under it at the same time. The only way to be heard is to
9
+ * register the listener on the element directly with `{ passive: false }`,
10
+ * which is what this hook exists to do; nothing else about the gesture belongs
11
+ * here.
12
+ *
13
+ * The listener is attached once and reads the handler through a ref refreshed
14
+ * on every commit. Both halves are needed: attaching once is what keeps a
15
+ * pointer resting over the chart from re-registering a listener sixty times a
16
+ * second, and reading the handler live is what stops that one listener from
17
+ * zooming the window as it stood when the chart was mounted.
18
+ */
19
+
20
+ import type { RefObject } from 'react';
21
+ import { useEffect, useLayoutEffect, useRef } from 'react';
22
+
23
+ /**
24
+ * Hear the wheel over an element.
25
+ * @param ref - The element, as it was handed to its `ref`.
26
+ * @param handler - What to do with the wheel; free to be an inline arrow, since
27
+ * it is read at the moment the wheel turns rather than closed over when the
28
+ * listener is attached. It is the handler's own business to call
29
+ * `preventDefault` — the listener is registered so that the call is honoured,
30
+ * not so that it is made.
31
+ */
32
+ export function useWheelListener<T extends Element>(
33
+ ref: RefObject<T | null>,
34
+ handler: (event: WheelEvent) => void,
35
+ ): void {
36
+ const latest = useRef(handler);
37
+ useLayoutEffect(() => {
38
+ latest.current = handler;
39
+ });
40
+
41
+ useEffect(() => {
42
+ const element = ref.current;
43
+ if (element === null) return;
44
+ // Typed as the plain `Event` the element's own listener map hands it: an
45
+ // `Element` is not known to carry a wheel, so the narrowing is done here.
46
+ function onWheel(event: Event) {
47
+ if (event instanceof WheelEvent) latest.current(event);
48
+ }
49
+ element.addEventListener('wheel', onWheel, WHEEL_LISTENER);
50
+ return () => {
51
+ element.removeEventListener('wheel', onWheel);
52
+ };
53
+ }, [ref]);
54
+ }
55
+
56
+ /**
57
+ * Registered non-passively, which is the whole reason this hook exists. Nothing
58
+ * is passed back on removal: a listener is matched on its type, its function
59
+ * and its capture flag alone, and passing the options object there is a type
60
+ * error rather than a courtesy.
61
+ */
62
+ const WHEEL_LISTENER = { passive: false } as const;
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Put a PNG on the clipboard.
3
+ *
4
+ * The image is handed over as a promise rather than as a blob on purpose:
5
+ * Safari only allows a clipboard write that the click itself started, so the
6
+ * item has to be built while the handler is still running and the
7
+ * rasterization awaited by the clipboard rather than before it.
8
+ * @param png - The image being rasterized.
9
+ * @returns Whether it was copied. `false` outside a secure context, and in a
10
+ * browser whose clipboard takes text only.
11
+ */
12
+ export async function writeImageToClipboard(
13
+ png: Promise<Blob>,
14
+ ): Promise<boolean> {
15
+ if (typeof ClipboardItem === 'undefined' || !navigator.clipboard?.write) {
16
+ return false;
17
+ }
18
+ await navigator.clipboard.write([new ClipboardItem({ 'image/png': png })]);
19
+ return true;
20
+ }
@@ -1,3 +1,4 @@
1
+ export { writeImageToClipboard } from './copyPng.ts';
1
2
  export type { WriteBlobToClipboardOptions } from './writeBlobToClipboard.ts';
2
3
  export { writeBlobToClipboard } from './writeBlobToClipboard.ts';
3
4
  export type { ClipboardContent, ClipboardText } from './writeToClipboard.ts';
package/src/core.ts CHANGED
@@ -14,6 +14,7 @@ export * from './i18n/core/index.ts';
14
14
  export * from './language/core/index.ts';
15
15
  export * from './orbital/core/index.ts';
16
16
  export * from './overlay/core/index.ts';
17
+ export * from './panel/core/index.ts';
17
18
  export * from './parallel/core/index.ts';
18
19
  export * from './pedagogy/core/index.ts';
19
20
  export * from './periodic/core/index.ts';
@@ -0,0 +1,20 @@
1
+ /**
2
+ * A row of buttons with the name box among them, wrapping when the dialog is
3
+ * too narrow for them.
4
+ */
5
+ export const exportButtonsStyle = {
6
+ display: 'flex',
7
+ flexWrap: 'wrap',
8
+ alignItems: 'center',
9
+ gap: 6,
10
+ } as const;
11
+
12
+ /** One group of an export dialog: what it offers, in a column. */
13
+ export const exportSectionStyle = {
14
+ display: 'flex',
15
+ flexDirection: 'column',
16
+ gap: 8,
17
+ } as const;
18
+
19
+ /** Text that says something about a control rather than being one. */
20
+ export const exportNoteStyle = { fontSize: 12, opacity: 0.7 } as const;
@@ -0,0 +1,118 @@
1
+ /** How big a picture is written out, as a multiple of the size it is drawn at. */
2
+ export interface ImageResolution {
3
+ /** Identifies the resolution in a picker. */
4
+ id: string;
5
+ /** What the option reads. */
6
+ label: string;
7
+ /** How many pixels each drawing unit becomes. */
8
+ scale: number;
9
+ }
10
+
11
+ /**
12
+ * The sizes a picture leaves the editor at.
13
+ *
14
+ * A drawing unit is about a screen pixel, so the multipliers read as what the
15
+ * picture is for rather than as numbers: what is on screen, the same again on a
16
+ * retina display, and the two steps up a figure needs to survive being printed
17
+ * or thrown on a wall.
18
+ */
19
+ export const IMAGE_RESOLUTIONS = [
20
+ { id: 'screen', label: 'Screen (1×)', scale: 1 },
21
+ { id: 'retina', label: 'Retina (2×)', scale: 2 },
22
+ { id: 'print', label: 'Print (4×)', scale: 4 },
23
+ { id: 'poster', label: 'Poster (8×)', scale: 8 },
24
+ ] as const satisfies readonly ImageResolution[];
25
+
26
+ /** One of the resolutions offered. */
27
+ export type ImageResolutionId = (typeof IMAGE_RESOLUTIONS)[number]['id'];
28
+
29
+ /**
30
+ * The resolution a picture is written out at unless another is picked: what is
31
+ * on screen, doubled, which is what a picture pasted into a document wants.
32
+ */
33
+ export const DEFAULT_IMAGE_RESOLUTION = IMAGE_RESOLUTIONS[1];
34
+
35
+ /**
36
+ * Longest side a browser rasterizes reliably.
37
+ *
38
+ * Above roughly this, Safari and Chrome quietly hand back an empty canvas
39
+ * instead of refusing, so the picture would be saved blank.
40
+ */
41
+ const MAXIMUM_SIDE = 8192;
42
+
43
+ /** Most pixels a rasterized picture is allowed to hold. */
44
+ const MAXIMUM_PIXELS = 32 * 1024 * 1024;
45
+
46
+ /** How big a picture comes out, in pixels. */
47
+ export interface ImageSize {
48
+ /** Width of the picture, in pixels. */
49
+ width: number;
50
+ /** Height of the picture, in pixels. */
51
+ height: number;
52
+ /**
53
+ * What each drawing unit was actually worth. Below the resolution that was
54
+ * asked for when it would have made a picture too big to rasterize.
55
+ */
56
+ scale: number;
57
+ }
58
+
59
+ /**
60
+ * How big a rectangle of the drawing comes out at a given resolution.
61
+ *
62
+ * The resolution is a wish rather than an instruction: a wide glycan asked for
63
+ * at 8× would run past what a browser can rasterize and come back blank, so the
64
+ * scale is brought down until the picture fits instead. The scale it settled on
65
+ * comes back with the size, so what will actually be written can be shown
66
+ * before it is.
67
+ * @param box - The rectangle being written out.
68
+ * @param box.width - How wide it is, in drawing units.
69
+ * @param box.height - How tall it is, in drawing units.
70
+ * @param scale - How many pixels each drawing unit should become.
71
+ * @returns The size, and the scale it was reached at.
72
+ */
73
+ export function imageSize(
74
+ box: { width: number; height: number },
75
+ scale: number,
76
+ ): ImageSize {
77
+ const wanted = Number.isFinite(scale) && scale > 0 ? scale : 1;
78
+ const width = Math.max(box.width, 1);
79
+ const height = Math.max(box.height, 1);
80
+
81
+ const limit = Math.min(
82
+ MAXIMUM_SIDE / width,
83
+ MAXIMUM_SIDE / height,
84
+ Math.sqrt(MAXIMUM_PIXELS / (width * height)),
85
+ );
86
+ const used = Math.min(wanted, limit);
87
+ // A picture held back by the limit is rounded down rather than to the nearest
88
+ // pixel, so rounding cannot put it back over what it was held to.
89
+ const toPixels = used < wanted ? Math.floor : Math.round;
90
+
91
+ return {
92
+ width: Math.max(1, toPixels(width * used)),
93
+ height: Math.max(1, toPixels(height * used)),
94
+ scale: used,
95
+ };
96
+ }
97
+
98
+ /**
99
+ * The resolution an identifier stands for.
100
+ * @param id - What was picked.
101
+ * @returns The resolution, falling back to the default one.
102
+ */
103
+ export function imageResolution(id: string): ImageResolution {
104
+ return (
105
+ IMAGE_RESOLUTIONS.find((resolution) => resolution.id === id) ??
106
+ DEFAULT_IMAGE_RESOLUTION
107
+ );
108
+ }
109
+
110
+ /**
111
+ * A size, written the way it is shown next to the resolution it comes from.
112
+ * @param size - The size to write, `null` when nothing is drawn.
113
+ * @returns The text, e.g. `1440 × 620 px`.
114
+ */
115
+ export function formatImageSize(size: ImageSize | null): string {
116
+ if (!size) return 'nothing to export';
117
+ return `${size.width} × ${size.height} px`;
118
+ }
@@ -37,3 +37,37 @@ export {
37
37
  figureSize,
38
38
  } from './figureTarget.ts';
39
39
  export { sanitizeFileName } from './sanitizeFileName.ts';
40
+
41
+ export {
42
+ exportButtonsStyle,
43
+ exportNoteStyle,
44
+ exportSectionStyle,
45
+ } from './exportStyles.ts';
46
+ export type {
47
+ ImageResolution,
48
+ ImageResolutionId,
49
+ ImageSize,
50
+ } from './imageResolution.ts';
51
+ export {
52
+ DEFAULT_IMAGE_RESOLUTION,
53
+ IMAGE_RESOLUTIONS,
54
+ formatImageSize,
55
+ imageResolution,
56
+ imageSize,
57
+ } from './imageResolution.ts';
58
+ export type { PictureFrame, PictureOptions } from './pictureExport.ts';
59
+ export {
60
+ PICTURE_PADDING,
61
+ copyPicture,
62
+ pictureSize,
63
+ savePngPicture,
64
+ saveSvgPicture,
65
+ } from './pictureExport.ts';
66
+ export { drawingIn, stackDrawings } from './stackedDrawing.ts';
67
+ export type { SvgBox } from './svgBounds.ts';
68
+ export { CONTENT_ATTRIBUTE, contentBox, elementBox } from './svgBounds.ts';
69
+ export { SVG_NAMESPACE } from './svgNamespace.ts';
70
+ export type { PngOptions } from './svgToPng.ts';
71
+ export { svgToPng } from './svgToPng.ts';
72
+ export type { SvgDocumentOptions } from './svgToString.ts';
73
+ export { svgToString } from './svgToString.ts';