react-cheminfo 0.70.0 → 0.72.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 (218) hide show
  1. package/README.md +57 -2
  2. package/lib/about/core/providers.d.ts +6 -0
  3. package/lib/about/core/providers.d.ts.map +1 -1
  4. package/lib/about/core/providers.js +7 -0
  5. package/lib/about/core/providers.js.map +1 -1
  6. package/lib/about/ui/AboutProvidedBy.js +34 -0
  7. package/lib/about/ui/AboutProvidedBy.js.map +1 -1
  8. package/lib/credits/core/credits.d.ts +6 -0
  9. package/lib/credits/core/credits.d.ts.map +1 -1
  10. package/lib/credits/core/credits.js +8 -0
  11. package/lib/credits/core/credits.js.map +1 -1
  12. package/lib/download/core/figurePng.d.ts +14 -0
  13. package/lib/download/core/figurePng.d.ts.map +1 -1
  14. package/lib/download/core/figurePng.js +21 -6
  15. package/lib/download/core/figurePng.js.map +1 -1
  16. package/lib/download/core/svgToPng.d.ts.map +1 -1
  17. package/lib/download/core/svgToPng.js +4 -2
  18. package/lib/download/core/svgToPng.js.map +1 -1
  19. package/lib/format/core/relativeTime.d.ts +8 -3
  20. package/lib/format/core/relativeTime.d.ts.map +1 -1
  21. package/lib/format/core/relativeTime.js +19 -7
  22. package/lib/format/core/relativeTime.js.map +1 -1
  23. package/lib/host/core/connectHost.d.ts +25 -34
  24. package/lib/host/core/connectHost.d.ts.map +1 -1
  25. package/lib/host/core/connectHost.js +43 -89
  26. package/lib/host/core/connectHost.js.map +1 -1
  27. package/lib/host/core/hostOutputs.d.ts +58 -0
  28. package/lib/host/core/hostOutputs.d.ts.map +1 -0
  29. package/lib/host/core/hostOutputs.js +151 -0
  30. package/lib/host/core/hostOutputs.js.map +1 -0
  31. package/lib/host/core/index.d.ts +9 -3
  32. package/lib/host/core/index.d.ts.map +1 -1
  33. package/lib/host/core/index.js +4 -1
  34. package/lib/host/core/index.js.map +1 -1
  35. package/lib/host/core/irKinds.d.ts +124 -0
  36. package/lib/host/core/irKinds.d.ts.map +1 -0
  37. package/lib/host/core/irKinds.js +46 -0
  38. package/lib/host/core/irKinds.js.map +1 -0
  39. package/lib/host/core/kinds.d.ts +13 -5
  40. package/lib/host/core/kinds.d.ts.map +1 -1
  41. package/lib/host/core/kinds.js +11 -5
  42. package/lib/host/core/kinds.js.map +1 -1
  43. package/lib/host/core/protocol.d.ts +50 -7
  44. package/lib/host/core/protocol.d.ts.map +1 -1
  45. package/lib/host/core/protocol.js +10 -6
  46. package/lib/host/core/protocol.js.map +1 -1
  47. package/lib/host/core/selectInputs.d.ts +37 -0
  48. package/lib/host/core/selectInputs.d.ts.map +1 -0
  49. package/lib/host/core/selectInputs.js +110 -0
  50. package/lib/host/core/selectInputs.js.map +1 -0
  51. package/lib/host/testing/sciPeaks.d.ts +31 -0
  52. package/lib/host/testing/sciPeaks.d.ts.map +1 -1
  53. package/lib/host/testing/sciPeaks.js +73 -0
  54. package/lib/host/testing/sciPeaks.js.map +1 -1
  55. package/lib/host/testing/standInHost.d.ts +9 -1
  56. package/lib/host/testing/standInHost.d.ts.map +1 -1
  57. package/lib/host/testing/standInHost.js +19 -1
  58. package/lib/host/testing/standInHost.js.map +1 -1
  59. package/lib/host/ui/useHostConnection.d.ts +13 -5
  60. package/lib/host/ui/useHostConnection.d.ts.map +1 -1
  61. package/lib/host/ui/useHostConnection.js +4 -3
  62. package/lib/host/ui/useHostConnection.js.map +1 -1
  63. package/lib/host-testing.d.ts +2 -2
  64. package/lib/host-testing.d.ts.map +1 -1
  65. package/lib/host-testing.js +2 -2
  66. package/lib/host-testing.js.map +1 -1
  67. package/lib/i18n/core/chromeCatalog.d.ts +1 -1
  68. package/lib/i18n/core/chromeCatalog.d.ts.map +1 -1
  69. package/lib/ir/core/handPicking.d.ts +58 -0
  70. package/lib/ir/core/handPicking.d.ts.map +1 -0
  71. package/lib/ir/core/handPicking.js +130 -0
  72. package/lib/ir/core/handPicking.js.map +1 -0
  73. package/lib/ir/core/index.d.ts +3 -0
  74. package/lib/ir/core/index.d.ts.map +1 -1
  75. package/lib/ir/core/index.js +3 -0
  76. package/lib/ir/core/index.js.map +1 -1
  77. package/lib/ir/core/irBandState.d.ts +57 -0
  78. package/lib/ir/core/irBandState.d.ts.map +1 -0
  79. package/lib/ir/core/irBandState.js +119 -0
  80. package/lib/ir/core/irBandState.js.map +1 -0
  81. package/lib/ir/core/irCommands.d.ts +11 -0
  82. package/lib/ir/core/irCommands.d.ts.map +1 -1
  83. package/lib/ir/core/irCommands.js +6 -0
  84. package/lib/ir/core/irCommands.js.map +1 -1
  85. package/lib/ir/core/irPeaks.d.ts +28 -0
  86. package/lib/ir/core/irPeaks.d.ts.map +1 -0
  87. package/lib/ir/core/irPeaks.js +66 -0
  88. package/lib/ir/core/irPeaks.js.map +1 -0
  89. package/lib/ir/core/irReducer.d.ts +8 -0
  90. package/lib/ir/core/irReducer.d.ts.map +1 -1
  91. package/lib/ir/core/irReducer.js +15 -32
  92. package/lib/ir/core/irReducer.js.map +1 -1
  93. package/lib/ir/core/irSpectrum.d.ts +15 -0
  94. package/lib/ir/core/irSpectrum.d.ts.map +1 -1
  95. package/lib/ir/core/irSpectrum.js.map +1 -1
  96. package/lib/ir/core/irState.d.ts +9 -6
  97. package/lib/ir/core/irState.d.ts.map +1 -1
  98. package/lib/ir/core/irState.js +10 -6
  99. package/lib/ir/core/irState.js.map +1 -1
  100. package/lib/ir/core/pickBands.d.ts +14 -0
  101. package/lib/ir/core/pickBands.d.ts.map +1 -1
  102. package/lib/ir/core/pickBands.js +39 -33
  103. package/lib/ir/core/pickBands.js.map +1 -1
  104. package/lib/ir/core/ramanBands.d.ts +9 -1
  105. package/lib/ir/core/ramanBands.d.ts.map +1 -1
  106. package/lib/ir/core/ramanBands.js +2 -2
  107. package/lib/ir/core/ramanBands.js.map +1 -1
  108. package/lib/ir/core/spectrumBands.d.ts +46 -0
  109. package/lib/ir/core/spectrumBands.d.ts.map +1 -0
  110. package/lib/ir/core/spectrumBands.js +98 -0
  111. package/lib/ir/core/spectrumBands.js.map +1 -0
  112. package/lib/ir/ui/BandRow.d.ts +5 -0
  113. package/lib/ir/ui/BandRow.d.ts.map +1 -1
  114. package/lib/ir/ui/BandRow.js +4 -3
  115. package/lib/ir/ui/BandRow.js.map +1 -1
  116. package/lib/ir/ui/BandsPanel.d.ts +5 -0
  117. package/lib/ir/ui/BandsPanel.d.ts.map +1 -1
  118. package/lib/ir/ui/BandsPanel.js +36 -16
  119. package/lib/ir/ui/BandsPanel.js.map +1 -1
  120. package/lib/ir/ui/BandsToolbar.d.ts +9 -0
  121. package/lib/ir/ui/BandsToolbar.d.ts.map +1 -0
  122. package/lib/ir/ui/BandsToolbar.js +61 -0
  123. package/lib/ir/ui/BandsToolbar.js.map +1 -0
  124. package/lib/ir/ui/IrCanvas.d.ts +2 -1
  125. package/lib/ir/ui/IrCanvas.d.ts.map +1 -1
  126. package/lib/ir/ui/IrCanvas.js +19 -5
  127. package/lib/ir/ui/IrCanvas.js.map +1 -1
  128. package/lib/ir/ui/IrChart.d.ts.map +1 -1
  129. package/lib/ir/ui/IrChart.js +8 -1
  130. package/lib/ir/ui/IrChart.js.map +1 -1
  131. package/lib/ir/ui/IrDocumentationDialog.js +1 -1
  132. package/lib/ir/ui/IrDocumentationDialog.js.map +1 -1
  133. package/lib/ir/ui/IrEditor.d.ts +4 -2
  134. package/lib/ir/ui/IrEditor.d.ts.map +1 -1
  135. package/lib/ir/ui/IrEditor.js.map +1 -1
  136. package/lib/ir/ui/IrShell.d.ts.map +1 -1
  137. package/lib/ir/ui/IrShell.js +6 -0
  138. package/lib/ir/ui/IrShell.js.map +1 -1
  139. package/lib/ir/ui/IrStatusBar.d.ts.map +1 -1
  140. package/lib/ir/ui/IrStatusBar.js +1 -1
  141. package/lib/ir/ui/IrStatusBar.js.map +1 -1
  142. package/lib/ir/ui/IrToolbar.d.ts +4 -3
  143. package/lib/ir/ui/IrToolbar.d.ts.map +1 -1
  144. package/lib/ir/ui/IrToolbar.js +5 -4
  145. package/lib/ir/ui/IrToolbar.js.map +1 -1
  146. package/lib/ir/ui/VibrationalEditor.d.ts +2 -1
  147. package/lib/ir/ui/VibrationalEditor.d.ts.map +1 -1
  148. package/lib/ir/ui/VibrationalEditor.js.map +1 -1
  149. package/lib/ir/ui/irActions.d.ts +5 -0
  150. package/lib/ir/ui/irActions.d.ts.map +1 -1
  151. package/lib/ir/ui/irActions.js +6 -0
  152. package/lib/ir/ui/irActions.js.map +1 -1
  153. package/lib/ir/ui/irChartProps.d.ts +4 -1
  154. package/lib/ir/ui/irChartProps.d.ts.map +1 -1
  155. package/lib/ir/ui/useIrEditor.d.ts +5 -11
  156. package/lib/ir/ui/useIrEditor.d.ts.map +1 -1
  157. package/lib/ir/ui/useIrEditor.js +17 -18
  158. package/lib/ir/ui/useIrEditor.js.map +1 -1
  159. package/lib/locales/de.json +63 -0
  160. package/lib/locales/en.json +63 -0
  161. package/lib/locales/es.json +63 -0
  162. package/lib/locales/fr.json +63 -0
  163. package/lib/locales/it.json +63 -0
  164. package/lib/slides/ui/slideSanitizeSchema.d.ts +3 -2
  165. package/lib/slides/ui/slideSanitizeSchema.d.ts.map +1 -1
  166. package/lib/slides/ui/slideSanitizeSchema.js +82 -2
  167. package/lib/slides/ui/slideSanitizeSchema.js.map +1 -1
  168. package/package.json +1 -1
  169. package/src/about/core/providers.ts +7 -0
  170. package/src/about/ui/AboutProvidedBy.tsx +49 -0
  171. package/src/credits/core/credits.ts +9 -0
  172. package/src/download/core/figurePng.ts +21 -8
  173. package/src/download/core/svgToPng.ts +3 -4
  174. package/src/format/core/relativeTime.ts +29 -7
  175. package/src/host/core/connectHost.ts +77 -120
  176. package/src/host/core/hostOutputs.ts +197 -0
  177. package/src/host/core/index.ts +13 -7
  178. package/src/host/core/irKinds.ts +92 -0
  179. package/src/host/core/kinds.ts +16 -6
  180. package/src/host/core/protocol.ts +50 -8
  181. package/src/host/core/selectInputs.ts +145 -0
  182. package/src/host/testing/sciPeaks.ts +140 -0
  183. package/src/host/testing/standInHost.ts +30 -5
  184. package/src/host/ui/useHostConnection.ts +17 -8
  185. package/src/host-testing.ts +4 -0
  186. package/src/ir/core/handPicking.ts +154 -0
  187. package/src/ir/core/index.ts +14 -0
  188. package/src/ir/core/irBandState.ts +155 -0
  189. package/src/ir/core/irCommands.ts +7 -0
  190. package/src/ir/core/irPeaks.ts +79 -0
  191. package/src/ir/core/irReducer.ts +27 -34
  192. package/src/ir/core/irSpectrum.ts +16 -0
  193. package/src/ir/core/irState.ts +15 -8
  194. package/src/ir/core/pickBands.ts +46 -39
  195. package/src/ir/core/ramanBands.ts +2 -2
  196. package/src/ir/core/spectrumBands.ts +113 -0
  197. package/src/ir/ui/BandRow.tsx +20 -2
  198. package/src/ir/ui/BandsPanel.tsx +46 -88
  199. package/src/ir/ui/BandsToolbar.tsx +152 -0
  200. package/src/ir/ui/IrCanvas.tsx +22 -11
  201. package/src/ir/ui/IrChart.tsx +10 -1
  202. package/src/ir/ui/IrDocumentationDialog.tsx +7 -0
  203. package/src/ir/ui/IrEditor.tsx +4 -2
  204. package/src/ir/ui/IrShell.tsx +5 -0
  205. package/src/ir/ui/IrStatusBar.tsx +4 -1
  206. package/src/ir/ui/IrToolbar.tsx +14 -5
  207. package/src/ir/ui/VibrationalEditor.tsx +2 -1
  208. package/src/ir/ui/irActions.ts +11 -0
  209. package/src/ir/ui/irChartProps.ts +4 -1
  210. package/src/ir/ui/useIrEditor.ts +21 -21
  211. package/src/locales/de.json +63 -0
  212. package/src/locales/en.json +63 -0
  213. package/src/locales/es.json +63 -0
  214. package/src/locales/fr.json +63 -0
  215. package/src/locales/it.json +63 -0
  216. package/src/slides/ui/slideSanitizeSchema.ts +86 -2
  217. package/styles/chrome.css +7 -0
  218. package/styles/slides.css +47 -0
