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
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import {
|
|
2
|
-
const
|
|
3
|
-
const
|
|
4
|
-
return
|
|
5
|
-
},
|
|
6
|
-
if (
|
|
7
|
-
const
|
|
1
|
+
import { useRef as i, useEffect as P, useState as Q, useCallback as p, useLayoutEffect as ze } from "react";
|
|
2
|
+
const Re = typeof window > "u" ? P : ze, U = (e) => "window" in e && e.window === e, K = (e) => "nodeType" in e && e.nodeType === 9, Ee = (e) => {
|
|
3
|
+
const t = U(e) ? e.document : e;
|
|
4
|
+
return t.scrollingElement || t.documentElement;
|
|
5
|
+
}, X = (e) => U(e) ? e : K(e) ? e.defaultView : e.ownerDocument.defaultView, d = (e) => {
|
|
6
|
+
if (U(e) || K(e)) {
|
|
7
|
+
const t = Ee(e), c = U(e) ? e.innerHeight : t?.clientHeight || 0;
|
|
8
8
|
return {
|
|
9
|
-
scrollTop:
|
|
10
|
-
scrollHeight:
|
|
11
|
-
clientHeight:
|
|
9
|
+
scrollTop: t?.scrollTop || 0,
|
|
10
|
+
scrollHeight: t?.scrollHeight || 0,
|
|
11
|
+
clientHeight: c
|
|
12
12
|
};
|
|
13
13
|
}
|
|
14
14
|
return {
|
|
@@ -16,86 +16,355 @@ const w = (e) => typeof Window < "u" && e instanceof Window, z = (e) => typeof D
|
|
|
16
16
|
scrollHeight: e.scrollHeight,
|
|
17
17
|
clientHeight: e.clientHeight
|
|
18
18
|
};
|
|
19
|
-
},
|
|
20
|
-
const
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
19
|
+
}, xe = (e, t = 150) => {
|
|
20
|
+
const c = Math.max(0, t), l = e.scrollHeight > e.clientHeight, f = Math.max(
|
|
21
|
+
0,
|
|
22
|
+
e.scrollHeight - e.scrollTop - e.clientHeight
|
|
23
|
+
), h = !l || f === 0 || f < c;
|
|
24
|
+
return {
|
|
25
|
+
distanceFromBottom: f,
|
|
26
|
+
isAtBottom: h,
|
|
27
|
+
isScrollable: l,
|
|
28
|
+
showScrollToBottom: l && !h
|
|
29
|
+
};
|
|
30
|
+
}, be = (e, t = 150) => {
|
|
31
|
+
const c = e.map(
|
|
32
|
+
(l) => xe(l, t)
|
|
33
|
+
);
|
|
34
|
+
return {
|
|
35
|
+
distanceFromBottom: Math.max(
|
|
36
|
+
0,
|
|
37
|
+
...c.map((l) => l.distanceFromBottom)
|
|
38
|
+
),
|
|
39
|
+
isAtBottom: c.every((l) => l.isAtBottom),
|
|
40
|
+
isScrollable: c.some((l) => l.isScrollable),
|
|
41
|
+
showScrollToBottom: c.some((l) => l.showScrollToBottom)
|
|
42
|
+
};
|
|
43
|
+
}, Ie = (e, t) => e === "smooth" && t ? "auto" : e, ke = (e) => e ? typeof e == "function" ? e() : "current" in e ? e.current : e : null, De = (e) => {
|
|
44
|
+
const { scrollHeight: t, clientHeight: c } = d(e);
|
|
45
|
+
return t > c + 1;
|
|
46
|
+
}, Oe = (e) => {
|
|
47
|
+
const t = e.ownerDocument.defaultView?.getComputedStyle(e).overflowY;
|
|
48
|
+
return ["auto", "scroll", "hidden", "overlay"].includes(t ?? "");
|
|
49
|
+
}, We = (e, t, c = "auto") => {
|
|
50
|
+
const l = ke(t);
|
|
51
|
+
if (t !== void 0) return l ? [l] : [];
|
|
52
|
+
const f = e?.current;
|
|
53
|
+
if (!f)
|
|
54
|
+
return c !== "never" && typeof document < "u" ? [document] : [];
|
|
55
|
+
const h = [
|
|
56
|
+
f,
|
|
57
|
+
f.parentElement
|
|
58
|
+
].filter(
|
|
59
|
+
(Z) => Z !== null && Oe(Z)
|
|
59
60
|
);
|
|
60
|
-
return
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
61
|
+
return (c === "always" || c === "auto" && !h.some(De)) && h.push(f.ownerDocument), h;
|
|
62
|
+
}, ce = (e, t) => t?.current ? t.current : e.current, x = (e, t) => e.length === t.length && e.every((c, l) => c === t[l]), le = (e) => new Map(
|
|
63
|
+
e.map((t) => [t, d(t).scrollTop])
|
|
64
|
+
), Ue = (e) => K(e) && e.defaultView || e, ge = (e, t) => {
|
|
65
|
+
K(e) ? Ee(e)?.scrollTo(t) : e.scrollTo(t);
|
|
66
|
+
}, Ke = (e) => {
|
|
67
|
+
if (e.defaultPrevented) return !1;
|
|
68
|
+
if (e.type === "wheel") return e.deltaY !== 0;
|
|
69
|
+
if (e.type === "pointerdown")
|
|
70
|
+
return !(e.button > 0);
|
|
71
|
+
if (e.type !== "keydown") return !0;
|
|
72
|
+
const t = e;
|
|
73
|
+
if (t.ctrlKey || t.metaKey || t.altKey || ![
|
|
74
|
+
"ArrowUp",
|
|
75
|
+
"ArrowDown",
|
|
76
|
+
"PageUp",
|
|
77
|
+
"PageDown",
|
|
78
|
+
"Home",
|
|
79
|
+
"End",
|
|
80
|
+
" "
|
|
81
|
+
].includes(t.key))
|
|
82
|
+
return !1;
|
|
83
|
+
const c = e.target;
|
|
84
|
+
return c?.closest?.(
|
|
85
|
+
'input, textarea, select, [contenteditable]:not([contenteditable="false"]), [role="textbox"]'
|
|
86
|
+
) ? !1 : t.key !== " " || !c?.closest?.('button, a[href], [role="button"]');
|
|
87
|
+
};
|
|
88
|
+
function Ye(e, t, c) {
|
|
89
|
+
const l = i(
|
|
90
|
+
void 0
|
|
91
|
+
), f = Array.isArray(t) ? t : void 0, h = l.current, N = f ? h?.length === f.length && f.every(
|
|
92
|
+
(n, o) => Object.is(n, h[o])
|
|
93
|
+
) ? h : [...f] : void 0;
|
|
94
|
+
P(() => {
|
|
95
|
+
l.current = N;
|
|
96
|
+
}, [N]);
|
|
97
|
+
const Ae = Array.isArray(t) || t === void 0 && c !== void 0 ? {
|
|
98
|
+
autoScrollOnInit: !0,
|
|
99
|
+
scrollThreshold: 10,
|
|
100
|
+
...c,
|
|
101
|
+
contentVersion: N ?? c?.contentVersion
|
|
102
|
+
} : t ?? {}, {
|
|
103
|
+
contentRef: C,
|
|
104
|
+
endRef: _,
|
|
105
|
+
scrollTarget: se,
|
|
106
|
+
pageScrollFallback: ue = "auto",
|
|
107
|
+
scrollThreshold: Y = 150,
|
|
108
|
+
contentVersion: Be,
|
|
109
|
+
followNewContent: L = !0,
|
|
110
|
+
autoScrollOnInit: $ = !1,
|
|
111
|
+
behavior: ie = "smooth"
|
|
112
|
+
} = Ae, [Fe, ee] = Q(!1), [He, Pe] = Q(!0), [Ce, Le] = Q(L), [ae, Ve] = Q(0), I = i(L), k = i(null), V = i(L), q = i(!1), M = i([]), te = i(null), ne = i(null), D = i(!1), fe = i([]), b = i(
|
|
113
|
+
null
|
|
114
|
+
), A = i(null), B = i(null), z = i(null), j = i(null), T = p((n) => {
|
|
115
|
+
I.current = n, Le((o) => o === n ? o : n);
|
|
116
|
+
}, []), G = p(() => {
|
|
117
|
+
j.current !== null && (clearTimeout(j.current), j.current = null);
|
|
118
|
+
}, []), g = p(() => {
|
|
119
|
+
z.current && (z.current.view.cancelAnimationFrame(
|
|
120
|
+
z.current.id
|
|
121
|
+
), z.current = null);
|
|
122
|
+
}, []), m = p(() => {
|
|
123
|
+
D.current = !1, G();
|
|
124
|
+
}, [G]), me = i({
|
|
125
|
+
viewportRef: e,
|
|
126
|
+
scrollTarget: se,
|
|
127
|
+
pageScrollFallback: ue
|
|
128
|
+
});
|
|
129
|
+
Re(() => {
|
|
130
|
+
me.current = { viewportRef: e, scrollTarget: se, pageScrollFallback: ue };
|
|
131
|
+
});
|
|
132
|
+
const w = p(() => {
|
|
133
|
+
const n = me.current;
|
|
134
|
+
return We(
|
|
135
|
+
n.viewportRef,
|
|
136
|
+
n.scrollTarget,
|
|
137
|
+
n.pageScrollFallback
|
|
138
|
+
);
|
|
139
|
+
}, []), O = p(
|
|
140
|
+
(n) => {
|
|
141
|
+
D.current && !x(n, fe.current) && (g(), m()), b.current && !x(n, [...b.current.keys()]) && (b.current = null);
|
|
142
|
+
const o = be(
|
|
143
|
+
n.map(d),
|
|
144
|
+
Y
|
|
145
|
+
);
|
|
146
|
+
if (Pe(o.isAtBottom), D.current)
|
|
147
|
+
return ee(
|
|
148
|
+
o.isAtBottom ? o.showScrollToBottom : !1
|
|
149
|
+
), o.distanceFromBottom <= 1 && (m(), T(V.current), k.current = V.current ? le(n) : null), o;
|
|
150
|
+
ee(o.showScrollToBottom);
|
|
151
|
+
const u = k.current, v = I.current && u !== null && x(n, [...u.keys()]) && n.every(
|
|
152
|
+
(F) => d(F).scrollTop === u.get(F)
|
|
153
|
+
), S = !b.current && (o.isAtBottom || v) && V.current;
|
|
154
|
+
return k.current = S ? le(n) : null, T(S), o;
|
|
155
|
+
},
|
|
156
|
+
[
|
|
157
|
+
g,
|
|
158
|
+
m,
|
|
159
|
+
Y,
|
|
160
|
+
T
|
|
161
|
+
]
|
|
162
|
+
), s = p(() => {
|
|
163
|
+
O(w());
|
|
164
|
+
}, [O, w]), E = p(
|
|
165
|
+
(n = ie) => {
|
|
166
|
+
const o = w();
|
|
167
|
+
if (o.length === 0) return;
|
|
168
|
+
const u = X(o[0]), v = u?.matchMedia?.("(prefers-reduced-motion: reduce)").matches ?? !1, S = Ie(
|
|
169
|
+
n,
|
|
170
|
+
v
|
|
171
|
+
), F = S === "auto" ? "instant" : S;
|
|
172
|
+
if (b.current = null, k.current = null, D.current = !0, fe.current = o, T(V.current), ee(!1), g(), G(), _?.current ? _.current.scrollIntoView({
|
|
173
|
+
behavior: F,
|
|
174
|
+
block: "end"
|
|
175
|
+
}) : o.forEach((H) => {
|
|
176
|
+
const J = d(H).scrollHeight;
|
|
177
|
+
ge(H, { top: J, behavior: F });
|
|
178
|
+
}), S === "auto") {
|
|
179
|
+
if (V.current && be(
|
|
180
|
+
o.map(d),
|
|
181
|
+
Y
|
|
182
|
+
).isAtBottom && (k.current = le(o)), u) {
|
|
183
|
+
const H = u.requestAnimationFrame(() => {
|
|
184
|
+
z.current = null, m(), s();
|
|
185
|
+
});
|
|
186
|
+
z.current = { view: u, id: H };
|
|
187
|
+
} else
|
|
188
|
+
m(), s();
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
j.current = setTimeout(() => {
|
|
192
|
+
m(), s();
|
|
193
|
+
}, 1200);
|
|
194
|
+
},
|
|
195
|
+
[
|
|
196
|
+
ie,
|
|
197
|
+
g,
|
|
198
|
+
G,
|
|
199
|
+
_,
|
|
200
|
+
m,
|
|
201
|
+
w,
|
|
202
|
+
s,
|
|
203
|
+
Y,
|
|
204
|
+
T
|
|
205
|
+
]
|
|
206
|
+
), W = p(() => {
|
|
207
|
+
const n = w(), o = e.current, u = ce(e, C);
|
|
208
|
+
return x(n, M.current) && o === te.current && u === ne.current ? !1 : (x(n, M.current) || O(n), M.current = n, te.current = o, ne.current = u, Ve((v) => v + 1), !0);
|
|
209
|
+
}, [O, C, w, e]);
|
|
210
|
+
P(() => {
|
|
211
|
+
const n = w(), o = n[0] ? X(n[0]) : e.current?.ownerDocument.defaultView ?? null;
|
|
212
|
+
if (n.length === 0 && !o) return;
|
|
213
|
+
M.current = n, te.current = e.current, ne.current = ce(e, C);
|
|
214
|
+
const u = new Set(n.map(Ue)), v = new Set(
|
|
215
|
+
[...n.map(X), o].filter(
|
|
216
|
+
(r) => r !== null
|
|
217
|
+
)
|
|
218
|
+
), S = new Set(
|
|
219
|
+
Array.from(v).map((r) => r.visualViewport).filter((r) => !!r)
|
|
220
|
+
), F = (r) => {
|
|
221
|
+
if (A.current !== null && o && o.cancelAnimationFrame(A.current), !o) {
|
|
222
|
+
r();
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
A.current = o.requestAnimationFrame(() => {
|
|
226
|
+
A.current = null, r();
|
|
68
227
|
});
|
|
69
|
-
},
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
228
|
+
}, H = new Map(
|
|
229
|
+
n.map((r) => [r, d(r).scrollTop])
|
|
230
|
+
), J = () => {
|
|
231
|
+
D.current && (b.current = new Map(
|
|
232
|
+
n.map((r) => [r, d(r).scrollTop])
|
|
233
|
+
), g(), m(), T(!1), n.forEach((r) => {
|
|
234
|
+
ge(r, {
|
|
235
|
+
top: d(r).scrollTop,
|
|
236
|
+
behavior: "instant"
|
|
237
|
+
});
|
|
238
|
+
}), s());
|
|
239
|
+
}, de = (r) => {
|
|
240
|
+
Ke(r) && J();
|
|
241
|
+
}, he = () => {
|
|
242
|
+
const r = b.current;
|
|
243
|
+
r && n.some(
|
|
244
|
+
(a) => d(a).scrollTop !== r.get(a)
|
|
245
|
+
) && (b.current = null);
|
|
246
|
+
let y = !1;
|
|
247
|
+
n.forEach((a) => {
|
|
248
|
+
const oe = d(a).scrollTop;
|
|
249
|
+
oe < (H.get(a) ?? oe) - 1 && (y = !0), H.set(a, oe);
|
|
250
|
+
}), y && J(), s();
|
|
251
|
+
}, R = () => {
|
|
252
|
+
F(() => {
|
|
253
|
+
W(), q.current && I.current ? E("auto") : s();
|
|
254
|
+
});
|
|
255
|
+
}, we = ["wheel", "touchstart", "pointerdown", "keydown"];
|
|
256
|
+
u.forEach((r) => {
|
|
257
|
+
r.addEventListener("scroll", he, { passive: !0 }), we.forEach(
|
|
258
|
+
(y) => r.addEventListener(y, de, {
|
|
259
|
+
passive: !0,
|
|
260
|
+
capture: !0
|
|
261
|
+
})
|
|
262
|
+
);
|
|
263
|
+
}), v.forEach(
|
|
264
|
+
(r) => r.addEventListener("resize", R)
|
|
265
|
+
), S.forEach(
|
|
266
|
+
(r) => r.addEventListener("resize", R)
|
|
267
|
+
);
|
|
268
|
+
const pe = o, Te = pe?.ResizeObserver, re = Te ? new Te(R) : null, ve = () => {
|
|
269
|
+
re?.disconnect();
|
|
270
|
+
const r = /* @__PURE__ */ new Set();
|
|
271
|
+
e.current && r.add(e.current);
|
|
272
|
+
const y = ce(e, C);
|
|
273
|
+
y && r.add(y), !C?.current && e.current && Array.from(e.current.children).forEach(
|
|
274
|
+
(a) => r.add(a)
|
|
275
|
+
), n.forEach((a) => {
|
|
276
|
+
!U(a) && !K(a) && r.add(a);
|
|
277
|
+
}), r.forEach((a) => re?.observe(a));
|
|
278
|
+
};
|
|
279
|
+
ve();
|
|
280
|
+
const Se = pe?.MutationObserver, ye = Se ? new Se(() => {
|
|
281
|
+
ve(), R();
|
|
282
|
+
}) : null;
|
|
283
|
+
return e.current && ye?.observe(e.current, {
|
|
284
|
+
childList: !0,
|
|
285
|
+
characterData: !0,
|
|
286
|
+
subtree: !0
|
|
287
|
+
}), s(), () => {
|
|
288
|
+
u.forEach((r) => {
|
|
289
|
+
r.removeEventListener("scroll", he), we.forEach(
|
|
290
|
+
(y) => r.removeEventListener(y, de, !0)
|
|
291
|
+
);
|
|
292
|
+
}), v.forEach(
|
|
293
|
+
(r) => r.removeEventListener("resize", R)
|
|
294
|
+
), S.forEach(
|
|
295
|
+
(r) => r.removeEventListener("resize", R)
|
|
296
|
+
), re?.disconnect(), ye?.disconnect(), A.current !== null && o && (o.cancelAnimationFrame(A.current), A.current = null), x(M.current, n) && (M.current = []);
|
|
74
297
|
};
|
|
75
|
-
}, [
|
|
76
|
-
|
|
77
|
-
|
|
298
|
+
}, [
|
|
299
|
+
O,
|
|
300
|
+
ae,
|
|
301
|
+
g,
|
|
302
|
+
C,
|
|
303
|
+
W,
|
|
304
|
+
m,
|
|
305
|
+
w,
|
|
306
|
+
s,
|
|
307
|
+
E,
|
|
308
|
+
T,
|
|
309
|
+
e
|
|
310
|
+
]), P(() => {
|
|
311
|
+
W();
|
|
312
|
+
}), P(() => {
|
|
313
|
+
const n = w(), o = n[0] ? X(n[0]) : null;
|
|
314
|
+
if (W(), n.length === 0) return;
|
|
315
|
+
const u = !q.current && $;
|
|
316
|
+
if (!q.current && (q.current = !0, !$)) {
|
|
317
|
+
s();
|
|
78
318
|
return;
|
|
79
319
|
}
|
|
80
|
-
if (
|
|
81
|
-
|
|
82
|
-
return
|
|
320
|
+
if (B.current !== null && o && o.cancelAnimationFrame(B.current), !o) {
|
|
321
|
+
I.current ? E("auto") : s();
|
|
322
|
+
return;
|
|
323
|
+
}
|
|
324
|
+
return B.current = o.requestAnimationFrame(() => {
|
|
325
|
+
B.current = null, I.current || u ? E("auto") : s();
|
|
326
|
+
}), () => {
|
|
327
|
+
B.current !== null && (o.cancelAnimationFrame(B.current), B.current = null);
|
|
328
|
+
};
|
|
329
|
+
}, [
|
|
330
|
+
$,
|
|
331
|
+
ae,
|
|
332
|
+
Be,
|
|
333
|
+
W,
|
|
334
|
+
w,
|
|
335
|
+
s,
|
|
336
|
+
E
|
|
337
|
+
]), P(() => {
|
|
338
|
+
if (V.current = L, !L) {
|
|
339
|
+
T(!1);
|
|
340
|
+
return;
|
|
83
341
|
}
|
|
84
|
-
|
|
85
|
-
}, [
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
342
|
+
s();
|
|
343
|
+
}, [L, s, T]), P(
|
|
344
|
+
() => () => {
|
|
345
|
+
g(), m();
|
|
346
|
+
},
|
|
347
|
+
[g, m]
|
|
348
|
+
);
|
|
349
|
+
const Me = p(() => {
|
|
350
|
+
E();
|
|
351
|
+
}, [E]);
|
|
352
|
+
return {
|
|
353
|
+
showScrollToBottom: Fe,
|
|
354
|
+
isAtBottom: He,
|
|
355
|
+
followNewContent: Ce,
|
|
356
|
+
scrollToBottom: E,
|
|
357
|
+
handleUserScrollToBottom: Me,
|
|
358
|
+
refresh: s
|
|
93
359
|
};
|
|
94
|
-
}
|
|
360
|
+
}
|
|
95
361
|
export {
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
362
|
+
Ye as default,
|
|
363
|
+
be as getCombinedScrollPresentation,
|
|
364
|
+
d as getScrollMetrics,
|
|
365
|
+
xe as getScrollPresentation,
|
|
366
|
+
Ie as resolveScrollBehavior,
|
|
367
|
+
We as resolveScrollTargets,
|
|
368
|
+
Ye as useScrollToBottom
|
|
100
369
|
};
|
|
101
370
|
//# sourceMappingURL=useScrollToBottom.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useScrollToBottom.es.js","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.es.js","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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"}
|