react-cheminfo 0.72.0 → 0.74.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 +29 -8
- package/lib/citation/core/formats.d.ts.map +1 -1
- package/lib/citation/core/formats.js +65 -17
- package/lib/citation/core/formats.js.map +1 -1
- package/lib/citation/core/index.d.ts +3 -2
- package/lib/citation/core/index.d.ts.map +1 -1
- package/lib/citation/core/index.js +2 -1
- package/lib/citation/core/index.js.map +1 -1
- package/lib/citation/core/openChemistryPaper.d.ts +15 -0
- package/lib/citation/core/openChemistryPaper.d.ts.map +1 -0
- package/lib/citation/core/openChemistryPaper.js +33 -0
- package/lib/citation/core/openChemistryPaper.js.map +1 -0
- package/lib/citation/core/reference.d.ts +36 -3
- package/lib/citation/core/reference.d.ts.map +1 -1
- package/lib/citation/core/reference.js +11 -0
- package/lib/citation/core/reference.js.map +1 -1
- package/lib/citation/core/segments.d.ts +9 -2
- package/lib/citation/core/segments.d.ts.map +1 -1
- package/lib/citation/core/segments.js +74 -7
- package/lib/citation/core/segments.js.map +1 -1
- package/lib/citation/ui/CitationMenu.js +2 -2
- package/lib/citation/ui/CitationMenu.js.map +1 -1
- package/lib/citation/ui/WorkEntry.d.ts.map +1 -1
- package/lib/citation/ui/WorkEntry.js +4 -2
- package/lib/citation/ui/WorkEntry.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/locales/de.json +23 -0
- package/lib/locales/en.json +23 -0
- package/lib/locales/es.json +23 -0
- package/lib/locales/fr.json +23 -0
- package/lib/locales/it.json +23 -0
- package/lib/structure/core/fragmentIdCode.d.ts +15 -0
- package/lib/structure/core/fragmentIdCode.d.ts.map +1 -0
- package/lib/structure/core/fragmentIdCode.js +25 -0
- package/lib/structure/core/fragmentIdCode.js.map +1 -0
- 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/structureSearch.d.ts +44 -0
- package/lib/structure/core/structureSearch.d.ts.map +1 -0
- package/lib/structure/core/structureSearch.js +31 -0
- package/lib/structure/core/structureSearch.js.map +1 -0
- package/lib/structure/core/substructureMatch.d.ts +33 -0
- package/lib/structure/core/substructureMatch.d.ts.map +1 -0
- package/lib/structure/core/substructureMatch.js +73 -0
- package/lib/structure/core/substructureMatch.js.map +1 -0
- package/lib/structure/ui/Structure.d.ts +18 -0
- package/lib/structure/ui/Structure.d.ts.map +1 -1
- package/lib/structure/ui/Structure.js +2 -2
- package/lib/structure/ui/Structure.js.map +1 -1
- package/lib/structure/ui/StructureSearchDialog.d.ts +55 -0
- package/lib/structure/ui/StructureSearchDialog.d.ts.map +1 -0
- package/lib/structure/ui/StructureSearchDialog.js +77 -0
- package/lib/structure/ui/StructureSearchDialog.js.map +1 -0
- package/lib/structure/ui/StructureSvg.d.ts +9 -0
- package/lib/structure/ui/StructureSvg.d.ts.map +1 -1
- package/lib/structure/ui/StructureSvg.js +7 -2
- package/lib/structure/ui/StructureSvg.js.map +1 -1
- package/lib/structure/ui/index.d.ts +4 -0
- package/lib/structure/ui/index.d.ts.map +1 -1
- package/lib/structure/ui/index.js +2 -0
- package/lib/structure/ui/index.js.map +1 -1
- package/lib/structure/ui/useStructureSearchModes.d.ts +18 -0
- package/lib/structure/ui/useStructureSearchModes.d.ts.map +1 -0
- package/lib/structure/ui/useStructureSearchModes.js +36 -0
- package/lib/structure/ui/useStructureSearchModes.js.map +1 -0
- package/package.json +12 -12
- package/src/citation/core/formats.ts +81 -18
- package/src/citation/core/index.ts +11 -2
- package/src/citation/core/openChemistryPaper.ts +37 -0
- package/src/citation/core/reference.ts +43 -3
- package/src/citation/core/segments.ts +92 -16
- package/src/citation/ui/CitationMenu.tsx +2 -2
- package/src/citation/ui/WorkEntry.tsx +7 -3
- package/src/locales/de.json +23 -0
- package/src/locales/en.json +23 -0
- package/src/locales/es.json +23 -0
- package/src/locales/fr.json +23 -0
- package/src/locales/it.json +23 -0
- package/src/structure/core/fragmentIdCode.ts +25 -0
- package/src/structure/core/index.ts +10 -0
- package/src/structure/core/structureSearch.ts +68 -0
- package/src/structure/core/substructureMatch.ts +85 -0
- package/src/structure/ui/Structure.tsx +24 -0
- package/src/structure/ui/StructureSearchDialog.tsx +218 -0
- package/src/structure/ui/StructureSvg.tsx +35 -0
- package/src/structure/ui/index.ts +4 -0
- package/src/structure/ui/useStructureSearchModes.ts +51 -0
- package/styles/chrome.css +31 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"substructureMatch.d.ts","sourceRoot":"","sources":["../../../src/structure/core/substructureMatch.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,QAAQ,EAAc,MAAM,aAAa,CAAC;AAInD,6DAA6D;AAC7D,MAAM,WAAW,iBAAiB;IAChC,mEAAmE;IACnE,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,mEAAmE;IACnE,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,MAAM,GACZ,iBAAiB,CAgCnB"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Where a query fragment sits in a molecule, as the atoms and bonds to paint.
|
|
3
|
+
*
|
|
4
|
+
* **Not exported from `core/index.ts`**: it value-imports `openchemlib`, so a
|
|
5
|
+
* barrel carrying it would pull the whole library into every site that imports
|
|
6
|
+
* `react-cheminfo/core`. Only the lazily loaded depiction calls it.
|
|
7
|
+
*/
|
|
8
|
+
import { Molecule, SSSearcher } from 'openchemlib';
|
|
9
|
+
import { isEmptyIdCode, splitIdCode } from "./editorValue.js";
|
|
10
|
+
/**
|
|
11
|
+
* Find every match of a query in a molecule, merged into one set of atoms and
|
|
12
|
+
* bonds.
|
|
13
|
+
*
|
|
14
|
+
* Every match is painted, not only the first: a query for a phenyl ring that a
|
|
15
|
+
* molecule carries twice is shown twice. A bond is painted only when it is a
|
|
16
|
+
* bond of the query, so a ring closing between two matched atoms that the
|
|
17
|
+
* query leaves open stays unpainted. The query is read as a fragment whether
|
|
18
|
+
* or not it was drawn as one — a molecule not flagged as a fragment only ever
|
|
19
|
+
* matches itself, which is never what a substructure search asked.
|
|
20
|
+
* @param molecule - The molecule the depiction draws; its atom order is the
|
|
21
|
+
* one the indices refer to.
|
|
22
|
+
* @param query - The query as an openchemlib idCode, coordinates included or
|
|
23
|
+
* not.
|
|
24
|
+
* @returns The covered atoms and bonds, both empty when nothing matches.
|
|
25
|
+
*/
|
|
26
|
+
export function substructureMatch(molecule, query) {
|
|
27
|
+
if (isEmptyIdCode(query))
|
|
28
|
+
return { atoms: [], bonds: [] };
|
|
29
|
+
const fragment = Molecule.fromIDCode(splitIdCode(query).idCode);
|
|
30
|
+
fragment.setFragment(true);
|
|
31
|
+
const searcher = new SSSearcher();
|
|
32
|
+
searcher.setMol(fragment, molecule);
|
|
33
|
+
if (searcher.findFragmentInMolecule({ countMode: 'overlapping' }) === 0) {
|
|
34
|
+
return { atoms: [], bonds: [] };
|
|
35
|
+
}
|
|
36
|
+
const atomCovered = new Uint8Array(molecule.getAllAtoms());
|
|
37
|
+
const bondCovered = new Uint8Array(molecule.getAllBonds());
|
|
38
|
+
const fragmentBonds = fragment.getAllBonds();
|
|
39
|
+
for (const match of searcher.getMatchList()) {
|
|
40
|
+
for (const target of match) {
|
|
41
|
+
// An exclude group of the query maps onto nothing.
|
|
42
|
+
if (target >= 0)
|
|
43
|
+
atomCovered[target] = 1;
|
|
44
|
+
}
|
|
45
|
+
for (let bond = 0; bond < fragmentBonds; bond++) {
|
|
46
|
+
const first = match[fragment.getBondAtom(0, bond)] ?? -1;
|
|
47
|
+
const second = match[fragment.getBondAtom(1, bond)] ?? -1;
|
|
48
|
+
if (first < 0 || second < 0)
|
|
49
|
+
continue;
|
|
50
|
+
const target = molecule.getBond(first, second);
|
|
51
|
+
if (target >= 0)
|
|
52
|
+
bondCovered[target] = 1;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return {
|
|
56
|
+
atoms: coveredIndices(atomCovered),
|
|
57
|
+
bonds: coveredIndices(bondCovered),
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* The positions of a flag array that are set, in ascending order.
|
|
62
|
+
* @param flags - One flag per atom or bond.
|
|
63
|
+
* @returns The indices whose flag is set.
|
|
64
|
+
*/
|
|
65
|
+
function coveredIndices(flags) {
|
|
66
|
+
const indices = [];
|
|
67
|
+
for (let index = 0; index < flags.length; index++) {
|
|
68
|
+
if (flags[index] === 1)
|
|
69
|
+
indices.push(index);
|
|
70
|
+
}
|
|
71
|
+
return indices;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=substructureMatch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"substructureMatch.js","sourceRoot":"","sources":["../../../src/structure/core/substructureMatch.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEnD,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAU9D;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,iBAAiB,CAC/B,QAAkB,EAClB,KAAa;IAEb,IAAI,aAAa,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IAC1D,MAAM,QAAQ,GAAG,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC;IAChE,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAE3B,MAAM,QAAQ,GAAG,IAAI,UAAU,EAAE,CAAC;IAClC,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACpC,IAAI,QAAQ,CAAC,sBAAsB,CAAC,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;QACxE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IAClC,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,UAAU,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;IAC3D,MAAM,WAAW,GAAG,IAAI,UAAU,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;IAC3D,MAAM,aAAa,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IAC7C,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,YAAY,EAAE,EAAE,CAAC;QAC5C,KAAK,MAAM,MAAM,IAAI,KAAK,EAAE,CAAC;YAC3B,mDAAmD;YACnD,IAAI,MAAM,IAAI,CAAC;gBAAE,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC3C,CAAC;QACD,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,aAAa,EAAE,IAAI,EAAE,EAAE,CAAC;YAChD,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YACzD,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YAC1D,IAAI,KAAK,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC;gBAAE,SAAS;YACtC,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAC/C,IAAI,MAAM,IAAI,CAAC;gBAAE,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAED,OAAO;QACL,KAAK,EAAE,cAAc,CAAC,WAAW,CAAC;QAClC,KAAK,EAAE,cAAc,CAAC,WAAW,CAAC;KACnC,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAS,cAAc,CAAC,KAAiB;IACvC,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QAClD,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -120,6 +120,24 @@ export interface StructureProps {
|
|
|
120
120
|
* @default '#ffd8a8'
|
|
121
121
|
*/
|
|
122
122
|
bondHighlightColor?: string;
|
|
123
|
+
/**
|
|
124
|
+
* A query fragment, as an openchemlib idCode, whose every match is painted —
|
|
125
|
+
* atoms and bonds alike, so the hit reads as one shape. When set, it takes
|
|
126
|
+
* the place of `atomHighlight` and `bondHighlight`.
|
|
127
|
+
* @default undefined
|
|
128
|
+
*/
|
|
129
|
+
substructure?: string;
|
|
130
|
+
/**
|
|
131
|
+
* The colour the `substructure` match is painted.
|
|
132
|
+
* @default '#ffd500'
|
|
133
|
+
*/
|
|
134
|
+
substructureColor?: string;
|
|
135
|
+
/**
|
|
136
|
+
* How opaque the `substructure` match is painted, from 0 to 1. Light, so the
|
|
137
|
+
* bonds and the atom labels under it stay legible.
|
|
138
|
+
* @default 0.15
|
|
139
|
+
*/
|
|
140
|
+
substructureOpacity?: number;
|
|
123
141
|
/**
|
|
124
142
|
* Called with the index of the atom that was clicked, counted from 0 as
|
|
125
143
|
* openchemlib counts atoms.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Structure.d.ts","sourceRoot":"","sources":["../../../src/structure/ui/Structure.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGrD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAUhE,sEAAsE;AACtE,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,oCAAoC;AACpC,MAAM,WAAW,cAAc;IAC7B;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;IACxC;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB;;;OAGG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB;;;OAGG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;;OAIG;IACH,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC;;;OAGG;IACH,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,YAAY,
|
|
1
|
+
{"version":3,"file":"Structure.d.ts","sourceRoot":"","sources":["../../../src/structure/ui/Structure.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGrD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAUhE,sEAAsE;AACtE,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,oCAAoC;AACpC,MAAM,WAAW,cAAc;IAC7B;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;IACxC;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB;;;OAGG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB;;;OAGG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;;;OAKG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B;;;;OAIG;IACH,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC;;;OAGG;IACH,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,YAAY,CA+D7D"}
|
|
@@ -18,11 +18,11 @@ const StructureSvg = lazy(async () => {
|
|
|
18
18
|
* @returns The picture, or the placeholder.
|
|
19
19
|
*/
|
|
20
20
|
export function Structure(props) {
|
|
21
|
-
const { idCode, coordinates, molfile, smiles, width = 200, height = 140, labels = {}, atomLabels, atomLabelPlacement = 'beside', autoCrop = true, autoCropMargin = 4, atomHighlight, atomHighlightColor = '#a5d8ff', bondHighlight, bondHighlightColor = '#ffd8a8', onAtomClick, onBondClick, fallback = '—', } = props;
|
|
21
|
+
const { idCode, coordinates, molfile, smiles, width = 200, height = 140, labels = {}, atomLabels, atomLabelPlacement = 'beside', autoCrop = true, autoCropMargin = 4, atomHighlight, atomHighlightColor = '#a5d8ff', bondHighlight, bondHighlightColor = '#ffd8a8', substructure, substructureColor = '#ffd500', substructureOpacity = 0.15, onAtomClick, onBondClick, fallback = '—', } = props;
|
|
22
22
|
const source = structureSource({ idCode, coordinates, molfile, smiles });
|
|
23
23
|
if (source.kind === 'empty') {
|
|
24
24
|
return (_jsx(StructurePlaceholder, { width: width, height: height, children: fallback }));
|
|
25
25
|
}
|
|
26
|
-
return (_jsx(Suspense, { fallback: _jsx(StructurePlaceholder, { width: width, height: height }), children: _jsx(StructureSvg, { source: source, width: width, height: height, autoCrop: autoCrop, autoCropMargin: autoCropMargin, atomHighlight: atomHighlight, atomHighlightColor: atomHighlightColor, bondHighlight: bondHighlight, bondHighlightColor: bondHighlightColor, showAtomNumber: labels.atoms ?? false, showBondNumber: labels.bonds ?? false, showMapping: labels.mapping ?? false, showCIPParity: labels.stereo ?? false, label: labels.caption, atomLabels: atomLabels, atomLabelPlacement: atomLabelPlacement, onAtomClick: onAtomClick, onBondClick: onBondClick, fallback: fallback }) }));
|
|
26
|
+
return (_jsx(Suspense, { fallback: _jsx(StructurePlaceholder, { width: width, height: height }), children: _jsx(StructureSvg, { source: source, width: width, height: height, autoCrop: autoCrop, autoCropMargin: autoCropMargin, atomHighlight: atomHighlight, atomHighlightColor: atomHighlightColor, bondHighlight: bondHighlight, bondHighlightColor: bondHighlightColor, substructure: substructure, substructureColor: substructureColor, substructureOpacity: substructureOpacity, showAtomNumber: labels.atoms ?? false, showBondNumber: labels.bonds ?? false, showMapping: labels.mapping ?? false, showCIPParity: labels.stereo ?? false, label: labels.caption, atomLabels: atomLabels, atomLabelPlacement: atomLabelPlacement, onAtomClick: onAtomClick, onBondClick: onBondClick, fallback: fallback }) }));
|
|
27
27
|
}
|
|
28
28
|
//# sourceMappingURL=Structure.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Structure.js","sourceRoot":"","sources":["../../../src/structure/ui/Structure.tsx"],"names":[],"mappings":";AAWA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AAGvC,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAE7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA4B,CAAC;AAElE,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE;IACnC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,mBAAoB,CAAC,CAAC;IAClD,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,YAAY,EAAE,CAAC;AAC1C,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"Structure.js","sourceRoot":"","sources":["../../../src/structure/ui/Structure.tsx"],"names":[],"mappings":";AAWA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AAGvC,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAE7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA4B,CAAC;AAElE,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE;IACnC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,mBAAoB,CAAC,CAAC;IAClD,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,YAAY,EAAE,CAAC;AAC1C,CAAC,CAAC,CAAC;AAwJH;;;;;;;;;;GAUG;AACH,MAAM,UAAU,SAAS,CAAC,KAAqB;IAC7C,MAAM,EACJ,MAAM,EACN,WAAW,EACX,OAAO,EACP,MAAM,EACN,KAAK,GAAG,GAAG,EACX,MAAM,GAAG,GAAG,EACZ,MAAM,GAAG,EAAE,EACX,UAAU,EACV,kBAAkB,GAAG,QAAQ,EAC7B,QAAQ,GAAG,IAAI,EACf,cAAc,GAAG,CAAC,EAClB,aAAa,EACb,kBAAkB,GAAG,SAAS,EAC9B,aAAa,EACb,kBAAkB,GAAG,SAAS,EAC9B,YAAY,EACZ,iBAAiB,GAAG,SAAS,EAC7B,mBAAmB,GAAG,IAAI,EAC1B,WAAW,EACX,WAAW,EACX,QAAQ,GAAG,GAAG,GACf,GAAG,KAAK,CAAC;IAEV,MAAM,MAAM,GAAG,eAAe,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;IAEzE,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC5B,OAAO,CACL,KAAC,oBAAoB,IAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,YAC/C,QAAQ,GACY,CACxB,CAAC;IACJ,CAAC;IAED,OAAO,CACL,KAAC,QAAQ,IAAC,QAAQ,EAAE,KAAC,oBAAoB,IAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,GAAI,YACxE,KAAC,YAAY,IACX,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,QAAQ,EAClB,cAAc,EAAE,cAAc,EAC9B,aAAa,EAAE,aAAa,EAC5B,kBAAkB,EAAE,kBAAkB,EACtC,aAAa,EAAE,aAAa,EAC5B,kBAAkB,EAAE,kBAAkB,EACtC,YAAY,EAAE,YAAY,EAC1B,iBAAiB,EAAE,iBAAiB,EACpC,mBAAmB,EAAE,mBAAmB,EACxC,cAAc,EAAE,MAAM,CAAC,KAAK,IAAI,KAAK,EACrC,cAAc,EAAE,MAAM,CAAC,KAAK,IAAI,KAAK,EACrC,WAAW,EAAE,MAAM,CAAC,OAAO,IAAI,KAAK,EACpC,aAAa,EAAE,MAAM,CAAC,MAAM,IAAI,KAAK,EACrC,KAAK,EAAE,MAAM,CAAC,OAAO,EACrB,UAAU,EAAE,UAAU,EACtB,kBAAkB,EAAE,kBAAkB,EACtC,WAAW,EAAE,WAAW,EACxB,WAAW,EAAE,WAAW,EACxB,QAAQ,EAAE,QAAQ,GAClB,GACO,CACZ,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The dialog a structure search is drawn in, shared by every site that
|
|
3
|
+
* filters a collection by structure.
|
|
4
|
+
*
|
|
5
|
+
* This file stays free of `openchemlib`: the editor loads it behind its own
|
|
6
|
+
* `React.lazy`, and an example is read only once it is clicked.
|
|
7
|
+
*/
|
|
8
|
+
import type { ReactElement, ReactNode } from 'react';
|
|
9
|
+
import type { StructureSearchExample, StructureSearchMode, StructureSearchQuery } from '../core/structureSearch.ts';
|
|
10
|
+
/** What {@link StructureSearchDialog} needs. */
|
|
11
|
+
export interface StructureSearchDialogProps {
|
|
12
|
+
/** Whether the dialog is on screen. */
|
|
13
|
+
isOpen: boolean;
|
|
14
|
+
/** The question the dialog opens on; its drawing is loaded into the canvas. */
|
|
15
|
+
value: StructureSearchQuery;
|
|
16
|
+
/**
|
|
17
|
+
* Called when the dialog closes — by Apply, by Escape or by its × alike —
|
|
18
|
+
* with what it then holds, so no drawing is lost to a stray Escape. The
|
|
19
|
+
* idCode is empty when the canvas was cleared.
|
|
20
|
+
*/
|
|
21
|
+
onClose: (query: StructureSearchQuery) => void;
|
|
22
|
+
/**
|
|
23
|
+
* The modes offered, in order.
|
|
24
|
+
* @default STRUCTURE_SEARCH_MODES
|
|
25
|
+
*/
|
|
26
|
+
modes?: readonly StructureSearchMode[];
|
|
27
|
+
/**
|
|
28
|
+
* The fragments offered under the canvas.
|
|
29
|
+
* @default benzene, pyridine, amide, sulfonamide and trifluoromethyl
|
|
30
|
+
*/
|
|
31
|
+
examples?: readonly StructureSearchExample[];
|
|
32
|
+
/**
|
|
33
|
+
* More controls beside the similarity threshold, such as the fingerprint a
|
|
34
|
+
* site compares.
|
|
35
|
+
* @default undefined
|
|
36
|
+
*/
|
|
37
|
+
similarityControls?: ReactNode;
|
|
38
|
+
/**
|
|
39
|
+
* Whether the dialog is rendered through a portal on `document.body`.
|
|
40
|
+
* @default true
|
|
41
|
+
*/
|
|
42
|
+
usePortal?: boolean;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Draw a structure and say how it is matched: contained, similar, or the same
|
|
46
|
+
* compound with or without its stereochemistry and tautomerism.
|
|
47
|
+
*
|
|
48
|
+
* What is drawn stays a draft until the dialog closes, and the canvas is never
|
|
49
|
+
* reloaded under the pen: only opening the dialog and clicking an example put
|
|
50
|
+
* a structure in it.
|
|
51
|
+
* @param props - See {@link StructureSearchDialogProps}.
|
|
52
|
+
* @returns The dialog.
|
|
53
|
+
*/
|
|
54
|
+
export declare function StructureSearchDialog(props: StructureSearchDialogProps): ReactElement;
|
|
55
|
+
//# sourceMappingURL=StructureSearchDialog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StructureSearchDialog.d.ts","sourceRoot":"","sources":["../../../src/structure/ui/StructureSearchDialog.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAOrD,OAAO,KAAK,EACV,sBAAsB,EACtB,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,4BAA4B,CAAC;AAUpC,gDAAgD;AAChD,MAAM,WAAW,0BAA0B;IACzC,uCAAuC;IACvC,MAAM,EAAE,OAAO,CAAC;IAChB,+EAA+E;IAC/E,KAAK,EAAE,oBAAoB,CAAC;IAC5B;;;;OAIG;IACH,OAAO,EAAE,CAAC,KAAK,EAAE,oBAAoB,KAAK,IAAI,CAAC;IAC/C;;;OAGG;IACH,KAAK,CAAC,EAAE,SAAS,mBAAmB,EAAE,CAAC;IACvC;;;OAGG;IACH,QAAQ,CAAC,EAAE,SAAS,sBAAsB,EAAE,CAAC;IAC7C;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,SAAS,CAAC;IAC/B;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAUD;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,0BAA0B,GAChC,YAAY,CA8Hd"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* The dialog a structure search is drawn in, shared by every site that
|
|
4
|
+
* filters a collection by structure.
|
|
5
|
+
*
|
|
6
|
+
* This file stays free of `openchemlib`: the editor loads it behind its own
|
|
7
|
+
* `React.lazy`, and an example is read only once it is clicked.
|
|
8
|
+
*/
|
|
9
|
+
import { Button, Dialog, DialogBody, DialogFooter, HTMLSelect, } from '@blueprintjs/core';
|
|
10
|
+
import { useState } from 'react';
|
|
11
|
+
import { formatPercent } from "../../format/core/numbers.js";
|
|
12
|
+
import { useChromeT } from "../../i18n/ui/useT.js";
|
|
13
|
+
import { isEmptyIdCode } from "../core/editorValue.js";
|
|
14
|
+
import { STRUCTURE_SEARCH_MODES, similarityThresholds, } from "../core/structureSearch.js";
|
|
15
|
+
import { StructureEditor } from "./StructureEditor.js";
|
|
16
|
+
import { useStructureDraft } from "./useStructureDraft.js";
|
|
17
|
+
import { useStructureSearchModes } from "./useStructureSearchModes.js";
|
|
18
|
+
const DEFAULT_EXAMPLES = [
|
|
19
|
+
{ key: 'structure.search.exampleBenzene', smiles: 'c1ccccc1' },
|
|
20
|
+
{ key: 'structure.search.examplePyridine', smiles: 'c1ccncc1' },
|
|
21
|
+
{ key: 'structure.search.exampleAmide', smiles: 'CC(=O)N' },
|
|
22
|
+
{ key: 'structure.search.exampleSulfonamide', smiles: 'S(=O)(=O)N' },
|
|
23
|
+
{ key: 'structure.search.exampleTrifluoromethyl', smiles: 'FC(F)F' },
|
|
24
|
+
];
|
|
25
|
+
/**
|
|
26
|
+
* Draw a structure and say how it is matched: contained, similar, or the same
|
|
27
|
+
* compound with or without its stereochemistry and tautomerism.
|
|
28
|
+
*
|
|
29
|
+
* What is drawn stays a draft until the dialog closes, and the canvas is never
|
|
30
|
+
* reloaded under the pen: only opening the dialog and clicking an example put
|
|
31
|
+
* a structure in it.
|
|
32
|
+
* @param props - See {@link StructureSearchDialogProps}.
|
|
33
|
+
* @returns The dialog.
|
|
34
|
+
*/
|
|
35
|
+
export function StructureSearchDialog(props) {
|
|
36
|
+
const { isOpen, value, onClose, modes = STRUCTURE_SEARCH_MODES, examples, similarityControls, usePortal = true, } = props;
|
|
37
|
+
const t = useChromeT();
|
|
38
|
+
const modeLabels = useStructureSearchModes(modes);
|
|
39
|
+
const draft = useStructureDraft(value.idCode);
|
|
40
|
+
const [mode, setMode] = useState(value.mode);
|
|
41
|
+
const [threshold, setThreshold] = useState(value.threshold);
|
|
42
|
+
// An example is read by a lazily loaded module: until it is in the canvas,
|
|
43
|
+
// Apply would hand back the drawing it replaces.
|
|
44
|
+
const [loading, setLoading] = useState(false);
|
|
45
|
+
const offered = examples ??
|
|
46
|
+
DEFAULT_EXAMPLES.map((example) => ({
|
|
47
|
+
label: t(example.key),
|
|
48
|
+
smiles: example.smiles,
|
|
49
|
+
}));
|
|
50
|
+
function close() {
|
|
51
|
+
const idCode = isEmptyIdCode(draft.value) ? '' : draft.value;
|
|
52
|
+
onClose({ idCode, mode, threshold });
|
|
53
|
+
}
|
|
54
|
+
async function loadExample(smiles) {
|
|
55
|
+
setLoading(true);
|
|
56
|
+
try {
|
|
57
|
+
const { fragmentIdCode } = await import("../core/fragmentIdCode.js");
|
|
58
|
+
const idCode = fragmentIdCode(smiles);
|
|
59
|
+
if (idCode !== '')
|
|
60
|
+
draft.load(idCode);
|
|
61
|
+
}
|
|
62
|
+
finally {
|
|
63
|
+
setLoading(false);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return (_jsxs(Dialog, { isOpen: isOpen, onOpening: () => {
|
|
67
|
+
draft.load(value.idCode);
|
|
68
|
+
setMode(modes.includes(value.mode) ? value.mode : (modes[0] ?? mode));
|
|
69
|
+
setThreshold(value.threshold);
|
|
70
|
+
}, onClose: close, usePortal: usePortal, title: t('structure.search.title'), className: "structure-search", children: [_jsxs(DialogBody, { children: [_jsx("div", { className: "structure-search__row", children: modeLabels.map((option) => (_jsx(Button, { size: "small", active: mode === option.mode, intent: mode === option.mode ? 'primary' : 'none', text: option.label, title: option.help, onClick: () => setMode(option.mode) }, option.mode))) }), mode === 'similarity' && (_jsxs("div", { className: "structure-search__row", children: [_jsx("span", { className: "structure-search__label", children: t('structure.search.similarityLabel') }), _jsx(HTMLSelect, { minimal: true, value: threshold, "aria-label": t('structure.search.threshold'), title: t('structure.search.thresholdHelp'), options: similarityThresholds(threshold).map((option) => ({
|
|
71
|
+
value: option,
|
|
72
|
+
label: t('structure.search.thresholdOption', {
|
|
73
|
+
percent: formatPercent(option, 0),
|
|
74
|
+
}),
|
|
75
|
+
})), onChange: (event) => setThreshold(Number(event.currentTarget.value)) }), similarityControls] })), _jsx(StructureEditor, { fragment: true, value: draft.value, revision: draft.revision, onChange: (change) => draft.update(change.idCode) }), _jsxs("div", { className: "structure-search__row structure-search__examples", children: [_jsx("span", { className: "structure-search__label", children: t('structure.search.examples') }), offered.map((example) => (_jsx(Button, { variant: "minimal", size: "small", text: example.label, title: example.help, onClick: () => void loadExample(example.smiles) }, example.label)))] })] }), _jsx(DialogFooter, { actions: _jsx(Button, { intent: "primary", icon: "search", text: t('structure.search.apply'), loading: loading, onClick: close }) })] }));
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=StructureSearchDialog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StructureSearchDialog.js","sourceRoot":"","sources":["../../../src/structure/ui/StructureSearchDialog.tsx"],"names":[],"mappings":"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"}
|
|
@@ -36,6 +36,15 @@ interface StructureSvgProps {
|
|
|
36
36
|
bondHighlight?: number[];
|
|
37
37
|
/** The colour the highlighted bonds are painted. */
|
|
38
38
|
bondHighlightColor: string;
|
|
39
|
+
/**
|
|
40
|
+
* A query idCode whose matches are painted in place of the highlights.
|
|
41
|
+
* @default undefined
|
|
42
|
+
*/
|
|
43
|
+
substructure?: string;
|
|
44
|
+
/** The colour the substructure match is painted. */
|
|
45
|
+
substructureColor: string;
|
|
46
|
+
/** How opaque the substructure match is painted, from 0 to 1. */
|
|
47
|
+
substructureOpacity: number;
|
|
39
48
|
/** Write the index of every atom next to it. */
|
|
40
49
|
showAtomNumber: boolean;
|
|
41
50
|
/** Write the index of every bond next to it. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StructureSvg.d.ts","sourceRoot":"","sources":["../../../src/structure/ui/StructureSvg.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIrD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAGhE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"StructureSvg.d.ts","sourceRoot":"","sources":["../../../src/structure/ui/StructureSvg.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIrD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAGhE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAKlE,qCAAqC;AACrC,UAAU,iBAAiB;IACzB,4DAA4D;IAC5D,MAAM,EAAE,eAAe,CAAC;IACxB,uCAAuC;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,wCAAwC;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,0EAA0E;IAC1E,QAAQ,EAAE,OAAO,CAAC;IAClB,2EAA2E;IAC3E,cAAc,EAAE,MAAM,CAAC;IACvB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,oDAAoD;IACpD,kBAAkB,EAAE,MAAM,CAAC;IAC3B;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,oDAAoD;IACpD,kBAAkB,EAAE,MAAM,CAAC;IAC3B;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oDAAoD;IACpD,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iEAAiE;IACjE,mBAAmB,EAAE,MAAM,CAAC;IAC5B,gDAAgD;IAChD,cAAc,EAAE,OAAO,CAAC;IACxB,gDAAgD;IAChD,cAAc,EAAE,OAAO,CAAC;IACxB,8DAA8D;IAC9D,WAAW,EAAE,OAAO,CAAC;IACrB,oEAAoE;IACpE,aAAa,EAAE,OAAO,CAAC;IACvB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,UAAU,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,yCAAyC;IACzC,kBAAkB,EAAE,kBAAkB,CAAC;IACvC;;;OAGG;IACH,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC;;;OAGG;IACH,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,yEAAyE;IACzE,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,YAAY,CA6EnE"}
|
|
@@ -3,6 +3,7 @@ import { useMemo } from 'react';
|
|
|
3
3
|
import { SvgRenderer } from 'react-ocl';
|
|
4
4
|
import { applyAtomLabels } from "../core/atomLabels.js";
|
|
5
5
|
import { sourceMolecule } from "../core/sourceMolecule.js";
|
|
6
|
+
import { substructureMatch } from "../core/substructureMatch.js";
|
|
6
7
|
import { StructurePlaceholder } from "./StructurePlaceholder.js";
|
|
7
8
|
/**
|
|
8
9
|
* Read the notation and draw the picture.
|
|
@@ -10,16 +11,20 @@ import { StructurePlaceholder } from "./StructurePlaceholder.js";
|
|
|
10
11
|
* @returns The svg, or the placeholder when the notation cannot be read.
|
|
11
12
|
*/
|
|
12
13
|
export function StructureSvg(props) {
|
|
13
|
-
const { source, fallback, atomLabels, atomLabelPlacement, onAtomClick, onBondClick, showCIPParity, ...rest } = props;
|
|
14
|
+
const { source, fallback, atomLabels, atomLabelPlacement, onAtomClick, onBondClick, showCIPParity, atomHighlight, atomHighlightColor, bondHighlight, bondHighlightColor, substructure, substructureColor, substructureOpacity, ...rest } = props;
|
|
14
15
|
const { kind, value, coordinates } = source;
|
|
15
16
|
// A map a caller builds during render is a new object every time; its
|
|
16
17
|
// content is what decides whether the molecule has to be read again.
|
|
17
18
|
const labelsKey = atomLabels === undefined ? '' : JSON.stringify([...atomLabels]);
|
|
18
19
|
const drawing = useMemo(() => readDrawing(kind, value, coordinates, labelsKey, atomLabelPlacement), [kind, value, coordinates, labelsKey, atomLabelPlacement]);
|
|
20
|
+
// Matched on the very molecule drawn, so the indices are the drawn atoms.
|
|
21
|
+
const match = useMemo(() => drawing === null || substructure === undefined
|
|
22
|
+
? null
|
|
23
|
+
: substructureMatch(drawing.molecule, substructure), [drawing, substructure]);
|
|
19
24
|
if (drawing === null) {
|
|
20
25
|
return (_jsx(StructurePlaceholder, { width: rest.width, height: rest.height, children: fallback }));
|
|
21
26
|
}
|
|
22
|
-
return (_jsx(SvgRenderer, { ...rest, molecule: drawing.molecule, noCarbonLabelWithCustomLabel: drawing.labelled, suppressCIPParity: !showCIPParity, onAtomClick: onAtomClick === undefined
|
|
27
|
+
return (_jsx(SvgRenderer, { ...rest, atomHighlight: match === null ? atomHighlight : match.atoms, atomHighlightColor: match === null ? atomHighlightColor : substructureColor, bondHighlight: match === null ? bondHighlight : match.bonds, bondHighlightColor: match === null ? bondHighlightColor : substructureColor, atomHighlightOpacity: match === null ? undefined : substructureOpacity, bondHighlightOpacity: match === null ? undefined : substructureOpacity, molecule: drawing.molecule, noCarbonLabelWithCustomLabel: drawing.labelled, suppressCIPParity: !showCIPParity, onAtomClick: onAtomClick === undefined
|
|
23
28
|
? undefined
|
|
24
29
|
: (atom) => {
|
|
25
30
|
onAtomClick(atom);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StructureSvg.js","sourceRoot":"","sources":["../../../src/structure/ui/StructureSvg.tsx"],"names":[],"mappings":";AAYA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAChC,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAGxC,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"StructureSvg.js","sourceRoot":"","sources":["../../../src/structure/ui/StructureSvg.tsx"],"names":[],"mappings":"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"}
|
|
@@ -19,6 +19,10 @@ export type { StructureDropProps } from './StructureDrop.tsx';
|
|
|
19
19
|
export { StructureDrop } from './StructureDrop.tsx';
|
|
20
20
|
export type { StructureEditorHelpProps } from './StructureEditorHelp.tsx';
|
|
21
21
|
export { StructureEditorHelp } from './StructureEditorHelp.tsx';
|
|
22
|
+
export type { StructureSearchDialogProps } from './StructureSearchDialog.tsx';
|
|
23
|
+
export { StructureSearchDialog } from './StructureSearchDialog.tsx';
|
|
24
|
+
export type { StructureSearchModeLabel } from './useStructureSearchModes.ts';
|
|
25
|
+
export { useStructureSearchModes } from './useStructureSearchModes.ts';
|
|
22
26
|
export type { StructureExportDialogProps } from './StructureExportDialog.tsx';
|
|
23
27
|
export { StructureExportDialog } from './StructureExportDialog.tsx';
|
|
24
28
|
export type { StructureExportButtonProps } from './StructureExportButton.tsx';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/structure/ui/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,YAAY,EACV,qBAAqB,EACrB,mBAAmB,EACnB,6BAA6B,EAC7B,6BAA6B,GAC9B,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,YAAY,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,YAAY,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,YAAY,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAC1E,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,YAAY,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AAC9E,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,YAAY,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AAC9E,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,YAAY,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AAC5E,YAAY,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,YAAY,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/structure/ui/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,YAAY,EACV,qBAAqB,EACrB,mBAAmB,EACnB,6BAA6B,EAC7B,6BAA6B,GAC9B,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,YAAY,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,YAAY,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,YAAY,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAC1E,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,YAAY,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AAC9E,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,YAAY,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AAC7E,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,YAAY,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AAC9E,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,YAAY,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AAC9E,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,YAAY,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AAC5E,YAAY,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,YAAY,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC"}
|
|
@@ -14,6 +14,8 @@ export { Structure } from "./Structure.js";
|
|
|
14
14
|
export { StructureEditor } from "./StructureEditor.js";
|
|
15
15
|
export { StructureDrop } from "./StructureDrop.js";
|
|
16
16
|
export { StructureEditorHelp } from "./StructureEditorHelp.js";
|
|
17
|
+
export { StructureSearchDialog } from "./StructureSearchDialog.js";
|
|
18
|
+
export { useStructureSearchModes } from "./useStructureSearchModes.js";
|
|
17
19
|
export { StructureExportDialog } from "./StructureExportDialog.js";
|
|
18
20
|
export { StructureExportButton } from "./StructureExportButton.js";
|
|
19
21
|
export { useToolbarFloor } from "./useToolbarFloor.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/structure/ui/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AASH,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAiB,CAAC;AAE5C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAuB,CAAC;AAExD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAqB,CAAC;AAEpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA2B,CAAC;AAEhE,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA6B,CAAC;AAEpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA6B,CAAC;AAGpE,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/structure/ui/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AASH,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAiB,CAAC;AAE5C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAuB,CAAC;AAExD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAqB,CAAC;AAEpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA2B,CAAC;AAEhE,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA6B,CAAC;AAEpE,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAEvE,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA6B,CAAC;AAEpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA6B,CAAC;AAGpE,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { StructureSearchMode } from '../core/structureSearch.ts';
|
|
2
|
+
/** A mode, with what a button says and what its tooltip adds. */
|
|
3
|
+
export interface StructureSearchModeLabel {
|
|
4
|
+
/** The mode. */
|
|
5
|
+
mode: StructureSearchMode;
|
|
6
|
+
/** What the button says. */
|
|
7
|
+
label: string;
|
|
8
|
+
/** One line on what the mode finds. */
|
|
9
|
+
help: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* The modes in the reader's language, for a site that shows the mode in force
|
|
13
|
+
* beside the drawing.
|
|
14
|
+
* @param modes - The modes, in order.
|
|
15
|
+
* @returns Each mode with its label and its one-line help.
|
|
16
|
+
*/
|
|
17
|
+
export declare function useStructureSearchModes(modes?: readonly StructureSearchMode[]): StructureSearchModeLabel[];
|
|
18
|
+
//# sourceMappingURL=useStructureSearchModes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useStructureSearchModes.d.ts","sourceRoot":"","sources":["../../../src/structure/ui/useStructureSearchModes.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAGtE,iEAAiE;AACjE,MAAM,WAAW,wBAAwB;IACvC,gBAAgB;IAChB,IAAI,EAAE,mBAAmB,CAAC;IAC1B,4BAA4B;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,uCAAuC;IACvC,IAAI,EAAE,MAAM,CAAC;CACd;AAsBD;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,GAAE,SAAS,mBAAmB,EAA2B,GAC7D,wBAAwB,EAAE,CAO5B"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { useChromeT } from "../../i18n/ui/useT.js";
|
|
2
|
+
import { STRUCTURE_SEARCH_MODES } from "../core/structureSearch.js";
|
|
3
|
+
const MODE_KEYS = {
|
|
4
|
+
substructure: [
|
|
5
|
+
'structure.search.substructure',
|
|
6
|
+
'structure.search.substructureHelp',
|
|
7
|
+
],
|
|
8
|
+
similarity: [
|
|
9
|
+
'structure.search.similarity',
|
|
10
|
+
'structure.search.similarityHelp',
|
|
11
|
+
],
|
|
12
|
+
exact: ['structure.search.exact', 'structure.search.exactHelp'],
|
|
13
|
+
exactNoStereo: [
|
|
14
|
+
'structure.search.exactNoStereo',
|
|
15
|
+
'structure.search.exactNoStereoHelp',
|
|
16
|
+
],
|
|
17
|
+
exactNoStereoTautomer: [
|
|
18
|
+
'structure.search.exactNoStereoTautomer',
|
|
19
|
+
'structure.search.exactNoStereoTautomerHelp',
|
|
20
|
+
],
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* The modes in the reader's language, for a site that shows the mode in force
|
|
24
|
+
* beside the drawing.
|
|
25
|
+
* @param modes - The modes, in order.
|
|
26
|
+
* @returns Each mode with its label and its one-line help.
|
|
27
|
+
*/
|
|
28
|
+
export function useStructureSearchModes(modes = STRUCTURE_SEARCH_MODES) {
|
|
29
|
+
const t = useChromeT();
|
|
30
|
+
return modes.map((mode) => ({
|
|
31
|
+
mode,
|
|
32
|
+
label: t(MODE_KEYS[mode][0]),
|
|
33
|
+
help: t(MODE_KEYS[mode][1]),
|
|
34
|
+
}));
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=useStructureSearchModes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useStructureSearchModes.js","sourceRoot":"","sources":["../../../src/structure/ui/useStructureSearchModes.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAYpE,MAAM,SAAS,GAAwD;IACrE,YAAY,EAAE;QACZ,+BAA+B;QAC/B,mCAAmC;KACpC;IACD,UAAU,EAAE;QACV,6BAA6B;QAC7B,iCAAiC;KAClC;IACD,KAAK,EAAE,CAAC,wBAAwB,EAAE,4BAA4B,CAAC;IAC/D,aAAa,EAAE;QACb,gCAAgC;QAChC,oCAAoC;KACrC;IACD,qBAAqB,EAAE;QACrB,wCAAwC;QACxC,4CAA4C;KAC7C;CACF,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CACrC,QAAwC,sBAAsB;IAE9D,MAAM,CAAC,GAAG,UAAU,EAAE,CAAC;IACvB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC1B,IAAI;QACJ,KAAK,EAAE,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,EAAE,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;KAC5B,CAAC,CAAC,CAAC;AACN,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-cheminfo",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.74.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",
|
|
@@ -97,7 +97,7 @@
|
|
|
97
97
|
"yaml": "^2.9.1"
|
|
98
98
|
},
|
|
99
99
|
"devDependencies": {
|
|
100
|
-
"@blueprintjs/core": "^6.
|
|
100
|
+
"@blueprintjs/core": "^6.21.0",
|
|
101
101
|
"@fastify/static": "^10.1.6",
|
|
102
102
|
"@fastify/type-provider-typebox": "^6.3.0",
|
|
103
103
|
"@playwright/test": "^1.62.1",
|
|
@@ -105,8 +105,8 @@
|
|
|
105
105
|
"@storybook/react-vite": "^10.5.8",
|
|
106
106
|
"@testing-library/dom": "^10.4.2",
|
|
107
107
|
"@types/node": "^26.2.0",
|
|
108
|
-
"@types/react": "^19.
|
|
109
|
-
"@types/react-dom": "^19.
|
|
108
|
+
"@types/react": "^19.3.0",
|
|
109
|
+
"@types/react-dom": "^19.3.0",
|
|
110
110
|
"@types/semver": "^7.8.0",
|
|
111
111
|
"@vitest/coverage-v8": "^4.1.10",
|
|
112
112
|
"@zakodium/tsconfig": "^1.0.5",
|
|
@@ -124,10 +124,10 @@
|
|
|
124
124
|
"ml-signal-processing": "^2.2.2",
|
|
125
125
|
"molstar": "^5.11.0",
|
|
126
126
|
"prettier": "^3.9.6",
|
|
127
|
-
"react": "^19.
|
|
128
|
-
"react-dom": "^19.
|
|
127
|
+
"react": "^19.3.1",
|
|
128
|
+
"react-dom": "^19.3.1",
|
|
129
129
|
"react-ocl": "^8.7.2",
|
|
130
|
-
"react-science": "^
|
|
130
|
+
"react-science": "^24.0.1",
|
|
131
131
|
"rimraf": "^6.1.3",
|
|
132
132
|
"spectra-processor": "^5.0.0",
|
|
133
133
|
"storybook": "^10.5.8",
|
|
@@ -148,7 +148,7 @@
|
|
|
148
148
|
"react": "^19.0.0",
|
|
149
149
|
"react-dom": "^19.0.0",
|
|
150
150
|
"react-ocl": "^8.7.1",
|
|
151
|
-
"react-science": "^20.6.2 || ^21.0.0 || ^22.0.0 || ^23.0.0",
|
|
151
|
+
"react-science": "^20.6.2 || ^21.0.0 || ^22.0.0 || ^23.0.0 || ^24.0.0",
|
|
152
152
|
"spectra-processor": "^5.0.0",
|
|
153
153
|
"vite": "^7.0.0 || ^8.0.0",
|
|
154
154
|
"xtb-wasm": "^1.1.1"
|
|
@@ -197,9 +197,9 @@
|
|
|
197
197
|
}
|
|
198
198
|
},
|
|
199
199
|
"overrides": {
|
|
200
|
-
"react": "^19.
|
|
201
|
-
"react-dom": "^19.
|
|
202
|
-
"@types/react": "^19.
|
|
203
|
-
"@types/react-dom": "^19.
|
|
200
|
+
"react": "^19.3.1",
|
|
201
|
+
"react-dom": "^19.3.1",
|
|
202
|
+
"@types/react": "^19.3.0",
|
|
203
|
+
"@types/react-dom": "^19.3.0"
|
|
204
204
|
}
|
|
205
205
|
}
|