@@ -14,6 +14,12 @@ import { autoPeakPicking } from 'ir-spectrum';
14
14
  import { xMaxValue, xMinValue } from 'ml-spectra-processing';
15
15
  import { bandHeight } from "./irBand.js";
16
16
  import { ramanBands } from "./ramanBands.js";
17
+ /**
18
+ * How many points the picker smooths over before it looks for a band. `ml-gsd`
19
+ * refuses a trace shorter than that — a few points typed in by hand — rather
20
+ * than finding no band in it.
21
+ */
22
+ const SMOOTHING_WINDOW = 9;
17
23
  /**
18
24
  * Pick the bands of one spectrum.
19
25
  *
@@ -35,7 +41,7 @@ import { ramanBands } from "./ramanBands.js";
35
41
  */
36
42
  export function pickBands(spectrum, options = {}) {
37
43
  const { from, to, minRelativeHeight = 0.02, minPeakWidth = 4, limit, } = options;
38
- if (spectrum.wavenumber.length < 2)
44
+ if (spectrum.wavenumber.length < SMOOTHING_WINDOW)
39
45
  return [];
40
46
  const picking = {
41
47
  minMaxRatio: minRelativeHeight,
@@ -52,37 +58,6 @@ export function pickBands(spectrum, options = {}) {
52
58
  : bands.toSorted(byDescendingHeight).slice(0, limit);
53
59
  return kept.toSorted(byAscendingWavenumber);
54
60
  }
55
- /**
56
- * The bands of an infrared spectrum, picked on its absorbance.
57
- * @param spectrum - The spectrum to pick from.
58
- * @param picking - Where to pick, and how finely.
59
- * @returns The bands, in the order they were found; none when the spectrum
60
- * carries only one of its two axes, since the strength is read off the other.
61
- */
62
- function infraredBands(spectrum, picking) {
63
- const { id, wavenumber, absorbance, transmittance } = spectrum;
64
- if (absorbance === undefined || transmittance === undefined)
65
- return [];
66
- const picked = autoPeakPicking(measurementOf(wavenumber, absorbance, transmittance),
67
- // Absorbance, because a band is a maximum there and a minimum in the other.
68
- { yVariable: 'a', ...picking });
69
- const bands = [];
70
- for (const peak of picked) {
71
- if (!Number.isFinite(peak.wavenumber))
72
- continue;
73
- bands.push({
74
- spectrumId: id,
75
- wavenumber: peak.wavenumber,
76
- absorbance: peak.absorbance,
77
- // `ConvertedPeak.transmittance` is a fraction where the spectrum's own
78
- // transmittance is a percentage; brought onto the one scale here so that
79
- // nothing downstream has to remember which of the two it is holding.
80
- transmittance: peak.transmittance * 100,
81
- strength: peak.kind,
82
- });
83
- }
84
- return bands;
85
- }
86
61
  /**
87
62
  * The spectrum as `ir-spectrum` wants it.
88
63
  *
@@ -95,7 +70,7 @@ function infraredBands(spectrum, picking) {
95
70
  * @param transmittance - Percent transmittance at each.
96
71
  * @returns A measurement carrying all three variables.
97
72
  */
98
- function measurementOf(wavenumber, absorbance, transmittance) {
73
+ export function infraredMeasurement(wavenumber, absorbance, transmittance) {
99
74
  const percent = {
100
75
  label: 'Transmittance (%)',
101
76
  units: '%',
@@ -127,6 +102,37 @@ function measurementOf(wavenumber, absorbance, transmittance) {
127
102
  },
128
103
  };
129
104
  }
105
+ /**
106
+ * The bands of an infrared spectrum, picked on its absorbance.
107
+ * @param spectrum - The spectrum to pick from.
108
+ * @param picking - Where to pick, and how finely.
109
+ * @returns The bands, in the order they were found; none when the spectrum
110
+ * carries only one of its two axes, since the strength is read off the other.
111
+ */
112
+ function infraredBands(spectrum, picking) {
113
+ const { id, wavenumber, absorbance, transmittance } = spectrum;
114
+ if (absorbance === undefined || transmittance === undefined)
115
+ return [];
116
+ const picked = autoPeakPicking(infraredMeasurement(wavenumber, absorbance, transmittance),
117
+ // Absorbance, because a band is a maximum there and a minimum in the other.
118
+ { yVariable: 'a', ...picking });
119
+ const bands = [];
120
+ for (const peak of picked) {
121
+ if (!Number.isFinite(peak.wavenumber))
122
+ continue;
123
+ bands.push({
124
+ spectrumId: id,
125
+ wavenumber: peak.wavenumber,
126
+ absorbance: peak.absorbance,
127
+ // `ConvertedPeak.transmittance` is a fraction where the spectrum's own
128
+ // transmittance is a percentage; brought onto the one scale here so that
129
+ // nothing downstream has to remember which of the two it is holding.
130
+ transmittance: peak.transmittance * 100,
131
+ strength: peak.kind,
132
+ });
133
+ }
134
+ return bands;
135
+ }
130
136
  /**
131
137
  * Order two bands by height, tallest first.
132
138
  * @param first - One band.
@@ -1 +1 @@
1
- {"version":3,"file":"pickBands.js","sourceRoot":"","sources":["../../../src/ir/core/pickBands.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pickBands.js","sourceRoot":"","sources":["../../../src/ir/core/pickBands.ts"],"names":[],"mappings":"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"}
@@ -15,7 +15,7 @@
15
15
  * strong above.
16
16
  */
17
17
  import { autoPeakPicking } from 'ir-spectrum';
18
- import type { IrBand } from './irBand.ts';
18
+ import type { IrBand, IrBandStrength } from './irBand.ts';
19
19
  import type { IrSpectrum } from './irSpectrum.ts';
20
20
  /** What the picker is asked, whichever technique it picks for. */
21
21
  export type PeakPickingOptions = NonNullable<Parameters<typeof autoPeakPicking>[1]>;
@@ -27,4 +27,12 @@ export type PeakPickingOptions = NonNullable<Parameters<typeof autoPeakPicking>[
27
27
  * @returns The bands, in the order they were found.
28
28
  */
29
29
  export declare function ramanBands(spectrum: IrSpectrum, intensity: Float64Array, picking: PeakPickingOptions): IrBand[];
30
+ /**
31
+ * How strong a band is, from where its top sits in the spectrum's range.
32
+ * @param value - The band's intensity.
33
+ * @param lowest - The spectrum's lowest intensity.
34
+ * @param highest - Its highest.
35
+ * @returns The letter a correlation table would use.
36
+ */
37
+ export declare function intensityStrength(value: number, lowest: number, highest: number): IrBandStrength;
30
38
  //# sourceMappingURL=ramanBands.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ramanBands.d.ts","sourceRoot":"","sources":["../../../src/ir/core/ramanBands.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAG9C,OAAO,KAAK,EAAE,MAAM,EAAkB,MAAM,aAAa,CAAC;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD,kEAAkE;AAClE,MAAM,MAAM,kBAAkB,GAAG,WAAW,CAC1C,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC,CAAC,CAAC,CACtC,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,UAAU,CACxB,QAAQ,EAAE,UAAU,EACpB,SAAS,EAAE,YAAY,EACvB,OAAO,EAAE,kBAAkB,GAC1B,MAAM,EAAE,CAsBV"}
1
+ {"version":3,"file":"ramanBands.d.ts","sourceRoot":"","sources":["../../../src/ir/core/ramanBands.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAG9C,OAAO,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD,kEAAkE;AAClE,MAAM,MAAM,kBAAkB,GAAG,WAAW,CAC1C,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC,CAAC,CAAC,CACtC,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,UAAU,CACxB,QAAQ,EAAE,UAAU,EACpB,SAAS,EAAE,YAAY,EACvB,OAAO,EAAE,kBAAkB,GAC1B,MAAM,EAAE,CAsBV;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,GACd,cAAc,CAKhB"}
@@ -42,7 +42,7 @@ export function ramanBands(spectrum, intensity, picking) {
42
42
  spectrumId: id,
43
43
  wavenumber: peak.wavenumber,
44
44
  intensity: value,
45
- strength: strengthOf(value, min, max),
45
+ strength: intensityStrength(value, min, max),
46
46
  });
47
47
  }
48
48
  return bands;
@@ -54,7 +54,7 @@ export function ramanBands(spectrum, intensity, picking) {
54
54
  * @param highest - Its highest.
55
55
  * @returns The letter a correlation table would use.
56
56
  */
57
- function strengthOf(value, lowest, highest) {
57
+ export function intensityStrength(value, lowest, highest) {
58
58
  const position = (value - lowest) / (highest - lowest);
59
59
  if (position < WEAK_BELOW)
60
60
  return 'w';
@@ -1 +1 @@
1
- {"version":3,"file":"ramanBands.js","sourceRoot":"","sources":["../../../src/ir/core/ramanBands.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAUzE;;;;;;GAMG;AACH,MAAM,UAAU,UAAU,CACxB,QAAoB,EACpB,SAAuB,EACvB,OAA2B;IAE3B,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,QAAQ,CAAC;IACpC,MAAM,MAAM,GAAG,eAAe,CAAC,aAAa,CAAC,UAAU,EAAE,SAAS,CAAC,EAAE;QACnE,GAAG,OAAO;QACV,SAAS,EAAE,GAAG;KACf,CAAC,CAAC;IACH,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;IAE9C,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;QAC1B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC;YAAE,SAAS;QAChD,uEAAuE;QACvE,MAAM,KAAK,GAAG,SAAS,CAAC,iBAAiB,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QACxE,IAAI,KAAK,KAAK,SAAS;YAAE,SAAS;QAClC,KAAK,CAAC,IAAI,CAAC;YACT,UAAU,EAAE,EAAE;YACd,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,SAAS,EAAE,KAAK;YAChB,QAAQ,EAAE,UAAU,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC;SACtC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;GAMG;AACH,SAAS,UAAU,CACjB,KAAa,EACb,MAAc,EACd,OAAe;IAEf,MAAM,QAAQ,GAAG,CAAC,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,GAAG,MAAM,CAAC,CAAC;IACvD,IAAI,QAAQ,GAAG,UAAU;QAAE,OAAO,GAAG,CAAC;IACtC,IAAI,QAAQ,GAAG,YAAY;QAAE,OAAO,GAAG,CAAC;IACxC,OAAO,GAAG,CAAC;AACb,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,GAAG,IAAI,CAAC;AAExB,4DAA4D;AAC5D,MAAM,YAAY,GAAG,IAAI,CAAC;AAE1B;;;;;GAKG;AACH,SAAS,aAAa,CACpB,KAAmB,EACnB,SAAuB;IAEvB,OAAO;QACL,SAAS,EAAE;YACT,CAAC,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE;YACpE,CAAC,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE;SACnE;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"ramanBands.js","sourceRoot":"","sources":["../../../src/ir/core/ramanBands.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAUzE;;;;;;GAMG;AACH,MAAM,UAAU,UAAU,CACxB,QAAoB,EACpB,SAAuB,EACvB,OAA2B;IAE3B,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,QAAQ,CAAC;IACpC,MAAM,MAAM,GAAG,eAAe,CAAC,aAAa,CAAC,UAAU,EAAE,SAAS,CAAC,EAAE;QACnE,GAAG,OAAO;QACV,SAAS,EAAE,GAAG;KACf,CAAC,CAAC;IACH,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;IAE9C,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;QAC1B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC;YAAE,SAAS;QAChD,uEAAuE;QACvE,MAAM,KAAK,GAAG,SAAS,CAAC,iBAAiB,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QACxE,IAAI,KAAK,KAAK,SAAS;YAAE,SAAS;QAClC,KAAK,CAAC,IAAI,CAAC;YACT,UAAU,EAAE,EAAE;YACd,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,SAAS,EAAE,KAAK;YAChB,QAAQ,EAAE,iBAAiB,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC;SAC7C,CAAC,CAAC;IACL,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAC/B,KAAa,EACb,MAAc,EACd,OAAe;IAEf,MAAM,QAAQ,GAAG,CAAC,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,GAAG,MAAM,CAAC,CAAC;IACvD,IAAI,QAAQ,GAAG,UAAU;QAAE,OAAO,GAAG,CAAC;IACtC,IAAI,QAAQ,GAAG,YAAY;QAAE,OAAO,GAAG,CAAC;IACxC,OAAO,GAAG,CAAC;AACb,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,GAAG,IAAI,CAAC;AAExB,4DAA4D;AAC5D,MAAM,YAAY,GAAG,IAAI,CAAC;AAE1B;;;;;GAKG;AACH,SAAS,aAAa,CACpB,KAAmB,EACnB,SAAuB;IAEvB,OAAO;QACL,SAAS,EAAE;YACT,CAAC,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE;YACpE,CAAC,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE;SACnE;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * The bands a spectrum carries.
3
+ *
4
+ * A spectrum arriving without bands is picked once, with the picking settings
5
+ * in force, and from then on its bands are part of it: they travel to a host
6
+ * with it, and a host's own reach the chart. Bands found automatically follow
7
+ * the settings — moving the threshold picks them again — while bands picked by
8
+ * hand, or handed over, are left as they are.
9
+ */
10
+ import type { IrBand } from './irBand.ts';
11
+ import type { IrSpectrum } from './irSpectrum.ts';
12
+ import type { PickBandsOptions } from './pickBands.ts';
13
+ /**
14
+ * A spectrum carrying its bands: picked now when it has none, its own kept and
15
+ * put in order otherwise.
16
+ * @param spectrum - The spectrum, as it arrived.
17
+ * @param picking - How to pick it, if it has to be.
18
+ * @returns The spectrum with its bands; the same object when it had them, in
19
+ * order.
20
+ */
21
+ export declare function withBands(spectrum: IrSpectrum, picking: PickBandsOptions): IrSpectrum;
22
+ /**
23
+ * A spectrum's bands picked again with other settings, unless they were picked
24
+ * by hand.
25
+ * @param spectrum - The spectrum.
26
+ * @param picking - The settings now in force.
27
+ * @returns The spectrum re-picked, or the same object when its bands are its
28
+ * own.
29
+ */
30
+ export declare function repickBands(spectrum: IrSpectrum, picking: PickBandsOptions): IrSpectrum;
31
+ /**
32
+ * Bands as a spectrum holds them: ascending, one per wavenumber, each naming
33
+ * the spectrum, and none at a wavenumber that is not a number.
34
+ * @param spectrumId - The spectrum they belong to.
35
+ * @param bands - The bands, in any order.
36
+ * @returns The bands in order; the same array when they already were.
37
+ */
38
+ export declare function orderedBands(spectrumId: string, bands: IrBand[]): IrBand[];
39
+ /**
40
+ * Whether two picking settings pick the same bands.
41
+ * @param first - One.
42
+ * @param second - The other.
43
+ * @returns Whether every option agrees.
44
+ */
45
+ export declare function samePicking(first: PickBandsOptions, second: PickBandsOptions): boolean;
46
+ //# sourceMappingURL=spectrumBands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spectrumBands.d.ts","sourceRoot":"","sources":["../../../src/ir/core/spectrumBands.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAGvD;;;;;;;GAOG;AACH,wBAAgB,SAAS,CACvB,QAAQ,EAAE,UAAU,EACpB,OAAO,EAAE,gBAAgB,GACxB,UAAU,CAWZ;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CACzB,QAAQ,EAAE,UAAU,EACpB,OAAO,EAAE,gBAAgB,GACxB,UAAU,CAOZ;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAS1E;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,gBAAgB,EACvB,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAST"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * The bands a spectrum carries.
3
+ *
4
+ * A spectrum arriving without bands is picked once, with the picking settings
5
+ * in force, and from then on its bands are part of it: they travel to a host
6
+ * with it, and a host's own reach the chart. Bands found automatically follow
7
+ * the settings — moving the threshold picks them again — while bands picked by
8
+ * hand, or handed over, are left as they are.
9
+ */
10
+ import { pickBands } from "./pickBands.js";
11
+ /**
12
+ * A spectrum carrying its bands: picked now when it has none, its own kept and
13
+ * put in order otherwise.
14
+ * @param spectrum - The spectrum, as it arrived.
15
+ * @param picking - How to pick it, if it has to be.
16
+ * @returns The spectrum with its bands; the same object when it had them, in
17
+ * order.
18
+ */
19
+ export function withBands(spectrum, picking) {
20
+ const { id, bands } = spectrum;
21
+ if (bands === undefined) {
22
+ return {
23
+ ...spectrum,
24
+ bands: pickBands(spectrum, picking),
25
+ bandsByHand: false,
26
+ };
27
+ }
28
+ const ordered = orderedBands(id, bands);
29
+ return ordered === bands ? spectrum : { ...spectrum, bands: ordered };
30
+ }
31
+ /**
32
+ * A spectrum's bands picked again with other settings, unless they were picked
33
+ * by hand.
34
+ * @param spectrum - The spectrum.
35
+ * @param picking - The settings now in force.
36
+ * @returns The spectrum re-picked, or the same object when its bands are its
37
+ * own.
38
+ */
39
+ export function repickBands(spectrum, picking) {
40
+ if (spectrum.bandsByHand)
41
+ return spectrum;
42
+ return {
43
+ ...spectrum,
44
+ bands: pickBands(spectrum, picking),
45
+ bandsByHand: false,
46
+ };
47
+ }
48
+ /**
49
+ * Bands as a spectrum holds them: ascending, one per wavenumber, each naming
50
+ * the spectrum, and none at a wavenumber that is not a number.
51
+ * @param spectrumId - The spectrum they belong to.
52
+ * @param bands - The bands, in any order.
53
+ * @returns The bands in order; the same array when they already were.
54
+ */
55
+ export function orderedBands(spectrumId, bands) {
56
+ if (isOrdered(spectrumId, bands))
57
+ return bands;
58
+ const kept = [];
59
+ for (const band of bands.toSorted(byWavenumber)) {
60
+ if (!Number.isFinite(band.wavenumber))
61
+ continue;
62
+ if (kept.at(-1)?.wavenumber === band.wavenumber)
63
+ continue;
64
+ kept.push(band.spectrumId === spectrumId ? band : { ...band, spectrumId });
65
+ }
66
+ return kept;
67
+ }
68
+ /**
69
+ * Whether two picking settings pick the same bands.
70
+ * @param first - One.
71
+ * @param second - The other.
72
+ * @returns Whether every option agrees.
73
+ */
74
+ export function samePicking(first, second) {
75
+ return (first === second ||
76
+ (first.from === second.from &&
77
+ first.to === second.to &&
78
+ first.minRelativeHeight === second.minRelativeHeight &&
79
+ first.minPeakWidth === second.minPeakWidth &&
80
+ first.limit === second.limit));
81
+ }
82
+ function isOrdered(spectrumId, bands) {
83
+ let previous = Number.NEGATIVE_INFINITY;
84
+ for (const band of bands) {
85
+ const { wavenumber } = band;
86
+ if (band.spectrumId !== spectrumId || !Number.isFinite(wavenumber)) {
87
+ return false;
88
+ }
89
+ if (wavenumber <= previous)
90
+ return false;
91
+ previous = wavenumber;
92
+ }
93
+ return true;
94
+ }
95
+ function byWavenumber(first, second) {
96
+ return first.wavenumber - second.wavenumber;
97
+ }
98
+ //# sourceMappingURL=spectrumBands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spectrumBands.js","sourceRoot":"","sources":["../../../src/ir/core/spectrumBands.ts"],"names":[],"mappings":"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"}
@@ -15,6 +15,11 @@ export interface BandRowProps {
15
15
  * @default undefined
16
16
  */
17
17
  onHighlight?: (band: IrBand | null) => void;
18
+ /**
19
+ * Takes the band away; the row ends with the button that calls it.
20
+ * @default undefined — no button
21
+ */
22
+ onRemove?: (band: IrBand) => void;
18
23
  }
19
24
  /**
20
25
  * One band: where it is, how strong, and every vibration it could be.
@@ -1 +1 @@
1
- {"version":3,"file":"BandRow.d.ts","sourceRoot":"","sources":["../../../src/ir/ui/BandRow.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAGhD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAEpD,MAAM,WAAW,YAAY;IAC3B,2CAA2C;IAC3C,KAAK,EAAE,YAAY,CAAC;IACpB,sCAAsC;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,+DAA+D;IAC/D,WAAW,EAAE,OAAO,CAAC;IACrB,iEAAiE;IACjE,GAAG,EAAE,OAAO,CAAC;IACb;;;OAGG;IACH,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;CAC7C;AAED;;;;;;;;;GASG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,YAAY,+BAoB1C"}
1
+ {"version":3,"file":"BandRow.d.ts","sourceRoot":"","sources":["../../../src/ir/ui/BandRow.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAGhD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAEpD,MAAM,WAAW,YAAY;IAC3B,2CAA2C;IAC3C,KAAK,EAAE,YAAY,CAAC;IACpB,sCAAsC;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,+DAA+D;IAC/D,WAAW,EAAE,OAAO,CAAC;IACrB,iEAAiE;IACjE,GAAG,EAAE,OAAO,CAAC;IACb;;;OAGG;IACH,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAC5C;;;OAGG;IACH,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC;AAED;;;;;;;;;GASG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,YAAY,+BA+B1C"}
@@ -1,5 +1,5 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { Icon } from '@blueprintjs/core';
2
+ import { Button, Icon } from '@blueprintjs/core';
3
3
  import { panelCellStyle, panelNumberCellStyle, } from "../../panel/core/panelStyles.js";
4
4
  import { bandValue } from "../core/irBand.js";
5
5
  import { formatIrValue, formatWavenumber } from "../core/irFormat.js";
@@ -14,9 +14,9 @@ import { formatIrValue, formatWavenumber } from "../core/irFormat.js";
14
14
  * @returns The row.
15
15
  */
16
16
  export function BandRow(props) {
17
- const { entry, mode, assignments, lit, onHighlight } = props;
17
+ const { entry, mode, assignments, lit, onHighlight, onRemove } = props;
18
18
  const { band } = entry;
19
- return (_jsxs("tr", { style: lit ? litRowStyle : undefined, onPointerEnter: () => onHighlight?.(band), onPointerLeave: () => onHighlight?.(null), children: [_jsx("td", { style: panelNumberCellStyle, children: formatWavenumber(band.wavenumber) }), _jsx("td", { style: panelCellStyle, title: STRENGTH_TITLES[band.strength], children: band.strength }), _jsx("td", { style: panelNumberCellStyle, children: formatIrValue(bandValue(band, mode) ?? Number.NaN, mode) }), assignments ? _jsx(CandidatesCell, { entry: entry }) : null] }));
19
+ return (_jsxs("tr", { style: lit ? litRowStyle : undefined, onPointerEnter: () => onHighlight?.(band), onPointerLeave: () => onHighlight?.(null), children: [_jsx("td", { style: panelNumberCellStyle, children: formatWavenumber(band.wavenumber) }), _jsx("td", { style: panelCellStyle, title: STRENGTH_TITLES[band.strength], children: band.strength }), _jsx("td", { style: panelNumberCellStyle, children: formatIrValue(bandValue(band, mode) ?? Number.NaN, mode) }), assignments ? _jsx(CandidatesCell, { entry: entry }) : null, onRemove === undefined ? null : (_jsx("td", { style: removeCellStyle, children: _jsx(Button, { variant: "minimal", size: "small", icon: "small-cross", "aria-label": `Take away the band at ${formatWavenumber(band.wavenumber)} cm⁻¹`, onClick: () => onRemove(band) }) }))] }));
20
20
  }
21
21
  /**
22
22
  * What a band could be: the narrowest candidate, and how many more there are.
@@ -39,4 +39,5 @@ const STRENGTH_TITLES = {
39
39
  S: 'strong, relative to this spectrum',
40
40
  };
41
41
  const litRowStyle = { background: '#fff3e0' };
42
+ const removeCellStyle = { ...panelCellStyle, padding: 0, width: 1 };
42
43
  //# sourceMappingURL=BandRow.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BandRow.js","sourceRoot":"","sources":["../../../src/ir/ui/BandRow.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"BandRow.js","sourceRoot":"","sources":["../../../src/ir/ui/BandRow.tsx"],"names":[],"mappings":"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"}
@@ -25,6 +25,11 @@ export interface BandsPanelProps {
25
25
  * row, which is the whole reason the highlight is threaded through the shell
26
26
  * rather than held here: the two views are of one thing.
27
27
  *
28
+ * The list is the spectrum's own and can be edited: a band is taken away from
29
+ * its row, added by a click on the chart while picking by hand, and the whole
30
+ * list found automatically again. Once edited it is the spectrum's as picked
31
+ * by hand, and the threshold no longer moves it.
32
+ *
28
33
  * For a technique the correlation table does not cover — Raman — the column of
29
34
  * candidates and the button naming them are left out, and the table is the
30
35
  * bands themselves.
@@ -1 +1 @@
1
- {"version":3,"file":"BandsPanel.d.ts","sourceRoot":"","sources":["../../../src/ir/ui/BandsPanel.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAShD,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B;;;OAGG;IACH,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;CAC7C;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,+BAqHhD"}
1
+ {"version":3,"file":"BandsPanel.d.ts","sourceRoot":"","sources":["../../../src/ir/ui/BandsPanel.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAUhD,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B;;;OAGG;IACH,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;CAC7C;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,+BAyDhD"}
@@ -1,12 +1,11 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useMemo } from 'react';
3
- import { Button, Toolbar } from 'react-science/ui';
4
- import { panelBodyStyle, panelEmptyStyle, panelHeaderCellStyle, panelStyle, panelTableStyle, panelToolbarStyle, } from "../../panel/core/panelStyles.js";
2
+ import { panelBodyStyle, panelEmptyStyle, panelHeaderCellStyle, panelStyle, panelTableStyle, } from "../../panel/core/panelStyles.js";
3
+ import { removeBand } from "../core/handPicking.js";
5
4
  import { sameIrBand } from "../core/irBand.js";
6
5
  import { shortModeLabel } from "../core/irFormat.js";
7
6
  import { IR_TECHNIQUE_RULES } from "../core/irTechnique.js";
8
7
  import { BandRow } from "./BandRow.js";
9
- import { bandsToTsv } from "./bandsTsv.js";
8
+ import { BandsToolbar } from "./BandsToolbar.js";
10
9
  import { useIrActions, useIrEditorState } from "./irStateContext.js";
11
10
  /**
12
11
  * Every band of the selected spectrum, and everything each one might be.
@@ -22,6 +21,11 @@ import { useIrActions, useIrEditorState } from "./irStateContext.js";
22
21
  * row, which is the whole reason the highlight is threaded through the shell
23
22
  * rather than held here: the two views are of one thing.
24
23
  *
24
+ * The list is the spectrum's own and can be edited: a band is taken away from
25
+ * its row, added by a click on the chart while picking by hand, and the whole
26
+ * list found automatically again. Once edited it is the spectrum's as picked
27
+ * by hand, and the threshold no longer moves it.
28
+ *
25
29
  * For a technique the correlation table does not cover — Raman — the column of
26
30
  * candidates and the button naming them are left out, and the table is the
27
31
  * bands themselves.
@@ -32,18 +36,34 @@ export function BandsPanel(props) {
32
36
  const { highlight = null, onHighlight } = props;
33
37
  const { state, selectedSpectrum, assigned } = useIrEditorState();
34
38
  const actions = useIrActions();
35
- const { mode, pickBands, showAssignments, picking, technique } = state.settings;
39
+ const { mode, pickBands, technique } = state.settings;
36
40
  const { assignments } = IR_TECHNIQUE_RULES[technique];
37
- const rows = useMemo(() => assigned, [assigned]);
38
- const tsv = useMemo(() => bandsToTsv(rows, mode, assignments), [rows, mode, assignments]);
39
- return (_jsxs("div", { style: panelStyle, children: [_jsxs("div", { style: panelToolbarStyle, children: [_jsxs(Toolbar, { "aria-label": "Band actions", children: [_jsx(Toolbar.Item, { icon: "locate", active: pickBands, tooltip: pickBands ? 'Stop picking bands' : 'Pick the bands', "aria-label": "Pick the bands", onClick: () => actions.setSettings({ pickBands: !pickBands }) }), assignments ? (_jsx(Toolbar.Item, { icon: "label", active: showAssignments, tooltip: "Name the assignments on the chart", "aria-label": "Name the assignments on the chart", disabled: !pickBands, onClick: () => actions.setSettings({ showAssignments: !showAssignments }) })) : null] }), _jsxs("label", { style: thresholdStyle, children: [_jsx("span", { style: { opacity: 0.7 }, children: "threshold" }), _jsx("input", { type: "range", min: 0.005, max: 0.3, step: 0.005, value: picking.minRelativeHeight ?? 0.02, disabled: !pickBands, "aria-label": "How tall a band must be to be picked", onChange: (event) => actions.setSettings({
40
- picking: { minRelativeHeight: event.target.valueAsNumber },
41
- }) })] }), _jsx("span", { style: { flex: 1 } }), _jsx(Button, { variant: "minimal", icon: "clipboard", disabled: rows.length === 0, tooltipProps: { content: 'Copy the table' }, "aria-label": "Copy the table", onClick: () => void navigator.clipboard?.writeText(tsv) })] }), _jsx("div", { style: panelBodyStyle, children: selectedSpectrum === null ? (_jsx("p", { style: panelEmptyStyle, children: "No spectrum is selected." })) : !pickBands ? (_jsx("p", { style: panelEmptyStyle, children: "The bands are not being picked. Press the locate button above to find them." })) : rows.length === 0 ? (_jsx("p", { style: panelEmptyStyle, children: "No band was found above the threshold. Lower it to pick the weaker ones." })) : (_jsxs("table", { style: panelTableStyle, children: [_jsx("thead", { children: _jsxs("tr", { children: [_jsx("th", { style: panelHeaderCellStyle, children: "cm\u207B\u00B9" }), _jsx("th", { style: panelHeaderCellStyle }), _jsx("th", { style: { ...panelHeaderCellStyle, textAlign: 'right' }, children: shortModeLabel(mode) }), assignments ? (_jsx("th", { style: panelHeaderCellStyle, children: "could be" })) : null] }) }), _jsx("tbody", { children: rows.map((entry) => (_jsx(BandRow, { entry: entry, mode: mode, assignments: assignments, lit: sameIrBand(entry.band, highlight), onHighlight: onHighlight }, `${entry.band.spectrumId} ${entry.band.wavenumber}`))) })] })) })] }));
41
+ const empty = emptyMessage(selectedSpectrum, pickBands, assigned.length);
42
+ function remove(band) {
43
+ if (selectedSpectrum === null)
44
+ return;
45
+ actions.setBands(selectedSpectrum.id, removeBand(selectedSpectrum.bands ?? [], band.wavenumber));
46
+ onHighlight?.(null);
47
+ }
48
+ return (_jsxs("div", { style: panelStyle, children: [_jsx(BandsToolbar, {}), _jsx("div", { style: panelBodyStyle, children: empty === null ? (_jsxs("table", { style: panelTableStyle, children: [_jsx("thead", { children: _jsxs("tr", { children: [_jsx("th", { style: panelHeaderCellStyle, children: "cm\u207B\u00B9" }), _jsx("th", { style: panelHeaderCellStyle }), _jsx("th", { style: { ...panelHeaderCellStyle, textAlign: 'right' }, children: shortModeLabel(mode) }), assignments ? (_jsx("th", { style: panelHeaderCellStyle, children: "could be" })) : null, _jsx("th", { style: panelHeaderCellStyle })] }) }), _jsx("tbody", { children: assigned.map((entry) => (_jsx(BandRow, { entry: entry, mode: mode, assignments: assignments, lit: sameIrBand(entry.band, highlight), onHighlight: onHighlight, onRemove: remove }, `${entry.band.spectrumId} ${entry.band.wavenumber}`))) })] })) : (_jsx("p", { style: panelEmptyStyle, children: empty })) })] }));
49
+ }
50
+ /**
51
+ * What the panel says in place of the table, when it has no band to list.
52
+ * @param spectrum - The selected spectrum, `null` for none.
53
+ * @param picking - Whether the bands are picked at all.
54
+ * @param count - How many bands there are to list.
55
+ * @returns The sentence, or `null` when there is a table to show.
56
+ */
57
+ function emptyMessage(spectrum, picking, count) {
58
+ if (spectrum === null)
59
+ return 'No spectrum is selected.';
60
+ if (!picking) {
61
+ return 'The bands are not being picked. Press the locate button above to find them.';
62
+ }
63
+ if (count > 0)
64
+ return null;
65
+ return spectrum.bandsByHand
66
+ ? 'No band is picked. Click the chart while picking by hand, or find them automatically again.'
67
+ : 'No band was found above the threshold. Lower it to pick the weaker ones.';
42
68
  }
43
- const thresholdStyle = {
44
- display: 'inline-flex',
45
- alignItems: 'center',
46
- gap: 4,
47
- fontSize: 11,
48
- };
49
69
  //# sourceMappingURL=BandsPanel.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BandsPanel.js","sourceRoot":"","sources":["../../../src/ir/ui/BandsPanel.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"BandsPanel.js","sourceRoot":"","sources":["../../../src/ir/ui/BandsPanel.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * The row at the top of the bands panel: the switches — picking at all,
3
+ * picking by hand, naming the assignments — then the threshold, then what
4
+ * acts at once, apart from them on the right: finding the bands automatically
5
+ * again, taking every band away, copying the table.
6
+ * @returns The row.
7
+ */
8
+ export declare function BandsToolbar(): import("react").JSX.Element;
9
+ //# sourceMappingURL=BandsToolbar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BandsToolbar.d.ts","sourceRoot":"","sources":["../../../src/ir/ui/BandsToolbar.tsx"],"names":[],"mappings":"AAUA;;;;;;GAMG;AACH,wBAAgB,YAAY,gCAkF3B"}
@@ -0,0 +1,61 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useMemo } from 'react';
3
+ import { Button, Toolbar } from 'react-science/ui';
4
+ import { panelToolbarStyle } from "../../panel/core/panelStyles.js";
5
+ import { IR_TECHNIQUE_RULES } from "../core/irTechnique.js";
6
+ import { bandsToTsv } from "./bandsTsv.js";
7
+ import { useIrCommandProps } from "./irCommandContext.js";
8
+ import { useIrActions, useIrEditorState } from "./irStateContext.js";
9
+ /**
10
+ * The row at the top of the bands panel: the switches — picking at all,
11
+ * picking by hand, naming the assignments — then the threshold, then what
12
+ * acts at once, apart from them on the right: finding the bands automatically
13
+ * again, taking every band away, copying the table.
14
+ * @returns The row.
15
+ */
16
+ export function BandsToolbar() {
17
+ const { state, selectedSpectrum, assigned } = useIrEditorState();
18
+ const actions = useIrActions();
19
+ const command = useIrCommandProps();
20
+ const { tool } = state.view;
21
+ const { mode, pickBands, showAssignments, technique } = state.settings;
22
+ const { assignments } = IR_TECHNIQUE_RULES[technique];
23
+ const byHand = selectedSpectrum?.bandsByHand === true;
24
+ const tsv = useMemo(() => bandsToTsv(assigned, mode, assignments), [assigned, mode, assignments]);
25
+ return (_jsxs("div", { style: panelToolbarStyle, children: [_jsxs(Toolbar, { "aria-label": "Band actions", children: [_jsx(Toolbar.Item, { icon: "locate", active: pickBands, tooltip: pickBands ? 'Stop picking bands' : 'Pick the bands', "aria-label": "Pick the bands", onClick: () => actions.setSettings({ pickBands: !pickBands }) }), _jsx(Toolbar.Item, { icon: "add-location", active: tool === 'pick', ...command('pickTool'), disabled: selectedSpectrum === null }), assignments ? (_jsx(Toolbar.Item, { icon: "label", active: showAssignments, tooltip: "Name the assignments on the chart", "aria-label": "Name the assignments on the chart", disabled: !pickBands, onClick: () => actions.setSettings({ showAssignments: !showAssignments }) })) : null] }), _jsx(ThresholdSlider, {}), _jsx("span", { style: { flex: 1 } }), _jsx(Button, { variant: "minimal", icon: "refresh", disabled: !pickBands || !byHand, tooltipProps: { content: 'Find the bands automatically again' }, "aria-label": "Find the bands automatically again", onClick: () => {
26
+ if (selectedSpectrum !== null) {
27
+ actions.resetBands(selectedSpectrum.id);
28
+ }
29
+ } }), _jsx(Button, { variant: "minimal", icon: "eraser", disabled: !pickBands || assigned.length === 0, tooltipProps: { content: 'Take every band away, to pick them by hand' }, "aria-label": "Take every band away", onClick: () => {
30
+ if (selectedSpectrum !== null) {
31
+ actions.setBands(selectedSpectrum.id, []);
32
+ }
33
+ } }), _jsx(Button, { variant: "minimal", icon: "clipboard", disabled: assigned.length === 0, tooltipProps: { content: 'Copy the table' }, "aria-label": "Copy the table", onClick: () => void navigator.clipboard?.writeText(tsv) })] }));
34
+ }
35
+ /**
36
+ * The threshold, the one picking setting worth reaching for while reading:
37
+ * everything else about a band follows from the spectrum, and this is what
38
+ * decides whether a shoulder is a band at all. Bands picked by hand are not
39
+ * its to move.
40
+ * @returns The labelled slider.
41
+ */
42
+ function ThresholdSlider() {
43
+ const { state, selectedSpectrum } = useIrEditorState();
44
+ const actions = useIrActions();
45
+ const { pickBands, picking } = state.settings;
46
+ const byHand = selectedSpectrum?.bandsByHand === true;
47
+ return (_jsxs("label", { style: thresholdStyle, title: byHand
48
+ ? 'The bands were picked by hand: find them automatically again to use the threshold.'
49
+ : undefined, children: [_jsx("span", { style: { opacity: 0.7 }, children: "threshold" }), _jsx("input", { type: "range", min: 0.005, max: 0.3, step: 0.005, style: sliderStyle, value: picking.minRelativeHeight ?? 0.02, disabled: !pickBands || byHand, "aria-label": "How tall a band must be to be picked", onChange: (event) => actions.setSettings({
50
+ picking: { minRelativeHeight: event.target.valueAsNumber },
51
+ }) })] }));
52
+ }
53
+ const thresholdStyle = {
54
+ display: 'inline-flex',
55
+ alignItems: 'center',
56
+ gap: 4,
57
+ fontSize: 11,
58
+ };
59
+ /** Narrower than the browser's own, so the row holds every control at 360 px. */
60
+ const sliderStyle = { width: 88 };
61
+ //# sourceMappingURL=BandsToolbar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BandsToolbar.js","sourceRoot":"","sources":["../../../src/ir/ui/BandsToolbar.tsx"],"names":[],"mappings":"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"}
@@ -27,7 +27,8 @@ export interface IrCanvasProps {
27
27
  chartId?: string;
28
28
  /**
29
29
  * Told of a click on the plot — a press let go without travelling, never the
30
- * end of a drag — with the spectrum selected at that moment.
30
+ * end of a drag — with the spectrum selected at that moment. Not told while
31
+ * bands are picked by hand, which is what a click is then.
31
32
  * @default undefined
32
33
  */
33
34
  onPlotClick?: (click: IrPlotClick) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"IrCanvas.d.ts","sourceRoot":"","sources":["../../../src/ir/ui/IrCanvas.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAO1D,MAAM,WAAW,aAAa;IAC5B;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B;;;OAGG;IACH,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAC5C;;;;;OAKG;IACH,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,KAAK,IAAI,CAAC;IACvD;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;CAC5C;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,aAAa,+BAqD5C"}
1
+ {"version":3,"file":"IrCanvas.d.ts","sourceRoot":"","sources":["../../../src/ir/ui/IrCanvas.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAO1D,MAAM,WAAW,aAAa;IAC5B;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B;;;OAGG;IACH,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAC5C;;;;;OAKG;IACH,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,KAAK,IAAI,CAAC;IACvD;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;CAC5C;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,aAAa,+BA8D5C"}