react-cheminfo 0.76.0 → 0.78.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 +141 -31
- package/lib/card/core/cardAddress.d.ts +19 -2
- package/lib/card/core/cardAddress.d.ts.map +1 -1
- package/lib/card/core/cardAddress.js +35 -2
- package/lib/card/core/cardAddress.js.map +1 -1
- package/lib/card/core/cardPageUrl.d.ts +7 -1
- package/lib/card/core/cardPageUrl.d.ts.map +1 -1
- package/lib/card/core/cardPageUrl.js +4 -2
- package/lib/card/core/cardPageUrl.js.map +1 -1
- package/lib/card/core/index.d.ts +1 -1
- package/lib/card/core/index.d.ts.map +1 -1
- package/lib/card/core/index.js +1 -1
- package/lib/card/core/index.js.map +1 -1
- package/lib/credits/core/credits.d.ts +30 -0
- package/lib/credits/core/credits.d.ts.map +1 -1
- package/lib/credits/core/credits.js +35 -0
- package/lib/credits/core/credits.js.map +1 -1
- package/lib/download/core/downloadFigure.d.ts +12 -1
- package/lib/download/core/downloadFigure.d.ts.map +1 -1
- package/lib/download/core/downloadFigure.js +21 -0
- package/lib/download/core/downloadFigure.js.map +1 -1
- package/lib/download/core/figureDpi.d.ts +59 -0
- package/lib/download/core/figureDpi.d.ts.map +1 -0
- package/lib/download/core/figureDpi.js +75 -0
- package/lib/download/core/figureDpi.js.map +1 -0
- package/lib/download/core/figurePng.d.ts +4 -1
- package/lib/download/core/figurePng.d.ts.map +1 -1
- package/lib/download/core/figurePng.js +11 -2
- package/lib/download/core/figurePng.js.map +1 -1
- package/lib/download/core/index.d.ts +4 -1
- package/lib/download/core/index.d.ts.map +1 -1
- package/lib/download/core/index.js +3 -1
- package/lib/download/core/index.js.map +1 -1
- package/lib/download/core/pngDpi.d.ts +22 -0
- package/lib/download/core/pngDpi.d.ts.map +1 -0
- package/lib/download/core/pngDpi.js +79 -0
- package/lib/download/core/pngDpi.js.map +1 -0
- package/lib/download/ui/FigureDownloadPanel.d.ts +13 -0
- package/lib/download/ui/FigureDownloadPanel.d.ts.map +1 -1
- package/lib/download/ui/FigureDownloadPanel.js +18 -34
- package/lib/download/ui/FigureDownloadPanel.js.map +1 -1
- package/lib/download/ui/figureDownloadHint.d.ts +5 -0
- package/lib/download/ui/figureDownloadHint.d.ts.map +1 -1
- package/lib/download/ui/figureDownloadHint.js +8 -0
- package/lib/download/ui/figureDownloadHint.js.map +1 -1
- package/lib/download/ui/figureDownloadOptions.d.ts +84 -0
- package/lib/download/ui/figureDownloadOptions.d.ts.map +1 -0
- package/lib/download/ui/figureDownloadOptions.js +2 -0
- package/lib/download/ui/figureDownloadOptions.js.map +1 -0
- package/lib/download/ui/resolutionChoices.d.ts +27 -0
- package/lib/download/ui/resolutionChoices.d.ts.map +1 -0
- package/lib/download/ui/resolutionChoices.js +48 -0
- package/lib/download/ui/resolutionChoices.js.map +1 -0
- package/lib/download/ui/useFigureActions.d.ts +4 -1
- package/lib/download/ui/useFigureActions.d.ts.map +1 -1
- package/lib/download/ui/useFigureActions.js +17 -8
- package/lib/download/ui/useFigureActions.js.map +1 -1
- package/lib/download/ui/useFigureDownload.d.ts +2 -55
- package/lib/download/ui/useFigureDownload.d.ts.map +1 -1
- package/lib/download/ui/useFigureDownload.js +45 -13
- package/lib/download/ui/useFigureDownload.js.map +1 -1
- package/lib/ecosystem/core/sites.d.ts.map +1 -1
- package/lib/ecosystem/core/sites.js +14 -0
- package/lib/ecosystem/core/sites.js.map +1 -1
- package/lib/ecosystem/core/types.d.ts +1 -1
- package/lib/ecosystem/core/types.d.ts.map +1 -1
- package/lib/ecosystem/ui/glyphs.d.ts.map +1 -1
- package/lib/ecosystem/ui/glyphs.js +3 -0
- package/lib/ecosystem/ui/glyphs.js.map +1 -1
- package/lib/host/core/connectHost.js +1 -1
- package/lib/host/core/connectHost.js.map +1 -1
- package/lib/host/core/connectTool.d.ts +103 -0
- package/lib/host/core/connectTool.d.ts.map +1 -0
- package/lib/host/core/connectTool.js +169 -0
- package/lib/host/core/connectTool.js.map +1 -0
- package/lib/host/core/hostOutputs.d.ts +16 -3
- package/lib/host/core/hostOutputs.d.ts.map +1 -1
- package/lib/host/core/hostOutputs.js +38 -4
- package/lib/host/core/hostOutputs.js.map +1 -1
- package/lib/host/core/index.d.ts +8 -2
- package/lib/host/core/index.d.ts.map +1 -1
- package/lib/host/core/index.js +4 -1
- package/lib/host/core/index.js.map +1 -1
- package/lib/host/core/kinds.d.ts +31 -3
- package/lib/host/core/kinds.d.ts.map +1 -1
- package/lib/host/core/kinds.js +35 -4
- package/lib/host/core/kinds.js.map +1 -1
- package/lib/host/core/messageValues.d.ts +29 -0
- package/lib/host/core/messageValues.d.ts.map +1 -0
- package/lib/host/core/messageValues.js +57 -0
- package/lib/host/core/messageValues.js.map +1 -0
- package/lib/host/core/protocol.d.ts +2 -5
- package/lib/host/core/protocol.d.ts.map +1 -1
- package/lib/host/core/protocol.js +3 -37
- package/lib/host/core/protocol.js.map +1 -1
- package/lib/host/core/resultKinds.d.ts +74 -0
- package/lib/host/core/resultKinds.d.ts.map +1 -0
- package/lib/host/core/resultKinds.js +40 -0
- package/lib/host/core/resultKinds.js.map +1 -0
- package/lib/host/core/toolMessages.d.ts +24 -0
- package/lib/host/core/toolMessages.d.ts.map +1 -0
- package/lib/host/core/toolMessages.js +136 -0
- package/lib/host/core/toolMessages.js.map +1 -0
- package/lib/host/ui/index.d.ts +2 -0
- package/lib/host/ui/index.d.ts.map +1 -1
- package/lib/host/ui/index.js +1 -0
- package/lib/host/ui/index.js.map +1 -1
- package/lib/host/ui/useFramedTool.d.ts +74 -0
- package/lib/host/ui/useFramedTool.d.ts.map +1 -0
- package/lib/host/ui/useFramedTool.js +125 -0
- package/lib/host/ui/useFramedTool.js.map +1 -0
- package/lib/i18n/core/chromeCatalog.d.ts +1 -1
- package/lib/i18n/core/chromeCatalog.d.ts.map +1 -1
- package/lib/locales/de.json +30 -1
- package/lib/locales/en.json +30 -1
- package/lib/locales/es.json +30 -1
- package/lib/locales/fr.json +30 -1
- package/lib/locales/it.json +30 -1
- package/lib/molecule3d/ui/Molecule3DStage.d.ts +4 -33
- package/lib/molecule3d/ui/Molecule3DStage.d.ts.map +1 -1
- package/lib/molecule3d/ui/Molecule3DStage.js +3 -37
- package/lib/molecule3d/ui/Molecule3DStage.js.map +1 -1
- package/lib/molecule3d/ui/MoleculeCanvas3D.d.ts.map +1 -1
- package/lib/molecule3d/ui/MoleculeCanvas3D.js +10 -2
- package/lib/molecule3d/ui/MoleculeCanvas3D.js.map +1 -1
- package/lib/molecule3d/ui/exportMoleculeImage.d.ts +10 -0
- package/lib/molecule3d/ui/exportMoleculeImage.d.ts.map +1 -1
- package/lib/molecule3d/ui/exportMoleculeImage.js +17 -0
- package/lib/molecule3d/ui/exportMoleculeImage.js.map +1 -1
- package/lib/molecule3d/ui/index.d.ts +1 -1
- package/lib/molecule3d/ui/index.d.ts.map +1 -1
- package/lib/molecule3d/ui/moleculeViewer3DProps.d.ts +23 -0
- package/lib/molecule3d/ui/moleculeViewer3DProps.d.ts.map +1 -1
- package/lib/molecule3d/ui/useImageExport.d.ts +3 -0
- package/lib/molecule3d/ui/useImageExport.d.ts.map +1 -1
- package/lib/molecule3d/ui/useImageExport.js +21 -3
- package/lib/molecule3d/ui/useImageExport.js.map +1 -1
- package/lib/osiris/core/barGeometry.d.ts +42 -0
- package/lib/osiris/core/barGeometry.d.ts.map +1 -0
- package/lib/osiris/core/barGeometry.js +46 -0
- package/lib/osiris/core/barGeometry.js.map +1 -0
- package/lib/osiris/core/computeProperties.d.ts +42 -0
- package/lib/osiris/core/computeProperties.d.ts.map +1 -0
- package/lib/osiris/core/computeProperties.js +115 -0
- package/lib/osiris/core/computeProperties.js.map +1 -0
- package/lib/osiris/core/constants.d.ts +70 -0
- package/lib/osiris/core/constants.d.ts.map +1 -0
- package/lib/osiris/core/constants.js +99 -0
- package/lib/osiris/core/constants.js.map +1 -0
- package/lib/osiris/core/fitness.d.ts +32 -0
- package/lib/osiris/core/fitness.d.ts.map +1 -0
- package/lib/osiris/core/fitness.js +48 -0
- package/lib/osiris/core/fitness.js.map +1 -0
- package/lib/osiris/core/index.d.ts +29 -0
- package/lib/osiris/core/index.d.ts.map +1 -0
- package/lib/osiris/core/index.js +19 -0
- package/lib/osiris/core/index.js.map +1 -0
- package/lib/osiris/core/poolSize.d.ts +17 -0
- package/lib/osiris/core/poolSize.d.ts.map +1 -0
- package/lib/osiris/core/poolSize.js +22 -0
- package/lib/osiris/core/poolSize.js.map +1 -0
- package/lib/osiris/core/poolTypes.d.ts +140 -0
- package/lib/osiris/core/poolTypes.d.ts.map +1 -0
- package/lib/osiris/core/poolTypes.js +12 -0
- package/lib/osiris/core/poolTypes.js.map +1 -0
- package/lib/osiris/core/predictIdCode.d.ts +39 -0
- package/lib/osiris/core/predictIdCode.d.ts.map +1 -0
- package/lib/osiris/core/predictIdCode.js +54 -0
- package/lib/osiris/core/predictIdCode.js.map +1 -0
- package/lib/osiris/core/predictProtocol.d.ts +67 -0
- package/lib/osiris/core/predictProtocol.d.ts.map +1 -0
- package/lib/osiris/core/predictProtocol.js +29 -0
- package/lib/osiris/core/predictProtocol.js.map +1 -0
- package/lib/osiris/core/predictionPool.d.ts +23 -0
- package/lib/osiris/core/predictionPool.d.ts.map +1 -0
- package/lib/osiris/core/predictionPool.js +186 -0
- package/lib/osiris/core/predictionPool.js.map +1 -0
- package/lib/osiris/core/predictionQueue.d.ts +46 -0
- package/lib/osiris/core/predictionQueue.d.ts.map +1 -0
- package/lib/osiris/core/predictionQueue.js +57 -0
- package/lib/osiris/core/predictionQueue.js.map +1 -0
- package/lib/osiris/core/predictors.d.ts +62 -0
- package/lib/osiris/core/predictors.d.ts.map +1 -0
- package/lib/osiris/core/predictors.js +100 -0
- package/lib/osiris/core/predictors.js.map +1 -0
- package/lib/osiris/core/propertyKeys.d.ts +32 -0
- package/lib/osiris/core/propertyKeys.d.ts.map +1 -0
- package/lib/osiris/core/propertyKeys.js +44 -0
- package/lib/osiris/core/propertyKeys.js.map +1 -0
- package/lib/osiris/core/riskAppearance.d.ts +60 -0
- package/lib/osiris/core/riskAppearance.d.ts.map +1 -0
- package/lib/osiris/core/riskAppearance.js +59 -0
- package/lib/osiris/core/riskAppearance.js.map +1 -0
- package/lib/osiris/core/riskDetail.d.ts +22 -0
- package/lib/osiris/core/riskDetail.d.ts.map +1 -0
- package/lib/osiris/core/riskDetail.js +86 -0
- package/lib/osiris/core/riskDetail.js.map +1 -0
- package/lib/osiris/core/riskDetailRequest.d.ts +31 -0
- package/lib/osiris/core/riskDetailRequest.d.ts.map +1 -0
- package/lib/osiris/core/riskDetailRequest.js +49 -0
- package/lib/osiris/core/riskDetailRequest.js.map +1 -0
- package/lib/osiris/core/riskFindings.d.ts +26 -0
- package/lib/osiris/core/riskFindings.d.ts.map +1 -0
- package/lib/osiris/core/riskFindings.js +79 -0
- package/lib/osiris/core/riskFindings.js.map +1 -0
- package/lib/osiris/core/runPredictionJob.d.ts +20 -0
- package/lib/osiris/core/runPredictionJob.d.ts.map +1 -0
- package/lib/osiris/core/runPredictionJob.js +43 -0
- package/lib/osiris/core/runPredictionJob.js.map +1 -0
- package/lib/osiris/core/scales.d.ts +70 -0
- package/lib/osiris/core/scales.d.ts.map +1 -0
- package/lib/osiris/core/scales.js +185 -0
- package/lib/osiris/core/scales.js.map +1 -0
- package/lib/osiris/core/types.d.ts +91 -0
- package/lib/osiris/core/types.d.ts.map +1 -0
- package/lib/osiris/core/types.js +19 -0
- package/lib/osiris/core/types.js.map +1 -0
- package/lib/osiris/core/valuation.d.ts +28 -0
- package/lib/osiris/core/valuation.d.ts.map +1 -0
- package/lib/osiris/core/valuation.js +39 -0
- package/lib/osiris/core/valuation.js.map +1 -0
- package/lib/osiris/ui/PropertyBar.d.ts +27 -0
- package/lib/osiris/ui/PropertyBar.d.ts.map +1 -0
- package/lib/osiris/ui/PropertyBar.js +27 -0
- package/lib/osiris/ui/PropertyBar.js.map +1 -0
- package/lib/osiris/ui/PropertyPanel.d.ts +91 -0
- package/lib/osiris/ui/PropertyPanel.d.ts.map +1 -0
- package/lib/osiris/ui/PropertyPanel.js +77 -0
- package/lib/osiris/ui/PropertyPanel.js.map +1 -0
- package/lib/osiris/ui/PropertyRows.d.ts +40 -0
- package/lib/osiris/ui/PropertyRows.d.ts.map +1 -0
- package/lib/osiris/ui/PropertyRows.js +23 -0
- package/lib/osiris/ui/PropertyRows.js.map +1 -0
- package/lib/osiris/ui/RiskFindings.d.ts +43 -0
- package/lib/osiris/ui/RiskFindings.d.ts.map +1 -0
- package/lib/osiris/ui/RiskFindings.js +51 -0
- package/lib/osiris/ui/RiskFindings.js.map +1 -0
- package/lib/osiris/ui/RiskPanel.d.ts +46 -0
- package/lib/osiris/ui/RiskPanel.d.ts.map +1 -0
- package/lib/osiris/ui/RiskPanel.js +32 -0
- package/lib/osiris/ui/RiskPanel.js.map +1 -0
- package/lib/osiris/ui/RiskSquare.d.ts +51 -0
- package/lib/osiris/ui/RiskSquare.d.ts.map +1 -0
- package/lib/osiris/ui/RiskSquare.js +23 -0
- package/lib/osiris/ui/RiskSquare.js.map +1 -0
- package/lib/osiris/ui/index.d.ts +15 -0
- package/lib/osiris/ui/index.d.ts.map +1 -0
- package/lib/osiris/ui/index.js +8 -0
- package/lib/osiris/ui/index.js.map +1 -0
- package/lib/osiris/ui/usePredictions.d.ts +81 -0
- package/lib/osiris/ui/usePredictions.d.ts.map +1 -0
- package/lib/osiris/ui/usePredictions.js +102 -0
- package/lib/osiris/ui/usePredictions.js.map +1 -0
- package/lib/osiris-ui.d.ts +11 -0
- package/lib/osiris-ui.d.ts.map +1 -0
- package/lib/osiris-ui.js +11 -0
- package/lib/osiris-ui.js.map +1 -0
- package/lib/osiris.d.ts +17 -0
- package/lib/osiris.d.ts.map +1 -0
- package/lib/osiris.js +17 -0
- package/lib/osiris.js.map +1 -0
- package/lib/panel/ui/FilterInput.d.ts.map +1 -1
- package/lib/panel/ui/FilterInput.js +3 -1
- package/lib/panel/ui/FilterInput.js.map +1 -1
- package/lib/panel/ui/SidePanelItem.d.ts +39 -0
- package/lib/panel/ui/SidePanelItem.d.ts.map +1 -0
- package/lib/panel/ui/SidePanelItem.js +63 -0
- package/lib/panel/ui/SidePanelItem.js.map +1 -0
- package/lib/panel/ui/SidePanelStack.d.ts +11 -10
- package/lib/panel/ui/SidePanelStack.d.ts.map +1 -1
- package/lib/panel/ui/SidePanelStack.js +22 -15
- package/lib/panel/ui/SidePanelStack.js.map +1 -1
- package/lib/panel/ui/SpectrumColorSwatch.d.ts.map +1 -1
- package/lib/panel/ui/SpectrumColorSwatch.js +4 -2
- package/lib/panel/ui/SpectrumColorSwatch.js.map +1 -1
- package/lib/panel/ui/usePanelFolds.d.ts +35 -0
- package/lib/panel/ui/usePanelFolds.d.ts.map +1 -0
- package/lib/panel/ui/usePanelFolds.js +73 -0
- package/lib/panel/ui/usePanelFolds.js.map +1 -0
- package/lib/shared/ui/FullscreenStage.d.ts +43 -0
- package/lib/shared/ui/FullscreenStage.d.ts.map +1 -0
- package/lib/shared/ui/FullscreenStage.js +38 -0
- package/lib/shared/ui/FullscreenStage.js.map +1 -0
- package/lib/shared/ui/canFillScreen.d.ts +7 -0
- package/lib/shared/ui/canFillScreen.d.ts.map +1 -0
- package/lib/shared/ui/canFillScreen.js +9 -0
- package/lib/shared/ui/canFillScreen.js.map +1 -0
- package/lib/shared/ui/index.d.ts +3 -0
- package/lib/shared/ui/index.d.ts.map +1 -1
- package/lib/shared/ui/index.js +2 -0
- package/lib/shared/ui/index.js.map +1 -1
- package/lib/split/ui/splitPanes.d.ts +3 -3
- package/lib/split/ui/splitPanes.js +1 -1
- package/lib/structure/core/structureNotations.d.ts +8 -1
- package/lib/structure/core/structureNotations.d.ts.map +1 -1
- package/lib/structure/core/structureNotations.js +14 -8
- package/lib/structure/core/structureNotations.js.map +1 -1
- package/lib/structure/ui/StructureExportPanel.d.ts +8 -0
- package/lib/structure/ui/StructureExportPanel.d.ts.map +1 -1
- package/lib/structure/ui/StructureExportPanel.js +9 -4
- package/lib/structure/ui/StructureExportPanel.js.map +1 -1
- package/lib/structure/ui/index.d.ts +1 -0
- package/lib/structure/ui/index.d.ts.map +1 -1
- package/lib/structure/ui/index.js.map +1 -1
- package/package.json +4 -1
- package/src/card/core/cardAddress.ts +39 -3
- package/src/card/core/cardPageUrl.ts +10 -3
- package/src/card/core/index.ts +7 -1
- package/src/credits/core/credits.ts +40 -0
- package/src/download/core/downloadFigure.ts +26 -1
- package/src/download/core/figureDpi.ts +94 -0
- package/src/download/core/figurePng.ts +11 -2
- package/src/download/core/index.ts +13 -1
- package/src/download/core/pngDpi.ts +84 -0
- package/src/download/ui/FigureDownloadPanel.tsx +41 -51
- package/src/download/ui/figureDownloadHint.ts +13 -0
- package/src/download/ui/figureDownloadOptions.ts +85 -0
- package/src/download/ui/resolutionChoices.ts +67 -0
- package/src/download/ui/useFigureActions.ts +24 -9
- package/src/download/ui/useFigureDownload.tsx +57 -71
- package/src/ecosystem/core/sites.ts +14 -0
- package/src/ecosystem/core/types.ts +2 -1
- package/src/ecosystem/ui/glyphs.tsx +20 -0
- package/src/host/core/connectHost.ts +1 -1
- package/src/host/core/connectTool.ts +285 -0
- package/src/host/core/hostOutputs.ts +47 -5
- package/src/host/core/index.ts +20 -1
- package/src/host/core/kinds.ts +53 -8
- package/src/host/core/messageValues.ts +58 -0
- package/src/host/core/protocol.ts +5 -37
- package/src/host/core/resultKinds.ts +65 -0
- package/src/host/core/toolMessages.ts +160 -0
- package/src/host/ui/index.ts +6 -0
- package/src/host/ui/useFramedTool.ts +213 -0
- package/src/locales/de.json +30 -1
- package/src/locales/en.json +30 -1
- package/src/locales/es.json +30 -1
- package/src/locales/fr.json +30 -1
- package/src/locales/it.json +30 -1
- package/src/molecule3d/ui/Molecule3DStage.tsx +4 -88
- package/src/molecule3d/ui/MoleculeCanvas3D.tsx +10 -1
- package/src/molecule3d/ui/exportMoleculeImage.ts +22 -0
- package/src/molecule3d/ui/index.ts +4 -1
- package/src/molecule3d/ui/moleculeViewer3DProps.ts +24 -0
- package/src/molecule3d/ui/useImageExport.ts +28 -2
- package/src/osiris/core/barGeometry.ts +74 -0
- package/src/osiris/core/computeProperties.ts +175 -0
- package/src/osiris/core/constants.ts +110 -0
- package/src/osiris/core/fitness.ts +59 -0
- package/src/osiris/core/index.ts +78 -0
- package/src/osiris/core/poolSize.ts +24 -0
- package/src/osiris/core/poolTypes.ts +140 -0
- package/src/osiris/core/predictIdCode.ts +69 -0
- package/src/osiris/core/predictProtocol.ts +78 -0
- package/src/osiris/core/predictionPool.ts +237 -0
- package/src/osiris/core/predictionQueue.ts +89 -0
- package/src/osiris/core/predictors.ts +142 -0
- package/src/osiris/core/propertyKeys.ts +54 -0
- package/src/osiris/core/riskAppearance.ts +86 -0
- package/src/osiris/core/riskDetail.ts +120 -0
- package/src/osiris/core/riskDetailRequest.ts +64 -0
- package/src/osiris/core/riskFindings.ts +92 -0
- package/src/osiris/core/runPredictionJob.ts +49 -0
- package/src/osiris/core/scales.ts +236 -0
- package/src/osiris/core/types.ts +103 -0
- package/src/osiris/core/valuation.ts +44 -0
- package/src/osiris/ui/PropertyBar.tsx +77 -0
- package/src/osiris/ui/PropertyPanel.tsx +227 -0
- package/src/osiris/ui/PropertyRows.tsx +92 -0
- package/src/osiris/ui/RiskFindings.tsx +137 -0
- package/src/osiris/ui/RiskPanel.tsx +81 -0
- package/src/osiris/ui/RiskSquare.tsx +108 -0
- package/src/osiris/ui/index.ts +17 -0
- package/src/osiris/ui/usePredictions.ts +194 -0
- package/src/osiris-ui.ts +11 -0
- package/src/osiris.ts +17 -0
- package/src/panel/ui/FilterInput.tsx +4 -1
- package/src/panel/ui/SidePanelItem.tsx +162 -0
- package/src/panel/ui/SidePanelStack.tsx +29 -36
- package/src/panel/ui/SpectrumColorSwatch.tsx +5 -3
- package/src/panel/ui/usePanelFolds.ts +103 -0
- package/src/shared/ui/FullscreenStage.tsx +96 -0
- package/src/shared/ui/canFillScreen.ts +8 -0
- package/src/shared/ui/index.ts +6 -0
- package/src/split/ui/splitPanes.tsx +4 -4
- package/src/structure/core/structureNotations.ts +25 -8
- package/src/structure/ui/StructureExportPanel.tsx +23 -4
- package/src/structure/ui/index.ts +4 -0
- package/styles/osiris.css +339 -0
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The kinds a tool hands back to the page that frames it: a picture of what it
|
|
3
|
+
* shows, a name it worked out, a table of values it predicted.
|
|
4
|
+
*
|
|
5
|
+
* A host checks what comes back as a tool checks what it is sent: against the
|
|
6
|
+
* kind it asked for, stripped of the fields that kind does not name.
|
|
7
|
+
* `chem.name` is a category — a tool names its preferred IUPAC name
|
|
8
|
+
* `chem.name.iupac` — so a host asking for any name reads every one of them.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
/** `image.svg`: a picture, as an SVG document. */
|
|
12
|
+
export interface SvgImageValue {
|
|
13
|
+
/** The SVG document, as text. */
|
|
14
|
+
svg: string;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/** `chem.name`: a name a structure goes by. */
|
|
18
|
+
export interface NameValue {
|
|
19
|
+
/** The name, as written. */
|
|
20
|
+
name: string;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/** One cell of a `data.table`: a number, a text, or `null` where there is none. */
|
|
24
|
+
export type TableCell = string | number | null;
|
|
25
|
+
|
|
26
|
+
/** `data.table`: values laid out as a table, headings first. */
|
|
27
|
+
export interface TableValue {
|
|
28
|
+
/** The heading of each column, in order. */
|
|
29
|
+
columns: string[];
|
|
30
|
+
/** The rows, each holding one cell per column. */
|
|
31
|
+
rows: TableCell[][];
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** The schema of `image.svg`. */
|
|
35
|
+
export const SVG_IMAGE_SCHEMA = {
|
|
36
|
+
type: 'object',
|
|
37
|
+
properties: { svg: { type: 'string' } },
|
|
38
|
+
required: ['svg'],
|
|
39
|
+
additionalProperties: false,
|
|
40
|
+
} as const;
|
|
41
|
+
|
|
42
|
+
/** The schema of `chem.name`. */
|
|
43
|
+
export const NAME_SCHEMA = {
|
|
44
|
+
type: 'object',
|
|
45
|
+
properties: { name: { type: 'string' } },
|
|
46
|
+
required: ['name'],
|
|
47
|
+
additionalProperties: false,
|
|
48
|
+
} as const;
|
|
49
|
+
|
|
50
|
+
/** The schema of `data.table`. */
|
|
51
|
+
export const TABLE_SCHEMA = {
|
|
52
|
+
type: 'object',
|
|
53
|
+
properties: {
|
|
54
|
+
columns: { type: 'array', items: { type: 'string' } },
|
|
55
|
+
rows: {
|
|
56
|
+
type: 'array',
|
|
57
|
+
items: {
|
|
58
|
+
type: 'array',
|
|
59
|
+
items: { type: ['string', 'number', 'null'] },
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
required: ['columns', 'rows'],
|
|
64
|
+
additionalProperties: false,
|
|
65
|
+
} as const;
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a framed tool sends its host, read as the untrusted input it is: the
|
|
3
|
+
* `hello` it posts to the window, and on the port the `result` of each request
|
|
4
|
+
* and the `output` it sends when a value the host takes back changes.
|
|
5
|
+
*
|
|
6
|
+
* Anything that is not well formed is `null` and is ignored, as a tool ignores
|
|
7
|
+
* a request it does not know: a newer tool talking, not an error.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import {
|
|
11
|
+
MAX_LABEL_LENGTH,
|
|
12
|
+
isRecord,
|
|
13
|
+
readItems,
|
|
14
|
+
readStrings,
|
|
15
|
+
} from './messageValues.ts';
|
|
16
|
+
import type {
|
|
17
|
+
HelloMessage,
|
|
18
|
+
HostError,
|
|
19
|
+
HostErrorCode,
|
|
20
|
+
OutputMessage,
|
|
21
|
+
ResultMessage,
|
|
22
|
+
ToolInput,
|
|
23
|
+
ToolOutput,
|
|
24
|
+
UsedItem,
|
|
25
|
+
} from './protocol.ts';
|
|
26
|
+
import { HELLO_TYPE, PROTOCOL_VERSION } from './protocol.ts';
|
|
27
|
+
|
|
28
|
+
/** What a tool says of itself in `hello`. */
|
|
29
|
+
export type ToolHello = HelloMessage['tool'];
|
|
30
|
+
|
|
31
|
+
/** How long the sentence of an error may be, in characters; the rest is cut. */
|
|
32
|
+
const MAX_MESSAGE_LENGTH = 500;
|
|
33
|
+
|
|
34
|
+
const ERROR_CODES: readonly HostErrorCode[] = [
|
|
35
|
+
'invalid',
|
|
36
|
+
'unreadable',
|
|
37
|
+
'no-input',
|
|
38
|
+
'no-output',
|
|
39
|
+
];
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Read a tool's `hello`, in this version of the protocol.
|
|
43
|
+
* @param data - What the window delivered.
|
|
44
|
+
* @returns What the tool takes and gives, or `null` for anything else.
|
|
45
|
+
*/
|
|
46
|
+
export function readHello(data: unknown): ToolHello | null {
|
|
47
|
+
if (
|
|
48
|
+
!isRecord(data) ||
|
|
49
|
+
data.type !== HELLO_TYPE ||
|
|
50
|
+
data.version !== PROTOCOL_VERSION
|
|
51
|
+
) {
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
const { tool } = data;
|
|
55
|
+
if (
|
|
56
|
+
!isRecord(tool) ||
|
|
57
|
+
typeof tool.name !== 'string' ||
|
|
58
|
+
typeof tool.origin !== 'string'
|
|
59
|
+
) {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
return {
|
|
63
|
+
name: tool.name.slice(0, MAX_LABEL_LENGTH),
|
|
64
|
+
origin: tool.origin,
|
|
65
|
+
build: tool.build ?? null,
|
|
66
|
+
inputs: readInputs(tool.inputs),
|
|
67
|
+
outputs: readOutputs(tool.outputs),
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Read a message a tool sent through the port.
|
|
73
|
+
* @param data - What the port delivered.
|
|
74
|
+
* @returns The `result` or the `output`, or `null` for anything else.
|
|
75
|
+
*/
|
|
76
|
+
export function readToolMessage(
|
|
77
|
+
data: unknown,
|
|
78
|
+
): ResultMessage | OutputMessage | null {
|
|
79
|
+
if (!isRecord(data)) return null;
|
|
80
|
+
if (data.type === 'output') {
|
|
81
|
+
if (typeof data.document !== 'string' || !Array.isArray(data.items)) {
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
return {
|
|
85
|
+
type: 'output',
|
|
86
|
+
document: data.document,
|
|
87
|
+
items: readItems(data.items),
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
if (data.type !== 'result') return null;
|
|
91
|
+
const { id, ok, items, used, error } = data;
|
|
92
|
+
if (typeof id !== 'string') return null;
|
|
93
|
+
if (ok === true) {
|
|
94
|
+
return Array.isArray(items)
|
|
95
|
+
? { type: 'result', id, ok: true, items: readItems(items) }
|
|
96
|
+
: { type: 'result', id, ok: true, used: readUsed(used) };
|
|
97
|
+
}
|
|
98
|
+
return { type: 'result', id, ok: false, error: readError(error) };
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function readInputs(value: unknown): ToolInput[] {
|
|
102
|
+
const inputs: ToolInput[] = [];
|
|
103
|
+
if (!Array.isArray(value)) return inputs;
|
|
104
|
+
for (const entry of value) {
|
|
105
|
+
if (!isRecord(entry) || typeof entry.key !== 'string') continue;
|
|
106
|
+
const input: ToolInput = {
|
|
107
|
+
key: entry.key,
|
|
108
|
+
kinds: readStrings(entry.kinds),
|
|
109
|
+
};
|
|
110
|
+
if (entry.many === true) input.many = true;
|
|
111
|
+
if (entry.optional === true) input.optional = true;
|
|
112
|
+
inputs.push(input);
|
|
113
|
+
}
|
|
114
|
+
return inputs;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
function readOutputs(value: unknown): ToolOutput[] {
|
|
118
|
+
const outputs: ToolOutput[] = [];
|
|
119
|
+
if (!Array.isArray(value)) return outputs;
|
|
120
|
+
for (const entry of value) {
|
|
121
|
+
if (
|
|
122
|
+
isRecord(entry) &&
|
|
123
|
+
typeof entry.key === 'string' &&
|
|
124
|
+
typeof entry.kind === 'string'
|
|
125
|
+
) {
|
|
126
|
+
outputs.push({ key: entry.key, kind: entry.kind });
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return outputs;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
function readUsed(value: unknown): UsedItem[] {
|
|
133
|
+
const used: UsedItem[] = [];
|
|
134
|
+
if (!Array.isArray(value)) return used;
|
|
135
|
+
for (const entry of value) {
|
|
136
|
+
if (
|
|
137
|
+
isRecord(entry) &&
|
|
138
|
+
typeof entry.key === 'string' &&
|
|
139
|
+
typeof entry.kind === 'string'
|
|
140
|
+
) {
|
|
141
|
+
used.push({ key: entry.key, kind: entry.kind });
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return used;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
function readError(value: unknown): HostError {
|
|
148
|
+
const error: HostError = {
|
|
149
|
+
code: 'invalid',
|
|
150
|
+
message: 'The tool refused the request and gave no reason.',
|
|
151
|
+
};
|
|
152
|
+
if (!isRecord(value)) return error;
|
|
153
|
+
const code = ERROR_CODES.find((known) => known === value.code);
|
|
154
|
+
if (code !== undefined) error.code = code;
|
|
155
|
+
if (typeof value.message === 'string' && value.message.trim() !== '') {
|
|
156
|
+
error.message = value.message.slice(0, MAX_MESSAGE_LENGTH);
|
|
157
|
+
}
|
|
158
|
+
if (Array.isArray(value.errors)) error.errors = readStrings(value.errors);
|
|
159
|
+
return error;
|
|
160
|
+
}
|
package/src/host/ui/index.ts
CHANGED
|
@@ -1,2 +1,8 @@
|
|
|
1
|
+
export type {
|
|
2
|
+
FramedTool,
|
|
3
|
+
FramedToolOptions,
|
|
4
|
+
FramedToolStatus,
|
|
5
|
+
} from './useFramedTool.ts';
|
|
6
|
+
export { HELLO_TIMEOUT, useFramedTool } from './useFramedTool.ts';
|
|
1
7
|
export type { HostHandlers } from './useHostConnection.ts';
|
|
2
8
|
export { useHostConnection } from './useHostConnection.ts';
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Frame a tool of the family and talk to it: hand it the document to show,
|
|
3
|
+
* keep what it sends back, and ask it for other values.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
7
|
+
|
|
8
|
+
import type {
|
|
9
|
+
LoadOutcome,
|
|
10
|
+
ToolConnection,
|
|
11
|
+
ToolDocument,
|
|
12
|
+
} from '../core/connectTool.ts';
|
|
13
|
+
import { connectTool } from '../core/connectTool.ts';
|
|
14
|
+
import type { HostItem } from '../core/protocol.ts';
|
|
15
|
+
import type { ToolHello } from '../core/toolMessages.ts';
|
|
16
|
+
|
|
17
|
+
/** What {@link useFramedTool} frames, and what it hands over. */
|
|
18
|
+
export interface FramedToolOptions {
|
|
19
|
+
/**
|
|
20
|
+
* The address the frame opens, `?embed=1` included. Its origin is the only
|
|
21
|
+
* one talked to.
|
|
22
|
+
*/
|
|
23
|
+
url: string;
|
|
24
|
+
/** How the host introduces itself to the tool. */
|
|
25
|
+
host: string;
|
|
26
|
+
/**
|
|
27
|
+
* The document to show, or `null` while there is none. It is handed over
|
|
28
|
+
* whenever its `document` changes, and never twice in a row.
|
|
29
|
+
*/
|
|
30
|
+
document: ToolDocument | null;
|
|
31
|
+
/**
|
|
32
|
+
* How long the tool has to say `hello` before it counts as unavailable, in
|
|
33
|
+
* milliseconds.
|
|
34
|
+
* @default HELLO_TIMEOUT
|
|
35
|
+
*/
|
|
36
|
+
helloTimeout?: number;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/** Whether the tool answered: still loading, talking, or silent past the wait. */
|
|
40
|
+
export type FramedToolStatus = 'connecting' | 'connected' | 'unavailable';
|
|
41
|
+
|
|
42
|
+
/** A framed tool, as the host page sees it. */
|
|
43
|
+
export interface FramedTool {
|
|
44
|
+
/**
|
|
45
|
+
* The callback ref of the `<iframe>`, rendered with the hook and given no
|
|
46
|
+
* `src` of its own: the address is set once this page listens, so the
|
|
47
|
+
* tool's `hello` cannot be missed.
|
|
48
|
+
*/
|
|
49
|
+
attachFrame: (element: HTMLIFrameElement | null) => void;
|
|
50
|
+
/**
|
|
51
|
+
* Show the frame on the whole screen, from a click; Esc brings it back.
|
|
52
|
+
* Rejects where the browser will not.
|
|
53
|
+
*/
|
|
54
|
+
fullscreen: () => Promise<void>;
|
|
55
|
+
/** Whether the tool answered. */
|
|
56
|
+
status: FramedToolStatus;
|
|
57
|
+
/** What the tool said it takes and gives, once it has. */
|
|
58
|
+
tool: ToolHello | null;
|
|
59
|
+
/** What became of the document on screen, once the tool answered. */
|
|
60
|
+
outcome: LoadOutcome | null;
|
|
61
|
+
/**
|
|
62
|
+
* The values the document's `accept` names, by output key: those the tool
|
|
63
|
+
* held once it showed the document, then every change it sent.
|
|
64
|
+
*/
|
|
65
|
+
outputs: ReadonlyMap<string, HostItem>;
|
|
66
|
+
/** Ask for the current value of some outputs; rejects with the tool's reason. */
|
|
67
|
+
get: (keys: readonly string[]) => Promise<HostItem[]>;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* How long a tool has to say `hello`, in milliseconds: a cold start fetches the
|
|
72
|
+
* tool's page, its scripts and its fonts, on a slow line as well.
|
|
73
|
+
*/
|
|
74
|
+
export const HELLO_TIMEOUT = 20_000;
|
|
75
|
+
|
|
76
|
+
const NO_OUTPUTS: ReadonlyMap<string, HostItem> = new Map();
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Frame a tool, and keep it showing a document.
|
|
80
|
+
*
|
|
81
|
+
* The frame is opened once and stays: a new document goes to the tool through
|
|
82
|
+
* the protocol, the way a host hands over data, rather than as a new address
|
|
83
|
+
* that would reload the tool and lose what its visitor did in it. A tool that
|
|
84
|
+
* reloads all the same is handed the document again.
|
|
85
|
+
* @param options - See {@link FramedToolOptions}.
|
|
86
|
+
* @returns See {@link FramedTool}.
|
|
87
|
+
*/
|
|
88
|
+
export function useFramedTool(options: FramedToolOptions): FramedTool {
|
|
89
|
+
const { url, host, document, helloTimeout = HELLO_TIMEOUT } = options;
|
|
90
|
+
const frame = useRef<HTMLIFrameElement | null>(null);
|
|
91
|
+
const attachFrame = useCallback((element: HTMLIFrameElement | null) => {
|
|
92
|
+
frame.current = element;
|
|
93
|
+
}, []);
|
|
94
|
+
const connection = useRef<ToolConnection | null>(null);
|
|
95
|
+
const latest = useRef(document);
|
|
96
|
+
const [link, setLink] = useState<Link | null>(null);
|
|
97
|
+
const [answer, setAnswer] = useState<Answer | null>(null);
|
|
98
|
+
const [held, setHeld] = useState<Held | null>(null);
|
|
99
|
+
|
|
100
|
+
useEffect(() => {
|
|
101
|
+
latest.current = document;
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
useEffect(() => {
|
|
105
|
+
const element = frame.current;
|
|
106
|
+
if (element === null) return;
|
|
107
|
+
let greeted = false;
|
|
108
|
+
const opened = connectTool({
|
|
109
|
+
frame: () => element.contentWindow,
|
|
110
|
+
origin: new URL(url, globalThis.location.href).origin,
|
|
111
|
+
host: { name: host },
|
|
112
|
+
listen: (listener) => {
|
|
113
|
+
globalThis.addEventListener('message', listener);
|
|
114
|
+
return () => {
|
|
115
|
+
globalThis.removeEventListener('message', listener);
|
|
116
|
+
};
|
|
117
|
+
},
|
|
118
|
+
onHello: (tool) => {
|
|
119
|
+
greeted = true;
|
|
120
|
+
setLink({ url, status: 'connected', tool });
|
|
121
|
+
},
|
|
122
|
+
onOutput: (message) => {
|
|
123
|
+
setHeld((previous) =>
|
|
124
|
+
hold(previous, `${url}\n${message.document}`, message.items),
|
|
125
|
+
);
|
|
126
|
+
},
|
|
127
|
+
});
|
|
128
|
+
connection.current = opened;
|
|
129
|
+
const timer = setTimeout(() => {
|
|
130
|
+
if (!greeted) setLink({ url, status: 'unavailable', tool: null });
|
|
131
|
+
}, helloTimeout);
|
|
132
|
+
// Set once the listener exists, and again when the effect runs anew, so
|
|
133
|
+
// the tool greets this listener rather than one already closed.
|
|
134
|
+
element.src = url;
|
|
135
|
+
return () => {
|
|
136
|
+
clearTimeout(timer);
|
|
137
|
+
opened.close();
|
|
138
|
+
if (connection.current === opened) connection.current = null;
|
|
139
|
+
};
|
|
140
|
+
}, [url, host, helloTimeout]);
|
|
141
|
+
|
|
142
|
+
const name = document?.document ?? null;
|
|
143
|
+
useEffect(() => {
|
|
144
|
+
const opened = connection.current;
|
|
145
|
+
const shown = latest.current;
|
|
146
|
+
if (opened === null || shown === null) return;
|
|
147
|
+
const key = `${url}\n${shown.document}`;
|
|
148
|
+
void opened.load(shown).then(async (outcome) => {
|
|
149
|
+
setAnswer({ key, outcome });
|
|
150
|
+
const accept = shown.accept ?? [];
|
|
151
|
+
if (outcome.status !== 'loaded' || accept.length === 0) return;
|
|
152
|
+
// What the tool held once it showed the document is never sent unasked.
|
|
153
|
+
const items = await opened.get(accept).catch(() => []);
|
|
154
|
+
setHeld((previous) => hold(previous, key, items));
|
|
155
|
+
});
|
|
156
|
+
}, [name, url, host]);
|
|
157
|
+
|
|
158
|
+
const fullscreen = useCallback(async () => {
|
|
159
|
+
const element = frame.current;
|
|
160
|
+
if (element === null) throw new Error('The tool is not open.');
|
|
161
|
+
await element.requestFullscreen();
|
|
162
|
+
}, []);
|
|
163
|
+
|
|
164
|
+
const get = useCallback(async (keys: readonly string[]) => {
|
|
165
|
+
const opened = connection.current;
|
|
166
|
+
if (opened === null) {
|
|
167
|
+
throw new Error('The tool is not open, so it has nothing to give.');
|
|
168
|
+
}
|
|
169
|
+
return opened.get(keys);
|
|
170
|
+
}, []);
|
|
171
|
+
|
|
172
|
+
const key = name === null ? null : `${url}\n${name}`;
|
|
173
|
+
const current = link?.url === url ? link : null;
|
|
174
|
+
return {
|
|
175
|
+
attachFrame,
|
|
176
|
+
fullscreen,
|
|
177
|
+
status: current?.status ?? 'connecting',
|
|
178
|
+
tool: current?.tool ?? null,
|
|
179
|
+
outcome: answer !== null && answer.key === key ? answer.outcome : null,
|
|
180
|
+
outputs: held !== null && held.key === key ? held.outputs : NO_OUTPUTS,
|
|
181
|
+
get,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
interface Link {
|
|
186
|
+
url: string;
|
|
187
|
+
status: Exclude<FramedToolStatus, 'connecting'>;
|
|
188
|
+
tool: ToolHello | null;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
interface Answer {
|
|
192
|
+
key: string;
|
|
193
|
+
outcome: LoadOutcome;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
interface Held {
|
|
197
|
+
key: string;
|
|
198
|
+
outputs: ReadonlyMap<string, HostItem>;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
function hold(
|
|
202
|
+
previous: Held | null,
|
|
203
|
+
key: string,
|
|
204
|
+
items: readonly HostItem[],
|
|
205
|
+
): Held {
|
|
206
|
+
const outputs = new Map(
|
|
207
|
+
previous?.key === key ? previous.outputs : NO_OUTPUTS,
|
|
208
|
+
);
|
|
209
|
+
for (const item of items) {
|
|
210
|
+
if (item.key !== undefined) outputs.set(item.key, item);
|
|
211
|
+
}
|
|
212
|
+
return { key, outputs };
|
|
213
|
+
}
|
package/src/locales/de.json
CHANGED
|
@@ -114,6 +114,14 @@
|
|
|
114
114
|
"site.atoms.tagline": "Elektronen, Neutronen, Lewis-Formeln und Oxidationszahlen.",
|
|
115
115
|
"site.moles.tagline": "Eine Reaktion ausgleichen und ihre Massenzusammensetzung berechnen.",
|
|
116
116
|
"site.inorganic.tagline": "Eine anorganische Verbindung benennen und ihre Formel schreiben.",
|
|
117
|
+
"site.iupac-name.tagline": "Der IUPAC-Name einer Struktur, und die Struktur, die ein Name bezeichnet.",
|
|
118
|
+
"site.slides.tagline": "Ein laufendes Werkzeug auf eine Folie setzen, mit dem Link seiner Schaltfläche Teilen.",
|
|
119
|
+
"site.vibrations.tagline": "IR- und Raman-Spektren, im Browser berechnet.",
|
|
120
|
+
"site.draw.tagline": "Strukturen in Publikationsqualität, als SVG, das die Chemie behält.",
|
|
121
|
+
"site.molecules.tagline": "Ein Molekül nachschlagen, mit seinen berechneten Eigenschaften und Quellen.",
|
|
122
|
+
"site.chembio.tagline": "Naturstoffe, und die Organismen, in denen sie gefunden wurden.",
|
|
123
|
+
"site.wikidata.tagline": "Die Chemie der Wikipedia-Infoboxen, nach Struktur durchsuchbar.",
|
|
124
|
+
"site.mz.tagline": "Massenspektren, danach geordnet, wie sie gemessen wurden.",
|
|
117
125
|
"share.button": "Teilen",
|
|
118
126
|
"share.buttonTitle": "Einen Link zu dieser Seite teilen oder sie in Ihre eigene Website einbetten",
|
|
119
127
|
"share.dialogTitleFor": "{title} teilen oder einbetten",
|
|
@@ -282,10 +290,14 @@
|
|
|
282
290
|
"download.resolution": "Auflösung",
|
|
283
291
|
"download.resolutionHelp": "Wie viele Male größer als die Abbildung auf dem Bildschirm die Datei ist. Ein PNG bekommt entsprechend mehr Pixel: zwei passt für eine Folie, drei oder vier für den Druck. Ein SVG bleibt in jeder Größe scharf und öffnet sich entsprechend größer.",
|
|
284
292
|
"download.resolutionExample": "Eine auf dem Bildschirm 640 Pixel breite Abbildung wird 1280 Pixel breit gespeichert.",
|
|
293
|
+
"download.resolutionDpiHelp": "Punkte pro Zoll, wenn die Abbildung in ihrer Größe auf der Seite gedruckt wird. 150 genügt für eine Folie, 300 für die Fotos einer Zeitschrift, 600 bis 1200 für Strichzeichnungen. Das PNG gibt sie an, sodass ein Dokument es in dieser Größe platziert.",
|
|
294
|
+
"download.resolutionDpiExample": "Eine 8,5 cm breite Abbildung wird 1004 Pixel breit gespeichert.",
|
|
285
295
|
"download.noFigure": "Auf der Seite gibt es noch keine Abbildung zum Speichern.",
|
|
286
296
|
"download.hintRasterSvg": "Ein SVG, das ein Bild von {pixels} enthält: eine 3D-Szene hat keine Vektorform.",
|
|
287
297
|
"download.hintSvg": "Öffnet sich mit {pixels} und bleibt in jeder Größe scharf.",
|
|
288
298
|
"download.hintPng": "Gespeichert {pixels}.",
|
|
299
|
+
"download.hintSvgDpi": "Wird {width} × {height} cm groß gedruckt und bleibt in jeder Größe scharf.",
|
|
300
|
+
"download.hintPngDpi": "Gespeichert {pixels}, gedruckt {width} × {height} cm.",
|
|
289
301
|
"download.hintCopied": "In die Zwischenablage kopiert: PNG mit {pixels}.",
|
|
290
302
|
"download.copyUnsupported": "Dieser Browser kann kein Bild in die Zwischenablage legen. Speichern Sie es stattdessen.",
|
|
291
303
|
"download.size": "Größe",
|
|
@@ -794,5 +806,22 @@
|
|
|
794
806
|
"ir.raman.doc.sampled": "Eine Bande wird an dem abgetasteten Punkt angegeben, an dem sie ihr Maximum hat: Ihre Lage ist nur so genau wie das Raster, auf dem das Spektrum aufgenommen wurde.",
|
|
795
807
|
"ir.raman.aboutLead": "Zeichnet ein Raman-Spektrum, findet seine Banden und listet sie neben dem Diagramm auf.",
|
|
796
808
|
"ir.raman.credit.picking": "**ir-spectrum** (cheminfo, MIT) findet die Banden, mit dem Peakfinder von **common-spectrum** und **ml-gsd**.",
|
|
797
|
-
"ir.raman.credit.jcamp": "**convert-to-jcamp** (cheminfo, MIT) schreibt die heruntergeladene JCAMP-DX-Datei."
|
|
809
|
+
"ir.raman.credit.jcamp": "**convert-to-jcamp** (cheminfo, MIT) schreibt die heruntergeladene JCAMP-DX-Datei.",
|
|
810
|
+
"panel.focus": "Auf das Panel „{panel}“ konzentrieren",
|
|
811
|
+
"panel.focusTooltip": "Auf dieses Panel konzentrieren: alle anderen einklappen",
|
|
812
|
+
"panel.unfocusTooltip": "Die anderen Panels wieder ausklappen",
|
|
813
|
+
"panel.fillScreen": "Panel „{panel}“ im Vollbild zeigen",
|
|
814
|
+
"panel.fillScreenTooltip": "Dieses Panel im Vollbild zeigen",
|
|
815
|
+
"panel.fold": "Panel „{panel}“ einklappen",
|
|
816
|
+
"panel.unfold": "Panel „{panel}“ ausklappen",
|
|
817
|
+
"panel.foldTooltip": "Dieses Panel einklappen",
|
|
818
|
+
"panel.unfoldTooltip": "Ausklappen",
|
|
819
|
+
"panel.close": "Panel „{panel}“ schließen",
|
|
820
|
+
"panel.closeTooltip": "Dieses Panel schließen",
|
|
821
|
+
"panel.leaveFullScreen": "Vollbild verlassen",
|
|
822
|
+
"panel.leaveFullScreenTooltip": "Vollbild verlassen (Esc)",
|
|
823
|
+
"panel.clearFilter": "Filter leeren",
|
|
824
|
+
"panel.colourOf": "Farbe von {name}",
|
|
825
|
+
"panel.drawIn": "{name} in {color} zeichnen",
|
|
826
|
+
"panel.changeColour": "Dieses Spektrum in einer anderen Farbe zeichnen"
|
|
798
827
|
}
|
package/src/locales/en.json
CHANGED
|
@@ -114,6 +114,14 @@
|
|
|
114
114
|
"site.atoms.tagline": "Electrons, neutrons, Lewis structures and oxidation states.",
|
|
115
115
|
"site.moles.tagline": "Balance a reaction, and work out its mass composition.",
|
|
116
116
|
"site.inorganic.tagline": "Name an inorganic compound, and write its formula.",
|
|
117
|
+
"site.iupac-name.tagline": "The IUPAC name of a structure, and the structure a name denotes.",
|
|
118
|
+
"site.slides.tagline": "Put a live tool on a slide, from the link its Share button gives.",
|
|
119
|
+
"site.vibrations.tagline": "IR and Raman spectra computed in the browser.",
|
|
120
|
+
"site.draw.tagline": "Journal-grade structures, in an SVG that keeps the chemistry.",
|
|
121
|
+
"site.molecules.tagline": "Look up a molecule, its computed properties and its sources.",
|
|
122
|
+
"site.chembio.tagline": "Natural products, and the organisms they were found in.",
|
|
123
|
+
"site.wikidata.tagline": "The chemistry of Wikipedia’s infoboxes, searchable by structure.",
|
|
124
|
+
"site.mz.tagline": "Mass spectra, classified by how they were measured.",
|
|
117
125
|
"share.button": "Share",
|
|
118
126
|
"share.buttonTitle": "Share a link to this page, or embed it in your own site",
|
|
119
127
|
"share.dialogTitleFor": "Share or embed — {title}",
|
|
@@ -282,10 +290,14 @@
|
|
|
282
290
|
"download.resolution": "Resolution",
|
|
283
291
|
"download.resolutionHelp": "How many times the figure on screen the file is. A PNG gets that many more pixels: two is right for a slide, three or four for print. An SVG stays sharp at any size, and opens that many times larger.",
|
|
284
292
|
"download.resolutionExample": "A figure 640 pixels wide on screen is saved 1280 pixels wide.",
|
|
293
|
+
"download.resolutionDpiHelp": "Dots per inch, with the figure printed at its size on the page. 150 is enough for a slide, 300 for a journal's photographs, 600 to 1200 for line art. The PNG states it, so a document places it at that size.",
|
|
294
|
+
"download.resolutionDpiExample": "A figure 8.5 cm wide is saved 1004 pixels wide.",
|
|
285
295
|
"download.noFigure": "There is no figure on the page to save yet.",
|
|
286
296
|
"download.hintRasterSvg": "An SVG holding a picture of {pixels}: a 3D scene has no vector form.",
|
|
287
297
|
"download.hintSvg": "Opens at {pixels}, and stays sharp at any size.",
|
|
288
298
|
"download.hintPng": "Saved {pixels}.",
|
|
299
|
+
"download.hintSvgDpi": "Prints {width} × {height} cm, and stays sharp at any size.",
|
|
300
|
+
"download.hintPngDpi": "Saved {pixels}, which print {width} × {height} cm.",
|
|
289
301
|
"download.hintCopied": "Copied {pixels} to the clipboard, as a PNG.",
|
|
290
302
|
"download.copyUnsupported": "This browser cannot put a picture on the clipboard. Save it instead.",
|
|
291
303
|
"download.size": "Size",
|
|
@@ -794,5 +806,22 @@
|
|
|
794
806
|
"ir.raman.doc.sampled": "A band is reported at the sampled point it peaked on, so its position is only as precise as the grid the spectrum was recorded on.",
|
|
795
807
|
"ir.raman.aboutLead": "Draws a Raman spectrum, picks its bands and lists them beside the chart.",
|
|
796
808
|
"ir.raman.credit.picking": "**ir-spectrum** (cheminfo, MIT) picks the bands, with the peak picker of **common-spectrum** and **ml-gsd**.",
|
|
797
|
-
"ir.raman.credit.jcamp": "**convert-to-jcamp** (cheminfo, MIT) writes the JCAMP-DX download."
|
|
809
|
+
"ir.raman.credit.jcamp": "**convert-to-jcamp** (cheminfo, MIT) writes the JCAMP-DX download.",
|
|
810
|
+
"panel.focus": "Focus on the {panel} panel",
|
|
811
|
+
"panel.focusTooltip": "Focus on this panel: fold every other one away",
|
|
812
|
+
"panel.unfocusTooltip": "Unfold the other panels again",
|
|
813
|
+
"panel.fillScreen": "Fill the screen with the {panel} panel",
|
|
814
|
+
"panel.fillScreenTooltip": "Fill the screen with this panel",
|
|
815
|
+
"panel.fold": "Fold the {panel} panel",
|
|
816
|
+
"panel.unfold": "Unfold the {panel} panel",
|
|
817
|
+
"panel.foldTooltip": "Fold this panel away",
|
|
818
|
+
"panel.unfoldTooltip": "Unfold it",
|
|
819
|
+
"panel.close": "Close the {panel} panel",
|
|
820
|
+
"panel.closeTooltip": "Close this panel",
|
|
821
|
+
"panel.leaveFullScreen": "Leave full screen",
|
|
822
|
+
"panel.leaveFullScreenTooltip": "Leave full screen (Esc)",
|
|
823
|
+
"panel.clearFilter": "Clear the filter",
|
|
824
|
+
"panel.colourOf": "Colour of {name}",
|
|
825
|
+
"panel.drawIn": "Draw {name} in {color}",
|
|
826
|
+
"panel.changeColour": "Draw this spectrum in another colour"
|
|
798
827
|
}
|
package/src/locales/es.json
CHANGED
|
@@ -114,6 +114,14 @@
|
|
|
114
114
|
"site.atoms.tagline": "Electrones, neutrones, estructuras de Lewis y números de oxidación.",
|
|
115
115
|
"site.moles.tagline": "Ajustar una reacción y calcular su composición en masa.",
|
|
116
116
|
"site.inorganic.tagline": "Nombrar un compuesto inorgánico y escribir su fórmula.",
|
|
117
|
+
"site.iupac-name.tagline": "El nombre IUPAC de una estructura, y la estructura que designa un nombre.",
|
|
118
|
+
"site.slides.tagline": "Poner una herramienta en vivo en una diapositiva, con el enlace que da su botón Compartir.",
|
|
119
|
+
"site.vibrations.tagline": "Espectros IR y Raman calculados en el navegador.",
|
|
120
|
+
"site.draw.tagline": "Estructuras con calidad de publicación, en un SVG que conserva la química.",
|
|
121
|
+
"site.molecules.tagline": "Buscar una molécula, sus propiedades calculadas y sus fuentes.",
|
|
122
|
+
"site.chembio.tagline": "Productos naturales, y los organismos en los que se encontraron.",
|
|
123
|
+
"site.wikidata.tagline": "La química de las fichas de Wikipedia, con búsqueda por estructura.",
|
|
124
|
+
"site.mz.tagline": "Espectros de masas, clasificados según cómo se midieron.",
|
|
117
125
|
"share.button": "Compartir",
|
|
118
126
|
"share.buttonTitle": "Compartir un enlace a esta página, o incrustarla en su propio sitio",
|
|
119
127
|
"share.dialogTitleFor": "Compartir o incrustar — {title}",
|
|
@@ -282,10 +290,14 @@
|
|
|
282
290
|
"download.resolution": "Resolución",
|
|
283
291
|
"download.resolutionHelp": "Cuántas veces la figura en pantalla mide el archivo. Un PNG recibe tantos píxeles más: dos sirve para una diapositiva, tres o cuatro para imprimir. Un SVG se mantiene nítido a cualquier tamaño, y se abre tantas veces más grande.",
|
|
284
292
|
"download.resolutionExample": "Una figura de 640 píxeles de ancho en pantalla se guarda con 1280 píxeles de ancho.",
|
|
293
|
+
"download.resolutionDpiHelp": "Puntos por pulgada, con la figura impresa a su tamaño en la página. 150 basta para una diapositiva, 300 para las fotografías de una revista, de 600 a 1200 para el dibujo de línea. El PNG lo indica, así un documento lo coloca a ese tamaño.",
|
|
294
|
+
"download.resolutionDpiExample": "Una figura de 8,5 cm de ancho se guarda con 1004 píxeles de ancho.",
|
|
285
295
|
"download.noFigure": "Todavía no hay ninguna figura en la página que guardar.",
|
|
286
296
|
"download.hintRasterSvg": "Un SVG que contiene una imagen de {pixels}: una escena 3D no tiene forma vectorial.",
|
|
287
297
|
"download.hintSvg": "Se abre a {pixels}, y se mantiene nítido a cualquier tamaño.",
|
|
288
298
|
"download.hintPng": "Guardado {pixels}.",
|
|
299
|
+
"download.hintSvgDpi": "Se imprime a {width} × {height} cm, y se mantiene nítido a cualquier tamaño.",
|
|
300
|
+
"download.hintPngDpi": "Guardado {pixels}, que se imprimen a {width} × {height} cm.",
|
|
289
301
|
"download.hintCopied": "Copiado al portapapeles: PNG de {pixels}.",
|
|
290
302
|
"download.copyUnsupported": "Este navegador no puede poner una imagen en el portapapeles. Guárdala en su lugar.",
|
|
291
303
|
"download.size": "Tamaño",
|
|
@@ -794,5 +806,22 @@
|
|
|
794
806
|
"ir.raman.doc.sampled": "Una banda se da en el punto muestreado donde alcanza su máximo: su posición no es más precisa que la rejilla en la que se registró el espectro.",
|
|
795
807
|
"ir.raman.aboutLead": "Dibuja un espectro Raman, encuentra sus bandas y las enumera junto a la gráfica.",
|
|
796
808
|
"ir.raman.credit.picking": "**ir-spectrum** (cheminfo, MIT) encuentra las bandas, con el detector de picos de **common-spectrum** y **ml-gsd**.",
|
|
797
|
-
"ir.raman.credit.jcamp": "**convert-to-jcamp** (cheminfo, MIT) escribe el archivo JCAMP-DX descargado."
|
|
809
|
+
"ir.raman.credit.jcamp": "**convert-to-jcamp** (cheminfo, MIT) escribe el archivo JCAMP-DX descargado.",
|
|
810
|
+
"panel.focus": "Centrarse en el panel {panel}",
|
|
811
|
+
"panel.focusTooltip": "Centrarse en este panel: plegar todos los demás",
|
|
812
|
+
"panel.unfocusTooltip": "Desplegar de nuevo los demás paneles",
|
|
813
|
+
"panel.fillScreen": "Mostrar el panel {panel} a pantalla completa",
|
|
814
|
+
"panel.fillScreenTooltip": "Mostrar este panel a pantalla completa",
|
|
815
|
+
"panel.fold": "Plegar el panel {panel}",
|
|
816
|
+
"panel.unfold": "Desplegar el panel {panel}",
|
|
817
|
+
"panel.foldTooltip": "Plegar este panel",
|
|
818
|
+
"panel.unfoldTooltip": "Desplegarlo",
|
|
819
|
+
"panel.close": "Cerrar el panel {panel}",
|
|
820
|
+
"panel.closeTooltip": "Cerrar este panel",
|
|
821
|
+
"panel.leaveFullScreen": "Salir de la pantalla completa",
|
|
822
|
+
"panel.leaveFullScreenTooltip": "Salir de la pantalla completa (Esc)",
|
|
823
|
+
"panel.clearFilter": "Borrar el filtro",
|
|
824
|
+
"panel.colourOf": "Color de {name}",
|
|
825
|
+
"panel.drawIn": "Dibujar {name} en {color}",
|
|
826
|
+
"panel.changeColour": "Dibujar este espectro en otro color"
|
|
798
827
|
}
|
package/src/locales/fr.json
CHANGED
|
@@ -114,6 +114,14 @@
|
|
|
114
114
|
"site.atoms.tagline": "Électrons, neutrons, structures de Lewis et nombres d'oxydation.",
|
|
115
115
|
"site.moles.tagline": "Équilibrer une réaction, et en calculer la composition massique.",
|
|
116
116
|
"site.inorganic.tagline": "Nommer un composé inorganique, et en écrire la formule.",
|
|
117
|
+
"site.iupac-name.tagline": "Le nom IUPAC d'une structure, et la structure que désigne un nom.",
|
|
118
|
+
"site.slides.tagline": "Mettre un outil vivant sur une diapositive, avec le lien que donne son bouton Partager.",
|
|
119
|
+
"site.vibrations.tagline": "Spectres IR et Raman calculés dans le navigateur.",
|
|
120
|
+
"site.draw.tagline": "Des structures de qualité publication, dans un SVG qui garde la chimie.",
|
|
121
|
+
"site.molecules.tagline": "Rechercher une molécule, ses propriétés calculées et ses sources.",
|
|
122
|
+
"site.chembio.tagline": "Les produits naturels, et les organismes où ils ont été trouvés.",
|
|
123
|
+
"site.wikidata.tagline": "La chimie des infobox de Wikipédia, interrogeable par structure.",
|
|
124
|
+
"site.mz.tagline": "Des spectres de masse, classés selon la façon dont ils ont été mesurés.",
|
|
117
125
|
"share.button": "Partager",
|
|
118
126
|
"share.buttonTitle": "Partager un lien vers cette page, ou l'intégrer à votre propre site",
|
|
119
127
|
"share.dialogTitleFor": "Partager ou intégrer — {title}",
|
|
@@ -282,10 +290,14 @@
|
|
|
282
290
|
"download.resolution": "Résolution",
|
|
283
291
|
"download.resolutionHelp": "Combien de fois la figure à l'écran mesure le fichier. Un PNG reçoit d'autant plus de pixels : deux convient pour une diapositive, trois ou quatre pour l'impression. Un SVG reste net à toute taille, et s'ouvre d'autant plus grand.",
|
|
284
292
|
"download.resolutionExample": "Une figure large de 640 pixels à l'écran est enregistrée large de 1280 pixels.",
|
|
293
|
+
"download.resolutionDpiHelp": "Points par pouce, la figure étant imprimée à sa taille sur la page. 150 suffit pour une diapositive, 300 pour les photographies d'une revue, 600 à 1200 pour un dessin au trait. Le PNG l'indique, si bien qu'un document le place à cette taille.",
|
|
294
|
+
"download.resolutionDpiExample": "Une figure large de 8,5 cm est enregistrée large de 1004 pixels.",
|
|
285
295
|
"download.noFigure": "Il n'y a encore aucune figure à enregistrer sur la page.",
|
|
286
296
|
"download.hintRasterSvg": "Un SVG contenant une image de {pixels} : une scène 3D n'a pas de forme vectorielle.",
|
|
287
297
|
"download.hintSvg": "S'ouvre à {pixels}, et reste net à toute taille.",
|
|
288
298
|
"download.hintPng": "Enregistré {pixels}.",
|
|
299
|
+
"download.hintSvgDpi": "S'imprime en {width} × {height} cm, et reste net à toute taille.",
|
|
300
|
+
"download.hintPngDpi": "Enregistré {pixels}, qui s'impriment en {width} × {height} cm.",
|
|
289
301
|
"download.hintCopied": "Copié dans le presse-papiers : PNG de {pixels}.",
|
|
290
302
|
"download.copyUnsupported": "Ce navigateur ne peut pas copier une image dans le presse-papiers. Enregistrez-la plutôt.",
|
|
291
303
|
"download.size": "Taille",
|
|
@@ -794,5 +806,22 @@
|
|
|
794
806
|
"ir.raman.doc.sampled": "Une bande est donnée au point échantillonné où elle culmine : sa position n'est pas plus précise que la grille sur laquelle le spectre a été enregistré.",
|
|
795
807
|
"ir.raman.aboutLead": "Trace un spectre Raman, repère ses bandes et les liste à côté du graphique.",
|
|
796
808
|
"ir.raman.credit.picking": "**ir-spectrum** (cheminfo, MIT) repère les bandes, avec le détecteur de pics de **common-spectrum** et **ml-gsd**.",
|
|
797
|
-
"ir.raman.credit.jcamp": "**convert-to-jcamp** (cheminfo, MIT) écrit le fichier JCAMP-DX téléchargé."
|
|
809
|
+
"ir.raman.credit.jcamp": "**convert-to-jcamp** (cheminfo, MIT) écrit le fichier JCAMP-DX téléchargé.",
|
|
810
|
+
"panel.focus": "Se concentrer sur le panneau {panel}",
|
|
811
|
+
"panel.focusTooltip": "Se concentrer sur ce panneau : replier tous les autres",
|
|
812
|
+
"panel.unfocusTooltip": "Déplier de nouveau les autres panneaux",
|
|
813
|
+
"panel.fillScreen": "Afficher le panneau {panel} en plein écran",
|
|
814
|
+
"panel.fillScreenTooltip": "Afficher ce panneau en plein écran",
|
|
815
|
+
"panel.fold": "Replier le panneau {panel}",
|
|
816
|
+
"panel.unfold": "Déplier le panneau {panel}",
|
|
817
|
+
"panel.foldTooltip": "Replier ce panneau",
|
|
818
|
+
"panel.unfoldTooltip": "Le déplier",
|
|
819
|
+
"panel.close": "Fermer le panneau {panel}",
|
|
820
|
+
"panel.closeTooltip": "Fermer ce panneau",
|
|
821
|
+
"panel.leaveFullScreen": "Quitter le plein écran",
|
|
822
|
+
"panel.leaveFullScreenTooltip": "Quitter le plein écran (Échap)",
|
|
823
|
+
"panel.clearFilter": "Effacer le filtre",
|
|
824
|
+
"panel.colourOf": "Couleur de {name}",
|
|
825
|
+
"panel.drawIn": "Tracer {name} en {color}",
|
|
826
|
+
"panel.changeColour": "Tracer ce spectre dans une autre couleur"
|
|
798
827
|
}
|