react-cheminfo 0.3.0 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +111 -23
- package/lib/capsule/ui/CapsuleFilter.d.ts +61 -0
- package/lib/capsule/ui/CapsuleFilter.d.ts.map +1 -0
- package/lib/capsule/ui/CapsuleFilter.js +33 -0
- package/lib/capsule/ui/CapsuleFilter.js.map +1 -0
- package/lib/capsule/ui/index.d.ts +3 -0
- package/lib/capsule/ui/index.d.ts.map +1 -0
- package/lib/capsule/ui/index.js +2 -0
- package/lib/capsule/ui/index.js.map +1 -0
- package/lib/chrome/ui/NavLink.d.ts +27 -0
- package/lib/chrome/ui/NavLink.d.ts.map +1 -0
- package/lib/chrome/ui/NavLink.js +36 -0
- package/lib/chrome/ui/NavLink.js.map +1 -0
- package/lib/chrome/ui/NavMenuButton.d.ts +40 -0
- package/lib/chrome/ui/NavMenuButton.d.ts.map +1 -0
- package/lib/chrome/ui/NavMenuButton.js +26 -0
- package/lib/chrome/ui/NavMenuButton.js.map +1 -0
- package/lib/chrome/ui/SiteFooter.d.ts +39 -0
- package/lib/chrome/ui/SiteFooter.d.ts.map +1 -0
- package/lib/chrome/ui/SiteFooter.js +17 -0
- package/lib/chrome/ui/SiteFooter.js.map +1 -0
- package/lib/chrome/ui/SiteHeader.d.ts +59 -0
- package/lib/chrome/ui/SiteHeader.d.ts.map +1 -0
- package/lib/chrome/ui/SiteHeader.js +28 -0
- package/lib/chrome/ui/SiteHeader.js.map +1 -0
- package/lib/chrome/ui/index.d.ts +12 -0
- package/lib/chrome/ui/index.d.ts.map +1 -0
- package/lib/chrome/ui/index.js +6 -0
- package/lib/chrome/ui/index.js.map +1 -0
- package/lib/chrome/ui/navItem.d.ts +57 -0
- package/lib/chrome/ui/navItem.d.ts.map +1 -0
- package/lib/chrome/ui/navItem.js +10 -0
- package/lib/chrome/ui/navItem.js.map +1 -0
- package/lib/chrome/ui/useCompactHeader.d.ts +31 -0
- package/lib/chrome/ui/useCompactHeader.d.ts.map +1 -0
- package/lib/chrome/ui/useCompactHeader.js +50 -0
- package/lib/chrome/ui/useCompactHeader.js.map +1 -0
- package/lib/citation/core/clipboard.d.ts +12 -3
- package/lib/citation/core/clipboard.d.ts.map +1 -1
- package/lib/citation/core/clipboard.js +21 -10
- package/lib/citation/core/clipboard.js.map +1 -1
- package/lib/citation/core/download.d.ts +11 -3
- package/lib/citation/core/download.d.ts.map +1 -1
- package/lib/citation/core/download.js +17 -13
- package/lib/citation/core/download.js.map +1 -1
- package/lib/citation/core/index.d.ts +4 -3
- package/lib/citation/core/index.d.ts.map +1 -1
- package/lib/citation/core/index.js +3 -3
- package/lib/citation/core/index.js.map +1 -1
- package/lib/citation/core/works.d.ts +44 -0
- package/lib/citation/core/works.d.ts.map +1 -0
- package/lib/citation/core/works.js +51 -0
- package/lib/citation/core/works.js.map +1 -0
- package/lib/citation/ui/CitationMenu.d.ts +20 -3
- package/lib/citation/ui/CitationMenu.d.ts.map +1 -1
- package/lib/citation/ui/CitationMenu.js +60 -49
- package/lib/citation/ui/CitationMenu.js.map +1 -1
- package/lib/citation/ui/CitationPreview.d.ts +5 -2
- package/lib/citation/ui/CitationPreview.d.ts.map +1 -1
- package/lib/citation/ui/CitationPreview.js +9 -4
- package/lib/citation/ui/CitationPreview.js.map +1 -1
- package/lib/citation/ui/CiteButton.d.ts +13 -6
- package/lib/citation/ui/CiteButton.d.ts.map +1 -1
- package/lib/citation/ui/CiteButton.js +5 -4
- package/lib/citation/ui/CiteButton.js.map +1 -1
- package/lib/citation/ui/CopyFormatEntries.d.ts +31 -0
- package/lib/citation/ui/CopyFormatEntries.d.ts.map +1 -0
- package/lib/citation/ui/CopyFormatEntries.js +29 -0
- package/lib/citation/ui/CopyFormatEntries.js.map +1 -0
- package/lib/citation/ui/WorkEntry.d.ts +18 -0
- package/lib/citation/ui/WorkEntry.d.ts.map +1 -0
- package/lib/citation/ui/WorkEntry.js +32 -0
- package/lib/citation/ui/WorkEntry.js.map +1 -0
- package/lib/citation/ui/entries.d.ts +7 -7
- package/lib/citation/ui/entries.d.ts.map +1 -1
- package/lib/citation/ui/entries.js +11 -13
- package/lib/citation/ui/entries.js.map +1 -1
- package/lib/citation/ui/index.d.ts +2 -2
- package/lib/citation/ui/index.d.ts.map +1 -1
- package/lib/citation/ui/index.js.map +1 -1
- package/lib/citation/ui/useCopyFeedback.d.ts +20 -0
- package/lib/citation/ui/useCopyFeedback.d.ts.map +1 -0
- package/lib/citation/ui/useCopyFeedback.js +49 -0
- package/lib/citation/ui/useCopyFeedback.js.map +1 -0
- package/lib/clipboard/core/index.d.ts +2 -0
- package/lib/clipboard/core/index.d.ts.map +1 -0
- package/lib/clipboard/core/index.js +2 -0
- package/lib/clipboard/core/index.js.map +1 -0
- package/lib/clipboard/core/writeToClipboard.d.ts +12 -0
- package/lib/clipboard/core/writeToClipboard.d.ts.map +1 -0
- package/lib/clipboard/core/writeToClipboard.js +49 -0
- package/lib/clipboard/core/writeToClipboard.js.map +1 -0
- package/lib/clipboard/ui/CodeBlock.d.ts +43 -0
- package/lib/clipboard/ui/CodeBlock.d.ts.map +1 -0
- package/lib/clipboard/ui/CodeBlock.js +49 -0
- package/lib/clipboard/ui/CodeBlock.js.map +1 -0
- package/lib/clipboard/ui/CopyButton.d.ts +64 -0
- package/lib/clipboard/ui/CopyButton.d.ts.map +1 -0
- package/lib/clipboard/ui/CopyButton.js +21 -0
- package/lib/clipboard/ui/CopyButton.js.map +1 -0
- package/lib/clipboard/ui/index.d.ts +7 -0
- package/lib/clipboard/ui/index.d.ts.map +1 -0
- package/lib/clipboard/ui/index.js +4 -0
- package/lib/clipboard/ui/index.js.map +1 -0
- package/lib/clipboard/ui/useCopyToClipboard.d.ts +24 -0
- package/lib/clipboard/ui/useCopyToClipboard.d.ts.map +1 -0
- package/lib/clipboard/ui/useCopyToClipboard.js +36 -0
- package/lib/clipboard/ui/useCopyToClipboard.js.map +1 -0
- package/lib/color/core/contrast.d.ts +43 -0
- package/lib/color/core/contrast.d.ts.map +1 -0
- package/lib/color/core/contrast.js +61 -0
- package/lib/color/core/contrast.js.map +1 -0
- package/lib/color/core/hex.d.ts +26 -0
- package/lib/color/core/hex.d.ts.map +1 -0
- package/lib/color/core/hex.js +44 -0
- package/lib/color/core/hex.js.map +1 -0
- package/lib/color/core/index.d.ts +5 -0
- package/lib/color/core/index.d.ts.map +1 -0
- package/lib/color/core/index.js +3 -0
- package/lib/color/core/index.js.map +1 -0
- package/lib/color/core/scale.d.ts +52 -0
- package/lib/color/core/scale.d.ts.map +1 -0
- package/lib/color/core/scale.js +96 -0
- package/lib/color/core/scale.js.map +1 -0
- package/lib/color/ui/ColorScaleLegend.d.ts +38 -0
- package/lib/color/ui/ColorScaleLegend.d.ts.map +1 -0
- package/lib/color/ui/ColorScaleLegend.js +68 -0
- package/lib/color/ui/ColorScaleLegend.js.map +1 -0
- package/lib/color/ui/index.d.ts +3 -0
- package/lib/color/ui/index.d.ts.map +1 -0
- package/lib/color/ui/index.js +2 -0
- package/lib/color/ui/index.js.map +1 -0
- package/lib/core.d.ts +11 -0
- package/lib/core.d.ts.map +1 -1
- package/lib/core.js +11 -0
- package/lib/core.js.map +1 -1
- package/lib/credits/core/credits.d.ts +144 -0
- package/lib/credits/core/credits.d.ts.map +1 -0
- package/lib/credits/core/credits.js +156 -0
- package/lib/credits/core/credits.js.map +1 -0
- package/lib/credits/core/index.d.ts +3 -0
- package/lib/credits/core/index.d.ts.map +1 -0
- package/lib/credits/core/index.js +2 -0
- package/lib/credits/core/index.js.map +1 -0
- package/lib/credits/ui/CreditsList.d.ts +29 -0
- package/lib/credits/ui/CreditsList.d.ts.map +1 -0
- package/lib/credits/ui/CreditsList.js +33 -0
- package/lib/credits/ui/CreditsList.js.map +1 -0
- package/lib/credits/ui/index.d.ts +3 -0
- package/lib/credits/ui/index.d.ts.map +1 -0
- package/lib/credits/ui/index.js +2 -0
- package/lib/credits/ui/index.js.map +1 -0
- package/lib/delimited/core/delimiters.d.ts +31 -0
- package/lib/delimited/core/delimiters.d.ts.map +1 -0
- package/lib/delimited/core/delimiters.js +46 -0
- package/lib/delimited/core/delimiters.js.map +1 -0
- package/lib/delimited/core/index.d.ts +9 -0
- package/lib/delimited/core/index.d.ts.map +1 -0
- package/lib/delimited/core/index.js +5 -0
- package/lib/delimited/core/index.js.map +1 -0
- package/lib/delimited/core/readDelimited.d.ts +32 -0
- package/lib/delimited/core/readDelimited.d.ts.map +1 -0
- package/lib/delimited/core/readDelimited.js +122 -0
- package/lib/delimited/core/readDelimited.js.map +1 -0
- package/lib/delimited/core/rowsToDelimited.d.ts +59 -0
- package/lib/delimited/core/rowsToDelimited.d.ts.map +1 -0
- package/lib/delimited/core/rowsToDelimited.js +87 -0
- package/lib/delimited/core/rowsToDelimited.js.map +1 -0
- package/lib/delimited/core/toDelimited.d.ts +38 -0
- package/lib/delimited/core/toDelimited.d.ts.map +1 -0
- package/lib/delimited/core/toDelimited.js +45 -0
- package/lib/delimited/core/toDelimited.js.map +1 -0
- package/lib/delimited/ui/DelimitedTextDialog.d.ts +22 -0
- package/lib/delimited/ui/DelimitedTextDialog.d.ts.map +1 -0
- package/lib/delimited/ui/DelimitedTextDialog.js +17 -0
- package/lib/delimited/ui/DelimitedTextDialog.js.map +1 -0
- package/lib/delimited/ui/DelimitedTextPanel.d.ts +56 -0
- package/lib/delimited/ui/DelimitedTextPanel.d.ts.map +1 -0
- package/lib/delimited/ui/DelimitedTextPanel.js +55 -0
- package/lib/delimited/ui/DelimitedTextPanel.js.map +1 -0
- package/lib/delimited/ui/index.d.ts +5 -0
- package/lib/delimited/ui/index.d.ts.map +1 -0
- package/lib/delimited/ui/index.js +3 -0
- package/lib/delimited/ui/index.js.map +1 -0
- package/lib/disclosure/ui/CollapsibleSection.d.ts +57 -0
- package/lib/disclosure/ui/CollapsibleSection.d.ts.map +1 -0
- package/lib/disclosure/ui/CollapsibleSection.js +60 -0
- package/lib/disclosure/ui/CollapsibleSection.js.map +1 -0
- package/lib/disclosure/ui/index.d.ts +5 -0
- package/lib/disclosure/ui/index.d.ts.map +1 -0
- package/lib/disclosure/ui/index.js +3 -0
- package/lib/disclosure/ui/index.js.map +1 -0
- package/lib/disclosure/ui/useDisclosure.d.ts +22 -0
- package/lib/disclosure/ui/useDisclosure.d.ts.map +1 -0
- package/lib/disclosure/ui/useDisclosure.js +18 -0
- package/lib/disclosure/ui/useDisclosure.js.map +1 -0
- package/lib/download/core/downloadBlob.d.ts +10 -0
- package/lib/download/core/downloadBlob.d.ts.map +1 -0
- package/lib/download/core/downloadBlob.js +20 -0
- package/lib/download/core/downloadBlob.js.map +1 -0
- package/lib/download/core/downloadText.d.ts +9 -0
- package/lib/download/core/downloadText.d.ts.map +1 -0
- package/lib/download/core/downloadText.js +14 -0
- package/lib/download/core/downloadText.js.map +1 -0
- package/lib/download/core/index.d.ts +4 -0
- package/lib/download/core/index.d.ts.map +1 -0
- package/lib/download/core/index.js +4 -0
- package/lib/download/core/index.js.map +1 -0
- package/lib/download/core/sanitizeFileName.d.ts +15 -0
- package/lib/download/core/sanitizeFileName.d.ts.map +1 -0
- package/lib/download/core/sanitizeFileName.js +33 -0
- package/lib/download/core/sanitizeFileName.js.map +1 -0
- package/lib/ecosystem/core/index.d.ts +3 -0
- package/lib/ecosystem/core/index.d.ts.map +1 -1
- package/lib/ecosystem/core/index.js +3 -0
- package/lib/ecosystem/core/index.js.map +1 -1
- package/lib/ecosystem/core/links.d.ts +11 -0
- package/lib/ecosystem/core/links.d.ts.map +1 -0
- package/lib/ecosystem/core/links.js +28 -0
- package/lib/ecosystem/core/links.js.map +1 -0
- package/lib/ecosystem/core/lookup.d.ts +32 -0
- package/lib/ecosystem/core/lookup.d.ts.map +1 -0
- package/lib/ecosystem/core/lookup.js +55 -0
- package/lib/ecosystem/core/lookup.js.map +1 -0
- package/lib/ecosystem/core/sites.d.ts +3 -1
- package/lib/ecosystem/core/sites.d.ts.map +1 -1
- package/lib/ecosystem/core/sites.js +18 -3
- package/lib/ecosystem/core/sites.js.map +1 -1
- package/lib/ecosystem/core/tokens.d.ts +21 -0
- package/lib/ecosystem/core/tokens.d.ts.map +1 -0
- package/lib/ecosystem/core/tokens.js +42 -0
- package/lib/ecosystem/core/tokens.js.map +1 -0
- package/lib/ecosystem/ui/SiteTheme.d.ts +18 -0
- package/lib/ecosystem/ui/SiteTheme.d.ts.map +1 -0
- package/lib/ecosystem/ui/SiteTheme.js +16 -0
- package/lib/ecosystem/ui/SiteTheme.js.map +1 -0
- package/lib/ecosystem/ui/Wordmark.d.ts +30 -0
- package/lib/ecosystem/ui/Wordmark.d.ts.map +1 -0
- package/lib/ecosystem/ui/Wordmark.js +26 -0
- package/lib/ecosystem/ui/Wordmark.js.map +1 -0
- package/lib/ecosystem/ui/glyphs.js +1 -1
- package/lib/ecosystem/ui/glyphs.js.map +1 -1
- package/lib/ecosystem/ui/index.d.ts +4 -0
- package/lib/ecosystem/ui/index.d.ts.map +1 -1
- package/lib/ecosystem/ui/index.js +2 -0
- package/lib/ecosystem/ui/index.js.map +1 -1
- package/lib/ecosystem/ui/marks.d.ts +30 -4
- package/lib/ecosystem/ui/marks.d.ts.map +1 -1
- package/lib/ecosystem/ui/marks.js +13 -3
- package/lib/ecosystem/ui/marks.js.map +1 -1
- package/lib/error/ui/ErrorBoundary.d.ts +60 -0
- package/lib/error/ui/ErrorBoundary.d.ts.map +1 -0
- package/lib/error/ui/ErrorBoundary.js +59 -0
- package/lib/error/ui/ErrorBoundary.js.map +1 -0
- package/lib/error/ui/ErrorFallback.d.ts +38 -0
- package/lib/error/ui/ErrorFallback.d.ts.map +1 -0
- package/lib/error/ui/ErrorFallback.js +16 -0
- package/lib/error/ui/ErrorFallback.js.map +1 -0
- package/lib/error/ui/index.d.ts +5 -0
- package/lib/error/ui/index.d.ts.map +1 -0
- package/lib/error/ui/index.js +3 -0
- package/lib/error/ui/index.js.map +1 -0
- package/lib/error/ui/toError.d.ts +11 -0
- package/lib/error/ui/toError.d.ts.map +1 -0
- package/lib/error/ui/toError.js +35 -0
- package/lib/error/ui/toError.js.map +1 -0
- package/lib/format/core/index.d.ts +5 -0
- package/lib/format/core/index.d.ts.map +1 -0
- package/lib/format/core/index.js +5 -0
- package/lib/format/core/index.js.map +1 -0
- package/lib/format/core/missing.d.ts +7 -0
- package/lib/format/core/missing.d.ts.map +1 -0
- package/lib/format/core/missing.js +7 -0
- package/lib/format/core/missing.js.map +1 -0
- package/lib/format/core/numbers.d.ts +40 -0
- package/lib/format/core/numbers.d.ts.map +1 -0
- package/lib/format/core/numbers.js +81 -0
- package/lib/format/core/numbers.js.map +1 -0
- package/lib/format/core/units.d.ts +17 -0
- package/lib/format/core/units.d.ts.map +1 -0
- package/lib/format/core/units.js +54 -0
- package/lib/format/core/units.js.map +1 -0
- package/lib/format/core/words.d.ts +12 -0
- package/lib/format/core/words.d.ts.map +1 -0
- package/lib/format/core/words.js +14 -0
- package/lib/format/core/words.js.map +1 -0
- package/lib/help/ui/HelpBody.d.ts +57 -0
- package/lib/help/ui/HelpBody.d.ts.map +1 -0
- package/lib/help/ui/HelpBody.js +44 -0
- package/lib/help/ui/HelpBody.js.map +1 -0
- package/lib/help/ui/HelpIcon.d.ts +33 -0
- package/lib/help/ui/HelpIcon.d.ts.map +1 -0
- package/lib/help/ui/HelpIcon.js +16 -0
- package/lib/help/ui/HelpIcon.js.map +1 -0
- package/lib/help/ui/HelpToolbarButton.d.ts +45 -0
- package/lib/help/ui/HelpToolbarButton.d.ts.map +1 -0
- package/lib/help/ui/HelpToolbarButton.js +17 -0
- package/lib/help/ui/HelpToolbarButton.js.map +1 -0
- package/lib/help/ui/HelpTooltip.d.ts +36 -0
- package/lib/help/ui/HelpTooltip.d.ts.map +1 -0
- package/lib/help/ui/HelpTooltip.js +24 -0
- package/lib/help/ui/HelpTooltip.js.map +1 -0
- package/lib/help/ui/index.d.ts +9 -0
- package/lib/help/ui/index.d.ts.map +1 -0
- package/lib/help/ui/index.js +5 -0
- package/lib/help/ui/index.js.map +1 -0
- package/lib/hooks/ui/index.d.ts +7 -0
- package/lib/hooks/ui/index.d.ts.map +1 -0
- package/lib/hooks/ui/index.js +5 -0
- package/lib/hooks/ui/index.js.map +1 -0
- package/lib/hooks/ui/listNavigation.d.ts +54 -0
- package/lib/hooks/ui/listNavigation.d.ts.map +1 -0
- package/lib/hooks/ui/listNavigation.js +77 -0
- package/lib/hooks/ui/listNavigation.js.map +1 -0
- package/lib/hooks/ui/useContainerSize.d.ts +15 -0
- package/lib/hooks/ui/useContainerSize.d.ts.map +1 -0
- package/lib/hooks/ui/useContainerSize.js +24 -0
- package/lib/hooks/ui/useContainerSize.js.map +1 -0
- package/lib/hooks/ui/useDebouncedValue.d.ts +12 -0
- package/lib/hooks/ui/useDebouncedValue.d.ts.map +1 -0
- package/lib/hooks/ui/useDebouncedValue.js +24 -0
- package/lib/hooks/ui/useDebouncedValue.js.map +1 -0
- package/lib/hooks/ui/useListKeyboardNavigation.d.ts +17 -0
- package/lib/hooks/ui/useListKeyboardNavigation.d.ts.map +1 -0
- package/lib/hooks/ui/useListKeyboardNavigation.js +25 -0
- package/lib/hooks/ui/useListKeyboardNavigation.js.map +1 -0
- package/lib/hooks/ui/useResizeObserver.d.ts +20 -0
- package/lib/hooks/ui/useResizeObserver.d.ts.map +1 -0
- package/lib/hooks/ui/useResizeObserver.js +37 -0
- package/lib/hooks/ui/useResizeObserver.js.map +1 -0
- package/lib/orbital/core/atomicGrid.d.ts +27 -0
- package/lib/orbital/core/atomicGrid.d.ts.map +1 -1
- package/lib/orbital/core/atomicGrid.js +37 -1
- package/lib/orbital/core/atomicGrid.js.map +1 -1
- package/lib/orbital/core/index.d.ts +9 -7
- package/lib/orbital/core/index.d.ts.map +1 -1
- package/lib/orbital/core/index.js +7 -6
- package/lib/orbital/core/index.js.map +1 -1
- package/lib/orbital/core/isovalue.d.ts +60 -0
- package/lib/orbital/core/isovalue.d.ts.map +1 -0
- package/lib/orbital/core/isovalue.js +128 -0
- package/lib/orbital/core/isovalue.js.map +1 -0
- package/lib/orbital/core/sample.d.ts +15 -1
- package/lib/orbital/core/sample.d.ts.map +1 -1
- package/lib/orbital/core/sample.js +10 -3
- package/lib/orbital/core/sample.js.map +1 -1
- package/lib/orbital/ui/AtomicOrbitalCanvas.d.ts +6 -1
- package/lib/orbital/ui/AtomicOrbitalCanvas.d.ts.map +1 -1
- package/lib/orbital/ui/AtomicOrbitalCanvas.js +12 -2
- package/lib/orbital/ui/AtomicOrbitalCanvas.js.map +1 -1
- package/lib/orbital/ui/AtomicOrbitalViewer.d.ts +5 -1
- package/lib/orbital/ui/AtomicOrbitalViewer.d.ts.map +1 -1
- package/lib/orbital/ui/AtomicOrbitalViewer.js.map +1 -1
- package/lib/orbital/ui/renderVolume.d.ts +6 -3
- package/lib/orbital/ui/renderVolume.d.ts.map +1 -1
- package/lib/orbital/ui/renderVolume.js +14 -15
- package/lib/orbital/ui/renderVolume.js.map +1 -1
- package/lib/orbital/ui/viewer.d.ts +3 -1
- package/lib/orbital/ui/viewer.d.ts.map +1 -1
- package/lib/orbital/ui/viewer.js +3 -2
- package/lib/orbital/ui/viewer.js.map +1 -1
- package/lib/orbital/ui/volumeField.d.ts +5 -21
- package/lib/orbital/ui/volumeField.d.ts.map +1 -1
- package/lib/orbital/ui/volumeField.js +5 -45
- package/lib/orbital/ui/volumeField.js.map +1 -1
- package/lib/pedagogy/core/glossary.d.ts +79 -0
- package/lib/pedagogy/core/glossary.d.ts.map +1 -0
- package/lib/pedagogy/core/glossary.js +71 -0
- package/lib/pedagogy/core/glossary.js.map +1 -0
- package/lib/pedagogy/core/index.d.ts +8 -0
- package/lib/pedagogy/core/index.d.ts.map +1 -0
- package/lib/pedagogy/core/index.js +4 -0
- package/lib/pedagogy/core/index.js.map +1 -0
- package/lib/pedagogy/core/jsonStorage.d.ts +21 -0
- package/lib/pedagogy/core/jsonStorage.d.ts.map +1 -0
- package/lib/pedagogy/core/jsonStorage.js +55 -0
- package/lib/pedagogy/core/jsonStorage.js.map +1 -0
- package/lib/pedagogy/core/progress.d.ts +116 -0
- package/lib/pedagogy/core/progress.d.ts.map +1 -0
- package/lib/pedagogy/core/progress.js +122 -0
- package/lib/pedagogy/core/progress.js.map +1 -0
- package/lib/pedagogy/core/types.d.ts +74 -0
- package/lib/pedagogy/core/types.d.ts.map +1 -0
- package/lib/pedagogy/core/types.js +8 -0
- package/lib/pedagogy/core/types.js.map +1 -0
- package/lib/pedagogy/core/validation.d.ts +79 -0
- package/lib/pedagogy/core/validation.d.ts.map +1 -0
- package/lib/pedagogy/core/validation.js +47 -0
- package/lib/pedagogy/core/validation.js.map +1 -0
- package/lib/pedagogy/ui/ExerciseActions.d.ts +74 -0
- package/lib/pedagogy/ui/ExerciseActions.d.ts.map +1 -0
- package/lib/pedagogy/ui/ExerciseActions.js +22 -0
- package/lib/pedagogy/ui/ExerciseActions.js.map +1 -0
- package/lib/pedagogy/ui/ExerciseProgressHeader.d.ts +43 -0
- package/lib/pedagogy/ui/ExerciseProgressHeader.d.ts.map +1 -0
- package/lib/pedagogy/ui/ExerciseProgressHeader.js +43 -0
- package/lib/pedagogy/ui/ExerciseProgressHeader.js.map +1 -0
- package/lib/pedagogy/ui/ExerciseTags.d.ts +49 -0
- package/lib/pedagogy/ui/ExerciseTags.d.ts.map +1 -0
- package/lib/pedagogy/ui/ExerciseTags.js +22 -0
- package/lib/pedagogy/ui/ExerciseTags.js.map +1 -0
- package/lib/pedagogy/ui/GlossaryProvider.d.ts +19 -0
- package/lib/pedagogy/ui/GlossaryProvider.d.ts.map +1 -0
- package/lib/pedagogy/ui/GlossaryProvider.js +16 -0
- package/lib/pedagogy/ui/GlossaryProvider.js.map +1 -0
- package/lib/pedagogy/ui/GlossaryText.d.ts +50 -0
- package/lib/pedagogy/ui/GlossaryText.d.ts.map +1 -0
- package/lib/pedagogy/ui/GlossaryText.js +79 -0
- package/lib/pedagogy/ui/GlossaryText.js.map +1 -0
- package/lib/pedagogy/ui/HintLadder.d.ts +38 -0
- package/lib/pedagogy/ui/HintLadder.d.ts.map +1 -0
- package/lib/pedagogy/ui/HintLadder.js +33 -0
- package/lib/pedagogy/ui/HintLadder.js.map +1 -0
- package/lib/pedagogy/ui/ReferenceGrid.d.ts +31 -0
- package/lib/pedagogy/ui/ReferenceGrid.d.ts.map +1 -0
- package/lib/pedagogy/ui/ReferenceGrid.js +25 -0
- package/lib/pedagogy/ui/ReferenceGrid.js.map +1 -0
- package/lib/pedagogy/ui/ReferenceSectionBlock.d.ts +64 -0
- package/lib/pedagogy/ui/ReferenceSectionBlock.d.ts.map +1 -0
- package/lib/pedagogy/ui/ReferenceSectionBlock.js +78 -0
- package/lib/pedagogy/ui/ReferenceSectionBlock.js.map +1 -0
- package/lib/pedagogy/ui/SyntaxTooltip.d.ts +94 -0
- package/lib/pedagogy/ui/SyntaxTooltip.d.ts.map +1 -0
- package/lib/pedagogy/ui/SyntaxTooltip.js +79 -0
- package/lib/pedagogy/ui/SyntaxTooltip.js.map +1 -0
- package/lib/pedagogy/ui/TestCaseList.d.ts +35 -0
- package/lib/pedagogy/ui/TestCaseList.d.ts.map +1 -0
- package/lib/pedagogy/ui/TestCaseList.js +63 -0
- package/lib/pedagogy/ui/TestCaseList.js.map +1 -0
- package/lib/pedagogy/ui/TutorialStepStrip.d.ts +42 -0
- package/lib/pedagogy/ui/TutorialStepStrip.d.ts.map +1 -0
- package/lib/pedagogy/ui/TutorialStepStrip.js +98 -0
- package/lib/pedagogy/ui/TutorialStepStrip.js.map +1 -0
- package/lib/pedagogy/ui/exerciseMeta.d.ts +24 -0
- package/lib/pedagogy/ui/exerciseMeta.d.ts.map +1 -0
- package/lib/pedagogy/ui/exerciseMeta.js +38 -0
- package/lib/pedagogy/ui/exerciseMeta.js.map +1 -0
- package/lib/pedagogy/ui/glossaryContext.d.ts +17 -0
- package/lib/pedagogy/ui/glossaryContext.d.ts.map +1 -0
- package/lib/pedagogy/ui/glossaryContext.js +19 -0
- package/lib/pedagogy/ui/glossaryContext.js.map +1 -0
- package/lib/pedagogy/ui/index.d.ts +27 -0
- package/lib/pedagogy/ui/index.d.ts.map +1 -0
- package/lib/pedagogy/ui/index.js +15 -0
- package/lib/pedagogy/ui/index.js.map +1 -0
- package/lib/pedagogy/ui/tutorialLevels.d.ts +18 -0
- package/lib/pedagogy/ui/tutorialLevels.d.ts.map +1 -0
- package/lib/pedagogy/ui/tutorialLevels.js +14 -0
- package/lib/pedagogy/ui/tutorialLevels.js.map +1 -0
- package/lib/router/core/address.d.ts +42 -0
- package/lib/router/core/address.d.ts.map +1 -0
- package/lib/router/core/address.js +64 -0
- package/lib/router/core/address.js.map +1 -0
- package/lib/router/core/basePath.d.ts +49 -0
- package/lib/router/core/basePath.d.ts.map +1 -0
- package/lib/router/core/basePath.js +78 -0
- package/lib/router/core/basePath.js.map +1 -0
- package/lib/router/core/index.d.ts +8 -0
- package/lib/router/core/index.d.ts.map +1 -0
- package/lib/router/core/index.js +5 -0
- package/lib/router/core/index.js.map +1 -0
- package/lib/router/core/legacyHash.d.ts +45 -0
- package/lib/router/core/legacyHash.d.ts.map +1 -0
- package/lib/router/core/legacyHash.js +50 -0
- package/lib/router/core/legacyHash.js.map +1 -0
- package/lib/router/core/pageAddresses.d.ts +50 -0
- package/lib/router/core/pageAddresses.d.ts.map +1 -0
- package/lib/router/core/pageAddresses.js +56 -0
- package/lib/router/core/pageAddresses.js.map +1 -0
- package/lib/router/core/query.d.ts +41 -0
- package/lib/router/core/query.d.ts.map +1 -0
- package/lib/router/core/query.js +64 -0
- package/lib/router/core/query.js.map +1 -0
- package/lib/router/core/tabRouter.d.ts +111 -0
- package/lib/router/core/tabRouter.d.ts.map +1 -0
- package/lib/router/core/tabRouter.js +87 -0
- package/lib/router/core/tabRouter.js.map +1 -0
- package/lib/seo/core/documentMeta.d.ts +45 -0
- package/lib/seo/core/documentMeta.d.ts.map +1 -0
- package/lib/seo/core/documentMeta.js +69 -0
- package/lib/seo/core/documentMeta.js.map +1 -0
- package/lib/seo/core/index.d.ts +9 -0
- package/lib/seo/core/index.d.ts.map +1 -0
- package/lib/seo/core/index.js +5 -0
- package/lib/seo/core/index.js.map +1 -0
- package/lib/seo/core/pageMeta.d.ts +60 -0
- package/lib/seo/core/pageMeta.d.ts.map +1 -0
- package/lib/seo/core/pageMeta.js +91 -0
- package/lib/seo/core/pageMeta.js.map +1 -0
- package/lib/seo/core/routes.d.ts +52 -0
- package/lib/seo/core/routes.d.ts.map +1 -0
- package/lib/seo/core/routes.js +62 -0
- package/lib/seo/core/routes.js.map +1 -0
- package/lib/seo/core/siteFiles.d.ts +73 -0
- package/lib/seo/core/siteFiles.d.ts.map +1 -0
- package/lib/seo/core/siteFiles.js +100 -0
- package/lib/seo/core/siteFiles.js.map +1 -0
- package/lib/seo/vite/index.d.ts +5 -0
- package/lib/seo/vite/index.d.ts.map +1 -0
- package/lib/seo/vite/index.js +3 -0
- package/lib/seo/vite/index.js.map +1 -0
- package/lib/seo/vite/ogCard.d.ts +33 -0
- package/lib/seo/vite/ogCard.d.ts.map +1 -0
- package/lib/seo/vite/ogCard.js +72 -0
- package/lib/seo/vite/ogCard.js.map +1 -0
- package/lib/seo/vite/prerender.d.ts +58 -0
- package/lib/seo/vite/prerender.d.ts.map +1 -0
- package/lib/seo/vite/prerender.js +76 -0
- package/lib/seo/vite/prerender.js.map +1 -0
- package/lib/share/core/config.d.ts +63 -0
- package/lib/share/core/config.d.ts.map +1 -0
- package/lib/share/core/config.js +125 -0
- package/lib/share/core/config.js.map +1 -0
- package/lib/share/core/escape.d.ts +15 -0
- package/lib/share/core/escape.d.ts.map +1 -0
- package/lib/share/core/escape.js +22 -0
- package/lib/share/core/escape.js.map +1 -0
- package/lib/share/core/index.d.ts +9 -0
- package/lib/share/core/index.d.ts.map +1 -0
- package/lib/share/core/index.js +5 -0
- package/lib/share/core/index.js.map +1 -0
- package/lib/share/core/params.d.ts +93 -0
- package/lib/share/core/params.d.ts.map +1 -0
- package/lib/share/core/params.js +111 -0
- package/lib/share/core/params.js.map +1 -0
- package/lib/share/core/query.d.ts +30 -0
- package/lib/share/core/query.d.ts.map +1 -0
- package/lib/share/core/query.js +68 -0
- package/lib/share/core/query.js.map +1 -0
- package/lib/share/core/url.d.ts +57 -0
- package/lib/share/core/url.d.ts.map +1 -0
- package/lib/share/core/url.js +49 -0
- package/lib/share/core/url.js.map +1 -0
- package/lib/share/core/vocabulary.d.ts +51 -0
- package/lib/share/core/vocabulary.d.ts.map +1 -0
- package/lib/share/core/vocabulary.js +2 -0
- package/lib/share/core/vocabulary.js.map +1 -0
- package/lib/share/ui/HiddenPartsProvider.d.ts +19 -0
- package/lib/share/ui/HiddenPartsProvider.d.ts.map +1 -0
- package/lib/share/ui/HiddenPartsProvider.js +15 -0
- package/lib/share/ui/HiddenPartsProvider.js.map +1 -0
- package/lib/share/ui/PagePart.d.ts +18 -0
- package/lib/share/ui/PagePart.d.ts.map +1 -0
- package/lib/share/ui/PagePart.js +16 -0
- package/lib/share/ui/PagePart.js.map +1 -0
- package/lib/share/ui/ShareButton.d.ts +42 -0
- package/lib/share/ui/ShareButton.d.ts.map +1 -0
- package/lib/share/ui/ShareButton.js +18 -0
- package/lib/share/ui/ShareButton.js.map +1 -0
- package/lib/share/ui/ShareDialog.d.ts +73 -0
- package/lib/share/ui/ShareDialog.d.ts.map +1 -0
- package/lib/share/ui/ShareDialog.js +19 -0
- package/lib/share/ui/ShareDialog.js.map +1 -0
- package/lib/share/ui/ShareDialogContent.d.ts +13 -0
- package/lib/share/ui/ShareDialogContent.d.ts.map +1 -0
- package/lib/share/ui/ShareDialogContent.js +71 -0
- package/lib/share/ui/ShareDialogContent.js.map +1 -0
- package/lib/share/ui/SharePartOptions.d.ts +18 -0
- package/lib/share/ui/SharePartOptions.d.ts.map +1 -0
- package/lib/share/ui/SharePartOptions.js +22 -0
- package/lib/share/ui/SharePartOptions.js.map +1 -0
- package/lib/share/ui/draft.d.ts +13 -0
- package/lib/share/ui/draft.d.ts.map +1 -0
- package/lib/share/ui/draft.js +16 -0
- package/lib/share/ui/draft.js.map +1 -0
- package/lib/share/ui/hiddenParts.d.ts +17 -0
- package/lib/share/ui/hiddenParts.d.ts.map +1 -0
- package/lib/share/ui/hiddenParts.js +21 -0
- package/lib/share/ui/hiddenParts.js.map +1 -0
- package/lib/share/ui/index.d.ts +10 -0
- package/lib/share/ui/index.d.ts.map +1 -0
- package/lib/share/ui/index.js +6 -0
- package/lib/share/ui/index.js.map +1 -0
- package/lib/shared/ui/index.d.ts +2 -1
- package/lib/shared/ui/index.d.ts.map +1 -1
- package/lib/shared/ui/index.js +1 -1
- package/lib/shared/ui/index.js.map +1 -1
- package/lib/state/ui/index.d.ts +3 -0
- package/lib/state/ui/index.d.ts.map +1 -0
- package/lib/state/ui/index.js +2 -0
- package/lib/state/ui/index.js.map +1 -0
- package/lib/state/ui/mergeStored.d.ts +27 -0
- package/lib/state/ui/mergeStored.d.ts.map +1 -0
- package/lib/state/ui/mergeStored.js +82 -0
- package/lib/state/ui/mergeStored.js.map +1 -0
- package/lib/state/ui/persistBucket.d.ts +65 -0
- package/lib/state/ui/persistBucket.d.ts.map +1 -0
- package/lib/state/ui/persistBucket.js +90 -0
- package/lib/state/ui/persistBucket.js.map +1 -0
- package/lib/structure/core/editorValue.d.ts +69 -0
- package/lib/structure/core/editorValue.d.ts.map +1 -0
- package/lib/structure/core/editorValue.js +72 -0
- package/lib/structure/core/editorValue.js.map +1 -0
- package/lib/structure/core/fragmentQuery.d.ts +33 -0
- package/lib/structure/core/fragmentQuery.d.ts.map +1 -0
- package/lib/structure/core/fragmentQuery.js +37 -0
- package/lib/structure/core/fragmentQuery.js.map +1 -0
- package/lib/structure/core/index.d.ts +11 -0
- package/lib/structure/core/index.d.ts.map +1 -0
- package/lib/structure/core/index.js +6 -0
- package/lib/structure/core/index.js.map +1 -0
- package/lib/structure/core/molfile.d.ts +42 -0
- package/lib/structure/core/molfile.d.ts.map +1 -0
- package/lib/structure/core/molfile.js +74 -0
- package/lib/structure/core/molfile.js.map +1 -0
- package/lib/structure/core/readStructure.d.ts +37 -0
- package/lib/structure/core/readStructure.d.ts.map +1 -0
- package/lib/structure/core/readStructure.js +59 -0
- package/lib/structure/core/readStructure.js.map +1 -0
- package/lib/structure/core/structureSource.d.ts +34 -0
- package/lib/structure/core/structureSource.d.ts.map +1 -0
- package/lib/structure/core/structureSource.js +32 -0
- package/lib/structure/core/structureSource.js.map +1 -0
- package/lib/structure/core/toolbarFloor.d.ts +16 -0
- package/lib/structure/core/toolbarFloor.d.ts.map +1 -0
- package/lib/structure/core/toolbarFloor.js +27 -0
- package/lib/structure/core/toolbarFloor.js.map +1 -0
- package/lib/structure/ui/EditorCanvas.d.ts +55 -0
- package/lib/structure/ui/EditorCanvas.d.ts.map +1 -0
- package/lib/structure/ui/EditorCanvas.js +41 -0
- package/lib/structure/ui/EditorCanvas.js.map +1 -0
- package/lib/structure/ui/Structure.d.ts +122 -0
- package/lib/structure/ui/Structure.d.ts.map +1 -0
- package/lib/structure/ui/Structure.js +28 -0
- package/lib/structure/ui/Structure.js.map +1 -0
- package/lib/structure/ui/StructureEditor.d.ts +75 -0
- package/lib/structure/ui/StructureEditor.d.ts.map +1 -0
- package/lib/structure/ui/StructureEditor.js +83 -0
- package/lib/structure/ui/StructureEditor.js.map +1 -0
- package/lib/structure/ui/StructurePlaceholder.d.ts +29 -0
- package/lib/structure/ui/StructurePlaceholder.d.ts.map +1 -0
- package/lib/structure/ui/StructurePlaceholder.js +19 -0
- package/lib/structure/ui/StructurePlaceholder.js.map +1 -0
- package/lib/structure/ui/StructureSvg.d.ts +58 -0
- package/lib/structure/ui/StructureSvg.d.ts.map +1 -0
- package/lib/structure/ui/StructureSvg.js +33 -0
- package/lib/structure/ui/StructureSvg.js.map +1 -0
- package/lib/structure/ui/index.d.ts +19 -0
- package/lib/structure/ui/index.d.ts.map +1 -0
- package/lib/structure/ui/index.js +15 -0
- package/lib/structure/ui/index.js.map +1 -0
- package/lib/structure/ui/useToolbarFloor.d.ts +26 -0
- package/lib/structure/ui/useToolbarFloor.d.ts.map +1 -0
- package/lib/structure/ui/useToolbarFloor.js +70 -0
- package/lib/structure/ui/useToolbarFloor.js.map +1 -0
- package/lib/structure.d.ts +3 -0
- package/lib/structure.d.ts.map +1 -0
- package/lib/structure.js +3 -0
- package/lib/structure.js.map +1 -0
- package/lib/ui.d.ts +13 -0
- package/lib/ui.d.ts.map +1 -1
- package/lib/ui.js +13 -0
- package/lib/ui.js.map +1 -1
- package/lib/vite.d.ts +2 -0
- package/lib/vite.d.ts.map +1 -0
- package/lib/vite.js +2 -0
- package/lib/vite.js.map +1 -0
- package/lib/worker/core/errors.d.ts +15 -0
- package/lib/worker/core/errors.d.ts.map +1 -0
- package/lib/worker/core/errors.js +15 -0
- package/lib/worker/core/errors.js.map +1 -0
- package/lib/worker/core/index.d.ts +5 -0
- package/lib/worker/core/index.d.ts.map +1 -0
- package/lib/worker/core/index.js +3 -0
- package/lib/worker/core/index.js.map +1 -0
- package/lib/worker/core/messages.d.ts +48 -0
- package/lib/worker/core/messages.d.ts.map +1 -0
- package/lib/worker/core/messages.js +2 -0
- package/lib/worker/core/messages.js.map +1 -0
- package/lib/worker/core/workerChannel.d.ts +69 -0
- package/lib/worker/core/workerChannel.d.ts.map +1 -0
- package/lib/worker/core/workerChannel.js +121 -0
- package/lib/worker/core/workerChannel.js.map +1 -0
- package/package.json +22 -4
- package/src/capsule/ui/CapsuleFilter.tsx +119 -0
- package/src/capsule/ui/index.ts +2 -0
- package/src/chrome/ui/NavLink.tsx +88 -0
- package/src/chrome/ui/NavMenuButton.tsx +95 -0
- package/src/chrome/ui/SiteFooter.tsx +65 -0
- package/src/chrome/ui/SiteHeader.tsx +119 -0
- package/src/chrome/ui/index.ts +11 -0
- package/src/chrome/ui/navItem.ts +60 -0
- package/src/chrome/ui/useCompactHeader.ts +81 -0
- package/src/citation/core/clipboard.ts +27 -11
- package/src/citation/core/download.ts +25 -15
- package/src/citation/core/index.ts +8 -3
- package/src/citation/core/works.ts +81 -0
- package/src/citation/ui/CitationMenu.tsx +104 -89
- package/src/citation/ui/CitationPreview.tsx +18 -8
- package/src/citation/ui/CiteButton.tsx +24 -9
- package/src/citation/ui/CopyFormatEntries.tsx +84 -0
- package/src/citation/ui/WorkEntry.tsx +80 -0
- package/src/citation/ui/entries.tsx +18 -20
- package/src/citation/ui/index.ts +10 -2
- package/src/citation/ui/useCopyFeedback.ts +76 -0
- package/src/clipboard/core/index.ts +1 -0
- package/src/clipboard/core/writeToClipboard.ts +47 -0
- package/src/clipboard/ui/CodeBlock.tsx +110 -0
- package/src/clipboard/ui/CopyButton.tsx +111 -0
- package/src/clipboard/ui/index.ts +9 -0
- package/src/clipboard/ui/useCopyToClipboard.ts +57 -0
- package/src/color/core/contrast.ts +85 -0
- package/src/color/core/hex.ts +57 -0
- package/src/color/core/index.ts +4 -0
- package/src/color/core/scale.ts +132 -0
- package/src/color/ui/ColorScaleLegend.tsx +144 -0
- package/src/color/ui/index.ts +2 -0
- package/src/core.ts +11 -0
- package/src/credits/core/credits.ts +183 -0
- package/src/credits/core/index.ts +2 -0
- package/src/credits/ui/CreditsList.tsx +82 -0
- package/src/credits/ui/index.ts +2 -0
- package/src/delimited/core/delimiters.ts +64 -0
- package/src/delimited/core/index.ts +11 -0
- package/src/delimited/core/readDelimited.ts +132 -0
- package/src/delimited/core/rowsToDelimited.ts +135 -0
- package/src/delimited/core/toDelimited.ts +69 -0
- package/src/delimited/ui/DelimitedTextDialog.tsx +49 -0
- package/src/delimited/ui/DelimitedTextPanel.tsx +161 -0
- package/src/delimited/ui/index.ts +4 -0
- package/src/disclosure/ui/CollapsibleSection.tsx +150 -0
- package/src/disclosure/ui/index.ts +4 -0
- package/src/disclosure/ui/useDisclosure.ts +35 -0
- package/src/download/core/downloadBlob.ts +19 -0
- package/src/download/core/downloadText.ts +19 -0
- package/src/download/core/index.ts +3 -0
- package/src/download/core/sanitizeFileName.ts +33 -0
- package/src/ecosystem/core/index.ts +3 -0
- package/src/ecosystem/core/links.ts +29 -0
- package/src/ecosystem/core/lookup.ts +57 -0
- package/src/ecosystem/core/sites.ts +21 -4
- package/src/ecosystem/core/tokens.ts +47 -0
- package/src/ecosystem/ui/SiteTheme.tsx +23 -0
- package/src/ecosystem/ui/Wordmark.tsx +65 -0
- package/src/ecosystem/ui/glyphs.tsx +1 -1
- package/src/ecosystem/ui/index.ts +4 -0
- package/src/ecosystem/ui/marks.tsx +54 -15
- package/src/error/ui/ErrorBoundary.tsx +94 -0
- package/src/error/ui/ErrorFallback.tsx +64 -0
- package/src/error/ui/index.ts +4 -0
- package/src/error/ui/toError.ts +33 -0
- package/src/format/core/index.ts +9 -0
- package/src/format/core/missing.ts +6 -0
- package/src/format/core/numbers.ts +84 -0
- package/src/format/core/units.ts +60 -0
- package/src/format/core/words.ts +17 -0
- package/src/help/ui/HelpBody.tsx +130 -0
- package/src/help/ui/HelpIcon.tsx +53 -0
- package/src/help/ui/HelpToolbarButton.tsx +72 -0
- package/src/help/ui/HelpTooltip.tsx +72 -0
- package/src/help/ui/index.ts +8 -0
- package/src/hooks/ui/index.ts +6 -0
- package/src/hooks/ui/listNavigation.ts +116 -0
- package/src/hooks/ui/useContainerSize.ts +32 -0
- package/src/hooks/ui/useDebouncedValue.ts +29 -0
- package/src/hooks/ui/useListKeyboardNavigation.ts +37 -0
- package/src/hooks/ui/useResizeObserver.ts +50 -0
- package/src/orbital/core/atomicGrid.ts +53 -1
- package/src/orbital/core/index.ts +7 -16
- package/src/orbital/core/isovalue.ts +146 -0
- package/src/orbital/core/sample.ts +25 -5
- package/src/orbital/ui/AtomicOrbitalCanvas.tsx +19 -3
- package/src/orbital/ui/AtomicOrbitalViewer.tsx +5 -1
- package/src/orbital/ui/renderVolume.ts +29 -16
- package/src/orbital/ui/viewer.ts +6 -1
- package/src/orbital/ui/volumeField.ts +5 -49
- package/src/pedagogy/core/glossary.ts +122 -0
- package/src/pedagogy/core/index.ts +28 -0
- package/src/pedagogy/core/jsonStorage.ts +51 -0
- package/src/pedagogy/core/progress.ts +205 -0
- package/src/pedagogy/core/types.ts +78 -0
- package/src/pedagogy/core/validation.ts +109 -0
- package/src/pedagogy/ui/ExerciseActions.tsx +129 -0
- package/src/pedagogy/ui/ExerciseProgressHeader.tsx +135 -0
- package/src/pedagogy/ui/ExerciseTags.tsx +85 -0
- package/src/pedagogy/ui/GlossaryProvider.tsx +31 -0
- package/src/pedagogy/ui/GlossaryText.tsx +164 -0
- package/src/pedagogy/ui/HintLadder.tsx +95 -0
- package/src/pedagogy/ui/ReferenceGrid.tsx +69 -0
- package/src/pedagogy/ui/ReferenceSectionBlock.tsx +175 -0
- package/src/pedagogy/ui/SyntaxTooltip.tsx +222 -0
- package/src/pedagogy/ui/TestCaseList.tsx +122 -0
- package/src/pedagogy/ui/TutorialStepStrip.tsx +230 -0
- package/src/pedagogy/ui/exerciseMeta.ts +45 -0
- package/src/pedagogy/ui/glossaryContext.ts +23 -0
- package/src/pedagogy/ui/index.ts +37 -0
- package/src/pedagogy/ui/tutorialLevels.ts +27 -0
- package/src/router/core/address.ts +74 -0
- package/src/router/core/basePath.ts +76 -0
- package/src/router/core/index.ts +26 -0
- package/src/router/core/legacyHash.ts +77 -0
- package/src/router/core/pageAddresses.ts +106 -0
- package/src/router/core/query.ts +87 -0
- package/src/router/core/tabRouter.ts +214 -0
- package/src/seo/core/documentMeta.ts +92 -0
- package/src/seo/core/index.ts +26 -0
- package/src/seo/core/pageMeta.ts +127 -0
- package/src/seo/core/routes.ts +79 -0
- package/src/seo/core/siteFiles.ts +150 -0
- package/src/seo/vite/index.ts +4 -0
- package/src/seo/vite/ogCard.ts +92 -0
- package/src/seo/vite/prerender.ts +156 -0
- package/src/share/core/config.ts +165 -0
- package/src/share/core/escape.ts +22 -0
- package/src/share/core/index.ts +31 -0
- package/src/share/core/params.ts +176 -0
- package/src/share/core/query.ts +72 -0
- package/src/share/core/url.ts +105 -0
- package/src/share/core/vocabulary.ts +60 -0
- package/src/share/ui/HiddenPartsProvider.tsx +34 -0
- package/src/share/ui/PagePart.tsx +26 -0
- package/src/share/ui/ShareButton.tsx +84 -0
- package/src/share/ui/ShareDialog.tsx +114 -0
- package/src/share/ui/ShareDialogContent.tsx +189 -0
- package/src/share/ui/SharePartOptions.tsx +51 -0
- package/src/share/ui/draft.ts +19 -0
- package/src/share/ui/hiddenParts.ts +22 -0
- package/src/share/ui/index.ts +9 -0
- package/src/shared/ui/index.ts +2 -1
- package/src/state/ui/index.ts +6 -0
- package/src/state/ui/mergeStored.ts +87 -0
- package/src/state/ui/persistBucket.ts +147 -0
- package/src/structure/core/editorValue.ts +116 -0
- package/src/structure/core/fragmentQuery.ts +50 -0
- package/src/structure/core/index.ts +13 -0
- package/src/structure/core/molfile.ts +90 -0
- package/src/structure/core/readStructure.ts +73 -0
- package/src/structure/core/structureSource.ts +57 -0
- package/src/structure/core/toolbarFloor.ts +31 -0
- package/src/structure/ui/EditorCanvas.tsx +130 -0
- package/src/structure/ui/Structure.tsx +183 -0
- package/src/structure/ui/StructureEditor.tsx +196 -0
- package/src/structure/ui/StructurePlaceholder.tsx +48 -0
- package/src/structure/ui/StructureSvg.tsx +110 -0
- package/src/structure/ui/index.ts +22 -0
- package/src/structure/ui/useToolbarFloor.ts +93 -0
- package/src/structure.ts +2 -0
- package/src/ui.ts +13 -0
- package/src/vite.ts +1 -0
- package/src/worker/core/errors.ts +15 -0
- package/src/worker/core/index.ts +8 -0
- package/src/worker/core/messages.ts +47 -0
- package/src/worker/core/workerChannel.ts +218 -0
- package/styles/chrome.css +223 -0
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/** How a query string is read and written. */
|
|
2
|
+
export interface QueryStringOptions {
|
|
3
|
+
/**
|
|
4
|
+
* Keep a `+` in a value as the character it is, rather than reading it as
|
|
5
|
+
* the space `URLSearchParams` decodes it to. A SMILES carries `+` for a
|
|
6
|
+
* charged atom, and `CC[N+](C)(C)C` handed out in a link has to survive.
|
|
7
|
+
* @default true
|
|
8
|
+
*/
|
|
9
|
+
literalPlus?: boolean;
|
|
10
|
+
/**
|
|
11
|
+
* Write a parameter carrying nothing back as the bare key, so a hand-typed
|
|
12
|
+
* flag such as `?embed` survives the round trip. Left off, an empty value is
|
|
13
|
+
* dropped and an unconfigured link stays clean.
|
|
14
|
+
* @default false
|
|
15
|
+
*/
|
|
16
|
+
keepEmptyValues?: boolean;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Read a query string.
|
|
20
|
+
*
|
|
21
|
+
* Forgiving by design, because the address is hand-editable and arrives from
|
|
22
|
+
* bookmarks, course pages and lecture slides: a repeated key keeps its last
|
|
23
|
+
* value, a key carrying nothing is kept as an empty value so a bare `?embed`
|
|
24
|
+
* reads as present, and an escape that does not decode is taken literally.
|
|
25
|
+
* @param search - The query string, with or without its leading `?`.
|
|
26
|
+
* @param options - How the values are decoded.
|
|
27
|
+
* @returns One entry per key, decoded.
|
|
28
|
+
*/
|
|
29
|
+
export declare function parseQueryString(search: string, options?: QueryStringOptions): Record<string, string>;
|
|
30
|
+
/**
|
|
31
|
+
* Write a query string.
|
|
32
|
+
*
|
|
33
|
+
* A parameter left at nothing is dropped unless `keepEmptyValues` asks for it,
|
|
34
|
+
* and `undefined` or `null` removes a parameter outright, so a page can hand
|
|
35
|
+
* its whole state to this function and get back only what it actually carries.
|
|
36
|
+
* @param params - The parameters, in the order they should be written.
|
|
37
|
+
* @param options - How the values are encoded.
|
|
38
|
+
* @returns The query string, without its leading `?`, empty when nothing is carried.
|
|
39
|
+
*/
|
|
40
|
+
export declare function formatQueryString(params: Readonly<Record<string, string | undefined | null>>, options?: QueryStringOptions): string;
|
|
41
|
+
//# sourceMappingURL=query.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../../src/router/core/query.ts"],"names":[],"mappings":"AAEA,8CAA8C;AAC9C,MAAM,WAAW,kBAAkB;IACjC;;;;;OAKG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;;;OAKG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,kBAAuB,GAC/B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAcxB;AAED;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC,CAAC,EAC3D,OAAO,GAAE,kBAAuB,GAC/B,MAAM,CAYR"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { safeDecode } from "./address.js";
|
|
2
|
+
/**
|
|
3
|
+
* Read a query string.
|
|
4
|
+
*
|
|
5
|
+
* Forgiving by design, because the address is hand-editable and arrives from
|
|
6
|
+
* bookmarks, course pages and lecture slides: a repeated key keeps its last
|
|
7
|
+
* value, a key carrying nothing is kept as an empty value so a bare `?embed`
|
|
8
|
+
* reads as present, and an escape that does not decode is taken literally.
|
|
9
|
+
* @param search - The query string, with or without its leading `?`.
|
|
10
|
+
* @param options - How the values are decoded.
|
|
11
|
+
* @returns One entry per key, decoded.
|
|
12
|
+
*/
|
|
13
|
+
export function parseQueryString(search, options = {}) {
|
|
14
|
+
const literalPlus = options.literalPlus ?? true;
|
|
15
|
+
const query = {};
|
|
16
|
+
const text = search.startsWith('?') ? search.slice(1) : search;
|
|
17
|
+
for (const part of text.split('&')) {
|
|
18
|
+
if (part === '')
|
|
19
|
+
continue;
|
|
20
|
+
const index = part.indexOf('=');
|
|
21
|
+
const rawKey = index === -1 ? part : part.slice(0, index);
|
|
22
|
+
const rawValue = index === -1 ? '' : part.slice(index + 1);
|
|
23
|
+
const key = decodeValue(rawKey, literalPlus);
|
|
24
|
+
if (key === '')
|
|
25
|
+
continue;
|
|
26
|
+
query[key] = decodeValue(rawValue, literalPlus);
|
|
27
|
+
}
|
|
28
|
+
return query;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Write a query string.
|
|
32
|
+
*
|
|
33
|
+
* A parameter left at nothing is dropped unless `keepEmptyValues` asks for it,
|
|
34
|
+
* and `undefined` or `null` removes a parameter outright, so a page can hand
|
|
35
|
+
* its whole state to this function and get back only what it actually carries.
|
|
36
|
+
* @param params - The parameters, in the order they should be written.
|
|
37
|
+
* @param options - How the values are encoded.
|
|
38
|
+
* @returns The query string, without its leading `?`, empty when nothing is carried.
|
|
39
|
+
*/
|
|
40
|
+
export function formatQueryString(params, options = {}) {
|
|
41
|
+
const keepEmptyValues = options.keepEmptyValues ?? false;
|
|
42
|
+
const parts = [];
|
|
43
|
+
for (const [key, value] of Object.entries(params)) {
|
|
44
|
+
if (key === '' || value === undefined || value === null)
|
|
45
|
+
continue;
|
|
46
|
+
if (value === '') {
|
|
47
|
+
if (keepEmptyValues)
|
|
48
|
+
parts.push(encodeValue(key));
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
parts.push(`${encodeValue(key)}=${encodeValue(value)}`);
|
|
52
|
+
}
|
|
53
|
+
return parts.join('&');
|
|
54
|
+
}
|
|
55
|
+
// A comma is legal in a query value and is what separates the keys of `hide`
|
|
56
|
+
// and the formulas of a list; escaped to `%2C` a link stops being one a teacher
|
|
57
|
+
// can read out loud.
|
|
58
|
+
function encodeValue(value) {
|
|
59
|
+
return encodeURIComponent(value).replaceAll('%2C', ',');
|
|
60
|
+
}
|
|
61
|
+
function decodeValue(value, literalPlus) {
|
|
62
|
+
return safeDecode(literalPlus ? value : value.replaceAll('+', ' '));
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=query.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.js","sourceRoot":"","sources":["../../../src/router/core/query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAoB1C;;;;;;;;;;GAUG;AACH,MAAM,UAAU,gBAAgB,CAC9B,MAAc,EACd,UAA8B,EAAE;IAEhC,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,IAAI,CAAC;IAChD,MAAM,KAAK,GAA2B,EAAE,CAAC;IACzC,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAC/D,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACnC,IAAI,IAAI,KAAK,EAAE;YAAE,SAAS;QAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAChC,MAAM,MAAM,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAC1D,MAAM,QAAQ,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QAC3D,MAAM,GAAG,GAAG,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QAC7C,IAAI,GAAG,KAAK,EAAE;YAAE,SAAS;QACzB,KAAK,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,iBAAiB,CAC/B,MAA2D,EAC3D,UAA8B,EAAE;IAEhC,MAAM,eAAe,GAAG,OAAO,CAAC,eAAe,IAAI,KAAK,CAAC;IACzD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,IAAI,GAAG,KAAK,EAAE,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;YAAE,SAAS;QAClE,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;YACjB,IAAI,eAAe;gBAAE,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;YAClD,SAAS;QACX,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC;AAED,6EAA6E;AAC7E,gFAAgF;AAChF,qBAAqB;AACrB,SAAS,WAAW,CAAC,KAAa;IAChC,OAAO,kBAAkB,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,WAAW,CAAC,KAAa,EAAE,WAAoB;IACtD,OAAO,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;AACtE,CAAC"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The two directions between an address and the page it names.
|
|
3
|
+
*
|
|
4
|
+
* Both functions are pure: they take and return strings, never touch
|
|
5
|
+
* `location`, and know none of the parameter names the tool carries — the share
|
|
6
|
+
* configuration owns those. That is what makes the round trip unit-testable
|
|
7
|
+
* without a DOM, and usable from a prerender script under Node.
|
|
8
|
+
* @param options - The tabs of the site and how their addresses are written.
|
|
9
|
+
* @returns The parser, the serialiser, and the test for a known tab.
|
|
10
|
+
*/
|
|
11
|
+
export declare function createTabRouter<Tab extends string>(options: TabRouterOptions<Tab>): TabRouter<Tab>;
|
|
12
|
+
/** A tab whose address carries more than the tab's own name. */
|
|
13
|
+
export interface TabDefinition<Tab extends string = string> {
|
|
14
|
+
/** Identifier of the tab, as the state and the components name it. */
|
|
15
|
+
id: Tab;
|
|
16
|
+
/**
|
|
17
|
+
* The address of the tab, from the site's own root. The home tab is always
|
|
18
|
+
* written as `/`, whatever it declares here, so the site has one address for
|
|
19
|
+
* it instead of two holding the same thing.
|
|
20
|
+
* @default `/${id}`
|
|
21
|
+
*/
|
|
22
|
+
path?: string;
|
|
23
|
+
/**
|
|
24
|
+
* Whether the tab addresses one of its items in a second path segment — a
|
|
25
|
+
* tutorial step, an exercise, an element — so a lecturer can hand out a deep
|
|
26
|
+
* link and a crawler indexes each item as a page of its own.
|
|
27
|
+
* @default false
|
|
28
|
+
*/
|
|
29
|
+
takesId?: boolean;
|
|
30
|
+
}
|
|
31
|
+
/** How the addresses of a site's tabs are read and written. */
|
|
32
|
+
export interface TabRouterOptions<Tab extends string> {
|
|
33
|
+
/** Every tab of the site, named on its own or described in full. */
|
|
34
|
+
tabs: ReadonlyArray<Tab | TabDefinition<Tab>>;
|
|
35
|
+
/**
|
|
36
|
+
* The tab living at the root, and the one an address the site does not know
|
|
37
|
+
* opens — a link written before a rename still lands somewhere.
|
|
38
|
+
*/
|
|
39
|
+
home: Tab;
|
|
40
|
+
/**
|
|
41
|
+
* Whether the address is the path or the fragment. A public tool must use
|
|
42
|
+
* `'path'`: a `#` is dropped by half the tools that pass links around, the
|
|
43
|
+
* server never sees it, and a crawler indexes the whole site as one page.
|
|
44
|
+
* `'hash'` exists only so a site already routing that way can adopt this
|
|
45
|
+
* router before it moves.
|
|
46
|
+
* @default 'path'
|
|
47
|
+
*/
|
|
48
|
+
mode?: 'path' | 'hash';
|
|
49
|
+
/**
|
|
50
|
+
* The path the site is served under: nothing on a host of its own, `/surge`
|
|
51
|
+
* as one tool among several on a shared one.
|
|
52
|
+
* @default ''
|
|
53
|
+
*/
|
|
54
|
+
basePath?: string;
|
|
55
|
+
/**
|
|
56
|
+
* Read a `+` in a value as the character it is rather than as a space.
|
|
57
|
+
* Without it a shared SMILES breaks.
|
|
58
|
+
* @default true
|
|
59
|
+
*/
|
|
60
|
+
literalPlus?: boolean;
|
|
61
|
+
/**
|
|
62
|
+
* Write a parameter carrying nothing back as the bare key, so a hand-typed
|
|
63
|
+
* `?embed` survives the round trip.
|
|
64
|
+
* @default false
|
|
65
|
+
*/
|
|
66
|
+
keepEmptyValues?: boolean;
|
|
67
|
+
/**
|
|
68
|
+
* Also read an address whose page is named by an old `#/tab/item` fragment,
|
|
69
|
+
* so links handed out before the site routed by path keep working.
|
|
70
|
+
* @default false
|
|
71
|
+
*/
|
|
72
|
+
adoptLegacyHash?: boolean;
|
|
73
|
+
}
|
|
74
|
+
/** Where the app is: which tab, what it has open, and how it is set up. */
|
|
75
|
+
export interface TabRoute<Tab extends string = string> {
|
|
76
|
+
/** The tab the address opens. */
|
|
77
|
+
tab: Tab;
|
|
78
|
+
/** The item its second segment names, `null` on a tab that takes none. */
|
|
79
|
+
id: string | null;
|
|
80
|
+
/** Decoded query parameters, the tool's own and the share configuration's. */
|
|
81
|
+
params: Record<string, string>;
|
|
82
|
+
}
|
|
83
|
+
/** A route as a caller writes it, the parts it does not carry left out. */
|
|
84
|
+
export interface TabRouteInput<Tab extends string = string> {
|
|
85
|
+
/** The tab to open; one the router does not know falls back to the home tab. */
|
|
86
|
+
tab: Tab;
|
|
87
|
+
/**
|
|
88
|
+
* The item the tab has open, ignored by a tab that addresses none.
|
|
89
|
+
* @default null
|
|
90
|
+
*/
|
|
91
|
+
id?: string | null;
|
|
92
|
+
/**
|
|
93
|
+
* Query parameters to carry; an empty, `undefined` or `null` value is left out.
|
|
94
|
+
* @default {}
|
|
95
|
+
*/
|
|
96
|
+
params?: Record<string, string | undefined | null>;
|
|
97
|
+
}
|
|
98
|
+
/** The string ↔ route mapping of a site. */
|
|
99
|
+
export interface TabRouter<Tab extends string = string> {
|
|
100
|
+
/**
|
|
101
|
+
* The route an address denotes. An unknown tab, a trailing slash, an empty
|
|
102
|
+
* address and an escape that does not decode all resolve to something
|
|
103
|
+
* sensible rather than throwing.
|
|
104
|
+
*/
|
|
105
|
+
parse: (address: string) => TabRoute<Tab>;
|
|
106
|
+
/** The address a route is reachable at, mount path and query included. */
|
|
107
|
+
format: (route: TabRouteInput<Tab>) => string;
|
|
108
|
+
/** Whether a string read out of an address names one of the site's tabs. */
|
|
109
|
+
isTab: (value: string) => value is Tab;
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=tabRouter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tabRouter.d.ts","sourceRoot":"","sources":["../../../src/router/core/tabRouter.ts"],"names":[],"mappings":"AAMA;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,GAAG,SAAS,MAAM,EAChD,OAAO,EAAE,gBAAgB,CAAC,GAAG,CAAC,GAC7B,SAAS,CAAC,GAAG,CAAC,CAyDhB;AAED,gEAAgE;AAChE,MAAM,WAAW,aAAa,CAAC,GAAG,SAAS,MAAM,GAAG,MAAM;IACxD,sEAAsE;IACtE,EAAE,EAAE,GAAG,CAAC;IACR;;;;;OAKG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;;OAKG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,+DAA+D;AAC/D,MAAM,WAAW,gBAAgB,CAAC,GAAG,SAAS,MAAM;IAClD,oEAAoE;IACpE,IAAI,EAAE,aAAa,CAAC,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9C;;;OAGG;IACH,IAAI,EAAE,GAAG,CAAC;IACV;;;;;;;OAOG;IACH,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;;OAIG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;OAIG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,2EAA2E;AAC3E,MAAM,WAAW,QAAQ,CAAC,GAAG,SAAS,MAAM,GAAG,MAAM;IACnD,iCAAiC;IACjC,GAAG,EAAE,GAAG,CAAC;IACT,0EAA0E;IAC1E,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAClB,8EAA8E;IAC9E,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAED,2EAA2E;AAC3E,MAAM,WAAW,aAAa,CAAC,GAAG,SAAS,MAAM,GAAG,MAAM;IACxD,gFAAgF;IAChF,GAAG,EAAE,GAAG,CAAC;IACT;;;OAGG;IACH,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC,CAAC;CACpD;AAED,4CAA4C;AAC5C,MAAM,WAAW,SAAS,CAAC,GAAG,SAAS,MAAM,GAAG,MAAM;IACpD;;;;OAIG;IACH,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC1C,0EAA0E;IAC1E,MAAM,EAAE,CAAC,KAAK,EAAE,aAAa,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC;IAC9C,4EAA4E;IAC5E,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,KAAK,IAAI,GAAG,CAAC;CACxC"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { splitAddress, splitPath } from "./address.js";
|
|
2
|
+
import { joinBasePath, normalizeBasePath, stripBasePath } from "./basePath.js";
|
|
3
|
+
import { pathFromLegacyHash } from "./legacyHash.js";
|
|
4
|
+
import { formatQueryString, parseQueryString } from "./query.js";
|
|
5
|
+
/**
|
|
6
|
+
* The two directions between an address and the page it names.
|
|
7
|
+
*
|
|
8
|
+
* Both functions are pure: they take and return strings, never touch
|
|
9
|
+
* `location`, and know none of the parameter names the tool carries — the share
|
|
10
|
+
* configuration owns those. That is what makes the round trip unit-testable
|
|
11
|
+
* without a DOM, and usable from a prerender script under Node.
|
|
12
|
+
* @param options - The tabs of the site and how their addresses are written.
|
|
13
|
+
* @returns The parser, the serialiser, and the test for a known tab.
|
|
14
|
+
*/
|
|
15
|
+
export function createTabRouter(options) {
|
|
16
|
+
const mode = options.mode ?? 'path';
|
|
17
|
+
const basePath = normalizeBasePath(options.basePath ?? '');
|
|
18
|
+
const adoptLegacyHash = options.adoptLegacyHash ?? false;
|
|
19
|
+
const queryOptions = {
|
|
20
|
+
literalPlus: options.literalPlus ?? true,
|
|
21
|
+
keepEmptyValues: options.keepEmptyValues ?? false,
|
|
22
|
+
};
|
|
23
|
+
const definitions = new Map();
|
|
24
|
+
for (const tab of options.tabs) {
|
|
25
|
+
const definition = typeof tab === 'string' ? { id: tab } : tab;
|
|
26
|
+
definitions.set(definition.id, {
|
|
27
|
+
path: normalizeTabPath(definition.path ?? `/${definition.id}`),
|
|
28
|
+
takesId: definition.takesId ?? false,
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
definitions.set(options.home, definitions.get(options.home) ?? { path: '/', takesId: false });
|
|
32
|
+
const tabBySegment = new Map();
|
|
33
|
+
for (const [id, definition] of definitions) {
|
|
34
|
+
const segment = definition.path.slice(1);
|
|
35
|
+
if (segment !== '')
|
|
36
|
+
tabBySegment.set(segment, id);
|
|
37
|
+
}
|
|
38
|
+
function isTab(value) {
|
|
39
|
+
return definitions.has(value);
|
|
40
|
+
}
|
|
41
|
+
function parse(address) {
|
|
42
|
+
const parts = readAddress(address, mode, basePath, adoptLegacyHash);
|
|
43
|
+
const params = parseQueryString(parts.search, queryOptions);
|
|
44
|
+
const segments = splitPath(parts.path);
|
|
45
|
+
const first = segments[0];
|
|
46
|
+
const tab = first === undefined ? undefined : tabBySegment.get(first);
|
|
47
|
+
if (tab === undefined)
|
|
48
|
+
return { tab: options.home, id: null, params };
|
|
49
|
+
const second = segments[1];
|
|
50
|
+
const takesId = definitions.get(tab)?.takesId ?? false;
|
|
51
|
+
return { tab, id: takesId && second !== undefined ? second : null, params };
|
|
52
|
+
}
|
|
53
|
+
function format(route) {
|
|
54
|
+
const tab = definitions.has(route.tab) ? route.tab : options.home;
|
|
55
|
+
const definition = definitions.get(tab);
|
|
56
|
+
const base = tab === options.home ? '/' : (definition?.path ?? '/');
|
|
57
|
+
const id = definition?.takesId === true ? (route.id ?? null) : null;
|
|
58
|
+
const path = id === null || base === '/' ? base : `${base}/${encodeURIComponent(id)}`;
|
|
59
|
+
const search = formatQueryString(route.params ?? {}, queryOptions);
|
|
60
|
+
const address = mode === 'hash' ? `#${path}` : joinBasePath(basePath, path);
|
|
61
|
+
return search === '' ? address : `${address}?${search}`;
|
|
62
|
+
}
|
|
63
|
+
return { parse, format, isTab };
|
|
64
|
+
}
|
|
65
|
+
function readAddress(address, mode, basePath, adoptLegacyHash) {
|
|
66
|
+
if (mode === 'hash') {
|
|
67
|
+
const fragment = address.includes('#')
|
|
68
|
+
? splitAddress(address).fragment
|
|
69
|
+
: address;
|
|
70
|
+
const { path, search } = splitAddress(fragment);
|
|
71
|
+
return { path, search };
|
|
72
|
+
}
|
|
73
|
+
const outer = splitAddress(address);
|
|
74
|
+
const path = stripBasePath(basePath, outer.path);
|
|
75
|
+
if (adoptLegacyHash && path === '/') {
|
|
76
|
+
const legacy = pathFromLegacyHash(address);
|
|
77
|
+
if (legacy !== null)
|
|
78
|
+
return splitAddress(legacy);
|
|
79
|
+
}
|
|
80
|
+
return { path, search: outer.search };
|
|
81
|
+
}
|
|
82
|
+
function normalizeTabPath(path) {
|
|
83
|
+
const opened = path.startsWith('/') ? path : `/${path}`;
|
|
84
|
+
const closed = opened.replace(/\/+$/, '');
|
|
85
|
+
return closed === '' ? '/' : closed;
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=tabRouter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tabRouter.js","sourceRoot":"","sources":["../../../src/router/core/tabRouter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Keep the head in step with the page on screen after an in-app move.
|
|
3
|
+
*
|
|
4
|
+
* The server, or the build that wrote one file per address, already titled the
|
|
5
|
+
* page it handed out; this is what a click inside the app changes, and what a
|
|
6
|
+
* crawler that renders the page reads afterwards. Every access to the document
|
|
7
|
+
* is guarded, so a prerender script importing this under Node does nothing
|
|
8
|
+
* rather than throwing.
|
|
9
|
+
* @param meta - What the page on screen is called and where it is indexed.
|
|
10
|
+
*/
|
|
11
|
+
export declare function writeDocumentMeta(meta: DocumentMeta): void;
|
|
12
|
+
/**
|
|
13
|
+
* Name the browser tab.
|
|
14
|
+
* @param title - The title of the page, site name included.
|
|
15
|
+
*/
|
|
16
|
+
export declare function documentTitle(title: string): void;
|
|
17
|
+
/**
|
|
18
|
+
* Point the canonical link at the address the page is indexed under, creating
|
|
19
|
+
* the tag when the served page carries none.
|
|
20
|
+
*
|
|
21
|
+
* The query string is dropped, and so is any fragment: the structure being
|
|
22
|
+
* edited and the configuration a shared link carries are not pages of their
|
|
23
|
+
* own, and indexing them as such splits one result into hundreds.
|
|
24
|
+
* @param href - The address of the page, absolute so a crawler can resolve it.
|
|
25
|
+
*/
|
|
26
|
+
export declare function canonicalLink(href: string): void;
|
|
27
|
+
/** What a page is called and where it is indexed. */
|
|
28
|
+
export interface DocumentMeta {
|
|
29
|
+
/** The title of the tab, the search result and the shared card. */
|
|
30
|
+
title: string;
|
|
31
|
+
/**
|
|
32
|
+
* One sentence describing this page, in the words someone would search for.
|
|
33
|
+
* Left out, the description the page was served with stays as it is — which
|
|
34
|
+
* is what every crawler but a rendering one has already read.
|
|
35
|
+
* @default undefined
|
|
36
|
+
*/
|
|
37
|
+
description?: string;
|
|
38
|
+
/**
|
|
39
|
+
* The absolute address the page is indexed under. Left out, the canonical
|
|
40
|
+
* link the page was served with stays as it is.
|
|
41
|
+
* @default undefined
|
|
42
|
+
*/
|
|
43
|
+
canonical?: string;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=documentMeta.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"documentMeta.d.ts","sourceRoot":"","sources":["../../../src/seo/core/documentMeta.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,CAK1D;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAGjD;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAiBhD;AAED,qDAAqD;AACrD,MAAM,WAAW,YAAY;IAC3B,mEAAmE;IACnE,KAAK,EAAE,MAAM,CAAC;IACd;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Keep the head in step with the page on screen after an in-app move.
|
|
3
|
+
*
|
|
4
|
+
* The server, or the build that wrote one file per address, already titled the
|
|
5
|
+
* page it handed out; this is what a click inside the app changes, and what a
|
|
6
|
+
* crawler that renders the page reads afterwards. Every access to the document
|
|
7
|
+
* is guarded, so a prerender script importing this under Node does nothing
|
|
8
|
+
* rather than throwing.
|
|
9
|
+
* @param meta - What the page on screen is called and where it is indexed.
|
|
10
|
+
*/
|
|
11
|
+
export function writeDocumentMeta(meta) {
|
|
12
|
+
if (typeof document === 'undefined')
|
|
13
|
+
return;
|
|
14
|
+
documentTitle(meta.title);
|
|
15
|
+
if (meta.description !== undefined)
|
|
16
|
+
metaDescription(meta.description);
|
|
17
|
+
if (meta.canonical !== undefined)
|
|
18
|
+
canonicalLink(meta.canonical);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Name the browser tab.
|
|
22
|
+
* @param title - The title of the page, site name included.
|
|
23
|
+
*/
|
|
24
|
+
export function documentTitle(title) {
|
|
25
|
+
if (typeof document === 'undefined')
|
|
26
|
+
return;
|
|
27
|
+
document.title = title;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Point the canonical link at the address the page is indexed under, creating
|
|
31
|
+
* the tag when the served page carries none.
|
|
32
|
+
*
|
|
33
|
+
* The query string is dropped, and so is any fragment: the structure being
|
|
34
|
+
* edited and the configuration a shared link carries are not pages of their
|
|
35
|
+
* own, and indexing them as such splits one result into hundreds.
|
|
36
|
+
* @param href - The address of the page, absolute so a crawler can resolve it.
|
|
37
|
+
*/
|
|
38
|
+
export function canonicalLink(href) {
|
|
39
|
+
if (typeof document === 'undefined')
|
|
40
|
+
return;
|
|
41
|
+
const address = withoutQuery(href);
|
|
42
|
+
if (address === '')
|
|
43
|
+
return;
|
|
44
|
+
const existing = document.querySelector('link[rel="canonical"]');
|
|
45
|
+
if (existing) {
|
|
46
|
+
existing.href = address;
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
const link = document.createElement('link');
|
|
50
|
+
link.rel = 'canonical';
|
|
51
|
+
document.head.append(link);
|
|
52
|
+
link.href = address;
|
|
53
|
+
}
|
|
54
|
+
function metaDescription(content) {
|
|
55
|
+
const existing = document.querySelector('meta[name="description"]');
|
|
56
|
+
if (existing) {
|
|
57
|
+
existing.content = content;
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
const meta = document.createElement('meta');
|
|
61
|
+
meta.name = 'description';
|
|
62
|
+
document.head.append(meta);
|
|
63
|
+
meta.content = content;
|
|
64
|
+
}
|
|
65
|
+
function withoutQuery(href) {
|
|
66
|
+
const cut = href.search(/[?#]/);
|
|
67
|
+
return cut === -1 ? href : href.slice(0, cut);
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=documentMeta.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"documentMeta.js","sourceRoot":"","sources":["../../../src/seo/core/documentMeta.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAkB;IAClD,IAAI,OAAO,QAAQ,KAAK,WAAW;QAAE,OAAO;IAC5C,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1B,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS;QAAE,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACtE,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS;QAAE,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAClE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,IAAI,OAAO,QAAQ,KAAK,WAAW;QAAE,OAAO;IAC5C,QAAQ,CAAC,KAAK,GAAG,KAAK,CAAC;AACzB,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,IAAI,OAAO,QAAQ,KAAK,WAAW;QAAE,OAAO;IAC5C,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,OAAO,KAAK,EAAE;QAAE,OAAO;IAE3B,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CACrC,uBAAuB,CACxB,CAAC;IACF,IAAI,QAAQ,EAAE,CAAC;QACb,QAAQ,CAAC,IAAI,GAAG,OAAO,CAAC;QACxB,OAAO;IACT,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAC5C,IAAI,CAAC,GAAG,GAAG,WAAW,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC;AACtB,CAAC;AAqBD,SAAS,eAAe,CAAC,OAAe;IACtC,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CACrC,0BAA0B,CAC3B,CAAC;IACF,IAAI,QAAQ,EAAE,CAAC;QACb,QAAQ,CAAC,OAAO,GAAG,OAAO,CAAC;QAC3B,OAAO;IACT,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAC5C,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC1B,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;AACzB,CAAC;AAED,SAAS,YAAY,CAAC,IAAY;IAChC,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAChC,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAChD,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export type { DocumentMeta } from './documentMeta.ts';
|
|
2
|
+
export { canonicalLink, documentTitle, writeDocumentMeta, } from './documentMeta.ts';
|
|
3
|
+
export type { PageMetaOptions } from './pageMeta.ts';
|
|
4
|
+
export { injectPageMeta, insertBeforeHeadEnd, pageDocumentMeta, } from './pageMeta.ts';
|
|
5
|
+
export type { RouteMeta } from './routes.ts';
|
|
6
|
+
export { homeRoute, pageMetaFor, routeFor, trimTrailingSlash, } from './routes.ts';
|
|
7
|
+
export type { SiteFilesOptions, StructuredDataOptions } from './siteFiles.ts';
|
|
8
|
+
export { noscriptIndex, robotsTxt, sitemapXml, structuredDataScript, } from './siteFiles.ts';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/seo/core/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EACL,aAAa,EACb,aAAa,EACb,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EACL,SAAS,EACT,WAAW,EACX,QAAQ,EACR,iBAAiB,GAClB,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAC9E,OAAO,EACL,aAAa,EACb,SAAS,EACT,UAAU,EACV,oBAAoB,GACrB,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { canonicalLink, documentTitle, writeDocumentMeta, } from "./documentMeta.js";
|
|
2
|
+
export { injectPageMeta, insertBeforeHeadEnd, pageDocumentMeta, } from "./pageMeta.js";
|
|
3
|
+
export { homeRoute, pageMetaFor, routeFor, trimTrailingSlash, } from "./routes.js";
|
|
4
|
+
export { noscriptIndex, robotsTxt, sitemapXml, structuredDataScript, } from "./siteFiles.js";
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/seo/core/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,aAAa,EACb,aAAa,EACb,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,SAAS,EACT,WAAW,EACX,QAAQ,EACR,iBAAiB,GAClB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,aAAa,EACb,SAAS,EACT,UAAU,EACV,oBAAoB,GACrB,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The head of the page a crawler is handed.
|
|
3
|
+
*
|
|
4
|
+
* Googlebot renders JavaScript, but Bing, a Slack unfurl, an LMS preview and
|
|
5
|
+
* every academic indexer read the HTML that came off the wire — so the title,
|
|
6
|
+
* the description and the canonical of a page must already be in it. A site
|
|
7
|
+
* with a server rewrites them per request; a static one writes one file per
|
|
8
|
+
* address at build time. Both call this, which is pure string work: no
|
|
9
|
+
* `window`, no `node:fs`.
|
|
10
|
+
*/
|
|
11
|
+
import type { EcosystemSite, SiteId } from '../../ecosystem/core/sites.ts';
|
|
12
|
+
import type { DocumentMeta } from './documentMeta.ts';
|
|
13
|
+
import type { RouteMeta } from './routes.ts';
|
|
14
|
+
/** Which site is being served, and what it answers. */
|
|
15
|
+
export interface PageMetaOptions {
|
|
16
|
+
/** The site, named or passed. */
|
|
17
|
+
site: EcosystemSite | SiteId;
|
|
18
|
+
/** Every address it answers, each with its title and description. */
|
|
19
|
+
routes: readonly RouteMeta[];
|
|
20
|
+
/** The address being written, query string included. */
|
|
21
|
+
url: string;
|
|
22
|
+
/**
|
|
23
|
+
* Origin every absolute address is built on. A server passes the one the
|
|
24
|
+
* request arrived on; a build leaves it out and the site's own host is used.
|
|
25
|
+
* @default `https://<the site's host>`
|
|
26
|
+
*/
|
|
27
|
+
origin?: string;
|
|
28
|
+
/**
|
|
29
|
+
* The card a link to the page unfurls into, as an absolute address or a path.
|
|
30
|
+
* @default '/og.png'
|
|
31
|
+
*/
|
|
32
|
+
image?: string;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Give a page the title, the description and the canonical address of the route
|
|
36
|
+
* it answers, plus the card a link to it unfurls into.
|
|
37
|
+
* @param html - The built page.
|
|
38
|
+
* @param options - Which site, which address, and where it is served from.
|
|
39
|
+
* @returns The page, with its head rewritten for that route.
|
|
40
|
+
*/
|
|
41
|
+
export declare function injectPageMeta(html: string, options: PageMetaOptions): string;
|
|
42
|
+
/**
|
|
43
|
+
* What the page on screen is called and where it is indexed, for the app to
|
|
44
|
+
* write after an in-app move.
|
|
45
|
+
*
|
|
46
|
+
* The same title and canonical the build wrote into the file it served, so a
|
|
47
|
+
* click that changes the page cannot disagree with the page a crawler fetched.
|
|
48
|
+
* @param options - Which site, which address, and where it is served from.
|
|
49
|
+
* @returns The title, the description and the canonical of that address.
|
|
50
|
+
*/
|
|
51
|
+
export declare function pageDocumentMeta(options: PageMetaOptions): Required<DocumentMeta>;
|
|
52
|
+
/**
|
|
53
|
+
* Put an addition at the end of the head, where a tracking snippet and a
|
|
54
|
+
* structured-data block both belong.
|
|
55
|
+
* @param html - The page.
|
|
56
|
+
* @param addition - The markup to add, taken as written.
|
|
57
|
+
* @returns The page, with the addition before `</head>`.
|
|
58
|
+
*/
|
|
59
|
+
export declare function insertBeforeHeadEnd(html: string, addition: string): string;
|
|
60
|
+
//# sourceMappingURL=pageMeta.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pageMeta.d.ts","sourceRoot":"","sources":["../../../src/seo/core/pageMeta.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAC;AAG3E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAG7C,uDAAuD;AACvD,MAAM,WAAW,eAAe;IAC9B,iCAAiC;IACjC,IAAI,EAAE,aAAa,GAAG,MAAM,CAAC;IAC7B,qEAAqE;IACrE,MAAM,EAAE,SAAS,SAAS,EAAE,CAAC;IAC7B,wDAAwD;IACxD,GAAG,EAAE,MAAM,CAAC;IACZ;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,MAAM,CAuB7E;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,eAAe,GAAG,QAAQ,CAAC,YAAY,CAAC,CASjF;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAI1E"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The head of the page a crawler is handed.
|
|
3
|
+
*
|
|
4
|
+
* Googlebot renders JavaScript, but Bing, a Slack unfurl, an LMS preview and
|
|
5
|
+
* every academic indexer read the HTML that came off the wire — so the title,
|
|
6
|
+
* the description and the canonical of a page must already be in it. A site
|
|
7
|
+
* with a server rewrites them per request; a static one writes one file per
|
|
8
|
+
* address at build time. Both call this, which is pure string work: no
|
|
9
|
+
* `window`, no `node:fs`.
|
|
10
|
+
*/
|
|
11
|
+
import { siteById, siteDisplayName } from "../../ecosystem/core/lookup.js";
|
|
12
|
+
import { escapeAttribute, escapeText } from "../../share/core/escape.js";
|
|
13
|
+
import { pageMetaFor, trimTrailingSlash } from "./routes.js";
|
|
14
|
+
/**
|
|
15
|
+
* Give a page the title, the description and the canonical address of the route
|
|
16
|
+
* it answers, plus the card a link to it unfurls into.
|
|
17
|
+
* @param html - The built page.
|
|
18
|
+
* @param options - Which site, which address, and where it is served from.
|
|
19
|
+
* @returns The page, with its head rewritten for that route.
|
|
20
|
+
*/
|
|
21
|
+
export function injectPageMeta(html, options) {
|
|
22
|
+
const site = resolveSite(options.site);
|
|
23
|
+
const meta = pageMetaFor(options.routes, options.url);
|
|
24
|
+
const name = siteDisplayName(site);
|
|
25
|
+
const origin = trimTrailingSlash(options.origin ?? `https://${site.host}`);
|
|
26
|
+
const { title, canonical } = pageDocumentMeta(options);
|
|
27
|
+
const image = absolute(options.image ?? '/og.png', origin);
|
|
28
|
+
const head = [
|
|
29
|
+
`<link rel="canonical" href="${escapeAttribute(canonical)}" />`,
|
|
30
|
+
'<meta property="og:type" content="website" />',
|
|
31
|
+
`<meta property="og:site_name" content="${escapeAttribute(name)}" />`,
|
|
32
|
+
`<meta property="og:title" content="${escapeAttribute(title)}" />`,
|
|
33
|
+
`<meta property="og:description" content="${escapeAttribute(meta.description)}" />`,
|
|
34
|
+
`<meta property="og:url" content="${escapeAttribute(canonical)}" />`,
|
|
35
|
+
`<meta property="og:image" content="${escapeAttribute(image)}" />`,
|
|
36
|
+
'<meta name="twitter:card" content="summary_large_image" />',
|
|
37
|
+
].join('\n');
|
|
38
|
+
return insertBeforeHeadEnd(replaceDescription(replaceTitle(html, title), meta.description), head);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* What the page on screen is called and where it is indexed, for the app to
|
|
42
|
+
* write after an in-app move.
|
|
43
|
+
*
|
|
44
|
+
* The same title and canonical the build wrote into the file it served, so a
|
|
45
|
+
* click that changes the page cannot disagree with the page a crawler fetched.
|
|
46
|
+
* @param options - Which site, which address, and where it is served from.
|
|
47
|
+
* @returns The title, the description and the canonical of that address.
|
|
48
|
+
*/
|
|
49
|
+
export function pageDocumentMeta(options) {
|
|
50
|
+
const site = resolveSite(options.site);
|
|
51
|
+
const meta = pageMetaFor(options.routes, options.url);
|
|
52
|
+
const origin = trimTrailingSlash(options.origin ?? `https://${site.host}`);
|
|
53
|
+
return {
|
|
54
|
+
title: `${meta.title} — ${siteDisplayName(site)}`,
|
|
55
|
+
description: meta.description,
|
|
56
|
+
canonical: `${origin}${meta.path}`,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Put an addition at the end of the head, where a tracking snippet and a
|
|
61
|
+
* structured-data block both belong.
|
|
62
|
+
* @param html - The page.
|
|
63
|
+
* @param addition - The markup to add, taken as written.
|
|
64
|
+
* @returns The page, with the addition before `</head>`.
|
|
65
|
+
*/
|
|
66
|
+
export function insertBeforeHeadEnd(html, addition) {
|
|
67
|
+
const head = html.lastIndexOf('</head>');
|
|
68
|
+
if (head === -1)
|
|
69
|
+
return `${html}\n${addition}\n`;
|
|
70
|
+
return `${html.slice(0, head)}${addition}\n${html.slice(head)}`;
|
|
71
|
+
}
|
|
72
|
+
function resolveSite(site) {
|
|
73
|
+
return typeof site === 'string' ? siteById(site) : site;
|
|
74
|
+
}
|
|
75
|
+
function absolute(target, origin) {
|
|
76
|
+
return target.startsWith('/') ? `${origin}${target}` : target;
|
|
77
|
+
}
|
|
78
|
+
function replaceTitle(html, title) {
|
|
79
|
+
const replacement = `<title>${escapeText(title)}</title>`;
|
|
80
|
+
return html.includes('<title>')
|
|
81
|
+
? html.replace(/<title>[\s\S]*?<\/title>/, replacement)
|
|
82
|
+
: insertBeforeHeadEnd(html, replacement);
|
|
83
|
+
}
|
|
84
|
+
function replaceDescription(html, description) {
|
|
85
|
+
const replacement = `<meta name="description" content="${escapeAttribute(description)}" />`;
|
|
86
|
+
const existing = /<meta[^>]*name="description"[^>]*>/;
|
|
87
|
+
return existing.test(html)
|
|
88
|
+
? html.replace(existing, replacement)
|
|
89
|
+
: insertBeforeHeadEnd(html, replacement);
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=pageMeta.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pageMeta.js","sourceRoot":"","sources":["../../../src/seo/core/pageMeta.ts"],"names":[],"mappings":"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"}
|