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,129 @@
|
|
|
1
|
+
import { Button } from '@blueprintjs/core';
|
|
2
|
+
import type { CSSProperties, ReactElement, ReactNode } from 'react';
|
|
3
|
+
|
|
4
|
+
export interface ExerciseActionsProps {
|
|
5
|
+
/**
|
|
6
|
+
* Records the attempt. Grading itself runs on every keystroke, so this
|
|
7
|
+
* button commits the verdict rather than producing it.
|
|
8
|
+
* @default undefined — no Check button
|
|
9
|
+
*/
|
|
10
|
+
onCheck?: () => void;
|
|
11
|
+
/**
|
|
12
|
+
* Text of the Check button.
|
|
13
|
+
* @default 'Check'
|
|
14
|
+
*/
|
|
15
|
+
checkLabel?: string;
|
|
16
|
+
/**
|
|
17
|
+
* Whether checking is impossible yet — nothing typed, nothing drawn.
|
|
18
|
+
* @default false
|
|
19
|
+
*/
|
|
20
|
+
checkDisabled?: boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Opens the next hint.
|
|
23
|
+
* @default undefined — no hint button; the ladder may carry its own
|
|
24
|
+
*/
|
|
25
|
+
onRevealHint?: () => void;
|
|
26
|
+
/**
|
|
27
|
+
* How many hints are already open, for the button's count.
|
|
28
|
+
* @default 0
|
|
29
|
+
*/
|
|
30
|
+
hintsRevealed?: number;
|
|
31
|
+
/**
|
|
32
|
+
* How many hints the exercise has, for the button's count.
|
|
33
|
+
* @default 0
|
|
34
|
+
*/
|
|
35
|
+
hintCount?: number;
|
|
36
|
+
/**
|
|
37
|
+
* Shows or hides the sample answer. Never gated behind anything: getting
|
|
38
|
+
* stuck and reading the answer is part of how the intuition is built.
|
|
39
|
+
* @default undefined — no solution button
|
|
40
|
+
*/
|
|
41
|
+
onToggleSolution?: () => void;
|
|
42
|
+
/**
|
|
43
|
+
* Whether the sample answer is on screen, which is what the button offers to
|
|
44
|
+
* undo.
|
|
45
|
+
* @default false
|
|
46
|
+
*/
|
|
47
|
+
showSolution?: boolean;
|
|
48
|
+
/**
|
|
49
|
+
* Puts the exercise back to a blank answer, no hints and no solution.
|
|
50
|
+
* @default undefined — no Reset button
|
|
51
|
+
*/
|
|
52
|
+
onReset?: () => void;
|
|
53
|
+
/**
|
|
54
|
+
* The buttons this tool adds — show the diagram, show the 3D view — rendered
|
|
55
|
+
* after the four standard ones.
|
|
56
|
+
* @default undefined
|
|
57
|
+
*/
|
|
58
|
+
children?: ReactNode;
|
|
59
|
+
/**
|
|
60
|
+
* Class the row carries, so a site can reach it from its stylesheet.
|
|
61
|
+
* @default undefined
|
|
62
|
+
*/
|
|
63
|
+
className?: string;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* The row of controls under an exercise: Check, Reveal hint, the solution, and
|
|
68
|
+
* Reset.
|
|
69
|
+
*
|
|
70
|
+
* Every one of them is optional, because a tool that grades live has no Check
|
|
71
|
+
* and a tool with a single-field answer has no Reset — what matters is that the
|
|
72
|
+
* ones a tool does offer read the same and sit in the same order everywhere.
|
|
73
|
+
* @param props - The actions the exercise offers.
|
|
74
|
+
* @returns The row.
|
|
75
|
+
*/
|
|
76
|
+
export function ExerciseActions(props: ExerciseActionsProps): ReactElement {
|
|
77
|
+
const {
|
|
78
|
+
onCheck,
|
|
79
|
+
checkLabel = 'Check',
|
|
80
|
+
checkDisabled = false,
|
|
81
|
+
onRevealHint,
|
|
82
|
+
hintsRevealed = 0,
|
|
83
|
+
hintCount = 0,
|
|
84
|
+
onToggleSolution,
|
|
85
|
+
showSolution = false,
|
|
86
|
+
onReset,
|
|
87
|
+
children,
|
|
88
|
+
className,
|
|
89
|
+
} = props;
|
|
90
|
+
|
|
91
|
+
return (
|
|
92
|
+
<div className={className} style={ROW_STYLE}>
|
|
93
|
+
{onCheck !== undefined && (
|
|
94
|
+
<Button
|
|
95
|
+
intent="primary"
|
|
96
|
+
icon="tick"
|
|
97
|
+
text={checkLabel}
|
|
98
|
+
disabled={checkDisabled}
|
|
99
|
+
onClick={onCheck}
|
|
100
|
+
/>
|
|
101
|
+
)}
|
|
102
|
+
{onRevealHint !== undefined && (
|
|
103
|
+
<Button
|
|
104
|
+
icon="lightbulb"
|
|
105
|
+
text={`Reveal hint (${Math.min(hintsRevealed, hintCount)}/${hintCount})`}
|
|
106
|
+
disabled={hintsRevealed >= hintCount}
|
|
107
|
+
onClick={onRevealHint}
|
|
108
|
+
/>
|
|
109
|
+
)}
|
|
110
|
+
{onToggleSolution !== undefined && (
|
|
111
|
+
<Button
|
|
112
|
+
icon={showSolution ? 'eye-off' : 'key'}
|
|
113
|
+
text={showSolution ? 'Hide solution' : 'Reveal solution'}
|
|
114
|
+
onClick={onToggleSolution}
|
|
115
|
+
/>
|
|
116
|
+
)}
|
|
117
|
+
{onReset !== undefined && (
|
|
118
|
+
<Button icon="reset" text="Reset" onClick={onReset} />
|
|
119
|
+
)}
|
|
120
|
+
{children}
|
|
121
|
+
</div>
|
|
122
|
+
);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
const ROW_STYLE: CSSProperties = {
|
|
126
|
+
display: 'flex',
|
|
127
|
+
flexWrap: 'wrap',
|
|
128
|
+
gap: 6,
|
|
129
|
+
};
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { Alert, Button, ProgressBar } from '@blueprintjs/core';
|
|
2
|
+
import type { CSSProperties, ReactElement, ReactNode } from 'react';
|
|
3
|
+
import { useState } from 'react';
|
|
4
|
+
|
|
5
|
+
import type { ProgressSummary } from '../core/progress.ts';
|
|
6
|
+
|
|
7
|
+
export interface ExerciseProgressHeaderProps {
|
|
8
|
+
/** Where the student stands, as `progressSummary` counted it. */
|
|
9
|
+
summary: ProgressSummary;
|
|
10
|
+
/**
|
|
11
|
+
* Throws away every answer, every revealed hint and every solved exercise.
|
|
12
|
+
* Guarded by a dialog the student has to confirm.
|
|
13
|
+
* @default undefined — the header only reports, and offers no way to wipe
|
|
14
|
+
*/
|
|
15
|
+
onClearAll?: () => void;
|
|
16
|
+
/**
|
|
17
|
+
* Text of the button that wipes the work.
|
|
18
|
+
* @default 'Clear all answers'
|
|
19
|
+
*/
|
|
20
|
+
clearLabel?: string;
|
|
21
|
+
/**
|
|
22
|
+
* What the confirmation dialog says before the work is thrown away.
|
|
23
|
+
* @default a sentence saying what is lost and that there is no undo
|
|
24
|
+
*/
|
|
25
|
+
clearWarning?: ReactNode;
|
|
26
|
+
/**
|
|
27
|
+
* Whether the button is dead — there is nothing stored to wipe.
|
|
28
|
+
* @default false
|
|
29
|
+
*/
|
|
30
|
+
clearDisabled?: boolean;
|
|
31
|
+
/**
|
|
32
|
+
* Class the header carries, so a site can reach it from its stylesheet.
|
|
33
|
+
* @default undefined
|
|
34
|
+
*/
|
|
35
|
+
className?: string;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* How much of a set is solved, its bar, and the one way to wipe it.
|
|
40
|
+
*
|
|
41
|
+
* Wiping goes through a real dialog rather than `confirm()`: the button throws
|
|
42
|
+
* away a week of somebody's work, and a native prompt is both unstyled and
|
|
43
|
+
* dismissed by reflex.
|
|
44
|
+
* @param props - The counts, and what clearing does.
|
|
45
|
+
* @returns The header.
|
|
46
|
+
*/
|
|
47
|
+
export function ExerciseProgressHeader(
|
|
48
|
+
props: ExerciseProgressHeaderProps,
|
|
49
|
+
): ReactElement {
|
|
50
|
+
const {
|
|
51
|
+
summary,
|
|
52
|
+
onClearAll,
|
|
53
|
+
clearLabel = 'Clear all answers',
|
|
54
|
+
clearWarning = DEFAULT_WARNING,
|
|
55
|
+
clearDisabled = false,
|
|
56
|
+
className,
|
|
57
|
+
} = props;
|
|
58
|
+
const [confirming, setConfirming] = useState(false);
|
|
59
|
+
const complete = summary.total > 0 && summary.solved === summary.total;
|
|
60
|
+
|
|
61
|
+
return (
|
|
62
|
+
<div className={className} style={ROOT_STYLE}>
|
|
63
|
+
<div style={ROW_STYLE}>
|
|
64
|
+
<span style={COUNT_STYLE}>
|
|
65
|
+
{`${summary.solved} / ${summary.total} solved`}
|
|
66
|
+
</span>
|
|
67
|
+
<span
|
|
68
|
+
style={PERCENT_STYLE}
|
|
69
|
+
>{`${Math.round(summary.ratio * 100)}%`}</span>
|
|
70
|
+
{onClearAll !== undefined && (
|
|
71
|
+
<Button
|
|
72
|
+
size="small"
|
|
73
|
+
variant="minimal"
|
|
74
|
+
intent="danger"
|
|
75
|
+
icon="trash"
|
|
76
|
+
text={clearLabel}
|
|
77
|
+
disabled={clearDisabled}
|
|
78
|
+
onClick={() => {
|
|
79
|
+
setConfirming(true);
|
|
80
|
+
}}
|
|
81
|
+
/>
|
|
82
|
+
)}
|
|
83
|
+
</div>
|
|
84
|
+
|
|
85
|
+
<ProgressBar
|
|
86
|
+
animate={false}
|
|
87
|
+
stripes={false}
|
|
88
|
+
intent={complete ? 'success' : 'primary'}
|
|
89
|
+
value={summary.ratio}
|
|
90
|
+
/>
|
|
91
|
+
|
|
92
|
+
{onClearAll !== undefined && (
|
|
93
|
+
<Alert
|
|
94
|
+
isOpen={confirming}
|
|
95
|
+
intent="danger"
|
|
96
|
+
icon="trash"
|
|
97
|
+
cancelButtonText="Keep my answers"
|
|
98
|
+
confirmButtonText="Clear everything"
|
|
99
|
+
onCancel={() => {
|
|
100
|
+
setConfirming(false);
|
|
101
|
+
}}
|
|
102
|
+
onConfirm={() => {
|
|
103
|
+
onClearAll();
|
|
104
|
+
setConfirming(false);
|
|
105
|
+
}}
|
|
106
|
+
>
|
|
107
|
+
{clearWarning}
|
|
108
|
+
</Alert>
|
|
109
|
+
)}
|
|
110
|
+
</div>
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
const DEFAULT_WARNING =
|
|
115
|
+
'This forgets every answer, every revealed hint and every solved exercise, on this browser. There is no undo.';
|
|
116
|
+
|
|
117
|
+
const ROOT_STYLE: CSSProperties = {
|
|
118
|
+
display: 'flex',
|
|
119
|
+
flexDirection: 'column',
|
|
120
|
+
gap: 6,
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
const ROW_STYLE: CSSProperties = {
|
|
124
|
+
display: 'flex',
|
|
125
|
+
alignItems: 'center',
|
|
126
|
+
gap: 8,
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
const COUNT_STYLE: CSSProperties = { fontWeight: 600 };
|
|
130
|
+
|
|
131
|
+
const PERCENT_STYLE: CSSProperties = {
|
|
132
|
+
color: '#5b6875',
|
|
133
|
+
flex: '1 1 auto',
|
|
134
|
+
fontSize: 12,
|
|
135
|
+
};
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { Icon, Tag } from '@blueprintjs/core';
|
|
2
|
+
import type { ReactElement } from 'react';
|
|
3
|
+
|
|
4
|
+
import type { ExerciseLevel, ExerciseStatus } from '../core/types.ts';
|
|
5
|
+
|
|
6
|
+
import { LEVEL_INTENT, STATUS_ICON, STATUS_INTENT } from './exerciseMeta.ts';
|
|
7
|
+
|
|
8
|
+
export interface ExerciseLevelTagProps {
|
|
9
|
+
level: ExerciseLevel;
|
|
10
|
+
/**
|
|
11
|
+
* What the tag reads.
|
|
12
|
+
* @default the level itself — `beginner`, `intermediate`, `advanced`
|
|
13
|
+
*/
|
|
14
|
+
label?: string;
|
|
15
|
+
/**
|
|
16
|
+
* Whether the tag is the one currently selected, which fills it in rather
|
|
17
|
+
* than leaving it minimal. Its colour does not depend on this: a level that
|
|
18
|
+
* is filtered out is still that level, and a tag that dropped to `none` when
|
|
19
|
+
* switched off would say the difficulty had changed.
|
|
20
|
+
* @default false
|
|
21
|
+
*/
|
|
22
|
+
active?: boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Called when the tag is clicked, which also makes it interactive.
|
|
25
|
+
* @default undefined — the tag only reports the level
|
|
26
|
+
*/
|
|
27
|
+
onClick?: () => void;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* The difficulty of an exercise or a step, as a coloured tag.
|
|
32
|
+
* @param props - The level, and whether it is the selected one.
|
|
33
|
+
* @returns The tag.
|
|
34
|
+
*/
|
|
35
|
+
export function ExerciseLevelTag(props: ExerciseLevelTagProps): ReactElement {
|
|
36
|
+
const { level, label = level, active = false, onClick } = props;
|
|
37
|
+
|
|
38
|
+
return (
|
|
39
|
+
<Tag
|
|
40
|
+
round
|
|
41
|
+
minimal={!active}
|
|
42
|
+
active={active}
|
|
43
|
+
intent={LEVEL_INTENT[level]}
|
|
44
|
+
interactive={onClick !== undefined}
|
|
45
|
+
onClick={onClick}
|
|
46
|
+
>
|
|
47
|
+
{label}
|
|
48
|
+
</Tag>
|
|
49
|
+
);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export interface ExerciseStatusIconProps {
|
|
53
|
+
status: ExerciseStatus;
|
|
54
|
+
/**
|
|
55
|
+
* What the pointer and a screen reader are told.
|
|
56
|
+
* @default the status itself — `idle`, `attempted`, `solved`
|
|
57
|
+
*/
|
|
58
|
+
title?: string;
|
|
59
|
+
/**
|
|
60
|
+
* Size of the glyph, in pixels.
|
|
61
|
+
* @default undefined — Blueprint's standard 16
|
|
62
|
+
*/
|
|
63
|
+
size?: number;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Where a student stands on one exercise, as the glyph in front of its title.
|
|
68
|
+
* @param props - The status, and how it is announced.
|
|
69
|
+
* @returns The icon.
|
|
70
|
+
*/
|
|
71
|
+
export function ExerciseStatusIcon(
|
|
72
|
+
props: ExerciseStatusIconProps,
|
|
73
|
+
): ReactElement {
|
|
74
|
+
const { status, title = status, size } = props;
|
|
75
|
+
|
|
76
|
+
return (
|
|
77
|
+
<Icon
|
|
78
|
+
icon={STATUS_ICON[status]}
|
|
79
|
+
intent={STATUS_INTENT[status]}
|
|
80
|
+
size={size}
|
|
81
|
+
title={title}
|
|
82
|
+
aria-label={title}
|
|
83
|
+
/>
|
|
84
|
+
);
|
|
85
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { ReactElement, ReactNode } from 'react';
|
|
2
|
+
|
|
3
|
+
import type { Glossary } from '../core/glossary.ts';
|
|
4
|
+
|
|
5
|
+
import { GlossaryContext } from './glossaryContext.ts';
|
|
6
|
+
|
|
7
|
+
export interface GlossaryProviderProps {
|
|
8
|
+
/** Every term the site defines, keyed by the lowercased text of a marker. */
|
|
9
|
+
glossary: Glossary;
|
|
10
|
+
/** The part of the page whose prose resolves its markers against it. */
|
|
11
|
+
children: ReactNode;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Hand a glossary to every piece of prose below it.
|
|
16
|
+
*
|
|
17
|
+
* Wrap the whole tool once, high enough that a tutorial step, an exercise
|
|
18
|
+
* description and a revealed hint all sit under it: they are the three places
|
|
19
|
+
* jargon is linked, and they must define a term the same way.
|
|
20
|
+
* @param props - The terms, and the tree that uses them.
|
|
21
|
+
* @returns The tree, with the glossary in reach.
|
|
22
|
+
*/
|
|
23
|
+
export function GlossaryProvider(props: GlossaryProviderProps): ReactElement {
|
|
24
|
+
const { glossary, children } = props;
|
|
25
|
+
|
|
26
|
+
return (
|
|
27
|
+
<GlossaryContext.Provider value={glossary}>
|
|
28
|
+
{children}
|
|
29
|
+
</GlossaryContext.Provider>
|
|
30
|
+
);
|
|
31
|
+
}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import type { Placement } from '@blueprintjs/core';
|
|
2
|
+
import { Tooltip } from '@blueprintjs/core';
|
|
3
|
+
import type { CSSProperties, ReactElement, ReactNode } from 'react';
|
|
4
|
+
import { Fragment } from 'react';
|
|
5
|
+
|
|
6
|
+
import type { Glossary, GlossaryEntry } from '../core/glossary.ts';
|
|
7
|
+
import { lookupGlossaryTerm, parseGlossaryMarkers } from '../core/glossary.ts';
|
|
8
|
+
|
|
9
|
+
import { useGlossary } from './glossaryContext.ts';
|
|
10
|
+
|
|
11
|
+
export interface GlossaryTextProps {
|
|
12
|
+
/**
|
|
13
|
+
* Authored prose. Every `[[term]]` — or `[[term|displayed text]]` — the
|
|
14
|
+
* glossary knows becomes a hoverable chip.
|
|
15
|
+
*/
|
|
16
|
+
text: string;
|
|
17
|
+
/**
|
|
18
|
+
* Terms to resolve against, instead of the ones the surrounding provider
|
|
19
|
+
* holds. A page showing two vocabularies side by side passes its own here.
|
|
20
|
+
* @default undefined — the glossary of the surrounding `GlossaryProvider`
|
|
21
|
+
*/
|
|
22
|
+
glossary?: Glossary;
|
|
23
|
+
/**
|
|
24
|
+
* Side the definition opens on.
|
|
25
|
+
* @default 'bottom'
|
|
26
|
+
*/
|
|
27
|
+
placement?: Placement;
|
|
28
|
+
/**
|
|
29
|
+
* Class every chip carries, so a site can reach them from its stylesheet.
|
|
30
|
+
* @default 'glossary-term'
|
|
31
|
+
*/
|
|
32
|
+
className?: string;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Render authored prose, turning its markers into hoverable definitions.
|
|
37
|
+
*
|
|
38
|
+
* A term the glossary has no entry for renders as its plain text, never as the
|
|
39
|
+
* brackets: prose is allowed to link a word months before anybody writes its
|
|
40
|
+
* definition, and the page must keep reading in the meantime.
|
|
41
|
+
* @param props - The prose, and where its terms are defined.
|
|
42
|
+
* @returns The prose, with the known terms made hoverable.
|
|
43
|
+
*/
|
|
44
|
+
export function GlossaryText(props: GlossaryTextProps): ReactElement {
|
|
45
|
+
const {
|
|
46
|
+
text,
|
|
47
|
+
glossary,
|
|
48
|
+
placement = 'bottom',
|
|
49
|
+
className = 'glossary-term',
|
|
50
|
+
} = props;
|
|
51
|
+
const fromProvider = useGlossary();
|
|
52
|
+
const terms = glossary ?? fromProvider;
|
|
53
|
+
|
|
54
|
+
const pieces: ReactNode[] = [];
|
|
55
|
+
for (const segment of parseGlossaryMarkers(text)) {
|
|
56
|
+
const entry =
|
|
57
|
+
segment.kind === 'term'
|
|
58
|
+
? lookupGlossaryTerm(terms, segment.term)
|
|
59
|
+
: undefined;
|
|
60
|
+
if (entry === undefined) {
|
|
61
|
+
pieces.push(<Fragment key={segment.start}>{segment.text}</Fragment>);
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
pieces.push(
|
|
65
|
+
<Tooltip
|
|
66
|
+
key={segment.start}
|
|
67
|
+
content={<GlossaryTooltipBody entry={entry} />}
|
|
68
|
+
hoverOpenDelay={HOVER_OPEN_DELAY}
|
|
69
|
+
placement={placement}
|
|
70
|
+
>
|
|
71
|
+
<span className={className} style={TERM_STYLE}>
|
|
72
|
+
{segment.text}
|
|
73
|
+
</span>
|
|
74
|
+
</Tooltip>,
|
|
75
|
+
);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
return <>{pieces}</>;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export interface GlossaryTooltipBodyProps {
|
|
82
|
+
/** The term to explain, already resolved from a marker. */
|
|
83
|
+
entry: GlossaryEntry;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* The definition itself: the term, one paragraph, then the worked examples.
|
|
88
|
+
*
|
|
89
|
+
* Exported on its own so a glossary page can list every term with the body it
|
|
90
|
+
* shows on hover, rather than describing the same entry twice.
|
|
91
|
+
* @param props - The entry to show.
|
|
92
|
+
* @returns The body of the tooltip.
|
|
93
|
+
*/
|
|
94
|
+
export function GlossaryTooltipBody(
|
|
95
|
+
props: GlossaryTooltipBodyProps,
|
|
96
|
+
): ReactElement {
|
|
97
|
+
const { entry } = props;
|
|
98
|
+
|
|
99
|
+
return (
|
|
100
|
+
<div style={BODY_STYLE}>
|
|
101
|
+
<div style={TITLE_STYLE}>{entry.title}</div>
|
|
102
|
+
<div style={SUMMARY_STYLE}>{entry.summary}</div>
|
|
103
|
+
{entry.examples.length > 0 && (
|
|
104
|
+
<ul style={LIST_STYLE}>
|
|
105
|
+
{entry.examples.map((example) => (
|
|
106
|
+
<li key={`${example.code}::${example.input ?? ''}`}>
|
|
107
|
+
<code style={CODE_STYLE}>{example.code}</code>
|
|
108
|
+
{example.input !== undefined && (
|
|
109
|
+
<span style={INPUT_STYLE}>{` on ${example.input}`}</span>
|
|
110
|
+
)}
|
|
111
|
+
{example.note !== undefined && (
|
|
112
|
+
<div style={NOTE_STYLE}>{example.note}</div>
|
|
113
|
+
)}
|
|
114
|
+
</li>
|
|
115
|
+
))}
|
|
116
|
+
</ul>
|
|
117
|
+
)}
|
|
118
|
+
</div>
|
|
119
|
+
);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/** Long enough that the pointer can cross a chip without opening it. */
|
|
123
|
+
const HOVER_OPEN_DELAY = 150;
|
|
124
|
+
|
|
125
|
+
const TERM_STYLE: CSSProperties = {
|
|
126
|
+
borderBottom: '1px dotted currentColor',
|
|
127
|
+
color: 'var(--accent, inherit)',
|
|
128
|
+
cursor: 'help',
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
const BODY_STYLE: CSSProperties = {
|
|
132
|
+
display: 'flex',
|
|
133
|
+
flexDirection: 'column',
|
|
134
|
+
gap: 6,
|
|
135
|
+
maxWidth: 340,
|
|
136
|
+
};
|
|
137
|
+
|
|
138
|
+
const TITLE_STYLE: CSSProperties = { fontWeight: 600, fontSize: 13 };
|
|
139
|
+
|
|
140
|
+
const SUMMARY_STYLE: CSSProperties = {
|
|
141
|
+
fontSize: 12,
|
|
142
|
+
lineHeight: 1.45,
|
|
143
|
+
color: '#d3d8de',
|
|
144
|
+
};
|
|
145
|
+
|
|
146
|
+
const LIST_STYLE: CSSProperties = {
|
|
147
|
+
display: 'flex',
|
|
148
|
+
flexDirection: 'column',
|
|
149
|
+
gap: 4,
|
|
150
|
+
margin: 0,
|
|
151
|
+
paddingLeft: 16,
|
|
152
|
+
fontSize: 12,
|
|
153
|
+
lineHeight: 1.4,
|
|
154
|
+
};
|
|
155
|
+
|
|
156
|
+
const CODE_STYLE: CSSProperties = {
|
|
157
|
+
fontFamily: 'ui-monospace, SFMono-Regular, Menlo, Consolas, monospace',
|
|
158
|
+
fontWeight: 600,
|
|
159
|
+
color: '#8abbff',
|
|
160
|
+
};
|
|
161
|
+
|
|
162
|
+
const INPUT_STYLE: CSSProperties = { color: '#f6f7f9' };
|
|
163
|
+
|
|
164
|
+
const NOTE_STYLE: CSSProperties = { fontStyle: 'italic', color: '#abb3bf' };
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { Button, Callout } from '@blueprintjs/core';
|
|
2
|
+
import type { CSSProperties, ReactElement } from 'react';
|
|
3
|
+
|
|
4
|
+
import { GlossaryText } from './GlossaryText.tsx';
|
|
5
|
+
|
|
6
|
+
export interface HintLadderProps {
|
|
7
|
+
/** Every hint of the exercise, ordered from a nudge to almost the answer. */
|
|
8
|
+
hints: readonly string[];
|
|
9
|
+
/**
|
|
10
|
+
* How many the student has asked for. A count outside the ladder is read as
|
|
11
|
+
* one of its ends, so a stored value from a shorter or longer ladder still
|
|
12
|
+
* opens the page.
|
|
13
|
+
*/
|
|
14
|
+
revealed: number;
|
|
15
|
+
/**
|
|
16
|
+
* Opens the next hint. Leave it out where the button lives elsewhere — in
|
|
17
|
+
* `ExerciseActions`, say — and the ladder only shows what is already open.
|
|
18
|
+
* @default undefined — no button
|
|
19
|
+
*/
|
|
20
|
+
onReveal?: () => void;
|
|
21
|
+
/**
|
|
22
|
+
* Text of the button, before its count.
|
|
23
|
+
* @default 'Reveal hint'
|
|
24
|
+
*/
|
|
25
|
+
revealLabel?: string;
|
|
26
|
+
/**
|
|
27
|
+
* Heading over the hints.
|
|
28
|
+
* @default 'Hints'
|
|
29
|
+
*/
|
|
30
|
+
title?: string;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* The hints asked for so far, and the button that opens the next one.
|
|
35
|
+
*
|
|
36
|
+
* One at a time, in order: a ladder that dumped all four at once is a solution
|
|
37
|
+
* with extra steps. The prose goes through the glossary, so a hint may link its
|
|
38
|
+
* jargon exactly like the statement above it.
|
|
39
|
+
* @param props - The ladder, how much of it is open, and how to open more.
|
|
40
|
+
* @returns The hints, or nothing while none is open and none can be.
|
|
41
|
+
*/
|
|
42
|
+
export function HintLadder(props: HintLadderProps): ReactElement | null {
|
|
43
|
+
const {
|
|
44
|
+
hints,
|
|
45
|
+
revealed,
|
|
46
|
+
onReveal,
|
|
47
|
+
revealLabel = 'Reveal hint',
|
|
48
|
+
title = 'Hints',
|
|
49
|
+
} = props;
|
|
50
|
+
const open = clampRevealed(revealed, hints.length);
|
|
51
|
+
const exhausted = open >= hints.length;
|
|
52
|
+
if (open === 0 && (onReveal === undefined || hints.length === 0)) return null;
|
|
53
|
+
|
|
54
|
+
return (
|
|
55
|
+
<div style={ROOT_STYLE}>
|
|
56
|
+
{onReveal !== undefined && hints.length > 0 && (
|
|
57
|
+
<div>
|
|
58
|
+
<Button
|
|
59
|
+
icon="lightbulb"
|
|
60
|
+
text={`${revealLabel} (${open}/${hints.length})`}
|
|
61
|
+
disabled={exhausted}
|
|
62
|
+
onClick={onReveal}
|
|
63
|
+
/>
|
|
64
|
+
</div>
|
|
65
|
+
)}
|
|
66
|
+
|
|
67
|
+
{open > 0 && (
|
|
68
|
+
<Callout intent="primary" icon="lightbulb" title={title}>
|
|
69
|
+
<ol style={LIST_STYLE}>
|
|
70
|
+
{hints.slice(0, open).map((hint) => (
|
|
71
|
+
<li key={hint} style={ITEM_STYLE}>
|
|
72
|
+
<GlossaryText text={hint} />
|
|
73
|
+
</li>
|
|
74
|
+
))}
|
|
75
|
+
</ol>
|
|
76
|
+
</Callout>
|
|
77
|
+
)}
|
|
78
|
+
</div>
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function clampRevealed(revealed: number, total: number): number {
|
|
83
|
+
if (!Number.isFinite(revealed) || revealed <= 0) return 0;
|
|
84
|
+
return Math.min(Math.floor(revealed), total);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
const ROOT_STYLE: CSSProperties = {
|
|
88
|
+
display: 'flex',
|
|
89
|
+
flexDirection: 'column',
|
|
90
|
+
gap: 8,
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
const LIST_STYLE: CSSProperties = { margin: 0, paddingLeft: 18 };
|
|
94
|
+
|
|
95
|
+
const ITEM_STYLE: CSSProperties = { lineHeight: 1.45 };
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import type { CSSProperties, ReactElement } from 'react';
|
|
2
|
+
|
|
3
|
+
import type { ReferenceSection } from './ReferenceSectionBlock.tsx';
|
|
4
|
+
import { ReferenceSectionBlock } from './ReferenceSectionBlock.tsx';
|
|
5
|
+
|
|
6
|
+
export interface ReferenceGridProps {
|
|
7
|
+
/** The blocks of the cheatsheet, in reading order. */
|
|
8
|
+
sections: readonly ReferenceSection[];
|
|
9
|
+
/**
|
|
10
|
+
* Width under which a column wraps to the next line, in pixels.
|
|
11
|
+
* @default 320
|
|
12
|
+
*/
|
|
13
|
+
minColumnWidth?: number;
|
|
14
|
+
/**
|
|
15
|
+
* Width of the syntax column of every block, so they line up across columns.
|
|
16
|
+
* @default 150
|
|
17
|
+
*/
|
|
18
|
+
syntaxWidth?: number | string;
|
|
19
|
+
/**
|
|
20
|
+
* Class the grid carries, in addition to `reference-grid`.
|
|
21
|
+
* @default undefined
|
|
22
|
+
*/
|
|
23
|
+
className?: string;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* The whole cheatsheet: as many columns as the paper or the window allows.
|
|
28
|
+
*
|
|
29
|
+
* Students print this page and take it into an exam room, so the columns
|
|
30
|
+
* reflow to the sheet and every block is kept off a page break.
|
|
31
|
+
* @param props - The sections, and how they are laid out.
|
|
32
|
+
* @returns The grid.
|
|
33
|
+
*/
|
|
34
|
+
export function ReferenceGrid(props: ReferenceGridProps): ReactElement {
|
|
35
|
+
const {
|
|
36
|
+
sections,
|
|
37
|
+
minColumnWidth = 320,
|
|
38
|
+
syntaxWidth = 150,
|
|
39
|
+
className,
|
|
40
|
+
} = props;
|
|
41
|
+
|
|
42
|
+
return (
|
|
43
|
+
<div
|
|
44
|
+
className={
|
|
45
|
+
className === undefined
|
|
46
|
+
? 'reference-grid'
|
|
47
|
+
: `reference-grid ${className}`
|
|
48
|
+
}
|
|
49
|
+
style={gridStyle(minColumnWidth)}
|
|
50
|
+
>
|
|
51
|
+
{sections.map((section) => (
|
|
52
|
+
<ReferenceSectionBlock
|
|
53
|
+
key={section.id}
|
|
54
|
+
section={section}
|
|
55
|
+
syntaxWidth={syntaxWidth}
|
|
56
|
+
/>
|
|
57
|
+
))}
|
|
58
|
+
</div>
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function gridStyle(minColumnWidth: number): CSSProperties {
|
|
63
|
+
return {
|
|
64
|
+
display: 'grid',
|
|
65
|
+
gridTemplateColumns: `repeat(auto-fit, minmax(${minColumnWidth}px, 1fr))`,
|
|
66
|
+
gap: '10px 24px',
|
|
67
|
+
alignItems: 'start',
|
|
68
|
+
};
|
|
69
|
+
}
|