react-cheminfo 0.66.0 → 0.67.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 +22 -11
- package/lib/download/ui/FigureDownloadPanel.d.ts +7 -1
- package/lib/download/ui/FigureDownloadPanel.d.ts.map +1 -1
- package/lib/download/ui/FigureDownloadPanel.js +2 -2
- package/lib/download/ui/FigureDownloadPanel.js.map +1 -1
- package/lib/ecosystem/core/sites.js +3 -3
- 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.js +1 -1
- package/lib/ecosystem/ui/glyphs.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/i18n/core/messageCatalog.d.ts +2 -2
- package/lib/i18n/vite/localeCatalog.d.ts +1 -1
- package/lib/ir/core/index.d.ts +2 -2
- package/lib/ir/core/index.d.ts.map +1 -1
- package/lib/ir/core/index.js.map +1 -1
- package/lib/ir/core/irEditorApi.d.ts +12 -0
- package/lib/ir/core/irEditorApi.d.ts.map +1 -1
- package/lib/ir/core/irReducer.d.ts +2 -2
- package/lib/ir/core/irReducer.d.ts.map +1 -1
- package/lib/ir/core/irSidePanels.d.ts +7 -1
- package/lib/ir/core/irSidePanels.d.ts.map +1 -1
- package/lib/ir/core/irState.d.ts +8 -5
- package/lib/ir/core/irState.d.ts.map +1 -1
- package/lib/ir/core/irState.js.map +1 -1
- package/lib/ir/ui/IrCanvas.d.ts +7 -0
- package/lib/ir/ui/IrCanvas.d.ts.map +1 -1
- package/lib/ir/ui/IrCanvas.js +8 -3
- package/lib/ir/ui/IrCanvas.js.map +1 -1
- package/lib/ir/ui/IrChart.d.ts.map +1 -1
- package/lib/ir/ui/IrChart.js +5 -1
- package/lib/ir/ui/IrChart.js.map +1 -1
- package/lib/ir/ui/IrEditor.d.ts +22 -4
- package/lib/ir/ui/IrEditor.d.ts.map +1 -1
- package/lib/ir/ui/IrEditor.js.map +1 -1
- package/lib/ir/ui/IrShell.d.ts +9 -1
- package/lib/ir/ui/IrShell.d.ts.map +1 -1
- package/lib/ir/ui/IrShell.js +4 -19
- package/lib/ir/ui/IrShell.js.map +1 -1
- package/lib/ir/ui/IrSidePanel.d.ts +11 -0
- package/lib/ir/ui/IrSidePanel.d.ts.map +1 -1
- package/lib/ir/ui/IrSidePanel.js +12 -3
- package/lib/ir/ui/IrSidePanel.js.map +1 -1
- package/lib/ir/ui/RamanEditor.d.ts +22 -4
- package/lib/ir/ui/RamanEditor.d.ts.map +1 -1
- package/lib/ir/ui/RamanEditor.js.map +1 -1
- package/lib/ir/ui/VibrationalEditor.d.ts +18 -4
- package/lib/ir/ui/VibrationalEditor.d.ts.map +1 -1
- package/lib/ir/ui/VibrationalEditor.js +4 -2
- package/lib/ir/ui/VibrationalEditor.js.map +1 -1
- package/lib/ir/ui/index.d.ts +1 -0
- package/lib/ir/ui/index.d.ts.map +1 -1
- package/lib/ir/ui/index.js.map +1 -1
- package/lib/ir/ui/irActions.d.ts +3 -3
- package/lib/ir/ui/irActions.d.ts.map +1 -1
- package/lib/ir/ui/irChartProps.d.ts +7 -0
- package/lib/ir/ui/irChartProps.d.ts.map +1 -1
- package/lib/ir/ui/irHostPanels.d.ts +53 -0
- package/lib/ir/ui/irHostPanels.d.ts.map +1 -0
- package/lib/ir/ui/irHostPanels.js +41 -0
- package/lib/ir/ui/irHostPanels.js.map +1 -0
- package/lib/ir/ui/useIrSide.d.ts +27 -0
- package/lib/ir/ui/useIrSide.d.ts.map +1 -0
- package/lib/ir/ui/useIrSide.js +42 -0
- package/lib/ir/ui/useIrSide.js.map +1 -0
- package/lib/ir/ui/useIrZoom.d.ts +8 -0
- package/lib/ir/ui/useIrZoom.d.ts.map +1 -1
- package/lib/ir/ui/useIrZoom.js +2 -1
- package/lib/ir/ui/useIrZoom.js.map +1 -1
- package/lib/locales/de.json +9 -1
- package/lib/locales/en.json +9 -1
- package/lib/locales/es.json +9 -1
- package/lib/locales/fr.json +9 -1
- package/lib/locales/it.json +9 -1
- package/lib/molecule3d/core/animatedPng.d.ts +25 -0
- package/lib/molecule3d/core/animatedPng.d.ts.map +1 -0
- package/lib/molecule3d/core/animatedPng.js +59 -0
- package/lib/molecule3d/core/animatedPng.js.map +1 -0
- package/lib/molecule3d/core/file.d.ts +24 -0
- package/lib/molecule3d/core/file.d.ts.map +1 -0
- package/lib/molecule3d/core/file.js +2 -0
- package/lib/molecule3d/core/file.js.map +1 -0
- package/lib/molecule3d/core/index.d.ts +4 -1
- package/lib/molecule3d/core/index.d.ts.map +1 -1
- package/lib/molecule3d/core/index.js +1 -0
- package/lib/molecule3d/core/index.js.map +1 -1
- package/lib/molecule3d/core/settings.d.ts +0 -7
- package/lib/molecule3d/core/settings.d.ts.map +1 -1
- package/lib/molecule3d/core/settings.js.map +1 -1
- package/lib/molecule3d/ui/Molecule3DExport.d.ts +10 -2
- package/lib/molecule3d/ui/Molecule3DExport.d.ts.map +1 -1
- package/lib/molecule3d/ui/Molecule3DExport.js +15 -2
- package/lib/molecule3d/ui/Molecule3DExport.js.map +1 -1
- package/lib/molecule3d/ui/Molecule3DToolbar.js +9 -2
- package/lib/molecule3d/ui/Molecule3DToolbar.js.map +1 -1
- package/lib/molecule3d/ui/MoleculeCanvas3D.d.ts.map +1 -1
- package/lib/molecule3d/ui/MoleculeCanvas3D.js +23 -41
- package/lib/molecule3d/ui/MoleculeCanvas3D.js.map +1 -1
- package/lib/molecule3d/ui/drawScene.d.ts +2 -1
- package/lib/molecule3d/ui/drawScene.d.ts.map +1 -1
- package/lib/molecule3d/ui/drawScene.js.map +1 -1
- package/lib/molecule3d/ui/exportMoleculeImage.d.ts +15 -1
- package/lib/molecule3d/ui/exportMoleculeImage.d.ts.map +1 -1
- package/lib/molecule3d/ui/exportMoleculeImage.js +14 -2
- package/lib/molecule3d/ui/exportMoleculeImage.js.map +1 -1
- package/lib/molecule3d/ui/moleculeFrames.d.ts +47 -0
- package/lib/molecule3d/ui/moleculeFrames.d.ts.map +1 -0
- package/lib/molecule3d/ui/moleculeFrames.js +65 -0
- package/lib/molecule3d/ui/moleculeFrames.js.map +1 -0
- package/lib/molecule3d/ui/moleculeViewer3DProps.d.ts +14 -1
- package/lib/molecule3d/ui/moleculeViewer3DProps.d.ts.map +1 -1
- package/lib/molecule3d/ui/renderMolecule.d.ts +3 -3
- package/lib/molecule3d/ui/renderMolecule.d.ts.map +1 -1
- package/lib/molecule3d/ui/renderMolecule.js +2 -1
- package/lib/molecule3d/ui/renderMolecule.js.map +1 -1
- package/lib/molecule3d/ui/sceneDrawer.d.ts +2 -1
- package/lib/molecule3d/ui/sceneDrawer.d.ts.map +1 -1
- package/lib/molecule3d/ui/sceneDrawer.js +9 -1
- package/lib/molecule3d/ui/sceneDrawer.js.map +1 -1
- package/lib/molecule3d/ui/useImageExport.d.ts +8 -3
- package/lib/molecule3d/ui/useImageExport.d.ts.map +1 -1
- package/lib/molecule3d/ui/useImageExport.js +13 -4
- package/lib/molecule3d/ui/useImageExport.js.map +1 -1
- package/lib/molecule3d/ui/useMoleculeScene.d.ts +2 -1
- package/lib/molecule3d/ui/useMoleculeScene.d.ts.map +1 -1
- package/lib/molecule3d/ui/useMoleculeScene.js.map +1 -1
- package/lib/molecule3d/ui/useMoleculeViewer.d.ts +16 -0
- package/lib/molecule3d/ui/useMoleculeViewer.d.ts.map +1 -0
- package/lib/molecule3d/ui/useMoleculeViewer.js +37 -0
- package/lib/molecule3d/ui/useMoleculeViewer.js.map +1 -0
- package/lib/molecule3d/ui/usePolarSurfaceArea.d.ts +3 -3
- package/lib/molecule3d/ui/usePolarSurfaceArea.d.ts.map +1 -1
- package/lib/molecule3d/ui/usePolarSurfaceArea.js +4 -3
- package/lib/molecule3d/ui/usePolarSurfaceArea.js.map +1 -1
- package/lib/molecule3d/ui/viewer.d.ts +4 -1
- package/lib/molecule3d/ui/viewer.d.ts.map +1 -1
- package/lib/molecule3d/ui/viewer.js +21 -19
- package/lib/molecule3d/ui/viewer.js.map +1 -1
- package/lib/molecule3d/ui/viewerTypes.d.ts +6 -0
- package/lib/molecule3d/ui/viewerTypes.d.ts.map +1 -1
- package/lib/molstar/core/captureScene.d.ts +19 -1
- package/lib/molstar/core/captureScene.d.ts.map +1 -1
- package/lib/molstar/core/captureScene.js +57 -2
- package/lib/molstar/core/captureScene.js.map +1 -1
- package/lib/molstar/core/index.d.ts +5 -2
- package/lib/molstar/core/index.d.ts.map +1 -1
- package/lib/molstar/core/index.js +4 -2
- package/lib/molstar/core/index.js.map +1 -1
- package/lib/molstar/core/trajectory.d.ts +56 -0
- package/lib/molstar/core/trajectory.d.ts.map +1 -0
- package/lib/molstar/core/trajectory.js +96 -0
- package/lib/molstar/core/trajectory.js.map +1 -0
- package/lib/panel/ui/PanelRail.d.ts.map +1 -1
- package/lib/panel/ui/PanelRail.js +1 -1
- package/lib/panel/ui/PanelRail.js.map +1 -1
- package/lib/raman.d.ts +2 -1
- package/lib/raman.d.ts.map +1 -1
- package/lib/raman.js.map +1 -1
- package/lib/router/core/basePath.d.ts +2 -2
- package/lib/router/core/basePath.js +2 -2
- package/lib/router/core/siteAddresses.d.ts +1 -1
- package/lib/router/core/siteAddresses.js +1 -1
- package/lib/seo/core/siteFiles.js +1 -1
- package/lib/seo/core/siteFiles.js.map +1 -1
- package/lib/server/answerAddresses.d.ts +3 -3
- package/lib/server/answerAddresses.js +3 -3
- package/lib/structure/core/index.d.ts +2 -0
- package/lib/structure/core/index.d.ts.map +1 -1
- package/lib/structure/core/index.js +1 -0
- package/lib/structure/core/index.js.map +1 -1
- package/lib/structure/core/structureTransfer.d.ts +29 -0
- package/lib/structure/core/structureTransfer.d.ts.map +1 -0
- package/lib/structure/core/structureTransfer.js +26 -0
- package/lib/structure/core/structureTransfer.js.map +1 -0
- package/lib/structure/ui/EditorImportButton.d.ts +20 -0
- package/lib/structure/ui/EditorImportButton.d.ts.map +1 -0
- package/lib/structure/ui/EditorImportButton.js +24 -0
- package/lib/structure/ui/EditorImportButton.js.map +1 -0
- package/lib/structure/ui/EditorImportProblem.d.ts +17 -0
- package/lib/structure/ui/EditorImportProblem.d.ts.map +1 -0
- package/lib/structure/ui/EditorImportProblem.js +32 -0
- package/lib/structure/ui/EditorImportProblem.js.map +1 -0
- package/lib/structure/ui/StructureDrop.d.ts +39 -0
- package/lib/structure/ui/StructureDrop.d.ts.map +1 -0
- package/lib/structure/ui/StructureDrop.js +19 -0
- package/lib/structure/ui/StructureDrop.js.map +1 -0
- package/lib/structure/ui/StructureDropOverlay.d.ts +16 -0
- package/lib/structure/ui/StructureDropOverlay.d.ts.map +1 -0
- package/lib/structure/ui/StructureDropOverlay.js +29 -0
- package/lib/structure/ui/StructureDropOverlay.js.map +1 -0
- package/lib/structure/ui/StructureEditor.d.ts +3 -80
- package/lib/structure/ui/StructureEditor.d.ts.map +1 -1
- package/lib/structure/ui/StructureEditor.js +21 -33
- package/lib/structure/ui/StructureEditor.js.map +1 -1
- package/lib/structure/ui/importedStructure.d.ts +25 -0
- package/lib/structure/ui/importedStructure.d.ts.map +1 -0
- package/lib/structure/ui/importedStructure.js +74 -0
- package/lib/structure/ui/importedStructure.js.map +1 -0
- package/lib/structure/ui/index.d.ts +2 -0
- package/lib/structure/ui/index.d.ts.map +1 -1
- package/lib/structure/ui/index.js +1 -0
- package/lib/structure/ui/index.js.map +1 -1
- package/lib/structure/ui/structureEditorProps.d.ts +98 -0
- package/lib/structure/ui/structureEditorProps.d.ts.map +1 -0
- package/lib/structure/ui/structureEditorProps.js +2 -0
- package/lib/structure/ui/structureEditorProps.js.map +1 -0
- package/lib/structure/ui/useDebouncedChange.d.ts +16 -0
- package/lib/structure/ui/useDebouncedChange.d.ts.map +1 -0
- package/lib/structure/ui/useDebouncedChange.js +30 -0
- package/lib/structure/ui/useDebouncedChange.js.map +1 -0
- package/lib/structure/ui/useStructureDrop.d.ts +30 -0
- package/lib/structure/ui/useStructureDrop.d.ts.map +1 -0
- package/lib/structure/ui/useStructureDrop.js +49 -0
- package/lib/structure/ui/useStructureDrop.js.map +1 -0
- package/lib/structure/ui/useStructureImport.d.ts +45 -0
- package/lib/structure/ui/useStructureImport.d.ts.map +1 -0
- package/lib/structure/ui/useStructureImport.js +62 -0
- package/lib/structure/ui/useStructureImport.js.map +1 -0
- package/package.json +4 -1
- package/src/download/ui/FigureDownloadPanel.tsx +9 -2
- package/src/ecosystem/core/sites.ts +3 -3
- package/src/ecosystem/core/types.ts +1 -1
- package/src/ecosystem/ui/glyphs.tsx +1 -1
- package/src/i18n/core/messageCatalog.ts +2 -2
- package/src/i18n/vite/localeCatalog.ts +1 -1
- package/src/ir/core/index.ts +6 -2
- package/src/ir/core/irEditorApi.ts +13 -0
- package/src/ir/core/irReducer.ts +2 -2
- package/src/ir/core/irSidePanels.ts +8 -1
- package/src/ir/core/irState.ts +8 -5
- package/src/ir/ui/IrCanvas.tsx +27 -2
- package/src/ir/ui/IrChart.tsx +11 -0
- package/src/ir/ui/IrEditor.tsx +22 -4
- package/src/ir/ui/IrShell.tsx +21 -22
- package/src/ir/ui/IrSidePanel.tsx +36 -10
- package/src/ir/ui/RamanEditor.tsx +22 -4
- package/src/ir/ui/VibrationalEditor.tsx +24 -5
- package/src/ir/ui/index.ts +1 -0
- package/src/ir/ui/irActions.ts +3 -3
- package/src/ir/ui/irChartProps.ts +7 -0
- package/src/ir/ui/irHostPanels.ts +76 -0
- package/src/ir/ui/useIrSide.ts +60 -0
- package/src/ir/ui/useIrZoom.ts +10 -0
- package/src/locales/de.json +9 -1
- package/src/locales/en.json +9 -1
- package/src/locales/es.json +9 -1
- package/src/locales/fr.json +9 -1
- package/src/locales/it.json +9 -1
- package/src/molecule3d/core/animatedPng.ts +79 -0
- package/src/molecule3d/core/file.ts +23 -0
- package/src/molecule3d/core/index.ts +3 -1
- package/src/molecule3d/core/settings.ts +0 -8
- package/src/molecule3d/ui/Molecule3DExport.tsx +43 -5
- package/src/molecule3d/ui/Molecule3DToolbar.tsx +9 -2
- package/src/molecule3d/ui/MoleculeCanvas3D.tsx +24 -38
- package/src/molecule3d/ui/drawScene.ts +2 -1
- package/src/molecule3d/ui/exportMoleculeImage.ts +28 -3
- package/src/molecule3d/ui/moleculeFrames.ts +88 -0
- package/src/molecule3d/ui/moleculeViewer3DProps.ts +14 -5
- package/src/molecule3d/ui/renderMolecule.ts +5 -3
- package/src/molecule3d/ui/sceneDrawer.ts +14 -2
- package/src/molecule3d/ui/useImageExport.ts +22 -5
- package/src/molecule3d/ui/useMoleculeScene.ts +2 -1
- package/src/molecule3d/ui/useMoleculeViewer.ts +46 -0
- package/src/molecule3d/ui/usePolarSurfaceArea.ts +6 -4
- package/src/molecule3d/ui/viewer.ts +34 -27
- package/src/molecule3d/ui/viewerTypes.ts +6 -0
- package/src/molstar/core/captureScene.ts +85 -2
- package/src/molstar/core/index.ts +13 -2
- package/src/molstar/core/trajectory.ts +117 -0
- package/src/panel/ui/PanelRail.tsx +3 -0
- package/src/raman.ts +2 -1
- package/src/router/core/basePath.ts +2 -2
- package/src/router/core/siteAddresses.ts +1 -1
- package/src/seo/core/siteFiles.ts +1 -1
- package/src/server/answerAddresses.ts +3 -3
- package/src/structure/core/index.ts +8 -0
- package/src/structure/core/structureTransfer.ts +37 -0
- package/src/structure/ui/EditorImportButton.tsx +59 -0
- package/src/structure/ui/EditorImportProblem.tsx +63 -0
- package/src/structure/ui/StructureDrop.tsx +66 -0
- package/src/structure/ui/StructureDropOverlay.tsx +50 -0
- package/src/structure/ui/StructureEditor.tsx +49 -134
- package/src/structure/ui/importedStructure.ts +83 -0
- package/src/structure/ui/index.ts +2 -0
- package/src/structure/ui/structureEditorProps.ts +103 -0
- package/src/structure/ui/useDebouncedChange.ts +41 -0
- package/src/structure/ui/useStructureDrop.ts +76 -0
- package/src/structure/ui/useStructureImport.ts +122 -0
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import type { CSSProperties } from 'react';
|
|
2
|
+
import type { CanvasEditorInputFormat } from 'react-ocl';
|
|
3
|
+
import type { StructureTransfer } from '../core/structureTransfer.ts';
|
|
4
|
+
import type { StructureEditorChange, StructureEditorMode } from './editorChange.ts';
|
|
5
|
+
/** What `StructureEditor` needs. */
|
|
6
|
+
export interface StructureEditorProps {
|
|
7
|
+
/**
|
|
8
|
+
* Called after every edit, once the drawing has been still for `debounce`
|
|
9
|
+
* milliseconds, with every notation read out of the editor.
|
|
10
|
+
*/
|
|
11
|
+
onChange: (change: StructureEditorChange) => void;
|
|
12
|
+
/**
|
|
13
|
+
* Draw a query fragment rather than a whole structure, which is what a
|
|
14
|
+
* substructure filter needs.
|
|
15
|
+
* @default false
|
|
16
|
+
*/
|
|
17
|
+
fragment?: boolean;
|
|
18
|
+
/**
|
|
19
|
+
* How `value` is written.
|
|
20
|
+
* @default 'idcode'
|
|
21
|
+
*/
|
|
22
|
+
inputFormat?: CanvasEditorInputFormat;
|
|
23
|
+
/**
|
|
24
|
+
* What the canvas holds. Read once, when the editor appears and again on
|
|
25
|
+
* every change of `revision`: the editor is uncontrolled, so feeding the
|
|
26
|
+
* drawing back into it would replace the structure and reset every
|
|
27
|
+
* coordinate under the pen.
|
|
28
|
+
* @default ''
|
|
29
|
+
*/
|
|
30
|
+
value?: string;
|
|
31
|
+
/**
|
|
32
|
+
* Bumped by the caller to load `value` into the canvas again, which is what
|
|
33
|
+
* an example, a share link or a Clear button does. Changing it discards
|
|
34
|
+
* whatever was being drawn.
|
|
35
|
+
* @default 0
|
|
36
|
+
*/
|
|
37
|
+
revision?: number;
|
|
38
|
+
/**
|
|
39
|
+
* How long the drawing has to be still before `onChange` is called, in
|
|
40
|
+
* milliseconds. Long enough that drawing a ring does not publish six
|
|
41
|
+
* structures; `0` reports every stroke.
|
|
42
|
+
* @default 300
|
|
43
|
+
*/
|
|
44
|
+
debounce?: number;
|
|
45
|
+
/**
|
|
46
|
+
* Smallest height of the drawing area, in pixels. Raised to whatever the
|
|
47
|
+
* toolbar needs, which is usually more.
|
|
48
|
+
* @default 320
|
|
49
|
+
*/
|
|
50
|
+
minHeight?: number;
|
|
51
|
+
/**
|
|
52
|
+
* Whether the editor draws one structure or a reaction. A reaction canvas
|
|
53
|
+
* has its own toolbar and its own arrow.
|
|
54
|
+
* @default 'molecule'
|
|
55
|
+
*/
|
|
56
|
+
mode?: StructureEditorMode;
|
|
57
|
+
/**
|
|
58
|
+
* Explain each toolbar button in a tooltip, and put a button in the corner
|
|
59
|
+
* that opens a guide to the mouse and the keyboard, which F1 opens too.
|
|
60
|
+
* @default true
|
|
61
|
+
*/
|
|
62
|
+
help?: boolean;
|
|
63
|
+
/**
|
|
64
|
+
* Put a button in the corner that opens every notation of the drawing — its
|
|
65
|
+
* SMILES, its molfiles, its canonical identifiers — and the picture of it,
|
|
66
|
+
* ready to copy or to save. A reaction has none of those, so it is never
|
|
67
|
+
* offered one.
|
|
68
|
+
* @default true
|
|
69
|
+
*/
|
|
70
|
+
exportable?: boolean;
|
|
71
|
+
/**
|
|
72
|
+
* Take a structure dropped on the canvas — a molfile, an SDF, a SMILES or
|
|
73
|
+
* an idCode, as a file or as text dragged from another page — and put a
|
|
74
|
+
* button in the corner that opens one from disk. A reaction canvas takes
|
|
75
|
+
* none.
|
|
76
|
+
* @default true
|
|
77
|
+
*/
|
|
78
|
+
importable?: boolean;
|
|
79
|
+
/**
|
|
80
|
+
* Take what is dropped or opened yourself instead of letting the editor read
|
|
81
|
+
* it, for a page that reads more than the canvas does — an XYZ, a PDB, a 3D
|
|
82
|
+
* geometry the canvas would flatten. The page then loads the structure back
|
|
83
|
+
* through `value` and `revision`, like any other.
|
|
84
|
+
* @default undefined
|
|
85
|
+
*/
|
|
86
|
+
onImport?: (transfer: StructureTransfer) => void;
|
|
87
|
+
/**
|
|
88
|
+
* Class the container carries, so a site can reach it from its stylesheet.
|
|
89
|
+
* @default undefined
|
|
90
|
+
*/
|
|
91
|
+
className?: string;
|
|
92
|
+
/**
|
|
93
|
+
* Extra style for the container, merged over the packaged one.
|
|
94
|
+
* @default undefined
|
|
95
|
+
*/
|
|
96
|
+
style?: CSSProperties;
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=structureEditorProps.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structureEditorProps.d.ts","sourceRoot":"","sources":["../../../src/structure/ui/structureEditorProps.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAC3C,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAC;AAEzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAEtE,OAAO,KAAK,EACV,qBAAqB,EACrB,mBAAmB,EACpB,MAAM,mBAAmB,CAAC;AAE3B,oCAAoC;AACpC,MAAM,WAAW,oBAAoB;IACnC;;;OAGG;IACH,QAAQ,EAAE,CAAC,MAAM,EAAE,qBAAqB,KAAK,IAAI,CAAC;IAClD;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;OAGG;IACH,WAAW,CAAC,EAAE,uBAAuB,CAAC;IACtC;;;;;;OAMG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,IAAI,CAAC,EAAE,mBAAmB,CAAC;IAC3B;;;;OAIG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,iBAAiB,KAAK,IAAI,CAAC;IACjD;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,KAAK,CAAC,EAAE,aAAa,CAAC;CACvB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structureEditorProps.js","sourceRoot":"","sources":["../../../src/structure/ui/structureEditorProps.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { StructureEditorChange } from './editorChange.ts';
|
|
2
|
+
/**
|
|
3
|
+
* Report the last edit of a burst rather than every one of them.
|
|
4
|
+
*
|
|
5
|
+
* The editor's own event is read out before the wait starts, so what arrives
|
|
6
|
+
* late is a plain object rather than a handle on an editor that has moved on.
|
|
7
|
+
* An editor removed mid-burst — a tab switched, a card folded — still reports
|
|
8
|
+
* its last edit, which would otherwise be lost with the timer.
|
|
9
|
+
* @param onChange - What the caller wants told.
|
|
10
|
+
* @param delay - How long the drawing has to be still, in milliseconds.
|
|
11
|
+
* @param resetKey - Dropped edits: a burst still waiting when the caller
|
|
12
|
+
* replaces the structure describes a canvas that no longer exists.
|
|
13
|
+
* @returns The handler to give the canvas.
|
|
14
|
+
*/
|
|
15
|
+
export declare function useDebouncedChange(onChange: (change: StructureEditorChange) => void, delay: number, resetKey: number): (change: StructureEditorChange) => void;
|
|
16
|
+
//# sourceMappingURL=useDebouncedChange.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useDebouncedChange.d.ts","sourceRoot":"","sources":["../../../src/structure/ui/useDebouncedChange.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAE/D;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,CAAC,MAAM,EAAE,qBAAqB,KAAK,IAAI,EACjD,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,GACf,CAAC,MAAM,EAAE,qBAAqB,KAAK,IAAI,CAiBzC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
2
|
+
import { createPendingCall } from "../core/pendingCall.js";
|
|
3
|
+
/**
|
|
4
|
+
* Report the last edit of a burst rather than every one of them.
|
|
5
|
+
*
|
|
6
|
+
* The editor's own event is read out before the wait starts, so what arrives
|
|
7
|
+
* late is a plain object rather than a handle on an editor that has moved on.
|
|
8
|
+
* An editor removed mid-burst — a tab switched, a card folded — still reports
|
|
9
|
+
* its last edit, which would otherwise be lost with the timer.
|
|
10
|
+
* @param onChange - What the caller wants told.
|
|
11
|
+
* @param delay - How long the drawing has to be still, in milliseconds.
|
|
12
|
+
* @param resetKey - Dropped edits: a burst still waiting when the caller
|
|
13
|
+
* replaces the structure describes a canvas that no longer exists.
|
|
14
|
+
* @returns The handler to give the canvas.
|
|
15
|
+
*/
|
|
16
|
+
export function useDebouncedChange(onChange, delay, resetKey) {
|
|
17
|
+
const [pending] = useState((createPendingCall));
|
|
18
|
+
const onChangeRef = useRef(onChange);
|
|
19
|
+
useEffect(() => {
|
|
20
|
+
onChangeRef.current = onChange;
|
|
21
|
+
});
|
|
22
|
+
useEffect(() => {
|
|
23
|
+
pending.drop();
|
|
24
|
+
}, [pending, resetKey]);
|
|
25
|
+
useEffect(() => () => pending.flush(), [pending]);
|
|
26
|
+
return useCallback((change) => {
|
|
27
|
+
pending.push(change, delay, (value) => onChangeRef.current(value));
|
|
28
|
+
}, [pending, delay]);
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=useDebouncedChange.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useDebouncedChange.js","sourceRoot":"","sources":["../../../src/structure/ui/useDebouncedChange.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAI3D;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,kBAAkB,CAChC,QAAiD,EACjD,KAAa,EACb,QAAgB;IAEhB,MAAM,CAAC,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAA,iBAAwC,CAAA,CAAC,CAAC;IACrE,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IACrC,SAAS,CAAC,GAAG,EAAE;QACb,WAAW,CAAC,OAAO,GAAG,QAAQ,CAAC;IACjC,CAAC,CAAC,CAAC;IACH,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,CAAC,IAAI,EAAE,CAAC;IACjB,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;IACxB,SAAS,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAElD,OAAO,WAAW,CAChB,CAAC,MAA6B,EAAE,EAAE;QAChC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IACrE,CAAC,EACD,CAAC,OAAO,EAAE,KAAK,CAAC,CACjB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { DragEvent } from 'react';
|
|
2
|
+
import type { StructureTransfer } from '../core/structureTransfer.ts';
|
|
3
|
+
/** The drag handlers of one element. */
|
|
4
|
+
export interface DropHandlers {
|
|
5
|
+
onDragEnter?: (event: DragEvent<HTMLElement>) => void;
|
|
6
|
+
onDragOver?: (event: DragEvent<HTMLElement>) => void;
|
|
7
|
+
onDragLeave?: (event: DragEvent<HTMLElement>) => void;
|
|
8
|
+
onDrop?: (event: DragEvent<HTMLElement>) => void;
|
|
9
|
+
}
|
|
10
|
+
/** A drop target, in two parts: the element and the overlay it raises. */
|
|
11
|
+
export interface StructureDropTarget {
|
|
12
|
+
/** Whether a file or text is being dragged over the target. */
|
|
13
|
+
over: boolean;
|
|
14
|
+
/** Put on the element that takes the drop. */
|
|
15
|
+
targetProps: DropHandlers;
|
|
16
|
+
/**
|
|
17
|
+
* Put on the overlay drawn while `over`. It covers the target and takes
|
|
18
|
+
* every drag event from then on, so moving across the canvas and the buttons
|
|
19
|
+
* underneath never reads as leaving, and leaving the overlay is leaving.
|
|
20
|
+
*/
|
|
21
|
+
overlayProps: DropHandlers;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Take a file or text dropped on an element.
|
|
25
|
+
* @param onDrop - Where the drop goes; `undefined` takes none.
|
|
26
|
+
* @returns Whether a drag is over the element, and the handlers to put on it
|
|
27
|
+
* and on its overlay.
|
|
28
|
+
*/
|
|
29
|
+
export declare function useStructureDrop(onDrop: ((transfer: StructureTransfer) => void) | undefined): StructureDropTarget;
|
|
30
|
+
//# sourceMappingURL=useStructureDrop.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useStructureDrop.d.ts","sourceRoot":"","sources":["../../../src/structure/ui/useStructureDrop.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAMtE,wCAAwC;AACxC,MAAM,WAAW,YAAY;IAC3B,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC;IACtD,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC;IACrD,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC;IACtD,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC;CAClD;AAED,0EAA0E;AAC1E,MAAM,WAAW,mBAAmB;IAClC,+DAA+D;IAC/D,IAAI,EAAE,OAAO,CAAC;IACd,8CAA8C;IAC9C,WAAW,EAAE,YAAY,CAAC;IAC1B;;;;OAIG;IACH,YAAY,EAAE,YAAY,CAAC;CAC5B;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,iBAAiB,KAAK,IAAI,CAAC,GAAG,SAAS,GAC1D,mBAAmB,CAoCrB"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { useMemo, useState } from 'react';
|
|
2
|
+
import { carriesStructure, readStructureTransfer, } from "../core/structureTransfer.js";
|
|
3
|
+
/**
|
|
4
|
+
* Take a file or text dropped on an element.
|
|
5
|
+
* @param onDrop - Where the drop goes; `undefined` takes none.
|
|
6
|
+
* @returns Whether a drag is over the element, and the handlers to put on it
|
|
7
|
+
* and on its overlay.
|
|
8
|
+
*/
|
|
9
|
+
export function useStructureDrop(onDrop) {
|
|
10
|
+
const [over, setOver] = useState(false);
|
|
11
|
+
return useMemo(() => {
|
|
12
|
+
if (onDrop === undefined) {
|
|
13
|
+
return { over: false, targetProps: {}, overlayProps: {} };
|
|
14
|
+
}
|
|
15
|
+
const accept = (event) => {
|
|
16
|
+
if (!carriesStructure(event.dataTransfer.types))
|
|
17
|
+
return false;
|
|
18
|
+
event.preventDefault();
|
|
19
|
+
event.dataTransfer.dropEffect = 'copy';
|
|
20
|
+
return true;
|
|
21
|
+
};
|
|
22
|
+
return {
|
|
23
|
+
over,
|
|
24
|
+
targetProps: {
|
|
25
|
+
onDragEnter: (event) => {
|
|
26
|
+
if (accept(event))
|
|
27
|
+
setOver(true);
|
|
28
|
+
},
|
|
29
|
+
onDragOver: accept,
|
|
30
|
+
},
|
|
31
|
+
overlayProps: {
|
|
32
|
+
onDragOver: accept,
|
|
33
|
+
onDragLeave: (event) => {
|
|
34
|
+
if (event.target === event.currentTarget)
|
|
35
|
+
setOver(false);
|
|
36
|
+
},
|
|
37
|
+
onDrop: (event) => {
|
|
38
|
+
setOver(false);
|
|
39
|
+
const transfer = readStructureTransfer(event.dataTransfer);
|
|
40
|
+
if (transfer === null)
|
|
41
|
+
return;
|
|
42
|
+
event.preventDefault();
|
|
43
|
+
onDrop(transfer);
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
}, [onDrop, over]);
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=useStructureDrop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useStructureDrop.js","sourceRoot":"","sources":["../../../src/structure/ui/useStructureDrop.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAG1C,OAAO,EACL,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,8BAA8B,CAAC;AAwBtC;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAC9B,MAA2D;IAE3D,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAExC,OAAO,OAAO,CAAC,GAAG,EAAE;QAClB,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC;QAC5D,CAAC;QACD,MAAM,MAAM,GAAG,CAAC,KAA6B,EAAW,EAAE;YACxD,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC;gBAAE,OAAO,KAAK,CAAC;YAC9D,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,KAAK,CAAC,YAAY,CAAC,UAAU,GAAG,MAAM,CAAC;YACvC,OAAO,IAAI,CAAC;QACd,CAAC,CAAC;QACF,OAAO;YACL,IAAI;YACJ,WAAW,EAAE;gBACX,WAAW,EAAE,CAAC,KAAK,EAAE,EAAE;oBACrB,IAAI,MAAM,CAAC,KAAK,CAAC;wBAAE,OAAO,CAAC,IAAI,CAAC,CAAC;gBACnC,CAAC;gBACD,UAAU,EAAE,MAAM;aACnB;YACD,YAAY,EAAE;gBACZ,UAAU,EAAE,MAAM;gBAClB,WAAW,EAAE,CAAC,KAAK,EAAE,EAAE;oBACrB,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,aAAa;wBAAE,OAAO,CAAC,KAAK,CAAC,CAAC;gBAC3D,CAAC;gBACD,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;oBAChB,OAAO,CAAC,KAAK,CAAC,CAAC;oBACf,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;oBAC3D,IAAI,QAAQ,KAAK,IAAI;wBAAE,OAAO;oBAC9B,KAAK,CAAC,cAAc,EAAE,CAAC;oBACvB,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACnB,CAAC;aACF;SACF,CAAC;IACJ,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;AACrB,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { StructureTransfer } from '../core/structureTransfer.ts';
|
|
2
|
+
import type { StructureEditorMoleculeChange } from './editorChange.ts';
|
|
3
|
+
/** What {@link useStructureImport} needs. */
|
|
4
|
+
export interface StructureImportOptions {
|
|
5
|
+
/** Bumped by the caller to load its own value, which drops any import. */
|
|
6
|
+
revision: number;
|
|
7
|
+
/** Whether the editor draws a query fragment. */
|
|
8
|
+
fragment: boolean;
|
|
9
|
+
/** The caller's own reader, which then takes every drop instead. */
|
|
10
|
+
onImport: ((transfer: StructureTransfer) => void) | undefined;
|
|
11
|
+
/** Where a structure the editor read goes: the path an edit takes. */
|
|
12
|
+
onRead: (change: StructureEditorMoleculeChange) => void;
|
|
13
|
+
}
|
|
14
|
+
/** Why the last drop loaded nothing. */
|
|
15
|
+
export interface StructureImportProblem {
|
|
16
|
+
/** The file that was read, `null` for dragged text. */
|
|
17
|
+
file: string | null;
|
|
18
|
+
}
|
|
19
|
+
/** The editor's imports, as the canvas and its corner need them. */
|
|
20
|
+
export interface StructureImport {
|
|
21
|
+
/**
|
|
22
|
+
* The idCode the canvas loads instead of the caller's value, `null` while it
|
|
23
|
+
* shows that value.
|
|
24
|
+
*/
|
|
25
|
+
idCode: string | null;
|
|
26
|
+
/** The canvas's key: a new one per import, which loads it. */
|
|
27
|
+
canvasKey: string;
|
|
28
|
+
/** Read a drop or a chosen file. */
|
|
29
|
+
load: (transfer: StructureTransfer) => void;
|
|
30
|
+
/** Why the last drop loaded nothing, `null` when it did. */
|
|
31
|
+
problem: StructureImportProblem | null;
|
|
32
|
+
/** Forget the problem. */
|
|
33
|
+
dismiss: () => void;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Load what is dropped on the editor, or opened from disk, into its canvas.
|
|
37
|
+
*
|
|
38
|
+
* The canvas is uncontrolled, so a dropped structure — one the editor never
|
|
39
|
+
* produced — remounts it with a new key, and is then reported like an edit.
|
|
40
|
+
* A drop overtaken by a later one is dropped rather than applied late.
|
|
41
|
+
* @param options - See {@link StructureImportOptions}.
|
|
42
|
+
* @returns See {@link StructureImport}.
|
|
43
|
+
*/
|
|
44
|
+
export declare function useStructureImport(options: StructureImportOptions): StructureImport;
|
|
45
|
+
//# sourceMappingURL=useStructureImport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useStructureImport.d.ts","sourceRoot":"","sources":["../../../src/structure/ui/useStructureImport.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAEtE,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,mBAAmB,CAAC;AAEvE,6CAA6C;AAC7C,MAAM,WAAW,sBAAsB;IACrC,0EAA0E;IAC1E,QAAQ,EAAE,MAAM,CAAC;IACjB,iDAAiD;IACjD,QAAQ,EAAE,OAAO,CAAC;IAClB,oEAAoE;IACpE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,iBAAiB,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAC9D,sEAAsE;IACtE,MAAM,EAAE,CAAC,MAAM,EAAE,6BAA6B,KAAK,IAAI,CAAC;CACzD;AAED,wCAAwC;AACxC,MAAM,WAAW,sBAAsB;IACrC,uDAAuD;IACvD,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB;AAED,oEAAoE;AACpE,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,8DAA8D;IAC9D,SAAS,EAAE,MAAM,CAAC;IAClB,oCAAoC;IACpC,IAAI,EAAE,CAAC,QAAQ,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC5C,4DAA4D;IAC5D,OAAO,EAAE,sBAAsB,GAAG,IAAI,CAAC;IACvC,0BAA0B;IAC1B,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AASD;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,sBAAsB,GAC9B,eAAe,CAyCjB"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { useCallback, useRef, useState } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* Load what is dropped on the editor, or opened from disk, into its canvas.
|
|
4
|
+
*
|
|
5
|
+
* The canvas is uncontrolled, so a dropped structure — one the editor never
|
|
6
|
+
* produced — remounts it with a new key, and is then reported like an edit.
|
|
7
|
+
* A drop overtaken by a later one is dropped rather than applied late.
|
|
8
|
+
* @param options - See {@link StructureImportOptions}.
|
|
9
|
+
* @returns See {@link StructureImport}.
|
|
10
|
+
*/
|
|
11
|
+
export function useStructureImport(options) {
|
|
12
|
+
const { revision, fragment, onImport, onRead } = options;
|
|
13
|
+
const [imported, setImported] = useState(null);
|
|
14
|
+
const [problem, setProblem] = useState(null);
|
|
15
|
+
const token = useRef(0);
|
|
16
|
+
const load = useCallback((transfer) => {
|
|
17
|
+
setProblem(null);
|
|
18
|
+
if (onImport !== undefined) {
|
|
19
|
+
onImport(transfer);
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
const current = ++token.current;
|
|
23
|
+
void readTransfer(transfer, fragment).then(({ file, change }) => {
|
|
24
|
+
if (current !== token.current)
|
|
25
|
+
return;
|
|
26
|
+
if (change === null) {
|
|
27
|
+
setProblem({ file });
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
setImported((previous) => ({
|
|
31
|
+
revision,
|
|
32
|
+
count: previous?.revision === revision ? previous.count + 1 : 1,
|
|
33
|
+
idCode: change.idCode,
|
|
34
|
+
}));
|
|
35
|
+
onRead(change);
|
|
36
|
+
});
|
|
37
|
+
}, [fragment, onImport, onRead, revision]);
|
|
38
|
+
const dismiss = useCallback(() => setProblem(null), []);
|
|
39
|
+
const current = imported?.revision === revision ? imported : null;
|
|
40
|
+
return {
|
|
41
|
+
idCode: current?.idCode ?? null,
|
|
42
|
+
canvasKey: `${revision}.${current?.count ?? 0}`,
|
|
43
|
+
load,
|
|
44
|
+
problem,
|
|
45
|
+
dismiss,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
async function readTransfer(transfer, fragment) {
|
|
49
|
+
const file = transfer.kind === 'files' ? transfer.files[0] : undefined;
|
|
50
|
+
try {
|
|
51
|
+
const text = transfer.kind === 'text' ? transfer.text : ((await file?.text()) ?? '');
|
|
52
|
+
const { readImportedStructure } = await import("./importedStructure.js");
|
|
53
|
+
return {
|
|
54
|
+
file: file?.name ?? null,
|
|
55
|
+
change: readImportedStructure(text, fragment),
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return { file: file?.name ?? null, change: null };
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=useStructureImport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useStructureImport.js","sourceRoot":"","sources":["../../../src/structure/ui/useStructureImport.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-cheminfo",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.67.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "React components, hooks and framework-free helpers shared by the cheminfo sites: site chrome, citations, sharing, routing, pedagogy, charts, and the structure, orbital and 3D molecule viewers",
|
|
6
6
|
"author": "Luc Patiny",
|
|
@@ -71,6 +71,7 @@
|
|
|
71
71
|
},
|
|
72
72
|
"dependencies": {
|
|
73
73
|
"@formatjs/icu-messageformat-parser": "^3.5.20",
|
|
74
|
+
"@pdf-lib/upng": "^1.0.1",
|
|
74
75
|
"@tanstack/react-virtual": "^3.14.13",
|
|
75
76
|
"ajv": "^8.20.0",
|
|
76
77
|
"cheminfo-font": "^1.28.0",
|
|
@@ -97,6 +98,7 @@
|
|
|
97
98
|
"@playwright/test": "^1.62.1",
|
|
98
99
|
"@storybook/addon-docs": "^10.5.8",
|
|
99
100
|
"@storybook/react-vite": "^10.5.8",
|
|
101
|
+
"@testing-library/dom": "^10.4.2",
|
|
100
102
|
"@types/node": "^26.2.0",
|
|
101
103
|
"@types/react": "^19.2.18",
|
|
102
104
|
"@types/react-dom": "^19.2.4",
|
|
@@ -109,6 +111,7 @@
|
|
|
109
111
|
"eslint": "^9.39.5",
|
|
110
112
|
"eslint-config-cheminfo-react": "^20.1.0",
|
|
111
113
|
"eslint-config-cheminfo-typescript": "^22.1.0",
|
|
114
|
+
"fast-png": "^8.0.0",
|
|
112
115
|
"fastify": "^5.12.7",
|
|
113
116
|
"jsdom": "^30.1.1",
|
|
114
117
|
"ml-dataset-iris": "^1.2.1",
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ReactElement } from 'react';
|
|
1
|
+
import type { ReactElement, ReactNode } from 'react';
|
|
2
2
|
|
|
3
3
|
import { useChromeT } from '../../i18n/ui/useT.ts';
|
|
4
4
|
import { OverlayAction } from '../../overlay/ui/OverlayAction.tsx';
|
|
@@ -67,6 +67,12 @@ export interface FigureDownloadPanelProps {
|
|
|
67
67
|
* @default undefined
|
|
68
68
|
*/
|
|
69
69
|
sizing?: FigureSizing;
|
|
70
|
+
/**
|
|
71
|
+
* Rows of the figure's own, shown after the format: what else decides the
|
|
72
|
+
* file, such as which frames of an animation go into it.
|
|
73
|
+
* @default undefined
|
|
74
|
+
*/
|
|
75
|
+
children?: ReactNode;
|
|
70
76
|
}
|
|
71
77
|
|
|
72
78
|
/**
|
|
@@ -93,7 +99,7 @@ export function FigureDownloadPanel(
|
|
|
93
99
|
): ReactElement {
|
|
94
100
|
const { title, format, scale, scales, size, failure, saving } = props;
|
|
95
101
|
const { onFormatChange, onScaleChange, onSave, rasterSvg = false } = props;
|
|
96
|
-
const { sizing, onCopy, notice = null } = props;
|
|
102
|
+
const { sizing, onCopy, notice = null, children } = props;
|
|
97
103
|
const t = useChromeT();
|
|
98
104
|
|
|
99
105
|
// What the file is drawn at: the figure on screen, or the shape picked.
|
|
@@ -142,6 +148,7 @@ export function FigureDownloadPanel(
|
|
|
142
148
|
options={FORMAT_CHOICES}
|
|
143
149
|
onChange={onFormatChange}
|
|
144
150
|
/>
|
|
151
|
+
{children}
|
|
145
152
|
{sizing === undefined ? null : (
|
|
146
153
|
<FigureSizeRows sizing={sizing} size={size} />
|
|
147
154
|
)}
|
|
@@ -141,9 +141,9 @@ export const ECOSYSTEM_SITES: readonly EcosystemSite[] = [
|
|
|
141
141
|
mark: { plate: '#1e293b', accent: '#127ba3' },
|
|
142
142
|
},
|
|
143
143
|
{
|
|
144
|
-
id: '
|
|
145
|
-
name: { lead: '
|
|
146
|
-
host: '
|
|
144
|
+
id: 'isomers',
|
|
145
|
+
name: { lead: 'isomers', alt: 'cheminfo', dot: true },
|
|
146
|
+
host: 'isomers.cheminfo.org',
|
|
147
147
|
tagline: 'Every constitutional isomer of a molecular formula.',
|
|
148
148
|
group: 'structures',
|
|
149
149
|
brand: '#4338ca',
|
|
@@ -26,7 +26,7 @@ export type MessagesLoader = () => Promise<{ default: Messages }>;
|
|
|
26
26
|
/**
|
|
27
27
|
* A key the catalog declares, or any other string.
|
|
28
28
|
*
|
|
29
|
-
* Many keys are built from the data — `site.
|
|
29
|
+
* Many keys are built from the data — `site.isomers.tagline`, `element.Fe.name`
|
|
30
30
|
* — so a row added before the catalogs have caught up must read as itself
|
|
31
31
|
* rather than fail to compile.
|
|
32
32
|
*/
|
|
@@ -51,7 +51,7 @@ export interface TranslateOptions {
|
|
|
51
51
|
export interface MessageCatalogOptions<TKey extends string> {
|
|
52
52
|
/**
|
|
53
53
|
* The name the page knows the catalog by, unique on the page, e.g.
|
|
54
|
-
* `react-cheminfo` or `
|
|
54
|
+
* `react-cheminfo` or `isomers.cheminfo.org`.
|
|
55
55
|
*/
|
|
56
56
|
id: string;
|
|
57
57
|
/** The GitHub repository the files live in, written `owner/repo`. */
|
|
@@ -38,7 +38,7 @@ import { DEFAULT_LANGUAGE, LANGUAGES, MessageCatalog } from '../core/index.ts';
|
|
|
38
38
|
export interface LocaleCatalogSource {
|
|
39
39
|
/**
|
|
40
40
|
* The name the page knows the catalog by, which is the site's host, e.g.
|
|
41
|
-
* `
|
|
41
|
+
* `isomers.cheminfo.org`. A translator's edit is routed back to the right
|
|
42
42
|
* repository with it, so the build and the page must agree on it.
|
|
43
43
|
*/
|
|
44
44
|
id: string;
|
package/src/ir/core/index.ts
CHANGED
|
@@ -50,7 +50,11 @@ export {
|
|
|
50
50
|
fittedTo,
|
|
51
51
|
fullDomain,
|
|
52
52
|
} from './irDomain.ts';
|
|
53
|
-
export type {
|
|
53
|
+
export type {
|
|
54
|
+
IrEditorHandle,
|
|
55
|
+
IrPlotClick,
|
|
56
|
+
ZoomToBandOptions,
|
|
57
|
+
} from './irEditorApi.ts';
|
|
54
58
|
export {
|
|
55
59
|
ABSORBANCE_DECIMALS,
|
|
56
60
|
INTENSITY_DIGITS,
|
|
@@ -129,5 +133,5 @@ export {
|
|
|
129
133
|
} from './spectrumJcamp.ts';
|
|
130
134
|
export type { ToIrSpectrumOptions } from './toIrSpectrum.ts';
|
|
131
135
|
export { toIrSpectra, toIrSpectrum } from './toIrSpectrum.ts';
|
|
132
|
-
export type { IrSidePanelId } from './irSidePanels.ts';
|
|
136
|
+
export type { IrPanelId, IrSidePanelId } from './irSidePanels.ts';
|
|
133
137
|
export { irSidePanels } from './irSidePanels.ts';
|
|
@@ -42,3 +42,16 @@ export interface IrEditorHandle {
|
|
|
42
42
|
/** Point the panels at one spectrum, or at none. */
|
|
43
43
|
selectSpectrum: (id: string | null) => void;
|
|
44
44
|
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* A click on the plot, as the viewer tells its host about it.
|
|
48
|
+
*
|
|
49
|
+
* A click is a press let go over the plot without travelling: the end of a
|
|
50
|
+
* zoom drag is never one, and a click on the axis labels is not reported.
|
|
51
|
+
*/
|
|
52
|
+
export interface IrPlotClick {
|
|
53
|
+
/** Where it landed on the horizontal axis, in cm⁻¹ — a Raman shift for Raman. */
|
|
54
|
+
wavenumber: number;
|
|
55
|
+
/** Identity of the spectrum selected when it was made, `null` for none. */
|
|
56
|
+
spectrumId: string | null;
|
|
57
|
+
}
|
package/src/ir/core/irReducer.ts
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
* closed.
|
|
14
14
|
*/
|
|
15
15
|
|
|
16
|
-
import type {
|
|
16
|
+
import type { IrPanelId } from './irSidePanels.ts';
|
|
17
17
|
import type { IrDomain, IrSpectrum } from './irSpectrum.ts';
|
|
18
18
|
import type { IrSettings, IrState, IrTool, PartialIrState } from './irState.ts';
|
|
19
19
|
import { isIrWindow, mergeIrSettings } from './irState.ts';
|
|
@@ -30,7 +30,7 @@ export type IrAction =
|
|
|
30
30
|
| { type: 'setDomain'; domain: IrDomain }
|
|
31
31
|
| { type: 'resetDomain' }
|
|
32
32
|
| { type: 'setTool'; tool: IrTool }
|
|
33
|
-
| { type: 'togglePanel'; panelId:
|
|
33
|
+
| { type: 'togglePanel'; panelId: IrPanelId }
|
|
34
34
|
| { type: 'setError'; error: string | null }
|
|
35
35
|
| { type: 'setSettings'; settings: Partial<IrSettings> }
|
|
36
36
|
| { type: 'loadState'; state: PartialIrState }
|
|
@@ -16,5 +16,12 @@ export const irSidePanels = [
|
|
|
16
16
|
icon: ActivityBarItemProps['icon'];
|
|
17
17
|
}>;
|
|
18
18
|
|
|
19
|
-
/** Identity of one of the panels the
|
|
19
|
+
/** Identity of one of the panels the viewer offers of its own. */
|
|
20
20
|
export type IrSidePanelId = (typeof irSidePanels)[number]['id'];
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Identity of any panel the side can hold: one of the viewer's own, or one a
|
|
24
|
+
* host added to them. Still a union with the viewer's own ids, so those keep
|
|
25
|
+
* autocompleting where a plain `string` would swallow them.
|
|
26
|
+
*/
|
|
27
|
+
export type IrPanelId = IrSidePanelId | (string & Record<never, never>);
|
package/src/ir/core/irState.ts
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
* a stale band is then impossible rather than merely unlikely.
|
|
14
14
|
*/
|
|
15
15
|
|
|
16
|
-
import type { IrSidePanelId } from './irSidePanels.ts';
|
|
16
|
+
import type { IrPanelId, IrSidePanelId } from './irSidePanels.ts';
|
|
17
17
|
import type { IrDomain, IrMode, IrSpectrum } from './irSpectrum.ts';
|
|
18
18
|
import type { IrTechnique } from './irTechnique.ts';
|
|
19
19
|
import { defaultIrMode, irModeFor, offersIrMode } from './irTechnique.ts';
|
|
@@ -42,8 +42,11 @@ export interface IrView {
|
|
|
42
42
|
domain: IrDomain | null;
|
|
43
43
|
/** Which tool a drag across the chart is running. */
|
|
44
44
|
tool: IrTool;
|
|
45
|
-
/**
|
|
46
|
-
|
|
45
|
+
/**
|
|
46
|
+
* The side panels that are open: the viewer's own and any a host added. An id
|
|
47
|
+
* no panel on offer answers to opens nothing.
|
|
48
|
+
*/
|
|
49
|
+
openPanelIds: IrPanelId[];
|
|
47
50
|
/** Why the last action was refused, `null` as soon as one succeeds. */
|
|
48
51
|
error: string | null;
|
|
49
52
|
}
|
|
@@ -139,10 +142,10 @@ export interface CreateIrStateOptions {
|
|
|
139
142
|
*/
|
|
140
143
|
settings?: Partial<IrSettings>;
|
|
141
144
|
/**
|
|
142
|
-
* The panels open to begin with.
|
|
145
|
+
* The panels open to begin with, the viewer's own or a host's.
|
|
143
146
|
* @default DEFAULT_SIDE_PANELS
|
|
144
147
|
*/
|
|
145
|
-
panelIds?:
|
|
148
|
+
panelIds?: readonly IrPanelId[];
|
|
146
149
|
}
|
|
147
150
|
|
|
148
151
|
/**
|