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
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { CancelledRequestError, RequestTimeoutError } from "./errors.js";
|
|
2
|
+
/**
|
|
3
|
+
* Turn a worker into something a page can await.
|
|
4
|
+
*
|
|
5
|
+
* Several requests may be in flight at once; each one is tagged with an
|
|
6
|
+
* identifier the answer echoes, so replies are matched to callers whatever
|
|
7
|
+
* order they arrive in. A request that rejects — cancelled, timed out, or
|
|
8
|
+
* failed — drops out of the pending map at that moment, so a page that fires
|
|
9
|
+
* one job per keystroke never accumulates them.
|
|
10
|
+
*
|
|
11
|
+
* The worker is the caller's: the channel posts to it and terminates it when
|
|
12
|
+
* asked, but never creates one, which is what lets a site keep its own lazy
|
|
13
|
+
* construction and its own in-process fallback.
|
|
14
|
+
* @param worker - The worker to talk to, or anything that speaks its three calls.
|
|
15
|
+
* @param options - See {@link WorkerChannelOptions}.
|
|
16
|
+
* @returns The channel.
|
|
17
|
+
*/
|
|
18
|
+
export function createWorkerChannel(worker, options = {}) {
|
|
19
|
+
const name = options.name ?? 'worker';
|
|
20
|
+
const defaultTimeoutMs = positiveMilliseconds(options.defaultTimeoutMs, DEFAULT_TIMEOUT_MS);
|
|
21
|
+
const pending = new Map();
|
|
22
|
+
let nextId = 0;
|
|
23
|
+
let terminated = false;
|
|
24
|
+
function settle(id) {
|
|
25
|
+
const entry = pending.get(id);
|
|
26
|
+
if (entry === undefined)
|
|
27
|
+
return undefined;
|
|
28
|
+
pending.delete(id);
|
|
29
|
+
entry.dispose();
|
|
30
|
+
return entry;
|
|
31
|
+
}
|
|
32
|
+
function rejectAll(error) {
|
|
33
|
+
for (const entry of pending.values()) {
|
|
34
|
+
entry.dispose();
|
|
35
|
+
entry.reject(error);
|
|
36
|
+
}
|
|
37
|
+
pending.clear();
|
|
38
|
+
}
|
|
39
|
+
worker.addEventListener('message', (event) => {
|
|
40
|
+
const message = event.data;
|
|
41
|
+
if (!isResponseMessage(message))
|
|
42
|
+
return;
|
|
43
|
+
const entry = settle(message.id);
|
|
44
|
+
if (entry === undefined)
|
|
45
|
+
return;
|
|
46
|
+
if (message.ok)
|
|
47
|
+
entry.resolve(message.response);
|
|
48
|
+
else
|
|
49
|
+
entry.reject(new Error(message.message));
|
|
50
|
+
});
|
|
51
|
+
worker.addEventListener('error', (event) => {
|
|
52
|
+
const detail = event.message ?? '';
|
|
53
|
+
rejectAll(new Error(detail === '' ? `${name} failed` : `${name} failed: ${detail}`));
|
|
54
|
+
});
|
|
55
|
+
return {
|
|
56
|
+
get pendingCount() {
|
|
57
|
+
return pending.size;
|
|
58
|
+
},
|
|
59
|
+
request: (payload, requestOptions = {}) => {
|
|
60
|
+
const { signal, timeoutMs } = requestOptions;
|
|
61
|
+
if (terminated) {
|
|
62
|
+
return Promise.reject(new CancelledRequestError(`${name} was terminated`));
|
|
63
|
+
}
|
|
64
|
+
if (signal?.aborted === true) {
|
|
65
|
+
return Promise.reject(new CancelledRequestError(`${name} request was cancelled`));
|
|
66
|
+
}
|
|
67
|
+
nextId += 1;
|
|
68
|
+
const id = nextId;
|
|
69
|
+
const budget = positiveMilliseconds(timeoutMs, defaultTimeoutMs);
|
|
70
|
+
return new Promise((resolve, reject) => {
|
|
71
|
+
const timeout = setTimeout(() => {
|
|
72
|
+
settle(id)?.reject(new RequestTimeoutError(`${name} request ${id} timed out after ${budget} ms`));
|
|
73
|
+
}, budget);
|
|
74
|
+
const onAbort = () => {
|
|
75
|
+
settle(id)?.reject(new CancelledRequestError(`${name} request ${id} was cancelled`));
|
|
76
|
+
};
|
|
77
|
+
signal?.addEventListener('abort', onAbort);
|
|
78
|
+
pending.set(id, {
|
|
79
|
+
resolve,
|
|
80
|
+
reject,
|
|
81
|
+
dispose: () => {
|
|
82
|
+
clearTimeout(timeout);
|
|
83
|
+
signal?.removeEventListener('abort', onAbort);
|
|
84
|
+
},
|
|
85
|
+
});
|
|
86
|
+
const message = {
|
|
87
|
+
id,
|
|
88
|
+
request: payload,
|
|
89
|
+
};
|
|
90
|
+
try {
|
|
91
|
+
worker.postMessage(message);
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
settle(id);
|
|
95
|
+
reject(error instanceof Error ? error : new Error(String(error)));
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
},
|
|
99
|
+
terminate: () => {
|
|
100
|
+
terminated = true;
|
|
101
|
+
rejectAll(new CancelledRequestError(`${name} was terminated`));
|
|
102
|
+
worker.terminate();
|
|
103
|
+
},
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
const DEFAULT_TIMEOUT_MS = 120_000;
|
|
107
|
+
function isResponseMessage(message) {
|
|
108
|
+
if (typeof message !== 'object' || message === null)
|
|
109
|
+
return false;
|
|
110
|
+
const candidate = message;
|
|
111
|
+
if (typeof candidate.id !== 'number' || typeof candidate.ok !== 'boolean') {
|
|
112
|
+
return false;
|
|
113
|
+
}
|
|
114
|
+
return candidate.ok || typeof candidate.message === 'string';
|
|
115
|
+
}
|
|
116
|
+
function positiveMilliseconds(value, fallback) {
|
|
117
|
+
return typeof value === 'number' && Number.isFinite(value) && value > 0
|
|
118
|
+
? value
|
|
119
|
+
: fallback;
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=workerChannel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workerChannel.js","sourceRoot":"","sources":["../../../src/worker/core/workerChannel.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-cheminfo",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "Assembled React components shared by the cheminfo sites: a Cite button and an ecosystem menu",
|
|
6
6
|
"author": "Luc Patiny",
|
|
@@ -14,11 +14,14 @@
|
|
|
14
14
|
"exports": {
|
|
15
15
|
"./core": "./lib/core.js",
|
|
16
16
|
"./orbital": "./lib/orbital.js",
|
|
17
|
-
"./
|
|
17
|
+
"./structure": "./lib/structure.js",
|
|
18
|
+
"./ui": "./lib/ui.js",
|
|
19
|
+
"./styles/*.css": "./styles/*.css"
|
|
18
20
|
},
|
|
19
21
|
"files": [
|
|
20
22
|
"lib",
|
|
21
|
-
"src"
|
|
23
|
+
"src",
|
|
24
|
+
"styles"
|
|
22
25
|
],
|
|
23
26
|
"scripts": {
|
|
24
27
|
"build-storybook": "storybook build",
|
|
@@ -54,9 +57,11 @@
|
|
|
54
57
|
"eslint-config-cheminfo-react": "^20.1.0",
|
|
55
58
|
"eslint-config-cheminfo-typescript": "^22.1.0",
|
|
56
59
|
"molstar": "^5.11.0",
|
|
60
|
+
"openchemlib": "^9.25.0",
|
|
57
61
|
"prettier": "^3.9.6",
|
|
58
62
|
"react": "^19.2.8",
|
|
59
63
|
"react-dom": "^19.2.8",
|
|
64
|
+
"react-ocl": "^8.7.2",
|
|
60
65
|
"react-science": "^23.0.0",
|
|
61
66
|
"rimraf": "^6.1.3",
|
|
62
67
|
"storybook": "^10.5.8",
|
|
@@ -66,10 +71,12 @@
|
|
|
66
71
|
},
|
|
67
72
|
"peerDependencies": {
|
|
68
73
|
"@blueprintjs/core": "^6.18.0",
|
|
74
|
+
"molstar": "^5.11.0",
|
|
75
|
+
"openchemlib": "^9.24.0",
|
|
69
76
|
"react": "^18.3.1 || >=19",
|
|
70
77
|
"react-dom": "^18.3.1 || >=19",
|
|
71
|
-
"react-
|
|
72
|
-
"
|
|
78
|
+
"react-ocl": "^8.7.1",
|
|
79
|
+
"react-science": "^20.6.2 || ^21.0.0 || ^22.0.0 || ^23.0.0"
|
|
73
80
|
},
|
|
74
81
|
"repository": {
|
|
75
82
|
"type": "git",
|
|
@@ -82,6 +89,12 @@
|
|
|
82
89
|
"peerDependenciesMeta": {
|
|
83
90
|
"molstar": {
|
|
84
91
|
"optional": true
|
|
92
|
+
},
|
|
93
|
+
"openchemlib": {
|
|
94
|
+
"optional": true
|
|
95
|
+
},
|
|
96
|
+
"react-ocl": {
|
|
97
|
+
"optional": true
|
|
85
98
|
}
|
|
86
99
|
}
|
|
87
100
|
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import type { Intent } from '@blueprintjs/core';
|
|
2
|
+
import { Tag } from '@blueprintjs/core';
|
|
3
|
+
import type { CSSProperties, ReactElement } from 'react';
|
|
4
|
+
|
|
5
|
+
/** One capsule of a {@link CapsuleFilter} row. */
|
|
6
|
+
export interface CapsuleOption<TValue extends string = string> {
|
|
7
|
+
/** What picking this capsule selects. */
|
|
8
|
+
value: TValue;
|
|
9
|
+
/** What the capsule reads. */
|
|
10
|
+
label: string;
|
|
11
|
+
/**
|
|
12
|
+
* How many rows the capsule keeps, written after the label.
|
|
13
|
+
* @default undefined — the capsule carries no count
|
|
14
|
+
*/
|
|
15
|
+
count?: number;
|
|
16
|
+
/**
|
|
17
|
+
* Colour of the capsule, which says what the outcome means rather than
|
|
18
|
+
* whether it is selected.
|
|
19
|
+
* @default 'none'
|
|
20
|
+
*/
|
|
21
|
+
intent?: Intent;
|
|
22
|
+
/**
|
|
23
|
+
* What the pointer is told when it rests on the capsule.
|
|
24
|
+
* @default undefined
|
|
25
|
+
*/
|
|
26
|
+
title?: string;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/** What a row of filter capsules needs. */
|
|
30
|
+
export interface CapsuleFilterProps<TValue extends string = string> {
|
|
31
|
+
/** One entry per capsule, in the order they are drawn. */
|
|
32
|
+
options: ReadonlyArray<CapsuleOption<TValue>>;
|
|
33
|
+
/** The selected capsule. */
|
|
34
|
+
value: TValue;
|
|
35
|
+
/** Called with the newly picked value. */
|
|
36
|
+
onChange: (value: TValue) => void;
|
|
37
|
+
/**
|
|
38
|
+
* What the group is called, for a screen reader reaching the row.
|
|
39
|
+
* @default 'Filter'
|
|
40
|
+
*/
|
|
41
|
+
label?: string;
|
|
42
|
+
/**
|
|
43
|
+
* How a count is written.
|
|
44
|
+
* @default the number in the reader's locale, e.g. `1,204`
|
|
45
|
+
*/
|
|
46
|
+
formatCount?: (count: number) => string;
|
|
47
|
+
/**
|
|
48
|
+
* Class the row carries, in addition to `capsule-filter`.
|
|
49
|
+
* @default undefined
|
|
50
|
+
*/
|
|
51
|
+
className?: string;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* The row of capsules that narrows a table to one outcome.
|
|
56
|
+
*
|
|
57
|
+
* Every capsule keeps its semantic colour whether or not it is selected, so
|
|
58
|
+
* what a status means stays learnable — the filled shape is what encodes the
|
|
59
|
+
* selection. Each is a real interactive tag, so the row is reachable by tab and
|
|
60
|
+
* a capsule answers to Enter and Space.
|
|
61
|
+
* @param props - See {@link CapsuleFilterProps}.
|
|
62
|
+
* @returns The capsule row.
|
|
63
|
+
*/
|
|
64
|
+
export function CapsuleFilter<TValue extends string = string>(
|
|
65
|
+
props: CapsuleFilterProps<TValue>,
|
|
66
|
+
): ReactElement {
|
|
67
|
+
const {
|
|
68
|
+
options,
|
|
69
|
+
value,
|
|
70
|
+
onChange,
|
|
71
|
+
label = 'Filter',
|
|
72
|
+
formatCount = defaultFormatCount,
|
|
73
|
+
className,
|
|
74
|
+
} = props;
|
|
75
|
+
|
|
76
|
+
return (
|
|
77
|
+
<div
|
|
78
|
+
role="group"
|
|
79
|
+
aria-label={label}
|
|
80
|
+
className={
|
|
81
|
+
className === undefined
|
|
82
|
+
? 'capsule-filter'
|
|
83
|
+
: `capsule-filter ${className}`
|
|
84
|
+
}
|
|
85
|
+
style={ROW_STYLE}
|
|
86
|
+
>
|
|
87
|
+
{options.map((option) => {
|
|
88
|
+
const selected = option.value === value;
|
|
89
|
+
return (
|
|
90
|
+
<Tag
|
|
91
|
+
key={option.value}
|
|
92
|
+
interactive
|
|
93
|
+
round
|
|
94
|
+
minimal={!selected}
|
|
95
|
+
intent={option.intent}
|
|
96
|
+
aria-pressed={selected}
|
|
97
|
+
htmlTitle={option.title}
|
|
98
|
+
onClick={() => onChange(option.value)}
|
|
99
|
+
>
|
|
100
|
+
{option.count === undefined
|
|
101
|
+
? option.label
|
|
102
|
+
: `${option.label} (${formatCount(option.count)})`}
|
|
103
|
+
</Tag>
|
|
104
|
+
);
|
|
105
|
+
})}
|
|
106
|
+
</div>
|
|
107
|
+
);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
function defaultFormatCount(count: number): string {
|
|
111
|
+
return count.toLocaleString();
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
const ROW_STYLE = {
|
|
115
|
+
display: 'flex',
|
|
116
|
+
flexWrap: 'wrap',
|
|
117
|
+
alignItems: 'center',
|
|
118
|
+
gap: 6,
|
|
119
|
+
} as const satisfies CSSProperties;
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { Icon } from '@blueprintjs/core';
|
|
2
|
+
import type { ReactElement, ReactNode } from 'react';
|
|
3
|
+
|
|
4
|
+
import type { NavItem } from './navItem.ts';
|
|
5
|
+
import { isModifiedClick } from './navItem.ts';
|
|
6
|
+
|
|
7
|
+
export interface NavLinkProps {
|
|
8
|
+
/** The entry being drawn. */
|
|
9
|
+
item: NavItem;
|
|
10
|
+
/**
|
|
11
|
+
* Whether this is the page on show, which is the one thing in the bar the
|
|
12
|
+
* brand tint is spent on.
|
|
13
|
+
* @default false
|
|
14
|
+
*/
|
|
15
|
+
active?: boolean;
|
|
16
|
+
/**
|
|
17
|
+
* Extra class names, for a site reaching one entry of its own bar.
|
|
18
|
+
* `nav-link` is always carried as well.
|
|
19
|
+
* @default undefined
|
|
20
|
+
*/
|
|
21
|
+
className?: string;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* One entry of a site header, as a link when it has an address and as a button
|
|
26
|
+
* otherwise. Both carry `nav-link`, so the row reads as one menu rather than as
|
|
27
|
+
* a button dropped among addresses.
|
|
28
|
+
* @param props - The entry, whether it is the page on show, and extra classes.
|
|
29
|
+
* @returns The entry.
|
|
30
|
+
*/
|
|
31
|
+
export function NavLink(props: NavLinkProps): ReactElement {
|
|
32
|
+
const { item, active = false, className } = props;
|
|
33
|
+
const { href, external = false, onSelect, title } = item;
|
|
34
|
+
|
|
35
|
+
const classes = [
|
|
36
|
+
'nav-link',
|
|
37
|
+
active ? 'nav-link--active' : null,
|
|
38
|
+
className ?? null,
|
|
39
|
+
]
|
|
40
|
+
.filter((part) => part !== null)
|
|
41
|
+
.join(' ');
|
|
42
|
+
|
|
43
|
+
if (href === undefined) {
|
|
44
|
+
return (
|
|
45
|
+
<button
|
|
46
|
+
type="button"
|
|
47
|
+
className={classes}
|
|
48
|
+
title={title}
|
|
49
|
+
aria-label={title}
|
|
50
|
+
onClick={onSelect}
|
|
51
|
+
>
|
|
52
|
+
<NavLinkBody item={item} />
|
|
53
|
+
</button>
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
return (
|
|
58
|
+
<a
|
|
59
|
+
className={classes}
|
|
60
|
+
href={href}
|
|
61
|
+
title={title}
|
|
62
|
+
aria-label={title}
|
|
63
|
+
target={external ? '_blank' : undefined}
|
|
64
|
+
rel={external ? 'noreferrer' : undefined}
|
|
65
|
+
onClick={(event) => {
|
|
66
|
+
if (onSelect === undefined || external || isModifiedClick(event)) {
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
event.preventDefault();
|
|
70
|
+
onSelect();
|
|
71
|
+
}}
|
|
72
|
+
>
|
|
73
|
+
<NavLinkBody item={item} />
|
|
74
|
+
</a>
|
|
75
|
+
);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function NavLinkBody(props: { item: NavItem }): ReactNode {
|
|
79
|
+
const { icon, label, after } = props.item;
|
|
80
|
+
|
|
81
|
+
return (
|
|
82
|
+
<>
|
|
83
|
+
{icon === undefined ? null : <Icon icon={icon} size={14} />}
|
|
84
|
+
{label}
|
|
85
|
+
{after}
|
|
86
|
+
</>
|
|
87
|
+
);
|
|
88
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import type { IconName, PopoverNextProps } from '@blueprintjs/core';
|
|
2
|
+
import { Icon, Menu, MenuItem, PopoverNext } from '@blueprintjs/core';
|
|
3
|
+
import type { ReactElement, ReactNode } from 'react';
|
|
4
|
+
|
|
5
|
+
import type { NavItem } from './navItem.ts';
|
|
6
|
+
import { isModifiedClick } from './navItem.ts';
|
|
7
|
+
|
|
8
|
+
export interface NavMenuButtonProps {
|
|
9
|
+
/** Text of the trigger, which is also what a screen reader is told. */
|
|
10
|
+
label: string;
|
|
11
|
+
/** The pages the menu holds, in the order it lists them. */
|
|
12
|
+
items: readonly NavItem[];
|
|
13
|
+
/**
|
|
14
|
+
* Which page is on show, named by its `id`. The trigger takes the brand tint
|
|
15
|
+
* when the menu is the one holding it.
|
|
16
|
+
* @default undefined
|
|
17
|
+
*/
|
|
18
|
+
activeId?: string;
|
|
19
|
+
/**
|
|
20
|
+
* Glyph before the label.
|
|
21
|
+
* @default undefined
|
|
22
|
+
*/
|
|
23
|
+
icon?: IconName;
|
|
24
|
+
/**
|
|
25
|
+
* Side the menu opens on.
|
|
26
|
+
* @default 'bottom-start'
|
|
27
|
+
*/
|
|
28
|
+
placement?: PopoverNextProps['placement'];
|
|
29
|
+
/**
|
|
30
|
+
* What the menu adds under the pages — a divider and an action, typically.
|
|
31
|
+
* @default undefined
|
|
32
|
+
*/
|
|
33
|
+
children?: ReactNode;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* The pages that do not need a place of their own in the bar, folded into one
|
|
38
|
+
* menu. The trigger is dressed as a `nav-link`, so it reads as one of the
|
|
39
|
+
* entries beside it rather than as a button dropped among them.
|
|
40
|
+
* @param props - The label, the pages, the page on show, and how the menu
|
|
41
|
+
* opens.
|
|
42
|
+
* @returns The trigger and its menu.
|
|
43
|
+
*/
|
|
44
|
+
export function NavMenuButton(props: NavMenuButtonProps): ReactElement {
|
|
45
|
+
const {
|
|
46
|
+
label,
|
|
47
|
+
items,
|
|
48
|
+
activeId,
|
|
49
|
+
icon,
|
|
50
|
+
placement = 'bottom-start',
|
|
51
|
+
children,
|
|
52
|
+
} = props;
|
|
53
|
+
|
|
54
|
+
const holdsActive = items.some((item) => item.id === activeId);
|
|
55
|
+
|
|
56
|
+
return (
|
|
57
|
+
<PopoverNext
|
|
58
|
+
placement={placement}
|
|
59
|
+
content={
|
|
60
|
+
<Menu className="nav-menu">
|
|
61
|
+
{items.map((item) => (
|
|
62
|
+
<MenuItem
|
|
63
|
+
key={item.id}
|
|
64
|
+
icon={item.icon}
|
|
65
|
+
text={item.label}
|
|
66
|
+
// A real address, so a crawler reaching the menu can follow it
|
|
67
|
+
// and a middle click opens a tab of its own.
|
|
68
|
+
href={item.href}
|
|
69
|
+
target={item.external ? '_blank' : undefined}
|
|
70
|
+
active={item.id === activeId}
|
|
71
|
+
onClick={(event) => {
|
|
72
|
+
if (item.onSelect === undefined || isModifiedClick(event)) {
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
event.preventDefault();
|
|
76
|
+
item.onSelect();
|
|
77
|
+
}}
|
|
78
|
+
/>
|
|
79
|
+
))}
|
|
80
|
+
{children}
|
|
81
|
+
</Menu>
|
|
82
|
+
}
|
|
83
|
+
>
|
|
84
|
+
<button
|
|
85
|
+
type="button"
|
|
86
|
+
className={holdsActive ? 'nav-link nav-link--active' : 'nav-link'}
|
|
87
|
+
aria-label={label}
|
|
88
|
+
>
|
|
89
|
+
{icon === undefined ? null : <Icon icon={icon} size={14} />}
|
|
90
|
+
{label}
|
|
91
|
+
<Icon icon="caret-down" size={14} />
|
|
92
|
+
</button>
|
|
93
|
+
</PopoverNext>
|
|
94
|
+
);
|
|
95
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import type { ReactElement, ReactNode } from 'react';
|
|
2
|
+
|
|
3
|
+
import type { SiteId } from '../../ecosystem/core/sites.ts';
|
|
4
|
+
import { EcosystemLinks } from '../../ecosystem/ui/EcosystemLinks.tsx';
|
|
5
|
+
|
|
6
|
+
export interface SiteFooterProps {
|
|
7
|
+
/** The site the footer sits on, which is written but never linked. */
|
|
8
|
+
siteId: SiteId;
|
|
9
|
+
/**
|
|
10
|
+
* How much of each sibling site is written. `grid` gives every one its mark,
|
|
11
|
+
* its name and the line saying what it does; `row` writes the names only.
|
|
12
|
+
* @default 'grid'
|
|
13
|
+
*/
|
|
14
|
+
layout?: 'grid' | 'row';
|
|
15
|
+
/**
|
|
16
|
+
* What introduces the family.
|
|
17
|
+
* @default undefined
|
|
18
|
+
*/
|
|
19
|
+
heading?: string;
|
|
20
|
+
/**
|
|
21
|
+
* Whether the page is framed in another site, in which case no footer is
|
|
22
|
+
* drawn at all.
|
|
23
|
+
* @default false
|
|
24
|
+
*/
|
|
25
|
+
embedded?: boolean;
|
|
26
|
+
/**
|
|
27
|
+
* What the site adds under the family — a licence line, a version, a link to
|
|
28
|
+
* the sources.
|
|
29
|
+
* @default undefined
|
|
30
|
+
*/
|
|
31
|
+
children?: ReactNode;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* The strip under every page of the family: each sibling site as a plain link,
|
|
36
|
+
* so a crawler — and a reader with no patience for menus — walks from one of
|
|
37
|
+
* our tools to the next. It carries `no-print`, because it is chrome.
|
|
38
|
+
* @param props - The site it sits on, how much of each sibling is written, and
|
|
39
|
+
* whatever the site adds below.
|
|
40
|
+
* @returns The footer, or nothing at all on an embedded page.
|
|
41
|
+
*/
|
|
42
|
+
export function SiteFooter(props: SiteFooterProps): ReactElement | null {
|
|
43
|
+
const {
|
|
44
|
+
siteId,
|
|
45
|
+
layout = 'grid',
|
|
46
|
+
heading,
|
|
47
|
+
embedded = false,
|
|
48
|
+
children,
|
|
49
|
+
} = props;
|
|
50
|
+
|
|
51
|
+
if (embedded) return null;
|
|
52
|
+
|
|
53
|
+
return (
|
|
54
|
+
<footer className="app-footer no-print">
|
|
55
|
+
<div className="app-footer__inner">
|
|
56
|
+
<EcosystemLinks
|
|
57
|
+
currentSiteId={siteId}
|
|
58
|
+
layout={layout}
|
|
59
|
+
heading={heading}
|
|
60
|
+
/>
|
|
61
|
+
{children}
|
|
62
|
+
</div>
|
|
63
|
+
</footer>
|
|
64
|
+
);
|
|
65
|
+
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import type { ReactElement, ReactNode } from 'react';
|
|
2
|
+
import { Fragment } from 'react';
|
|
3
|
+
|
|
4
|
+
import { siteById } from '../../ecosystem/core/lookup.ts';
|
|
5
|
+
import type { SiteId } from '../../ecosystem/core/sites.ts';
|
|
6
|
+
import { Wordmark } from '../../ecosystem/ui/Wordmark.tsx';
|
|
7
|
+
import { SiteMark } from '../../ecosystem/ui/marks.tsx';
|
|
8
|
+
|
|
9
|
+
import { NavLink } from './NavLink.tsx';
|
|
10
|
+
import type { NavItem } from './navItem.ts';
|
|
11
|
+
import { isModifiedClick } from './navItem.ts';
|
|
12
|
+
|
|
13
|
+
export interface SiteHeaderProps {
|
|
14
|
+
/** The site the bar belongs to, which draws its mark and writes its name. */
|
|
15
|
+
siteId: SiteId;
|
|
16
|
+
/** The pages, in the order the bar lists them. */
|
|
17
|
+
nav: readonly NavItem[];
|
|
18
|
+
/**
|
|
19
|
+
* Which of the pages is on show, named by its `id`.
|
|
20
|
+
* @default undefined
|
|
21
|
+
*/
|
|
22
|
+
activeId?: string;
|
|
23
|
+
/**
|
|
24
|
+
* The utilities pushed to the right edge — Cite, Tools, Share, sign in. They
|
|
25
|
+
* arrive dressed as bar items, so a plain `nav-link` and a `CiteButton` read
|
|
26
|
+
* alike beside each other.
|
|
27
|
+
* @default undefined
|
|
28
|
+
*/
|
|
29
|
+
actions?: ReactNode;
|
|
30
|
+
/**
|
|
31
|
+
* Draws one page the site's own way, for a bar whose entries need a tooltip
|
|
32
|
+
* or a wrapper of their own.
|
|
33
|
+
* @default undefined
|
|
34
|
+
*/
|
|
35
|
+
renderNavItem?: (item: NavItem, isActive: boolean) => ReactNode;
|
|
36
|
+
/**
|
|
37
|
+
* Whether the page is framed in another site, in which case no bar is drawn
|
|
38
|
+
* at all — what a host page frames already carries its own navigation.
|
|
39
|
+
* @default false
|
|
40
|
+
*/
|
|
41
|
+
embedded?: boolean;
|
|
42
|
+
/**
|
|
43
|
+
* Where the brand leads.
|
|
44
|
+
* @default '/'
|
|
45
|
+
*/
|
|
46
|
+
homeHref?: string;
|
|
47
|
+
/**
|
|
48
|
+
* What the site does when the brand is picked, for a page that routes in
|
|
49
|
+
* place. A modified click is left to the browser.
|
|
50
|
+
* @default undefined
|
|
51
|
+
*/
|
|
52
|
+
onHome?: () => void;
|
|
53
|
+
/**
|
|
54
|
+
* Edge of the site's mark, in pixels.
|
|
55
|
+
* @default 28
|
|
56
|
+
*/
|
|
57
|
+
markSize?: number;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* The bar every site of the family carries: the brand linking home at the left,
|
|
62
|
+
* the pages next to it, and the utilities pushed to the right edge by the
|
|
63
|
+
* spacer.
|
|
64
|
+
* @param props - The site, its pages, its utilities, and whether the page is
|
|
65
|
+
* framed in another site.
|
|
66
|
+
* @returns The bar, or nothing at all on an embedded page.
|
|
67
|
+
*/
|
|
68
|
+
export function SiteHeader(props: SiteHeaderProps): ReactElement | null {
|
|
69
|
+
const {
|
|
70
|
+
siteId,
|
|
71
|
+
nav,
|
|
72
|
+
activeId,
|
|
73
|
+
actions,
|
|
74
|
+
renderNavItem,
|
|
75
|
+
embedded = false,
|
|
76
|
+
homeHref = '/',
|
|
77
|
+
onHome,
|
|
78
|
+
markSize = 28,
|
|
79
|
+
} = props;
|
|
80
|
+
|
|
81
|
+
if (embedded) return null;
|
|
82
|
+
|
|
83
|
+
const site = siteById(siteId);
|
|
84
|
+
|
|
85
|
+
return (
|
|
86
|
+
<header className="app-header no-print">
|
|
87
|
+
<div className="app-header__inner">
|
|
88
|
+
<a
|
|
89
|
+
className="brand"
|
|
90
|
+
href={homeHref}
|
|
91
|
+
title={site.host}
|
|
92
|
+
onClick={(event) => {
|
|
93
|
+
if (onHome === undefined || isModifiedClick(event)) return;
|
|
94
|
+
event.preventDefault();
|
|
95
|
+
onHome();
|
|
96
|
+
}}
|
|
97
|
+
>
|
|
98
|
+
<SiteMark siteId={siteId} size={markSize} />
|
|
99
|
+
<Wordmark siteId={siteId} />
|
|
100
|
+
</a>
|
|
101
|
+
<nav className="app-header-nav">
|
|
102
|
+
{nav.map((item) => (
|
|
103
|
+
<Fragment key={item.id}>
|
|
104
|
+
{renderNavItem === undefined ? (
|
|
105
|
+
<NavLink item={item} active={item.id === activeId} />
|
|
106
|
+
) : (
|
|
107
|
+
renderNavItem(item, item.id === activeId)
|
|
108
|
+
)}
|
|
109
|
+
</Fragment>
|
|
110
|
+
))}
|
|
111
|
+
</nav>
|
|
112
|
+
<span className="spacer" />
|
|
113
|
+
{actions === undefined ? null : (
|
|
114
|
+
<div className="app-header-actions">{actions}</div>
|
|
115
|
+
)}
|
|
116
|
+
</div>
|
|
117
|
+
</header>
|
|
118
|
+
);
|
|
119
|
+
}
|