react-cheminfo 0.3.0 → 0.4.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 +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 +21 -0
- package/lib/ecosystem/core/lookup.d.ts.map +1 -0
- package/lib/ecosystem/core/lookup.js +40 -0
- package/lib/ecosystem/core/lookup.js.map +1 -0
- package/lib/ecosystem/core/sites.d.ts +2 -0
- package/lib/ecosystem/core/sites.d.ts.map +1 -1
- package/lib/ecosystem/core/sites.js +15 -0
- 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/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 +3 -0
- package/lib/seo/core/index.d.ts.map +1 -0
- package/lib/seo/core/index.js +2 -0
- package/lib/seo/core/index.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/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 +18 -5
- 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 +41 -0
- package/src/ecosystem/core/sites.ts +17 -0
- 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/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 +6 -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/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
|
@@ -16,7 +16,11 @@ import type { AtomicOrbital } from './atomicOrbitals.ts';
|
|
|
16
16
|
import { hydrogenicParametersOf } from './atomicOrbitals.ts';
|
|
17
17
|
import type { GridBox, OrbitalEvaluator, OrbitalGrid } from './grid.ts';
|
|
18
18
|
import { evaluateGrid } from './grid.ts';
|
|
19
|
-
import {
|
|
19
|
+
import {
|
|
20
|
+
createRadialFunction,
|
|
21
|
+
enclosingRadius,
|
|
22
|
+
radialNodeRadii,
|
|
23
|
+
} from './hydrogenic.ts';
|
|
20
24
|
|
|
21
25
|
/** How finely, and how far out, an orbital is sampled. */
|
|
22
26
|
export interface AtomicGridOptions {
|
|
@@ -105,9 +109,57 @@ export function atomicGridBox(
|
|
|
105
109
|
};
|
|
106
110
|
}
|
|
107
111
|
|
|
112
|
+
/** How finely one orbital may be sampled, whatever its shape asks for. */
|
|
113
|
+
export interface ResolutionLimits {
|
|
114
|
+
/** Samples per edge no orbital drops below. */
|
|
115
|
+
floor: number;
|
|
116
|
+
/** Samples per edge no orbital exceeds. */
|
|
117
|
+
cap: number;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* How finely this particular orbital has to be sampled.
|
|
122
|
+
*
|
|
123
|
+
* One resolution for a whole periodic table draws the nested orbitals badly.
|
|
124
|
+
* The box is sized by the outermost lobe, but a `4p` also has to separate two
|
|
125
|
+
* inner shells packed against the nucleus, and at 56 samples per edge xenon's
|
|
126
|
+
* innermost 4p lobe spans **6.6 voxels** while the outer one spans 41 — the
|
|
127
|
+
* inner shells come out as lumps and the outer surface visibly faceted. What
|
|
128
|
+
* sets the requirement is therefore the ratio between the box and the smallest
|
|
129
|
+
* feature in it, not the orbital's size, which is why a nodeless orbital
|
|
130
|
+
* (every `1s`, `2p`, `3d`, `4f`) stays on the floor and costs nothing extra.
|
|
131
|
+
*
|
|
132
|
+
* The cap is not a budget cheat: the innermost lobe of caesium's `7s` would
|
|
133
|
+
* need 858 samples per edge, and no uniform grid the browser can afford
|
|
134
|
+
* resolves it. Those orbitals are drawn as well as the cap allows.
|
|
135
|
+
* @param orbital - The orbital to draw.
|
|
136
|
+
* @param limits - See {@link ResolutionLimits}.
|
|
137
|
+
* @returns Samples along each edge of the cube.
|
|
138
|
+
*/
|
|
139
|
+
export function atomicGridResolution(
|
|
140
|
+
orbital: AtomicOrbital,
|
|
141
|
+
limits: ResolutionLimits,
|
|
142
|
+
): number {
|
|
143
|
+
const { floor, cap } = limits;
|
|
144
|
+
const parameters = hydrogenicParametersOf(orbital);
|
|
145
|
+
const innermost = radialNodeRadii(parameters)[0];
|
|
146
|
+
if (innermost === undefined || !(innermost > 0)) return Math.min(floor, cap);
|
|
147
|
+
const half = atomicGridBox(orbital).size.x / 2;
|
|
148
|
+
// The samples span the box edge to edge, so `resolution - 1` of them cover
|
|
149
|
+
// it: a lobe of radius r gets `r (resolution - 1) / half` across its diameter.
|
|
150
|
+
const needed = Math.ceil((INNER_LOBE_SAMPLES * half) / innermost) + 1;
|
|
151
|
+
return Math.min(cap, Math.max(floor, needed));
|
|
152
|
+
}
|
|
153
|
+
|
|
108
154
|
/** Samples per edge; the cost is the cube of it. */
|
|
109
155
|
const DEFAULT_RESOLUTION = 56;
|
|
110
156
|
|
|
157
|
+
/**
|
|
158
|
+
* Samples the innermost radial lobe is asked to span, edge to edge. Below
|
|
159
|
+
* about eight, marching cubes turns a sphere into a faceted blob.
|
|
160
|
+
*/
|
|
161
|
+
const INNER_LOBE_SAMPLES = 12;
|
|
162
|
+
|
|
111
163
|
/** A tail past this holds too little density to change the surface. */
|
|
112
164
|
const DEFAULT_ENCLOSED_FRACTION = 0.985;
|
|
113
165
|
|
|
@@ -1,30 +1,20 @@
|
|
|
1
|
-
export type {
|
|
2
|
-
export {
|
|
3
|
-
atomicGridBox,
|
|
4
|
-
createAtomicOrbitalEvaluator,
|
|
5
|
-
sampleAtomicOrbital,
|
|
6
|
-
} from './atomicGrid.ts';
|
|
1
|
+
export type { ResolutionLimits } from './atomicGrid.ts';
|
|
2
|
+
export { atomicGridResolution } from './atomicGrid.ts';
|
|
7
3
|
export type { AtomicOrbital, AtomicOrbitalOptions } from './atomicOrbitals.ts';
|
|
8
4
|
export {
|
|
9
5
|
atomicOrbitalsOf,
|
|
10
6
|
defaultOrbitalId,
|
|
11
7
|
findAtomicOrbital,
|
|
12
8
|
hydrogenicParametersOf,
|
|
13
|
-
orbitalId,
|
|
14
9
|
} from './atomicOrbitals.ts';
|
|
15
10
|
export type { Vec3 } from './constants.ts';
|
|
16
|
-
export {
|
|
17
|
-
BOHR_IN_ANGSTROM,
|
|
18
|
-
ENCLOSED_WEIGHT,
|
|
19
|
-
RYDBERG_ELECTRONVOLTS,
|
|
20
|
-
} from './constants.ts';
|
|
11
|
+
export { BOHR_IN_ANGSTROM, RYDBERG_ELECTRONVOLTS } from './constants.ts';
|
|
21
12
|
export type { Subshell, SubshellOccupancy } from './electronConfiguration.ts';
|
|
22
13
|
export {
|
|
23
14
|
ELEMENT_ANOMALIES,
|
|
24
15
|
HIGHEST_ATOMIC_NUMBER,
|
|
25
16
|
MADELUNG_ORDER,
|
|
26
17
|
NOBLE_GASES,
|
|
27
|
-
assertAtomicNumber,
|
|
28
18
|
aufbauConfigurationOf,
|
|
29
19
|
configurationOf,
|
|
30
20
|
coreAtomicNumber,
|
|
@@ -33,10 +23,11 @@ export {
|
|
|
33
23
|
isAnomalous,
|
|
34
24
|
subshellCapacity,
|
|
35
25
|
subshellLabel,
|
|
36
|
-
superscript,
|
|
37
26
|
} from './electronConfiguration.ts';
|
|
38
27
|
export type { GridBox, OrbitalEvaluator, OrbitalGrid } from './grid.ts';
|
|
39
28
|
export { evaluateGrid, gridIndex } from './grid.ts';
|
|
29
|
+
export type { OrbitalContour } from './isovalue.ts';
|
|
30
|
+
export { enclosedReach, isocontourCutoff, orbitalContour } from './isovalue.ts';
|
|
40
31
|
export type { HydrogenicParameters } from './hydrogenic.ts';
|
|
41
32
|
export {
|
|
42
33
|
createRadialFunction,
|
|
@@ -67,6 +58,6 @@ export type {
|
|
|
67
58
|
AtomicSampleResult,
|
|
68
59
|
AtomicSampler,
|
|
69
60
|
} from './sample.ts';
|
|
70
|
-
export { runAtomicSample
|
|
61
|
+
export { runAtomicSample } from './sample.ts';
|
|
71
62
|
export type { Screening } from './screening.ts';
|
|
72
|
-
export {
|
|
63
|
+
export { slaterScreening } from './screening.ts';
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Choosing the value a signed wavefunction's isosurface is drawn at.
|
|
3
|
+
*
|
|
4
|
+
* The surface is named by how much of the electron it holds, not by an
|
|
5
|
+
* amplitude: `ENCLOSED_WEIGHT` of `∫|ψ|² dV` inside it and the tail
|
|
6
|
+
* outside. On a uniform grid that is a weighted quantile of the samples, and
|
|
7
|
+
* the isovalue is the `|ψ|` at which the quantile falls.
|
|
8
|
+
*
|
|
9
|
+
* molstar ships `computeOrbitalIsocontourValues` for the same job, and it
|
|
10
|
+
* cannot be used here. It abandons any field whose mean `ψ²` is under an
|
|
11
|
+
* absolute `1e-5` and returns no isovalue at all — a guard against degenerate
|
|
12
|
+
* data that instead reads the amplitude *scale*. Amplitudes are Å^(-3/2), so a
|
|
13
|
+
* diffuse orbital is normalised straight into that range and draws nothing:
|
|
14
|
+
* caesium's 6s reaches 13 Å, and 2588 of the 7460 orbitals lcao.cheminfo.org
|
|
15
|
+
* offers came back blank. A quantile has no scale of its own and cannot.
|
|
16
|
+
*
|
|
17
|
+
* Every pass below touches each of the million-odd samples, so all of them are
|
|
18
|
+
* indexed loops: `for…of` over a `Float32Array` measures 6.7× slower.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
import { ENCLOSED_WEIGHT } from './constants.ts';
|
|
22
|
+
import type { OrbitalGrid } from './grid.ts';
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* The `|ψ|` whose surface encloses a given share of the sampled electron.
|
|
26
|
+
* @param data - The sampled amplitudes.
|
|
27
|
+
* @param enclosedWeight - Share of `∑ψ²` to hold inside, between 0 and 1.
|
|
28
|
+
* @returns The isovalue, or 0 when the field is empty — a nodeless orbital
|
|
29
|
+
* sampled where it has no amplitude at all.
|
|
30
|
+
* @throws {Error} When `enclosedWeight` is outside `(0, 1)`.
|
|
31
|
+
*/
|
|
32
|
+
export function isocontourCutoff(
|
|
33
|
+
data: Float32Array,
|
|
34
|
+
enclosedWeight: number = ENCLOSED_WEIGHT,
|
|
35
|
+
): number {
|
|
36
|
+
if (!(enclosedWeight > 0) || enclosedWeight >= 1) {
|
|
37
|
+
throw new RangeError('the enclosed weight must be in (0, 1)');
|
|
38
|
+
}
|
|
39
|
+
let total = 0;
|
|
40
|
+
let peak = 0;
|
|
41
|
+
for (let index = data.length - 1; index >= 0; index--) {
|
|
42
|
+
const value = data[index] as number;
|
|
43
|
+
const weight = value * value;
|
|
44
|
+
total += weight;
|
|
45
|
+
if (weight > peak) peak = weight;
|
|
46
|
+
}
|
|
47
|
+
if (!(total > 0)) return 0;
|
|
48
|
+
|
|
49
|
+
// Bins are logarithmic because a wavefunction spans decades between its peak
|
|
50
|
+
// and its tail while the isovalue sits far below the peak: linear bins would
|
|
51
|
+
// drop every sample that decides the answer into the first one.
|
|
52
|
+
const bins = new Float64Array(BIN_COUNT);
|
|
53
|
+
const peakLogarithm = Math.log2(peak);
|
|
54
|
+
for (let index = data.length - 1; index >= 0; index--) {
|
|
55
|
+
const value = data[index] as number;
|
|
56
|
+
const weight = value * value;
|
|
57
|
+
if (weight === 0) continue;
|
|
58
|
+
const bin = Math.floor(
|
|
59
|
+
(peakLogarithm - Math.log2(weight)) * BINS_PER_OCTAVE,
|
|
60
|
+
);
|
|
61
|
+
const clamped = bin < 0 ? 0 : Math.min(bin, BIN_COUNT - 1);
|
|
62
|
+
bins[clamped] = (bins[clamped] as number) + weight;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const target = total * enclosedWeight;
|
|
66
|
+
let running = 0;
|
|
67
|
+
for (let bin = 0; bin < BIN_COUNT; bin++) {
|
|
68
|
+
running += bins[bin] as number;
|
|
69
|
+
// Everything above this bin's lower edge is what has just been counted.
|
|
70
|
+
if (running >= target) {
|
|
71
|
+
return Math.sqrt(peak * 2 ** (-(bin + 1) / BINS_PER_OCTAVE));
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return 0;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* How far from the centre of the box the drawn surface actually reaches.
|
|
79
|
+
*
|
|
80
|
+
* Molstar sizes a volume representation's bounding sphere from the whole
|
|
81
|
+
* sampled box, which is deliberately larger than the isosurface inside it, so a
|
|
82
|
+
* camera framing that sphere leaves the orbital a quarter of the frame wide.
|
|
83
|
+
* Measuring the samples that are really enclosed gives the camera the extent it
|
|
84
|
+
* has to fill.
|
|
85
|
+
* @param field - The sampled field.
|
|
86
|
+
* @param cutoff - The isovalue the surfaces are drawn at.
|
|
87
|
+
* @returns The reach in ångström, or 0 when nothing is enclosed.
|
|
88
|
+
*/
|
|
89
|
+
export function enclosedReach(field: OrbitalGrid, cutoff: number): number {
|
|
90
|
+
if (!(cutoff > 0)) return 0;
|
|
91
|
+
const { data, dimensions, origin, spacing } = field;
|
|
92
|
+
const [countX, countY, countZ] = dimensions;
|
|
93
|
+
const centreX = origin.x + ((countX - 1) * spacing) / 2;
|
|
94
|
+
const centreY = origin.y + ((countY - 1) * spacing) / 2;
|
|
95
|
+
const centreZ = origin.z + ((countZ - 1) * spacing) / 2;
|
|
96
|
+
let furthest = 0;
|
|
97
|
+
let index = 0;
|
|
98
|
+
for (let indexX = 0; indexX < countX; indexX++) {
|
|
99
|
+
const dx = origin.x + indexX * spacing - centreX;
|
|
100
|
+
for (let indexY = 0; indexY < countY; indexY++) {
|
|
101
|
+
const dy = origin.y + indexY * spacing - centreY;
|
|
102
|
+
for (let indexZ = 0; indexZ < countZ; indexZ++) {
|
|
103
|
+
const value = data[index++] as number;
|
|
104
|
+
if (value < cutoff && value > -cutoff) continue;
|
|
105
|
+
const dz = origin.z + indexZ * spacing - centreZ;
|
|
106
|
+
const squared = dx * dx + dy * dy + dz * dz;
|
|
107
|
+
if (squared > furthest) furthest = squared;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return Math.sqrt(furthest);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/** Which isovalue each phase is drawn at, and how far the pair reaches. */
|
|
115
|
+
export interface OrbitalContour {
|
|
116
|
+
/** `|ψ|` on the surface; 0 when there is nothing to draw. */
|
|
117
|
+
cutoff: number;
|
|
118
|
+
/** Distance from the centre of the box to the outermost enclosed sample. */
|
|
119
|
+
reach: number;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* The isovalue and the extent of one sampled orbital's surface pair.
|
|
124
|
+
*
|
|
125
|
+
* Both phases come from one cutoff, so they can never disagree about where the
|
|
126
|
+
* node between them is.
|
|
127
|
+
* @param field - The sampled field.
|
|
128
|
+
* @param enclosedWeight - Share of `∑ψ²` to hold inside.
|
|
129
|
+
* @returns See {@link OrbitalContour}.
|
|
130
|
+
*/
|
|
131
|
+
export function orbitalContour(
|
|
132
|
+
field: OrbitalGrid,
|
|
133
|
+
enclosedWeight: number = ENCLOSED_WEIGHT,
|
|
134
|
+
): OrbitalContour {
|
|
135
|
+
const cutoff = isocontourCutoff(field.data, enclosedWeight);
|
|
136
|
+
return { cutoff, reach: enclosedReach(field, cutoff) };
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Bins per doubling of `ψ²`, so the isovalue lands within 2.2% in `|ψ|`.
|
|
141
|
+
* Finer than the grid spacing can resolve on the surface it produces.
|
|
142
|
+
*/
|
|
143
|
+
const BINS_PER_OCTAVE = 16;
|
|
144
|
+
|
|
145
|
+
/** 128 octaves of `ψ²`, far past the dynamic range of a sampled orbital. */
|
|
146
|
+
const BIN_COUNT = 2048;
|
|
@@ -11,8 +11,8 @@
|
|
|
11
11
|
* `sample` prop; one that does not gets the in-process version for free.
|
|
12
12
|
*/
|
|
13
13
|
|
|
14
|
-
import type { AtomicGridOptions } from './atomicGrid.ts';
|
|
15
|
-
import { sampleAtomicOrbital } from './atomicGrid.ts';
|
|
14
|
+
import type { AtomicGridOptions, ResolutionLimits } from './atomicGrid.ts';
|
|
15
|
+
import { atomicGridResolution, sampleAtomicOrbital } from './atomicGrid.ts';
|
|
16
16
|
import {
|
|
17
17
|
atomicOrbitalsOf,
|
|
18
18
|
findAtomicOrbital,
|
|
@@ -20,6 +20,8 @@ import {
|
|
|
20
20
|
} from './atomicOrbitals.ts';
|
|
21
21
|
import type { OrbitalGrid } from './grid.ts';
|
|
22
22
|
import { radialNodeRadii } from './hydrogenic.ts';
|
|
23
|
+
import type { OrbitalContour } from './isovalue.ts';
|
|
24
|
+
import { orbitalContour } from './isovalue.ts';
|
|
23
25
|
|
|
24
26
|
/** Which orbital to sample, and how finely. */
|
|
25
27
|
export interface AtomicSampleRequest {
|
|
@@ -29,15 +31,27 @@ export interface AtomicSampleRequest {
|
|
|
29
31
|
orbitalId: string;
|
|
30
32
|
/**
|
|
31
33
|
* Samples along each edge of the cube. The cost is the cube of this.
|
|
34
|
+
*
|
|
35
|
+
* A number fixes the resolution. {@link ResolutionLimits} lets the orbital's
|
|
36
|
+
* own shape pick one between the two, which is what a nested orbital needs —
|
|
37
|
+
* see {@link atomicGridResolution}.
|
|
32
38
|
* @default 56
|
|
33
39
|
*/
|
|
34
|
-
resolution?: number;
|
|
40
|
+
resolution?: number | ResolutionLimits;
|
|
35
41
|
}
|
|
36
42
|
|
|
37
43
|
/** What one sampling job produces. */
|
|
38
44
|
export interface AtomicSampleResult {
|
|
39
45
|
/** The signed field, ready for an isosurface. */
|
|
40
46
|
grid: OrbitalGrid;
|
|
47
|
+
/**
|
|
48
|
+
* The isovalue both phases are drawn at, and how far the pair reaches.
|
|
49
|
+
*
|
|
50
|
+
* Measured here rather than beside the renderer: both passes are O(samples),
|
|
51
|
+
* and at the resolutions a nested orbital asks for that is over a million of
|
|
52
|
+
* them on whichever thread runs this.
|
|
53
|
+
*/
|
|
54
|
+
contour: OrbitalContour;
|
|
41
55
|
/** Radii of the orbital's radial nodes, ångström, ascending. */
|
|
42
56
|
nodeRadii: number[];
|
|
43
57
|
}
|
|
@@ -65,9 +79,15 @@ export function runAtomicSample(
|
|
|
65
79
|
);
|
|
66
80
|
}
|
|
67
81
|
const options: AtomicGridOptions = {};
|
|
68
|
-
if (resolution
|
|
82
|
+
if (typeof resolution === 'number') {
|
|
83
|
+
options.resolution = resolution;
|
|
84
|
+
} else if (resolution !== undefined) {
|
|
85
|
+
options.resolution = atomicGridResolution(orbital, resolution);
|
|
86
|
+
}
|
|
87
|
+
const grid = sampleAtomicOrbital(orbital, options);
|
|
69
88
|
return {
|
|
70
|
-
grid
|
|
89
|
+
grid,
|
|
90
|
+
contour: orbitalContour(grid),
|
|
71
91
|
nodeRadii: radialNodeRadii(hydrogenicParametersOf(orbital)),
|
|
72
92
|
};
|
|
73
93
|
}
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
import type { CSSProperties, ReactElement } from 'react';
|
|
10
10
|
import { useEffect, useRef, useState } from 'react';
|
|
11
11
|
|
|
12
|
+
import type { ResolutionLimits } from '../core/atomicGrid.ts';
|
|
12
13
|
import type { PhasePalette } from '../core/palette.ts';
|
|
13
14
|
import { PHASE_PALETTES } from '../core/palette.ts';
|
|
14
15
|
import type { AtomicSampler } from '../core/sample.ts';
|
|
@@ -30,9 +31,13 @@ export interface AtomicOrbitalCanvasProps {
|
|
|
30
31
|
palette?: PhasePalette;
|
|
31
32
|
/**
|
|
32
33
|
* Samples along each edge of the cube; the cost is the cube of it.
|
|
34
|
+
*
|
|
35
|
+
* A number fixes it. A {@link ResolutionLimits} pair lets each orbital's own
|
|
36
|
+
* shape pick a resolution between the two, which is what the orbitals with
|
|
37
|
+
* inner shells packed against the nucleus need.
|
|
33
38
|
* @default 56
|
|
34
39
|
*/
|
|
35
|
-
resolution?: number;
|
|
40
|
+
resolution?: number | ResolutionLimits;
|
|
36
41
|
/**
|
|
37
42
|
* Whether the scene turns on its own, which is what makes a still screenshot
|
|
38
43
|
* of a 3D shape readable.
|
|
@@ -83,7 +88,7 @@ export function AtomicOrbitalCanvas(
|
|
|
83
88
|
|
|
84
89
|
// What the canvas is being asked to show. Comparing it with what it *is*
|
|
85
90
|
// showing gives the progress note without a state write on every prop change.
|
|
86
|
-
const wanted = `${atomicNumber}|${orbitalId}|${resolution}|${palette.id}`;
|
|
91
|
+
const wanted = `${atomicNumber}|${orbitalId}|${resolutionKey(resolution)}|${palette.id}`;
|
|
87
92
|
const busy = drawn !== wanted;
|
|
88
93
|
|
|
89
94
|
// Callbacks are read through refs so a caller passing an inline arrow does
|
|
@@ -120,7 +125,7 @@ export function AtomicOrbitalCanvas(
|
|
|
120
125
|
.then(async (result) => {
|
|
121
126
|
if (cancelled) return;
|
|
122
127
|
callbacks.current.onNodeRadii?.(result.nodeRadii);
|
|
123
|
-
const reach = await viewer.showOrbital(result.grid, {
|
|
128
|
+
const reach = await viewer.showOrbital(result.grid, result.contour, {
|
|
124
129
|
positiveColour: palette.positive,
|
|
125
130
|
negativeColour: palette.negative,
|
|
126
131
|
});
|
|
@@ -152,6 +157,17 @@ export function AtomicOrbitalCanvas(
|
|
|
152
157
|
/** Samples per edge; 56 resolves the radial node of a 3s in about 25 ms. */
|
|
153
158
|
const DEFAULT_RESOLUTION = 56;
|
|
154
159
|
|
|
160
|
+
/**
|
|
161
|
+
* A stable identity for either shape the resolution prop can take.
|
|
162
|
+
* @param resolution - A fixed sample count, or the limits it may vary between.
|
|
163
|
+
* @returns A string that changes exactly when the sampling would.
|
|
164
|
+
*/
|
|
165
|
+
function resolutionKey(resolution: number | ResolutionLimits): string {
|
|
166
|
+
return typeof resolution === 'number'
|
|
167
|
+
? String(resolution)
|
|
168
|
+
: `${resolution.floor}-${resolution.cap}`;
|
|
169
|
+
}
|
|
170
|
+
|
|
155
171
|
/**
|
|
156
172
|
* A square, centred stage: an atomic orbital is as tall as it is wide, so a
|
|
157
173
|
* square wastes the least of the frame and keeps the lobes the same size when
|
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
import type { CSSProperties, ReactElement, ReactNode } from 'react';
|
|
19
19
|
import { Suspense, lazy, useState } from 'react';
|
|
20
20
|
|
|
21
|
+
import type { ResolutionLimits } from '../core/atomicGrid.ts';
|
|
21
22
|
import type { PhasePalette } from '../core/palette.ts';
|
|
22
23
|
import type { AtomicSampler } from '../core/sample.ts';
|
|
23
24
|
|
|
@@ -44,9 +45,12 @@ export interface AtomicOrbitalViewerProps {
|
|
|
44
45
|
palette?: PhasePalette;
|
|
45
46
|
/**
|
|
46
47
|
* Samples along each edge of the cube; the cost is the cube of it.
|
|
48
|
+
*
|
|
49
|
+
* A number fixes it. A {@link ResolutionLimits} pair lets each orbital's own
|
|
50
|
+
* shape pick a resolution between the two.
|
|
47
51
|
* @default 56
|
|
48
52
|
*/
|
|
49
|
-
resolution?: number;
|
|
53
|
+
resolution?: number | ResolutionLimits;
|
|
50
54
|
/**
|
|
51
55
|
* Whether the scene turns on its own.
|
|
52
56
|
* @default false
|
|
@@ -14,7 +14,6 @@
|
|
|
14
14
|
* them wholesale.
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
-
import { computeOrbitalIsocontourValues } from 'molstar/lib/extensions/alpha-orbitals/orbitals.js';
|
|
18
17
|
import type { Volume } from 'molstar/lib/mol-model/volume.js';
|
|
19
18
|
import type { PluginContext } from 'molstar/lib/mol-plugin/context.js';
|
|
20
19
|
import { createVolumeRepresentationParams } from 'molstar/lib/mol-plugin-state/helpers/volume-representation-params.js';
|
|
@@ -22,10 +21,10 @@ import type { Representation } from 'molstar/lib/mol-repr/representation.js';
|
|
|
22
21
|
import { Theme } from 'molstar/lib/mol-theme/theme.js';
|
|
23
22
|
import { Color } from 'molstar/lib/mol-util/color/color.js';
|
|
24
23
|
|
|
25
|
-
import { ENCLOSED_WEIGHT } from '../core/constants.ts';
|
|
26
24
|
import type { OrbitalGrid } from '../core/grid.ts';
|
|
25
|
+
import type { OrbitalContour } from '../core/isovalue.ts';
|
|
27
26
|
|
|
28
|
-
import { DISPLAY_REACH,
|
|
27
|
+
import { DISPLAY_REACH, toVolume } from './volumeField.ts';
|
|
29
28
|
|
|
30
29
|
/** Colours and opacity of one signed isosurface pair. */
|
|
31
30
|
export interface VolumeStyle {
|
|
@@ -40,8 +39,8 @@ export interface VolumeStyle {
|
|
|
40
39
|
*/
|
|
41
40
|
negativeColour?: string;
|
|
42
41
|
/**
|
|
43
|
-
* Isovalue as a multiple of the
|
|
44
|
-
*
|
|
42
|
+
* Isovalue as a multiple of the contour's own cutoff. Larger means a
|
|
43
|
+
* tighter, smaller surface.
|
|
45
44
|
* @default 1
|
|
46
45
|
*/
|
|
47
46
|
relativeIsovalue?: number;
|
|
@@ -56,6 +55,8 @@ export interface VolumeStyle {
|
|
|
56
55
|
* Replace the isosurface pair drawn from a sampled field.
|
|
57
56
|
* @param plugin - The molstar context.
|
|
58
57
|
* @param field - The field, as `sampleAtomicOrbital` produced it.
|
|
58
|
+
* @param contour - The isovalue and reach measured on that field, as
|
|
59
|
+
* `runAtomicSample` returned them.
|
|
59
60
|
* @param style - See {@link VolumeStyle}.
|
|
60
61
|
* @returns How far the drawn surface reaches from the centre of the box,
|
|
61
62
|
* ångström — what a camera has to frame to fill the viewport with it.
|
|
@@ -64,6 +65,7 @@ export interface VolumeStyle {
|
|
|
64
65
|
export async function renderSampledVolume(
|
|
65
66
|
plugin: PluginContext,
|
|
66
67
|
field: OrbitalGrid,
|
|
68
|
+
contour: OrbitalContour,
|
|
67
69
|
style: VolumeStyle = {},
|
|
68
70
|
): Promise<number> {
|
|
69
71
|
const canvas3d = plugin.canvas3d;
|
|
@@ -78,25 +80,30 @@ export async function renderSampledVolume(
|
|
|
78
80
|
} = style;
|
|
79
81
|
clearSampledVolume(plugin);
|
|
80
82
|
|
|
81
|
-
const
|
|
83
|
+
const { cutoff, reach } = contour;
|
|
82
84
|
// Molstar's camera clamps both its target distance and its near plane, so it
|
|
83
85
|
// cannot get close to a small object: uranium's 4f reaches 0.35 Å and would
|
|
84
86
|
// stay a dot in the corner whatever the camera is asked to frame. Every
|
|
85
87
|
// orbital is therefore drawn at one canonical size, and the true extent is
|
|
86
88
|
// reported as ⟨r⟩ and on the radial plot instead of by the picture's scale.
|
|
87
|
-
const reach = surfaceReach(field, isovalues);
|
|
88
89
|
const volume = toVolume(field, reach > 0 ? DISPLAY_REACH / reach : 1);
|
|
89
90
|
// A nodeless orbital — every 1s — has no negative lobe at all, and asking for
|
|
90
91
|
// its isosurface would draw an empty mesh at value 0.
|
|
91
92
|
const surfaces = await Promise.all([
|
|
92
|
-
maybeSurface(
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
colour:
|
|
98
|
-
|
|
99
|
-
|
|
93
|
+
maybeSurface(
|
|
94
|
+
plugin,
|
|
95
|
+
volume,
|
|
96
|
+
field.max >= cutoff ? cutoff : undefined,
|
|
97
|
+
relativeIsovalue,
|
|
98
|
+
{ colour: positiveColour, alpha },
|
|
99
|
+
),
|
|
100
|
+
maybeSurface(
|
|
101
|
+
plugin,
|
|
102
|
+
volume,
|
|
103
|
+
field.min <= -cutoff ? -cutoff : undefined,
|
|
104
|
+
relativeIsovalue,
|
|
105
|
+
{ colour: negativeColour, alpha },
|
|
106
|
+
),
|
|
100
107
|
]);
|
|
101
108
|
const drawn = surfaces.filter(
|
|
102
109
|
(surface): surface is Representation.Any => surface !== null,
|
|
@@ -163,7 +170,13 @@ async function createSurface(
|
|
|
163
170
|
isoValue: { kind: 'absolute', absoluteValue: isovalue },
|
|
164
171
|
alpha,
|
|
165
172
|
xrayShaded: true,
|
|
166
|
-
|
|
173
|
+
// Molstar's GPU marching cubes pits the outer lobe of a diffuse orbital
|
|
174
|
+
// with voxel-sized dimples — caesium's 6s and every 7s, 6d and 7p above
|
|
175
|
+
// it — and quantises the field to 255 steps on upload unless told
|
|
176
|
+
// otherwise, which terraces xenon's 4p. The surface is a thin shell
|
|
177
|
+
// whatever the box holds, so the CPU path costs 13–44 ms and returns
|
|
178
|
+
// 27 k vertices even on the 152³ grid the highest quality asks for.
|
|
179
|
+
tryUseGpu: false,
|
|
167
180
|
},
|
|
168
181
|
color: 'uniform',
|
|
169
182
|
colorParams: { value: Color.fromHexStyle(colour) },
|
package/src/orbital/ui/viewer.ts
CHANGED
|
@@ -20,6 +20,7 @@ import { DefaultPluginSpec as defaultPluginSpec } from 'molstar/lib/mol-plugin/s
|
|
|
20
20
|
import { Color } from 'molstar/lib/mol-util/color/color.js';
|
|
21
21
|
|
|
22
22
|
import type { OrbitalGrid } from '../core/grid.ts';
|
|
23
|
+
import type { OrbitalContour } from '../core/isovalue.ts';
|
|
23
24
|
|
|
24
25
|
import { DEFAULT_CAMERA_DURATION, frameOrbital, setSpin } from './camera.ts';
|
|
25
26
|
import type { VolumeStyle } from './renderVolume.ts';
|
|
@@ -89,15 +90,19 @@ export class OrbitalViewer {
|
|
|
89
90
|
/**
|
|
90
91
|
* Replace the isosurface pair with one drawn from a sampled field.
|
|
91
92
|
* @param field - The sampled wavefunction, in ångström.
|
|
93
|
+
* @param contour - The isovalue and reach measured on that field.
|
|
92
94
|
* @param style - See {@link VolumeStyle}.
|
|
93
95
|
* @returns How far the drawn surface reaches, in scene units, for the camera
|
|
94
96
|
* to frame; `undefined` once the viewer has been disposed.
|
|
95
97
|
*/
|
|
96
98
|
showOrbital(
|
|
97
99
|
field: OrbitalGrid,
|
|
100
|
+
contour: OrbitalContour,
|
|
98
101
|
style?: VolumeStyle,
|
|
99
102
|
): Promise<number | undefined> {
|
|
100
|
-
return this.#run((plugin) =>
|
|
103
|
+
return this.#run((plugin) =>
|
|
104
|
+
renderSampledVolume(plugin, field, contour, style),
|
|
105
|
+
);
|
|
101
106
|
}
|
|
102
107
|
|
|
103
108
|
/**
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Turning a field the caller sampled into the `Volume` molstar's isosurface
|
|
3
|
-
* renderer wants
|
|
3
|
+
* renderer wants.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
5
|
+
* It is arithmetic over the samples, which is why it is here rather than in
|
|
6
|
+
* `renderVolume.ts` — that module is about representations. How far the
|
|
7
|
+
* surface inside the box reaches is measured in `core/isovalue.ts`, beside the
|
|
8
|
+
* isovalue it is measured against.
|
|
7
9
|
*/
|
|
8
10
|
|
|
9
11
|
import { Mat4, Tensor, Vec3 } from 'molstar/lib/mol-math/linear-algebra.js';
|
|
@@ -24,52 +26,6 @@ const { Space: createTensorSpace, Data1: asTensorData } = Tensor;
|
|
|
24
26
|
*/
|
|
25
27
|
export const DISPLAY_REACH = 12;
|
|
26
28
|
|
|
27
|
-
/**
|
|
28
|
-
* How far from the centre of the box the drawn surface actually reaches.
|
|
29
|
-
*
|
|
30
|
-
* Molstar sizes a volume representation's bounding sphere from the whole
|
|
31
|
-
* sampled box, which is deliberately much larger than the isosurface inside it,
|
|
32
|
-
* so a camera framing that sphere leaves the orbital a quarter of the frame
|
|
33
|
-
* wide. Measuring the samples that are actually enclosed gives the camera the
|
|
34
|
-
* real extent, and does it here because this is where the isovalue is known.
|
|
35
|
-
* @param field - The sampled field.
|
|
36
|
-
* @param isovalues - The two isovalues the surfaces were drawn at.
|
|
37
|
-
* @param isovalues.negative - Isovalue the negative lobe was drawn at, if any.
|
|
38
|
-
* @param isovalues.positive - Isovalue the positive lobe was drawn at, if any.
|
|
39
|
-
* @returns The reach in ångström, or 0 when nothing was drawn.
|
|
40
|
-
*/
|
|
41
|
-
export function surfaceReach(
|
|
42
|
-
field: OrbitalGrid,
|
|
43
|
-
isovalues: { negative?: number | undefined; positive?: number | undefined },
|
|
44
|
-
): number {
|
|
45
|
-
const cutoff = Math.min(
|
|
46
|
-
Math.abs(isovalues.positive ?? Infinity),
|
|
47
|
-
Math.abs(isovalues.negative ?? Infinity),
|
|
48
|
-
);
|
|
49
|
-
if (!Number.isFinite(cutoff) || cutoff <= 0) return 0;
|
|
50
|
-
const { data, dimensions, origin, spacing } = field;
|
|
51
|
-
const [countX, countY, countZ] = dimensions;
|
|
52
|
-
const centreX = origin.x + ((countX - 1) * spacing) / 2;
|
|
53
|
-
const centreY = origin.y + ((countY - 1) * spacing) / 2;
|
|
54
|
-
const centreZ = origin.z + ((countZ - 1) * spacing) / 2;
|
|
55
|
-
let furthest = 0;
|
|
56
|
-
let index = 0;
|
|
57
|
-
for (let indexX = 0; indexX < countX; indexX++) {
|
|
58
|
-
const dx = origin.x + indexX * spacing - centreX;
|
|
59
|
-
for (let indexY = 0; indexY < countY; indexY++) {
|
|
60
|
-
const dy = origin.y + indexY * spacing - centreY;
|
|
61
|
-
for (let indexZ = 0; indexZ < countZ; indexZ++) {
|
|
62
|
-
const value = data[index++] as number;
|
|
63
|
-
if (value < cutoff && value > -cutoff) continue;
|
|
64
|
-
const dz = origin.z + indexZ * spacing - centreZ;
|
|
65
|
-
const squared = dx * dx + dy * dy + dz * dz;
|
|
66
|
-
if (squared > furthest) furthest = squared;
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
return Math.sqrt(furthest);
|
|
71
|
-
}
|
|
72
|
-
|
|
73
29
|
/**
|
|
74
30
|
* Wrap a sampled field in molstar's `Volume`.
|
|
75
31
|
*
|