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
|
@@ -35,6 +35,8 @@ export interface EcosystemSite {
|
|
|
35
35
|
name: SiteName;
|
|
36
36
|
/** Where the site lives, written the way it is typed. */
|
|
37
37
|
host: string;
|
|
38
|
+
/** Where the sources live, and what a Source link opens. */
|
|
39
|
+
repository: string;
|
|
38
40
|
/** One line on what the site does. */
|
|
39
41
|
tagline: string;
|
|
40
42
|
/** The colour the first half of the name is set in. */
|
|
@@ -71,6 +73,7 @@ export const ECOSYSTEM_SITES: readonly EcosystemSite[] = [
|
|
|
71
73
|
id: 'inchi',
|
|
72
74
|
name: { lead: 'inchi', alt: 'cheminfo', dot: true },
|
|
73
75
|
host: 'inchi.cheminfo.org',
|
|
76
|
+
repository: 'https://github.com/cheminfo/inchi.cheminfo.org',
|
|
74
77
|
tagline: 'InChI and InChIKey from a structure, in the browser.',
|
|
75
78
|
brand: '#5b21b6',
|
|
76
79
|
brandAlt: '#a16207',
|
|
@@ -80,6 +83,7 @@ export const ECOSYSTEM_SITES: readonly EcosystemSite[] = [
|
|
|
80
83
|
id: 'vcl',
|
|
81
84
|
name: { lead: 'vcl', alt: 'cheminfo', dot: true },
|
|
82
85
|
host: 'vcl.cheminfo.org',
|
|
86
|
+
repository: 'https://github.com/cheminfo/vcl.cheminfo.org',
|
|
83
87
|
tagline: 'Combine a core and fragments into a screened library.',
|
|
84
88
|
brand: '#2d72d2',
|
|
85
89
|
brandAlt: '#9a3412',
|
|
@@ -89,6 +93,7 @@ export const ECOSYSTEM_SITES: readonly EcosystemSite[] = [
|
|
|
89
93
|
id: 'smiles',
|
|
90
94
|
name: { lead: 'smiles', alt: 'cheminfo', dot: true },
|
|
91
95
|
host: 'smiles.cheminfo.org',
|
|
96
|
+
repository: 'https://github.com/cheminfo/smiles.cheminfo.org',
|
|
92
97
|
tagline: 'Draw a structure, read its SMILES, learn the notation.',
|
|
93
98
|
brand: '#1c6e42',
|
|
94
99
|
brandAlt: '#9a3412',
|
|
@@ -98,6 +103,7 @@ export const ECOSYSTEM_SITES: readonly EcosystemSite[] = [
|
|
|
98
103
|
id: 'chemcalc',
|
|
99
104
|
name: { lead: 'Chem', alt: 'Calc' },
|
|
100
105
|
host: 'www.chemcalc.org',
|
|
106
|
+
repository: 'https://github.com/cheminfo/chemcalc.org',
|
|
101
107
|
tagline: 'Molecular formula, exact mass and isotopic distribution.',
|
|
102
108
|
brand: '#5b52e0',
|
|
103
109
|
brandAlt: '#0d9488',
|
|
@@ -107,6 +113,7 @@ export const ECOSYSTEM_SITES: readonly EcosystemSite[] = [
|
|
|
107
113
|
id: 'nmrium',
|
|
108
114
|
name: { lead: 'NMR', alt: 'ium' },
|
|
109
115
|
host: 'www.nmrium.org',
|
|
116
|
+
repository: 'https://github.com/cheminfo/nmrium',
|
|
110
117
|
tagline: 'Process and assign NMR spectra in the browser.',
|
|
111
118
|
brand: '#ea580c',
|
|
112
119
|
brandAlt: '#2b143e',
|
|
@@ -116,6 +123,7 @@ export const ECOSYSTEM_SITES: readonly EcosystemSite[] = [
|
|
|
116
123
|
id: 'surge',
|
|
117
124
|
name: { lead: 'surge', alt: 'cheminfo', dot: true },
|
|
118
125
|
host: 'surge.cheminfo.org',
|
|
126
|
+
repository: 'https://github.com/cheminfo/surge.cheminfo.org',
|
|
119
127
|
tagline: 'Every constitutional isomer of a molecular formula.',
|
|
120
128
|
brand: '#4338ca',
|
|
121
129
|
brandAlt: '#be123c',
|
|
@@ -125,6 +133,7 @@ export const ECOSYSTEM_SITES: readonly EcosystemSite[] = [
|
|
|
125
133
|
id: 'tex',
|
|
126
134
|
name: { lead: 'tex', alt: 'cheminfo', dot: true },
|
|
127
135
|
host: 'tex.cheminfo.org',
|
|
136
|
+
repository: 'https://github.com/cheminfo/tex.cheminfo.org',
|
|
128
137
|
tagline: 'LaTeX formulas rendered to SVG or PNG from a URL.',
|
|
129
138
|
brand: '#a21caf',
|
|
130
139
|
brandAlt: '#a16207',
|
|
@@ -134,6 +143,7 @@ export const ECOSYSTEM_SITES: readonly EcosystemSite[] = [
|
|
|
134
143
|
id: 'lcao',
|
|
135
144
|
name: { lead: 'lcao', alt: 'cheminfo', dot: true },
|
|
136
145
|
host: 'lcao.cheminfo.org',
|
|
146
|
+
repository: 'https://github.com/cheminfo/lcao.cheminfo.org',
|
|
137
147
|
tagline: 'Combine atomic orbitals into molecular ones.',
|
|
138
148
|
brand: '#1565c0',
|
|
139
149
|
brandAlt: '#c62828',
|
|
@@ -143,6 +153,7 @@ export const ECOSYSTEM_SITES: readonly EcosystemSite[] = [
|
|
|
143
153
|
id: 'regexp',
|
|
144
154
|
name: { lead: 'regexp', alt: 'cheminfo', dot: true },
|
|
145
155
|
host: 'regexp.cheminfo.org',
|
|
156
|
+
repository: 'https://github.com/cheminfo/regexp.cheminfo.org',
|
|
146
157
|
tagline: 'Learn regular expressions in a live playground.',
|
|
147
158
|
brand: '#1e3a8a',
|
|
148
159
|
brandAlt: '#a16207',
|
|
@@ -152,6 +163,7 @@ export const ECOSYSTEM_SITES: readonly EcosystemSite[] = [
|
|
|
152
163
|
id: 'pdb',
|
|
153
164
|
name: { lead: 'pdb', alt: 'cheminfo', dot: true },
|
|
154
165
|
host: 'pdb.cheminfo.org',
|
|
166
|
+
repository: 'https://github.com/cheminfo/pdb.cheminfo.org',
|
|
155
167
|
tagline: 'A fast look at any Protein Data Bank entry.',
|
|
156
168
|
brand: '#2563eb',
|
|
157
169
|
brandAlt: '#b45309',
|
|
@@ -161,6 +173,7 @@ export const ECOSYSTEM_SITES: readonly EcosystemSite[] = [
|
|
|
161
173
|
id: 'elucidation',
|
|
162
174
|
name: { lead: 'elucidation', alt: 'cheminfo', dot: true },
|
|
163
175
|
host: 'elucidation.cheminfo.org',
|
|
176
|
+
repository: 'https://github.com/cheminfo/elucidation.cheminfo.org',
|
|
164
177
|
tagline: 'A structure from a 1H NMR spectrum and a formula.',
|
|
165
178
|
brand: '#7e22ce',
|
|
166
179
|
brandAlt: '#b45309',
|
|
@@ -170,6 +183,7 @@ export const ECOSYSTEM_SITES: readonly EcosystemSite[] = [
|
|
|
170
183
|
id: 'equilibrium',
|
|
171
184
|
name: { lead: 'Equi', alt: 'Librium' },
|
|
172
185
|
host: 'equilibrium.cheminfo.org',
|
|
186
|
+
repository: 'https://github.com/cheminfo/equilibrium.cheminfo.org',
|
|
173
187
|
tagline: 'Chemical equilibria: pH, speciation and titration curves.',
|
|
174
188
|
brand: '#0b5754',
|
|
175
189
|
brandAlt: '#a56600',
|
|
@@ -179,6 +193,7 @@ export const ECOSYSTEM_SITES: readonly EcosystemSite[] = [
|
|
|
179
193
|
id: 'polycarp',
|
|
180
194
|
name: { lead: 'Poly', alt: 'Carp' },
|
|
181
195
|
host: 'polycarp.cheminfo.org',
|
|
196
|
+
repository: 'https://github.com/cheminfo/polycarp.cheminfo.org',
|
|
182
197
|
tagline: 'Predict the microstructure of a radical copolymerisation.',
|
|
183
198
|
brand: '#0d1d37',
|
|
184
199
|
brandAlt: '#0c9ba3',
|
|
@@ -188,6 +203,7 @@ export const ECOSYSTEM_SITES: readonly EcosystemSite[] = [
|
|
|
188
203
|
id: '3d',
|
|
189
204
|
name: { lead: '3d', alt: 'cheminfo', dot: true },
|
|
190
205
|
host: '3d.cheminfo.org',
|
|
206
|
+
repository: 'https://github.com/cheminfo/3d.cheminfo.org',
|
|
191
207
|
tagline: 'Conformers in 3D from a structure you draw.',
|
|
192
208
|
brand: '#155e75',
|
|
193
209
|
brandAlt: '#b45309',
|
|
@@ -197,6 +213,7 @@ export const ECOSYSTEM_SITES: readonly EcosystemSite[] = [
|
|
|
197
213
|
id: 'pt',
|
|
198
214
|
name: { lead: 'pt', alt: 'cheminfo', dot: true },
|
|
199
215
|
host: 'pt.cheminfo.org',
|
|
216
|
+
repository: 'https://github.com/cheminfo/pt.cheminfo.org',
|
|
200
217
|
tagline: 'The periodic table, coloured, plotted and taken apart.',
|
|
201
218
|
brand: '#15803d',
|
|
202
219
|
brandAlt: '#a16207',
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { siteById } from './lookup.ts';
|
|
2
|
+
import type { EcosystemSite, SiteId } from './sites.ts';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* The custom properties a site of the family sets on `:root`: the two colours
|
|
6
|
+
* it owns, the readable form of the second one when that is needed, and the
|
|
7
|
+
* accent bound to the first.
|
|
8
|
+
*
|
|
9
|
+
* It is a complete rule rather than a list of declarations, so it drops into a
|
|
10
|
+
* `<style>` of a prerendered page as it is.
|
|
11
|
+
* @param id - The site whose palette is wanted.
|
|
12
|
+
* @returns The `:root` rule, ending in a newline.
|
|
13
|
+
*/
|
|
14
|
+
export function siteTokensCss(id: SiteId): string {
|
|
15
|
+
const site = siteById(id);
|
|
16
|
+
const answering = answeringColor(site);
|
|
17
|
+
const declarations = [
|
|
18
|
+
`--brand: ${site.brand};`,
|
|
19
|
+
`--brand-alt: ${answering};`,
|
|
20
|
+
];
|
|
21
|
+
|
|
22
|
+
// The answering colour of several sites is a yellow or an amber that sits
|
|
23
|
+
// around 2:1 on white, so text set in it needs the darkened form instead.
|
|
24
|
+
if (site.brandAlt !== answering) {
|
|
25
|
+
declarations.push(`--brand-alt-text: ${site.brandAlt};`);
|
|
26
|
+
}
|
|
27
|
+
declarations.push('--accent: var(--brand);');
|
|
28
|
+
|
|
29
|
+
return `:root {\n ${declarations.join('\n ')}\n}\n`;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* What a browser paints its own chrome with on that site — the address bar on
|
|
34
|
+
* Android, the title bar of an installed page — which is the site's leading
|
|
35
|
+
* colour.
|
|
36
|
+
* @param id - The site whose colour is wanted.
|
|
37
|
+
* @returns The colour, as the `<meta name="theme-color">` content.
|
|
38
|
+
*/
|
|
39
|
+
export function siteThemeColor(id: SiteId): string {
|
|
40
|
+
return siteById(id).brand;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// The second colour as the site's mark draws it: on the accent element, unless
|
|
44
|
+
// the mark inverts the pair and gives the plate the answering colour instead.
|
|
45
|
+
function answeringColor(site: EcosystemSite): string {
|
|
46
|
+
return site.mark.accent === site.brand ? site.mark.plate : site.mark.accent;
|
|
47
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { ReactElement } from 'react';
|
|
2
|
+
|
|
3
|
+
import type { SiteId } from '../core/sites.ts';
|
|
4
|
+
import { siteTokensCss } from '../core/tokens.ts';
|
|
5
|
+
|
|
6
|
+
export interface SiteThemeProps {
|
|
7
|
+
/** The site whose palette the page takes. */
|
|
8
|
+
siteId: SiteId;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* The two colours a site owns, put on the page as custom properties.
|
|
13
|
+
*
|
|
14
|
+
* Everything of the family that reads `--brand`, `--brand-alt` or `--accent` —
|
|
15
|
+
* a mark drawn in token colours, a current menu item, a focus ring — follows
|
|
16
|
+
* from here, so a site declares its palette once and never repeats a hex code
|
|
17
|
+
* in a component.
|
|
18
|
+
* @param props - The site whose palette is injected.
|
|
19
|
+
* @returns The rule, as a style element that applies wherever it is rendered.
|
|
20
|
+
*/
|
|
21
|
+
export function SiteTheme(props: SiteThemeProps): ReactElement {
|
|
22
|
+
return <style>{siteTokensCss(props.siteId)}</style>;
|
|
23
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import type { CSSProperties, ReactElement } from 'react';
|
|
2
|
+
|
|
3
|
+
import { siteById } from '../core/lookup.ts';
|
|
4
|
+
import type { SiteId } from '../core/sites.ts';
|
|
5
|
+
|
|
6
|
+
export interface WordmarkProps {
|
|
7
|
+
/** The site whose name is written. */
|
|
8
|
+
siteId: SiteId;
|
|
9
|
+
/**
|
|
10
|
+
* Size of the name, in pixels. The weight comes from the surrounding
|
|
11
|
+
* context, so the same wordmark suits a header bar and a heading.
|
|
12
|
+
* @default 17
|
|
13
|
+
*/
|
|
14
|
+
size?: number;
|
|
15
|
+
/**
|
|
16
|
+
* Extra class names, for spacing at the place it is used. `wordmark` is
|
|
17
|
+
* always carried as well.
|
|
18
|
+
* @default undefined
|
|
19
|
+
*/
|
|
20
|
+
className?: string;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* The name of a site, written in the two colours it owns.
|
|
25
|
+
*
|
|
26
|
+
* A name that splits on itself — `ChemCalc`, `EquiLibrium`, `PolyCarp` —
|
|
27
|
+
* carries no domain and no dot; a one-word name takes `.cheminfo` after a faint
|
|
28
|
+
* dot. The `.org` is never written, because the name is the site rather than
|
|
29
|
+
* its address.
|
|
30
|
+
* @param props - The site, the size of the name, and extra class names.
|
|
31
|
+
* @returns The name, as one inline element that never wraps mid-address.
|
|
32
|
+
*/
|
|
33
|
+
export function Wordmark(props: WordmarkProps): ReactElement {
|
|
34
|
+
const { siteId, size = 17, className } = props;
|
|
35
|
+
const site = siteById(siteId);
|
|
36
|
+
|
|
37
|
+
return (
|
|
38
|
+
<span
|
|
39
|
+
className={className ? `wordmark ${className}` : 'wordmark'}
|
|
40
|
+
style={{ ...WORDMARK_STYLE, fontSize: size }}
|
|
41
|
+
>
|
|
42
|
+
<span className="wordmark__lead" style={{ color: site.brand }}>
|
|
43
|
+
{site.name.lead}
|
|
44
|
+
</span>
|
|
45
|
+
{site.name.dot ? (
|
|
46
|
+
<span className="wordmark__dot" style={{ color: DOT_COLOR }}>
|
|
47
|
+
.
|
|
48
|
+
</span>
|
|
49
|
+
) : null}
|
|
50
|
+
<span className="wordmark__alt" style={{ color: site.brandAlt }}>
|
|
51
|
+
{site.name.alt}
|
|
52
|
+
</span>
|
|
53
|
+
</span>
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// The separating dot is neutral so the two coloured halves read as the name
|
|
58
|
+
// rather than as three equal parts, and it takes the family's own token when
|
|
59
|
+
// the page defines one.
|
|
60
|
+
const DOT_COLOR = 'var(--text-faint, #8a96a3)';
|
|
61
|
+
|
|
62
|
+
const WORDMARK_STYLE: CSSProperties = {
|
|
63
|
+
letterSpacing: '-0.01em',
|
|
64
|
+
whiteSpace: 'nowrap',
|
|
65
|
+
};
|
|
@@ -6,5 +6,9 @@ export type { EcosystemMenuProps } from './EcosystemMenu.tsx';
|
|
|
6
6
|
export { EcosystemMenu } from './EcosystemMenu.tsx';
|
|
7
7
|
export type { SiteMarkProps } from './marks.tsx';
|
|
8
8
|
export { SiteMark } from './marks.tsx';
|
|
9
|
+
export type { SiteThemeProps } from './SiteTheme.tsx';
|
|
10
|
+
export { SiteTheme } from './SiteTheme.tsx';
|
|
9
11
|
export type { SiteTileProps } from './SiteTile.tsx';
|
|
10
12
|
export { SiteTile } from './SiteTile.tsx';
|
|
13
|
+
export type { WordmarkProps } from './Wordmark.tsx';
|
|
14
|
+
export { Wordmark } from './Wordmark.tsx';
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { CSSProperties, ReactElement } from 'react';
|
|
2
2
|
|
|
3
|
-
import
|
|
3
|
+
import { siteById } from '../core/lookup.ts';
|
|
4
|
+
import type { EcosystemSite, SiteId } from '../core/sites.ts';
|
|
4
5
|
|
|
5
6
|
import { GLYPHS } from './glyphs.tsx';
|
|
6
7
|
|
|
@@ -12,22 +13,58 @@ import { GLYPHS } from './glyphs.tsx';
|
|
|
12
13
|
const MARK_STYLE: CSSProperties = { display: 'block', flex: 'none' };
|
|
13
14
|
|
|
14
15
|
export interface SiteMarkProps {
|
|
15
|
-
/**
|
|
16
|
-
|
|
16
|
+
/**
|
|
17
|
+
* The site whose mark is drawn, with the two colours it owns. One of `site`
|
|
18
|
+
* and `siteId` is required.
|
|
19
|
+
* @default undefined
|
|
20
|
+
*/
|
|
21
|
+
site?: EcosystemSite;
|
|
22
|
+
/**
|
|
23
|
+
* The same site, named rather than passed, for a header that knows only
|
|
24
|
+
* which site it is.
|
|
25
|
+
* @default undefined
|
|
26
|
+
*/
|
|
27
|
+
siteId?: SiteId;
|
|
17
28
|
/**
|
|
18
29
|
* Edge of the square the mark is drawn in, in pixels.
|
|
19
30
|
* @default 28
|
|
20
31
|
*/
|
|
21
32
|
size?: number;
|
|
33
|
+
/**
|
|
34
|
+
* Whether the drawing sits on the site's rounded plate. Several marks are
|
|
35
|
+
* drawn in the plate's negative space, so dropping it suits a mark already
|
|
36
|
+
* standing on a surface of the site's own colour.
|
|
37
|
+
* @default true
|
|
38
|
+
*/
|
|
39
|
+
plate?: boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Whether the two colours are written out or read from the page. `tokens`
|
|
42
|
+
* draws the plate in `var(--brand)` and the answering element in
|
|
43
|
+
* `var(--brand-alt)`, so a site retuning its pair retunes its mark; it is
|
|
44
|
+
* therefore for the site's own mark rather than for another site's.
|
|
45
|
+
* @default 'literal'
|
|
46
|
+
*/
|
|
47
|
+
colors?: 'literal' | 'tokens';
|
|
22
48
|
}
|
|
23
49
|
|
|
24
50
|
/**
|
|
25
51
|
* The little logo of one site of the family.
|
|
26
|
-
* @param props -
|
|
52
|
+
* @param props - Which site, how big, and where its colours come from.
|
|
27
53
|
* @returns The mark, as an inline SVG.
|
|
54
|
+
* @throws {Error} When neither `site` nor `siteId` is given.
|
|
28
55
|
*/
|
|
29
56
|
export function SiteMark(props: SiteMarkProps): ReactElement {
|
|
30
|
-
const { site, size = 28 } = props;
|
|
57
|
+
const { site, siteId, size = 28, plate = true, colors = 'literal' } = props;
|
|
58
|
+
|
|
59
|
+
const drawn = site ?? (siteId === undefined ? undefined : siteById(siteId));
|
|
60
|
+
if (drawn === undefined) {
|
|
61
|
+
throw new Error('SiteMark needs one of its `site` and `siteId` props');
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const usesTokens = colors === 'tokens';
|
|
65
|
+
const plateFill = usesTokens ? 'var(--brand)' : drawn.mark.plate;
|
|
66
|
+
const accent = usesTokens ? 'var(--brand-alt)' : drawn.mark.accent;
|
|
67
|
+
const edge = drawn.mark.edge;
|
|
31
68
|
|
|
32
69
|
return (
|
|
33
70
|
<svg
|
|
@@ -38,16 +75,18 @@ export function SiteMark(props: SiteMarkProps): ReactElement {
|
|
|
38
75
|
aria-hidden="true"
|
|
39
76
|
focusable="false"
|
|
40
77
|
>
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
78
|
+
{plate ? (
|
|
79
|
+
<rect
|
|
80
|
+
x={edge ? 0.5 : 0}
|
|
81
|
+
y={edge ? 0.5 : 0}
|
|
82
|
+
width={edge ? 31 : 32}
|
|
83
|
+
height={edge ? 31 : 32}
|
|
84
|
+
rx={edge ? 6.5 : 7}
|
|
85
|
+
fill={plateFill}
|
|
86
|
+
stroke={edge}
|
|
87
|
+
/>
|
|
88
|
+
) : null}
|
|
89
|
+
{GLYPHS[drawn.id](accent)}
|
|
51
90
|
</svg>
|
|
52
91
|
);
|
|
53
92
|
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import type { ErrorInfo, ReactNode } from 'react';
|
|
2
|
+
import { Component } from 'react';
|
|
3
|
+
|
|
4
|
+
import { ErrorFallback } from './ErrorFallback.tsx';
|
|
5
|
+
import { toError } from './toError.ts';
|
|
6
|
+
|
|
7
|
+
/** What {@link ErrorBoundary} wraps, and what it does when that part fails. */
|
|
8
|
+
export interface ErrorBoundaryProps {
|
|
9
|
+
/** The part of the page whose failures are caught here. */
|
|
10
|
+
children: ReactNode;
|
|
11
|
+
/**
|
|
12
|
+
* What is drawn in place of the children once one of them has thrown. The
|
|
13
|
+
* reset closes the boundary again, so a retry re-renders the children.
|
|
14
|
+
* @default a non-ideal state naming the error, with a retry button
|
|
15
|
+
*/
|
|
16
|
+
fallback?: (error: Error, reset: () => void) => ReactNode;
|
|
17
|
+
/**
|
|
18
|
+
* Called once with the error and the stack of components it came through, so
|
|
19
|
+
* a site can report it. Anything it throws is ignored: a failing reporter
|
|
20
|
+
* must not replace the failure the visitor is already looking at.
|
|
21
|
+
* @default undefined — the failure is not reported anywhere
|
|
22
|
+
*/
|
|
23
|
+
onError?: (error: Error, componentStack: string) => void;
|
|
24
|
+
/**
|
|
25
|
+
* First line of the default fallback.
|
|
26
|
+
* @default 'Something went wrong'
|
|
27
|
+
*/
|
|
28
|
+
title?: string;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/** Whether the boundary is holding an error, and which one. */
|
|
32
|
+
export interface ErrorBoundaryState {
|
|
33
|
+
/** The error the boundary caught, or `null` while nothing has failed. */
|
|
34
|
+
error: Error | null;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Keep one failing part of the page from taking the whole page with it.
|
|
39
|
+
*
|
|
40
|
+
* A viewer that cannot start, a worker that dies, a structure that will not
|
|
41
|
+
* parse: without a boundary any of these leaves a blank page carrying the
|
|
42
|
+
* right title, which reads as a routing or a build defect and is neither.
|
|
43
|
+
*/
|
|
44
|
+
export class ErrorBoundary extends Component<
|
|
45
|
+
ErrorBoundaryProps,
|
|
46
|
+
ErrorBoundaryState
|
|
47
|
+
> {
|
|
48
|
+
/**
|
|
49
|
+
* Move the boundary into its failed state, whatever was thrown.
|
|
50
|
+
* @param thrown - The value a child threw.
|
|
51
|
+
* @returns The state holding it.
|
|
52
|
+
*/
|
|
53
|
+
static getDerivedStateFromError(thrown: unknown): ErrorBoundaryState {
|
|
54
|
+
return { error: toError(thrown) };
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
constructor(props: ErrorBoundaryProps) {
|
|
58
|
+
super(props);
|
|
59
|
+
this.state = { error: null };
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Hand the failure to the site's reporter, if it has one.
|
|
64
|
+
* @param thrown - The value a child threw.
|
|
65
|
+
* @param info - Where it came from.
|
|
66
|
+
*/
|
|
67
|
+
override componentDidCatch(thrown: unknown, info: ErrorInfo): void {
|
|
68
|
+
const { onError } = this.props;
|
|
69
|
+
if (onError === undefined) return;
|
|
70
|
+
try {
|
|
71
|
+
onError(toError(thrown), info.componentStack ?? '');
|
|
72
|
+
} catch {
|
|
73
|
+
// A reporter that fails must not replace the error being shown.
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/** Forget the error and render the children again. */
|
|
78
|
+
reset = (): void => {
|
|
79
|
+
this.setState({ error: null });
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* The children, or what stands in for them once one has failed.
|
|
84
|
+
* @returns The rendered tree.
|
|
85
|
+
*/
|
|
86
|
+
override render(): ReactNode {
|
|
87
|
+
const { children, fallback, title } = this.props;
|
|
88
|
+
const { error } = this.state;
|
|
89
|
+
|
|
90
|
+
if (error === null) return children;
|
|
91
|
+
if (fallback !== undefined) return fallback(error, this.reset);
|
|
92
|
+
return <ErrorFallback error={error} title={title} onRetry={this.reset} />;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { Button, NonIdealState } from '@blueprintjs/core';
|
|
2
|
+
import type { ReactElement } from 'react';
|
|
3
|
+
|
|
4
|
+
/** What the page shows in place of the part that failed. */
|
|
5
|
+
export interface ErrorFallbackProps {
|
|
6
|
+
/** What was thrown, whose message is what the visitor is told. */
|
|
7
|
+
error: Error;
|
|
8
|
+
/**
|
|
9
|
+
* Called when the visitor asks for another attempt. Left out when there is
|
|
10
|
+
* nothing sensible to retry, and then no button is drawn.
|
|
11
|
+
* @default undefined — no retry button
|
|
12
|
+
*/
|
|
13
|
+
onRetry?: () => void;
|
|
14
|
+
/**
|
|
15
|
+
* First line, above the message.
|
|
16
|
+
* @default 'Something went wrong'
|
|
17
|
+
*/
|
|
18
|
+
title?: string;
|
|
19
|
+
/**
|
|
20
|
+
* Text of the retry button.
|
|
21
|
+
* @default 'Try again'
|
|
22
|
+
*/
|
|
23
|
+
retryLabel?: string;
|
|
24
|
+
/**
|
|
25
|
+
* Class the holder carries, so a site can reach it from its stylesheet.
|
|
26
|
+
* @default undefined
|
|
27
|
+
*/
|
|
28
|
+
className?: string;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* The default face of a failure: what happened, and a way out of it.
|
|
33
|
+
*
|
|
34
|
+
* The message is written out rather than swallowed, because a visitor who
|
|
35
|
+
* reports "it says nothing" cannot be helped, whereas one who reports the
|
|
36
|
+
* sentence can.
|
|
37
|
+
* @param props - See {@link ErrorFallbackProps}.
|
|
38
|
+
* @returns The non-ideal state.
|
|
39
|
+
*/
|
|
40
|
+
export function ErrorFallback(props: ErrorFallbackProps): ReactElement {
|
|
41
|
+
const {
|
|
42
|
+
error,
|
|
43
|
+
onRetry,
|
|
44
|
+
title = 'Something went wrong',
|
|
45
|
+
retryLabel = 'Try again',
|
|
46
|
+
className,
|
|
47
|
+
} = props;
|
|
48
|
+
|
|
49
|
+
return (
|
|
50
|
+
<NonIdealState
|
|
51
|
+
className={className}
|
|
52
|
+
icon="error"
|
|
53
|
+
title={title}
|
|
54
|
+
description={
|
|
55
|
+
error.message === '' ? 'No message was given.' : error.message
|
|
56
|
+
}
|
|
57
|
+
action={
|
|
58
|
+
onRetry === undefined ? undefined : (
|
|
59
|
+
<Button icon="refresh" text={retryLabel} onClick={onRetry} />
|
|
60
|
+
)
|
|
61
|
+
}
|
|
62
|
+
/>
|
|
63
|
+
);
|
|
64
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Turn whatever a component threw into an `Error`.
|
|
3
|
+
*
|
|
4
|
+
* A `throw` is not required to carry an `Error` — a rejected fetch, a worker
|
|
5
|
+
* message or a library can throw a string, an object or `undefined` — and the
|
|
6
|
+
* boundary still has to name what happened.
|
|
7
|
+
* @param thrown - The value that came out of the render.
|
|
8
|
+
* @returns The value itself when it is an error, otherwise one describing it.
|
|
9
|
+
*/
|
|
10
|
+
export function toError(thrown: unknown): Error {
|
|
11
|
+
if (thrown instanceof Error) return thrown;
|
|
12
|
+
if (typeof thrown === 'string' && thrown !== '') return new Error(thrown);
|
|
13
|
+
return new Error(describe(thrown));
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const UNPRINTABLE = 'an unprintable value was thrown';
|
|
17
|
+
|
|
18
|
+
function describe(thrown: unknown): string {
|
|
19
|
+
if (thrown === null) return 'null was thrown';
|
|
20
|
+
if (thrown === undefined) return 'undefined was thrown';
|
|
21
|
+
if (
|
|
22
|
+
typeof thrown === 'number' ||
|
|
23
|
+
typeof thrown === 'boolean' ||
|
|
24
|
+
typeof thrown === 'bigint'
|
|
25
|
+
) {
|
|
26
|
+
return String(thrown);
|
|
27
|
+
}
|
|
28
|
+
try {
|
|
29
|
+
return JSON.stringify(thrown) ?? UNPRINTABLE;
|
|
30
|
+
} catch {
|
|
31
|
+
return UNPRINTABLE;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { MISSING_VALUE } from './missing.ts';
|
|
2
|
+
|
|
3
|
+
const INTEGER_FORMATTER = new Intl.NumberFormat('en-US', {
|
|
4
|
+
maximumFractionDigits: 0,
|
|
5
|
+
});
|
|
6
|
+
|
|
7
|
+
const COMPACT_FORMATTER = new Intl.NumberFormat('en-US', {
|
|
8
|
+
notation: 'compact',
|
|
9
|
+
maximumFractionDigits: 1,
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
const MAXIMUM_DIGITS = 20;
|
|
13
|
+
const DEFAULT_DIGITS = 2;
|
|
14
|
+
|
|
15
|
+
const decimalFormatters = new Map<number, Intl.NumberFormat>();
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* A whole number, grouped in thousands: `1,234,567`.
|
|
19
|
+
*
|
|
20
|
+
* Anything after the decimal point is rounded away. The locale is fixed to
|
|
21
|
+
* `en-US`, so the same page reads the same way wherever it is opened.
|
|
22
|
+
* @param value - The number to write.
|
|
23
|
+
* @returns The grouped number, or the missing marker when it is not finite.
|
|
24
|
+
*/
|
|
25
|
+
export function formatInteger(value: number): string {
|
|
26
|
+
if (!Number.isFinite(value)) return MISSING_VALUE;
|
|
27
|
+
return INTEGER_FORMATTER.format(value);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* A number grouped in thousands and held to a fixed number of decimals:
|
|
32
|
+
* `1,234.50`.
|
|
33
|
+
*
|
|
34
|
+
* The digits are kept even when they are zeros, which is what a column of
|
|
35
|
+
* figures wants; use {@link formatTrimmed} for a label that should not carry
|
|
36
|
+
* them.
|
|
37
|
+
* @param value - The number to write.
|
|
38
|
+
* @param digits - Decimals to show. Defaults to `2`; a count outside 0..20 is clamped into it, and one that is not a number falls back to the default.
|
|
39
|
+
* @returns The formatted number, or the missing marker when it is not finite.
|
|
40
|
+
*/
|
|
41
|
+
export function formatDecimal(value: number, digits = DEFAULT_DIGITS): string {
|
|
42
|
+
if (!Number.isFinite(value)) return MISSING_VALUE;
|
|
43
|
+
const safeDigits = clampDigits(digits);
|
|
44
|
+
let formatter = decimalFormatters.get(safeDigits);
|
|
45
|
+
if (formatter === undefined) {
|
|
46
|
+
formatter = new Intl.NumberFormat('en-US', {
|
|
47
|
+
minimumFractionDigits: safeDigits,
|
|
48
|
+
maximumFractionDigits: safeDigits,
|
|
49
|
+
});
|
|
50
|
+
decimalFormatters.set(safeDigits, formatter);
|
|
51
|
+
}
|
|
52
|
+
return formatter.format(value);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* A number rounded to `digits` decimals with the trailing zeros dropped:
|
|
57
|
+
* `1.5`, `2`, `0.125`.
|
|
58
|
+
*
|
|
59
|
+
* The thousands are not grouped, so the result stays a number a reader can
|
|
60
|
+
* type back in — this is the form an axis tick, a chip or an exported cell
|
|
61
|
+
* takes.
|
|
62
|
+
* @param value - The number to write.
|
|
63
|
+
* @param digits - Decimals to round to. Defaults to `2`; a count outside 0..20 is clamped into it, and one that is not a number falls back to the default.
|
|
64
|
+
* @returns The rounded number, or the missing marker when it is not finite.
|
|
65
|
+
*/
|
|
66
|
+
export function formatTrimmed(value: number, digits = DEFAULT_DIGITS): string {
|
|
67
|
+
if (!Number.isFinite(value)) return MISSING_VALUE;
|
|
68
|
+
return Number.parseFloat(value.toFixed(clampDigits(digits))).toString();
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* A number shortened for a cramped axis or a badge: `999`, `1.2K`, `3.4M`.
|
|
73
|
+
* @param value - The number to write.
|
|
74
|
+
* @returns The shortened number, or the missing marker when it is not finite.
|
|
75
|
+
*/
|
|
76
|
+
export function formatCompact(value: number): string {
|
|
77
|
+
if (!Number.isFinite(value)) return MISSING_VALUE;
|
|
78
|
+
return COMPACT_FORMATTER.format(value);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function clampDigits(digits: number): number {
|
|
82
|
+
if (!Number.isFinite(digits)) return DEFAULT_DIGITS;
|
|
83
|
+
return Math.min(MAXIMUM_DIGITS, Math.max(0, Math.trunc(digits)));
|
|
84
|
+
}
|