markdown-flow-ui 0.2.13 → 0.2.15
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 +7 -0
- package/dist/_virtual/index.es3.js +5 -4
- package/dist/_virtual/index.es3.js.map +1 -1
- package/dist/_virtual/index.es4.js +4 -5
- package/dist/_virtual/index.es4.js.map +1 -1
- package/dist/_virtual/index3.cjs +1 -1
- package/dist/_virtual/index4.cjs +1 -1
- package/dist/assets/markdown-flow-ui.css +10 -1
- package/dist/components/ContentRender/CodeBlock.cjs +1 -1
- package/dist/components/ContentRender/CodeBlock.cjs.map +1 -1
- package/dist/components/ContentRender/CodeBlock.d.ts +5 -0
- package/dist/components/ContentRender/CodeBlock.es.js +41 -38
- package/dist/components/ContentRender/CodeBlock.es.js.map +1 -1
- package/dist/components/ContentRender/ContentRender.cjs +2 -2
- package/dist/components/ContentRender/ContentRender.cjs.map +1 -1
- package/dist/components/ContentRender/ContentRender.d.ts +9 -4
- package/dist/components/ContentRender/ContentRender.es.js +389 -298
- package/dist/components/ContentRender/ContentRender.es.js.map +1 -1
- package/dist/components/ContentRender/IframeSandbox.cjs +7 -7
- package/dist/components/ContentRender/IframeSandbox.cjs.map +1 -1
- package/dist/components/ContentRender/IframeSandbox.d.ts +5 -1
- package/dist/components/ContentRender/IframeSandbox.es.js +311 -266
- package/dist/components/ContentRender/IframeSandbox.es.js.map +1 -1
- package/dist/components/ContentRender/MarkdownFlowInput.cjs +1 -1
- package/dist/components/ContentRender/MarkdownFlowInput.cjs.map +1 -1
- package/dist/components/ContentRender/MarkdownFlowInput.d.ts +5 -1
- package/dist/components/ContentRender/MarkdownFlowInput.es.js +37 -32
- package/dist/components/ContentRender/MarkdownFlowInput.es.js.map +1 -1
- package/dist/components/ContentRender/SandboxApp.cjs +2 -2
- package/dist/components/ContentRender/SandboxApp.cjs.map +1 -1
- package/dist/components/ContentRender/SandboxApp.d.ts +5 -1
- package/dist/components/ContentRender/SandboxApp.es.js +108 -103
- package/dist/components/ContentRender/SandboxApp.es.js.map +1 -1
- package/dist/components/ContentRender/blackboard-vendor.d.ts +1 -1
- package/dist/components/ContentRender/contentRenderI18n.cjs +1 -1
- package/dist/components/ContentRender/contentRenderI18n.cjs.map +1 -1
- package/dist/components/ContentRender/contentRenderI18n.d.ts +6 -1
- package/dist/components/ContentRender/contentRenderI18n.es.js +5 -56
- package/dist/components/ContentRender/contentRenderI18n.es.js.map +1 -1
- package/dist/components/ContentRender/contentRenderI18n.test.d.ts +1 -0
- package/dist/components/ContentRender/index.cjs +1 -1
- package/dist/components/ContentRender/index.d.ts +11 -11
- package/dist/components/ContentRender/index.es.js +1 -2
- package/dist/components/ContentRender/index.es.js.map +1 -1
- package/dist/components/ContentRender/locales/contentRender.json.cjs +2 -0
- package/dist/components/ContentRender/locales/contentRender.json.cjs.map +1 -0
- package/dist/components/ContentRender/locales/contentRender.json.d.ts +90 -0
- package/dist/components/ContentRender/locales/contentRender.json.es.js +11 -0
- package/dist/components/ContentRender/locales/contentRender.json.es.js.map +1 -0
- package/dist/components/ContentRender/plugins/CustomVariable.cjs +1 -1
- package/dist/components/ContentRender/plugins/CustomVariable.cjs.map +1 -1
- package/dist/components/ContentRender/plugins/CustomVariable.d.ts +7 -3
- package/dist/components/ContentRender/plugins/CustomVariable.es.js +165 -151
- package/dist/components/ContentRender/plugins/CustomVariable.es.js.map +1 -1
- package/dist/components/ContentRender/plugins/MermaidChart.cjs +1 -1
- package/dist/components/ContentRender/plugins/MermaidChart.cjs.map +1 -1
- package/dist/components/ContentRender/plugins/MermaidChart.d.ts +1 -0
- package/dist/components/ContentRender/plugins/MermaidChart.es.js +68 -44
- package/dist/components/ContentRender/plugins/MermaidChart.es.js.map +1 -1
- package/dist/components/MarkdownFlow/MarkdownFlow.cjs +1 -1
- package/dist/components/MarkdownFlow/MarkdownFlow.cjs.map +1 -1
- package/dist/components/MarkdownFlow/MarkdownFlow.d.ts +12 -4
- package/dist/components/MarkdownFlow/MarkdownFlow.es.js +51 -39
- package/dist/components/MarkdownFlow/MarkdownFlow.es.js.map +1 -1
- package/dist/components/MarkdownFlow/ScrollToBottomButton.cjs +1 -1
- package/dist/components/MarkdownFlow/ScrollToBottomButton.cjs.map +1 -1
- package/dist/components/MarkdownFlow/ScrollToBottomButton.d.ts +31 -1
- package/dist/components/MarkdownFlow/ScrollToBottomButton.es.js +46 -17
- package/dist/components/MarkdownFlow/ScrollToBottomButton.es.js.map +1 -1
- package/dist/components/MarkdownFlow/ScrollToBottomControl.cjs +2 -0
- package/dist/components/MarkdownFlow/ScrollToBottomControl.cjs.map +1 -0
- package/dist/components/MarkdownFlow/ScrollToBottomControl.d.ts +18 -0
- package/dist/components/MarkdownFlow/ScrollToBottomControl.es.js +47 -0
- package/dist/components/MarkdownFlow/ScrollToBottomControl.es.js.map +1 -0
- package/dist/components/MarkdownFlow/ScrollableMarkdownFlow.cjs +1 -1
- package/dist/components/MarkdownFlow/ScrollableMarkdownFlow.cjs.map +1 -1
- package/dist/components/MarkdownFlow/ScrollableMarkdownFlow.d.ts +1 -1
- package/dist/components/MarkdownFlow/ScrollableMarkdownFlow.es.js +33 -52
- package/dist/components/MarkdownFlow/ScrollableMarkdownFlow.es.js.map +1 -1
- package/dist/components/MarkdownFlow/index.cjs +1 -1
- package/dist/components/MarkdownFlow/index.d.ts +9 -6
- package/dist/components/MarkdownFlow/index.es.js +6 -6
- package/dist/components/MarkdownFlow/index.es.js.map +1 -1
- package/dist/components/MarkdownFlow/useScrollToBottom.cjs +1 -1
- package/dist/components/MarkdownFlow/useScrollToBottom.cjs.map +1 -1
- package/dist/components/MarkdownFlow/useScrollToBottom.d.ts +40 -8
- package/dist/components/MarkdownFlow/useScrollToBottom.es.js +352 -83
- package/dist/components/MarkdownFlow/useScrollToBottom.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/MarkdownFlowEditor.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/MarkdownFlowEditor.cjs.map +1 -1
- package/dist/components/MarkdownFlowEditor/MarkdownFlowEditor.d.ts +5 -3
- package/dist/components/MarkdownFlowEditor/MarkdownFlowEditor.es.js +371 -324
- package/dist/components/MarkdownFlowEditor/MarkdownFlowEditor.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/components/CustomDialog.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/components/CustomDialog.cjs.map +1 -1
- package/dist/components/MarkdownFlowEditor/components/CustomDialog.d.ts +10 -0
- package/dist/components/MarkdownFlowEditor/components/CustomDialog.es.js +22 -19
- package/dist/components/MarkdownFlowEditor/components/CustomDialog.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/components/CustomPopover.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/components/CustomPopover.cjs.map +1 -1
- package/dist/components/MarkdownFlowEditor/components/CustomPopover.d.ts +8 -0
- package/dist/components/MarkdownFlowEditor/components/CustomPopover.es.js +19 -15
- package/dist/components/MarkdownFlowEditor/components/CustomPopover.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/components/EditorToolbar.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/components/EditorToolbar.cjs.map +1 -1
- package/dist/components/MarkdownFlowEditor/components/EditorToolbar.d.ts +4 -1
- package/dist/components/MarkdownFlowEditor/components/EditorToolbar.es.js +99 -93
- package/dist/components/MarkdownFlowEditor/components/EditorToolbar.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/components/ImageInject.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/components/ImageInject.cjs.map +1 -1
- package/dist/components/MarkdownFlowEditor/components/ImageInject.d.ts +1 -1
- package/dist/components/MarkdownFlowEditor/components/ImageInject.es.js +183 -182
- package/dist/components/MarkdownFlowEditor/components/ImageInject.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/components/VariableSearchDropdown.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/components/VariableSearchDropdown.cjs.map +1 -1
- package/dist/components/MarkdownFlowEditor/components/VariableSearchDropdown.d.ts +1 -1
- package/dist/components/MarkdownFlowEditor/components/VariableSearchDropdown.es.js +107 -103
- package/dist/components/MarkdownFlowEditor/components/VariableSearchDropdown.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/components/VariableSelect.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/components/VariableSelect.cjs.map +1 -1
- package/dist/components/MarkdownFlowEditor/components/VariableSelect.d.ts +1 -1
- package/dist/components/MarkdownFlowEditor/components/VariableSelect.es.js +106 -106
- package/dist/components/MarkdownFlowEditor/components/VariableSelect.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/components/VideoInject.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/components/VideoInject.cjs.map +1 -1
- package/dist/components/MarkdownFlowEditor/components/VideoInject.es.js +64 -63
- package/dist/components/MarkdownFlowEditor/components/VideoInject.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/components/icons/ButtonIcon.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/components/icons/ButtonIcon.cjs.map +1 -1
- package/dist/components/MarkdownFlowEditor/components/icons/ButtonIcon.es.js +13 -13
- package/dist/components/MarkdownFlowEditor/components/icons/ButtonIcon.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/components/icons/SearchBracesIcon.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/components/icons/SearchBracesIcon.cjs.map +1 -1
- package/dist/components/MarkdownFlowEditor/components/icons/SearchBracesIcon.es.js +12 -12
- package/dist/components/MarkdownFlowEditor/components/icons/SearchBracesIcon.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/editor-context.d.ts +1 -1
- package/dist/components/MarkdownFlowEditor/editorI18n.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/editorI18n.cjs.map +1 -1
- package/dist/components/MarkdownFlowEditor/editorI18n.d.ts +290 -0
- package/dist/components/MarkdownFlowEditor/editorI18n.es.js +12 -8
- package/dist/components/MarkdownFlowEditor/editorI18n.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/editorI18n.test.d.ts +1 -0
- package/dist/components/MarkdownFlowEditor/index.d.ts +6 -6
- package/dist/components/MarkdownFlowEditor/locales/ar-SA.json.cjs +2 -0
- package/dist/components/MarkdownFlowEditor/locales/ar-SA.json.cjs.map +1 -0
- package/dist/components/MarkdownFlowEditor/locales/ar-SA.json.d.ts +72 -0
- package/dist/components/MarkdownFlowEditor/locales/ar-SA.json.es.js +140 -0
- package/dist/components/MarkdownFlowEditor/locales/ar-SA.json.es.js.map +1 -0
- package/dist/components/MarkdownFlowEditor/locales/en-US.json.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/locales/en-US.json.d.ts +2 -0
- package/dist/components/MarkdownFlowEditor/locales/en-US.json.es.js +118 -114
- package/dist/components/MarkdownFlowEditor/locales/en-US.json.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/locales/fr-FR.json.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/locales/fr-FR.json.d.ts +2 -0
- package/dist/components/MarkdownFlowEditor/locales/fr-FR.json.es.js +118 -114
- package/dist/components/MarkdownFlowEditor/locales/fr-FR.json.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/locales/th-TH.json.cjs +2 -0
- package/dist/components/MarkdownFlowEditor/locales/th-TH.json.cjs.map +1 -0
- package/dist/components/MarkdownFlowEditor/locales/th-TH.json.d.ts +72 -0
- package/dist/components/MarkdownFlowEditor/locales/th-TH.json.es.js +140 -0
- package/dist/components/MarkdownFlowEditor/locales/th-TH.json.es.js.map +1 -0
- package/dist/components/MarkdownFlowEditor/locales/zh-CN.json.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/locales/zh-CN.json.d.ts +2 -0
- package/dist/components/MarkdownFlowEditor/locales/zh-CN.json.es.js +70 -66
- package/dist/components/MarkdownFlowEditor/locales/zh-CN.json.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/plugins/ImgPlaceholder.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/plugins/ImgPlaceholder.cjs.map +1 -1
- package/dist/components/MarkdownFlowEditor/plugins/ImgPlaceholder.es.js +40 -35
- package/dist/components/MarkdownFlowEditor/plugins/ImgPlaceholder.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/plugins/PlaceholderWidget.d.ts +1 -1
- package/dist/components/MarkdownFlowEditor/plugins/VideoPlaceholder.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/plugins/VideoPlaceholder.cjs.map +1 -1
- package/dist/components/MarkdownFlowEditor/plugins/VideoPlaceholder.es.js +27 -23
- package/dist/components/MarkdownFlowEditor/plugins/VideoPlaceholder.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/plugins/mediaPlaceholderLabels.cjs +2 -0
- package/dist/components/MarkdownFlowEditor/plugins/mediaPlaceholderLabels.cjs.map +1 -0
- package/dist/components/MarkdownFlowEditor/plugins/mediaPlaceholderLabels.d.ts +7 -0
- package/dist/components/MarkdownFlowEditor/plugins/mediaPlaceholderLabels.es.js +12 -0
- package/dist/components/MarkdownFlowEditor/plugins/mediaPlaceholderLabels.es.js.map +1 -0
- package/dist/components/MarkdownFlowEditor/utils.d.ts +1 -1
- package/dist/components/Slide/MarkdownSlideScaling.cjs +1 -1
- package/dist/components/Slide/MarkdownSlideScaling.cjs.map +1 -1
- package/dist/components/Slide/MarkdownSlideScaling.d.ts +1 -1
- package/dist/components/Slide/MarkdownSlideScaling.es.js +20 -20
- package/dist/components/Slide/MarkdownSlideScaling.es.js.map +1 -1
- package/dist/components/Slide/MobilePlayerSettingsSheet.cjs +1 -1
- package/dist/components/Slide/MobilePlayerSettingsSheet.cjs.map +1 -1
- package/dist/components/Slide/MobilePlayerSettingsSheet.d.ts +7 -2
- package/dist/components/Slide/MobilePlayerSettingsSheet.es.js +61 -57
- package/dist/components/Slide/MobilePlayerSettingsSheet.es.js.map +1 -1
- package/dist/components/Slide/Player.cjs +1 -1
- package/dist/components/Slide/Player.cjs.map +1 -1
- package/dist/components/Slide/Player.d.ts +6 -6
- package/dist/components/Slide/Player.es.js +547 -541
- package/dist/components/Slide/Player.es.js.map +1 -1
- package/dist/components/Slide/Slide.cjs +1 -1
- package/dist/components/Slide/Slide.cjs.map +1 -1
- package/dist/components/Slide/Slide.d.ts +14 -12
- package/dist/components/Slide/Slide.es.js +745 -726
- package/dist/components/Slide/Slide.es.js.map +1 -1
- package/dist/components/Slide/SubtitleOverlay.cjs +1 -1
- package/dist/components/Slide/SubtitleOverlay.cjs.map +1 -1
- package/dist/components/Slide/SubtitleOverlay.d.ts +2 -2
- package/dist/components/Slide/SubtitleOverlay.es.js +17 -17
- package/dist/components/Slide/SubtitleOverlay.es.js.map +1 -1
- package/dist/components/Slide/diff-utils.d.ts +1 -1
- package/dist/components/Slide/index.d.ts +12 -12
- package/dist/components/Slide/locales/slide.json.cjs +2 -0
- package/dist/components/Slide/locales/slide.json.cjs.map +1 -0
- package/dist/components/Slide/locales/slide.json.d.ts +205 -0
- package/dist/components/Slide/locales/slide.json.es.js +11 -0
- package/dist/components/Slide/locales/slide.json.es.js.map +1 -0
- package/dist/components/Slide/slideI18n.cjs +1 -1
- package/dist/components/Slide/slideI18n.cjs.map +1 -1
- package/dist/components/Slide/slideI18n.d.ts +6 -3
- package/dist/components/Slide/slideI18n.es.js +10 -155
- package/dist/components/Slide/slideI18n.es.js.map +1 -1
- package/dist/components/Slide/useSlide.d.ts +1 -1
- package/dist/components/Slide/utils/appendedMarkerAdvance.d.ts +1 -1
- package/dist/components/Slide/utils/audioSegments.d.ts +1 -1
- package/dist/components/Slide/utils/interactionResolution.d.ts +2 -2
- package/dist/components/Slide/utils/listenModeElementList.d.ts +2 -2
- package/dist/components/Slide/utils/markdownScaling.d.ts +1 -1
- package/dist/components/Slide/utils/playerCustomActions.d.ts +2 -2
- package/dist/components/Slide/utils/playerKeyboardShortcuts.cjs +1 -1
- package/dist/components/Slide/utils/playerKeyboardShortcuts.cjs.map +1 -1
- package/dist/components/Slide/utils/playerKeyboardShortcuts.d.ts +1 -1
- package/dist/components/Slide/utils/playerKeyboardShortcuts.es.js +20 -20
- package/dist/components/Slide/utils/playerKeyboardShortcuts.es.js.map +1 -1
- package/dist/components/Slide/utils/runStreamFixture.d.ts +1 -1
- package/dist/components/Slide/utils/segmentSeek.d.ts +1 -1
- package/dist/components/Slide/utils/silentStepAutoAdvance.d.ts +1 -1
- package/dist/components/Slide/utils/streamingNavigation.d.ts +1 -1
- package/dist/components/Slide/utils/subtitleCue.d.ts +1 -1
- package/dist/components/Slide/utils/subtitleJumpNavigation.d.ts +1 -1
- package/dist/components/index.d.ts +22 -18
- package/dist/components/ui/button.cjs +1 -1
- package/dist/components/ui/button.cjs.map +1 -1
- package/dist/components/ui/button.es.js +12 -13
- package/dist/components/ui/button.es.js.map +1 -1
- package/dist/components/ui/checkbox.cjs +1 -1
- package/dist/components/ui/checkbox.cjs.map +1 -1
- package/dist/components/ui/checkbox.es.js +35 -35
- package/dist/components/ui/checkbox.es.js.map +1 -1
- package/dist/components/ui/dialog.cjs +1 -1
- package/dist/components/ui/dialog.cjs.map +1 -1
- package/dist/components/ui/dialog.d.ts +5 -1
- package/dist/components/ui/dialog.es.js +37 -37
- package/dist/components/ui/dialog.es.js.map +1 -1
- package/dist/components/ui/input.cjs +1 -1
- package/dist/components/ui/input.cjs.map +1 -1
- package/dist/components/ui/input.es.js +4 -4
- package/dist/components/ui/input.es.js.map +1 -1
- package/dist/components/ui/inputGroup/button.cjs +1 -1
- package/dist/components/ui/inputGroup/button.cjs.map +1 -1
- package/dist/components/ui/inputGroup/button.es.js +9 -10
- package/dist/components/ui/inputGroup/button.es.js.map +1 -1
- package/dist/components/ui/inputGroup/input-group.cjs +1 -1
- package/dist/components/ui/inputGroup/input-group.cjs.map +1 -1
- package/dist/components/ui/inputGroup/input-group.d.ts +1 -1
- package/dist/components/ui/inputGroup/input-group.es.js +10 -10
- package/dist/components/ui/inputGroup/input-group.es.js.map +1 -1
- package/dist/components/ui/inputGroup/textarea.cjs +1 -1
- package/dist/components/ui/inputGroup/textarea.cjs.map +1 -1
- package/dist/components/ui/inputGroup/textarea.es.js +3 -3
- package/dist/components/ui/inputGroup/textarea.es.js.map +1 -1
- package/dist/components/ui/loading-overlay-card.cjs +2 -2
- package/dist/components/ui/loading-overlay-card.cjs.map +1 -1
- package/dist/components/ui/loading-overlay-card.es.js +11 -11
- package/dist/components/ui/loading-overlay-card.es.js.map +1 -1
- package/dist/components/ui/popover.cjs +1 -1
- package/dist/components/ui/popover.cjs.map +1 -1
- package/dist/components/ui/popover.es.js +6 -6
- package/dist/components/ui/popover.es.js.map +1 -1
- package/dist/components/ui/tooltip.cjs +1 -1
- package/dist/components/ui/tooltip.cjs.map +1 -1
- package/dist/components/ui/tooltip.es.js +16 -16
- package/dist/components/ui/tooltip.es.js.map +1 -1
- package/dist/editor.d.ts +2 -2
- package/dist/fonts/KaTeX_AMS-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_AMS-Regular.woff +0 -0
- package/dist/fonts/KaTeX_AMS-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Caligraphic-Bold.ttf +0 -0
- package/dist/fonts/KaTeX_Caligraphic-Bold.woff +0 -0
- package/dist/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
- package/dist/fonts/KaTeX_Caligraphic-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_Caligraphic-Regular.woff +0 -0
- package/dist/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Fraktur-Bold.ttf +0 -0
- package/dist/fonts/KaTeX_Fraktur-Bold.woff +0 -0
- package/dist/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
- package/dist/fonts/KaTeX_Fraktur-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_Fraktur-Regular.woff +0 -0
- package/dist/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Main-Bold.ttf +0 -0
- package/dist/fonts/KaTeX_Main-Bold.woff +0 -0
- package/dist/fonts/KaTeX_Main-Bold.woff2 +0 -0
- package/dist/fonts/KaTeX_Main-BoldItalic.ttf +0 -0
- package/dist/fonts/KaTeX_Main-BoldItalic.woff +0 -0
- package/dist/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
- package/dist/fonts/KaTeX_Main-Italic.ttf +0 -0
- package/dist/fonts/KaTeX_Main-Italic.woff +0 -0
- package/dist/fonts/KaTeX_Main-Italic.woff2 +0 -0
- package/dist/fonts/KaTeX_Main-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_Main-Regular.woff +0 -0
- package/dist/fonts/KaTeX_Main-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Math-BoldItalic.ttf +0 -0
- package/dist/fonts/KaTeX_Math-BoldItalic.woff +0 -0
- package/dist/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
- package/dist/fonts/KaTeX_Math-Italic.ttf +0 -0
- package/dist/fonts/KaTeX_Math-Italic.woff +0 -0
- package/dist/fonts/KaTeX_Math-Italic.woff2 +0 -0
- package/dist/fonts/KaTeX_SansSerif-Bold.ttf +0 -0
- package/dist/fonts/KaTeX_SansSerif-Bold.woff +0 -0
- package/dist/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
- package/dist/fonts/KaTeX_SansSerif-Italic.ttf +0 -0
- package/dist/fonts/KaTeX_SansSerif-Italic.woff +0 -0
- package/dist/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
- package/dist/fonts/KaTeX_SansSerif-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_SansSerif-Regular.woff +0 -0
- package/dist/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Script-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_Script-Regular.woff +0 -0
- package/dist/fonts/KaTeX_Script-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Size1-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_Size1-Regular.woff +0 -0
- package/dist/fonts/KaTeX_Size1-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Size2-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_Size2-Regular.woff +0 -0
- package/dist/fonts/KaTeX_Size2-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Size3-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_Size3-Regular.woff +0 -0
- package/dist/fonts/KaTeX_Size3-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Size4-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_Size4-Regular.woff +0 -0
- package/dist/fonts/KaTeX_Size4-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Typewriter-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_Typewriter-Regular.woff +0 -0
- package/dist/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.es.js +22 -19
- package/dist/index.es.js.map +1 -1
- package/dist/lib/locale.cjs +1 -1
- package/dist/lib/locale.cjs.map +1 -1
- package/dist/lib/locale.d.ts +5 -1
- package/dist/lib/locale.es.js +26 -13
- package/dist/lib/locale.es.js.map +1 -1
- package/dist/lib/locale.test.d.ts +1 -0
- package/dist/lib/useDetachedLanguage.cjs +2 -0
- package/dist/lib/useDetachedLanguage.cjs.map +1 -0
- package/dist/lib/useDetachedLanguage.d.ts +3 -0
- package/dist/lib/useDetachedLanguage.es.js +25 -0
- package/dist/lib/useDetachedLanguage.es.js.map +1 -0
- package/dist/lib/useResolvedDirection.cjs +2 -0
- package/dist/lib/useResolvedDirection.cjs.map +1 -0
- package/dist/lib/useResolvedDirection.d.ts +6 -0
- package/dist/lib/useResolvedDirection.es.js +37 -0
- package/dist/lib/useResolvedDirection.es.js.map +1 -0
- package/dist/markdown-flow-ui-lib.css +1 -1
- package/dist/node_modules/@radix-ui/react-arrow/dist/index.cjs +1 -1
- package/dist/node_modules/@radix-ui/react-arrow/dist/index.cjs.map +1 -1
- package/dist/node_modules/@radix-ui/react-arrow/dist/index.es.js +6 -6
- package/dist/node_modules/@radix-ui/react-arrow/dist/index.es.js.map +1 -1
- package/dist/node_modules/@radix-ui/react-context/dist/index.cjs +1 -1
- package/dist/node_modules/@radix-ui/react-context/dist/index.cjs.map +1 -1
- package/dist/node_modules/@radix-ui/react-context/dist/index.es.js +21 -21
- package/dist/node_modules/@radix-ui/react-context/dist/index.es.js.map +1 -1
- package/dist/node_modules/@radix-ui/react-dialog/dist/index.cjs +2 -2
- package/dist/node_modules/@radix-ui/react-dialog/dist/index.cjs.map +1 -1
- package/dist/node_modules/@radix-ui/react-dialog/dist/index.es.js +100 -100
- package/dist/node_modules/@radix-ui/react-dialog/dist/index.es.js.map +1 -1
- package/dist/node_modules/@radix-ui/react-dismissable-layer/dist/index.cjs +1 -1
- package/dist/node_modules/@radix-ui/react-dismissable-layer/dist/index.cjs.map +1 -1
- package/dist/node_modules/@radix-ui/react-dismissable-layer/dist/index.es.js +38 -38
- package/dist/node_modules/@radix-ui/react-dismissable-layer/dist/index.es.js.map +1 -1
- package/dist/node_modules/@radix-ui/react-focus-scope/dist/index.cjs +1 -1
- package/dist/node_modules/@radix-ui/react-focus-scope/dist/index.cjs.map +1 -1
- package/dist/node_modules/@radix-ui/react-focus-scope/dist/index.es.js +9 -9
- package/dist/node_modules/@radix-ui/react-focus-scope/dist/index.es.js.map +1 -1
- package/dist/node_modules/@radix-ui/react-popover/dist/index.cjs +1 -1
- package/dist/node_modules/@radix-ui/react-popover/dist/index.cjs.map +1 -1
- package/dist/node_modules/@radix-ui/react-popover/dist/index.es.js +95 -95
- package/dist/node_modules/@radix-ui/react-popover/dist/index.es.js.map +1 -1
- package/dist/node_modules/@radix-ui/react-popper/dist/index.cjs +1 -1
- package/dist/node_modules/@radix-ui/react-popper/dist/index.cjs.map +1 -1
- package/dist/node_modules/@radix-ui/react-popper/dist/index.es.js +48 -48
- package/dist/node_modules/@radix-ui/react-popper/dist/index.es.js.map +1 -1
- package/dist/node_modules/@radix-ui/react-portal/dist/index.cjs +1 -1
- package/dist/node_modules/@radix-ui/react-portal/dist/index.cjs.map +1 -1
- package/dist/node_modules/@radix-ui/react-portal/dist/index.es.js +6 -6
- package/dist/node_modules/@radix-ui/react-portal/dist/index.es.js.map +1 -1
- package/dist/node_modules/@radix-ui/react-primitive/dist/index.cjs +1 -1
- package/dist/node_modules/@radix-ui/react-primitive/dist/index.cjs.map +1 -1
- package/dist/node_modules/@radix-ui/react-primitive/dist/index.es.js +9 -9
- package/dist/node_modules/@radix-ui/react-primitive/dist/index.es.js.map +1 -1
- package/dist/node_modules/@radix-ui/react-slot/dist/index.cjs +1 -1
- package/dist/node_modules/@radix-ui/react-slot/dist/index.cjs.map +1 -1
- package/dist/node_modules/@radix-ui/react-slot/dist/index.es.js +17 -17
- package/dist/node_modules/@radix-ui/react-slot/dist/index.es.js.map +1 -1
- package/dist/node_modules/@radix-ui/react-tooltip/dist/index.cjs +1 -1
- package/dist/node_modules/@radix-ui/react-tooltip/dist/index.cjs.map +1 -1
- package/dist/node_modules/@radix-ui/react-tooltip/dist/index.es.js +100 -100
- package/dist/node_modules/@radix-ui/react-tooltip/dist/index.es.js.map +1 -1
- package/dist/node_modules/@radix-ui/react-visually-hidden/dist/index.cjs +1 -1
- package/dist/node_modules/@radix-ui/react-visually-hidden/dist/index.cjs.map +1 -1
- package/dist/node_modules/@radix-ui/react-visually-hidden/dist/index.es.js +6 -6
- package/dist/node_modules/@radix-ui/react-visually-hidden/dist/index.es.js.map +1 -1
- package/dist/node_modules/@uiw/react-codemirror/esm/index.cjs +1 -1
- package/dist/node_modules/@uiw/react-codemirror/esm/index.cjs.map +1 -1
- package/dist/node_modules/@uiw/react-codemirror/esm/index.es.js +27 -27
- package/dist/node_modules/@uiw/react-codemirror/esm/index.es.js.map +1 -1
- package/dist/node_modules/lucide-react/dist/esm/icons/{chevron-down.cjs → chevrons-down.cjs} +2 -2
- package/dist/node_modules/lucide-react/dist/esm/icons/chevrons-down.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/{chevron-down.es.js → chevrons-down.es.js} +6 -3
- package/dist/node_modules/lucide-react/dist/esm/icons/chevrons-down.es.js.map +1 -0
- package/dist/node_modules/rc-input/es/BaseInput.cjs +1 -1
- package/dist/node_modules/rc-input/es/BaseInput.es.js +1 -1
- package/dist/node_modules/rc-textarea/es/ResizableTextArea.cjs +1 -1
- package/dist/node_modules/rc-textarea/es/ResizableTextArea.es.js +1 -1
- package/dist/node_modules/rc-textarea/es/TextArea.cjs +1 -1
- package/dist/node_modules/rc-textarea/es/TextArea.es.js +1 -1
- package/dist/node_modules/rc-textarea/es/index.cjs +1 -1
- package/dist/node_modules/rc-textarea/es/index.es.js +1 -1
- package/dist/node_modules/react-markdown/lib/index.cjs +1 -1
- package/dist/node_modules/react-markdown/lib/index.cjs.map +1 -1
- package/dist/node_modules/react-markdown/lib/index.es.js +39 -39
- package/dist/node_modules/react-markdown/lib/index.es.js.map +1 -1
- package/dist/node_modules/remark-flow/dist/interaction-plugin-core.cjs +1 -1
- package/dist/node_modules/remark-flow/dist/interaction-plugin-core.es.js +1 -1
- package/dist/renderer.cjs +1 -1
- package/dist/renderer.d.ts +18 -17
- package/dist/renderer.es.js +20 -17
- package/dist/renderer.es.js.map +1 -1
- package/dist/scroll.cjs +2 -0
- package/dist/scroll.cjs.map +1 -0
- package/dist/scroll.d.ts +6 -0
- package/dist/scroll.es.js +9 -0
- package/dist/scroll.es.js.map +1 -0
- package/dist/slide.d.ts +3 -3
- package/package.json +13 -2
- package/dist/_virtual/jsx-runtime.cjs +0 -2
- package/dist/_virtual/jsx-runtime.cjs.map +0 -1
- package/dist/_virtual/jsx-runtime.es.js +0 -6
- package/dist/_virtual/jsx-runtime.es.js.map +0 -1
- package/dist/_virtual/jsx-runtime.es2.js +0 -5
- package/dist/_virtual/jsx-runtime.es2.js.map +0 -1
- package/dist/_virtual/jsx-runtime2.cjs +0 -2
- package/dist/_virtual/jsx-runtime2.cjs.map +0 -1
- package/dist/_virtual/react-jsx-runtime.development.cjs +0 -2
- package/dist/_virtual/react-jsx-runtime.development.cjs.map +0 -1
- package/dist/_virtual/react-jsx-runtime.development.es.js +0 -5
- package/dist/_virtual/react-jsx-runtime.development.es.js.map +0 -1
- package/dist/_virtual/react-jsx-runtime.production.cjs +0 -2
- package/dist/_virtual/react-jsx-runtime.production.cjs.map +0 -1
- package/dist/_virtual/react-jsx-runtime.production.es.js +0 -5
- package/dist/_virtual/react-jsx-runtime.production.es.js.map +0 -1
- package/dist/lib/localeTextMap.cjs +0 -2
- package/dist/lib/localeTextMap.cjs.map +0 -1
- package/dist/lib/localeTextMap.es.js +0 -5
- package/dist/lib/localeTextMap.es.js.map +0 -1
- package/dist/node_modules/lucide-react/dist/esm/icons/chevron-down.cjs.map +0 -1
- package/dist/node_modules/lucide-react/dist/esm/icons/chevron-down.es.js.map +0 -1
- package/dist/node_modules/react/cjs/react-jsx-runtime.development.cjs +0 -24
- package/dist/node_modules/react/cjs/react-jsx-runtime.development.cjs.map +0 -1
- package/dist/node_modules/react/cjs/react-jsx-runtime.development.es.js +0 -409
- package/dist/node_modules/react/cjs/react-jsx-runtime.development.es.js.map +0 -1
- package/dist/node_modules/react/cjs/react-jsx-runtime.production.cjs +0 -10
- package/dist/node_modules/react/cjs/react-jsx-runtime.production.cjs.map +0 -1
- package/dist/node_modules/react/cjs/react-jsx-runtime.production.es.js +0 -36
- package/dist/node_modules/react/cjs/react-jsx-runtime.production.es.js.map +0 -1
- package/dist/node_modules/react/jsx-runtime.cjs +0 -2
- package/dist/node_modules/react/jsx-runtime.cjs.map +0 -1
- package/dist/node_modules/react/jsx-runtime.es.js +0 -11
- package/dist/node_modules/react/jsx-runtime.es.js.map +0 -1
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { jsx as u } from "react/jsx-runtime";
|
|
2
|
+
import { ScrollToBottomButton as S } from "./ScrollToBottomButton.es.js";
|
|
3
|
+
import { useScrollToBottom as a } from "./useScrollToBottom.es.js";
|
|
4
|
+
const d = ({
|
|
5
|
+
viewportRef: o,
|
|
6
|
+
contentRef: t,
|
|
7
|
+
endRef: r,
|
|
8
|
+
scrollTarget: l,
|
|
9
|
+
pageScrollFallback: m,
|
|
10
|
+
scrollThreshold: c,
|
|
11
|
+
contentVersion: s,
|
|
12
|
+
followNewContent: i,
|
|
13
|
+
autoScrollOnInit: n,
|
|
14
|
+
behavior: B,
|
|
15
|
+
onScrollToBottom: e,
|
|
16
|
+
...T
|
|
17
|
+
}) => {
|
|
18
|
+
const { showScrollToBottom: f, scrollToBottom: p } = a(
|
|
19
|
+
o,
|
|
20
|
+
{
|
|
21
|
+
contentRef: t,
|
|
22
|
+
endRef: r,
|
|
23
|
+
scrollTarget: l,
|
|
24
|
+
pageScrollFallback: m,
|
|
25
|
+
scrollThreshold: c,
|
|
26
|
+
contentVersion: s,
|
|
27
|
+
followNewContent: i,
|
|
28
|
+
autoScrollOnInit: n,
|
|
29
|
+
behavior: B
|
|
30
|
+
}
|
|
31
|
+
);
|
|
32
|
+
return /* @__PURE__ */ u(
|
|
33
|
+
S,
|
|
34
|
+
{
|
|
35
|
+
...T,
|
|
36
|
+
visible: f,
|
|
37
|
+
onClick: () => {
|
|
38
|
+
p(), e?.();
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
);
|
|
42
|
+
};
|
|
43
|
+
export {
|
|
44
|
+
d as ScrollToBottomControl,
|
|
45
|
+
d as default
|
|
46
|
+
};
|
|
47
|
+
//# sourceMappingURL=ScrollToBottomControl.es.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ScrollToBottomControl.es.js","sources":["../../../src/components/MarkdownFlow/ScrollToBottomControl.tsx"],"sourcesContent":["import React, { type RefObject } from \"react\";\nimport ScrollToBottomButton, {\n type ScrollToBottomButtonProps,\n} from \"./ScrollToBottomButton\";\nimport useScrollToBottom, {\n type UseScrollToBottomOptions,\n} from \"./useScrollToBottom\";\n\nexport interface ScrollToBottomControlProps\n extends UseScrollToBottomOptions,\n Omit<ScrollToBottomButtonProps, \"onClick\" | \"visible\"> {\n /** Existing host viewport; no wrapper or content ownership is required. */\n viewportRef: RefObject<HTMLElement | null>;\n /** Optional notification after the control requests a scroll to the end. */\n onScrollToBottom?: () => void;\n}\n\n/**\n * Complete scroll-to-bottom control for streaming or asynchronously growing content.\n *\n * The control owns target resolution, follow state, visibility, click behavior,\n * the accessible icon button, and optional portal rendering. Consumers only\n * provide host refs, localized text, and layout inputs.\n */\nexport const ScrollToBottomControl: React.FC<ScrollToBottomControlProps> = ({\n viewportRef,\n contentRef,\n endRef,\n scrollTarget,\n pageScrollFallback,\n scrollThreshold,\n contentVersion,\n followNewContent,\n autoScrollOnInit,\n behavior,\n onScrollToBottom,\n ...buttonProps\n}) => {\n const { showScrollToBottom, scrollToBottom } = useScrollToBottom(\n viewportRef,\n {\n contentRef,\n endRef,\n scrollTarget,\n pageScrollFallback,\n scrollThreshold,\n contentVersion,\n followNewContent,\n autoScrollOnInit,\n behavior,\n }\n );\n\n return (\n <ScrollToBottomButton\n {...buttonProps}\n visible={showScrollToBottom}\n onClick={() => {\n scrollToBottom();\n onScrollToBottom?.();\n }}\n />\n );\n};\n\nexport default ScrollToBottomControl;\n"],"names":["ScrollToBottomControl","viewportRef","contentRef","endRef","scrollTarget","pageScrollFallback","scrollThreshold","contentVersion","followNewContent","autoScrollOnInit","behavior","onScrollToBottom","buttonProps","showScrollToBottom","scrollToBottom","useScrollToBottom","jsx","ScrollToBottomButton"],"mappings":";;;AAwBO,MAAMA,IAA8D,CAAC;AAAA,EAC1E,aAAAC;AAAA,EACA,YAAAC;AAAA,EACA,QAAAC;AAAA,EACA,cAAAC;AAAA,EACA,oBAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,kBAAAC;AAAA,EACA,kBAAAC;AAAA,EACA,UAAAC;AAAA,EACA,kBAAAC;AAAA,EACA,GAAGC;AACL,MAAM;AACJ,QAAM,EAAE,oBAAAC,GAAoB,gBAAAC,EAAA,IAAmBC;AAAA,IAC7Cd;AAAA,IACA;AAAA,MACE,YAAAC;AAAA,MACA,QAAAC;AAAA,MACA,cAAAC;AAAA,MACA,oBAAAC;AAAA,MACA,iBAAAC;AAAA,MACA,gBAAAC;AAAA,MACA,kBAAAC;AAAA,MACA,kBAAAC;AAAA,MACA,UAAAC;AAAA,IAAA;AAAA,EACF;AAGF,SACE,gBAAAM;AAAA,IAACC;AAAA,IAAA;AAAA,MACE,GAAGL;AAAA,MACJ,SAASC;AAAA,MACT,SAAS,MAAM;AACb,QAAAC,EAAA,GACAH,IAAA;AAAA,MACF;AAAA,IAAA;AAAA,EAAA;AAGN;"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const o=require("
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const o=require("react/jsx-runtime"),n=require("react"),g=require("./MarkdownFlow.cjs"),m=require("./ScrollToBottomControl.cjs"),f=require("../ContentRender/contentRenderI18n.cjs"),s=require("../../lib/locale.cjs");;/* empty css */const T=a=>{const{height:i="100%",className:c="",scrollToBottomAriaLabel:u,...e}=a,t=n.useRef(null),l=n.useRef(null),r=e.initialContentList??[],d=f.getContentRenderLocaleTexts(e.locale),w=u||d.scrollToBottomLabel;return o.jsxs("div",{className:`scrollable-markdown-container ${c}`.trim(),dir:e.dir??s.getMarkdownFlowDirection(e.locale),lang:e.lang??s.getMarkdownFlowLanguage(e.locale),style:{height:i,position:"relative"},children:[o.jsx("div",{ref:t,style:{height:"100%",overflowY:"auto"},children:o.jsx("div",{ref:l,children:o.jsx(g.default,{...e,initialContentList:r})})}),o.jsx(m.ScrollToBottomControl,{viewportRef:t,contentRef:l,scrollTarget:t,contentVersion:r,autoScrollOnInit:!0,scrollThreshold:150,ariaLabel:w})]})};exports.default=T;
|
|
2
2
|
//# sourceMappingURL=ScrollableMarkdownFlow.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ScrollableMarkdownFlow.cjs","sources":["../../../src/components/MarkdownFlow/ScrollableMarkdownFlow.tsx"],"sourcesContent":["import React, { useRef } from \"react\";\nimport MarkdownFlow
|
|
1
|
+
{"version":3,"file":"ScrollableMarkdownFlow.cjs","sources":["../../../src/components/MarkdownFlow/ScrollableMarkdownFlow.tsx"],"sourcesContent":["import React, { useRef } from \"react\";\nimport MarkdownFlow, { type MarkdownFlowProps } from \"./MarkdownFlow\";\nimport ScrollToBottomControl from \"./ScrollToBottomControl\";\nimport { getContentRenderLocaleTexts } from \"../ContentRender/contentRenderI18n\";\nimport {\n getMarkdownFlowDirection,\n getMarkdownFlowLanguage,\n} from \"../../lib/locale\";\n\nimport \"./markdownFlow.css\";\n\nexport interface ScrollableMarkdownFlowProps extends MarkdownFlowProps {\n height?: string | number;\n className?: string;\n scrollToBottomAriaLabel?: string;\n}\n\nconst ScrollableMarkdownFlow: React.FC<ScrollableMarkdownFlowProps> = (\n props\n) => {\n const {\n height = \"100%\",\n className = \"\",\n scrollToBottomAriaLabel,\n ...markdownFlowProps\n } = props;\n const viewportRef = useRef<HTMLDivElement>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n const initialContentList = markdownFlowProps.initialContentList ?? [];\n const localeTexts = getContentRenderLocaleTexts(markdownFlowProps.locale);\n const resolvedScrollToBottomAriaLabel =\n scrollToBottomAriaLabel || localeTexts.scrollToBottomLabel;\n\n return (\n <div\n className={`scrollable-markdown-container ${className}`.trim()}\n dir={\n markdownFlowProps.dir ??\n getMarkdownFlowDirection(markdownFlowProps.locale)\n }\n lang={\n markdownFlowProps.lang ??\n getMarkdownFlowLanguage(markdownFlowProps.locale)\n }\n style={{ height, position: \"relative\" }}\n >\n <div ref={viewportRef} style={{ height: \"100%\", overflowY: \"auto\" }}>\n <div ref={contentRef}>\n <MarkdownFlow\n {...markdownFlowProps}\n initialContentList={initialContentList}\n />\n </div>\n </div>\n <ScrollToBottomControl\n viewportRef={viewportRef}\n contentRef={contentRef}\n scrollTarget={viewportRef}\n contentVersion={initialContentList}\n autoScrollOnInit\n scrollThreshold={150}\n ariaLabel={resolvedScrollToBottomAriaLabel}\n />\n </div>\n );\n};\n\nexport default ScrollableMarkdownFlow;\n"],"names":["ScrollableMarkdownFlow","props","height","className","scrollToBottomAriaLabel","markdownFlowProps","viewportRef","useRef","contentRef","initialContentList","localeTexts","getContentRenderLocaleTexts","resolvedScrollToBottomAriaLabel","jsxs","getMarkdownFlowDirection","getMarkdownFlowLanguage","jsx","MarkdownFlow","ScrollToBottomControl"],"mappings":"qWAiBA,MAAMA,EACJC,GACG,CACH,KAAM,CACJ,OAAAC,EAAS,OACT,UAAAC,EAAY,GACZ,wBAAAC,EACA,GAAGC,CAAA,EACDJ,EACEK,EAAcC,EAAAA,OAAuB,IAAI,EACzCC,EAAaD,EAAAA,OAAuB,IAAI,EACxCE,EAAqBJ,EAAkB,oBAAsB,CAAA,EAC7DK,EAAcC,EAAAA,4BAA4BN,EAAkB,MAAM,EAClEO,EACJR,GAA2BM,EAAY,oBAEzC,OACEG,EAAAA,KAAC,MAAA,CACC,UAAW,iCAAiCV,CAAS,GAAG,KAAA,EACxD,IACEE,EAAkB,KAClBS,EAAAA,yBAAyBT,EAAkB,MAAM,EAEnD,KACEA,EAAkB,MAClBU,EAAAA,wBAAwBV,EAAkB,MAAM,EAElD,MAAO,CAAE,OAAAH,EAAQ,SAAU,UAAA,EAE3B,SAAA,CAAAc,EAAAA,IAAC,MAAA,CAAI,IAAKV,EAAa,MAAO,CAAE,OAAQ,OAAQ,UAAW,MAAA,EACzD,SAAAU,MAAC,MAAA,CAAI,IAAKR,EACR,SAAAQ,EAAAA,IAACC,EAAAA,QAAA,CACE,GAAGZ,EACJ,mBAAAI,CAAA,CAAA,EAEJ,CAAA,CACF,EACAO,EAAAA,IAACE,EAAAA,sBAAA,CACC,YAAAZ,EACA,WAAAE,EACA,aAAcF,EACd,eAAgBG,EAChB,iBAAgB,GAChB,gBAAiB,IACjB,UAAWG,CAAA,CAAA,CACb,CAAA,CAAA,CAGN"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { default as React } from 'react';
|
|
2
|
-
import { MarkdownFlowProps } from './MarkdownFlow';
|
|
2
|
+
import { MarkdownFlowProps } from './MarkdownFlow.js';
|
|
3
3
|
export interface ScrollableMarkdownFlowProps extends MarkdownFlowProps {
|
|
4
4
|
height?: string | number;
|
|
5
5
|
className?: string;
|
|
@@ -1,61 +1,42 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { useRef as
|
|
3
|
-
import
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
1
|
+
import { jsxs as f, jsx as t } from "react/jsx-runtime";
|
|
2
|
+
import { useRef as n } from "react";
|
|
3
|
+
import w from "./MarkdownFlow.es.js";
|
|
4
|
+
import { ScrollToBottomControl as p } from "./ScrollToBottomControl.es.js";
|
|
5
|
+
import { getContentRenderLocaleTexts as g } from "../ContentRender/contentRenderI18n.es.js";
|
|
6
|
+
import { getMarkdownFlowLanguage as h, getMarkdownFlowDirection as u } from "../../lib/locale.es.js";
|
|
7
7
|
/* empty css */
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
copyButtonText: d,
|
|
17
|
-
copiedButtonText: f,
|
|
18
|
-
beforeSend: u,
|
|
19
|
-
interactionDefaultValueOptions: p,
|
|
20
|
-
scrollToBottomAriaLabel: x,
|
|
21
|
-
...l
|
|
22
|
-
}) => {
|
|
23
|
-
const e = B(null), T = S(r), h = x || T.scrollToBottomLabel, { showScrollToBottom: s, scrollToBottom: w } = j(
|
|
24
|
-
e,
|
|
25
|
-
{
|
|
26
|
-
contentVersion: t,
|
|
27
|
-
autoScrollOnInit: !0,
|
|
28
|
-
scrollThreshold: 150
|
|
29
|
-
}
|
|
30
|
-
);
|
|
31
|
-
return /* @__PURE__ */ o.jsxs(
|
|
8
|
+
const B = (a) => {
|
|
9
|
+
const {
|
|
10
|
+
height: i = "100%",
|
|
11
|
+
className: s = "",
|
|
12
|
+
scrollToBottomAriaLabel: c,
|
|
13
|
+
...o
|
|
14
|
+
} = a, l = n(null), r = n(null), e = o.initialContentList ?? [], m = g(o.locale), d = c || m.scrollToBottomLabel;
|
|
15
|
+
return /* @__PURE__ */ f(
|
|
32
16
|
"div",
|
|
33
17
|
{
|
|
34
|
-
className: `scrollable-markdown-container ${
|
|
35
|
-
|
|
36
|
-
|
|
18
|
+
className: `scrollable-markdown-container ${s}`.trim(),
|
|
19
|
+
dir: o.dir ?? u(o.locale),
|
|
20
|
+
lang: o.lang ?? h(o.locale),
|
|
21
|
+
style: { height: i, position: "relative" },
|
|
37
22
|
children: [
|
|
38
|
-
/* @__PURE__ */
|
|
39
|
-
|
|
23
|
+
/* @__PURE__ */ t("div", { ref: l, style: { height: "100%", overflowY: "auto" }, children: /* @__PURE__ */ t("div", { ref: r, children: /* @__PURE__ */ t(
|
|
24
|
+
w,
|
|
40
25
|
{
|
|
41
|
-
...
|
|
42
|
-
initialContentList:
|
|
43
|
-
customRenderBar: n,
|
|
44
|
-
onSend: c,
|
|
45
|
-
locale: r,
|
|
46
|
-
confirmButtonText: i,
|
|
47
|
-
copyButtonText: d,
|
|
48
|
-
copiedButtonText: f,
|
|
49
|
-
beforeSend: u,
|
|
50
|
-
interactionDefaultValueOptions: p
|
|
26
|
+
...o,
|
|
27
|
+
initialContentList: e
|
|
51
28
|
}
|
|
52
|
-
) }),
|
|
53
|
-
|
|
54
|
-
|
|
29
|
+
) }) }),
|
|
30
|
+
/* @__PURE__ */ t(
|
|
31
|
+
p,
|
|
55
32
|
{
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
33
|
+
viewportRef: l,
|
|
34
|
+
contentRef: r,
|
|
35
|
+
scrollTarget: l,
|
|
36
|
+
contentVersion: e,
|
|
37
|
+
autoScrollOnInit: !0,
|
|
38
|
+
scrollThreshold: 150,
|
|
39
|
+
ariaLabel: d
|
|
59
40
|
}
|
|
60
41
|
)
|
|
61
42
|
]
|
|
@@ -63,6 +44,6 @@ const A = ({
|
|
|
63
44
|
);
|
|
64
45
|
};
|
|
65
46
|
export {
|
|
66
|
-
|
|
47
|
+
B as default
|
|
67
48
|
};
|
|
68
49
|
//# sourceMappingURL=ScrollableMarkdownFlow.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ScrollableMarkdownFlow.es.js","sources":["../../../src/components/MarkdownFlow/ScrollableMarkdownFlow.tsx"],"sourcesContent":["import React, { useRef } from \"react\";\nimport MarkdownFlow
|
|
1
|
+
{"version":3,"file":"ScrollableMarkdownFlow.es.js","sources":["../../../src/components/MarkdownFlow/ScrollableMarkdownFlow.tsx"],"sourcesContent":["import React, { useRef } from \"react\";\nimport MarkdownFlow, { type MarkdownFlowProps } from \"./MarkdownFlow\";\nimport ScrollToBottomControl from \"./ScrollToBottomControl\";\nimport { getContentRenderLocaleTexts } from \"../ContentRender/contentRenderI18n\";\nimport {\n getMarkdownFlowDirection,\n getMarkdownFlowLanguage,\n} from \"../../lib/locale\";\n\nimport \"./markdownFlow.css\";\n\nexport interface ScrollableMarkdownFlowProps extends MarkdownFlowProps {\n height?: string | number;\n className?: string;\n scrollToBottomAriaLabel?: string;\n}\n\nconst ScrollableMarkdownFlow: React.FC<ScrollableMarkdownFlowProps> = (\n props\n) => {\n const {\n height = \"100%\",\n className = \"\",\n scrollToBottomAriaLabel,\n ...markdownFlowProps\n } = props;\n const viewportRef = useRef<HTMLDivElement>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n const initialContentList = markdownFlowProps.initialContentList ?? [];\n const localeTexts = getContentRenderLocaleTexts(markdownFlowProps.locale);\n const resolvedScrollToBottomAriaLabel =\n scrollToBottomAriaLabel || localeTexts.scrollToBottomLabel;\n\n return (\n <div\n className={`scrollable-markdown-container ${className}`.trim()}\n dir={\n markdownFlowProps.dir ??\n getMarkdownFlowDirection(markdownFlowProps.locale)\n }\n lang={\n markdownFlowProps.lang ??\n getMarkdownFlowLanguage(markdownFlowProps.locale)\n }\n style={{ height, position: \"relative\" }}\n >\n <div ref={viewportRef} style={{ height: \"100%\", overflowY: \"auto\" }}>\n <div ref={contentRef}>\n <MarkdownFlow\n {...markdownFlowProps}\n initialContentList={initialContentList}\n />\n </div>\n </div>\n <ScrollToBottomControl\n viewportRef={viewportRef}\n contentRef={contentRef}\n scrollTarget={viewportRef}\n contentVersion={initialContentList}\n autoScrollOnInit\n scrollThreshold={150}\n ariaLabel={resolvedScrollToBottomAriaLabel}\n />\n </div>\n );\n};\n\nexport default ScrollableMarkdownFlow;\n"],"names":["ScrollableMarkdownFlow","props","height","className","scrollToBottomAriaLabel","markdownFlowProps","viewportRef","useRef","contentRef","initialContentList","localeTexts","getContentRenderLocaleTexts","resolvedScrollToBottomAriaLabel","jsxs","getMarkdownFlowDirection","getMarkdownFlowLanguage","jsx","MarkdownFlow","ScrollToBottomControl"],"mappings":";;;;;;;AAiBA,MAAMA,IAAgE,CACpEC,MACG;AACH,QAAM;AAAA,IACJ,QAAAC,IAAS;AAAA,IACT,WAAAC,IAAY;AAAA,IACZ,yBAAAC;AAAA,IACA,GAAGC;AAAA,EAAA,IACDJ,GACEK,IAAcC,EAAuB,IAAI,GACzCC,IAAaD,EAAuB,IAAI,GACxCE,IAAqBJ,EAAkB,sBAAsB,CAAA,GAC7DK,IAAcC,EAA4BN,EAAkB,MAAM,GAClEO,IACJR,KAA2BM,EAAY;AAEzC,SACE,gBAAAG;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW,iCAAiCV,CAAS,GAAG,KAAA;AAAA,MACxD,KACEE,EAAkB,OAClBS,EAAyBT,EAAkB,MAAM;AAAA,MAEnD,MACEA,EAAkB,QAClBU,EAAwBV,EAAkB,MAAM;AAAA,MAElD,OAAO,EAAE,QAAAH,GAAQ,UAAU,WAAA;AAAA,MAE3B,UAAA;AAAA,QAAA,gBAAAc,EAAC,OAAA,EAAI,KAAKV,GAAa,OAAO,EAAE,QAAQ,QAAQ,WAAW,OAAA,GACzD,UAAA,gBAAAU,EAAC,OAAA,EAAI,KAAKR,GACR,UAAA,gBAAAQ;AAAA,UAACC;AAAA,UAAA;AAAA,YACE,GAAGZ;AAAA,YACJ,oBAAAI;AAAA,UAAA;AAAA,QAAA,GAEJ,EAAA,CACF;AAAA,QACA,gBAAAO;AAAA,UAACE;AAAA,UAAA;AAAA,YACC,aAAAZ;AAAA,YACA,YAAAE;AAAA,YACA,cAAcF;AAAA,YACd,gBAAgBG;AAAA,YAChB,kBAAgB;AAAA,YAChB,iBAAiB;AAAA,YACjB,WAAWG;AAAA,UAAA;AAAA,QAAA;AAAA,MACb;AAAA,IAAA;AAAA,EAAA;AAGN;"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const o=require("./MarkdownFlow.cjs");require("react/jsx-runtime");require("react");const e=require("./ScrollToBottomButton.cjs");;/* empty css */exports.MarkdownFlow=o.default;exports.default=o.default;exports.ScrollToBottomButton=e.ScrollToBottomButton;
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
|
@@ -1,7 +1,10 @@
|
|
|
1
|
-
import { default as MarkdownFlow } from './MarkdownFlow';
|
|
2
|
-
import { default as ScrollableMarkdownFlow } from './ScrollableMarkdownFlow';
|
|
3
|
-
import { default as ScrollToBottomButton } from './ScrollToBottomButton';
|
|
1
|
+
import { default as MarkdownFlow } from './MarkdownFlow.js';
|
|
2
|
+
import { default as ScrollableMarkdownFlow } from './ScrollableMarkdownFlow.js';
|
|
3
|
+
import { default as ScrollToBottomButton } from './ScrollToBottomButton.js';
|
|
4
|
+
import { default as ScrollToBottomControl } from './ScrollToBottomControl.js';
|
|
4
5
|
export default MarkdownFlow;
|
|
5
|
-
export { MarkdownFlow, ScrollableMarkdownFlow, ScrollToBottomButton };
|
|
6
|
-
export { default as useScrollToBottom } from './useScrollToBottom';
|
|
7
|
-
export type {
|
|
6
|
+
export { MarkdownFlow, ScrollableMarkdownFlow, ScrollableMarkdownFlow as ScrollableMarkdown, ScrollToBottomButton, ScrollToBottomControl, };
|
|
7
|
+
export { default as useScrollToBottom } from './useScrollToBottom.js';
|
|
8
|
+
export type { ScrollToBottomButtonProps, ScrollToBottomPlacement, ScrollToBottomPosition, } from './ScrollToBottomButton.js';
|
|
9
|
+
export type { ScrollToBottomControlProps } from './ScrollToBottomControl.js';
|
|
10
|
+
export type { LegacyUseScrollToBottomOptions, PageScrollFallback, ScrollBehavior, ScrollMetrics, ScrollPresentation, ScrollTarget, ScrollTargetInput, ScrollTargetRef, ScrollTargetResolver, UseScrollToBottomOptions, UseScrollToBottomReturn, } from './useScrollToBottom.js';
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import
|
|
2
|
-
import "
|
|
1
|
+
import t from "./MarkdownFlow.es.js";
|
|
2
|
+
import "react/jsx-runtime";
|
|
3
3
|
import "react";
|
|
4
|
-
import "
|
|
5
|
-
import "../ContentRender/contentRenderI18n.es.js";
|
|
4
|
+
import { ScrollToBottomButton as a } from "./ScrollToBottomButton.es.js";
|
|
6
5
|
/* empty css */
|
|
7
6
|
export {
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
t as MarkdownFlow,
|
|
8
|
+
a as ScrollToBottomButton,
|
|
9
|
+
t as default
|
|
10
10
|
};
|
|
11
11
|
//# sourceMappingURL=index.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const c=require("react"),Ve=typeof window>"u"?c.useEffect:c.useLayoutEffect,O=e=>"window"in e&&e.window===e,W=e=>"nodeType"in e&&e.nodeType===9,be=e=>{const t=O(e)?e.document:e;return t.scrollingElement||t.documentElement},_=e=>O(e)?e:W(e)?e.defaultView:e.ownerDocument.defaultView,m=e=>{if(O(e)||W(e)){const t=be(e),l=O(e)?e.innerHeight:t?.clientHeight||0;return{scrollTop:t?.scrollTop||0,scrollHeight:t?.scrollHeight||0,clientHeight:l}}return{scrollTop:e.scrollTop,scrollHeight:e.scrollHeight,clientHeight:e.clientHeight}},ge=(e,t=150)=>{const l=Math.max(0,t),s=e.scrollHeight>e.clientHeight,f=Math.max(0,e.scrollHeight-e.scrollTop-e.clientHeight),h=!s||f===0||f<l;return{distanceFromBottom:f,isAtBottom:h,isScrollable:s,showScrollToBottom:s&&!h}},oe=(e,t=150)=>{const l=e.map(s=>ge(s,t));return{distanceFromBottom:Math.max(0,...l.map(s=>s.distanceFromBottom)),isAtBottom:l.every(s=>s.isAtBottom),isScrollable:l.some(s=>s.isScrollable),showScrollToBottom:l.some(s=>s.showScrollToBottom)}},Ee=(e,t)=>e==="smooth"&&t?"auto":e,ze=e=>e?typeof e=="function"?e():"current"in e?e.current:e:null,Ie=e=>{const{scrollHeight:t,clientHeight:l}=m(e);return t>l+1},xe=e=>{const t=e.ownerDocument.defaultView?.getComputedStyle(e).overflowY;return["auto","scroll","hidden","overlay"].includes(t??"")},ye=(e,t,l="auto")=>{const s=ze(t);if(t!==void 0)return s?[s]:[];const f=e?.current;if(!f)return l!=="never"&&typeof document<"u"?[document]:[];const h=[f,f.parentElement].filter(G=>G!==null&&xe(G));return(l==="always"||l==="auto"&&!h.some(Ie))&&h.push(f.ownerDocument),h},ne=(e,t)=>t?.current?t.current:e.current,M=(e,t)=>e.length===t.length&&e.every((l,s)=>l===t[s]),re=e=>new Map(e.map(t=>[t,m(t).scrollTop])),De=e=>W(e)&&e.defaultView||e,ve=(e,t)=>{W(e)?be(e)?.scrollTo(t):e.scrollTo(t)},Oe=e=>{if(e.defaultPrevented)return!1;if(e.type==="wheel")return e.deltaY!==0;if(e.type==="pointerdown")return!(e.button>0);if(e.type!=="keydown")return!0;const t=e;if(t.ctrlKey||t.metaKey||t.altKey||!["ArrowUp","ArrowDown","PageUp","PageDown","Home","End"," "].includes(t.key))return!1;const l=e.target;return l?.closest?.('input, textarea, select, [contenteditable]:not([contenteditable="false"]), [role="textbox"]')?!1:t.key!==" "||!l?.closest?.('button, a[href], [role="button"]')};function Be(e,t,l){const s=c.useRef(void 0),f=Array.isArray(t)?t:void 0,h=s.current,U=f?h?.length===f.length&&f.every((n,o)=>Object.is(n,h[o]))?h:[...f]:void 0;c.useEffect(()=>{s.current=U},[U]);const Ae=Array.isArray(t)||t===void 0&&l!==void 0?{autoScrollOnInit:!0,scrollThreshold:10,...l,contentVersion:U??l?.contentVersion}:t??{},{contentRef:R,endRef:J,scrollTarget:ce,pageScrollFallback:le="auto",scrollThreshold:q=150,contentVersion:Ce,followNewContent:F=!0,autoScrollOnInit:Q=!1,behavior:se="smooth"}=Ae,[Re,X]=c.useState(!1),[Fe,Pe]=c.useState(!0),[He,ke]=c.useState(F),[ue,Le]=c.useState(0),V=c.useRef(F),z=c.useRef(null),P=c.useRef(F),K=c.useRef(!1),H=c.useRef([]),Z=c.useRef(null),$=c.useRef(null),I=c.useRef(!1),ie=c.useRef([]),b=c.useRef(null),y=c.useRef(null),B=c.useRef(null),k=c.useRef(null),N=c.useRef(null),p=c.useCallback(n=>{V.current=n,ke(o=>o===n?o:n)},[]),Y=c.useCallback(()=>{N.current!==null&&(clearTimeout(N.current),N.current=null)},[]),g=c.useCallback(()=>{k.current&&(k.current.view.cancelAnimationFrame(k.current.id),k.current=null)},[]),d=c.useCallback(()=>{I.current=!1,Y()},[Y]),ae=c.useRef({viewportRef:e,scrollTarget:ce,pageScrollFallback:le});Ve(()=>{ae.current={viewportRef:e,scrollTarget:ce,pageScrollFallback:le}});const w=c.useCallback(()=>{const n=ae.current;return ye(n.viewportRef,n.scrollTarget,n.pageScrollFallback)},[]),x=c.useCallback(n=>{I.current&&!M(n,ie.current)&&(g(),d()),b.current&&!M(n,[...b.current.keys()])&&(b.current=null);const o=oe(n.map(m),q);if(Pe(o.isAtBottom),I.current)return X(o.isAtBottom?o.showScrollToBottom:!1),o.distanceFromBottom<=1&&(d(),p(P.current),z.current=P.current?re(n):null),o;X(o.showScrollToBottom);const i=z.current,S=V.current&&i!==null&&M(n,[...i.keys()])&&n.every(A=>m(A).scrollTop===i.get(A)),T=!b.current&&(o.isAtBottom||S)&&P.current;return z.current=T?re(n):null,p(T),o},[g,d,q,p]),u=c.useCallback(()=>{x(w())},[x,w]),E=c.useCallback((n=se)=>{const o=w();if(o.length===0)return;const i=_(o[0]),S=i?.matchMedia?.("(prefers-reduced-motion: reduce)").matches??!1,T=Ee(n,S),A=T==="auto"?"instant":T;if(b.current=null,z.current=null,I.current=!0,ie.current=o,p(P.current),X(!1),g(),Y(),J?.current?J.current.scrollIntoView({behavior:A,block:"end"}):o.forEach(C=>{const j=m(C).scrollHeight;ve(C,{top:j,behavior:A})}),T==="auto"){if(P.current&&oe(o.map(m),q).isAtBottom&&(z.current=re(o)),i){const C=i.requestAnimationFrame(()=>{k.current=null,d(),u()});k.current={view:i,id:C}}else d(),u();return}N.current=setTimeout(()=>{d(),u()},1200)},[se,g,Y,J,d,w,u,q,p]),D=c.useCallback(()=>{const n=w(),o=e.current,i=ne(e,R);return M(n,H.current)&&o===Z.current&&i===$.current?!1:(M(n,H.current)||x(n),H.current=n,Z.current=o,$.current=i,Le(S=>S+1),!0)},[x,R,w,e]);c.useEffect(()=>{const n=w(),o=n[0]?_(n[0]):e.current?.ownerDocument.defaultView??null;if(n.length===0&&!o)return;H.current=n,Z.current=e.current,$.current=ne(e,R);const i=new Set(n.map(De)),S=new Set([...n.map(_),o].filter(r=>r!==null)),T=new Set(Array.from(S).map(r=>r.visualViewport).filter(r=>!!r)),A=r=>{if(y.current!==null&&o&&o.cancelAnimationFrame(y.current),!o){r();return}y.current=o.requestAnimationFrame(()=>{y.current=null,r()})},C=new Map(n.map(r=>[r,m(r).scrollTop])),j=()=>{I.current&&(b.current=new Map(n.map(r=>[r,m(r).scrollTop])),g(),d(),p(!1),n.forEach(r=>{ve(r,{top:m(r).scrollTop,behavior:"instant"})}),u())},fe=r=>{Oe(r)&&j()},me=()=>{const r=b.current;r&&n.some(a=>m(a).scrollTop!==r.get(a))&&(b.current=null);let v=!1;n.forEach(a=>{const te=m(a).scrollTop;te<(C.get(a)??te)-1&&(v=!0),C.set(a,te)}),v&&j(),u()},L=()=>{A(()=>{D(),K.current&&V.current?E("auto"):u()})},de=["wheel","touchstart","pointerdown","keydown"];i.forEach(r=>{r.addEventListener("scroll",me,{passive:!0}),de.forEach(v=>r.addEventListener(v,fe,{passive:!0,capture:!0}))}),S.forEach(r=>r.addEventListener("resize",L)),T.forEach(r=>r.addEventListener("resize",L));const he=o,we=he?.ResizeObserver,ee=we?new we(L):null,pe=()=>{ee?.disconnect();const r=new Set;e.current&&r.add(e.current);const v=ne(e,R);v&&r.add(v),!R?.current&&e.current&&Array.from(e.current.children).forEach(a=>r.add(a)),n.forEach(a=>{!O(a)&&!W(a)&&r.add(a)}),r.forEach(a=>ee?.observe(a))};pe();const Se=he?.MutationObserver,Te=Se?new Se(()=>{pe(),L()}):null;return e.current&&Te?.observe(e.current,{childList:!0,characterData:!0,subtree:!0}),u(),()=>{i.forEach(r=>{r.removeEventListener("scroll",me),de.forEach(v=>r.removeEventListener(v,fe,!0))}),S.forEach(r=>r.removeEventListener("resize",L)),T.forEach(r=>r.removeEventListener("resize",L)),ee?.disconnect(),Te?.disconnect(),y.current!==null&&o&&(o.cancelAnimationFrame(y.current),y.current=null),M(H.current,n)&&(H.current=[])}},[x,ue,g,R,D,d,w,u,E,p,e]),c.useEffect(()=>{D()}),c.useEffect(()=>{const n=w(),o=n[0]?_(n[0]):null;if(D(),n.length===0)return;const i=!K.current&&Q;if(!K.current&&(K.current=!0,!Q)){u();return}if(B.current!==null&&o&&o.cancelAnimationFrame(B.current),!o){V.current?E("auto"):u();return}return B.current=o.requestAnimationFrame(()=>{B.current=null,V.current||i?E("auto"):u()}),()=>{B.current!==null&&(o.cancelAnimationFrame(B.current),B.current=null)}},[Q,ue,Ce,D,w,u,E]),c.useEffect(()=>{if(P.current=F,!F){p(!1);return}u()},[F,u,p]),c.useEffect(()=>()=>{g(),d()},[g,d]);const Me=c.useCallback(()=>{E()},[E]);return{showScrollToBottom:Re,isAtBottom:Fe,followNewContent:He,scrollToBottom:E,handleUserScrollToBottom:Me,refresh:u}}exports.default=Be;exports.getCombinedScrollPresentation=oe;exports.getScrollMetrics=m;exports.getScrollPresentation=ge;exports.resolveScrollBehavior=Ee;exports.resolveScrollTargets=ye;exports.useScrollToBottom=Be;
|
|
2
2
|
//# sourceMappingURL=useScrollToBottom.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useScrollToBottom.cjs","sources":["../../../src/components/MarkdownFlow/useScrollToBottom.ts"],"sourcesContent":["import {\n useCallback,\n useEffect,\n useRef,\n useState,\n type RefObject,\n} from \"react\";\n\nexport type ScrollBehavior = \"smooth\" | \"auto\";\nexport type ScrollTarget = HTMLElement | Document | Window;\nexport type ScrollTargetRef = RefObject<ScrollTarget | null>;\n\nexport interface UseScrollToBottomOptions {\n contentRef?: RefObject<HTMLElement | null>;\n scrollTarget?: ScrollTarget | ScrollTargetRef | null;\n scrollThreshold?: number;\n contentVersion?: unknown;\n followNewContent?: boolean;\n autoScrollOnInit?: boolean;\n behavior?: ScrollBehavior;\n}\n\nexport interface UseScrollToBottomReturn {\n showScrollToBottom: boolean;\n isAtBottom: boolean;\n followNewContent: boolean;\n scrollToBottom: (behavior?: ScrollBehavior) => void;\n refresh: () => void;\n}\n\nconst isWindow = (target: ScrollTarget): target is Window =>\n typeof Window !== \"undefined\" && target instanceof Window;\n\nconst isDocument = (target: ScrollTarget): target is Document =>\n typeof Document !== \"undefined\" && target instanceof Document;\n\nconst getDocumentScroller = (target: Document | Window): HTMLElement | null => {\n const document = isWindow(target) ? target.document : target;\n return (document.scrollingElement || document.documentElement) as HTMLElement;\n};\n\nexport const getScrollMetrics = (target: ScrollTarget) => {\n if (isWindow(target) || isDocument(target)) {\n const scroller = getDocumentScroller(target);\n const viewportHeight = isWindow(target)\n ? target.innerHeight\n : scroller?.clientHeight || 0;\n return {\n scrollTop: scroller?.scrollTop || 0,\n scrollHeight: scroller?.scrollHeight || 0,\n clientHeight: viewportHeight,\n };\n }\n return {\n scrollTop: target.scrollTop,\n scrollHeight: target.scrollHeight,\n clientHeight: target.clientHeight,\n };\n};\n\nconst scrollTargetValue = (\n target: ScrollTarget | ScrollTargetRef | null | undefined\n): ScrollTarget | null => {\n if (!target) return null;\n return \"current\" in target ? target.current : target;\n};\n\nconst isScrollable = (element: HTMLElement) => {\n const style =\n typeof window !== \"undefined\" ? window.getComputedStyle(element) : null;\n const overflow = style?.overflowY || style?.overflow;\n return element.scrollHeight > element.clientHeight && overflow !== \"visible\";\n};\n\nexport const resolveScrollTarget = (\n contentRef: RefObject<HTMLElement | null> | undefined,\n explicitTarget: ScrollTarget | ScrollTargetRef | null | undefined\n): ScrollTarget | null => {\n const explicit = scrollTargetValue(explicitTarget);\n if (explicit) return explicit;\n const content = contentRef?.current;\n if (!content) return null;\n if (isScrollable(content)) return content;\n let parent = content.parentElement;\n while (parent) {\n if (isScrollable(parent)) return parent;\n parent = parent.parentElement;\n }\n return typeof window !== \"undefined\" ? window : null;\n};\n\nexport const useScrollToBottom = (\n containerRef: RefObject<HTMLElement | null>,\n options: UseScrollToBottomOptions = {}\n): UseScrollToBottomReturn => {\n const {\n contentRef = containerRef,\n scrollTarget,\n scrollThreshold = 150,\n contentVersion,\n followNewContent: followNewContentOption = true,\n autoScrollOnInit = false,\n behavior = \"smooth\",\n } = options;\n const [showScrollToBottom, setShowScrollToBottom] = useState(false);\n const [isAtBottom, setIsAtBottom] = useState(true);\n const followingRef = useRef(followNewContentOption);\n const mountedRef = useRef(false);\n const frameRef = useRef<number | null>(null);\n\n const refresh = useCallback(() => {\n const target = resolveScrollTarget(contentRef, scrollTarget);\n if (!target) return;\n const { scrollTop, scrollHeight, clientHeight } = getScrollMetrics(target);\n const atBottom = scrollTop + clientHeight >= scrollHeight - scrollThreshold;\n setIsAtBottom(atBottom);\n setShowScrollToBottom(!atBottom && scrollHeight > clientHeight);\n if (atBottom) followingRef.current = true;\n }, [contentRef, scrollTarget, scrollThreshold]);\n\n const scrollToBottom = useCallback(\n (requestedBehavior: ScrollBehavior = behavior) => {\n const target = resolveScrollTarget(contentRef, scrollTarget);\n if (!target) return;\n const reducedMotion =\n typeof window !== \"undefined\" &&\n window.matchMedia?.(\"(prefers-reduced-motion: reduce)\").matches;\n const actualBehavior =\n requestedBehavior === \"smooth\" && reducedMotion\n ? \"auto\"\n : requestedBehavior;\n const top = getScrollMetrics(target).scrollHeight;\n if (isWindow(target)) {\n target.scrollTo({ top, behavior: actualBehavior });\n } else if (isDocument(target)) {\n getDocumentScroller(target)?.scrollTo({\n top,\n behavior: actualBehavior,\n });\n } else {\n target.scrollTo({ top, behavior: actualBehavior });\n }\n followingRef.current = true;\n setIsAtBottom(true);\n setShowScrollToBottom(false);\n },\n [behavior, contentRef, scrollTarget]\n );\n\n useEffect(() => {\n const target = resolveScrollTarget(contentRef, scrollTarget);\n if (!target) return;\n const handleScroll = () => {\n if (frameRef.current !== null) cancelAnimationFrame(frameRef.current);\n frameRef.current = requestAnimationFrame(() => {\n frameRef.current = null;\n const metrics = getScrollMetrics(target);\n if (\n metrics.scrollTop + metrics.clientHeight <\n metrics.scrollHeight - scrollThreshold\n ) {\n followingRef.current = false;\n }\n refresh();\n });\n };\n const handleResize = () => handleScroll();\n target.addEventListener(\"scroll\", handleScroll, { passive: true });\n window.addEventListener(\"resize\", handleResize);\n const observer =\n typeof ResizeObserver !== \"undefined\"\n ? new ResizeObserver(handleResize)\n : null;\n if (contentRef.current) observer?.observe(contentRef.current);\n if (\n typeof Element !== \"undefined\" &&\n target instanceof Element &&\n target !== contentRef.current\n ) {\n observer?.observe(target);\n }\n refresh();\n return () => {\n target.removeEventListener(\"scroll\", handleScroll);\n window.removeEventListener(\"resize\", handleResize);\n observer?.disconnect();\n if (frameRef.current !== null) cancelAnimationFrame(frameRef.current);\n };\n }, [contentRef, refresh, scrollTarget, scrollThreshold]);\n\n useEffect(() => {\n if (!mountedRef.current) {\n mountedRef.current = true;\n if (autoScrollOnInit) scrollToBottom(\"auto\");\n return;\n }\n if (followingRef.current) {\n const frame = requestAnimationFrame(() => scrollToBottom(\"auto\"));\n return () => cancelAnimationFrame(frame);\n }\n refresh();\n }, [autoScrollOnInit, contentVersion, refresh, scrollToBottom]);\n\n useEffect(() => {\n followingRef.current = followNewContentOption;\n }, [followNewContentOption]);\n\n return {\n showScrollToBottom,\n isAtBottom,\n followNewContent: followingRef.current,\n scrollToBottom,\n refresh,\n };\n};\n\nexport default useScrollToBottom;\n"],"names":["isWindow","target","isDocument","getDocumentScroller","document","getScrollMetrics","scroller","viewportHeight","scrollTargetValue","isScrollable","element","style","overflow","resolveScrollTarget","contentRef","explicitTarget","explicit","content","parent","useScrollToBottom","containerRef","options","scrollTarget","scrollThreshold","contentVersion","followNewContentOption","autoScrollOnInit","behavior","showScrollToBottom","setShowScrollToBottom","useState","isAtBottom","setIsAtBottom","followingRef","useRef","mountedRef","frameRef","refresh","useCallback","scrollTop","scrollHeight","clientHeight","atBottom","scrollToBottom","requestedBehavior","reducedMotion","actualBehavior","top","useEffect","handleScroll","metrics","handleResize","observer","frame"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useScrollToBottom.cjs","sources":["../../../src/components/MarkdownFlow/useScrollToBottom.ts"],"sourcesContent":["import {\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n type RefObject,\n} from \"react\";\n\nconst useCommittedLayoutEffect =\n typeof window === \"undefined\" ? useEffect : useLayoutEffect;\n\nexport type ScrollBehavior = \"smooth\" | \"auto\";\nexport type PageScrollFallback = \"auto\" | \"always\" | \"never\";\nexport type ScrollTarget = HTMLElement | Document | Window;\nexport type ScrollTargetRef = RefObject<ScrollTarget | null>;\nexport type ScrollTargetResolver = () => ScrollTarget | null;\nexport type ScrollTargetInput =\n | ScrollTarget\n | ScrollTargetRef\n | ScrollTargetResolver\n | null;\n\nexport interface ScrollMetrics {\n scrollTop: number;\n scrollHeight: number;\n clientHeight: number;\n}\n\nexport interface ScrollPresentation {\n distanceFromBottom: number;\n isAtBottom: boolean;\n isScrollable: boolean;\n showScrollToBottom: boolean;\n}\n\nexport interface UseScrollToBottomOptions {\n /** Actual content box whose growth should be observed. Defaults to all direct element children of the viewport. */\n contentRef?: RefObject<HTMLElement | null>;\n /** Optional bottom anchor used to preserve nested-container scrollIntoView behavior. */\n endRef?: RefObject<HTMLElement | null>;\n /** Explicit scroll target or resolver. Unresolved targets stay inactive; omit to infer viewport, parent and page roots. */\n scrollTarget?: ScrollTargetInput;\n /** Whether page scrolling joins the viewport and parent targets. */\n pageScrollFallback?: PageScrollFallback;\n /** Near-bottom distance in pixels. Defaults to the strict 150px threshold. */\n scrollThreshold?: number;\n /** Optional refresh signal; DOM growth is observed without this prop. */\n contentVersion?: unknown;\n /** Follow growth while at the bottom, and pause after scrolling away. Defaults to true. */\n followNewContent?: boolean;\n /** Scroll to the end on the first mount. Defaults to false. */\n autoScrollOnInit?: boolean;\n /** User-triggered behavior. Auto and reduced-motion scrolling are immediate, regardless of host CSS. */\n behavior?: ScrollBehavior;\n}\n\nexport interface UseScrollToBottomReturn {\n showScrollToBottom: boolean;\n isAtBottom: boolean;\n followNewContent: boolean;\n scrollToBottom: (behavior?: ScrollBehavior) => void;\n /** Backward-compatible click handler that ignores React event arguments. */\n handleUserScrollToBottom: () => void;\n refresh: () => void;\n}\n\nexport interface LegacyUseScrollToBottomOptions\n extends UseScrollToBottomOptions {\n /** Retained for source compatibility; scrolling now follows browser frames and observers. */\n scrollDelay?: number;\n}\n\nconst isWindow = (target: ScrollTarget): target is Window =>\n \"window\" in target && target.window === target;\n\nconst isDocument = (target: ScrollTarget): target is Document =>\n \"nodeType\" in target && target.nodeType === 9;\n\nconst getDocumentScroller = (target: Document | Window): HTMLElement | null => {\n const document = isWindow(target) ? target.document : target;\n return (document.scrollingElement || document.documentElement) as HTMLElement;\n};\n\nconst getTargetWindow = (target: ScrollTarget): Window | null => {\n if (isWindow(target)) return target;\n if (isDocument(target)) return target.defaultView;\n return target.ownerDocument.defaultView;\n};\n\nexport const getScrollMetrics = (target: ScrollTarget): ScrollMetrics => {\n if (isWindow(target) || isDocument(target)) {\n const scroller = getDocumentScroller(target);\n const viewportHeight = isWindow(target)\n ? target.innerHeight\n : scroller?.clientHeight || 0;\n return {\n scrollTop: scroller?.scrollTop || 0,\n scrollHeight: scroller?.scrollHeight || 0,\n clientHeight: viewportHeight,\n };\n }\n return {\n scrollTop: target.scrollTop,\n scrollHeight: target.scrollHeight,\n clientHeight: target.clientHeight,\n };\n};\n\nexport const getScrollPresentation = (\n metrics: ScrollMetrics,\n threshold = 150\n): ScrollPresentation => {\n const normalizedThreshold = Math.max(0, threshold);\n const isScrollable = metrics.scrollHeight > metrics.clientHeight;\n const distanceFromBottom = Math.max(\n 0,\n metrics.scrollHeight - metrics.scrollTop - metrics.clientHeight\n );\n const isAtBottom =\n !isScrollable ||\n distanceFromBottom === 0 ||\n distanceFromBottom < normalizedThreshold;\n return {\n distanceFromBottom,\n isAtBottom,\n isScrollable,\n showScrollToBottom: isScrollable && !isAtBottom,\n };\n};\n\nexport const getCombinedScrollPresentation = (\n metrics: ScrollMetrics[],\n threshold = 150\n): ScrollPresentation => {\n const presentations = metrics.map((item) =>\n getScrollPresentation(item, threshold)\n );\n return {\n distanceFromBottom: Math.max(\n 0,\n ...presentations.map((item) => item.distanceFromBottom)\n ),\n isAtBottom: presentations.every((item) => item.isAtBottom),\n isScrollable: presentations.some((item) => item.isScrollable),\n showScrollToBottom: presentations.some((item) => item.showScrollToBottom),\n };\n};\n\nexport const resolveScrollBehavior = (\n requestedBehavior: ScrollBehavior,\n prefersReducedMotion: boolean\n): ScrollBehavior =>\n requestedBehavior === \"smooth\" && prefersReducedMotion\n ? \"auto\"\n : requestedBehavior;\n\nconst scrollTargetValue = (\n target: ScrollTargetInput | undefined\n): ScrollTarget | null => {\n if (!target) return null;\n if (typeof target === \"function\") return target();\n return \"current\" in target ? target.current : target;\n};\n\nconst hasScrollableContent = (target: ScrollTarget) => {\n const { scrollHeight, clientHeight } = getScrollMetrics(target);\n return scrollHeight > clientHeight + 1;\n};\n\nconst permitsElementScrolling = (target: HTMLElement) => {\n const overflowY =\n target.ownerDocument.defaultView?.getComputedStyle(target).overflowY;\n return [\"auto\", \"scroll\", \"hidden\", \"overlay\"].includes(overflowY ?? \"\");\n};\n\nexport const resolveScrollTargets = (\n viewportRef: RefObject<HTMLElement | null> | undefined,\n explicitTarget: ScrollTargetInput | undefined,\n pageScrollFallback: PageScrollFallback = \"auto\"\n): ScrollTarget[] => {\n const explicit = scrollTargetValue(explicitTarget);\n if (explicitTarget !== undefined) return explicit ? [explicit] : [];\n\n const viewport = viewportRef?.current;\n if (!viewport) {\n return pageScrollFallback !== \"never\" && typeof document !== \"undefined\"\n ? [document]\n : [];\n }\n\n const localTargets: ScrollTarget[] = [\n viewport,\n viewport.parentElement,\n ].filter(\n (target): target is HTMLElement =>\n target !== null && permitsElementScrolling(target)\n );\n\n const shouldUsePageScroll =\n pageScrollFallback === \"always\" ||\n (pageScrollFallback === \"auto\" && !localTargets.some(hasScrollableContent));\n if (shouldUsePageScroll) localTargets.push(viewport.ownerDocument);\n\n return localTargets;\n};\n\nexport const resolveScrollTarget = (\n viewportRef: RefObject<HTMLElement | null> | undefined,\n explicitTarget: ScrollTargetInput | undefined\n): ScrollTarget | null =>\n resolveScrollTargets(viewportRef, explicitTarget, \"auto\")[0] ?? null;\n\nconst resolveObservedContent = (\n viewportRef: RefObject<HTMLElement | null>,\n contentRef: RefObject<HTMLElement | null> | undefined\n) => {\n if (contentRef?.current) return contentRef.current;\n return viewportRef.current;\n};\n\nconst sameTargets = (left: ScrollTarget[], right: ScrollTarget[]) =>\n left.length === right.length &&\n left.every((target, index) => target === right[index]);\n\nconst getScrollPositions = (targets: ScrollTarget[]) =>\n new Map(\n targets.map((target) => [target, getScrollMetrics(target).scrollTop])\n );\n\nconst getScrollEventTarget = (target: ScrollTarget): EventTarget =>\n isDocument(target) ? target.defaultView || target : target;\n\nconst scrollTargetTo = (target: ScrollTarget, options: ScrollToOptions) => {\n if (isDocument(target)) getDocumentScroller(target)?.scrollTo(options);\n else target.scrollTo(options);\n};\n\nconst isScrollInput = (event: Event) => {\n if (event.defaultPrevented) return false;\n if (event.type === \"wheel\") return (event as WheelEvent).deltaY !== 0;\n if (event.type === \"pointerdown\")\n return !((event as PointerEvent).button > 0);\n if (event.type !== \"keydown\") return true;\n const key = event as KeyboardEvent;\n if (key.ctrlKey || key.metaKey || key.altKey) return false;\n if (\n ![\n \"ArrowUp\",\n \"ArrowDown\",\n \"PageUp\",\n \"PageDown\",\n \"Home\",\n \"End\",\n \" \",\n ].includes(key.key)\n )\n return false;\n const element = event.target as Element | null;\n if (\n element?.closest?.(\n 'input, textarea, select, [contenteditable]:not([contenteditable=\"false\"]), [role=\"textbox\"]'\n )\n )\n return false;\n return (\n key.key !== \" \" || !element?.closest?.('button, a[href], [role=\"button\"]')\n );\n};\n\nexport function useScrollToBottom(\n viewportRef: RefObject<HTMLElement | null>,\n options?: UseScrollToBottomOptions\n): UseScrollToBottomReturn;\nexport function useScrollToBottom(\n viewportRef: RefObject<HTMLElement | null>,\n dependencies?: readonly unknown[],\n options?: LegacyUseScrollToBottomOptions\n): UseScrollToBottomReturn;\nexport function useScrollToBottom(\n viewportRef: RefObject<HTMLElement | null>,\n optionsOrDependencies?: UseScrollToBottomOptions | readonly unknown[],\n legacyOptions?: LegacyUseScrollToBottomOptions\n): UseScrollToBottomReturn {\n const committedDependencies = useRef<readonly unknown[] | undefined>(\n undefined\n );\n const dependencies = Array.isArray(optionsOrDependencies)\n ? optionsOrDependencies\n : undefined;\n const previousDependencies = committedDependencies.current;\n const stableDependencies = dependencies\n ? previousDependencies?.length === dependencies.length &&\n dependencies.every((value, index) =>\n Object.is(value, previousDependencies[index])\n )\n ? previousDependencies\n : [...dependencies]\n : undefined;\n // Commit a snapshot so unrelated renders preserve legacy dependency values,\n // including NaN and object identity, without leaking an abandoned render.\n useEffect(() => {\n committedDependencies.current = stableDependencies;\n }, [stableDependencies]);\n const isLegacyCall =\n Array.isArray(optionsOrDependencies) ||\n (optionsOrDependencies === undefined && legacyOptions !== undefined);\n const options: UseScrollToBottomOptions = isLegacyCall\n ? {\n autoScrollOnInit: true,\n scrollThreshold: 10,\n ...legacyOptions,\n contentVersion: stableDependencies ?? legacyOptions?.contentVersion,\n }\n : ((optionsOrDependencies as UseScrollToBottomOptions | undefined) ?? {});\n const {\n contentRef,\n endRef,\n scrollTarget,\n pageScrollFallback = \"auto\",\n scrollThreshold = 150,\n contentVersion,\n followNewContent: followNewContentOption = true,\n autoScrollOnInit = false,\n behavior = \"smooth\",\n } = options;\n const [showScrollToBottom, setShowScrollToBottom] = useState(false);\n const [isAtBottom, setIsAtBottom] = useState(true);\n const [isFollowing, setIsFollowing] = useState(followNewContentOption);\n const [bindingRevision, setBindingRevision] = useState(0);\n const followingRef = useRef(followNewContentOption);\n const followingPositionsRef = useRef<Map<ScrollTarget, number> | null>(null);\n const followEnabledRef = useRef(followNewContentOption);\n const initializedRef = useRef(false);\n const boundTargetsRef = useRef<ScrollTarget[]>([]);\n const boundViewportRef = useRef<HTMLElement | null>(null);\n const boundContentRef = useRef<HTMLElement | null>(null);\n const programmaticScrollRef = useRef(false);\n const programmaticTargetsRef = useRef<ScrollTarget[]>([]);\n const interruptedPositionsRef = useRef<Map<ScrollTarget, number> | null>(\n null\n );\n const eventFrameRef = useRef<number | null>(null);\n const contentFrameRef = useRef<number | null>(null);\n const programmaticFrameRef = useRef<{\n view: Window;\n id: number;\n } | null>(null);\n const settleTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const setFollowing = useCallback((next: boolean) => {\n followingRef.current = next;\n setIsFollowing((current) => (current === next ? current : next));\n }, []);\n\n const clearSettleTimer = useCallback(() => {\n if (settleTimerRef.current !== null) {\n clearTimeout(settleTimerRef.current);\n settleTimerRef.current = null;\n }\n }, []);\n\n const clearProgrammaticFrame = useCallback(() => {\n if (programmaticFrameRef.current) {\n programmaticFrameRef.current.view.cancelAnimationFrame(\n programmaticFrameRef.current.id\n );\n programmaticFrameRef.current = null;\n }\n }, []);\n\n const finishProgrammaticScroll = useCallback(() => {\n programmaticScrollRef.current = false;\n clearSettleTimer();\n }, [clearSettleTimer]);\n\n const targetInputsRef = useRef({\n viewportRef,\n scrollTarget,\n pageScrollFallback,\n });\n // Read the latest committed inputs without replaying effects for equivalent\n // inline resolver functions. Abandoned renders must not change live targets.\n useCommittedLayoutEffect(() => {\n targetInputsRef.current = { viewportRef, scrollTarget, pageScrollFallback };\n });\n const getResolvedTargets = useCallback(() => {\n const inputs = targetInputsRef.current;\n return resolveScrollTargets(\n inputs.viewportRef,\n inputs.scrollTarget,\n inputs.pageScrollFallback\n );\n }, []);\n\n const applyPresentation = useCallback(\n (targets: ScrollTarget[]) => {\n if (\n programmaticScrollRef.current &&\n !sameTargets(targets, programmaticTargetsRef.current)\n ) {\n clearProgrammaticFrame();\n finishProgrammaticScroll();\n }\n if (\n interruptedPositionsRef.current &&\n !sameTargets(targets, [...interruptedPositionsRef.current.keys()])\n ) {\n interruptedPositionsRef.current = null;\n }\n const presentation = getCombinedScrollPresentation(\n targets.map(getScrollMetrics),\n scrollThreshold\n );\n setIsAtBottom(presentation.isAtBottom);\n\n if (programmaticScrollRef.current) {\n setShowScrollToBottom(\n presentation.isAtBottom ? presentation.showScrollToBottom : false\n );\n // The visibility threshold is not the native animation's destination.\n if (presentation.distanceFromBottom <= 1) {\n finishProgrammaticScroll();\n setFollowing(followEnabledRef.current);\n followingPositionsRef.current = followEnabledRef.current\n ? getScrollPositions(targets)\n : null;\n }\n return presentation;\n }\n\n setShowScrollToBottom(presentation.showScrollToBottom);\n const followingPositions = followingPositionsRef.current;\n // A queued native event can arrive after content grows but before its\n // observer runs. Unchanged positions are not a request to stop following.\n const stayedAtFollowingPosition =\n followingRef.current &&\n followingPositions !== null &&\n sameTargets(targets, [...followingPositions.keys()]) &&\n targets.every(\n (target) =>\n getScrollMetrics(target).scrollTop ===\n followingPositions.get(target)\n );\n const nextFollowing =\n !interruptedPositionsRef.current &&\n (presentation.isAtBottom || stayedAtFollowingPosition) &&\n followEnabledRef.current;\n followingPositionsRef.current = nextFollowing\n ? getScrollPositions(targets)\n : null;\n setFollowing(nextFollowing);\n return presentation;\n },\n [\n clearProgrammaticFrame,\n finishProgrammaticScroll,\n scrollThreshold,\n setFollowing,\n ]\n );\n\n const refresh = useCallback(() => {\n applyPresentation(getResolvedTargets());\n }, [applyPresentation, getResolvedTargets]);\n\n const scrollToBottom = useCallback(\n (requestedBehavior: ScrollBehavior = behavior) => {\n const targets = getResolvedTargets();\n if (targets.length === 0) return;\n\n const view = getTargetWindow(targets[0]);\n const prefersReducedMotion =\n view?.matchMedia?.(\"(prefers-reduced-motion: reduce)\").matches ?? false;\n const actualBehavior = resolveScrollBehavior(\n requestedBehavior,\n prefersReducedMotion\n );\n // Native \"auto\" can inherit CSS smooth scrolling; our auto path must finish immediately.\n const nativeBehavior =\n actualBehavior === \"auto\" ? \"instant\" : actualBehavior;\n\n interruptedPositionsRef.current = null;\n followingPositionsRef.current = null;\n programmaticScrollRef.current = true;\n programmaticTargetsRef.current = targets;\n setFollowing(followEnabledRef.current);\n setShowScrollToBottom(false);\n clearProgrammaticFrame();\n clearSettleTimer();\n\n if (endRef?.current) {\n endRef.current.scrollIntoView({\n behavior: nativeBehavior,\n block: \"end\",\n });\n } else {\n targets.forEach((target) => {\n const top = getScrollMetrics(target).scrollHeight;\n scrollTargetTo(target, { top, behavior: nativeBehavior });\n });\n }\n\n if (actualBehavior === \"auto\") {\n // Immediate native scrolling has already reached its destination;\n // retain that position if content grows before the completion frame.\n if (\n followEnabledRef.current &&\n getCombinedScrollPresentation(\n targets.map(getScrollMetrics),\n scrollThreshold\n ).isAtBottom\n ) {\n followingPositionsRef.current = getScrollPositions(targets);\n }\n if (view) {\n const id = view.requestAnimationFrame(() => {\n programmaticFrameRef.current = null;\n finishProgrammaticScroll();\n refresh();\n });\n programmaticFrameRef.current = { view, id };\n } else {\n finishProgrammaticScroll();\n refresh();\n }\n return;\n }\n\n settleTimerRef.current = setTimeout(() => {\n finishProgrammaticScroll();\n refresh();\n }, 1200);\n },\n [\n behavior,\n clearProgrammaticFrame,\n clearSettleTimer,\n endRef,\n finishProgrammaticScroll,\n getResolvedTargets,\n refresh,\n scrollThreshold,\n setFollowing,\n ]\n );\n\n const ensureTargetBinding = useCallback(() => {\n const nextTargets = getResolvedTargets();\n const nextViewport = viewportRef.current;\n const nextContent = resolveObservedContent(viewportRef, contentRef);\n if (\n sameTargets(nextTargets, boundTargetsRef.current) &&\n nextViewport === boundViewportRef.current &&\n nextContent === boundContentRef.current\n )\n return false;\n // Reconcile before any queued layout frame can follow the replacement.\n if (!sameTargets(nextTargets, boundTargetsRef.current)) {\n applyPresentation(nextTargets);\n }\n boundTargetsRef.current = nextTargets;\n boundViewportRef.current = nextViewport;\n boundContentRef.current = nextContent;\n setBindingRevision((current) => current + 1);\n return true;\n }, [applyPresentation, contentRef, getResolvedTargets, viewportRef]);\n\n useEffect(() => {\n const targets = getResolvedTargets();\n const targetWindow = targets[0]\n ? getTargetWindow(targets[0])\n : (viewportRef.current?.ownerDocument.defaultView ?? null);\n if (targets.length === 0 && !targetWindow) return;\n\n boundTargetsRef.current = targets;\n boundViewportRef.current = viewportRef.current;\n boundContentRef.current = resolveObservedContent(viewportRef, contentRef);\n const eventTargets = new Set(targets.map(getScrollEventTarget));\n const targetWindows = new Set(\n [...targets.map(getTargetWindow), targetWindow].filter(\n (view): view is Window => view !== null\n )\n );\n const visualViewports = new Set(\n Array.from(targetWindows)\n .map((view) => view.visualViewport)\n .filter((viewport): viewport is VisualViewport => Boolean(viewport))\n );\n\n const scheduleEvent = (callback: () => void) => {\n if (eventFrameRef.current !== null && targetWindow) {\n targetWindow.cancelAnimationFrame(eventFrameRef.current);\n }\n if (!targetWindow) {\n callback();\n return;\n }\n eventFrameRef.current = targetWindow.requestAnimationFrame(() => {\n eventFrameRef.current = null;\n callback();\n });\n };\n\n const lastPositions = new Map(\n targets.map((target) => [target, getScrollMetrics(target).scrollTop])\n );\n const interruptProgrammaticScroll = () => {\n if (!programmaticScrollRef.current) return;\n interruptedPositionsRef.current = new Map(\n targets.map((target) => [target, getScrollMetrics(target).scrollTop])\n );\n clearProgrammaticFrame();\n finishProgrammaticScroll();\n setFollowing(false);\n targets.forEach((target) => {\n // Stop the native animation as well as the library's completion work.\n scrollTargetTo(target, {\n top: getScrollMetrics(target).scrollTop,\n behavior: \"instant\",\n });\n });\n refresh();\n };\n const handleInput = (event: Event) => {\n if (isScrollInput(event)) interruptProgrammaticScroll();\n };\n const handleScroll = () => {\n const interruptedPositions = interruptedPositionsRef.current;\n // Cancellation itself can queue an unchanged scroll event. Only new\n // positions can release the input pause; layout refreshes cannot.\n if (\n interruptedPositions &&\n targets.some(\n (target) =>\n getScrollMetrics(target).scrollTop !==\n interruptedPositions.get(target)\n )\n ) {\n interruptedPositionsRef.current = null;\n }\n let movedAway = false;\n targets.forEach((target) => {\n const top = getScrollMetrics(target).scrollTop;\n if (top < (lastPositions.get(target) ?? top) - 1) movedAway = true;\n lastPositions.set(target, top);\n });\n // Scrollbar dragging may not emit a content pointer event in every browser.\n if (movedAway) interruptProgrammaticScroll();\n // Record user intent before an observer or content frame can follow growth.\n refresh();\n };\n\n const handleLayoutChange = () => {\n scheduleEvent(() => {\n ensureTargetBinding();\n if (initializedRef.current && followingRef.current) {\n scrollToBottom(\"auto\");\n } else {\n refresh();\n }\n });\n };\n\n const inputEvents = [\"wheel\", \"touchstart\", \"pointerdown\", \"keydown\"];\n eventTargets.forEach((eventTarget) => {\n eventTarget.addEventListener(\"scroll\", handleScroll, { passive: true });\n inputEvents.forEach((type) =>\n eventTarget.addEventListener(type, handleInput, {\n passive: true,\n capture: true,\n })\n );\n });\n targetWindows.forEach((view) =>\n view.addEventListener(\"resize\", handleLayoutChange)\n );\n visualViewports.forEach((viewport) =>\n viewport.addEventListener(\"resize\", handleLayoutChange)\n );\n\n const observerWindow = targetWindow as (Window & typeof globalThis) | null;\n const ResizeObserverConstructor = observerWindow?.ResizeObserver;\n const resizeObserver = ResizeObserverConstructor\n ? new ResizeObserverConstructor(handleLayoutChange)\n : null;\n const observeResizeTargets = () => {\n resizeObserver?.disconnect();\n const elements = new Set<Element>();\n if (viewportRef.current) elements.add(viewportRef.current);\n const observedContent = resolveObservedContent(viewportRef, contentRef);\n if (observedContent) elements.add(observedContent);\n // A fixed-height viewport does not resize when a later message or image\n // grows. Without a content wrapper, every direct child is a resize root.\n if (!contentRef?.current && viewportRef.current) {\n Array.from(viewportRef.current.children).forEach((element) =>\n elements.add(element)\n );\n }\n targets.forEach((target) => {\n if (!isWindow(target) && !isDocument(target)) elements.add(target);\n });\n elements.forEach((element) => resizeObserver?.observe(element));\n };\n observeResizeTargets();\n\n const MutationObserverConstructor = observerWindow?.MutationObserver;\n const mutationObserver = MutationObserverConstructor\n ? new MutationObserverConstructor(() => {\n observeResizeTargets();\n handleLayoutChange();\n })\n : null;\n if (viewportRef.current) {\n mutationObserver?.observe(viewportRef.current, {\n childList: true,\n characterData: true,\n subtree: true,\n });\n }\n\n refresh();\n return () => {\n eventTargets.forEach((eventTarget) => {\n eventTarget.removeEventListener(\"scroll\", handleScroll);\n inputEvents.forEach((type) =>\n eventTarget.removeEventListener(type, handleInput, true)\n );\n });\n targetWindows.forEach((view) =>\n view.removeEventListener(\"resize\", handleLayoutChange)\n );\n visualViewports.forEach((viewport) =>\n viewport.removeEventListener(\"resize\", handleLayoutChange)\n );\n resizeObserver?.disconnect();\n mutationObserver?.disconnect();\n if (eventFrameRef.current !== null && targetWindow) {\n targetWindow.cancelAnimationFrame(eventFrameRef.current);\n eventFrameRef.current = null;\n }\n if (sameTargets(boundTargetsRef.current, targets)) {\n boundTargetsRef.current = [];\n }\n };\n }, [\n applyPresentation,\n bindingRevision,\n clearProgrammaticFrame,\n contentRef,\n ensureTargetBinding,\n finishProgrammaticScroll,\n getResolvedTargets,\n refresh,\n scrollToBottom,\n setFollowing,\n viewportRef,\n ]);\n\n // Ref objects are stable even when a host replaces their nodes during commit.\n useEffect(() => {\n ensureTargetBinding();\n });\n\n useEffect(() => {\n const targets = getResolvedTargets();\n const targetWindow = targets[0] ? getTargetWindow(targets[0]) : null;\n ensureTargetBinding();\n // An explicit ref may mount later; defer initialization until it resolves.\n if (targets.length === 0) return;\n const shouldAutoScrollOnInit = !initializedRef.current && autoScrollOnInit;\n\n if (!initializedRef.current) {\n initializedRef.current = true;\n if (!autoScrollOnInit) {\n refresh();\n return;\n }\n }\n\n if (contentFrameRef.current !== null && targetWindow) {\n targetWindow.cancelAnimationFrame(contentFrameRef.current);\n }\n if (!targetWindow) {\n if (followingRef.current) scrollToBottom(\"auto\");\n else refresh();\n return;\n }\n\n contentFrameRef.current = targetWindow.requestAnimationFrame(() => {\n contentFrameRef.current = null;\n if (followingRef.current || shouldAutoScrollOnInit) {\n scrollToBottom(\"auto\");\n } else refresh();\n });\n\n return () => {\n if (contentFrameRef.current !== null) {\n targetWindow.cancelAnimationFrame(contentFrameRef.current);\n contentFrameRef.current = null;\n }\n };\n }, [\n autoScrollOnInit,\n bindingRevision,\n contentVersion,\n ensureTargetBinding,\n getResolvedTargets,\n refresh,\n scrollToBottom,\n ]);\n\n useEffect(() => {\n followEnabledRef.current = followNewContentOption;\n if (!followNewContentOption) {\n setFollowing(false);\n return;\n }\n refresh();\n }, [followNewContentOption, refresh, setFollowing]);\n\n useEffect(\n () => () => {\n clearProgrammaticFrame();\n finishProgrammaticScroll();\n },\n [clearProgrammaticFrame, finishProgrammaticScroll]\n );\n\n const handleUserScrollToBottom = useCallback(() => {\n scrollToBottom();\n }, [scrollToBottom]);\n\n return {\n showScrollToBottom,\n isAtBottom,\n followNewContent: isFollowing,\n scrollToBottom,\n handleUserScrollToBottom,\n refresh,\n };\n}\n\nexport default useScrollToBottom;\n"],"names":["useCommittedLayoutEffect","useEffect","useLayoutEffect","isWindow","target","isDocument","getDocumentScroller","document","getTargetWindow","getScrollMetrics","scroller","viewportHeight","getScrollPresentation","metrics","threshold","normalizedThreshold","isScrollable","distanceFromBottom","isAtBottom","getCombinedScrollPresentation","presentations","item","resolveScrollBehavior","requestedBehavior","prefersReducedMotion","scrollTargetValue","hasScrollableContent","scrollHeight","clientHeight","permitsElementScrolling","overflowY","resolveScrollTargets","viewportRef","explicitTarget","pageScrollFallback","explicit","viewport","localTargets","resolveObservedContent","contentRef","sameTargets","left","right","index","getScrollPositions","targets","getScrollEventTarget","scrollTargetTo","options","isScrollInput","event","key","element","useScrollToBottom","optionsOrDependencies","legacyOptions","committedDependencies","useRef","dependencies","previousDependencies","stableDependencies","value","endRef","scrollTarget","scrollThreshold","contentVersion","followNewContentOption","autoScrollOnInit","behavior","showScrollToBottom","setShowScrollToBottom","useState","setIsAtBottom","isFollowing","setIsFollowing","bindingRevision","setBindingRevision","followingRef","followingPositionsRef","followEnabledRef","initializedRef","boundTargetsRef","boundViewportRef","boundContentRef","programmaticScrollRef","programmaticTargetsRef","interruptedPositionsRef","eventFrameRef","contentFrameRef","programmaticFrameRef","settleTimerRef","setFollowing","useCallback","next","current","clearSettleTimer","clearProgrammaticFrame","finishProgrammaticScroll","targetInputsRef","getResolvedTargets","inputs","applyPresentation","presentation","followingPositions","stayedAtFollowingPosition","nextFollowing","refresh","scrollToBottom","view","actualBehavior","nativeBehavior","top","id","ensureTargetBinding","nextTargets","nextViewport","nextContent","targetWindow","eventTargets","targetWindows","visualViewports","scheduleEvent","callback","lastPositions","interruptProgrammaticScroll","handleInput","handleScroll","interruptedPositions","movedAway","handleLayoutChange","inputEvents","eventTarget","type","observerWindow","ResizeObserverConstructor","resizeObserver","observeResizeTargets","elements","observedContent","MutationObserverConstructor","mutationObserver","shouldAutoScrollOnInit","handleUserScrollToBottom"],"mappings":"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"}
|
|
@@ -1,14 +1,39 @@
|
|
|
1
1
|
import { RefObject } from 'react';
|
|
2
2
|
export type ScrollBehavior = "smooth" | "auto";
|
|
3
|
+
export type PageScrollFallback = "auto" | "always" | "never";
|
|
3
4
|
export type ScrollTarget = HTMLElement | Document | Window;
|
|
4
5
|
export type ScrollTargetRef = RefObject<ScrollTarget | null>;
|
|
6
|
+
export type ScrollTargetResolver = () => ScrollTarget | null;
|
|
7
|
+
export type ScrollTargetInput = ScrollTarget | ScrollTargetRef | ScrollTargetResolver | null;
|
|
8
|
+
export interface ScrollMetrics {
|
|
9
|
+
scrollTop: number;
|
|
10
|
+
scrollHeight: number;
|
|
11
|
+
clientHeight: number;
|
|
12
|
+
}
|
|
13
|
+
export interface ScrollPresentation {
|
|
14
|
+
distanceFromBottom: number;
|
|
15
|
+
isAtBottom: boolean;
|
|
16
|
+
isScrollable: boolean;
|
|
17
|
+
showScrollToBottom: boolean;
|
|
18
|
+
}
|
|
5
19
|
export interface UseScrollToBottomOptions {
|
|
20
|
+
/** Actual content box whose growth should be observed. Defaults to all direct element children of the viewport. */
|
|
6
21
|
contentRef?: RefObject<HTMLElement | null>;
|
|
7
|
-
|
|
22
|
+
/** Optional bottom anchor used to preserve nested-container scrollIntoView behavior. */
|
|
23
|
+
endRef?: RefObject<HTMLElement | null>;
|
|
24
|
+
/** Explicit scroll target or resolver. Unresolved targets stay inactive; omit to infer viewport, parent and page roots. */
|
|
25
|
+
scrollTarget?: ScrollTargetInput;
|
|
26
|
+
/** Whether page scrolling joins the viewport and parent targets. */
|
|
27
|
+
pageScrollFallback?: PageScrollFallback;
|
|
28
|
+
/** Near-bottom distance in pixels. Defaults to the strict 150px threshold. */
|
|
8
29
|
scrollThreshold?: number;
|
|
30
|
+
/** Optional refresh signal; DOM growth is observed without this prop. */
|
|
9
31
|
contentVersion?: unknown;
|
|
32
|
+
/** Follow growth while at the bottom, and pause after scrolling away. Defaults to true. */
|
|
10
33
|
followNewContent?: boolean;
|
|
34
|
+
/** Scroll to the end on the first mount. Defaults to false. */
|
|
11
35
|
autoScrollOnInit?: boolean;
|
|
36
|
+
/** User-triggered behavior. Auto and reduced-motion scrolling are immediate, regardless of host CSS. */
|
|
12
37
|
behavior?: ScrollBehavior;
|
|
13
38
|
}
|
|
14
39
|
export interface UseScrollToBottomReturn {
|
|
@@ -16,13 +41,20 @@ export interface UseScrollToBottomReturn {
|
|
|
16
41
|
isAtBottom: boolean;
|
|
17
42
|
followNewContent: boolean;
|
|
18
43
|
scrollToBottom: (behavior?: ScrollBehavior) => void;
|
|
44
|
+
/** Backward-compatible click handler that ignores React event arguments. */
|
|
45
|
+
handleUserScrollToBottom: () => void;
|
|
19
46
|
refresh: () => void;
|
|
20
47
|
}
|
|
21
|
-
export
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
export declare const
|
|
27
|
-
export declare const
|
|
48
|
+
export interface LegacyUseScrollToBottomOptions extends UseScrollToBottomOptions {
|
|
49
|
+
/** Retained for source compatibility; scrolling now follows browser frames and observers. */
|
|
50
|
+
scrollDelay?: number;
|
|
51
|
+
}
|
|
52
|
+
export declare const getScrollMetrics: (target: ScrollTarget) => ScrollMetrics;
|
|
53
|
+
export declare const getScrollPresentation: (metrics: ScrollMetrics, threshold?: number) => ScrollPresentation;
|
|
54
|
+
export declare const getCombinedScrollPresentation: (metrics: ScrollMetrics[], threshold?: number) => ScrollPresentation;
|
|
55
|
+
export declare const resolveScrollBehavior: (requestedBehavior: ScrollBehavior, prefersReducedMotion: boolean) => ScrollBehavior;
|
|
56
|
+
export declare const resolveScrollTargets: (viewportRef: RefObject<HTMLElement | null> | undefined, explicitTarget: ScrollTargetInput | undefined, pageScrollFallback?: PageScrollFallback) => ScrollTarget[];
|
|
57
|
+
export declare const resolveScrollTarget: (viewportRef: RefObject<HTMLElement | null> | undefined, explicitTarget: ScrollTargetInput | undefined) => ScrollTarget | null;
|
|
58
|
+
export declare function useScrollToBottom(viewportRef: RefObject<HTMLElement | null>, options?: UseScrollToBottomOptions): UseScrollToBottomReturn;
|
|
59
|
+
export declare function useScrollToBottom(viewportRef: RefObject<HTMLElement | null>, dependencies?: readonly unknown[], options?: LegacyUseScrollToBottomOptions): UseScrollToBottomReturn;
|
|
28
60
|
export default useScrollToBottom;
|