react-cheminfo 0.2.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 +139 -10
- 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 +12 -0
- package/lib/core.d.ts.map +1 -1
- package/lib/core.js +12 -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 +3 -1
- package/lib/ecosystem/core/sites.d.ts.map +1 -1
- package/lib/ecosystem/core/sites.js +33 -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/glyphs.d.ts +16 -0
- package/lib/ecosystem/ui/glyphs.d.ts.map +1 -0
- package/lib/ecosystem/ui/glyphs.js +41 -0
- package/lib/ecosystem/ui/glyphs.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 +15 -36
- 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 +85 -0
- package/lib/orbital/core/atomicGrid.d.ts.map +1 -0
- package/lib/orbital/core/atomicGrid.js +105 -0
- package/lib/orbital/core/atomicGrid.js.map +1 -0
- package/lib/orbital/core/atomicOrbitals.d.ts +97 -0
- package/lib/orbital/core/atomicOrbitals.d.ts.map +1 -0
- package/lib/orbital/core/atomicOrbitals.js +135 -0
- package/lib/orbital/core/atomicOrbitals.js.map +1 -0
- package/lib/orbital/core/constants.d.ts +33 -0
- package/lib/orbital/core/constants.d.ts.map +1 -0
- package/lib/orbital/core/constants.js +21 -0
- package/lib/orbital/core/constants.js.map +1 -0
- package/lib/orbital/core/electronConfiguration.d.ts +106 -0
- package/lib/orbital/core/electronConfiguration.d.ts.map +1 -0
- package/lib/orbital/core/electronConfiguration.js +207 -0
- package/lib/orbital/core/electronConfiguration.js.map +1 -0
- package/lib/orbital/core/grid.d.ts +60 -0
- package/lib/orbital/core/grid.d.ts.map +1 -0
- package/lib/orbital/core/grid.js +81 -0
- package/lib/orbital/core/grid.js.map +1 -0
- package/lib/orbital/core/hydrogenic.d.ts +99 -0
- package/lib/orbital/core/hydrogenic.d.ts.map +1 -0
- package/lib/orbital/core/hydrogenic.js +181 -0
- package/lib/orbital/core/hydrogenic.js.map +1 -0
- package/lib/orbital/core/index.d.ts +24 -0
- package/lib/orbital/core/index.d.ts.map +1 -0
- package/lib/orbital/core/index.js +13 -0
- package/lib/orbital/core/index.js.map +1 -0
- 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/numerics.d.ts +39 -0
- package/lib/orbital/core/numerics.d.ts.map +1 -0
- package/lib/orbital/core/numerics.js +75 -0
- package/lib/orbital/core/numerics.js.map +1 -0
- package/lib/orbital/core/occupancy.d.ts +44 -0
- package/lib/orbital/core/occupancy.d.ts.map +1 -0
- package/lib/orbital/core/occupancy.js +85 -0
- package/lib/orbital/core/occupancy.js.map +1 -0
- package/lib/orbital/core/palette.d.ts +36 -0
- package/lib/orbital/core/palette.d.ts.map +1 -0
- package/lib/orbital/core/palette.js +37 -0
- package/lib/orbital/core/palette.js.map +1 -0
- package/lib/orbital/core/realHarmonics.d.ts +57 -0
- package/lib/orbital/core/realHarmonics.d.ts.map +1 -0
- package/lib/orbital/core/realHarmonics.js +144 -0
- package/lib/orbital/core/realHarmonics.js.map +1 -0
- package/lib/orbital/core/sample.d.ts +66 -0
- package/lib/orbital/core/sample.d.ts.map +1 -0
- package/lib/orbital/core/sample.js +61 -0
- package/lib/orbital/core/sample.js.map +1 -0
- package/lib/orbital/core/screening.d.ts +46 -0
- package/lib/orbital/core/screening.d.ts.map +1 -0
- package/lib/orbital/core/screening.js +72 -0
- package/lib/orbital/core/screening.js.map +1 -0
- package/lib/orbital/ui/AtomicOrbitalCanvas.d.ts +62 -0
- package/lib/orbital/ui/AtomicOrbitalCanvas.d.ts.map +1 -0
- package/lib/orbital/ui/AtomicOrbitalCanvas.js +115 -0
- package/lib/orbital/ui/AtomicOrbitalCanvas.js.map +1 -0
- package/lib/orbital/ui/AtomicOrbitalViewer.d.ts +77 -0
- package/lib/orbital/ui/AtomicOrbitalViewer.d.ts.map +1 -0
- package/lib/orbital/ui/AtomicOrbitalViewer.js +49 -0
- package/lib/orbital/ui/AtomicOrbitalViewer.js.map +1 -0
- package/lib/orbital/ui/camera.d.ts +36 -0
- package/lib/orbital/ui/camera.d.ts.map +1 -0
- package/lib/orbital/ui/camera.js +98 -0
- package/lib/orbital/ui/camera.js.map +1 -0
- package/lib/orbital/ui/capability.d.ts +28 -0
- package/lib/orbital/ui/capability.d.ts.map +1 -0
- package/lib/orbital/ui/capability.js +77 -0
- package/lib/orbital/ui/capability.js.map +1 -0
- package/lib/orbital/ui/index.d.ts +17 -0
- package/lib/orbital/ui/index.d.ts.map +1 -0
- package/lib/orbital/ui/index.js +13 -0
- package/lib/orbital/ui/index.js.map +1 -0
- package/lib/orbital/ui/renderVolume.d.ts +60 -0
- package/lib/orbital/ui/renderVolume.d.ts.map +1 -0
- package/lib/orbital/ui/renderVolume.js +119 -0
- package/lib/orbital/ui/renderVolume.js.map +1 -0
- package/lib/orbital/ui/viewer.d.ts +88 -0
- package/lib/orbital/ui/viewer.d.ts.map +1 -0
- package/lib/orbital/ui/viewer.js +156 -0
- package/lib/orbital/ui/viewer.js.map +1 -0
- package/lib/orbital/ui/volumeField.d.ts +33 -0
- package/lib/orbital/ui/volumeField.d.ts.map +1 -0
- package/lib/orbital/ui/volumeField.js +68 -0
- package/lib/orbital/ui/volumeField.js.map +1 -0
- package/lib/orbital.d.ts +11 -0
- package/lib/orbital.d.ts.map +1 -0
- package/lib/orbital.js +11 -0
- package/lib/orbital.js.map +1 -0
- 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 +25 -4
- package/src/capsule/ui/CapsuleFilter.tsx +119 -0
- package/src/capsule/ui/index.ts +2 -0
- package/src/chrome/ui/NavLink.tsx +88 -0
- package/src/chrome/ui/NavMenuButton.tsx +95 -0
- package/src/chrome/ui/SiteFooter.tsx +65 -0
- package/src/chrome/ui/SiteHeader.tsx +119 -0
- package/src/chrome/ui/index.ts +11 -0
- package/src/chrome/ui/navItem.ts +60 -0
- package/src/chrome/ui/useCompactHeader.ts +81 -0
- package/src/citation/core/clipboard.ts +27 -11
- package/src/citation/core/download.ts +25 -15
- package/src/citation/core/index.ts +8 -3
- package/src/citation/core/works.ts +81 -0
- package/src/citation/ui/CitationMenu.tsx +104 -89
- package/src/citation/ui/CitationPreview.tsx +18 -8
- package/src/citation/ui/CiteButton.tsx +24 -9
- package/src/citation/ui/CopyFormatEntries.tsx +84 -0
- package/src/citation/ui/WorkEntry.tsx +80 -0
- package/src/citation/ui/entries.tsx +18 -20
- package/src/citation/ui/index.ts +10 -2
- package/src/citation/ui/useCopyFeedback.ts +76 -0
- package/src/clipboard/core/index.ts +1 -0
- package/src/clipboard/core/writeToClipboard.ts +47 -0
- package/src/clipboard/ui/CodeBlock.tsx +110 -0
- package/src/clipboard/ui/CopyButton.tsx +111 -0
- package/src/clipboard/ui/index.ts +9 -0
- package/src/clipboard/ui/useCopyToClipboard.ts +57 -0
- package/src/color/core/contrast.ts +85 -0
- package/src/color/core/hex.ts +57 -0
- package/src/color/core/index.ts +4 -0
- package/src/color/core/scale.ts +132 -0
- package/src/color/ui/ColorScaleLegend.tsx +144 -0
- package/src/color/ui/index.ts +2 -0
- package/src/core.ts +12 -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 +38 -1
- package/src/ecosystem/core/tokens.ts +47 -0
- package/src/ecosystem/ui/SiteTheme.tsx +23 -0
- package/src/ecosystem/ui/Wordmark.tsx +65 -0
- package/src/ecosystem/ui/glyphs.tsx +246 -0
- package/src/ecosystem/ui/index.ts +4 -0
- package/src/ecosystem/ui/marks.tsx +56 -214
- 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 +167 -0
- package/src/orbital/core/atomicOrbitals.ts +212 -0
- package/src/orbital/core/constants.ts +36 -0
- package/src/orbital/core/electronConfiguration.ts +242 -0
- package/src/orbital/core/grid.ts +126 -0
- package/src/orbital/core/hydrogenic.ts +222 -0
- package/src/orbital/core/index.ts +63 -0
- package/src/orbital/core/isovalue.ts +146 -0
- package/src/orbital/core/numerics.ts +79 -0
- package/src/orbital/core/occupancy.ts +100 -0
- package/src/orbital/core/palette.ts +56 -0
- package/src/orbital/core/realHarmonics.ts +172 -0
- package/src/orbital/core/sample.ts +111 -0
- package/src/orbital/core/screening.ts +90 -0
- package/src/orbital/ui/AtomicOrbitalCanvas.tsx +197 -0
- package/src/orbital/ui/AtomicOrbitalViewer.tsx +154 -0
- package/src/orbital/ui/camera.ts +125 -0
- package/src/orbital/ui/capability.ts +102 -0
- package/src/orbital/ui/index.ts +17 -0
- package/src/orbital/ui/renderVolume.ts +203 -0
- package/src/orbital/ui/viewer.ts +191 -0
- package/src/orbital/ui/volumeField.ts +84 -0
- package/src/orbital.ts +11 -0
- 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
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { useEffect, useRef, useState } from 'react';
|
|
2
|
+
|
|
3
|
+
import { copyCitations } from '../core/clipboard.ts';
|
|
4
|
+
import type { CitationFormatId } from '../core/formats.ts';
|
|
5
|
+
import type { Reference } from '../core/reference.ts';
|
|
6
|
+
import type { CitationStyleId } from '../core/segments.ts';
|
|
7
|
+
|
|
8
|
+
import type { CopyState } from './entries.tsx';
|
|
9
|
+
|
|
10
|
+
// How long the tick replaces the clipboard glyph of an entry after a copy.
|
|
11
|
+
const FEEDBACK_MS = 1500;
|
|
12
|
+
|
|
13
|
+
/** Copying, with the feedback the entry that was clicked then shows. */
|
|
14
|
+
export interface CopyFeedback {
|
|
15
|
+
/** The feedback showing on the entry known as `key`, if any. */
|
|
16
|
+
stateOf: (key: string) => CopyState | null;
|
|
17
|
+
/**
|
|
18
|
+
* Copy the references, and announce the outcome on the entry known as `key`.
|
|
19
|
+
*/
|
|
20
|
+
copy: (
|
|
21
|
+
key: string,
|
|
22
|
+
references: readonly Reference[],
|
|
23
|
+
format: CitationFormatId,
|
|
24
|
+
style?: CitationStyleId,
|
|
25
|
+
) => void;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Hold which entry of a citation menu was clicked last and how it went, so the
|
|
30
|
+
* tick — or the cross a denied clipboard leaves — shows on that entry alone.
|
|
31
|
+
* @returns The copy action, and the feedback of the entry that used it.
|
|
32
|
+
*/
|
|
33
|
+
export function useCopyFeedback(): CopyFeedback {
|
|
34
|
+
const [copied, setCopied] = useState<string | null>(null);
|
|
35
|
+
const [hasFailed, setHasFailed] = useState(false);
|
|
36
|
+
const timeout = useRef<number | null>(null);
|
|
37
|
+
|
|
38
|
+
useEffect(() => {
|
|
39
|
+
return () => {
|
|
40
|
+
if (timeout.current !== null) window.clearTimeout(timeout.current);
|
|
41
|
+
};
|
|
42
|
+
}, []);
|
|
43
|
+
|
|
44
|
+
function announce(key: string, failed: boolean): void {
|
|
45
|
+
setCopied(key);
|
|
46
|
+
setHasFailed(failed);
|
|
47
|
+
if (timeout.current !== null) window.clearTimeout(timeout.current);
|
|
48
|
+
timeout.current = window.setTimeout(() => {
|
|
49
|
+
setCopied(null);
|
|
50
|
+
setHasFailed(false);
|
|
51
|
+
}, FEEDBACK_MS);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
return {
|
|
55
|
+
stateOf: (key) => (copied === key ? feedback(hasFailed) : null),
|
|
56
|
+
copy: (key, references, format, style) => {
|
|
57
|
+
copyCitations(references, format, style).then(
|
|
58
|
+
() => {
|
|
59
|
+
announce(key, false);
|
|
60
|
+
},
|
|
61
|
+
() => {
|
|
62
|
+
// A denied clipboard permission is the usual cause, and the menu is
|
|
63
|
+
// the only place the user can be told about it.
|
|
64
|
+
announce(key, true);
|
|
65
|
+
},
|
|
66
|
+
);
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function feedback(failed: boolean): CopyState {
|
|
72
|
+
if (failed) {
|
|
73
|
+
return { icon: 'cross', intent: 'danger', label: 'copy failed' };
|
|
74
|
+
}
|
|
75
|
+
return { icon: 'tick', intent: 'success', label: 'copied' };
|
|
76
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { writeToClipboard } from './writeToClipboard.ts';
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Put a piece of text on the clipboard, without ever throwing at the caller.
|
|
3
|
+
*
|
|
4
|
+
* The async Clipboard API is tried first and a hidden textarea is the fallback,
|
|
5
|
+
* which is what a page served over plain HTTP, an older Safari, or a browser
|
|
6
|
+
* that refused the permission is left with. A refusal is an outcome the caller
|
|
7
|
+
* shows rather than an error it has to catch, so both paths resolve.
|
|
8
|
+
* @param text - What to put on the clipboard.
|
|
9
|
+
* @returns Whether the clipboard now holds the text.
|
|
10
|
+
*/
|
|
11
|
+
export async function writeToClipboard(text: string): Promise<boolean> {
|
|
12
|
+
const clipboard = globalThis.navigator?.clipboard;
|
|
13
|
+
if (clipboard) {
|
|
14
|
+
try {
|
|
15
|
+
await clipboard.writeText(text);
|
|
16
|
+
return true;
|
|
17
|
+
} catch {
|
|
18
|
+
// A denied permission, or a call the browser no longer considers to come
|
|
19
|
+
// from a user gesture. The textarea below still works in both cases.
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return writeWithTextArea(text);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function writeWithTextArea(text: string): boolean {
|
|
26
|
+
if (typeof document === 'undefined') return false;
|
|
27
|
+
|
|
28
|
+
const textArea = document.createElement('textarea');
|
|
29
|
+
textArea.value = text;
|
|
30
|
+
textArea.setAttribute('readonly', '');
|
|
31
|
+
// Off the screen rather than hidden: a `display: none` element selects
|
|
32
|
+
// nothing, and a visible one scrolls the page as it is focused.
|
|
33
|
+
textArea.style.position = 'fixed';
|
|
34
|
+
textArea.style.top = '-9999px';
|
|
35
|
+
textArea.style.opacity = '0';
|
|
36
|
+
document.body.append(textArea);
|
|
37
|
+
textArea.select();
|
|
38
|
+
|
|
39
|
+
try {
|
|
40
|
+
// eslint-disable-next-line @typescript-eslint/no-deprecated -- the deprecated command is what the fallback is
|
|
41
|
+
return document.execCommand('copy');
|
|
42
|
+
} catch {
|
|
43
|
+
return false;
|
|
44
|
+
} finally {
|
|
45
|
+
textArea.remove();
|
|
46
|
+
}
|
|
47
|
+
}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import type { CSSProperties, ReactElement, ReactNode } from 'react';
|
|
2
|
+
|
|
3
|
+
import { CopyButton } from './CopyButton.tsx';
|
|
4
|
+
|
|
5
|
+
/** How a code block sits on the page it is shown in. */
|
|
6
|
+
export type CodeBlockTone = 'default' | 'muted' | 'dark';
|
|
7
|
+
|
|
8
|
+
const HOLDER_STYLE: CSSProperties = { position: 'relative' };
|
|
9
|
+
const COPY_STYLE: CSSProperties = { position: 'absolute', top: 4, right: 4 };
|
|
10
|
+
|
|
11
|
+
const BASE_PRE_STYLE: CSSProperties = {
|
|
12
|
+
margin: 0,
|
|
13
|
+
padding: '8px 10px',
|
|
14
|
+
borderRadius: 4,
|
|
15
|
+
fontSize: 12,
|
|
16
|
+
whiteSpace: 'pre-wrap',
|
|
17
|
+
overflowWrap: 'anywhere',
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
const TONE_STYLE: Record<CodeBlockTone, CSSProperties> = {
|
|
21
|
+
default: {},
|
|
22
|
+
muted: { background: '#f6f7f9', border: '1px solid #d3d8de' },
|
|
23
|
+
dark: {
|
|
24
|
+
background: '#1e293b',
|
|
25
|
+
border: '1px solid #1e293b',
|
|
26
|
+
color: '#e2e8f0',
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
export interface CodeBlockProps {
|
|
31
|
+
/** The text shown, and what the copy button hands over. */
|
|
32
|
+
code: string;
|
|
33
|
+
/**
|
|
34
|
+
* What is drawn in place of the plain text — syntax coloured spans, for
|
|
35
|
+
* instance. The code itself is still what gets copied.
|
|
36
|
+
* @default undefined — the code is shown as it is
|
|
37
|
+
*/
|
|
38
|
+
children?: ReactNode;
|
|
39
|
+
/**
|
|
40
|
+
* How the block is painted: nothing of its own, a light grey panel, or a
|
|
41
|
+
* dark one.
|
|
42
|
+
* @default 'default'
|
|
43
|
+
*/
|
|
44
|
+
tone?: CodeBlockTone;
|
|
45
|
+
/**
|
|
46
|
+
* Whether a copy button sits in the corner of the block.
|
|
47
|
+
* @default false
|
|
48
|
+
*/
|
|
49
|
+
copyable?: boolean;
|
|
50
|
+
/**
|
|
51
|
+
* Height past which the block scrolls on its own rather than pushing what
|
|
52
|
+
* follows it down the page.
|
|
53
|
+
* @default undefined — the block is as tall as its content
|
|
54
|
+
*/
|
|
55
|
+
maxHeight?: number | string;
|
|
56
|
+
/**
|
|
57
|
+
* Class the holder carries, in addition to `code-block`.
|
|
58
|
+
* @default undefined
|
|
59
|
+
*/
|
|
60
|
+
className?: string;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* A block of text to hand over: the address of a page, the markup that frames
|
|
65
|
+
* it, or a sample meant to be pasted into an editor and run.
|
|
66
|
+
* @param props - The code, how it is painted, and whether it can be copied.
|
|
67
|
+
* @returns The code block.
|
|
68
|
+
*/
|
|
69
|
+
export function CodeBlock(props: CodeBlockProps): ReactElement {
|
|
70
|
+
const {
|
|
71
|
+
code,
|
|
72
|
+
children,
|
|
73
|
+
tone = 'default',
|
|
74
|
+
copyable = false,
|
|
75
|
+
maxHeight,
|
|
76
|
+
className,
|
|
77
|
+
} = props;
|
|
78
|
+
|
|
79
|
+
return (
|
|
80
|
+
<div className={holderClassName(tone, className)} style={HOLDER_STYLE}>
|
|
81
|
+
<pre style={preStyle(tone, copyable, maxHeight)}>{children ?? code}</pre>
|
|
82
|
+
{copyable ? (
|
|
83
|
+
<span style={COPY_STYLE}>
|
|
84
|
+
<CopyButton content={code} minimal small />
|
|
85
|
+
</span>
|
|
86
|
+
) : null}
|
|
87
|
+
</div>
|
|
88
|
+
);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function holderClassName(tone: CodeBlockTone, className?: string): string {
|
|
92
|
+
const names = ['code-block'];
|
|
93
|
+
if (tone !== 'default') names.push(`code-block--${tone}`);
|
|
94
|
+
if (className !== undefined) names.push(className);
|
|
95
|
+
return names.join(' ');
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function preStyle(
|
|
99
|
+
tone: CodeBlockTone,
|
|
100
|
+
copyable: boolean,
|
|
101
|
+
maxHeight: number | string | undefined,
|
|
102
|
+
): CSSProperties {
|
|
103
|
+
return {
|
|
104
|
+
...BASE_PRE_STYLE,
|
|
105
|
+
...TONE_STYLE[tone],
|
|
106
|
+
// The button floats over the corner, so the text stops before it.
|
|
107
|
+
...(copyable ? { paddingRight: 42 } : {}),
|
|
108
|
+
...(maxHeight === undefined ? {} : { maxHeight, overflowY: 'auto' }),
|
|
109
|
+
};
|
|
110
|
+
}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import type { IconName } from '@blueprintjs/core';
|
|
2
|
+
import { Button } from '@blueprintjs/core';
|
|
3
|
+
import type { ReactElement } from 'react';
|
|
4
|
+
|
|
5
|
+
import {
|
|
6
|
+
DEFAULT_COPY_RESET_AFTER,
|
|
7
|
+
useCopyToClipboard,
|
|
8
|
+
} from './useCopyToClipboard.ts';
|
|
9
|
+
|
|
10
|
+
export interface CopyButtonProps {
|
|
11
|
+
/**
|
|
12
|
+
* What to copy. A function is called when the button is pressed, which is
|
|
13
|
+
* what a whole list has to be: writing ten thousand structures out on every
|
|
14
|
+
* render, for a button nobody may press, is a page that stutters as it is
|
|
15
|
+
* scrolled.
|
|
16
|
+
*/
|
|
17
|
+
content: string | (() => string);
|
|
18
|
+
/**
|
|
19
|
+
* Text of the button. Left out for an icon-only button, which is what a
|
|
20
|
+
* dense row of them needs.
|
|
21
|
+
* @default undefined — the button is reduced to its icon
|
|
22
|
+
*/
|
|
23
|
+
label?: string;
|
|
24
|
+
/**
|
|
25
|
+
* Text shown while the copy is being confirmed, when there is a label.
|
|
26
|
+
* @default 'Copied'
|
|
27
|
+
*/
|
|
28
|
+
copiedLabel?: string;
|
|
29
|
+
/**
|
|
30
|
+
* Whether the button drops its background, for a toolbar or a code block.
|
|
31
|
+
* @default false
|
|
32
|
+
*/
|
|
33
|
+
minimal?: boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Whether the button is the small size.
|
|
36
|
+
* @default false
|
|
37
|
+
*/
|
|
38
|
+
small?: boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Glyph shown at rest. A tick replaces it while the copy is confirmed.
|
|
41
|
+
* @default 'duplicate'
|
|
42
|
+
*/
|
|
43
|
+
icon?: IconName;
|
|
44
|
+
/**
|
|
45
|
+
* Whether there is nothing to copy.
|
|
46
|
+
* @default false
|
|
47
|
+
*/
|
|
48
|
+
disabled?: boolean;
|
|
49
|
+
/**
|
|
50
|
+
* How long the button says it copied, in milliseconds.
|
|
51
|
+
* @default 1500
|
|
52
|
+
*/
|
|
53
|
+
resetAfter?: number;
|
|
54
|
+
/**
|
|
55
|
+
* What the pointer and a screen reader are told.
|
|
56
|
+
* @default 'Copy to clipboard'
|
|
57
|
+
*/
|
|
58
|
+
title?: string;
|
|
59
|
+
/**
|
|
60
|
+
* Class the button carries, so a site can reach it from its stylesheet.
|
|
61
|
+
* @default undefined
|
|
62
|
+
*/
|
|
63
|
+
className?: string;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* A button that puts a piece of text on the clipboard and says so.
|
|
68
|
+
* @param props - What to copy, what the button reads, and how it looks.
|
|
69
|
+
* @returns The copy button.
|
|
70
|
+
*/
|
|
71
|
+
export function CopyButton(props: CopyButtonProps): ReactElement {
|
|
72
|
+
const {
|
|
73
|
+
content,
|
|
74
|
+
label,
|
|
75
|
+
copiedLabel = 'Copied',
|
|
76
|
+
minimal = false,
|
|
77
|
+
small = false,
|
|
78
|
+
icon = 'duplicate',
|
|
79
|
+
disabled = false,
|
|
80
|
+
resetAfter = DEFAULT_COPY_RESET_AFTER,
|
|
81
|
+
title = 'Copy to clipboard',
|
|
82
|
+
className,
|
|
83
|
+
} = props;
|
|
84
|
+
const { copied, copy } = useCopyToClipboard(resetAfter);
|
|
85
|
+
|
|
86
|
+
return (
|
|
87
|
+
<Button
|
|
88
|
+
className={className}
|
|
89
|
+
variant={minimal ? 'minimal' : 'solid'}
|
|
90
|
+
size={small ? 'small' : 'medium'}
|
|
91
|
+
icon={copied ? 'tick' : icon}
|
|
92
|
+
intent={copied ? 'success' : 'none'}
|
|
93
|
+
text={buttonText(label, copiedLabel, copied)}
|
|
94
|
+
disabled={disabled}
|
|
95
|
+
title={title}
|
|
96
|
+
aria-label={label ?? title}
|
|
97
|
+
onClick={() => {
|
|
98
|
+
void copy(typeof content === 'function' ? content() : content);
|
|
99
|
+
}}
|
|
100
|
+
/>
|
|
101
|
+
);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function buttonText(
|
|
105
|
+
label: string | undefined,
|
|
106
|
+
copiedLabel: string,
|
|
107
|
+
copied: boolean,
|
|
108
|
+
): string | undefined {
|
|
109
|
+
if (label === undefined) return undefined;
|
|
110
|
+
return copied ? copiedLabel : label;
|
|
111
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export type { CodeBlockProps, CodeBlockTone } from './CodeBlock.tsx';
|
|
2
|
+
export { CodeBlock } from './CodeBlock.tsx';
|
|
3
|
+
export type { CopyButtonProps } from './CopyButton.tsx';
|
|
4
|
+
export { CopyButton } from './CopyButton.tsx';
|
|
5
|
+
export type { CopyToClipboard } from './useCopyToClipboard.ts';
|
|
6
|
+
export {
|
|
7
|
+
DEFAULT_COPY_RESET_AFTER,
|
|
8
|
+
useCopyToClipboard,
|
|
9
|
+
} from './useCopyToClipboard.ts';
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
2
|
+
|
|
3
|
+
import { writeToClipboard } from '../core/writeToClipboard.ts';
|
|
4
|
+
|
|
5
|
+
/** How long a copy is confirmed for, in milliseconds, unless asked otherwise. */
|
|
6
|
+
export const DEFAULT_COPY_RESET_AFTER = 1500;
|
|
7
|
+
|
|
8
|
+
/** A clipboard write and the confirmation it leaves behind for a moment. */
|
|
9
|
+
export interface CopyToClipboard {
|
|
10
|
+
/** Whether the last copy worked and is still being confirmed. */
|
|
11
|
+
copied: boolean;
|
|
12
|
+
/**
|
|
13
|
+
* Put text on the clipboard and confirm it.
|
|
14
|
+
* @param text - What to copy.
|
|
15
|
+
* @returns Whether the clipboard took it.
|
|
16
|
+
*/
|
|
17
|
+
copy: (text: string) => Promise<boolean>;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Copy text and say so for a moment afterwards.
|
|
22
|
+
*
|
|
23
|
+
* The confirmation timer is cleared when the component goes away, and a copy
|
|
24
|
+
* that lands after that confirms nothing, so a button unmounted mid-copy — a
|
|
25
|
+
* row leaving a list, a menu closing — leaves no timer behind.
|
|
26
|
+
* @param resetAfter - How long the confirmation lasts, in milliseconds.
|
|
27
|
+
* @returns The confirmation flag and the copy action.
|
|
28
|
+
*/
|
|
29
|
+
export function useCopyToClipboard(
|
|
30
|
+
resetAfter = DEFAULT_COPY_RESET_AFTER,
|
|
31
|
+
): CopyToClipboard {
|
|
32
|
+
const [copied, setCopied] = useState(false);
|
|
33
|
+
const timer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);
|
|
34
|
+
const isMounted = useRef(true);
|
|
35
|
+
|
|
36
|
+
useEffect(() => {
|
|
37
|
+
isMounted.current = true;
|
|
38
|
+
return () => {
|
|
39
|
+
isMounted.current = false;
|
|
40
|
+
clearTimeout(timer.current);
|
|
41
|
+
};
|
|
42
|
+
}, []);
|
|
43
|
+
|
|
44
|
+
const copy = useCallback(
|
|
45
|
+
async (text: string) => {
|
|
46
|
+
const written = await writeToClipboard(text);
|
|
47
|
+
if (!written || !isMounted.current) return written;
|
|
48
|
+
setCopied(true);
|
|
49
|
+
clearTimeout(timer.current);
|
|
50
|
+
timer.current = setTimeout(() => setCopied(false), resetAfter);
|
|
51
|
+
return true;
|
|
52
|
+
},
|
|
53
|
+
[resetAfter],
|
|
54
|
+
);
|
|
55
|
+
|
|
56
|
+
return { copied, copy };
|
|
57
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { parseHexColor } from './hex.ts';
|
|
2
|
+
|
|
3
|
+
const RED_WEIGHT = 0.2126;
|
|
4
|
+
const GREEN_WEIGHT = 0.7152;
|
|
5
|
+
const BLUE_WEIGHT = 0.0722;
|
|
6
|
+
const LINEAR_THRESHOLD = 0.039_28;
|
|
7
|
+
|
|
8
|
+
/** The ink written on a light background. */
|
|
9
|
+
const DARK_INK = '#182026';
|
|
10
|
+
/** The ink written on a dark background. */
|
|
11
|
+
const LIGHT_INK = '#ffffff';
|
|
12
|
+
|
|
13
|
+
/** Which two inks {@link readableInk} chooses between. */
|
|
14
|
+
export interface ReadableInkOptions {
|
|
15
|
+
/**
|
|
16
|
+
* The ink for a light background.
|
|
17
|
+
* @default '#182026'
|
|
18
|
+
*/
|
|
19
|
+
dark?: string;
|
|
20
|
+
/**
|
|
21
|
+
* The ink for a dark background.
|
|
22
|
+
* @default '#ffffff'
|
|
23
|
+
*/
|
|
24
|
+
light?: string;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* The relative luminance of a colour, as WCAG 2 defines it.
|
|
29
|
+
* @param color - A `#rgb` or `#rrggbb` colour.
|
|
30
|
+
* @returns Its luminance, from 0 for black to 1 for white.
|
|
31
|
+
* @throws {Error} When the string is not a hex colour.
|
|
32
|
+
*/
|
|
33
|
+
export function relativeLuminance(color: string): number {
|
|
34
|
+
const { red, green, blue } = parseHexColor(color);
|
|
35
|
+
return (
|
|
36
|
+
RED_WEIGHT * linearize(red) +
|
|
37
|
+
GREEN_WEIGHT * linearize(green) +
|
|
38
|
+
BLUE_WEIGHT * linearize(blue)
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* The WCAG contrast ratio between two colours, whichever way round they come.
|
|
44
|
+
*
|
|
45
|
+
* Body text needs 4.5, large text and interface parts need 3.
|
|
46
|
+
* @param first - A `#rgb` or `#rrggbb` colour.
|
|
47
|
+
* @param second - The colour it is read against.
|
|
48
|
+
* @returns A ratio from 1 for two identical colours to 21 for black on white.
|
|
49
|
+
* @throws {Error} When either string is not a hex colour.
|
|
50
|
+
*/
|
|
51
|
+
export function contrastRatio(first: string, second: string): number {
|
|
52
|
+
const one = relativeLuminance(first);
|
|
53
|
+
const other = relativeLuminance(second);
|
|
54
|
+
const lighter = Math.max(one, other);
|
|
55
|
+
const darker = Math.min(one, other);
|
|
56
|
+
return (lighter + 0.05) / (darker + 0.05);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* The ink that stays readable on a background.
|
|
61
|
+
*
|
|
62
|
+
* The two candidates are compared by contrast ratio rather than by a lightness
|
|
63
|
+
* threshold, so the choice is the one WCAG would make and a mid-tone
|
|
64
|
+
* background gets the ink it actually reads better against.
|
|
65
|
+
* @param background - The `#rgb` or `#rrggbb` colour written on.
|
|
66
|
+
* @param options - See {@link ReadableInkOptions}.
|
|
67
|
+
* @returns Whichever of the two inks reaches the higher contrast.
|
|
68
|
+
* @throws {Error} When any of the colours is not a hex colour.
|
|
69
|
+
*/
|
|
70
|
+
export function readableInk(
|
|
71
|
+
background: string,
|
|
72
|
+
options: ReadableInkOptions = {},
|
|
73
|
+
): string {
|
|
74
|
+
const { dark = DARK_INK, light = LIGHT_INK } = options;
|
|
75
|
+
return contrastRatio(background, dark) >= contrastRatio(background, light)
|
|
76
|
+
? dark
|
|
77
|
+
: light;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function linearize(channel: number): number {
|
|
81
|
+
const value = channel / 255;
|
|
82
|
+
return value <= LINEAR_THRESHOLD
|
|
83
|
+
? value / 12.92
|
|
84
|
+
: ((value + 0.055) / 1.055) ** 2.4;
|
|
85
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
const HEX_COLOR = /^#(?:[\da-f]{3}|[\da-f]{6})$/i;
|
|
2
|
+
const SHORT_LENGTH = 3;
|
|
3
|
+
const MAXIMUM_CHANNEL = 255;
|
|
4
|
+
|
|
5
|
+
/** The three channels of a colour, each from 0 to 255. */
|
|
6
|
+
export interface RgbColor {
|
|
7
|
+
/** Red channel. */
|
|
8
|
+
red: number;
|
|
9
|
+
/** Green channel. */
|
|
10
|
+
green: number;
|
|
11
|
+
/** Blue channel. */
|
|
12
|
+
blue: number;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Read a `#rgb` or `#rrggbb` colour into its three channels.
|
|
17
|
+
* @param color - A hex colour with its leading `#`, in either the short or the long form.
|
|
18
|
+
* @returns The three channels, each from 0 to 255.
|
|
19
|
+
* @throws {Error} When the string is not a hex colour, naming the value that was read.
|
|
20
|
+
*/
|
|
21
|
+
export function parseHexColor(color: string): RgbColor {
|
|
22
|
+
const text = typeof color === 'string' ? color.trim() : '';
|
|
23
|
+
if (!HEX_COLOR.test(text)) {
|
|
24
|
+
throw new Error(`not a hex colour: ${color}`);
|
|
25
|
+
}
|
|
26
|
+
const digits = text.slice(1);
|
|
27
|
+
const size = digits.length === SHORT_LENGTH ? 1 : 2;
|
|
28
|
+
return {
|
|
29
|
+
red: channelAt(digits, 0, size),
|
|
30
|
+
green: channelAt(digits, 1, size),
|
|
31
|
+
blue: channelAt(digits, 2, size),
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Write three channels back as a `#rrggbb` colour.
|
|
37
|
+
*
|
|
38
|
+
* Each channel is rounded and held inside 0..255, so the result of an
|
|
39
|
+
* interpolation is always a colour a browser accepts.
|
|
40
|
+
* @param color - The three channels.
|
|
41
|
+
* @returns The lower-case six-digit hex colour.
|
|
42
|
+
*/
|
|
43
|
+
export function toHexColor(color: RgbColor): string {
|
|
44
|
+
return `#${channelHex(color.red)}${channelHex(color.green)}${channelHex(color.blue)}`;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function channelAt(digits: string, index: number, size: number): number {
|
|
48
|
+
const part = digits.slice(index * size, index * size + size);
|
|
49
|
+
return Number.parseInt(size === 1 ? `${part}${part}` : part, 16);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function channelHex(value: number): string {
|
|
53
|
+
const safe = Number.isFinite(value)
|
|
54
|
+
? Math.min(MAXIMUM_CHANNEL, Math.max(0, Math.round(value)))
|
|
55
|
+
: 0;
|
|
56
|
+
return safe.toString(16).padStart(2, '0');
|
|
57
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export type { ReadableInkOptions } from './contrast.ts';
|
|
2
|
+
export { contrastRatio, readableInk, relativeLuminance } from './contrast.ts';
|
|
3
|
+
export type { PositionInRangeOptions, Swatch } from './scale.ts';
|
|
4
|
+
export { VIRIDIS_SCALE, positionInRange, swatchFromScale } from './scale.ts';
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import type { ReadableInkOptions } from './contrast.ts';
|
|
2
|
+
import { readableInk } from './contrast.ts';
|
|
3
|
+
import { parseHexColor, toHexColor } from './hex.ts';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Viridis, sampled at nine stops.
|
|
7
|
+
*
|
|
8
|
+
* It stays readable under the common colour deficiencies and is monotone in
|
|
9
|
+
* lightness, so a greyscale print of the same figure still orders the values.
|
|
10
|
+
*/
|
|
11
|
+
export const VIRIDIS_SCALE: readonly string[] = [
|
|
12
|
+
'#440154',
|
|
13
|
+
'#482878',
|
|
14
|
+
'#3e4a89',
|
|
15
|
+
'#31688e',
|
|
16
|
+
'#26828e',
|
|
17
|
+
'#1f9e89',
|
|
18
|
+
'#35b779',
|
|
19
|
+
'#6dcd59',
|
|
20
|
+
'#b4de2c',
|
|
21
|
+
];
|
|
22
|
+
|
|
23
|
+
/** A colour, and the ink that stays readable on it. */
|
|
24
|
+
export interface Swatch {
|
|
25
|
+
/** The colour behind the value. */
|
|
26
|
+
background: string;
|
|
27
|
+
/** The ink to write the value in. */
|
|
28
|
+
foreground: string;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/** How {@link positionInRange} places a value. */
|
|
32
|
+
export interface PositionInRangeOptions {
|
|
33
|
+
/**
|
|
34
|
+
* Whether to place the value on a base-10 logarithmic scale, for a quantity
|
|
35
|
+
* — an abundance, a density, a concentration — spread over so many decades
|
|
36
|
+
* that a linear placement gives all but a couple of values the same colour.
|
|
37
|
+
* @default false
|
|
38
|
+
*/
|
|
39
|
+
logarithmic?: boolean;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Where a value sits between two bounds.
|
|
44
|
+
* @param value - The value to place.
|
|
45
|
+
* @param min - The smallest value the range holds.
|
|
46
|
+
* @param max - The largest value it holds.
|
|
47
|
+
* @param options - See {@link PositionInRangeOptions}.
|
|
48
|
+
* @returns A fraction clamped to 0..1; the middle when the range holds a single value, and 0 when any of the three numbers is not finite.
|
|
49
|
+
*/
|
|
50
|
+
export function positionInRange(
|
|
51
|
+
value: number,
|
|
52
|
+
min: number,
|
|
53
|
+
max: number,
|
|
54
|
+
options: PositionInRangeOptions = {},
|
|
55
|
+
): number {
|
|
56
|
+
const { logarithmic = false } = options;
|
|
57
|
+
if (
|
|
58
|
+
!Number.isFinite(value) ||
|
|
59
|
+
!Number.isFinite(min) ||
|
|
60
|
+
!Number.isFinite(max)
|
|
61
|
+
) {
|
|
62
|
+
return 0;
|
|
63
|
+
}
|
|
64
|
+
if (max === min) return 0.5;
|
|
65
|
+
if (!logarithmic) return clampUnit((value - min) / (max - min));
|
|
66
|
+
|
|
67
|
+
const floor = Math.max(min, smallestPositive(min, max));
|
|
68
|
+
const span = Math.log10(max) - Math.log10(floor);
|
|
69
|
+
if (span === 0) return 0.5;
|
|
70
|
+
return clampUnit(
|
|
71
|
+
(Math.log10(Math.max(value, floor)) - Math.log10(floor)) / span,
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* The colour a scale takes at a position, interpolated between its stops.
|
|
77
|
+
* @param stops - The scale's colours, from its low end to its high end, as `#rgb` or `#rrggbb`.
|
|
78
|
+
* @param position - Where on the scale to read, from 0 to 1; anything outside is clamped.
|
|
79
|
+
* @returns The colour at that position, as `#rrggbb`.
|
|
80
|
+
* @throws {Error} When the scale has no stops, or a stop is not a hex colour.
|
|
81
|
+
*/
|
|
82
|
+
export function colorFromScale(
|
|
83
|
+
stops: readonly string[],
|
|
84
|
+
position: number,
|
|
85
|
+
): string {
|
|
86
|
+
if (stops.length === 0) {
|
|
87
|
+
throw new Error('a colour scale needs at least one stop');
|
|
88
|
+
}
|
|
89
|
+
const scaled = clampUnit(position) * (stops.length - 1);
|
|
90
|
+
const lowerIndex = Math.floor(scaled);
|
|
91
|
+
const start = stops[lowerIndex];
|
|
92
|
+
const end = stops[Math.min(lowerIndex + 1, stops.length - 1)];
|
|
93
|
+
if (start === undefined || end === undefined) {
|
|
94
|
+
throw new Error(`no colour at position ${String(position)}`);
|
|
95
|
+
}
|
|
96
|
+
const from = parseHexColor(start);
|
|
97
|
+
const to = parseHexColor(end);
|
|
98
|
+
const ratio = scaled - lowerIndex;
|
|
99
|
+
return toHexColor({
|
|
100
|
+
red: from.red + (to.red - from.red) * ratio,
|
|
101
|
+
green: from.green + (to.green - from.green) * ratio,
|
|
102
|
+
blue: from.blue + (to.blue - from.blue) * ratio,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* The colour a scale takes at a position, together with the ink to write on it.
|
|
108
|
+
* @param stops - The scale's colours, from its low end to its high end.
|
|
109
|
+
* @param position - Where on the scale to read, from 0 to 1; anything outside is clamped.
|
|
110
|
+
* @param options - See {@link ReadableInkOptions}.
|
|
111
|
+
* @returns The background and the readable ink.
|
|
112
|
+
* @throws {Error} When the scale has no stops, or a stop is not a hex colour.
|
|
113
|
+
*/
|
|
114
|
+
export function swatchFromScale(
|
|
115
|
+
stops: readonly string[],
|
|
116
|
+
position: number,
|
|
117
|
+
options: ReadableInkOptions = {},
|
|
118
|
+
): Swatch {
|
|
119
|
+
const background = colorFromScale(stops, position);
|
|
120
|
+
return { background, foreground: readableInk(background, options) };
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
function clampUnit(value: number): number {
|
|
124
|
+
if (!Number.isFinite(value)) return 0;
|
|
125
|
+
return Math.min(1, Math.max(0, value));
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
function smallestPositive(min: number, max: number): number {
|
|
129
|
+
if (min > 0) return min;
|
|
130
|
+
if (max <= 0) return 1;
|
|
131
|
+
return max * 1e-12;
|
|
132
|
+
}
|