react-cheminfo 0.3.0 → 0.4.1
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 +111 -23
- package/lib/capsule/ui/CapsuleFilter.d.ts +61 -0
- package/lib/capsule/ui/CapsuleFilter.d.ts.map +1 -0
- package/lib/capsule/ui/CapsuleFilter.js +33 -0
- package/lib/capsule/ui/CapsuleFilter.js.map +1 -0
- package/lib/capsule/ui/index.d.ts +3 -0
- package/lib/capsule/ui/index.d.ts.map +1 -0
- package/lib/capsule/ui/index.js +2 -0
- package/lib/capsule/ui/index.js.map +1 -0
- package/lib/chrome/ui/NavLink.d.ts +27 -0
- package/lib/chrome/ui/NavLink.d.ts.map +1 -0
- package/lib/chrome/ui/NavLink.js +36 -0
- package/lib/chrome/ui/NavLink.js.map +1 -0
- package/lib/chrome/ui/NavMenuButton.d.ts +40 -0
- package/lib/chrome/ui/NavMenuButton.d.ts.map +1 -0
- package/lib/chrome/ui/NavMenuButton.js +26 -0
- package/lib/chrome/ui/NavMenuButton.js.map +1 -0
- package/lib/chrome/ui/SiteFooter.d.ts +39 -0
- package/lib/chrome/ui/SiteFooter.d.ts.map +1 -0
- package/lib/chrome/ui/SiteFooter.js +17 -0
- package/lib/chrome/ui/SiteFooter.js.map +1 -0
- package/lib/chrome/ui/SiteHeader.d.ts +59 -0
- package/lib/chrome/ui/SiteHeader.d.ts.map +1 -0
- package/lib/chrome/ui/SiteHeader.js +28 -0
- package/lib/chrome/ui/SiteHeader.js.map +1 -0
- package/lib/chrome/ui/index.d.ts +12 -0
- package/lib/chrome/ui/index.d.ts.map +1 -0
- package/lib/chrome/ui/index.js +6 -0
- package/lib/chrome/ui/index.js.map +1 -0
- package/lib/chrome/ui/navItem.d.ts +57 -0
- package/lib/chrome/ui/navItem.d.ts.map +1 -0
- package/lib/chrome/ui/navItem.js +10 -0
- package/lib/chrome/ui/navItem.js.map +1 -0
- package/lib/chrome/ui/useCompactHeader.d.ts +31 -0
- package/lib/chrome/ui/useCompactHeader.d.ts.map +1 -0
- package/lib/chrome/ui/useCompactHeader.js +50 -0
- package/lib/chrome/ui/useCompactHeader.js.map +1 -0
- package/lib/citation/core/clipboard.d.ts +12 -3
- package/lib/citation/core/clipboard.d.ts.map +1 -1
- package/lib/citation/core/clipboard.js +21 -10
- package/lib/citation/core/clipboard.js.map +1 -1
- package/lib/citation/core/download.d.ts +11 -3
- package/lib/citation/core/download.d.ts.map +1 -1
- package/lib/citation/core/download.js +17 -13
- package/lib/citation/core/download.js.map +1 -1
- package/lib/citation/core/index.d.ts +4 -3
- package/lib/citation/core/index.d.ts.map +1 -1
- package/lib/citation/core/index.js +3 -3
- package/lib/citation/core/index.js.map +1 -1
- package/lib/citation/core/works.d.ts +44 -0
- package/lib/citation/core/works.d.ts.map +1 -0
- package/lib/citation/core/works.js +51 -0
- package/lib/citation/core/works.js.map +1 -0
- package/lib/citation/ui/CitationMenu.d.ts +20 -3
- package/lib/citation/ui/CitationMenu.d.ts.map +1 -1
- package/lib/citation/ui/CitationMenu.js +60 -49
- package/lib/citation/ui/CitationMenu.js.map +1 -1
- package/lib/citation/ui/CitationPreview.d.ts +5 -2
- package/lib/citation/ui/CitationPreview.d.ts.map +1 -1
- package/lib/citation/ui/CitationPreview.js +9 -4
- package/lib/citation/ui/CitationPreview.js.map +1 -1
- package/lib/citation/ui/CiteButton.d.ts +13 -6
- package/lib/citation/ui/CiteButton.d.ts.map +1 -1
- package/lib/citation/ui/CiteButton.js +5 -4
- package/lib/citation/ui/CiteButton.js.map +1 -1
- package/lib/citation/ui/CopyFormatEntries.d.ts +31 -0
- package/lib/citation/ui/CopyFormatEntries.d.ts.map +1 -0
- package/lib/citation/ui/CopyFormatEntries.js +29 -0
- package/lib/citation/ui/CopyFormatEntries.js.map +1 -0
- package/lib/citation/ui/WorkEntry.d.ts +18 -0
- package/lib/citation/ui/WorkEntry.d.ts.map +1 -0
- package/lib/citation/ui/WorkEntry.js +32 -0
- package/lib/citation/ui/WorkEntry.js.map +1 -0
- package/lib/citation/ui/entries.d.ts +7 -7
- package/lib/citation/ui/entries.d.ts.map +1 -1
- package/lib/citation/ui/entries.js +11 -13
- package/lib/citation/ui/entries.js.map +1 -1
- package/lib/citation/ui/index.d.ts +2 -2
- package/lib/citation/ui/index.d.ts.map +1 -1
- package/lib/citation/ui/index.js.map +1 -1
- package/lib/citation/ui/useCopyFeedback.d.ts +20 -0
- package/lib/citation/ui/useCopyFeedback.d.ts.map +1 -0
- package/lib/citation/ui/useCopyFeedback.js +49 -0
- package/lib/citation/ui/useCopyFeedback.js.map +1 -0
- package/lib/clipboard/core/index.d.ts +2 -0
- package/lib/clipboard/core/index.d.ts.map +1 -0
- package/lib/clipboard/core/index.js +2 -0
- package/lib/clipboard/core/index.js.map +1 -0
- package/lib/clipboard/core/writeToClipboard.d.ts +12 -0
- package/lib/clipboard/core/writeToClipboard.d.ts.map +1 -0
- package/lib/clipboard/core/writeToClipboard.js +49 -0
- package/lib/clipboard/core/writeToClipboard.js.map +1 -0
- package/lib/clipboard/ui/CodeBlock.d.ts +43 -0
- package/lib/clipboard/ui/CodeBlock.d.ts.map +1 -0
- package/lib/clipboard/ui/CodeBlock.js +49 -0
- package/lib/clipboard/ui/CodeBlock.js.map +1 -0
- package/lib/clipboard/ui/CopyButton.d.ts +64 -0
- package/lib/clipboard/ui/CopyButton.d.ts.map +1 -0
- package/lib/clipboard/ui/CopyButton.js +21 -0
- package/lib/clipboard/ui/CopyButton.js.map +1 -0
- package/lib/clipboard/ui/index.d.ts +7 -0
- package/lib/clipboard/ui/index.d.ts.map +1 -0
- package/lib/clipboard/ui/index.js +4 -0
- package/lib/clipboard/ui/index.js.map +1 -0
- package/lib/clipboard/ui/useCopyToClipboard.d.ts +24 -0
- package/lib/clipboard/ui/useCopyToClipboard.d.ts.map +1 -0
- package/lib/clipboard/ui/useCopyToClipboard.js +36 -0
- package/lib/clipboard/ui/useCopyToClipboard.js.map +1 -0
- package/lib/color/core/contrast.d.ts +43 -0
- package/lib/color/core/contrast.d.ts.map +1 -0
- package/lib/color/core/contrast.js +61 -0
- package/lib/color/core/contrast.js.map +1 -0
- package/lib/color/core/hex.d.ts +26 -0
- package/lib/color/core/hex.d.ts.map +1 -0
- package/lib/color/core/hex.js +44 -0
- package/lib/color/core/hex.js.map +1 -0
- package/lib/color/core/index.d.ts +5 -0
- package/lib/color/core/index.d.ts.map +1 -0
- package/lib/color/core/index.js +3 -0
- package/lib/color/core/index.js.map +1 -0
- package/lib/color/core/scale.d.ts +52 -0
- package/lib/color/core/scale.d.ts.map +1 -0
- package/lib/color/core/scale.js +96 -0
- package/lib/color/core/scale.js.map +1 -0
- package/lib/color/ui/ColorScaleLegend.d.ts +38 -0
- package/lib/color/ui/ColorScaleLegend.d.ts.map +1 -0
- package/lib/color/ui/ColorScaleLegend.js +68 -0
- package/lib/color/ui/ColorScaleLegend.js.map +1 -0
- package/lib/color/ui/index.d.ts +3 -0
- package/lib/color/ui/index.d.ts.map +1 -0
- package/lib/color/ui/index.js +2 -0
- package/lib/color/ui/index.js.map +1 -0
- package/lib/core.d.ts +11 -0
- package/lib/core.d.ts.map +1 -1
- package/lib/core.js +11 -0
- package/lib/core.js.map +1 -1
- package/lib/credits/core/credits.d.ts +144 -0
- package/lib/credits/core/credits.d.ts.map +1 -0
- package/lib/credits/core/credits.js +156 -0
- package/lib/credits/core/credits.js.map +1 -0
- package/lib/credits/core/index.d.ts +3 -0
- package/lib/credits/core/index.d.ts.map +1 -0
- package/lib/credits/core/index.js +2 -0
- package/lib/credits/core/index.js.map +1 -0
- package/lib/credits/ui/CreditsList.d.ts +29 -0
- package/lib/credits/ui/CreditsList.d.ts.map +1 -0
- package/lib/credits/ui/CreditsList.js +33 -0
- package/lib/credits/ui/CreditsList.js.map +1 -0
- package/lib/credits/ui/index.d.ts +3 -0
- package/lib/credits/ui/index.d.ts.map +1 -0
- package/lib/credits/ui/index.js +2 -0
- package/lib/credits/ui/index.js.map +1 -0
- package/lib/delimited/core/delimiters.d.ts +31 -0
- package/lib/delimited/core/delimiters.d.ts.map +1 -0
- package/lib/delimited/core/delimiters.js +46 -0
- package/lib/delimited/core/delimiters.js.map +1 -0
- package/lib/delimited/core/index.d.ts +9 -0
- package/lib/delimited/core/index.d.ts.map +1 -0
- package/lib/delimited/core/index.js +5 -0
- package/lib/delimited/core/index.js.map +1 -0
- package/lib/delimited/core/readDelimited.d.ts +32 -0
- package/lib/delimited/core/readDelimited.d.ts.map +1 -0
- package/lib/delimited/core/readDelimited.js +122 -0
- package/lib/delimited/core/readDelimited.js.map +1 -0
- package/lib/delimited/core/rowsToDelimited.d.ts +59 -0
- package/lib/delimited/core/rowsToDelimited.d.ts.map +1 -0
- package/lib/delimited/core/rowsToDelimited.js +87 -0
- package/lib/delimited/core/rowsToDelimited.js.map +1 -0
- package/lib/delimited/core/toDelimited.d.ts +38 -0
- package/lib/delimited/core/toDelimited.d.ts.map +1 -0
- package/lib/delimited/core/toDelimited.js +45 -0
- package/lib/delimited/core/toDelimited.js.map +1 -0
- package/lib/delimited/ui/DelimitedTextDialog.d.ts +22 -0
- package/lib/delimited/ui/DelimitedTextDialog.d.ts.map +1 -0
- package/lib/delimited/ui/DelimitedTextDialog.js +17 -0
- package/lib/delimited/ui/DelimitedTextDialog.js.map +1 -0
- package/lib/delimited/ui/DelimitedTextPanel.d.ts +56 -0
- package/lib/delimited/ui/DelimitedTextPanel.d.ts.map +1 -0
- package/lib/delimited/ui/DelimitedTextPanel.js +55 -0
- package/lib/delimited/ui/DelimitedTextPanel.js.map +1 -0
- package/lib/delimited/ui/index.d.ts +5 -0
- package/lib/delimited/ui/index.d.ts.map +1 -0
- package/lib/delimited/ui/index.js +3 -0
- package/lib/delimited/ui/index.js.map +1 -0
- package/lib/disclosure/ui/CollapsibleSection.d.ts +57 -0
- package/lib/disclosure/ui/CollapsibleSection.d.ts.map +1 -0
- package/lib/disclosure/ui/CollapsibleSection.js +60 -0
- package/lib/disclosure/ui/CollapsibleSection.js.map +1 -0
- package/lib/disclosure/ui/index.d.ts +5 -0
- package/lib/disclosure/ui/index.d.ts.map +1 -0
- package/lib/disclosure/ui/index.js +3 -0
- package/lib/disclosure/ui/index.js.map +1 -0
- package/lib/disclosure/ui/useDisclosure.d.ts +22 -0
- package/lib/disclosure/ui/useDisclosure.d.ts.map +1 -0
- package/lib/disclosure/ui/useDisclosure.js +18 -0
- package/lib/disclosure/ui/useDisclosure.js.map +1 -0
- package/lib/download/core/downloadBlob.d.ts +10 -0
- package/lib/download/core/downloadBlob.d.ts.map +1 -0
- package/lib/download/core/downloadBlob.js +20 -0
- package/lib/download/core/downloadBlob.js.map +1 -0
- package/lib/download/core/downloadText.d.ts +9 -0
- package/lib/download/core/downloadText.d.ts.map +1 -0
- package/lib/download/core/downloadText.js +14 -0
- package/lib/download/core/downloadText.js.map +1 -0
- package/lib/download/core/index.d.ts +4 -0
- package/lib/download/core/index.d.ts.map +1 -0
- package/lib/download/core/index.js +4 -0
- package/lib/download/core/index.js.map +1 -0
- package/lib/download/core/sanitizeFileName.d.ts +15 -0
- package/lib/download/core/sanitizeFileName.d.ts.map +1 -0
- package/lib/download/core/sanitizeFileName.js +33 -0
- package/lib/download/core/sanitizeFileName.js.map +1 -0
- package/lib/ecosystem/core/index.d.ts +3 -0
- package/lib/ecosystem/core/index.d.ts.map +1 -1
- package/lib/ecosystem/core/index.js +3 -0
- package/lib/ecosystem/core/index.js.map +1 -1
- package/lib/ecosystem/core/links.d.ts +11 -0
- package/lib/ecosystem/core/links.d.ts.map +1 -0
- package/lib/ecosystem/core/links.js +28 -0
- package/lib/ecosystem/core/links.js.map +1 -0
- package/lib/ecosystem/core/lookup.d.ts +32 -0
- package/lib/ecosystem/core/lookup.d.ts.map +1 -0
- package/lib/ecosystem/core/lookup.js +55 -0
- package/lib/ecosystem/core/lookup.js.map +1 -0
- package/lib/ecosystem/core/sites.d.ts +3 -1
- package/lib/ecosystem/core/sites.d.ts.map +1 -1
- package/lib/ecosystem/core/sites.js +18 -3
- package/lib/ecosystem/core/sites.js.map +1 -1
- package/lib/ecosystem/core/tokens.d.ts +21 -0
- package/lib/ecosystem/core/tokens.d.ts.map +1 -0
- package/lib/ecosystem/core/tokens.js +42 -0
- package/lib/ecosystem/core/tokens.js.map +1 -0
- package/lib/ecosystem/ui/SiteTheme.d.ts +18 -0
- package/lib/ecosystem/ui/SiteTheme.d.ts.map +1 -0
- package/lib/ecosystem/ui/SiteTheme.js +16 -0
- package/lib/ecosystem/ui/SiteTheme.js.map +1 -0
- package/lib/ecosystem/ui/Wordmark.d.ts +30 -0
- package/lib/ecosystem/ui/Wordmark.d.ts.map +1 -0
- package/lib/ecosystem/ui/Wordmark.js +26 -0
- package/lib/ecosystem/ui/Wordmark.js.map +1 -0
- package/lib/ecosystem/ui/glyphs.js +1 -1
- package/lib/ecosystem/ui/glyphs.js.map +1 -1
- package/lib/ecosystem/ui/index.d.ts +4 -0
- package/lib/ecosystem/ui/index.d.ts.map +1 -1
- package/lib/ecosystem/ui/index.js +2 -0
- package/lib/ecosystem/ui/index.js.map +1 -1
- package/lib/ecosystem/ui/marks.d.ts +30 -4
- package/lib/ecosystem/ui/marks.d.ts.map +1 -1
- package/lib/ecosystem/ui/marks.js +13 -3
- package/lib/ecosystem/ui/marks.js.map +1 -1
- package/lib/error/ui/ErrorBoundary.d.ts +60 -0
- package/lib/error/ui/ErrorBoundary.d.ts.map +1 -0
- package/lib/error/ui/ErrorBoundary.js +59 -0
- package/lib/error/ui/ErrorBoundary.js.map +1 -0
- package/lib/error/ui/ErrorFallback.d.ts +38 -0
- package/lib/error/ui/ErrorFallback.d.ts.map +1 -0
- package/lib/error/ui/ErrorFallback.js +16 -0
- package/lib/error/ui/ErrorFallback.js.map +1 -0
- package/lib/error/ui/index.d.ts +5 -0
- package/lib/error/ui/index.d.ts.map +1 -0
- package/lib/error/ui/index.js +3 -0
- package/lib/error/ui/index.js.map +1 -0
- package/lib/error/ui/toError.d.ts +11 -0
- package/lib/error/ui/toError.d.ts.map +1 -0
- package/lib/error/ui/toError.js +35 -0
- package/lib/error/ui/toError.js.map +1 -0
- package/lib/format/core/index.d.ts +5 -0
- package/lib/format/core/index.d.ts.map +1 -0
- package/lib/format/core/index.js +5 -0
- package/lib/format/core/index.js.map +1 -0
- package/lib/format/core/missing.d.ts +7 -0
- package/lib/format/core/missing.d.ts.map +1 -0
- package/lib/format/core/missing.js +7 -0
- package/lib/format/core/missing.js.map +1 -0
- package/lib/format/core/numbers.d.ts +40 -0
- package/lib/format/core/numbers.d.ts.map +1 -0
- package/lib/format/core/numbers.js +81 -0
- package/lib/format/core/numbers.js.map +1 -0
- package/lib/format/core/units.d.ts +17 -0
- package/lib/format/core/units.d.ts.map +1 -0
- package/lib/format/core/units.js +54 -0
- package/lib/format/core/units.js.map +1 -0
- package/lib/format/core/words.d.ts +12 -0
- package/lib/format/core/words.d.ts.map +1 -0
- package/lib/format/core/words.js +14 -0
- package/lib/format/core/words.js.map +1 -0
- package/lib/help/ui/HelpBody.d.ts +57 -0
- package/lib/help/ui/HelpBody.d.ts.map +1 -0
- package/lib/help/ui/HelpBody.js +44 -0
- package/lib/help/ui/HelpBody.js.map +1 -0
- package/lib/help/ui/HelpIcon.d.ts +33 -0
- package/lib/help/ui/HelpIcon.d.ts.map +1 -0
- package/lib/help/ui/HelpIcon.js +16 -0
- package/lib/help/ui/HelpIcon.js.map +1 -0
- package/lib/help/ui/HelpToolbarButton.d.ts +45 -0
- package/lib/help/ui/HelpToolbarButton.d.ts.map +1 -0
- package/lib/help/ui/HelpToolbarButton.js +17 -0
- package/lib/help/ui/HelpToolbarButton.js.map +1 -0
- package/lib/help/ui/HelpTooltip.d.ts +36 -0
- package/lib/help/ui/HelpTooltip.d.ts.map +1 -0
- package/lib/help/ui/HelpTooltip.js +24 -0
- package/lib/help/ui/HelpTooltip.js.map +1 -0
- package/lib/help/ui/index.d.ts +9 -0
- package/lib/help/ui/index.d.ts.map +1 -0
- package/lib/help/ui/index.js +5 -0
- package/lib/help/ui/index.js.map +1 -0
- package/lib/hooks/ui/index.d.ts +7 -0
- package/lib/hooks/ui/index.d.ts.map +1 -0
- package/lib/hooks/ui/index.js +5 -0
- package/lib/hooks/ui/index.js.map +1 -0
- package/lib/hooks/ui/listNavigation.d.ts +54 -0
- package/lib/hooks/ui/listNavigation.d.ts.map +1 -0
- package/lib/hooks/ui/listNavigation.js +77 -0
- package/lib/hooks/ui/listNavigation.js.map +1 -0
- package/lib/hooks/ui/useContainerSize.d.ts +15 -0
- package/lib/hooks/ui/useContainerSize.d.ts.map +1 -0
- package/lib/hooks/ui/useContainerSize.js +24 -0
- package/lib/hooks/ui/useContainerSize.js.map +1 -0
- package/lib/hooks/ui/useDebouncedValue.d.ts +12 -0
- package/lib/hooks/ui/useDebouncedValue.d.ts.map +1 -0
- package/lib/hooks/ui/useDebouncedValue.js +24 -0
- package/lib/hooks/ui/useDebouncedValue.js.map +1 -0
- package/lib/hooks/ui/useListKeyboardNavigation.d.ts +17 -0
- package/lib/hooks/ui/useListKeyboardNavigation.d.ts.map +1 -0
- package/lib/hooks/ui/useListKeyboardNavigation.js +25 -0
- package/lib/hooks/ui/useListKeyboardNavigation.js.map +1 -0
- package/lib/hooks/ui/useResizeObserver.d.ts +20 -0
- package/lib/hooks/ui/useResizeObserver.d.ts.map +1 -0
- package/lib/hooks/ui/useResizeObserver.js +37 -0
- package/lib/hooks/ui/useResizeObserver.js.map +1 -0
- package/lib/orbital/core/atomicGrid.d.ts +27 -0
- package/lib/orbital/core/atomicGrid.d.ts.map +1 -1
- package/lib/orbital/core/atomicGrid.js +37 -1
- package/lib/orbital/core/atomicGrid.js.map +1 -1
- package/lib/orbital/core/index.d.ts +9 -7
- package/lib/orbital/core/index.d.ts.map +1 -1
- package/lib/orbital/core/index.js +7 -6
- package/lib/orbital/core/index.js.map +1 -1
- package/lib/orbital/core/isovalue.d.ts +60 -0
- package/lib/orbital/core/isovalue.d.ts.map +1 -0
- package/lib/orbital/core/isovalue.js +128 -0
- package/lib/orbital/core/isovalue.js.map +1 -0
- package/lib/orbital/core/sample.d.ts +15 -1
- package/lib/orbital/core/sample.d.ts.map +1 -1
- package/lib/orbital/core/sample.js +10 -3
- package/lib/orbital/core/sample.js.map +1 -1
- package/lib/orbital/ui/AtomicOrbitalCanvas.d.ts +6 -1
- package/lib/orbital/ui/AtomicOrbitalCanvas.d.ts.map +1 -1
- package/lib/orbital/ui/AtomicOrbitalCanvas.js +12 -2
- package/lib/orbital/ui/AtomicOrbitalCanvas.js.map +1 -1
- package/lib/orbital/ui/AtomicOrbitalViewer.d.ts +5 -1
- package/lib/orbital/ui/AtomicOrbitalViewer.d.ts.map +1 -1
- package/lib/orbital/ui/AtomicOrbitalViewer.js.map +1 -1
- package/lib/orbital/ui/renderVolume.d.ts +6 -3
- package/lib/orbital/ui/renderVolume.d.ts.map +1 -1
- package/lib/orbital/ui/renderVolume.js +14 -15
- package/lib/orbital/ui/renderVolume.js.map +1 -1
- package/lib/orbital/ui/viewer.d.ts +3 -1
- package/lib/orbital/ui/viewer.d.ts.map +1 -1
- package/lib/orbital/ui/viewer.js +3 -2
- package/lib/orbital/ui/viewer.js.map +1 -1
- package/lib/orbital/ui/volumeField.d.ts +5 -21
- package/lib/orbital/ui/volumeField.d.ts.map +1 -1
- package/lib/orbital/ui/volumeField.js +5 -45
- package/lib/orbital/ui/volumeField.js.map +1 -1
- package/lib/pedagogy/core/glossary.d.ts +79 -0
- package/lib/pedagogy/core/glossary.d.ts.map +1 -0
- package/lib/pedagogy/core/glossary.js +71 -0
- package/lib/pedagogy/core/glossary.js.map +1 -0
- package/lib/pedagogy/core/index.d.ts +8 -0
- package/lib/pedagogy/core/index.d.ts.map +1 -0
- package/lib/pedagogy/core/index.js +4 -0
- package/lib/pedagogy/core/index.js.map +1 -0
- package/lib/pedagogy/core/jsonStorage.d.ts +21 -0
- package/lib/pedagogy/core/jsonStorage.d.ts.map +1 -0
- package/lib/pedagogy/core/jsonStorage.js +55 -0
- package/lib/pedagogy/core/jsonStorage.js.map +1 -0
- package/lib/pedagogy/core/progress.d.ts +116 -0
- package/lib/pedagogy/core/progress.d.ts.map +1 -0
- package/lib/pedagogy/core/progress.js +122 -0
- package/lib/pedagogy/core/progress.js.map +1 -0
- package/lib/pedagogy/core/types.d.ts +74 -0
- package/lib/pedagogy/core/types.d.ts.map +1 -0
- package/lib/pedagogy/core/types.js +8 -0
- package/lib/pedagogy/core/types.js.map +1 -0
- package/lib/pedagogy/core/validation.d.ts +79 -0
- package/lib/pedagogy/core/validation.d.ts.map +1 -0
- package/lib/pedagogy/core/validation.js +47 -0
- package/lib/pedagogy/core/validation.js.map +1 -0
- package/lib/pedagogy/ui/ExerciseActions.d.ts +74 -0
- package/lib/pedagogy/ui/ExerciseActions.d.ts.map +1 -0
- package/lib/pedagogy/ui/ExerciseActions.js +22 -0
- package/lib/pedagogy/ui/ExerciseActions.js.map +1 -0
- package/lib/pedagogy/ui/ExerciseProgressHeader.d.ts +43 -0
- package/lib/pedagogy/ui/ExerciseProgressHeader.d.ts.map +1 -0
- package/lib/pedagogy/ui/ExerciseProgressHeader.js +43 -0
- package/lib/pedagogy/ui/ExerciseProgressHeader.js.map +1 -0
- package/lib/pedagogy/ui/ExerciseTags.d.ts +49 -0
- package/lib/pedagogy/ui/ExerciseTags.d.ts.map +1 -0
- package/lib/pedagogy/ui/ExerciseTags.js +22 -0
- package/lib/pedagogy/ui/ExerciseTags.js.map +1 -0
- package/lib/pedagogy/ui/GlossaryProvider.d.ts +19 -0
- package/lib/pedagogy/ui/GlossaryProvider.d.ts.map +1 -0
- package/lib/pedagogy/ui/GlossaryProvider.js +16 -0
- package/lib/pedagogy/ui/GlossaryProvider.js.map +1 -0
- package/lib/pedagogy/ui/GlossaryText.d.ts +50 -0
- package/lib/pedagogy/ui/GlossaryText.d.ts.map +1 -0
- package/lib/pedagogy/ui/GlossaryText.js +79 -0
- package/lib/pedagogy/ui/GlossaryText.js.map +1 -0
- package/lib/pedagogy/ui/HintLadder.d.ts +38 -0
- package/lib/pedagogy/ui/HintLadder.d.ts.map +1 -0
- package/lib/pedagogy/ui/HintLadder.js +33 -0
- package/lib/pedagogy/ui/HintLadder.js.map +1 -0
- package/lib/pedagogy/ui/ReferenceGrid.d.ts +31 -0
- package/lib/pedagogy/ui/ReferenceGrid.d.ts.map +1 -0
- package/lib/pedagogy/ui/ReferenceGrid.js +25 -0
- package/lib/pedagogy/ui/ReferenceGrid.js.map +1 -0
- package/lib/pedagogy/ui/ReferenceSectionBlock.d.ts +64 -0
- package/lib/pedagogy/ui/ReferenceSectionBlock.d.ts.map +1 -0
- package/lib/pedagogy/ui/ReferenceSectionBlock.js +78 -0
- package/lib/pedagogy/ui/ReferenceSectionBlock.js.map +1 -0
- package/lib/pedagogy/ui/SyntaxTooltip.d.ts +94 -0
- package/lib/pedagogy/ui/SyntaxTooltip.d.ts.map +1 -0
- package/lib/pedagogy/ui/SyntaxTooltip.js +79 -0
- package/lib/pedagogy/ui/SyntaxTooltip.js.map +1 -0
- package/lib/pedagogy/ui/TestCaseList.d.ts +35 -0
- package/lib/pedagogy/ui/TestCaseList.d.ts.map +1 -0
- package/lib/pedagogy/ui/TestCaseList.js +63 -0
- package/lib/pedagogy/ui/TestCaseList.js.map +1 -0
- package/lib/pedagogy/ui/TutorialStepStrip.d.ts +42 -0
- package/lib/pedagogy/ui/TutorialStepStrip.d.ts.map +1 -0
- package/lib/pedagogy/ui/TutorialStepStrip.js +98 -0
- package/lib/pedagogy/ui/TutorialStepStrip.js.map +1 -0
- package/lib/pedagogy/ui/exerciseMeta.d.ts +24 -0
- package/lib/pedagogy/ui/exerciseMeta.d.ts.map +1 -0
- package/lib/pedagogy/ui/exerciseMeta.js +38 -0
- package/lib/pedagogy/ui/exerciseMeta.js.map +1 -0
- package/lib/pedagogy/ui/glossaryContext.d.ts +17 -0
- package/lib/pedagogy/ui/glossaryContext.d.ts.map +1 -0
- package/lib/pedagogy/ui/glossaryContext.js +19 -0
- package/lib/pedagogy/ui/glossaryContext.js.map +1 -0
- package/lib/pedagogy/ui/index.d.ts +27 -0
- package/lib/pedagogy/ui/index.d.ts.map +1 -0
- package/lib/pedagogy/ui/index.js +15 -0
- package/lib/pedagogy/ui/index.js.map +1 -0
- package/lib/pedagogy/ui/tutorialLevels.d.ts +18 -0
- package/lib/pedagogy/ui/tutorialLevels.d.ts.map +1 -0
- package/lib/pedagogy/ui/tutorialLevels.js +14 -0
- package/lib/pedagogy/ui/tutorialLevels.js.map +1 -0
- package/lib/router/core/address.d.ts +42 -0
- package/lib/router/core/address.d.ts.map +1 -0
- package/lib/router/core/address.js +64 -0
- package/lib/router/core/address.js.map +1 -0
- package/lib/router/core/basePath.d.ts +49 -0
- package/lib/router/core/basePath.d.ts.map +1 -0
- package/lib/router/core/basePath.js +78 -0
- package/lib/router/core/basePath.js.map +1 -0
- package/lib/router/core/index.d.ts +8 -0
- package/lib/router/core/index.d.ts.map +1 -0
- package/lib/router/core/index.js +5 -0
- package/lib/router/core/index.js.map +1 -0
- package/lib/router/core/legacyHash.d.ts +45 -0
- package/lib/router/core/legacyHash.d.ts.map +1 -0
- package/lib/router/core/legacyHash.js +50 -0
- package/lib/router/core/legacyHash.js.map +1 -0
- package/lib/router/core/pageAddresses.d.ts +50 -0
- package/lib/router/core/pageAddresses.d.ts.map +1 -0
- package/lib/router/core/pageAddresses.js +56 -0
- package/lib/router/core/pageAddresses.js.map +1 -0
- package/lib/router/core/query.d.ts +41 -0
- package/lib/router/core/query.d.ts.map +1 -0
- package/lib/router/core/query.js +64 -0
- package/lib/router/core/query.js.map +1 -0
- package/lib/router/core/tabRouter.d.ts +111 -0
- package/lib/router/core/tabRouter.d.ts.map +1 -0
- package/lib/router/core/tabRouter.js +87 -0
- package/lib/router/core/tabRouter.js.map +1 -0
- package/lib/seo/core/documentMeta.d.ts +45 -0
- package/lib/seo/core/documentMeta.d.ts.map +1 -0
- package/lib/seo/core/documentMeta.js +69 -0
- package/lib/seo/core/documentMeta.js.map +1 -0
- package/lib/seo/core/index.d.ts +9 -0
- package/lib/seo/core/index.d.ts.map +1 -0
- package/lib/seo/core/index.js +5 -0
- package/lib/seo/core/index.js.map +1 -0
- package/lib/seo/core/pageMeta.d.ts +60 -0
- package/lib/seo/core/pageMeta.d.ts.map +1 -0
- package/lib/seo/core/pageMeta.js +91 -0
- package/lib/seo/core/pageMeta.js.map +1 -0
- package/lib/seo/core/routes.d.ts +52 -0
- package/lib/seo/core/routes.d.ts.map +1 -0
- package/lib/seo/core/routes.js +62 -0
- package/lib/seo/core/routes.js.map +1 -0
- package/lib/seo/core/siteFiles.d.ts +73 -0
- package/lib/seo/core/siteFiles.d.ts.map +1 -0
- package/lib/seo/core/siteFiles.js +100 -0
- package/lib/seo/core/siteFiles.js.map +1 -0
- package/lib/seo/vite/index.d.ts +5 -0
- package/lib/seo/vite/index.d.ts.map +1 -0
- package/lib/seo/vite/index.js +3 -0
- package/lib/seo/vite/index.js.map +1 -0
- package/lib/seo/vite/ogCard.d.ts +33 -0
- package/lib/seo/vite/ogCard.d.ts.map +1 -0
- package/lib/seo/vite/ogCard.js +72 -0
- package/lib/seo/vite/ogCard.js.map +1 -0
- package/lib/seo/vite/prerender.d.ts +58 -0
- package/lib/seo/vite/prerender.d.ts.map +1 -0
- package/lib/seo/vite/prerender.js +76 -0
- package/lib/seo/vite/prerender.js.map +1 -0
- package/lib/share/core/config.d.ts +63 -0
- package/lib/share/core/config.d.ts.map +1 -0
- package/lib/share/core/config.js +125 -0
- package/lib/share/core/config.js.map +1 -0
- package/lib/share/core/escape.d.ts +15 -0
- package/lib/share/core/escape.d.ts.map +1 -0
- package/lib/share/core/escape.js +22 -0
- package/lib/share/core/escape.js.map +1 -0
- package/lib/share/core/index.d.ts +9 -0
- package/lib/share/core/index.d.ts.map +1 -0
- package/lib/share/core/index.js +5 -0
- package/lib/share/core/index.js.map +1 -0
- package/lib/share/core/params.d.ts +93 -0
- package/lib/share/core/params.d.ts.map +1 -0
- package/lib/share/core/params.js +111 -0
- package/lib/share/core/params.js.map +1 -0
- package/lib/share/core/query.d.ts +30 -0
- package/lib/share/core/query.d.ts.map +1 -0
- package/lib/share/core/query.js +68 -0
- package/lib/share/core/query.js.map +1 -0
- package/lib/share/core/url.d.ts +57 -0
- package/lib/share/core/url.d.ts.map +1 -0
- package/lib/share/core/url.js +49 -0
- package/lib/share/core/url.js.map +1 -0
- package/lib/share/core/vocabulary.d.ts +51 -0
- package/lib/share/core/vocabulary.d.ts.map +1 -0
- package/lib/share/core/vocabulary.js +2 -0
- package/lib/share/core/vocabulary.js.map +1 -0
- package/lib/share/ui/HiddenPartsProvider.d.ts +19 -0
- package/lib/share/ui/HiddenPartsProvider.d.ts.map +1 -0
- package/lib/share/ui/HiddenPartsProvider.js +15 -0
- package/lib/share/ui/HiddenPartsProvider.js.map +1 -0
- package/lib/share/ui/PagePart.d.ts +18 -0
- package/lib/share/ui/PagePart.d.ts.map +1 -0
- package/lib/share/ui/PagePart.js +16 -0
- package/lib/share/ui/PagePart.js.map +1 -0
- package/lib/share/ui/ShareButton.d.ts +42 -0
- package/lib/share/ui/ShareButton.d.ts.map +1 -0
- package/lib/share/ui/ShareButton.js +18 -0
- package/lib/share/ui/ShareButton.js.map +1 -0
- package/lib/share/ui/ShareDialog.d.ts +73 -0
- package/lib/share/ui/ShareDialog.d.ts.map +1 -0
- package/lib/share/ui/ShareDialog.js +19 -0
- package/lib/share/ui/ShareDialog.js.map +1 -0
- package/lib/share/ui/ShareDialogContent.d.ts +13 -0
- package/lib/share/ui/ShareDialogContent.d.ts.map +1 -0
- package/lib/share/ui/ShareDialogContent.js +71 -0
- package/lib/share/ui/ShareDialogContent.js.map +1 -0
- package/lib/share/ui/SharePartOptions.d.ts +18 -0
- package/lib/share/ui/SharePartOptions.d.ts.map +1 -0
- package/lib/share/ui/SharePartOptions.js +22 -0
- package/lib/share/ui/SharePartOptions.js.map +1 -0
- package/lib/share/ui/draft.d.ts +13 -0
- package/lib/share/ui/draft.d.ts.map +1 -0
- package/lib/share/ui/draft.js +16 -0
- package/lib/share/ui/draft.js.map +1 -0
- package/lib/share/ui/hiddenParts.d.ts +17 -0
- package/lib/share/ui/hiddenParts.d.ts.map +1 -0
- package/lib/share/ui/hiddenParts.js +21 -0
- package/lib/share/ui/hiddenParts.js.map +1 -0
- package/lib/share/ui/index.d.ts +10 -0
- package/lib/share/ui/index.d.ts.map +1 -0
- package/lib/share/ui/index.js +6 -0
- package/lib/share/ui/index.js.map +1 -0
- package/lib/shared/ui/index.d.ts +2 -1
- package/lib/shared/ui/index.d.ts.map +1 -1
- package/lib/shared/ui/index.js +1 -1
- package/lib/shared/ui/index.js.map +1 -1
- package/lib/state/ui/index.d.ts +3 -0
- package/lib/state/ui/index.d.ts.map +1 -0
- package/lib/state/ui/index.js +2 -0
- package/lib/state/ui/index.js.map +1 -0
- package/lib/state/ui/mergeStored.d.ts +27 -0
- package/lib/state/ui/mergeStored.d.ts.map +1 -0
- package/lib/state/ui/mergeStored.js +82 -0
- package/lib/state/ui/mergeStored.js.map +1 -0
- package/lib/state/ui/persistBucket.d.ts +65 -0
- package/lib/state/ui/persistBucket.d.ts.map +1 -0
- package/lib/state/ui/persistBucket.js +90 -0
- package/lib/state/ui/persistBucket.js.map +1 -0
- package/lib/structure/core/editorValue.d.ts +69 -0
- package/lib/structure/core/editorValue.d.ts.map +1 -0
- package/lib/structure/core/editorValue.js +72 -0
- package/lib/structure/core/editorValue.js.map +1 -0
- package/lib/structure/core/fragmentQuery.d.ts +33 -0
- package/lib/structure/core/fragmentQuery.d.ts.map +1 -0
- package/lib/structure/core/fragmentQuery.js +37 -0
- package/lib/structure/core/fragmentQuery.js.map +1 -0
- package/lib/structure/core/index.d.ts +11 -0
- package/lib/structure/core/index.d.ts.map +1 -0
- package/lib/structure/core/index.js +6 -0
- package/lib/structure/core/index.js.map +1 -0
- package/lib/structure/core/molfile.d.ts +42 -0
- package/lib/structure/core/molfile.d.ts.map +1 -0
- package/lib/structure/core/molfile.js +74 -0
- package/lib/structure/core/molfile.js.map +1 -0
- package/lib/structure/core/readStructure.d.ts +37 -0
- package/lib/structure/core/readStructure.d.ts.map +1 -0
- package/lib/structure/core/readStructure.js +59 -0
- package/lib/structure/core/readStructure.js.map +1 -0
- package/lib/structure/core/structureSource.d.ts +34 -0
- package/lib/structure/core/structureSource.d.ts.map +1 -0
- package/lib/structure/core/structureSource.js +32 -0
- package/lib/structure/core/structureSource.js.map +1 -0
- package/lib/structure/core/toolbarFloor.d.ts +16 -0
- package/lib/structure/core/toolbarFloor.d.ts.map +1 -0
- package/lib/structure/core/toolbarFloor.js +27 -0
- package/lib/structure/core/toolbarFloor.js.map +1 -0
- package/lib/structure/ui/EditorCanvas.d.ts +55 -0
- package/lib/structure/ui/EditorCanvas.d.ts.map +1 -0
- package/lib/structure/ui/EditorCanvas.js +41 -0
- package/lib/structure/ui/EditorCanvas.js.map +1 -0
- package/lib/structure/ui/Structure.d.ts +122 -0
- package/lib/structure/ui/Structure.d.ts.map +1 -0
- package/lib/structure/ui/Structure.js +28 -0
- package/lib/structure/ui/Structure.js.map +1 -0
- package/lib/structure/ui/StructureEditor.d.ts +75 -0
- package/lib/structure/ui/StructureEditor.d.ts.map +1 -0
- package/lib/structure/ui/StructureEditor.js +83 -0
- package/lib/structure/ui/StructureEditor.js.map +1 -0
- package/lib/structure/ui/StructurePlaceholder.d.ts +29 -0
- package/lib/structure/ui/StructurePlaceholder.d.ts.map +1 -0
- package/lib/structure/ui/StructurePlaceholder.js +19 -0
- package/lib/structure/ui/StructurePlaceholder.js.map +1 -0
- package/lib/structure/ui/StructureSvg.d.ts +58 -0
- package/lib/structure/ui/StructureSvg.d.ts.map +1 -0
- package/lib/structure/ui/StructureSvg.js +33 -0
- package/lib/structure/ui/StructureSvg.js.map +1 -0
- package/lib/structure/ui/index.d.ts +19 -0
- package/lib/structure/ui/index.d.ts.map +1 -0
- package/lib/structure/ui/index.js +15 -0
- package/lib/structure/ui/index.js.map +1 -0
- package/lib/structure/ui/useToolbarFloor.d.ts +26 -0
- package/lib/structure/ui/useToolbarFloor.d.ts.map +1 -0
- package/lib/structure/ui/useToolbarFloor.js +70 -0
- package/lib/structure/ui/useToolbarFloor.js.map +1 -0
- package/lib/structure.d.ts +3 -0
- package/lib/structure.d.ts.map +1 -0
- package/lib/structure.js +3 -0
- package/lib/structure.js.map +1 -0
- package/lib/ui.d.ts +13 -0
- package/lib/ui.d.ts.map +1 -1
- package/lib/ui.js +13 -0
- package/lib/ui.js.map +1 -1
- package/lib/vite.d.ts +2 -0
- package/lib/vite.d.ts.map +1 -0
- package/lib/vite.js +2 -0
- package/lib/vite.js.map +1 -0
- package/lib/worker/core/errors.d.ts +15 -0
- package/lib/worker/core/errors.d.ts.map +1 -0
- package/lib/worker/core/errors.js +15 -0
- package/lib/worker/core/errors.js.map +1 -0
- package/lib/worker/core/index.d.ts +5 -0
- package/lib/worker/core/index.d.ts.map +1 -0
- package/lib/worker/core/index.js +3 -0
- package/lib/worker/core/index.js.map +1 -0
- package/lib/worker/core/messages.d.ts +48 -0
- package/lib/worker/core/messages.d.ts.map +1 -0
- package/lib/worker/core/messages.js +2 -0
- package/lib/worker/core/messages.js.map +1 -0
- package/lib/worker/core/workerChannel.d.ts +69 -0
- package/lib/worker/core/workerChannel.d.ts.map +1 -0
- package/lib/worker/core/workerChannel.js +121 -0
- package/lib/worker/core/workerChannel.js.map +1 -0
- package/package.json +22 -4
- package/src/capsule/ui/CapsuleFilter.tsx +119 -0
- package/src/capsule/ui/index.ts +2 -0
- package/src/chrome/ui/NavLink.tsx +88 -0
- package/src/chrome/ui/NavMenuButton.tsx +95 -0
- package/src/chrome/ui/SiteFooter.tsx +65 -0
- package/src/chrome/ui/SiteHeader.tsx +119 -0
- package/src/chrome/ui/index.ts +11 -0
- package/src/chrome/ui/navItem.ts +60 -0
- package/src/chrome/ui/useCompactHeader.ts +81 -0
- package/src/citation/core/clipboard.ts +27 -11
- package/src/citation/core/download.ts +25 -15
- package/src/citation/core/index.ts +8 -3
- package/src/citation/core/works.ts +81 -0
- package/src/citation/ui/CitationMenu.tsx +104 -89
- package/src/citation/ui/CitationPreview.tsx +18 -8
- package/src/citation/ui/CiteButton.tsx +24 -9
- package/src/citation/ui/CopyFormatEntries.tsx +84 -0
- package/src/citation/ui/WorkEntry.tsx +80 -0
- package/src/citation/ui/entries.tsx +18 -20
- package/src/citation/ui/index.ts +10 -2
- package/src/citation/ui/useCopyFeedback.ts +76 -0
- package/src/clipboard/core/index.ts +1 -0
- package/src/clipboard/core/writeToClipboard.ts +47 -0
- package/src/clipboard/ui/CodeBlock.tsx +110 -0
- package/src/clipboard/ui/CopyButton.tsx +111 -0
- package/src/clipboard/ui/index.ts +9 -0
- package/src/clipboard/ui/useCopyToClipboard.ts +57 -0
- package/src/color/core/contrast.ts +85 -0
- package/src/color/core/hex.ts +57 -0
- package/src/color/core/index.ts +4 -0
- package/src/color/core/scale.ts +132 -0
- package/src/color/ui/ColorScaleLegend.tsx +144 -0
- package/src/color/ui/index.ts +2 -0
- package/src/core.ts +11 -0
- package/src/credits/core/credits.ts +183 -0
- package/src/credits/core/index.ts +2 -0
- package/src/credits/ui/CreditsList.tsx +82 -0
- package/src/credits/ui/index.ts +2 -0
- package/src/delimited/core/delimiters.ts +64 -0
- package/src/delimited/core/index.ts +11 -0
- package/src/delimited/core/readDelimited.ts +132 -0
- package/src/delimited/core/rowsToDelimited.ts +135 -0
- package/src/delimited/core/toDelimited.ts +69 -0
- package/src/delimited/ui/DelimitedTextDialog.tsx +49 -0
- package/src/delimited/ui/DelimitedTextPanel.tsx +161 -0
- package/src/delimited/ui/index.ts +4 -0
- package/src/disclosure/ui/CollapsibleSection.tsx +150 -0
- package/src/disclosure/ui/index.ts +4 -0
- package/src/disclosure/ui/useDisclosure.ts +35 -0
- package/src/download/core/downloadBlob.ts +19 -0
- package/src/download/core/downloadText.ts +19 -0
- package/src/download/core/index.ts +3 -0
- package/src/download/core/sanitizeFileName.ts +33 -0
- package/src/ecosystem/core/index.ts +3 -0
- package/src/ecosystem/core/links.ts +29 -0
- package/src/ecosystem/core/lookup.ts +57 -0
- package/src/ecosystem/core/sites.ts +21 -4
- package/src/ecosystem/core/tokens.ts +47 -0
- package/src/ecosystem/ui/SiteTheme.tsx +23 -0
- package/src/ecosystem/ui/Wordmark.tsx +65 -0
- package/src/ecosystem/ui/glyphs.tsx +1 -1
- package/src/ecosystem/ui/index.ts +4 -0
- package/src/ecosystem/ui/marks.tsx +54 -15
- package/src/error/ui/ErrorBoundary.tsx +94 -0
- package/src/error/ui/ErrorFallback.tsx +64 -0
- package/src/error/ui/index.ts +4 -0
- package/src/error/ui/toError.ts +33 -0
- package/src/format/core/index.ts +9 -0
- package/src/format/core/missing.ts +6 -0
- package/src/format/core/numbers.ts +84 -0
- package/src/format/core/units.ts +60 -0
- package/src/format/core/words.ts +17 -0
- package/src/help/ui/HelpBody.tsx +130 -0
- package/src/help/ui/HelpIcon.tsx +53 -0
- package/src/help/ui/HelpToolbarButton.tsx +72 -0
- package/src/help/ui/HelpTooltip.tsx +72 -0
- package/src/help/ui/index.ts +8 -0
- package/src/hooks/ui/index.ts +6 -0
- package/src/hooks/ui/listNavigation.ts +116 -0
- package/src/hooks/ui/useContainerSize.ts +32 -0
- package/src/hooks/ui/useDebouncedValue.ts +29 -0
- package/src/hooks/ui/useListKeyboardNavigation.ts +37 -0
- package/src/hooks/ui/useResizeObserver.ts +50 -0
- package/src/orbital/core/atomicGrid.ts +53 -1
- package/src/orbital/core/index.ts +7 -16
- package/src/orbital/core/isovalue.ts +146 -0
- package/src/orbital/core/sample.ts +25 -5
- package/src/orbital/ui/AtomicOrbitalCanvas.tsx +19 -3
- package/src/orbital/ui/AtomicOrbitalViewer.tsx +5 -1
- package/src/orbital/ui/renderVolume.ts +29 -16
- package/src/orbital/ui/viewer.ts +6 -1
- package/src/orbital/ui/volumeField.ts +5 -49
- package/src/pedagogy/core/glossary.ts +122 -0
- package/src/pedagogy/core/index.ts +28 -0
- package/src/pedagogy/core/jsonStorage.ts +51 -0
- package/src/pedagogy/core/progress.ts +205 -0
- package/src/pedagogy/core/types.ts +78 -0
- package/src/pedagogy/core/validation.ts +109 -0
- package/src/pedagogy/ui/ExerciseActions.tsx +129 -0
- package/src/pedagogy/ui/ExerciseProgressHeader.tsx +135 -0
- package/src/pedagogy/ui/ExerciseTags.tsx +85 -0
- package/src/pedagogy/ui/GlossaryProvider.tsx +31 -0
- package/src/pedagogy/ui/GlossaryText.tsx +164 -0
- package/src/pedagogy/ui/HintLadder.tsx +95 -0
- package/src/pedagogy/ui/ReferenceGrid.tsx +69 -0
- package/src/pedagogy/ui/ReferenceSectionBlock.tsx +175 -0
- package/src/pedagogy/ui/SyntaxTooltip.tsx +222 -0
- package/src/pedagogy/ui/TestCaseList.tsx +122 -0
- package/src/pedagogy/ui/TutorialStepStrip.tsx +230 -0
- package/src/pedagogy/ui/exerciseMeta.ts +45 -0
- package/src/pedagogy/ui/glossaryContext.ts +23 -0
- package/src/pedagogy/ui/index.ts +37 -0
- package/src/pedagogy/ui/tutorialLevels.ts +27 -0
- package/src/router/core/address.ts +74 -0
- package/src/router/core/basePath.ts +76 -0
- package/src/router/core/index.ts +26 -0
- package/src/router/core/legacyHash.ts +77 -0
- package/src/router/core/pageAddresses.ts +106 -0
- package/src/router/core/query.ts +87 -0
- package/src/router/core/tabRouter.ts +214 -0
- package/src/seo/core/documentMeta.ts +92 -0
- package/src/seo/core/index.ts +26 -0
- package/src/seo/core/pageMeta.ts +127 -0
- package/src/seo/core/routes.ts +79 -0
- package/src/seo/core/siteFiles.ts +150 -0
- package/src/seo/vite/index.ts +4 -0
- package/src/seo/vite/ogCard.ts +92 -0
- package/src/seo/vite/prerender.ts +156 -0
- package/src/share/core/config.ts +165 -0
- package/src/share/core/escape.ts +22 -0
- package/src/share/core/index.ts +31 -0
- package/src/share/core/params.ts +176 -0
- package/src/share/core/query.ts +72 -0
- package/src/share/core/url.ts +105 -0
- package/src/share/core/vocabulary.ts +60 -0
- package/src/share/ui/HiddenPartsProvider.tsx +34 -0
- package/src/share/ui/PagePart.tsx +26 -0
- package/src/share/ui/ShareButton.tsx +84 -0
- package/src/share/ui/ShareDialog.tsx +114 -0
- package/src/share/ui/ShareDialogContent.tsx +189 -0
- package/src/share/ui/SharePartOptions.tsx +51 -0
- package/src/share/ui/draft.ts +19 -0
- package/src/share/ui/hiddenParts.ts +22 -0
- package/src/share/ui/index.ts +9 -0
- package/src/shared/ui/index.ts +2 -1
- package/src/state/ui/index.ts +6 -0
- package/src/state/ui/mergeStored.ts +87 -0
- package/src/state/ui/persistBucket.ts +147 -0
- package/src/structure/core/editorValue.ts +116 -0
- package/src/structure/core/fragmentQuery.ts +50 -0
- package/src/structure/core/index.ts +13 -0
- package/src/structure/core/molfile.ts +90 -0
- package/src/structure/core/readStructure.ts +73 -0
- package/src/structure/core/structureSource.ts +57 -0
- package/src/structure/core/toolbarFloor.ts +31 -0
- package/src/structure/ui/EditorCanvas.tsx +130 -0
- package/src/structure/ui/Structure.tsx +183 -0
- package/src/structure/ui/StructureEditor.tsx +196 -0
- package/src/structure/ui/StructurePlaceholder.tsx +48 -0
- package/src/structure/ui/StructureSvg.tsx +110 -0
- package/src/structure/ui/index.ts +22 -0
- package/src/structure/ui/useToolbarFloor.ts +93 -0
- package/src/structure.ts +2 -0
- package/src/ui.ts +13 -0
- package/src/vite.ts +1 -0
- package/src/worker/core/errors.ts +15 -0
- package/src/worker/core/index.ts +8 -0
- package/src/worker/core/messages.ts +47 -0
- package/src/worker/core/workerChannel.ts +218 -0
- package/styles/chrome.css +223 -0
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A read-only depiction of a structure, whichever notation the caller has.
|
|
3
|
+
*
|
|
4
|
+
* Which notation is drawn, and what is shown when there is nothing to draw, is
|
|
5
|
+
* decided here; the drawing itself sits behind `React.lazy`, so a page that
|
|
6
|
+
* never renders a structure never downloads react-ocl and openchemlib for one.
|
|
7
|
+
* That is also what lets `react-cheminfo/structure` be imported at all when
|
|
8
|
+
* those optional peers are not installed.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import type { ReactElement, ReactNode } from 'react';
|
|
12
|
+
import { Suspense, lazy } from 'react';
|
|
13
|
+
|
|
14
|
+
import { structureSource } from '../core/structureSource.ts';
|
|
15
|
+
|
|
16
|
+
import { StructurePlaceholder } from './StructurePlaceholder.tsx';
|
|
17
|
+
|
|
18
|
+
const StructureSvg = lazy(async () => {
|
|
19
|
+
const module = await import('./StructureSvg.tsx');
|
|
20
|
+
return { default: module.StructureSvg };
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
/** What is written on a depiction besides the atoms and the bonds. */
|
|
24
|
+
export interface StructureLabels {
|
|
25
|
+
/**
|
|
26
|
+
* Write the index of every atom next to it.
|
|
27
|
+
* @default false
|
|
28
|
+
*/
|
|
29
|
+
atoms?: boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Write the index of every bond next to it.
|
|
32
|
+
* @default false
|
|
33
|
+
*/
|
|
34
|
+
bonds?: boolean;
|
|
35
|
+
/**
|
|
36
|
+
* Write the reaction mapping number of every mapped atom.
|
|
37
|
+
* @default false
|
|
38
|
+
*/
|
|
39
|
+
mapping?: boolean;
|
|
40
|
+
/**
|
|
41
|
+
* A caption drawn inside the picture, under the structure.
|
|
42
|
+
* @default undefined
|
|
43
|
+
*/
|
|
44
|
+
caption?: string;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export interface StructureProps {
|
|
48
|
+
/**
|
|
49
|
+
* A canonical openchemlib idCode, coordinates included or not. The most
|
|
50
|
+
* exact notation, so it is drawn in preference to the others.
|
|
51
|
+
* @default undefined
|
|
52
|
+
*/
|
|
53
|
+
idCode?: string;
|
|
54
|
+
/**
|
|
55
|
+
* Encoded 2D coordinates, when they did not travel with the idCode.
|
|
56
|
+
* @default undefined
|
|
57
|
+
*/
|
|
58
|
+
coordinates?: string;
|
|
59
|
+
/**
|
|
60
|
+
* A molfile, V2000 or V3000, drawn when there is no usable idCode.
|
|
61
|
+
* @default undefined
|
|
62
|
+
*/
|
|
63
|
+
molfile?: string;
|
|
64
|
+
/**
|
|
65
|
+
* A SMILES, drawn when there is neither an idCode nor a molfile. The layout
|
|
66
|
+
* is invented, so two depictions of the same molecule may differ.
|
|
67
|
+
* @default undefined
|
|
68
|
+
*/
|
|
69
|
+
smiles?: string;
|
|
70
|
+
/**
|
|
71
|
+
* Width of the picture, in pixels.
|
|
72
|
+
* @default 200
|
|
73
|
+
*/
|
|
74
|
+
width?: number;
|
|
75
|
+
/**
|
|
76
|
+
* Height of the picture, in pixels.
|
|
77
|
+
* @default 140
|
|
78
|
+
*/
|
|
79
|
+
height?: number;
|
|
80
|
+
/**
|
|
81
|
+
* What is written on the picture besides the structure itself.
|
|
82
|
+
* @default {}
|
|
83
|
+
*/
|
|
84
|
+
labels?: StructureLabels;
|
|
85
|
+
/**
|
|
86
|
+
* Crop the picture to the atoms rather than centring them in the box.
|
|
87
|
+
* @default true
|
|
88
|
+
*/
|
|
89
|
+
autoCrop?: boolean;
|
|
90
|
+
/**
|
|
91
|
+
* Blank space kept around the structure when it is cropped, in pixels.
|
|
92
|
+
* @default 4
|
|
93
|
+
*/
|
|
94
|
+
autoCropMargin?: number;
|
|
95
|
+
/**
|
|
96
|
+
* Atoms to paint, which is how a substructure match is shown.
|
|
97
|
+
* @default undefined
|
|
98
|
+
*/
|
|
99
|
+
atomHighlight?: number[];
|
|
100
|
+
/**
|
|
101
|
+
* The colour the highlighted atoms are painted.
|
|
102
|
+
* @default '#a5d8ff'
|
|
103
|
+
*/
|
|
104
|
+
atomHighlightColor?: string;
|
|
105
|
+
/**
|
|
106
|
+
* Bonds to paint.
|
|
107
|
+
* @default undefined
|
|
108
|
+
*/
|
|
109
|
+
bondHighlight?: number[];
|
|
110
|
+
/**
|
|
111
|
+
* The colour the highlighted bonds are painted.
|
|
112
|
+
* @default '#ffd8a8'
|
|
113
|
+
*/
|
|
114
|
+
bondHighlightColor?: string;
|
|
115
|
+
/**
|
|
116
|
+
* What is shown when there is no structure, or when the one supplied cannot
|
|
117
|
+
* be read. An em dash rather than a red box: a missing structure is a row of
|
|
118
|
+
* a table far more often than it is a bug worth shouting about.
|
|
119
|
+
* @default '—'
|
|
120
|
+
*/
|
|
121
|
+
fallback?: ReactNode;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Draw a structure, from whichever notation the caller has.
|
|
126
|
+
*
|
|
127
|
+
* Nothing here throws and nothing renders a broken box: a blank value, a
|
|
128
|
+
* molfile with an empty atom block and a SMILES with a typo in it all come out
|
|
129
|
+
* as the same quiet placeholder, sized like the picture that would have been
|
|
130
|
+
* drawn so a list of structures keeps its rhythm. The box the renderers load
|
|
131
|
+
* into is that same placeholder, so nothing moves once they arrive.
|
|
132
|
+
* @param props - The structure, its size and what is written on it.
|
|
133
|
+
* @returns The picture, or the placeholder.
|
|
134
|
+
*/
|
|
135
|
+
export function Structure(props: StructureProps): ReactElement {
|
|
136
|
+
const {
|
|
137
|
+
idCode,
|
|
138
|
+
coordinates,
|
|
139
|
+
molfile,
|
|
140
|
+
smiles,
|
|
141
|
+
width = 200,
|
|
142
|
+
height = 140,
|
|
143
|
+
labels = {},
|
|
144
|
+
autoCrop = true,
|
|
145
|
+
autoCropMargin = 4,
|
|
146
|
+
atomHighlight,
|
|
147
|
+
atomHighlightColor = '#a5d8ff',
|
|
148
|
+
bondHighlight,
|
|
149
|
+
bondHighlightColor = '#ffd8a8',
|
|
150
|
+
fallback = '—',
|
|
151
|
+
} = props;
|
|
152
|
+
|
|
153
|
+
const source = structureSource({ idCode, coordinates, molfile, smiles });
|
|
154
|
+
|
|
155
|
+
if (source.kind === 'empty') {
|
|
156
|
+
return (
|
|
157
|
+
<StructurePlaceholder width={width} height={height}>
|
|
158
|
+
{fallback}
|
|
159
|
+
</StructurePlaceholder>
|
|
160
|
+
);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
return (
|
|
164
|
+
<Suspense fallback={<StructurePlaceholder width={width} height={height} />}>
|
|
165
|
+
<StructureSvg
|
|
166
|
+
source={source}
|
|
167
|
+
width={width}
|
|
168
|
+
height={height}
|
|
169
|
+
autoCrop={autoCrop}
|
|
170
|
+
autoCropMargin={autoCropMargin}
|
|
171
|
+
atomHighlight={atomHighlight}
|
|
172
|
+
atomHighlightColor={atomHighlightColor}
|
|
173
|
+
bondHighlight={bondHighlight}
|
|
174
|
+
bondHighlightColor={bondHighlightColor}
|
|
175
|
+
showAtomNumber={labels.atoms ?? false}
|
|
176
|
+
showBondNumber={labels.bonds ?? false}
|
|
177
|
+
showMapping={labels.mapping ?? false}
|
|
178
|
+
label={labels.caption}
|
|
179
|
+
fallback={fallback}
|
|
180
|
+
/>
|
|
181
|
+
</Suspense>
|
|
182
|
+
);
|
|
183
|
+
}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The canvas structure editor and the box it is drawn in.
|
|
3
|
+
*
|
|
4
|
+
* The canvas itself sits behind `React.lazy`: it is the half that imports
|
|
5
|
+
* react-ocl, so a page that never opens an editor never downloads openchemlib,
|
|
6
|
+
* and `react-cheminfo/structure` stays importable when those optional peers
|
|
7
|
+
* are absent.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import type { CSSProperties, ReactElement } from 'react';
|
|
11
|
+
import { Suspense, lazy, useCallback, useEffect, useRef } from 'react';
|
|
12
|
+
import type { CanvasEditorInputFormat } from 'react-ocl';
|
|
13
|
+
|
|
14
|
+
import type {
|
|
15
|
+
StructureEditorChange,
|
|
16
|
+
StructureEditorMode,
|
|
17
|
+
} from './EditorCanvas.tsx';
|
|
18
|
+
import { useToolbarFloor } from './useToolbarFloor.ts';
|
|
19
|
+
|
|
20
|
+
const EditorCanvas = lazy(async () => {
|
|
21
|
+
const module = await import('./EditorCanvas.tsx');
|
|
22
|
+
return { default: module.EditorCanvas };
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
export interface StructureEditorProps {
|
|
26
|
+
/**
|
|
27
|
+
* Called after every edit, once the drawing has been still for `debounce`
|
|
28
|
+
* milliseconds, with every notation read out of the editor.
|
|
29
|
+
*/
|
|
30
|
+
onChange: (change: StructureEditorChange) => void;
|
|
31
|
+
/**
|
|
32
|
+
* Draw a query fragment rather than a whole structure, which is what a
|
|
33
|
+
* substructure filter needs.
|
|
34
|
+
* @default false
|
|
35
|
+
*/
|
|
36
|
+
fragment?: boolean;
|
|
37
|
+
/**
|
|
38
|
+
* How `value` is written.
|
|
39
|
+
* @default 'idcode'
|
|
40
|
+
*/
|
|
41
|
+
inputFormat?: CanvasEditorInputFormat;
|
|
42
|
+
/**
|
|
43
|
+
* What the canvas holds. Read once, when the editor appears and again on
|
|
44
|
+
* every change of `revision`: the editor is uncontrolled, so feeding the
|
|
45
|
+
* drawing back into it would replace the structure and reset every
|
|
46
|
+
* coordinate under the pen.
|
|
47
|
+
* @default ''
|
|
48
|
+
*/
|
|
49
|
+
value?: string;
|
|
50
|
+
/**
|
|
51
|
+
* Bumped by the caller to load `value` into the canvas again, which is what
|
|
52
|
+
* an example, a share link or a Clear button does. Changing it discards
|
|
53
|
+
* whatever was being drawn.
|
|
54
|
+
* @default 0
|
|
55
|
+
*/
|
|
56
|
+
revision?: number;
|
|
57
|
+
/**
|
|
58
|
+
* How long the drawing has to be still before `onChange` is called, in
|
|
59
|
+
* milliseconds. Long enough that drawing a ring does not publish six
|
|
60
|
+
* structures; `0` reports every stroke.
|
|
61
|
+
* @default 300
|
|
62
|
+
*/
|
|
63
|
+
debounce?: number;
|
|
64
|
+
/**
|
|
65
|
+
* Smallest height of the drawing area, in pixels. Raised to whatever the
|
|
66
|
+
* toolbar needs, which is usually more.
|
|
67
|
+
* @default 320
|
|
68
|
+
*/
|
|
69
|
+
minHeight?: number;
|
|
70
|
+
/**
|
|
71
|
+
* Whether the editor draws one structure or a reaction. A reaction canvas
|
|
72
|
+
* has its own toolbar and its own arrow.
|
|
73
|
+
* @default 'molecule'
|
|
74
|
+
*/
|
|
75
|
+
mode?: StructureEditorMode;
|
|
76
|
+
/** Class the container carries, so a site can reach it from its stylesheet. */
|
|
77
|
+
className?: string;
|
|
78
|
+
/** Extra style for the container, merged over the packaged one. */
|
|
79
|
+
style?: CSSProperties;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* The canvas structure editor, sized to fill its container and never to hide
|
|
84
|
+
* part of its toolbar.
|
|
85
|
+
* @param props - What to draw, when to reload it, and where to send it.
|
|
86
|
+
* @returns The editor.
|
|
87
|
+
*/
|
|
88
|
+
export function StructureEditor(props: StructureEditorProps): ReactElement {
|
|
89
|
+
const {
|
|
90
|
+
onChange,
|
|
91
|
+
fragment = false,
|
|
92
|
+
inputFormat = 'idcode',
|
|
93
|
+
value = '',
|
|
94
|
+
revision = 0,
|
|
95
|
+
debounce = 300,
|
|
96
|
+
minHeight = 320,
|
|
97
|
+
mode = 'molecule',
|
|
98
|
+
className,
|
|
99
|
+
style,
|
|
100
|
+
} = props;
|
|
101
|
+
|
|
102
|
+
const containerRef = useToolbarFloor({ minHeight, revision });
|
|
103
|
+
const handleChange = useDebounced(onChange, debounce, revision);
|
|
104
|
+
|
|
105
|
+
return (
|
|
106
|
+
<div
|
|
107
|
+
ref={containerRef}
|
|
108
|
+
className={className}
|
|
109
|
+
style={{ ...ROOT_STYLE, minHeight, ...style }}
|
|
110
|
+
>
|
|
111
|
+
<Suspense fallback={<div style={LOADING_STYLE}>Loading the editor…</div>}>
|
|
112
|
+
<EditorCanvas
|
|
113
|
+
key={revision}
|
|
114
|
+
onChange={handleChange}
|
|
115
|
+
fragment={fragment}
|
|
116
|
+
inputFormat={inputFormat}
|
|
117
|
+
value={value}
|
|
118
|
+
mode={mode}
|
|
119
|
+
/>
|
|
120
|
+
</Suspense>
|
|
121
|
+
</div>
|
|
122
|
+
);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Report the last edit of a burst rather than every one of them.
|
|
127
|
+
*
|
|
128
|
+
* The editor's own event is read out before the wait starts, so what arrives
|
|
129
|
+
* late is a plain object rather than a handle on an editor that has moved on.
|
|
130
|
+
* @param onChange - What the caller wants told.
|
|
131
|
+
* @param delay - How long the drawing has to be still, in milliseconds.
|
|
132
|
+
* @param resetKey - Dropped edits: a burst still waiting when the caller
|
|
133
|
+
* replaces the structure describes a canvas that no longer exists.
|
|
134
|
+
* @returns The handler to give the canvas.
|
|
135
|
+
*/
|
|
136
|
+
function useDebounced(
|
|
137
|
+
onChange: (change: StructureEditorChange) => void,
|
|
138
|
+
delay: number,
|
|
139
|
+
resetKey: number,
|
|
140
|
+
): (change: StructureEditorChange) => void {
|
|
141
|
+
const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
|
|
142
|
+
const onChangeRef = useRef(onChange);
|
|
143
|
+
useEffect(() => {
|
|
144
|
+
onChangeRef.current = onChange;
|
|
145
|
+
});
|
|
146
|
+
useEffect(() => {
|
|
147
|
+
return () => {
|
|
148
|
+
if (timerRef.current !== null) {
|
|
149
|
+
clearTimeout(timerRef.current);
|
|
150
|
+
timerRef.current = null;
|
|
151
|
+
}
|
|
152
|
+
};
|
|
153
|
+
}, [resetKey]);
|
|
154
|
+
|
|
155
|
+
return useCallback(
|
|
156
|
+
(change: StructureEditorChange) => {
|
|
157
|
+
if (timerRef.current !== null) clearTimeout(timerRef.current);
|
|
158
|
+
if (delay <= 0) {
|
|
159
|
+
onChangeRef.current(change);
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
timerRef.current = setTimeout(() => {
|
|
163
|
+
timerRef.current = null;
|
|
164
|
+
onChangeRef.current(change);
|
|
165
|
+
}, delay);
|
|
166
|
+
},
|
|
167
|
+
[delay],
|
|
168
|
+
);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* The canvas is positioned out of the height computation, so the container's
|
|
173
|
+
* own height is what the measured toolbar floor writes on it. The `minHeight`
|
|
174
|
+
* prop is applied on top of this at first render: without a height before the
|
|
175
|
+
* toolbar has been measured, the editor is built at zero size and never paints
|
|
176
|
+
* the structure it was given.
|
|
177
|
+
*/
|
|
178
|
+
const ROOT_STYLE: CSSProperties = {
|
|
179
|
+
position: 'relative',
|
|
180
|
+
overflow: 'hidden',
|
|
181
|
+
boxSizing: 'border-box',
|
|
182
|
+
border: '1px solid #d3d8de',
|
|
183
|
+
borderRadius: 6,
|
|
184
|
+
background: '#fff',
|
|
185
|
+
};
|
|
186
|
+
|
|
187
|
+
/** The box the canvas will fill, so its arrival moves nothing. */
|
|
188
|
+
const LOADING_STYLE: CSSProperties = {
|
|
189
|
+
position: 'absolute',
|
|
190
|
+
inset: 0,
|
|
191
|
+
display: 'flex',
|
|
192
|
+
alignItems: 'center',
|
|
193
|
+
justifyContent: 'center',
|
|
194
|
+
color: '#8a96a3',
|
|
195
|
+
fontSize: 13,
|
|
196
|
+
};
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The box a depiction leaves behind when there is no picture in it — nothing
|
|
3
|
+
* to draw, a notation that cannot be read, or the moment before the renderers
|
|
4
|
+
* have been downloaded.
|
|
5
|
+
*
|
|
6
|
+
* It is kept apart from the renderers on purpose: it pulls nothing in, so both
|
|
7
|
+
* sides of the `React.lazy` boundary in `Structure` can use it.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import type { CSSProperties, ReactElement, ReactNode } from 'react';
|
|
11
|
+
|
|
12
|
+
/** Props of {@link StructurePlaceholder}. */
|
|
13
|
+
export interface StructurePlaceholderProps {
|
|
14
|
+
/** Width of the box, in pixels: the width the picture would have had. */
|
|
15
|
+
width: number;
|
|
16
|
+
/** Height of the box, in pixels. */
|
|
17
|
+
height: number;
|
|
18
|
+
/**
|
|
19
|
+
* What is written in the middle of the box.
|
|
20
|
+
* @default undefined
|
|
21
|
+
*/
|
|
22
|
+
children?: ReactNode;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* A box the size of the picture that is not there, holding whatever the caller
|
|
27
|
+
* wants said instead.
|
|
28
|
+
* @param props - See {@link StructurePlaceholderProps}.
|
|
29
|
+
* @returns The placeholder.
|
|
30
|
+
*/
|
|
31
|
+
export function StructurePlaceholder(
|
|
32
|
+
props: StructurePlaceholderProps,
|
|
33
|
+
): ReactElement {
|
|
34
|
+
const { width, height, children } = props;
|
|
35
|
+
return (
|
|
36
|
+
<span style={{ ...PLACEHOLDER_STYLE, width, height }} aria-hidden="true">
|
|
37
|
+
{children}
|
|
38
|
+
</span>
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const PLACEHOLDER_STYLE: CSSProperties = {
|
|
43
|
+
display: 'inline-flex',
|
|
44
|
+
alignItems: 'center',
|
|
45
|
+
justifyContent: 'center',
|
|
46
|
+
color: '#8a96a3',
|
|
47
|
+
fontSize: '0.75rem',
|
|
48
|
+
};
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The react-ocl depiction of a structure whose notation has already been
|
|
3
|
+
* picked.
|
|
4
|
+
*
|
|
5
|
+
* `Structure` holds it behind `React.lazy`, and the barrel deliberately does
|
|
6
|
+
* not export it: this is the file that value-imports react-ocl, so
|
|
7
|
+
* anything able to reach it statically drags openchemlib into every bundle,
|
|
8
|
+
* including the ones that only ever wanted the Tools menu.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import type { ComponentType, ReactElement, ReactNode } from 'react';
|
|
12
|
+
import { useMemo } from 'react';
|
|
13
|
+
import type { ErrorComponentProps } from 'react-ocl';
|
|
14
|
+
import {
|
|
15
|
+
IdcodeSvgRenderer,
|
|
16
|
+
MolfileSvgRenderer,
|
|
17
|
+
SmilesSvgRenderer,
|
|
18
|
+
} from 'react-ocl';
|
|
19
|
+
|
|
20
|
+
import type { StructureSource } from '../core/structureSource.ts';
|
|
21
|
+
|
|
22
|
+
import { StructurePlaceholder } from './StructurePlaceholder.tsx';
|
|
23
|
+
|
|
24
|
+
/** Props of {@link StructureSvg}. */
|
|
25
|
+
export interface StructureSvgProps {
|
|
26
|
+
/** The notation to draw, as `structureSource` picked it. */
|
|
27
|
+
source: StructureSource;
|
|
28
|
+
/** Width of the picture, in pixels. */
|
|
29
|
+
width: number;
|
|
30
|
+
/** Height of the picture, in pixels. */
|
|
31
|
+
height: number;
|
|
32
|
+
/** Crop the picture to the atoms rather than centring them in the box. */
|
|
33
|
+
autoCrop: boolean;
|
|
34
|
+
/** Blank space kept around the structure when it is cropped, in pixels. */
|
|
35
|
+
autoCropMargin: number;
|
|
36
|
+
/**
|
|
37
|
+
* Atoms to paint, which is how a substructure match is shown.
|
|
38
|
+
* @default undefined
|
|
39
|
+
*/
|
|
40
|
+
atomHighlight?: number[];
|
|
41
|
+
/** The colour the highlighted atoms are painted. */
|
|
42
|
+
atomHighlightColor: string;
|
|
43
|
+
/**
|
|
44
|
+
* Bonds to paint.
|
|
45
|
+
* @default undefined
|
|
46
|
+
*/
|
|
47
|
+
bondHighlight?: number[];
|
|
48
|
+
/** The colour the highlighted bonds are painted. */
|
|
49
|
+
bondHighlightColor: string;
|
|
50
|
+
/** Write the index of every atom next to it. */
|
|
51
|
+
showAtomNumber: boolean;
|
|
52
|
+
/** Write the index of every bond next to it. */
|
|
53
|
+
showBondNumber: boolean;
|
|
54
|
+
/** Write the reaction mapping number of every mapped atom. */
|
|
55
|
+
showMapping: boolean;
|
|
56
|
+
/**
|
|
57
|
+
* A caption drawn inside the picture, under the structure.
|
|
58
|
+
* @default undefined
|
|
59
|
+
*/
|
|
60
|
+
label?: string;
|
|
61
|
+
/** What is shown in place of a structure react-ocl refuses to read. */
|
|
62
|
+
fallback: ReactNode;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Draw the picture with the renderer the notation calls for.
|
|
67
|
+
* @param props - See {@link StructureSvgProps}.
|
|
68
|
+
* @returns The svg, or the placeholder when the notation cannot be read.
|
|
69
|
+
*/
|
|
70
|
+
export function StructureSvg(props: StructureSvgProps): ReactElement {
|
|
71
|
+
const { source, fallback, ...rest } = props;
|
|
72
|
+
|
|
73
|
+
const ErrorComponent = useMemo(
|
|
74
|
+
() => createFallbackRenderer(fallback),
|
|
75
|
+
[fallback],
|
|
76
|
+
);
|
|
77
|
+
const shared = { ...rest, ErrorComponent };
|
|
78
|
+
|
|
79
|
+
if (source.kind === 'idcode') {
|
|
80
|
+
return (
|
|
81
|
+
<IdcodeSvgRenderer
|
|
82
|
+
idcode={source.value}
|
|
83
|
+
coordinates={source.coordinates}
|
|
84
|
+
{...shared}
|
|
85
|
+
/>
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
if (source.kind === 'molfile') {
|
|
89
|
+
return <MolfileSvgRenderer molfile={source.value} {...shared} />;
|
|
90
|
+
}
|
|
91
|
+
return <SmilesSvgRenderer smiles={source.value} {...shared} />;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Build the renderer react-ocl falls back to, so a structure it refuses looks
|
|
96
|
+
* like one that was never supplied rather than like an error.
|
|
97
|
+
* @param fallback - What the caller wants shown instead of the structure.
|
|
98
|
+
* @returns The component react-ocl renders in place of the picture.
|
|
99
|
+
*/
|
|
100
|
+
function createFallbackRenderer(
|
|
101
|
+
fallback: ReactNode,
|
|
102
|
+
): ComponentType<ErrorComponentProps> {
|
|
103
|
+
return function StructureFallback(props: ErrorComponentProps): ReactElement {
|
|
104
|
+
return (
|
|
105
|
+
<StructurePlaceholder width={props.width} height={props.height}>
|
|
106
|
+
{fallback}
|
|
107
|
+
</StructurePlaceholder>
|
|
108
|
+
);
|
|
109
|
+
};
|
|
110
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a site imports to show or to draw a structure.
|
|
3
|
+
*
|
|
4
|
+
* **Nothing exported here may pull react-ocl or openchemlib in statically.**
|
|
5
|
+
* `StructureSvg` and `EditorCanvas` are deliberately absent: re-exporting
|
|
6
|
+
* either would make react-ocl reachable from this barrel, the `React.lazy`
|
|
7
|
+
* boundaries inside `Structure` and `StructureEditor` would be defeated, and
|
|
8
|
+
* `react-cheminfo/structure` would stop being importable at all when those
|
|
9
|
+
* optional peers are not installed — which is what a site wanting only the
|
|
10
|
+
* Tools menu does. Type-only re-exports are erased and so are safe.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
export type {
|
|
14
|
+
StructureEditorChange,
|
|
15
|
+
StructureEditorMode,
|
|
16
|
+
} from './EditorCanvas.tsx';
|
|
17
|
+
export type { StructureLabels, StructureProps } from './Structure.tsx';
|
|
18
|
+
export { Structure } from './Structure.tsx';
|
|
19
|
+
export type { StructureEditorProps } from './StructureEditor.tsx';
|
|
20
|
+
export { StructureEditor } from './StructureEditor.tsx';
|
|
21
|
+
export type { ToolbarFloorOptions } from './useToolbarFloor.ts';
|
|
22
|
+
export { useToolbarFloor } from './useToolbarFloor.ts';
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import type { RefObject } from 'react';
|
|
2
|
+
import { useLayoutEffect, useRef } from 'react';
|
|
3
|
+
|
|
4
|
+
import { toolbarFloorHeight } from '../core/toolbarFloor.ts';
|
|
5
|
+
|
|
6
|
+
export interface ToolbarFloorOptions {
|
|
7
|
+
/**
|
|
8
|
+
* Smallest height of the drawing area, in pixels. Raised to whatever the
|
|
9
|
+
* toolbar needs, which is usually more.
|
|
10
|
+
* @default 320
|
|
11
|
+
*/
|
|
12
|
+
minHeight?: number;
|
|
13
|
+
/**
|
|
14
|
+
* Bumped to look for the toolbar again, which a caller does after the editor
|
|
15
|
+
* has been remounted and the previous toolbar element has gone.
|
|
16
|
+
* @default 0
|
|
17
|
+
*/
|
|
18
|
+
revision?: number;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Give an editor's container a minimum height that shows the whole toolbar.
|
|
23
|
+
*
|
|
24
|
+
* The height is measured rather than written down, so a different button count
|
|
25
|
+
* — a fragment editor, a reaction editor, a future release — keeps working
|
|
26
|
+
* instead of clipping its last buttons behind whatever follows the editor.
|
|
27
|
+
* @param options - The height the caller asked for, and when to look again.
|
|
28
|
+
* @returns The ref to put on the element wrapping the editor.
|
|
29
|
+
*/
|
|
30
|
+
export function useToolbarFloor(
|
|
31
|
+
options: ToolbarFloorOptions = {},
|
|
32
|
+
): RefObject<HTMLDivElement | null> {
|
|
33
|
+
const { minHeight = 320, revision = 0 } = options;
|
|
34
|
+
const containerRef = useRef<HTMLDivElement>(null);
|
|
35
|
+
|
|
36
|
+
useLayoutEffect(() => {
|
|
37
|
+
const container = containerRef.current;
|
|
38
|
+
if (container === null) return;
|
|
39
|
+
|
|
40
|
+
let observer: ResizeObserver | null = null;
|
|
41
|
+
let frame = 0;
|
|
42
|
+
let attempts = 0;
|
|
43
|
+
|
|
44
|
+
// The editor builds itself asynchronously, so the toolbar is usually not
|
|
45
|
+
// there yet on the first look; watching for it is what keeps a slow first
|
|
46
|
+
// paint from leaving the container at its unmeasured height for good.
|
|
47
|
+
const attach = (): void => {
|
|
48
|
+
const toolbar = findToolbar(container);
|
|
49
|
+
if (toolbar === null) {
|
|
50
|
+
attempts++;
|
|
51
|
+
if (attempts > MAX_ATTEMPTS) return;
|
|
52
|
+
frame = globalThis.requestAnimationFrame(attach);
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
observer = new ResizeObserver(() => {
|
|
56
|
+
// offsetHeight, because a dialog opens under a scaling transform and a
|
|
57
|
+
// measured rectangle would be that of the half drawn toolbar.
|
|
58
|
+
const floor = toolbarFloorHeight(toolbar.offsetHeight, minHeight);
|
|
59
|
+
container.style.minHeight = `${floor}px`;
|
|
60
|
+
});
|
|
61
|
+
observer.observe(toolbar);
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
attach();
|
|
65
|
+
|
|
66
|
+
return () => {
|
|
67
|
+
if (frame !== 0) globalThis.cancelAnimationFrame(frame);
|
|
68
|
+
observer?.disconnect();
|
|
69
|
+
};
|
|
70
|
+
}, [minHeight, revision]);
|
|
71
|
+
|
|
72
|
+
return containerRef;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/** Roughly two seconds of frames, after which the editor is not coming. */
|
|
76
|
+
const MAX_ATTEMPTS = 120;
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Find the toolbar canvas of the editor.
|
|
80
|
+
*
|
|
81
|
+
* The editor builds itself inside a shadow root and puts the toolbar there as
|
|
82
|
+
* a direct child, the drawing canvas being nested deeper.
|
|
83
|
+
* @param container - The element wrapping the editor.
|
|
84
|
+
* @returns The toolbar canvas, or null while the editor has not drawn one.
|
|
85
|
+
*/
|
|
86
|
+
function findToolbar(container: HTMLElement): HTMLCanvasElement | null {
|
|
87
|
+
for (const element of container.querySelectorAll('*')) {
|
|
88
|
+
for (const child of element.shadowRoot?.children ?? []) {
|
|
89
|
+
if (child instanceof HTMLCanvasElement) return child;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return null;
|
|
93
|
+
}
|
package/src/structure.ts
ADDED
package/src/ui.ts
CHANGED
|
@@ -1,3 +1,16 @@
|
|
|
1
|
+
export * from './capsule/ui/index.ts';
|
|
2
|
+
export * from './chrome/ui/index.ts';
|
|
1
3
|
export * from './citation/ui/index.ts';
|
|
4
|
+
export * from './clipboard/ui/index.ts';
|
|
5
|
+
export * from './color/ui/index.ts';
|
|
6
|
+
export * from './credits/ui/index.ts';
|
|
7
|
+
export * from './delimited/ui/index.ts';
|
|
8
|
+
export * from './disclosure/ui/index.ts';
|
|
2
9
|
export * from './ecosystem/ui/index.ts';
|
|
10
|
+
export * from './error/ui/index.ts';
|
|
11
|
+
export * from './help/ui/index.ts';
|
|
12
|
+
export * from './hooks/ui/index.ts';
|
|
13
|
+
export * from './pedagogy/ui/index.ts';
|
|
14
|
+
export * from './share/ui/index.ts';
|
|
3
15
|
export * from './shared/ui/index.ts';
|
|
16
|
+
export * from './state/ui/index.ts';
|
package/src/vite.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './seo/vite/index.ts';
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rejection of a request nobody is waiting for any more: its signal was
|
|
3
|
+
* aborted, or the channel it was posted on was terminated.
|
|
4
|
+
*
|
|
5
|
+
* It is the normal outcome of dragging a slider or clicking through a list, so
|
|
6
|
+
* a caller catches it and draws nothing rather than reporting a failure.
|
|
7
|
+
*/
|
|
8
|
+
export class CancelledRequestError extends Error {
|
|
9
|
+
override name = 'CancelledRequestError';
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/** Rejection of a request that outlived its budget and was given up on. */
|
|
13
|
+
export class RequestTimeoutError extends Error {
|
|
14
|
+
override name = 'RequestTimeoutError';
|
|
15
|
+
}
|