react-cheminfo 0.64.1 → 0.66.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.
- package/README.md +293 -6
- package/lib/card/core/cardAddress.d.ts +70 -0
- package/lib/card/core/cardAddress.d.ts.map +1 -0
- package/lib/card/core/cardAddress.js +59 -0
- package/lib/card/core/cardAddress.js.map +1 -0
- package/lib/card/core/cardPageUrl.d.ts +49 -0
- package/lib/card/core/cardPageUrl.d.ts.map +1 -0
- package/lib/card/core/cardPageUrl.js +59 -0
- package/lib/card/core/cardPageUrl.js.map +1 -0
- package/lib/card/core/index.d.ts +7 -0
- package/lib/card/core/index.d.ts.map +1 -0
- package/lib/card/core/index.js +4 -0
- package/lib/card/core/index.js.map +1 -0
- package/lib/card/core/panelRoom.d.ts +40 -0
- package/lib/card/core/panelRoom.d.ts.map +1 -0
- package/lib/card/core/panelRoom.js +40 -0
- package/lib/card/core/panelRoom.js.map +1 -0
- package/lib/card/ui/CardDetailsButton.d.ts +38 -0
- package/lib/card/ui/CardDetailsButton.d.ts.map +1 -0
- package/lib/card/ui/CardDetailsButton.js +50 -0
- package/lib/card/ui/CardDetailsButton.js.map +1 -0
- package/lib/card/ui/CardFigure.d.ts +51 -0
- package/lib/card/ui/CardFigure.d.ts.map +1 -0
- package/lib/card/ui/CardFigure.js +27 -0
- package/lib/card/ui/CardFigure.js.map +1 -0
- package/lib/card/ui/CardFrame.d.ts +30 -0
- package/lib/card/ui/CardFrame.d.ts.map +1 -0
- package/lib/card/ui/CardFrame.js +20 -0
- package/lib/card/ui/CardFrame.js.map +1 -0
- package/lib/card/ui/CopyTableButton.d.ts +37 -0
- package/lib/card/ui/CopyTableButton.d.ts.map +1 -0
- package/lib/card/ui/CopyTableButton.js +19 -0
- package/lib/card/ui/CopyTableButton.js.map +1 -0
- package/lib/card/ui/cardTooltip.d.ts +14 -0
- package/lib/card/ui/cardTooltip.d.ts.map +1 -0
- package/lib/card/ui/cardTooltip.js +15 -0
- package/lib/card/ui/cardTooltip.js.map +1 -0
- package/lib/card/ui/embed.d.ts +15 -0
- package/lib/card/ui/embed.d.ts.map +1 -0
- package/lib/card/ui/embed.js +24 -0
- package/lib/card/ui/embed.js.map +1 -0
- package/lib/card/ui/fitCardToFrame.d.ts +31 -0
- package/lib/card/ui/fitCardToFrame.d.ts.map +1 -0
- package/lib/card/ui/fitCardToFrame.js +66 -0
- package/lib/card/ui/fitCardToFrame.js.map +1 -0
- package/lib/card/ui/holdRoomForPanels.d.ts +16 -0
- package/lib/card/ui/holdRoomForPanels.d.ts.map +1 -0
- package/lib/card/ui/holdRoomForPanels.js +76 -0
- package/lib/card/ui/holdRoomForPanels.js.map +1 -0
- package/lib/card/ui/index.d.ts +11 -0
- package/lib/card/ui/index.d.ts.map +1 -0
- package/lib/card/ui/index.js +7 -0
- package/lib/card/ui/index.js.map +1 -0
- package/lib/card/ui/openPanels.d.ts +25 -0
- package/lib/card/ui/openPanels.d.ts.map +1 -0
- package/lib/card/ui/openPanels.js +85 -0
- package/lib/card/ui/openPanels.js.map +1 -0
- package/lib/card.d.ts +13 -0
- package/lib/card.d.ts.map +1 -0
- package/lib/card.js +13 -0
- package/lib/card.js.map +1 -0
- package/lib/conformers.d.ts +1 -0
- package/lib/conformers.d.ts.map +1 -1
- package/lib/conformers.js +1 -0
- package/lib/conformers.js.map +1 -1
- package/lib/core.d.ts +4 -0
- package/lib/core.d.ts.map +1 -1
- package/lib/core.js +5 -0
- package/lib/core.js.map +1 -1
- package/lib/fetch/core/apiError.d.ts +56 -0
- package/lib/fetch/core/apiError.d.ts.map +1 -0
- package/lib/fetch/core/apiError.js +43 -0
- package/lib/fetch/core/apiError.js.map +1 -0
- package/lib/fetch/core/fetchJson.d.ts +47 -0
- package/lib/fetch/core/fetchJson.d.ts.map +1 -0
- package/lib/fetch/core/fetchJson.js +109 -0
- package/lib/fetch/core/fetchJson.js.map +1 -0
- package/lib/fetch/core/index.d.ts +5 -0
- package/lib/fetch/core/index.d.ts.map +1 -0
- package/lib/fetch/core/index.js +3 -0
- package/lib/fetch/core/index.js.map +1 -0
- package/lib/formula/core/formulaText.d.ts +46 -0
- package/lib/formula/core/formulaText.d.ts.map +1 -0
- package/lib/formula/core/formulaText.js +74 -0
- package/lib/formula/core/formulaText.js.map +1 -0
- package/lib/formula/core/index.d.ts +6 -0
- package/lib/formula/core/index.d.ts.map +1 -0
- package/lib/formula/core/index.js +4 -0
- package/lib/formula/core/index.js.map +1 -0
- package/lib/formula/core/normalizeFormula.d.ts +22 -0
- package/lib/formula/core/normalizeFormula.d.ts.map +1 -0
- package/lib/formula/core/normalizeFormula.js +46 -0
- package/lib/formula/core/normalizeFormula.js.map +1 -0
- package/lib/formula/core/readFormula.d.ts +73 -0
- package/lib/formula/core/readFormula.d.ts.map +1 -0
- package/lib/formula/core/readFormula.js +132 -0
- package/lib/formula/core/readFormula.js.map +1 -0
- package/lib/formula/ui/CopyableFormula.d.ts +31 -0
- package/lib/formula/ui/CopyableFormula.d.ts.map +1 -0
- package/lib/formula/ui/CopyableFormula.js +19 -0
- package/lib/formula/ui/CopyableFormula.js.map +1 -0
- package/lib/formula/ui/FormulaInput.d.ts +29 -0
- package/lib/formula/ui/FormulaInput.d.ts.map +1 -0
- package/lib/formula/ui/FormulaInput.js +16 -0
- package/lib/formula/ui/FormulaInput.js.map +1 -0
- package/lib/formula/ui/QuestionFormula.d.ts +14 -0
- package/lib/formula/ui/QuestionFormula.d.ts.map +1 -0
- package/lib/formula/ui/QuestionFormula.js +13 -0
- package/lib/formula/ui/QuestionFormula.js.map +1 -0
- package/lib/formula/ui/index.d.ts +7 -0
- package/lib/formula/ui/index.d.ts.map +1 -0
- package/lib/formula/ui/index.js +4 -0
- package/lib/formula/ui/index.js.map +1 -0
- package/lib/formula.d.ts +11 -0
- package/lib/formula.d.ts.map +1 -0
- package/lib/formula.js +11 -0
- package/lib/formula.js.map +1 -0
- package/lib/hooks/ui/index.d.ts +1 -0
- package/lib/hooks/ui/index.d.ts.map +1 -1
- package/lib/hooks/ui/index.js.map +1 -1
- package/lib/hooks/ui/keyTargets.d.ts +4 -2
- package/lib/hooks/ui/keyTargets.d.ts.map +1 -1
- package/lib/hooks/ui/keyTargets.js +5 -3
- package/lib/hooks/ui/keyTargets.js.map +1 -1
- package/lib/hooks/ui/useAsync.d.ts +20 -5
- package/lib/hooks/ui/useAsync.d.ts.map +1 -1
- package/lib/hooks/ui/useAsync.js +29 -14
- package/lib/hooks/ui/useAsync.js.map +1 -1
- package/lib/i18n/core/chromeCatalog.d.ts +1 -1
- package/lib/i18n/core/chromeCatalog.d.ts.map +1 -1
- package/lib/ir/core/analysisSpectra.d.ts +23 -6
- package/lib/ir/core/analysisSpectra.d.ts.map +1 -1
- package/lib/ir/core/analysisSpectra.js.map +1 -1
- package/lib/ir/core/bandLabelPlan.d.ts.map +1 -1
- package/lib/ir/core/bandLabelPlan.js +11 -6
- package/lib/ir/core/bandLabelPlan.js.map +1 -1
- package/lib/ir/core/index.d.ts +13 -9
- package/lib/ir/core/index.d.ts.map +1 -1
- package/lib/ir/core/index.js +9 -6
- package/lib/ir/core/index.js.map +1 -1
- package/lib/ir/core/irBand.d.ts +45 -14
- package/lib/ir/core/irBand.d.ts.map +1 -1
- package/lib/ir/core/irBand.js +28 -6
- package/lib/ir/core/irBand.js.map +1 -1
- package/lib/ir/core/irCommands.d.ts +11 -0
- package/lib/ir/core/irCommands.d.ts.map +1 -1
- package/lib/ir/core/irCommands.js +11 -1
- package/lib/ir/core/irCommands.js.map +1 -1
- package/lib/ir/core/irDomain.d.ts +4 -3
- package/lib/ir/core/irDomain.d.ts.map +1 -1
- package/lib/ir/core/irDomain.js +10 -7
- package/lib/ir/core/irDomain.js.map +1 -1
- package/lib/ir/core/irFormat.d.ts +14 -2
- package/lib/ir/core/irFormat.d.ts.map +1 -1
- package/lib/ir/core/irFormat.js +33 -4
- package/lib/ir/core/irFormat.js.map +1 -1
- package/lib/ir/core/irMode.d.ts +35 -8
- package/lib/ir/core/irMode.d.ts.map +1 -1
- package/lib/ir/core/irMode.js +38 -10
- package/lib/ir/core/irMode.js.map +1 -1
- package/lib/ir/core/irReducer.d.ts +0 -28
- package/lib/ir/core/irReducer.d.ts.map +1 -1
- package/lib/ir/core/irReducer.js +1 -24
- package/lib/ir/core/irReducer.js.map +1 -1
- package/lib/ir/core/irSpectrum.d.ts +52 -26
- package/lib/ir/core/irSpectrum.d.ts.map +1 -1
- package/lib/ir/core/irSpectrum.js +21 -15
- package/lib/ir/core/irSpectrum.js.map +1 -1
- package/lib/ir/core/irState.d.ts +40 -2
- package/lib/ir/core/irState.d.ts.map +1 -1
- package/lib/ir/core/irState.js +38 -1
- package/lib/ir/core/irState.js.map +1 -1
- package/lib/ir/core/irTechnique.d.ts +94 -0
- package/lib/ir/core/irTechnique.d.ts.map +1 -0
- package/lib/ir/core/irTechnique.js +87 -0
- package/lib/ir/core/irTechnique.js.map +1 -0
- package/lib/ir/core/irTechniqueCommands.d.ts +26 -0
- package/lib/ir/core/irTechniqueCommands.d.ts.map +1 -0
- package/lib/ir/core/irTechniqueCommands.js +68 -0
- package/lib/ir/core/irTechniqueCommands.js.map +1 -0
- package/lib/ir/core/pickBands.d.ts +6 -5
- package/lib/ir/core/pickBands.d.ts.map +1 -1
- package/lib/ir/core/pickBands.js +49 -26
- package/lib/ir/core/pickBands.js.map +1 -1
- package/lib/ir/core/ramanBands.d.ts +30 -0
- package/lib/ir/core/ramanBands.d.ts.map +1 -0
- package/lib/ir/core/ramanBands.js +83 -0
- package/lib/ir/core/ramanBands.js.map +1 -0
- package/lib/ir/core/spectrumJcamp.d.ts +10 -5
- package/lib/ir/core/spectrumJcamp.d.ts.map +1 -1
- package/lib/ir/core/spectrumJcamp.js +63 -15
- package/lib/ir/core/spectrumJcamp.js.map +1 -1
- package/lib/ir/core/toIrSpectrum.d.ts.map +1 -1
- package/lib/ir/core/toIrSpectrum.js +17 -2
- package/lib/ir/core/toIrSpectrum.js.map +1 -1
- package/lib/ir/ui/BandRow.d.ts +30 -0
- package/lib/ir/ui/BandRow.d.ts.map +1 -0
- package/lib/ir/ui/BandRow.js +42 -0
- package/lib/ir/ui/BandRow.js.map +1 -0
- package/lib/ir/ui/BandsPanel.d.ts +4 -0
- package/lib/ir/ui/BandsPanel.d.ts.map +1 -1
- package/lib/ir/ui/BandsPanel.js +14 -59
- package/lib/ir/ui/BandsPanel.js.map +1 -1
- package/lib/ir/ui/IrAboutDialog.d.ts +7 -0
- package/lib/ir/ui/IrAboutDialog.d.ts.map +1 -1
- package/lib/ir/ui/IrAboutDialog.js +16 -3
- package/lib/ir/ui/IrAboutDialog.js.map +1 -1
- package/lib/ir/ui/IrCanvas.d.ts.map +1 -1
- package/lib/ir/ui/IrCanvas.js +2 -2
- package/lib/ir/ui/IrCanvas.js.map +1 -1
- package/lib/ir/ui/IrChart.d.ts +2 -1
- package/lib/ir/ui/IrChart.d.ts.map +1 -1
- package/lib/ir/ui/IrChart.js +18 -21
- package/lib/ir/ui/IrChart.js.map +1 -1
- package/lib/ir/ui/IrCommandProvider.d.ts +7 -0
- package/lib/ir/ui/IrCommandProvider.d.ts.map +1 -1
- package/lib/ir/ui/IrCommandProvider.js +2 -2
- package/lib/ir/ui/IrCommandProvider.js.map +1 -1
- package/lib/ir/ui/IrCommandTooltip.d.ts +7 -0
- package/lib/ir/ui/IrCommandTooltip.d.ts.map +1 -1
- package/lib/ir/ui/IrCommandTooltip.js +3 -2
- package/lib/ir/ui/IrCommandTooltip.js.map +1 -1
- package/lib/ir/ui/IrDocumentationDialog.d.ts +8 -1
- package/lib/ir/ui/IrDocumentationDialog.d.ts.map +1 -1
- package/lib/ir/ui/IrDocumentationDialog.js +30 -7
- package/lib/ir/ui/IrDocumentationDialog.js.map +1 -1
- package/lib/ir/ui/IrEditor.d.ts +3 -1
- package/lib/ir/ui/IrEditor.d.ts.map +1 -1
- package/lib/ir/ui/IrEditor.js +3 -20
- package/lib/ir/ui/IrEditor.js.map +1 -1
- package/lib/ir/ui/IrHeader.d.ts.map +1 -1
- package/lib/ir/ui/IrHeader.js +5 -1
- package/lib/ir/ui/IrHeader.js.map +1 -1
- package/lib/ir/ui/IrLogo.d.ts +11 -3
- package/lib/ir/ui/IrLogo.d.ts.map +1 -1
- package/lib/ir/ui/IrLogo.js +14 -5
- package/lib/ir/ui/IrLogo.js.map +1 -1
- package/lib/ir/ui/IrShell.d.ts.map +1 -1
- package/lib/ir/ui/IrShell.js +23 -56
- package/lib/ir/ui/IrShell.js.map +1 -1
- package/lib/ir/ui/IrStatusBar.d.ts +3 -2
- package/lib/ir/ui/IrStatusBar.d.ts.map +1 -1
- package/lib/ir/ui/IrStatusBar.js +14 -9
- package/lib/ir/ui/IrStatusBar.js.map +1 -1
- package/lib/ir/ui/IrToolbar.d.ts +3 -0
- package/lib/ir/ui/IrToolbar.d.ts.map +1 -1
- package/lib/ir/ui/IrToolbar.js +10 -3
- package/lib/ir/ui/IrToolbar.js.map +1 -1
- package/lib/ir/ui/IrTraces.d.ts +4 -1
- package/lib/ir/ui/IrTraces.d.ts.map +1 -1
- package/lib/ir/ui/IrTraces.js +2 -0
- package/lib/ir/ui/IrTraces.js.map +1 -1
- package/lib/ir/ui/RamanEditor.d.ts +46 -0
- package/lib/ir/ui/RamanEditor.d.ts.map +1 -0
- package/lib/ir/ui/RamanEditor.js +17 -0
- package/lib/ir/ui/RamanEditor.js.map +1 -0
- package/lib/ir/ui/SpectraPanel.d.ts.map +1 -1
- package/lib/ir/ui/SpectraPanel.js +2 -2
- package/lib/ir/ui/SpectraPanel.js.map +1 -1
- package/lib/ir/ui/SpectrumRow.d.ts +7 -0
- package/lib/ir/ui/SpectrumRow.d.ts.map +1 -1
- package/lib/ir/ui/SpectrumRow.js +4 -5
- package/lib/ir/ui/SpectrumRow.js.map +1 -1
- package/lib/ir/ui/VibrationalEditor.d.ts +48 -0
- package/lib/ir/ui/VibrationalEditor.d.ts.map +1 -0
- package/lib/ir/ui/VibrationalEditor.js +31 -0
- package/lib/ir/ui/VibrationalEditor.js.map +1 -0
- package/lib/ir/ui/bandsTsv.d.ts +19 -0
- package/lib/ir/ui/bandsTsv.d.ts.map +1 -0
- package/lib/ir/ui/bandsTsv.js +38 -0
- package/lib/ir/ui/bandsTsv.js.map +1 -0
- package/lib/ir/ui/irChartProps.d.ts +14 -4
- package/lib/ir/ui/irChartProps.d.ts.map +1 -1
- package/lib/ir/ui/irChartProps.js +3 -2
- package/lib/ir/ui/irChartProps.js.map +1 -1
- package/lib/ir/ui/irCommandContext.d.ts +8 -0
- package/lib/ir/ui/irCommandContext.d.ts.map +1 -1
- package/lib/ir/ui/irCommandContext.js +14 -3
- package/lib/ir/ui/irCommandContext.js.map +1 -1
- package/lib/ir/ui/useIrEditor.d.ts +3 -3
- package/lib/ir/ui/useIrEditor.d.ts.map +1 -1
- package/lib/ir/ui/useIrEditor.js +13 -4
- package/lib/ir/ui/useIrEditor.js.map +1 -1
- package/lib/ir/ui/useIrHandle.d.ts +14 -0
- package/lib/ir/ui/useIrHandle.d.ts.map +1 -0
- package/lib/ir/ui/useIrHandle.js +39 -0
- package/lib/ir/ui/useIrHandle.js.map +1 -0
- package/lib/ir/ui/useIrText.d.ts +40 -0
- package/lib/ir/ui/useIrText.d.ts.map +1 -0
- package/lib/ir/ui/useIrText.js +118 -0
- package/lib/ir/ui/useIrText.js.map +1 -0
- package/lib/ir/ui/useIrZoom.d.ts +7 -0
- package/lib/ir/ui/useIrZoom.d.ts.map +1 -1
- package/lib/ir/ui/useIrZoom.js +5 -4
- package/lib/ir/ui/useIrZoom.js.map +1 -1
- package/lib/ir/ui/useValueAxisZoom.d.ts +20 -0
- package/lib/ir/ui/useValueAxisZoom.d.ts.map +1 -0
- package/lib/ir/ui/useValueAxisZoom.js +54 -0
- package/lib/ir/ui/useValueAxisZoom.js.map +1 -0
- package/lib/ir.d.ts +3 -0
- package/lib/ir.d.ts.map +1 -1
- package/lib/ir.js +3 -0
- package/lib/ir.js.map +1 -1
- package/lib/locales/de.json +57 -1
- package/lib/locales/en.json +57 -1
- package/lib/locales/es.json +57 -1
- package/lib/locales/fr.json +57 -1
- package/lib/locales/it.json +57 -1
- package/lib/moleculesClient/core/index.d.ts +5 -0
- package/lib/moleculesClient/core/index.d.ts.map +1 -0
- package/lib/moleculesClient/core/index.js +3 -0
- package/lib/moleculesClient/core/index.js.map +1 -0
- package/lib/moleculesClient/core/moleculesClient.d.ts +12 -0
- package/lib/moleculesClient/core/moleculesClient.d.ts.map +1 -0
- package/lib/moleculesClient/core/moleculesClient.js +105 -0
- package/lib/moleculesClient/core/moleculesClient.js.map +1 -0
- package/lib/moleculesClient/core/moleculesClientApi.d.ts +100 -0
- package/lib/moleculesClient/core/moleculesClientApi.d.ts.map +1 -0
- package/lib/moleculesClient/core/moleculesClientApi.js +20 -0
- package/lib/moleculesClient/core/moleculesClientApi.js.map +1 -0
- package/lib/moleculesClient/core/moleculesTypes.d.ts +154 -0
- package/lib/moleculesClient/core/moleculesTypes.d.ts.map +1 -0
- package/lib/moleculesClient/core/moleculesTypes.js +2 -0
- package/lib/moleculesClient/core/moleculesTypes.js.map +1 -0
- package/lib/moleculesClient/core/requestRetry.d.ts +50 -0
- package/lib/moleculesClient/core/requestRetry.d.ts.map +1 -0
- package/lib/moleculesClient/core/requestRetry.js +108 -0
- package/lib/moleculesClient/core/requestRetry.js.map +1 -0
- package/lib/molstar/core/camera.d.ts +2 -1
- package/lib/molstar/core/camera.d.ts.map +1 -1
- package/lib/molstar/core/camera.js +3 -2
- package/lib/molstar/core/camera.js.map +1 -1
- package/lib/molstar/core/framing.d.ts +102 -0
- package/lib/molstar/core/framing.d.ts.map +1 -0
- package/lib/molstar/core/framing.js +120 -0
- package/lib/molstar/core/framing.js.map +1 -0
- package/lib/molstar/core/hover.d.ts +16 -0
- package/lib/molstar/core/hover.d.ts.map +1 -1
- package/lib/molstar/core/hover.js +14 -0
- package/lib/molstar/core/hover.js.map +1 -1
- package/lib/molstar/core/index.d.ts +4 -1
- package/lib/molstar/core/index.d.ts.map +1 -1
- package/lib/molstar/core/index.js +2 -1
- package/lib/molstar/core/index.js.map +1 -1
- package/lib/pedagogy/core/answers.d.ts +46 -0
- package/lib/pedagogy/core/answers.d.ts.map +1 -0
- package/lib/pedagogy/core/answers.js +77 -0
- package/lib/pedagogy/core/answers.js.map +1 -0
- package/lib/pedagogy/core/attempts.d.ts +86 -0
- package/lib/pedagogy/core/attempts.d.ts.map +1 -0
- package/lib/pedagogy/core/attempts.js +117 -0
- package/lib/pedagogy/core/attempts.js.map +1 -0
- package/lib/pedagogy/core/index.d.ts +8 -0
- package/lib/pedagogy/core/index.d.ts.map +1 -1
- package/lib/pedagogy/core/index.js +4 -0
- package/lib/pedagogy/core/index.js.map +1 -1
- package/lib/pedagogy/core/progressController.d.ts +64 -0
- package/lib/pedagogy/core/progressController.d.ts.map +1 -0
- package/lib/pedagogy/core/progressController.js +56 -0
- package/lib/pedagogy/core/progressController.js.map +1 -0
- package/lib/pedagogy/core/seed.d.ts +96 -0
- package/lib/pedagogy/core/seed.d.ts.map +1 -0
- package/lib/pedagogy/core/seed.js +128 -0
- package/lib/pedagogy/core/seed.js.map +1 -0
- package/lib/pedagogy/core/series.d.ts +77 -0
- package/lib/pedagogy/core/series.d.ts.map +1 -0
- package/lib/pedagogy/core/series.js +10 -0
- package/lib/pedagogy/core/series.js.map +1 -0
- package/lib/pedagogy/ui/AnswerFields.d.ts +21 -0
- package/lib/pedagogy/ui/AnswerFields.d.ts.map +1 -0
- package/lib/pedagogy/ui/AnswerFields.js +24 -0
- package/lib/pedagogy/ui/AnswerFields.js.map +1 -0
- package/lib/pedagogy/ui/ExerciseList.d.ts +82 -0
- package/lib/pedagogy/ui/ExerciseList.d.ts.map +1 -0
- package/lib/pedagogy/ui/ExerciseList.js +53 -0
- package/lib/pedagogy/ui/ExerciseList.js.map +1 -0
- package/lib/pedagogy/ui/ExerciseSeries.d.ts +95 -0
- package/lib/pedagogy/ui/ExerciseSeries.d.ts.map +1 -0
- package/lib/pedagogy/ui/ExerciseSeries.js +74 -0
- package/lib/pedagogy/ui/ExerciseSeries.js.map +1 -0
- package/lib/pedagogy/ui/QuestionCard.d.ts +64 -0
- package/lib/pedagogy/ui/QuestionCard.d.ts.map +1 -0
- package/lib/pedagogy/ui/QuestionCard.js +73 -0
- package/lib/pedagogy/ui/QuestionCard.js.map +1 -0
- package/lib/pedagogy/ui/index.d.ts +10 -0
- package/lib/pedagogy/ui/index.d.ts.map +1 -1
- package/lib/pedagogy/ui/index.js +6 -0
- package/lib/pedagogy/ui/index.js.map +1 -1
- package/lib/pedagogy/ui/seriesCounts.d.ts +17 -0
- package/lib/pedagogy/ui/seriesCounts.d.ts.map +1 -0
- package/lib/pedagogy/ui/seriesCounts.js +27 -0
- package/lib/pedagogy/ui/seriesCounts.js.map +1 -0
- package/lib/pedagogy/ui/seriesParts.d.ts +55 -0
- package/lib/pedagogy/ui/seriesParts.d.ts.map +1 -0
- package/lib/pedagogy/ui/seriesParts.js +38 -0
- package/lib/pedagogy/ui/seriesParts.js.map +1 -0
- package/lib/pedagogy/ui/useAttemptRecords.d.ts +10 -0
- package/lib/pedagogy/ui/useAttemptRecords.d.ts.map +1 -0
- package/lib/pedagogy/ui/useAttemptRecords.js +11 -0
- package/lib/pedagogy/ui/useAttemptRecords.js.map +1 -0
- package/lib/periodic/ui/PeriodicTable.d.ts.map +1 -1
- package/lib/periodic/ui/PeriodicTable.js +6 -3
- package/lib/periodic/ui/PeriodicTable.js.map +1 -1
- package/lib/property/core/copyableText.d.ts +14 -0
- package/lib/property/core/copyableText.d.ts.map +1 -0
- package/lib/property/core/copyableText.js +21 -0
- package/lib/property/core/copyableText.js.map +1 -0
- package/lib/property/core/index.d.ts +2 -0
- package/lib/property/core/index.d.ts.map +1 -0
- package/lib/property/core/index.js +2 -0
- package/lib/property/core/index.js.map +1 -0
- package/lib/property/ui/PropertyTable.d.ts +43 -0
- package/lib/property/ui/PropertyTable.d.ts.map +1 -0
- package/lib/property/ui/PropertyTable.js +19 -0
- package/lib/property/ui/PropertyTable.js.map +1 -0
- package/lib/property/ui/index.d.ts +3 -0
- package/lib/property/ui/index.d.ts.map +1 -0
- package/lib/property/ui/index.js +2 -0
- package/lib/property/ui/index.js.map +1 -0
- package/lib/raman.d.ts +16 -0
- package/lib/raman.d.ts.map +1 -0
- package/lib/raman.js +12 -0
- package/lib/raman.js.map +1 -0
- package/lib/router/core/history.d.ts +24 -3
- package/lib/router/core/history.d.ts.map +1 -1
- package/lib/router/core/history.js +55 -7
- package/lib/router/core/history.js.map +1 -1
- package/lib/router/core/index.d.ts +3 -3
- package/lib/router/core/index.d.ts.map +1 -1
- package/lib/router/core/index.js +2 -2
- package/lib/router/core/index.js.map +1 -1
- package/lib/router/core/languageRoute.d.ts +61 -0
- package/lib/router/core/languageRoute.d.ts.map +1 -0
- package/lib/router/core/languageRoute.js +96 -0
- package/lib/router/core/languageRoute.js.map +1 -0
- package/lib/router/core/siteAddresses.d.ts +23 -0
- package/lib/router/core/siteAddresses.d.ts.map +1 -1
- package/lib/router/core/siteAddresses.js +26 -0
- package/lib/router/core/siteAddresses.js.map +1 -1
- package/lib/router/core/tabRouter.d.ts +2 -108
- package/lib/router/core/tabRouter.d.ts.map +1 -1
- package/lib/router/core/tabRouter.js +38 -5
- package/lib/router/core/tabRouter.js.map +1 -1
- package/lib/router/core/tabRouterTypes.d.ts +154 -0
- package/lib/router/core/tabRouterTypes.d.ts.map +1 -0
- package/lib/router/core/tabRouterTypes.js +2 -0
- package/lib/router/core/tabRouterTypes.js.map +1 -0
- package/lib/seo/core/fitDescription.d.ts +40 -0
- package/lib/seo/core/fitDescription.d.ts.map +1 -0
- package/lib/seo/core/fitDescription.js +45 -0
- package/lib/seo/core/fitDescription.js.map +1 -0
- package/lib/seo/core/index.d.ts +7 -0
- package/lib/seo/core/index.d.ts.map +1 -1
- package/lib/seo/core/index.js +4 -0
- package/lib/seo/core/index.js.map +1 -1
- package/lib/seo/core/limits.d.ts +24 -0
- package/lib/seo/core/limits.d.ts.map +1 -0
- package/lib/seo/core/limits.js +24 -0
- package/lib/seo/core/limits.js.map +1 -0
- package/lib/seo/core/pageContent.d.ts +25 -0
- package/lib/seo/core/pageContent.d.ts.map +1 -0
- package/lib/seo/core/pageContent.js +25 -0
- package/lib/seo/core/pageContent.js.map +1 -0
- package/lib/seo/core/plainDescription.d.ts.map +1 -1
- package/lib/seo/core/plainDescription.js +3 -2
- package/lib/seo/core/plainDescription.js.map +1 -1
- package/lib/seo/core/routeProblems.d.ts.map +1 -1
- package/lib/seo/core/routeProblems.js +1 -6
- package/lib/seo/core/routeProblems.js.map +1 -1
- package/lib/seo/core/routeTable.d.ts +31 -0
- package/lib/seo/core/routeTable.d.ts.map +1 -0
- package/lib/seo/core/routeTable.js +96 -0
- package/lib/seo/core/routeTable.js.map +1 -0
- package/lib/seo/vite/index.d.ts +2 -0
- package/lib/seo/vite/index.d.ts.map +1 -1
- package/lib/seo/vite/index.js +1 -0
- package/lib/seo/vite/index.js.map +1 -1
- package/lib/seo/vite/prerender.d.ts +10 -0
- package/lib/seo/vite/prerender.d.ts.map +1 -1
- package/lib/seo/vite/prerender.js +12 -1
- package/lib/seo/vite/prerender.js.map +1 -1
- package/lib/seo/vite/routeTable.d.ts +40 -0
- package/lib/seo/vite/routeTable.d.ts.map +1 -0
- package/lib/seo/vite/routeTable.js +44 -0
- package/lib/seo/vite/routeTable.js.map +1 -0
- package/lib/server/answerAddresses.d.ts +51 -0
- package/lib/server/answerAddresses.d.ts.map +1 -0
- package/lib/server/answerAddresses.js +72 -0
- package/lib/server/answerAddresses.js.map +1 -0
- package/lib/server/cardMeta.d.ts +57 -0
- package/lib/server/cardMeta.d.ts.map +1 -0
- package/lib/server/cardMeta.js +52 -0
- package/lib/server/cardMeta.js.map +1 -0
- package/lib/server/config.d.ts +72 -0
- package/lib/server/config.d.ts.map +1 -0
- package/lib/server/config.js +67 -0
- package/lib/server/config.js.map +1 -0
- package/lib/server/envNumber.d.ts +35 -0
- package/lib/server/envNumber.d.ts.map +1 -0
- package/lib/server/envNumber.js +42 -0
- package/lib/server/envNumber.js.map +1 -0
- package/lib/server/healthRoute.d.ts +26 -0
- package/lib/server/healthRoute.d.ts.map +1 -0
- package/lib/server/healthRoute.js +22 -0
- package/lib/server/healthRoute.js.map +1 -0
- package/lib/server/listenSite.d.ts +38 -0
- package/lib/server/listenSite.d.ts.map +1 -0
- package/lib/server/listenSite.js +60 -0
- package/lib/server/listenSite.js.map +1 -0
- package/lib/server/mcpServer.d.ts +8 -0
- package/lib/server/mcpServer.d.ts.map +1 -0
- package/lib/server/mcpServer.js +11 -0
- package/lib/server/mcpServer.js.map +1 -0
- package/lib/server/repositoryVersion.d.ts +16 -0
- package/lib/server/repositoryVersion.d.ts.map +1 -0
- package/lib/server/repositoryVersion.js +33 -0
- package/lib/server/repositoryVersion.js.map +1 -0
- package/lib/server/routeOptions.d.ts +23 -0
- package/lib/server/routeOptions.d.ts.map +1 -0
- package/lib/server/routeOptions.js +20 -0
- package/lib/server/routeOptions.js.map +1 -0
- package/lib/server/routeTable.d.ts +14 -0
- package/lib/server/routeTable.d.ts.map +1 -0
- package/lib/server/routeTable.js +32 -0
- package/lib/server/routeTable.js.map +1 -0
- package/lib/server/siteView.d.ts +29 -0
- package/lib/server/siteView.d.ts.map +1 -0
- package/lib/server/siteView.js +21 -0
- package/lib/server/siteView.js.map +1 -0
- package/lib/server/spaPages.d.ts +32 -0
- package/lib/server/spaPages.d.ts.map +1 -0
- package/lib/server/spaPages.js +126 -0
- package/lib/server/spaPages.js.map +1 -0
- package/lib/server/spaSite.d.ts +30 -0
- package/lib/server/spaSite.d.ts.map +1 -0
- package/lib/server/spaSite.js +170 -0
- package/lib/server/spaSite.js.map +1 -0
- package/lib/server/spaSiteOptions.d.ts +126 -0
- package/lib/server/spaSiteOptions.d.ts.map +1 -0
- package/lib/server/spaSiteOptions.js +2 -0
- package/lib/server/spaSiteOptions.js.map +1 -0
- package/lib/server/staticSite.d.ts +9 -0
- package/lib/server/staticSite.d.ts.map +1 -1
- package/lib/server/staticSite.js +41 -19
- package/lib/server/staticSite.js.map +1 -1
- package/lib/server/toolSiteServer.d.ts +77 -0
- package/lib/server/toolSiteServer.d.ts.map +1 -0
- package/lib/server/toolSiteServer.js +58 -0
- package/lib/server/toolSiteServer.js.map +1 -0
- package/lib/server/trustProxy.d.ts +20 -0
- package/lib/server/trustProxy.d.ts.map +1 -0
- package/lib/server/trustProxy.js +32 -0
- package/lib/server/trustProxy.js.map +1 -0
- package/lib/server/types.d.ts +13 -0
- package/lib/server/types.d.ts.map +1 -0
- package/lib/server/types.js +2 -0
- package/lib/server/types.js.map +1 -0
- package/lib/server.d.ts +22 -0
- package/lib/server.d.ts.map +1 -1
- package/lib/server.js +12 -0
- package/lib/server.js.map +1 -1
- package/lib/share/core/config.d.ts +18 -0
- package/lib/share/core/config.d.ts.map +1 -1
- package/lib/share/core/config.js +33 -2
- package/lib/share/core/config.js.map +1 -1
- package/lib/share/core/index.d.ts +3 -1
- package/lib/share/core/index.d.ts.map +1 -1
- package/lib/share/core/index.js +2 -1
- package/lib/share/core/index.js.map +1 -1
- package/lib/share/core/keySetParam.d.ts +40 -0
- package/lib/share/core/keySetParam.d.ts.map +1 -0
- package/lib/share/core/keySetParam.js +60 -0
- package/lib/share/core/keySetParam.js.map +1 -0
- package/lib/share/core/vocabulary.d.ts +8 -0
- package/lib/share/core/vocabulary.d.ts.map +1 -1
- package/lib/shell/ui/ShareControl.d.ts +75 -0
- package/lib/shell/ui/ShareControl.d.ts.map +1 -0
- package/lib/shell/ui/ShareControl.js +40 -0
- package/lib/shell/ui/ShareControl.js.map +1 -0
- package/lib/shell/ui/ShellFrame.d.ts +14 -0
- package/lib/shell/ui/ShellFrame.d.ts.map +1 -0
- package/lib/shell/ui/ShellFrame.js +45 -0
- package/lib/shell/ui/ShellFrame.js.map +1 -0
- package/lib/shell/ui/SiteShell.d.ts +251 -0
- package/lib/shell/ui/SiteShell.d.ts.map +1 -0
- package/lib/shell/ui/SiteShell.js +39 -0
- package/lib/shell/ui/SiteShell.js.map +1 -0
- package/lib/shell/ui/index.d.ts +5 -0
- package/lib/shell/ui/index.d.ts.map +1 -0
- package/lib/shell/ui/index.js +3 -0
- package/lib/shell/ui/index.js.map +1 -0
- package/lib/state/core/index.d.ts +1 -0
- package/lib/state/core/index.d.ts.map +1 -1
- package/lib/state/core/index.js.map +1 -1
- package/lib/state/core/legacyEntries.d.ts +30 -0
- package/lib/state/core/legacyEntries.d.ts.map +1 -0
- package/lib/state/core/legacyEntries.js +51 -0
- package/lib/state/core/legacyEntries.js.map +1 -0
- package/lib/state/core/persistBucket.d.ts +26 -2
- package/lib/state/core/persistBucket.d.ts.map +1 -1
- package/lib/state/core/persistBucket.js +26 -9
- package/lib/state/core/persistBucket.js.map +1 -1
- package/lib/state/core/persistSignalBucket.d.ts +26 -0
- package/lib/state/core/persistSignalBucket.d.ts.map +1 -1
- package/lib/state/core/persistSignalBucket.js +31 -0
- package/lib/state/core/persistSignalBucket.js.map +1 -1
- package/lib/state/core/storageEntry.d.ts +15 -0
- package/lib/state/core/storageEntry.d.ts.map +1 -1
- package/lib/state/core/storageEntry.js +33 -0
- package/lib/state/core/storageEntry.js.map +1 -1
- package/lib/structure/ui/StructureExportButton.d.ts +27 -0
- package/lib/structure/ui/StructureExportButton.d.ts.map +1 -0
- package/lib/structure/ui/StructureExportButton.js +21 -0
- package/lib/structure/ui/StructureExportButton.js.map +1 -0
- package/lib/structure/ui/index.d.ts +4 -0
- package/lib/structure/ui/index.d.ts.map +1 -1
- package/lib/structure/ui/index.js +2 -0
- package/lib/structure/ui/index.js.map +1 -1
- package/lib/structure/ui/useStructureDraft.d.ts +32 -0
- package/lib/structure/ui/useStructureDraft.d.ts.map +1 -0
- package/lib/structure/ui/useStructureDraft.js +20 -0
- package/lib/structure/ui/useStructureDraft.js.map +1 -0
- package/lib/ui.d.ts +2 -0
- package/lib/ui.d.ts.map +1 -1
- package/lib/ui.js +2 -0
- package/lib/ui.js.map +1 -1
- package/lib/worker/core/index.d.ts +1 -1
- package/lib/worker/core/index.d.ts.map +1 -1
- package/lib/worker/core/messages.d.ts +4 -2
- package/lib/worker/core/messages.d.ts.map +1 -1
- package/lib/worker/core/messages.js.map +1 -1
- package/lib/worker/core/oclResourcesUrl.d.ts +16 -0
- package/lib/worker/core/oclResourcesUrl.d.ts.map +1 -0
- package/lib/worker/core/oclResourcesUrl.js +19 -0
- package/lib/worker/core/oclResourcesUrl.js.map +1 -0
- package/lib/worker/core/serveWorkerRequests.d.ts +8 -0
- package/lib/worker/core/serveWorkerRequests.d.ts.map +1 -1
- package/lib/worker/core/serveWorkerRequests.js +15 -2
- package/lib/worker/core/serveWorkerRequests.js.map +1 -1
- package/lib/worker/core/workerChannel.d.ts +3 -4
- package/lib/worker/core/workerChannel.d.ts.map +1 -1
- package/lib/worker/core/workerChannel.js +72 -67
- package/lib/worker/core/workerChannel.js.map +1 -1
- package/lib/worker/core/workerChannelParts.d.ts +17 -6
- package/lib/worker/core/workerChannelParts.d.ts.map +1 -1
- package/lib/worker/core/workerChannelParts.js +20 -4
- package/lib/worker/core/workerChannelParts.js.map +1 -1
- package/lib/worker/core/workerChannelTypes.d.ts +46 -2
- package/lib/worker/core/workerChannelTypes.d.ts.map +1 -1
- package/lib/worker/core/workerSlot.d.ts +66 -0
- package/lib/worker/core/workerSlot.d.ts.map +1 -0
- package/lib/worker/core/workerSlot.js +107 -0
- package/lib/worker/core/workerSlot.js.map +1 -0
- package/package.json +17 -1
- package/src/card/core/cardAddress.ts +100 -0
- package/src/card/core/cardPageUrl.ts +97 -0
- package/src/card/core/index.ts +6 -0
- package/src/card/core/panelRoom.ts +66 -0
- package/src/card/ui/CardDetailsButton.tsx +104 -0
- package/src/card/ui/CardFigure.tsx +86 -0
- package/src/card/ui/CardFrame.tsx +46 -0
- package/src/card/ui/CopyTableButton.tsx +81 -0
- package/src/card/ui/cardTooltip.ts +18 -0
- package/src/card/ui/embed.ts +27 -0
- package/src/card/ui/fitCardToFrame.ts +76 -0
- package/src/card/ui/holdRoomForPanels.ts +83 -0
- package/src/card/ui/index.ts +14 -0
- package/src/card/ui/openPanels.ts +106 -0
- package/src/card.ts +13 -0
- package/src/conformers.ts +4 -0
- package/src/core.ts +5 -0
- package/src/fetch/core/apiError.ts +65 -0
- package/src/fetch/core/fetchJson.ts +129 -0
- package/src/fetch/core/index.ts +4 -0
- package/src/formula/core/formulaText.ts +96 -0
- package/src/formula/core/index.ts +20 -0
- package/src/formula/core/normalizeFormula.ts +50 -0
- package/src/formula/core/readFormula.ts +211 -0
- package/src/formula/ui/CopyableFormula.tsx +51 -0
- package/src/formula/ui/FormulaInput.tsx +50 -0
- package/src/formula/ui/QuestionFormula.tsx +20 -0
- package/src/formula/ui/index.ts +6 -0
- package/src/formula.ts +11 -0
- package/src/hooks/ui/index.ts +1 -0
- package/src/hooks/ui/keyTargets.ts +5 -3
- package/src/hooks/ui/useAsync.ts +50 -14
- package/src/ir/core/analysisSpectra.ts +26 -10
- package/src/ir/core/bandLabelPlan.ts +21 -10
- package/src/ir/core/index.ts +25 -5
- package/src/ir/core/irBand.ts +52 -14
- package/src/ir/core/irCommands.ts +15 -1
- package/src/ir/core/irDomain.ts +9 -7
- package/src/ir/core/irFormat.ts +39 -6
- package/src/ir/core/irMode.ts +42 -10
- package/src/ir/core/irReducer.ts +1 -49
- package/src/ir/core/irSpectrum.ts +59 -30
- package/src/ir/core/irState.ts +67 -2
- package/src/ir/core/irTechnique.ts +115 -0
- package/src/ir/core/irTechniqueCommands.ts +82 -0
- package/src/ir/core/pickBands.ts +63 -28
- package/src/ir/core/ramanBands.ts +105 -0
- package/src/ir/core/spectrumJcamp.ts +65 -16
- package/src/ir/core/toIrSpectrum.ts +20 -2
- package/src/ir/ui/BandRow.tsx +107 -0
- package/src/ir/ui/BandsPanel.tsx +32 -125
- package/src/ir/ui/IrAboutDialog.tsx +69 -28
- package/src/ir/ui/IrCanvas.tsx +2 -1
- package/src/ir/ui/IrChart.tsx +20 -24
- package/src/ir/ui/IrCommandProvider.tsx +10 -3
- package/src/ir/ui/IrCommandTooltip.tsx +11 -2
- package/src/ir/ui/IrDocumentationDialog.tsx +99 -55
- package/src/ir/ui/IrEditor.tsx +5 -36
- package/src/ir/ui/IrHeader.tsx +10 -3
- package/src/ir/ui/IrLogo.tsx +28 -9
- package/src/ir/ui/IrShell.tsx +27 -75
- package/src/ir/ui/IrStatusBar.tsx +17 -12
- package/src/ir/ui/IrToolbar.tsx +26 -15
- package/src/ir/ui/IrTraces.tsx +5 -1
- package/src/ir/ui/RamanEditor.tsx +53 -0
- package/src/ir/ui/SpectraPanel.tsx +2 -1
- package/src/ir/ui/SpectrumRow.tsx +14 -5
- package/src/ir/ui/VibrationalEditor.tsx +94 -0
- package/src/ir/ui/bandsTsv.ts +46 -0
- package/src/ir/ui/irChartProps.ts +14 -4
- package/src/ir/ui/irCommandContext.tsx +18 -3
- package/src/ir/ui/useIrEditor.ts +20 -8
- package/src/ir/ui/useIrHandle.ts +51 -0
- package/src/ir/ui/useIrText.ts +170 -0
- package/src/ir/ui/useIrZoom.ts +12 -3
- package/src/ir/ui/useValueAxisZoom.ts +67 -0
- package/src/ir.ts +3 -0
- package/src/locales/de.json +57 -1
- package/src/locales/en.json +57 -1
- package/src/locales/es.json +57 -1
- package/src/locales/fr.json +57 -1
- package/src/locales/it.json +57 -1
- package/src/moleculesClient/core/index.ts +19 -0
- package/src/moleculesClient/core/moleculesClient.ts +175 -0
- package/src/moleculesClient/core/moleculesClientApi.ts +120 -0
- package/src/moleculesClient/core/moleculesTypes.ts +163 -0
- package/src/moleculesClient/core/requestRetry.ts +118 -0
- package/src/molstar/core/camera.ts +3 -2
- package/src/molstar/core/framing.ts +200 -0
- package/src/molstar/core/hover.ts +26 -0
- package/src/molstar/core/index.ts +21 -1
- package/src/pedagogy/core/answers.ts +94 -0
- package/src/pedagogy/core/attempts.ts +205 -0
- package/src/pedagogy/core/index.ts +36 -0
- package/src/pedagogy/core/progressController.ts +116 -0
- package/src/pedagogy/core/seed.ts +177 -0
- package/src/pedagogy/core/series.ts +82 -0
- package/src/pedagogy/ui/AnswerFields.tsx +63 -0
- package/src/pedagogy/ui/ExerciseList.tsx +202 -0
- package/src/pedagogy/ui/ExerciseSeries.tsx +250 -0
- package/src/pedagogy/ui/QuestionCard.tsx +231 -0
- package/src/pedagogy/ui/index.ts +18 -0
- package/src/pedagogy/ui/seriesCounts.ts +34 -0
- package/src/pedagogy/ui/seriesParts.tsx +127 -0
- package/src/pedagogy/ui/useAttemptRecords.ts +16 -0
- package/src/periodic/ui/PeriodicTable.tsx +6 -3
- package/src/property/core/copyableText.ts +20 -0
- package/src/property/core/index.ts +1 -0
- package/src/property/ui/PropertyTable.tsx +83 -0
- package/src/property/ui/index.ts +2 -0
- package/src/raman.ts +19 -0
- package/src/router/core/history.ts +61 -7
- package/src/router/core/index.ts +3 -2
- package/src/router/core/languageRoute.ts +136 -0
- package/src/router/core/siteAddresses.ts +38 -0
- package/src/router/core/tabRouter.ts +59 -117
- package/src/router/core/tabRouterTypes.ts +158 -0
- package/src/seo/core/fitDescription.ts +74 -0
- package/src/seo/core/index.ts +17 -0
- package/src/seo/core/limits.ts +27 -0
- package/src/seo/core/pageContent.ts +42 -0
- package/src/seo/core/plainDescription.ts +4 -2
- package/src/seo/core/routeProblems.ts +1 -7
- package/src/seo/core/routeTable.ts +103 -0
- package/src/seo/vite/index.ts +2 -0
- package/src/seo/vite/prerender.ts +26 -1
- package/src/seo/vite/routeTable.ts +79 -0
- package/src/server/answerAddresses.ts +92 -0
- package/src/server/cardMeta.ts +88 -0
- package/src/server/config.ts +125 -0
- package/src/server/envNumber.ts +65 -0
- package/src/server/healthRoute.ts +42 -0
- package/src/server/listenSite.ts +90 -0
- package/src/server/mcpServer.ts +14 -0
- package/src/server/repositoryVersion.ts +33 -0
- package/src/server/routeOptions.ts +26 -0
- package/src/server/routeTable.ts +35 -0
- package/src/server/siteView.ts +42 -0
- package/src/server/spaPages.ts +179 -0
- package/src/server/spaSite.ts +216 -0
- package/src/server/spaSiteOptions.ts +133 -0
- package/src/server/staticSite.ts +65 -35
- package/src/server/toolSiteServer.ts +127 -0
- package/src/server/trustProxy.ts +32 -0
- package/src/server/types.ts +25 -0
- package/src/server.ts +40 -0
- package/src/share/core/config.ts +45 -2
- package/src/share/core/index.ts +4 -0
- package/src/share/core/keySetParam.ts +92 -0
- package/src/share/core/vocabulary.ts +8 -0
- package/src/shell/ui/ShareControl.tsx +150 -0
- package/src/shell/ui/ShellFrame.tsx +180 -0
- package/src/shell/ui/SiteShell.tsx +297 -0
- package/src/shell/ui/index.ts +9 -0
- package/src/state/core/index.ts +1 -0
- package/src/state/core/legacyEntries.ts +76 -0
- package/src/state/core/persistBucket.ts +50 -10
- package/src/state/core/persistSignalBucket.ts +52 -0
- package/src/state/core/storageEntry.ts +32 -0
- package/src/structure/ui/StructureExportButton.tsx +57 -0
- package/src/structure/ui/index.ts +4 -0
- package/src/structure/ui/useStructureDraft.ts +47 -0
- package/src/ui.ts +2 -0
- package/src/worker/core/index.ts +1 -0
- package/src/worker/core/messages.ts +4 -3
- package/src/worker/core/oclResourcesUrl.ts +21 -0
- package/src/worker/core/serveWorkerRequests.ts +30 -2
- package/src/worker/core/workerChannel.ts +74 -74
- package/src/worker/core/workerChannelParts.ts +33 -13
- package/src/worker/core/workerChannelTypes.ts +47 -2
- package/src/worker/core/workerSlot.ts +181 -0
- package/styles/card.css +145 -0
- package/styles/chrome.css +248 -0
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { FormGroup, InputGroup } from '@blueprintjs/core';
|
|
2
|
+
import type { ReactElement } from 'react';
|
|
3
|
+
import { useId } from 'react';
|
|
4
|
+
|
|
5
|
+
/** What {@link FormulaInput} needs. */
|
|
6
|
+
export interface FormulaInputProps {
|
|
7
|
+
/** What the box is for, written above it. */
|
|
8
|
+
label: string;
|
|
9
|
+
/** What is in the box. */
|
|
10
|
+
value: string;
|
|
11
|
+
/** Called with the new text on every keystroke. */
|
|
12
|
+
onChange: (value: string) => void;
|
|
13
|
+
/**
|
|
14
|
+
* How to write what the box expects, under it.
|
|
15
|
+
* @default undefined
|
|
16
|
+
*/
|
|
17
|
+
helper?: string;
|
|
18
|
+
/**
|
|
19
|
+
* Placeholder written in the empty box.
|
|
20
|
+
* @default undefined
|
|
21
|
+
*/
|
|
22
|
+
placeholder?: string;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* A box to type a molecular formula into, set in a monospace face and with
|
|
27
|
+
* every correction a phone or a browser would make switched off: a keyboard
|
|
28
|
+
* that capitalises `co` has written a different compound.
|
|
29
|
+
* @param props - Its label, its value and what to do on a change.
|
|
30
|
+
* @returns The box.
|
|
31
|
+
*/
|
|
32
|
+
export function FormulaInput(props: FormulaInputProps): ReactElement {
|
|
33
|
+
const { label, value, onChange, helper, placeholder } = props;
|
|
34
|
+
const id = useId();
|
|
35
|
+
return (
|
|
36
|
+
<FormGroup label={label} labelFor={id} helperText={helper}>
|
|
37
|
+
<InputGroup
|
|
38
|
+
id={id}
|
|
39
|
+
value={value}
|
|
40
|
+
placeholder={placeholder}
|
|
41
|
+
onValueChange={onChange}
|
|
42
|
+
autoComplete="off"
|
|
43
|
+
autoCorrect="off"
|
|
44
|
+
autoCapitalize="off"
|
|
45
|
+
spellCheck={false}
|
|
46
|
+
className="formula-input"
|
|
47
|
+
/>
|
|
48
|
+
</FormGroup>
|
|
49
|
+
);
|
|
50
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { ReactElement } from 'react';
|
|
2
|
+
import { MF } from 'react-mf';
|
|
3
|
+
|
|
4
|
+
import { normalizeFormula } from '../core/normalizeFormula.ts';
|
|
5
|
+
|
|
6
|
+
/** What {@link QuestionFormula} draws. */
|
|
7
|
+
export interface QuestionFormulaProps {
|
|
8
|
+
/** The formula, as the data writes it, in whatever notation it gives a charge. */
|
|
9
|
+
formula: string;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* A formula as the list of a series names its question: subscripts and charge
|
|
14
|
+
* drawn, whatever notation the data writes the charge in.
|
|
15
|
+
* @param props - The formula.
|
|
16
|
+
* @returns The formula.
|
|
17
|
+
*/
|
|
18
|
+
export function QuestionFormula(props: QuestionFormulaProps): ReactElement {
|
|
19
|
+
return <MF mf={normalizeFormula(props.formula)} />;
|
|
20
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export type { CopyableFormulaProps } from './CopyableFormula.tsx';
|
|
2
|
+
export { CopyableFormula } from './CopyableFormula.tsx';
|
|
3
|
+
export type { FormulaInputProps } from './FormulaInput.tsx';
|
|
4
|
+
export { FormulaInput } from './FormulaInput.tsx';
|
|
5
|
+
export type { QuestionFormulaProps } from './QuestionFormula.tsx';
|
|
6
|
+
export { QuestionFormula } from './QuestionFormula.tsx';
|
package/src/formula.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Molecular formulas: read as a student types them, compared, written as HTML
|
|
3
|
+
* and Unicode, and drawn and copied with their subscripts.
|
|
4
|
+
*
|
|
5
|
+
* An entry point of its own, not part of `react-cheminfo/core` or `/ui`,
|
|
6
|
+
* because it is built on `mf-parser` and `react-mf`: a site that never shows a
|
|
7
|
+
* formula must not be made to install either.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
export * from './formula/core/index.ts';
|
|
11
|
+
export * from './formula/ui/index.ts';
|
package/src/hooks/ui/index.ts
CHANGED
|
@@ -15,6 +15,7 @@ export { handleListNavigationKey } from './listNavigation.ts';
|
|
|
15
15
|
export type { PollingOptions, PollingSnapshot } from './pollingController.ts';
|
|
16
16
|
export type { ActiveHeadingOptions } from './useActiveHeading.ts';
|
|
17
17
|
export { useActiveHeading } from './useActiveHeading.ts';
|
|
18
|
+
export type { AsyncResult } from './useAsync.ts';
|
|
18
19
|
export { useAsync } from './useAsync.ts';
|
|
19
20
|
export { useContainerSize } from './useContainerSize.ts';
|
|
20
21
|
export { useDebouncedValue } from './useDebouncedValue.ts';
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Whether a key event is aimed at somewhere the visitor types: a text field, a
|
|
3
|
-
* select, an editable region
|
|
4
|
-
*
|
|
3
|
+
* select, an editable region, anything carrying `role="textbox"`, or a canvas
|
|
4
|
+
* holding the focus — a structure editor reads its own keys there, `Delete`
|
|
5
|
+
* and the arrows included. A keyboard shortcut listening above it leaves such
|
|
6
|
+
* a key alone.
|
|
5
7
|
* @param target - The `target` of the keyboard event.
|
|
6
8
|
* @returns True when the key belongs to the field.
|
|
7
9
|
*/
|
|
@@ -42,7 +44,7 @@ export function isInteractiveTarget(
|
|
|
42
44
|
return role !== null && INTERACTIVE_ROLES.has(role);
|
|
43
45
|
}
|
|
44
46
|
|
|
45
|
-
const TEXT_ENTRY_TAGS = new Set(['INPUT', 'TEXTAREA', 'SELECT']);
|
|
47
|
+
const TEXT_ENTRY_TAGS = new Set(['INPUT', 'TEXTAREA', 'SELECT', 'CANVAS']);
|
|
46
48
|
const INTERACTIVE_TAGS = new Set(['BUTTON', 'A', 'SUMMARY']);
|
|
47
49
|
const INTERACTIVE_ROLES = new Set([
|
|
48
50
|
'button',
|
package/src/hooks/ui/useAsync.ts
CHANGED
|
@@ -1,44 +1,80 @@
|
|
|
1
|
-
import { useEffect, useState } from 'react';
|
|
1
|
+
import { useEffect, useMemo, useState } from 'react';
|
|
2
2
|
|
|
3
3
|
import type { AsyncState } from './asyncState.ts';
|
|
4
4
|
import { ASYNC_LOADING, asyncFailed, asyncSucceeded } from './asyncState.ts';
|
|
5
5
|
|
|
6
|
+
/**
|
|
7
|
+
* Where a task stands, and whether what is on screen still answers the
|
|
8
|
+
* question being asked.
|
|
9
|
+
*/
|
|
10
|
+
export type AsyncResult<TData> = AsyncState<TData> & {
|
|
11
|
+
/**
|
|
12
|
+
* True from the moment the question changes — a new task, a new
|
|
13
|
+
* `refreshKey` — until its run settles: the data on screen, if any, answers
|
|
14
|
+
* an earlier question. Also true while the very first run is loading.
|
|
15
|
+
*/
|
|
16
|
+
pending: boolean;
|
|
17
|
+
};
|
|
18
|
+
|
|
6
19
|
/**
|
|
7
20
|
* Run an async task and follow where it stands, as a discriminated union.
|
|
8
21
|
*
|
|
9
22
|
* The task runs on mount and again whenever it or `refreshKey` changes. A
|
|
10
23
|
* re-run does not flip the state back to `loading`: what is on screen stays
|
|
11
24
|
* until the new answer arrives, and a refresh that fails keeps it rather than
|
|
12
|
-
* replacing it with an error
|
|
13
|
-
* unmounted, or after a newer run
|
|
25
|
+
* replacing it with an error; `pending` says the answer is stale meanwhile. An
|
|
26
|
+
* answer that arrives after the component unmounted, or after a newer run
|
|
27
|
+
* started, is ignored, and the run's signal is aborted at that moment, so a
|
|
28
|
+
* task that hands it to `fetch` stops asking a question nobody waits for.
|
|
14
29
|
*
|
|
15
30
|
* The task is a dependency, so pass a stable function — declared at module
|
|
16
31
|
* scope, or wrapped in `useCallback` over the values it reads.
|
|
17
|
-
* @param task - The async function to run
|
|
32
|
+
* @param task - The async function to run, handed a signal aborted once its
|
|
33
|
+
* answer is no longer wanted.
|
|
18
34
|
* @param refreshKey - Changing it runs the task again; only its identity
|
|
19
35
|
* matters. Defaults to `undefined`.
|
|
20
|
-
* @returns Where the latest run stands.
|
|
36
|
+
* @returns Where the latest run stands, and whether it is still running.
|
|
21
37
|
*/
|
|
22
38
|
export function useAsync<TData>(
|
|
23
|
-
task: () => Promise<TData>,
|
|
39
|
+
task: (signal: AbortSignal) => Promise<TData>,
|
|
24
40
|
refreshKey?: unknown,
|
|
25
|
-
):
|
|
26
|
-
const [
|
|
41
|
+
): AsyncResult<TData> {
|
|
42
|
+
const [answer, setAnswer] = useState<Answer<TData>>(UNANSWERED);
|
|
27
43
|
|
|
28
44
|
useEffect(() => {
|
|
29
|
-
|
|
30
|
-
task().then(
|
|
45
|
+
const controller = new AbortController();
|
|
46
|
+
task(controller.signal).then(
|
|
31
47
|
(data) => {
|
|
32
|
-
if (
|
|
48
|
+
if (controller.signal.aborted) return;
|
|
49
|
+
setAnswer({ state: asyncSucceeded(data), task, refreshKey });
|
|
33
50
|
},
|
|
34
51
|
(error: unknown) => {
|
|
35
|
-
if (
|
|
52
|
+
if (controller.signal.aborted) return;
|
|
53
|
+
setAnswer((previous) => ({
|
|
54
|
+
state: asyncFailed(previous.state, error),
|
|
55
|
+
task,
|
|
56
|
+
refreshKey,
|
|
57
|
+
}));
|
|
36
58
|
},
|
|
37
59
|
);
|
|
38
60
|
return () => {
|
|
39
|
-
|
|
61
|
+
controller.abort();
|
|
40
62
|
};
|
|
41
63
|
}, [task, refreshKey]);
|
|
42
64
|
|
|
43
|
-
|
|
65
|
+
const pending =
|
|
66
|
+
answer.task !== task || !Object.is(answer.refreshKey, refreshKey);
|
|
67
|
+
return useMemo(() => ({ ...answer.state, pending }), [answer.state, pending]);
|
|
44
68
|
}
|
|
69
|
+
|
|
70
|
+
interface Answer<TData> {
|
|
71
|
+
state: AsyncState<TData>;
|
|
72
|
+
task: unknown;
|
|
73
|
+
refreshKey: unknown;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const UNANSWERED: Answer<never> = {
|
|
77
|
+
state: ASYNC_LOADING,
|
|
78
|
+
task: null,
|
|
79
|
+
refreshKey: undefined,
|
|
80
|
+
};
|
|
@@ -14,14 +14,31 @@ import { xySortX } from 'ml-spectra-processing';
|
|
|
14
14
|
|
|
15
15
|
import type { IrMeta, IrMode, IrOrigin } from './irSpectrum.ts';
|
|
16
16
|
|
|
17
|
-
/**
|
|
17
|
+
/**
|
|
18
|
+
* One spectrum as a reader produced it, before it is named and coloured.
|
|
19
|
+
*
|
|
20
|
+
* The readers of this package produce infrared spectra, which carry absorbance
|
|
21
|
+
* and transmittance; a host reading a Raman file builds one carrying its
|
|
22
|
+
* intensity instead.
|
|
23
|
+
*/
|
|
18
24
|
export interface LoadedIrSpectrum {
|
|
19
|
-
/** The wavenumbers, ascending. */
|
|
25
|
+
/** The wavenumbers — or, for a Raman spectrum, the Raman shifts — ascending. */
|
|
20
26
|
wavenumber: Float64Array;
|
|
21
|
-
/**
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
27
|
+
/**
|
|
28
|
+
* Absorbance at each, for an infrared spectrum.
|
|
29
|
+
* @default undefined
|
|
30
|
+
*/
|
|
31
|
+
absorbance?: Float64Array;
|
|
32
|
+
/**
|
|
33
|
+
* Percent transmittance at each, for an infrared spectrum.
|
|
34
|
+
* @default undefined
|
|
35
|
+
*/
|
|
36
|
+
transmittance?: Float64Array;
|
|
37
|
+
/**
|
|
38
|
+
* Intensity at each, for a Raman spectrum.
|
|
39
|
+
* @default undefined
|
|
40
|
+
*/
|
|
41
|
+
intensity?: Float64Array;
|
|
25
42
|
/** What the file said about the acquisition, `null` when it said nothing. */
|
|
26
43
|
meta: IrMeta | null;
|
|
27
44
|
/** Where it came from. */
|
|
@@ -96,10 +113,9 @@ export function analysisSpectra(
|
|
|
96
113
|
return spectra;
|
|
97
114
|
}
|
|
98
115
|
|
|
99
|
-
/** The three arrays of one spectrum, in ascending wavenumber. */
|
|
100
|
-
type SortedTraces =
|
|
101
|
-
LoadedIrSpectrum,
|
|
102
|
-
'wavenumber' | 'absorbance' | 'transmittance'
|
|
116
|
+
/** The three arrays of one infrared spectrum, in ascending wavenumber. */
|
|
117
|
+
type SortedTraces = Required<
|
|
118
|
+
Pick<LoadedIrSpectrum, 'wavenumber' | 'absorbance' | 'transmittance'>
|
|
103
119
|
>;
|
|
104
120
|
|
|
105
121
|
/**
|
|
@@ -18,6 +18,7 @@ import { labelStackBaselines } from '../../chart/core/labelStack.ts';
|
|
|
18
18
|
import type { AssignedBand } from './assignBands.ts';
|
|
19
19
|
import { bandLabel } from './assignBands.ts';
|
|
20
20
|
import type { IrBand } from './irBand.ts';
|
|
21
|
+
import { bandHeight, bandValue } from './irBand.ts';
|
|
21
22
|
import { formatWavenumber } from './irFormat.ts';
|
|
22
23
|
import { bandsPointDown } from './irMode.ts';
|
|
23
24
|
import type { IrMode } from './irSpectrum.ts';
|
|
@@ -99,12 +100,15 @@ export function planBandLabels(options: BandLabelPlanOptions): BandLabelPlan[] {
|
|
|
99
100
|
limit = 12,
|
|
100
101
|
} = options;
|
|
101
102
|
|
|
102
|
-
const inside:
|
|
103
|
+
const inside: NamedBand[] = [];
|
|
103
104
|
for (const entry of assigned) {
|
|
105
|
+
// A band with no value on the axis being read has no tip to hang from.
|
|
106
|
+
const value = bandValue(entry.band, mode);
|
|
107
|
+
if (value === undefined) continue;
|
|
104
108
|
const pixelX = chartPixel(xScale, entry.band.wavenumber);
|
|
105
109
|
if (!Number.isFinite(pixelX)) continue;
|
|
106
110
|
if (pixelX < plot.left || pixelX > plot.right) continue;
|
|
107
|
-
inside.push(entry);
|
|
111
|
+
inside.push({ entry, value });
|
|
108
112
|
}
|
|
109
113
|
|
|
110
114
|
const named =
|
|
@@ -112,18 +116,20 @@ export function planBandLabels(options: BandLabelPlanOptions): BandLabelPlan[] {
|
|
|
112
116
|
? inside
|
|
113
117
|
: inside
|
|
114
118
|
.toSorted(
|
|
115
|
-
(first, second) =>
|
|
119
|
+
(first, second) =>
|
|
120
|
+
bandHeight(second.entry.band) - bandHeight(first.entry.band),
|
|
116
121
|
)
|
|
117
122
|
.slice(0, limit)
|
|
118
123
|
.toSorted(
|
|
119
|
-
(first, second) =>
|
|
124
|
+
(first, second) =>
|
|
125
|
+
first.entry.band.wavenumber - second.entry.band.wavenumber,
|
|
120
126
|
);
|
|
121
127
|
|
|
122
128
|
const centres = new Float64Array(named.length);
|
|
123
129
|
for (let index = 0; index < named.length; index++) {
|
|
124
130
|
centres[index] = chartPixel(
|
|
125
131
|
xScale,
|
|
126
|
-
(named[index] as
|
|
132
|
+
(named[index] as NamedBand).entry.band.wavenumber,
|
|
127
133
|
);
|
|
128
134
|
}
|
|
129
135
|
const placed = layoutAnnotationBoxes(
|
|
@@ -136,12 +142,9 @@ export function planBandLabels(options: BandLabelPlanOptions): BandLabelPlan[] {
|
|
|
136
142
|
const down = bandsPointDown(mode);
|
|
137
143
|
const plans: BandLabelPlan[] = new Array<BandLabelPlan>(named.length);
|
|
138
144
|
for (let index = 0; index < named.length; index++) {
|
|
139
|
-
const entry = named[index] as
|
|
145
|
+
const { entry, value } = named[index] as NamedBand;
|
|
140
146
|
const lines = labelLines(entry, showAssignments);
|
|
141
|
-
const tipY = chartPixel(
|
|
142
|
-
yScale,
|
|
143
|
-
mode === 'absorbance' ? entry.band.absorbance : entry.band.transmittance,
|
|
144
|
-
);
|
|
147
|
+
const tipY = chartPixel(yScale, value);
|
|
145
148
|
plans[index] = {
|
|
146
149
|
band: entry.band,
|
|
147
150
|
tipX: centres[index] as number,
|
|
@@ -161,6 +164,14 @@ export function planBandLabels(options: BandLabelPlanOptions): BandLabelPlan[] {
|
|
|
161
164
|
return plans;
|
|
162
165
|
}
|
|
163
166
|
|
|
167
|
+
/** A band inside the window, with its value on the axis being read. */
|
|
168
|
+
interface NamedBand {
|
|
169
|
+
/** The band and whatever the table said about it. */
|
|
170
|
+
entry: AssignedBand;
|
|
171
|
+
/** Where its tip is, on the value axis. */
|
|
172
|
+
value: number;
|
|
173
|
+
}
|
|
174
|
+
|
|
164
175
|
/**
|
|
165
176
|
* How wide a label is taken to be while it is being spaced out.
|
|
166
177
|
*
|
package/src/ir/core/index.ts
CHANGED
|
@@ -10,7 +10,8 @@
|
|
|
10
10
|
* transmittance and a band points the other way in each, and that a wavenumber
|
|
11
11
|
* maps to a range of vibrations rather than to one. Nothing here knows what a
|
|
12
12
|
* glycan is, and nothing should: an infrared spectrum answers for whatever was
|
|
13
|
-
* put in the beam.
|
|
13
|
+
* put in the beam. A Raman spectrum is the one other technique held, and what
|
|
14
|
+
* differs for it is in `IR_TECHNIQUE_RULES`.
|
|
14
15
|
*/
|
|
15
16
|
|
|
16
17
|
export type { LoadedIrSpectrum } from './analysisSpectra.ts';
|
|
@@ -26,16 +27,22 @@ export { downloadIrSpectra, downloadIrSpectrum } from './downloadSpectra.ts';
|
|
|
26
27
|
export type { IrJcampReadOptions } from './fromJcamp.ts';
|
|
27
28
|
export type { IrSpcReadOptions } from './fromSpc.ts';
|
|
28
29
|
export type { IrBand, IrBandStrength } from './irBand.ts';
|
|
29
|
-
export { sameIrBand } from './irBand.ts';
|
|
30
|
+
export { bandHeight, bandValue, sameIrBand } from './irBand.ts';
|
|
30
31
|
export type {
|
|
31
32
|
IrCommand,
|
|
32
33
|
IrCommandHandlers,
|
|
33
34
|
IrCommandId,
|
|
35
|
+
IrCommandTable,
|
|
34
36
|
IrGesture,
|
|
35
37
|
IrShortcut,
|
|
36
38
|
RunIrCommand,
|
|
37
39
|
} from './irCommands.ts';
|
|
38
|
-
export {
|
|
40
|
+
export {
|
|
41
|
+
irCommandEntryLabel,
|
|
42
|
+
irCommandLabel,
|
|
43
|
+
irCommands,
|
|
44
|
+
} from './irCommands.ts';
|
|
45
|
+
export { irCommandOffered, irCommandsFor } from './irTechniqueCommands.ts';
|
|
39
46
|
export {
|
|
40
47
|
LABEL_HEADROOM,
|
|
41
48
|
X_DOMAIN_PADDING,
|
|
@@ -46,9 +53,11 @@ export {
|
|
|
46
53
|
export type { IrEditorHandle, ZoomToBandOptions } from './irEditorApi.ts';
|
|
47
54
|
export {
|
|
48
55
|
ABSORBANCE_DECIMALS,
|
|
56
|
+
INTENSITY_DIGITS,
|
|
49
57
|
TRANSMITTANCE_DECIMALS,
|
|
50
58
|
formatIrValue,
|
|
51
59
|
formatWavenumber,
|
|
60
|
+
formatWavenumberRange,
|
|
52
61
|
shortModeLabel,
|
|
53
62
|
} from './irFormat.ts';
|
|
54
63
|
export {
|
|
@@ -61,8 +70,8 @@ export {
|
|
|
61
70
|
yAxisTitle,
|
|
62
71
|
zoomGestures,
|
|
63
72
|
} from './irMode.ts';
|
|
64
|
-
export type {
|
|
65
|
-
export {
|
|
73
|
+
export type { IrAction } from './irReducer.ts';
|
|
74
|
+
export { irReducer } from './irReducer.ts';
|
|
66
75
|
export type {
|
|
67
76
|
IrDomain,
|
|
68
77
|
IrFormat,
|
|
@@ -75,6 +84,7 @@ export type {
|
|
|
75
84
|
} from './irSpectrum.ts';
|
|
76
85
|
export { traceOf } from './irSpectrum.ts';
|
|
77
86
|
export type {
|
|
87
|
+
CreateIrStateOptions,
|
|
78
88
|
IrData,
|
|
79
89
|
IrSettings,
|
|
80
90
|
IrState,
|
|
@@ -89,9 +99,19 @@ export {
|
|
|
89
99
|
DEFAULT_SIDE_PANEL,
|
|
90
100
|
DEFAULT_SIDE_PANELS,
|
|
91
101
|
MAXIMUM_LABEL_LIMIT,
|
|
102
|
+
createIrState,
|
|
92
103
|
isIrWindow,
|
|
93
104
|
mergeIrSettings,
|
|
94
105
|
} from './irState.ts';
|
|
106
|
+
export type { IrTechnique, IrTechniqueRules } from './irTechnique.ts';
|
|
107
|
+
export {
|
|
108
|
+
IR_TECHNIQUES,
|
|
109
|
+
IR_TECHNIQUE_RULES,
|
|
110
|
+
defaultIrMode,
|
|
111
|
+
irModeFor,
|
|
112
|
+
irModeTechnique,
|
|
113
|
+
offersIrMode,
|
|
114
|
+
} from './irTechnique.ts';
|
|
95
115
|
export type {
|
|
96
116
|
LoadIrSpectraOptions,
|
|
97
117
|
LoadIrSpectraResult,
|
package/src/ir/core/irBand.ts
CHANGED
|
@@ -1,21 +1,24 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* One band picked out of a spectrum.
|
|
3
3
|
*
|
|
4
|
-
* A band is the
|
|
5
|
-
* points at, names, and reads a functional group off.
|
|
6
|
-
* for the same reason
|
|
7
|
-
* transmittance and the one a table calls strongly
|
|
8
|
-
* making the caller convert to find out would be the
|
|
9
|
-
* does not do.
|
|
4
|
+
* A band is the vibrational analogue of a mass spectrum's peak: the thing a
|
|
5
|
+
* chemist points at, names, and reads a functional group off. An infrared band
|
|
6
|
+
* carries both value axes for the same reason its spectrum does — the band a
|
|
7
|
+
* reader sees at 30 percent transmittance and the one a table calls strongly
|
|
8
|
+
* absorbing are one band, and making the caller convert to find out would be the
|
|
9
|
+
* conversion this package does not do. A Raman band carries its intensity.
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
|
+
import type { IrMode } from './irSpectrum.ts';
|
|
13
|
+
|
|
12
14
|
/**
|
|
13
15
|
* How strong a band is, in the letters a correlation table uses.
|
|
14
16
|
*
|
|
15
|
-
* `w` weak, `m` medium, `S` strong —
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
17
|
+
* `w` weak, `m` medium, `S` strong — decided from where the band sits between
|
|
18
|
+
* the spectrum's own extremes, so the letters are relative to the spectrum in
|
|
19
|
+
* hand rather than to an absolute value. That is what a printed table means by
|
|
20
|
+
* them too. `ir-spectrum` decides it for an infrared band from its
|
|
21
|
+
* transmittance, and the same rule is applied to a Raman band's intensity.
|
|
19
22
|
*/
|
|
20
23
|
export type IrBandStrength = 'w' | 'm' | 'S';
|
|
21
24
|
|
|
@@ -25,10 +28,21 @@ export interface IrBand {
|
|
|
25
28
|
spectrumId: string;
|
|
26
29
|
/** Where it sits, in cm⁻¹. */
|
|
27
30
|
wavenumber: number;
|
|
28
|
-
/**
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
31
|
+
/**
|
|
32
|
+
* Its absorbance, which an infrared band is picked as a maximum of.
|
|
33
|
+
* @default undefined
|
|
34
|
+
*/
|
|
35
|
+
absorbance?: number;
|
|
36
|
+
/**
|
|
37
|
+
* Its percent transmittance, the same infrared band read the other way up.
|
|
38
|
+
* @default undefined
|
|
39
|
+
*/
|
|
40
|
+
transmittance?: number;
|
|
41
|
+
/**
|
|
42
|
+
* Its intensity, which a Raman band is picked as a maximum of.
|
|
43
|
+
* @default undefined
|
|
44
|
+
*/
|
|
45
|
+
intensity?: number;
|
|
32
46
|
/** How strong it is, relative to the spectrum it came from. */
|
|
33
47
|
strength: IrBandStrength;
|
|
34
48
|
}
|
|
@@ -55,3 +69,27 @@ export function sameIrBand(
|
|
|
55
69
|
current.wavenumber === next.wavenumber
|
|
56
70
|
);
|
|
57
71
|
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* A band's value on the axis being read.
|
|
75
|
+
* @param band - The band.
|
|
76
|
+
* @param mode - Which value axis is being read.
|
|
77
|
+
* @returns The value, or `undefined` when its spectrum carries no such axis.
|
|
78
|
+
*/
|
|
79
|
+
export function bandValue(band: IrBand, mode: IrMode): number | undefined {
|
|
80
|
+
return band[mode];
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* How tall a band stands, which is what a cut to the strongest bands ranks by.
|
|
85
|
+
*
|
|
86
|
+
* The value it was picked as a maximum of: its absorbance for an infrared band,
|
|
87
|
+
* its intensity for a Raman one. Never its transmittance, in which a stronger
|
|
88
|
+
* band is a smaller number.
|
|
89
|
+
* @param band - The band.
|
|
90
|
+
* @returns The height, or negative infinity for a band carrying neither, so it
|
|
91
|
+
* ranks last.
|
|
92
|
+
*/
|
|
93
|
+
export function bandHeight(band: IrBand): number {
|
|
94
|
+
return band.absorbance ?? band.intensity ?? Number.NEGATIVE_INFINITY;
|
|
95
|
+
}
|
|
@@ -10,6 +10,9 @@
|
|
|
10
10
|
* this one, because a module that exports a component and a constant together
|
|
11
11
|
* cannot be hot reloaded — `react-refresh/only-export-components` is the rule
|
|
12
12
|
* that says so, and the split is the fix rather than the exception.
|
|
13
|
+
*
|
|
14
|
+
* This is the infrared table; `irTechniqueCommands.ts` derives the Raman one
|
|
15
|
+
* from it.
|
|
13
16
|
*/
|
|
14
17
|
|
|
15
18
|
/** The key a command answers to. */
|
|
@@ -134,6 +137,9 @@ export const irCommands = {
|
|
|
134
137
|
/** Identity of one of the commands the viewer offers. */
|
|
135
138
|
export type IrCommandId = keyof typeof irCommands;
|
|
136
139
|
|
|
140
|
+
/** The commands a viewer offers, in the order they are reached for. */
|
|
141
|
+
export type IrCommandTable = Readonly<Partial<Record<IrCommandId, IrCommand>>>;
|
|
142
|
+
|
|
137
143
|
/** What to do when each command is run, as the shell wires them. */
|
|
138
144
|
export type IrCommandHandlers = Partial<
|
|
139
145
|
Record<IrCommandId, (() => void) | undefined>
|
|
@@ -148,7 +154,15 @@ export type RunIrCommand = (id: IrCommandId) => void;
|
|
|
148
154
|
* @returns The title, and the key in parentheses when it has one.
|
|
149
155
|
*/
|
|
150
156
|
export function irCommandLabel(id: IrCommandId): string {
|
|
151
|
-
|
|
157
|
+
return irCommandEntryLabel(irCommands[id]);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* A command's title, with its key in parentheses when it has one.
|
|
162
|
+
* @param entry - The command, as a table words it.
|
|
163
|
+
* @returns The label.
|
|
164
|
+
*/
|
|
165
|
+
export function irCommandEntryLabel(entry: IrCommand): string {
|
|
152
166
|
const key = entry.shortcut?.label?.[0] ?? entry.shortcut?.keys[0];
|
|
153
167
|
return key === undefined ? entry.title : `${entry.title} (${key})`;
|
|
154
168
|
}
|
package/src/ir/core/irDomain.ts
CHANGED
|
@@ -5,9 +5,10 @@
|
|
|
5
5
|
* something usable when it is handed nothing at all — a chart with no data is
|
|
6
6
|
* still mounted, still measured, and still builds its scales.
|
|
7
7
|
*
|
|
8
|
-
* The x window is in ascending wavenumbers even though the axis is
|
|
9
|
-
* 4000 down to 400: which way round it is read is the chart's
|
|
10
|
-
* every piece of arithmetic that moves a window expects its ends
|
|
8
|
+
* The x window is in ascending wavenumbers even though the infrared axis is
|
|
9
|
+
* drawn from 4000 down to 400: which way round it is read is the chart's
|
|
10
|
+
* business, and every piece of arithmetic that moves a window expects its ends
|
|
11
|
+
* in order.
|
|
11
12
|
*/
|
|
12
13
|
|
|
13
14
|
import { xMaxValue, xMinValue } from 'ml-spectra-processing';
|
|
@@ -57,9 +58,8 @@ export function fullDomain(
|
|
|
57
58
|
const extent =
|
|
58
59
|
traceExtent(spectra, mode, false) ?? traceExtent(spectra, mode, true);
|
|
59
60
|
if (extent === null) {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
: { x: [400, 4000], y: [0, 100] };
|
|
61
|
+
// A percentage runs to 100; absorbance and intensity are open at the top.
|
|
62
|
+
return { x: [400, 4000], y: mode === 'transmittance' ? [0, 100] : [0, 1] };
|
|
63
63
|
}
|
|
64
64
|
|
|
65
65
|
const { xMinimum, xMaximum, yMinimum, yMaximum } = extent;
|
|
@@ -135,7 +135,9 @@ function traceExtent(
|
|
|
135
135
|
for (const spectrum of spectra) {
|
|
136
136
|
if (!spectrum.visible) continue;
|
|
137
137
|
if (!includeExcluded && spectrum.excludeFromDomain) continue;
|
|
138
|
-
const
|
|
138
|
+
const trace = traceOf(spectrum, mode);
|
|
139
|
+
if (trace === undefined) continue;
|
|
140
|
+
const { x, y } = trace;
|
|
139
141
|
if (x.length === 0 || y.length === 0) continue;
|
|
140
142
|
// The wavenumber ends are read off the first and last sample rather than
|
|
141
143
|
// searched for: the array is ascending by construction, so a scan would walk
|