markdown-flow-ui 0.3.2-dev.2 → 0.3.2
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 +0 -13
- package/dist/_virtual/index.es8.js +2 -2
- package/dist/_virtual/index.es9.js +2 -2
- package/dist/_virtual/index8.cjs +1 -1
- package/dist/_virtual/index9.cjs +1 -1
- package/dist/assets/markdown-flow-ui.css +1 -1
- package/dist/components/ContentRender/IframeSandbox.cjs.map +1 -1
- package/dist/components/ContentRender/IframeSandbox.es.js.map +1 -1
- package/dist/components/ContentRender/utils/video-markdown-run.cjs.map +1 -1
- package/dist/components/ContentRender/utils/video-markdown-run.es.js.map +1 -1
- package/dist/components/MarkdownFlow/ScrollToBottomButton.cjs.map +1 -1
- package/dist/components/MarkdownFlow/ScrollToBottomButton.es.js.map +1 -1
- package/dist/components/MarkdownFlow/ScrollToBottomControl.cjs.map +1 -1
- package/dist/components/MarkdownFlow/ScrollToBottomControl.es.js.map +1 -1
- package/dist/components/MarkdownFlow/useScrollToBottom.cjs.map +1 -1
- 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 +2 -2
- package/dist/components/MarkdownFlowEditor/MarkdownFlowEditor.es.js +323 -562
- package/dist/components/MarkdownFlowEditor/MarkdownFlowEditor.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 +0 -8
- package/dist/components/MarkdownFlowEditor/components/EditorToolbar.es.js +64 -107
- package/dist/components/MarkdownFlowEditor/components/EditorToolbar.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/editor-context.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/editor-context.cjs.map +1 -1
- package/dist/components/MarkdownFlowEditor/editor-context.es.js +4 -10
- package/dist/components/MarkdownFlowEditor/editor-context.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/editorI18n.d.ts +0 -308
- package/dist/components/MarkdownFlowEditor/locales/ar-SA.json.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/locales/ar-SA.json.d.ts +1 -15
- package/dist/components/MarkdownFlowEditor/locales/ar-SA.json.es.js +87 -115
- package/dist/components/MarkdownFlowEditor/locales/ar-SA.json.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/locales/de-DE.json.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/locales/de-DE.json.d.ts +1 -15
- package/dist/components/MarkdownFlowEditor/locales/de-DE.json.es.js +88 -116
- package/dist/components/MarkdownFlowEditor/locales/de-DE.json.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/locales/en-US.json.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/locales/en-US.json.d.ts +1 -15
- package/dist/components/MarkdownFlowEditor/locales/en-US.json.es.js +88 -116
- package/dist/components/MarkdownFlowEditor/locales/en-US.json.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/locales/es-ES.json.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/locales/es-ES.json.d.ts +1 -15
- package/dist/components/MarkdownFlowEditor/locales/es-ES.json.es.js +80 -108
- package/dist/components/MarkdownFlowEditor/locales/es-ES.json.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/locales/fil-PH.json.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/locales/fil-PH.json.d.ts +1 -15
- package/dist/components/MarkdownFlowEditor/locales/fil-PH.json.es.js +82 -110
- package/dist/components/MarkdownFlowEditor/locales/fil-PH.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 +1 -15
- package/dist/components/MarkdownFlowEditor/locales/fr-FR.json.es.js +86 -114
- package/dist/components/MarkdownFlowEditor/locales/fr-FR.json.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/locales/ja-JP.json.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/locales/ja-JP.json.d.ts +1 -15
- package/dist/components/MarkdownFlowEditor/locales/ja-JP.json.es.js +88 -116
- package/dist/components/MarkdownFlowEditor/locales/ja-JP.json.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/locales/th-TH.json.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/locales/th-TH.json.d.ts +1 -15
- package/dist/components/MarkdownFlowEditor/locales/th-TH.json.es.js +85 -113
- package/dist/components/MarkdownFlowEditor/locales/th-TH.json.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/locales/ur-PK.json.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/locales/ur-PK.json.d.ts +1 -15
- package/dist/components/MarkdownFlowEditor/locales/ur-PK.json.es.js +94 -122
- package/dist/components/MarkdownFlowEditor/locales/ur-PK.json.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/locales/vi-VN.json.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/locales/vi-VN.json.d.ts +1 -15
- package/dist/components/MarkdownFlowEditor/locales/vi-VN.json.es.js +74 -102
- package/dist/components/MarkdownFlowEditor/locales/vi-VN.json.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/locales/zh-CN.json.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/locales/zh-CN.json.d.ts +1 -15
- package/dist/components/MarkdownFlowEditor/locales/zh-CN.json.es.js +72 -100
- 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.d.ts +2 -1
- package/dist/components/MarkdownFlowEditor/plugins/ImgPlaceholder.es.js +62 -53
- package/dist/components/MarkdownFlowEditor/plugins/ImgPlaceholder.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/plugins/PlaceholderWidget.cjs.map +1 -1
- package/dist/components/MarkdownFlowEditor/plugins/PlaceholderWidget.d.ts +1 -1
- package/dist/components/MarkdownFlowEditor/plugins/PlaceholderWidget.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/plugins/SyntaxHighlighter.cjs +3 -3
- package/dist/components/MarkdownFlowEditor/plugins/SyntaxHighlighter.cjs.map +1 -1
- package/dist/components/MarkdownFlowEditor/plugins/SyntaxHighlighter.d.ts +1 -5
- package/dist/components/MarkdownFlowEditor/plugins/SyntaxHighlighter.es.js +149 -154
- package/dist/components/MarkdownFlowEditor/plugins/SyntaxHighlighter.es.js.map +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.d.ts +2 -1
- package/dist/components/MarkdownFlowEditor/plugins/VideoPlaceholder.es.js +53 -42
- package/dist/components/MarkdownFlowEditor/plugins/VideoPlaceholder.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/types.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/types.cjs.map +1 -1
- package/dist/components/MarkdownFlowEditor/types.d.ts +1 -11
- package/dist/components/MarkdownFlowEditor/types.es.js +2 -2
- package/dist/components/MarkdownFlowEditor/types.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/utils.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/utils.cjs.map +1 -1
- package/dist/components/MarkdownFlowEditor/utils.d.ts +0 -10
- package/dist/components/MarkdownFlowEditor/utils.es.js +59 -73
- package/dist/components/MarkdownFlowEditor/utils.es.js.map +1 -1
- package/dist/components/Slide/MarkdownSlideScaling.cjs.map +1 -1
- package/dist/components/Slide/MarkdownSlideScaling.es.js.map +1 -1
- package/dist/components/Slide/MobilePlayerSettingsSheet.es.js +16 -16
- package/dist/components/Slide/Player.cjs.map +1 -1
- package/dist/components/Slide/Player.es.js.map +1 -1
- package/dist/components/Slide/Slide.cjs.map +1 -1
- package/dist/components/Slide/Slide.es.js.map +1 -1
- package/dist/components/Slide/SubtitleOverlay.cjs.map +1 -1
- package/dist/components/Slide/SubtitleOverlay.es.js.map +1 -1
- package/dist/components/Slide/slideI18n.cjs.map +1 -1
- package/dist/components/Slide/slideI18n.es.js.map +1 -1
- package/dist/components/Slide/useSlide.cjs.map +1 -1
- package/dist/components/Slide/useSlide.es.js.map +1 -1
- package/dist/components/Slide/utils/streamingNavigation.cjs.map +1 -1
- package/dist/components/Slide/utils/streamingNavigation.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.es.js +27 -27
- package/dist/components/ui/dialog.es.js.map +1 -1
- package/dist/lib/interaction-defaults.cjs.map +1 -1
- package/dist/lib/interaction-defaults.es.js.map +1 -1
- package/dist/markdown-flow-ui-lib.css +1 -1
- package/dist/markdown-flow-ui.css +1 -1
- package/dist/node_modules/@braintree/sanitize-url/dist/index.cjs +1 -1
- package/dist/node_modules/@braintree/sanitize-url/dist/index.es.js +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 +34 -49
- 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 +1 -5
- 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 +206 -220
- package/dist/node_modules/@radix-ui/react-dialog/dist/index.es.js.map +1 -1
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/primitive/dist/index.cjs +2 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/primitive/dist/index.cjs.map +1 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/primitive/dist/index.es.js +50 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/primitive/dist/index.es.js.map +1 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-compose-refs/dist/index.cjs +2 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-compose-refs/dist/index.cjs.map +1 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-compose-refs/dist/index.es.js +34 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-compose-refs/dist/index.es.js.map +1 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-context/dist/index.cjs +2 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-context/dist/index.cjs.map +1 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-context/dist/index.es.js +82 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-context/dist/index.es.js.map +1 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-dismissable-layer/dist/index.cjs +2 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-dismissable-layer/dist/index.cjs.map +1 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-dismissable-layer/dist/index.es.js +216 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-dismissable-layer/dist/index.es.js.map +1 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-id/dist/index.cjs +2 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-id/dist/index.cjs.map +1 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-id/dist/index.es.js +15 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-id/dist/index.es.js.map +1 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-portal/dist/index.cjs +2 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-portal/dist/index.cjs.map +1 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-portal/dist/index.es.js +18 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-portal/dist/index.es.js.map +1 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-presence/dist/index.cjs +2 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-presence/dist/index.cjs.map +1 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-presence/dist/index.es.js +104 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-presence/dist/index.es.js.map +1 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-primitive/dist/index.cjs +2 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-primitive/dist/index.cjs.map +1 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-primitive/dist/index.es.js +39 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-primitive/dist/index.es.js.map +1 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-use-callback-ref/dist/index.cjs +2 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-use-callback-ref/dist/index.cjs.map +1 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-use-callback-ref/dist/index.es.js +13 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-use-callback-ref/dist/index.es.js.map +1 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-use-controllable-state/dist/index.cjs +2 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-use-controllable-state/dist/index.cjs.map +1 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-use-controllable-state/dist/index.es.js +70 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-use-controllable-state/dist/index.es.js.map +1 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-use-effect-event/dist/index.cjs +2 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-use-effect-event/dist/index.cjs.map +1 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-use-effect-event/dist/index.es.js +20 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-use-effect-event/dist/index.es.js.map +1 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-use-layout-effect/dist/index.cjs +2 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-use-layout-effect/dist/index.cjs.map +1 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-use-layout-effect/dist/index.es.js +7 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-use-layout-effect/dist/index.es.js.map +1 -0
- package/dist/node_modules/@radix-ui/react-focus-guards/dist/index.cjs +1 -1
- package/dist/node_modules/@radix-ui/react-focus-guards/dist/index.cjs.map +1 -1
- package/dist/node_modules/@radix-ui/react-focus-guards/dist/index.es.js +18 -9
- package/dist/node_modules/@radix-ui/react-focus-guards/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 +148 -100
- package/dist/node_modules/@radix-ui/react-focus-scope/dist/index.es.js.map +1 -1
- package/dist/node_modules/@radix-ui/react-focus-scope/node_modules/@radix-ui/react-compose-refs/dist/index.cjs +2 -0
- package/dist/node_modules/@radix-ui/react-focus-scope/node_modules/@radix-ui/react-compose-refs/dist/index.cjs.map +1 -0
- package/dist/node_modules/@radix-ui/react-focus-scope/node_modules/@radix-ui/react-compose-refs/dist/index.es.js +34 -0
- package/dist/node_modules/@radix-ui/react-focus-scope/node_modules/@radix-ui/react-compose-refs/dist/index.es.js.map +1 -0
- package/dist/node_modules/@radix-ui/react-focus-scope/node_modules/@radix-ui/react-primitive/dist/index.cjs +2 -0
- package/dist/node_modules/@radix-ui/react-focus-scope/node_modules/@radix-ui/react-primitive/dist/index.cjs.map +1 -0
- package/dist/node_modules/@radix-ui/react-focus-scope/node_modules/@radix-ui/react-primitive/dist/index.es.js +39 -0
- package/dist/node_modules/@radix-ui/react-focus-scope/node_modules/@radix-ui/react-primitive/dist/index.es.js.map +1 -0
- package/dist/node_modules/@radix-ui/react-focus-scope/node_modules/@radix-ui/react-use-callback-ref/dist/index.cjs +2 -0
- package/dist/node_modules/@radix-ui/react-focus-scope/node_modules/@radix-ui/react-use-callback-ref/dist/index.cjs.map +1 -0
- package/dist/node_modules/@radix-ui/react-focus-scope/node_modules/@radix-ui/react-use-callback-ref/dist/index.es.js +13 -0
- package/dist/node_modules/@radix-ui/react-focus-scope/node_modules/@radix-ui/react-use-callback-ref/dist/index.es.js.map +1 -0
- package/dist/node_modules/@radix-ui/react-id/dist/index.cjs +1 -1
- package/dist/node_modules/@radix-ui/react-id/dist/index.cjs.map +1 -1
- package/dist/node_modules/@radix-ui/react-id/dist/index.es.js +8 -8
- package/dist/node_modules/@radix-ui/react-id/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 +1 -1
- package/dist/node_modules/@radix-ui/react-primitive/node_modules/@radix-ui/react-slot/dist/index.cjs +2 -0
- package/dist/node_modules/@radix-ui/react-primitive/node_modules/@radix-ui/react-slot/dist/index.cjs.map +1 -0
- package/dist/node_modules/@radix-ui/react-primitive/node_modules/@radix-ui/react-slot/dist/index.es.js +50 -0
- package/dist/node_modules/@radix-ui/react-primitive/node_modules/@radix-ui/react-slot/dist/index.es.js.map +1 -0
- 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 +80 -41
- package/dist/node_modules/@radix-ui/react-slot/dist/index.es.js.map +1 -1
- package/dist/node_modules/@radix-ui/react-slot/node_modules/@radix-ui/react-compose-refs/dist/index.cjs +2 -0
- package/dist/node_modules/@radix-ui/react-slot/node_modules/@radix-ui/react-compose-refs/dist/index.cjs.map +1 -0
- package/dist/node_modules/@radix-ui/react-slot/node_modules/@radix-ui/react-compose-refs/dist/index.es.js +34 -0
- package/dist/node_modules/@radix-ui/react-slot/node_modules/@radix-ui/react-compose-refs/dist/index.es.js.map +1 -0
- 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 +1 -1
- package/dist/node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-slot/dist/index.cjs +2 -0
- package/dist/node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-slot/dist/index.cjs.map +1 -0
- package/dist/node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-slot/dist/index.es.js +12 -0
- package/dist/node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-slot/dist/index.es.js.map +1 -0
- package/dist/node_modules/classnames/index.cjs +1 -1
- package/dist/node_modules/classnames/index.es.js +1 -1
- package/dist/node_modules/react-remove-scroll/dist/es2015/SideEffect.cjs +2 -2
- package/dist/node_modules/react-remove-scroll/dist/es2015/SideEffect.cjs.map +1 -1
- package/dist/node_modules/react-remove-scroll/dist/es2015/SideEffect.es.js +75 -72
- package/dist/node_modules/react-remove-scroll/dist/es2015/SideEffect.es.js.map +1 -1
- package/package.json +10 -10
- package/dist/components/MarkdownFlowEditor/components/CustomPopover.cjs +0 -2
- package/dist/components/MarkdownFlowEditor/components/CustomPopover.cjs.map +0 -1
- package/dist/components/MarkdownFlowEditor/components/CustomPopover.d.ts +0 -17
- package/dist/components/MarkdownFlowEditor/components/CustomPopover.es.js +0 -46
- package/dist/components/MarkdownFlowEditor/components/CustomPopover.es.js.map +0 -1
- package/dist/components/MarkdownFlowEditor/components/VariableSearchDropdown.cjs +0 -2
- package/dist/components/MarkdownFlowEditor/components/VariableSearchDropdown.cjs.map +0 -1
- package/dist/components/MarkdownFlowEditor/components/VariableSearchDropdown.d.ts +0 -18
- package/dist/components/MarkdownFlowEditor/components/VariableSearchDropdown.es.js +0 -184
- package/dist/components/MarkdownFlowEditor/components/VariableSearchDropdown.es.js.map +0 -1
- package/dist/components/MarkdownFlowEditor/components/VariableSelect.cjs +0 -2
- package/dist/components/MarkdownFlowEditor/components/VariableSelect.cjs.map +0 -1
- package/dist/components/MarkdownFlowEditor/components/VariableSelect.d.ts +0 -11
- package/dist/components/MarkdownFlowEditor/components/VariableSelect.es.js +0 -172
- package/dist/components/MarkdownFlowEditor/components/VariableSelect.es.js.map +0 -1
- package/dist/components/MarkdownFlowEditor/components/icons/SearchBracesIcon.cjs +0 -2
- package/dist/components/MarkdownFlowEditor/components/icons/SearchBracesIcon.cjs.map +0 -1
- package/dist/components/MarkdownFlowEditor/components/icons/SearchBracesIcon.d.ts +0 -3
- package/dist/components/MarkdownFlowEditor/components/icons/SearchBracesIcon.es.js +0 -32
- package/dist/components/MarkdownFlowEditor/components/icons/SearchBracesIcon.es.js.map +0 -1
- package/dist/components/MarkdownFlowEditor/plugins/VariablePlaceholder.cjs +0 -3
- package/dist/components/MarkdownFlowEditor/plugins/VariablePlaceholder.cjs.map +0 -1
- package/dist/components/MarkdownFlowEditor/plugins/VariablePlaceholder.d.ts +0 -9
- package/dist/components/MarkdownFlowEditor/plugins/VariablePlaceholder.es.js +0 -53
- package/dist/components/MarkdownFlowEditor/plugins/VariablePlaceholder.es.js.map +0 -1
- package/dist/components/ui/popover.cjs +0 -2
- package/dist/components/ui/popover.cjs.map +0 -1
- package/dist/components/ui/popover.es.js +0 -24
- package/dist/components/ui/popover.es.js.map +0 -1
- package/dist/node_modules/@radix-ui/react-popover/dist/index.cjs +0 -2
- package/dist/node_modules/@radix-ui/react-popover/dist/index.cjs.map +0 -1
- package/dist/node_modules/@radix-ui/react-popover/dist/index.es.js +0 -241
- package/dist/node_modules/@radix-ui/react-popover/dist/index.es.js.map +0 -1
- package/dist/node_modules/lucide-react/dist/esm/icons/braces.cjs +0 -7
- package/dist/node_modules/lucide-react/dist/esm/icons/braces.cjs.map +0 -1
- package/dist/node_modules/lucide-react/dist/esm/icons/braces.es.js +0 -25
- package/dist/node_modules/lucide-react/dist/esm/icons/braces.es.js.map +0 -1
- package/dist/node_modules/lucide-react/dist/esm/icons/plus.cjs +0 -7
- package/dist/node_modules/lucide-react/dist/esm/icons/plus.cjs.map +0 -1
- package/dist/node_modules/lucide-react/dist/esm/icons/plus.es.js +0 -16
- package/dist/node_modules/lucide-react/dist/esm/icons/plus.es.js.map +0 -1
- package/dist/node_modules/lucide-react/dist/esm/icons/search.cjs +0 -7
- package/dist/node_modules/lucide-react/dist/esm/icons/search.cjs.map +0 -1
- package/dist/node_modules/lucide-react/dist/esm/icons/search.es.js +0 -16
- package/dist/node_modules/lucide-react/dist/esm/icons/search.es.js.map +0 -1
- /package/dist/components/MarkdownFlowEditor/plugins/{VariablePlaceholder.test.d.ts → MediaPlaceholder.variables.test.d.ts} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"video-markdown-run.es.js","sources":["../../../../src/components/ContentRender/utils/video-markdown-run.ts"],"sourcesContent":["import type { Element, Nodes, Root } from \"hast\";\nimport type { Root as MarkdownRoot } from \"mdast\";\nimport { decodeString } from \"micromark-util-decode-string\";\nimport {\n getMarkdownSourceAnalysis,\n type MarkdownSourceAnalysis,\n type MarkdownSourceTree,\n} from \"./inline-code-ranges\";\nimport type { RenderSegment } from \"./split-content\";\nimport { normalizeInlineHtml } from \"./normalize-inline-html\";\nimport {\n readHtmlMarkup,\n isHtmlRawTextTag,\n findStreamingHtmlElementEnd,\n} from \"./html-block-end\";\n\ntype Range = { start: number; end: number };\ntype SourceValue = Range & { value: string; type: string };\ntype Visibility = {\n ends?: number[];\n range?: Range;\n atomic?: boolean;\n structural?: boolean;\n svg?: boolean;\n active?: boolean;\n immediate?: boolean;\n svgSource?: string;\n};\nexport type VideoMarkdownRunPlan = {\n fullSource: string;\n markdownSource: string;\n /** Raw end offset for each normalized UTF-16 unit, only when source changed. */\n rawEnds?: readonly number[];\n segments: readonly RenderSegment[];\n offsets: readonly number[];\n immediateOffsets: readonly number[];\n sourceTree: MarkdownSourceTree;\n incompleteSvg?: Range;\n pendingMetadata: readonly Range[];\n tree?: Root;\n visibility: WeakMap<Nodes, Visibility>;\n};\ndeclare module \"hast\" {\n interface ElementData {\n contentRenderVisibility?: Visibility;\n }\n}\nconst stateKey = \"contentRenderVisibility\";\nconst firstAtOrAfter = (values: readonly number[], target: number) => {\n let low = 0;\n let high = values.length;\n while (low < high) {\n const middle = (low + high) >>> 1;\n if (values[middle] < target) low = middle + 1;\n else high = middle;\n }\n return low;\n};\nconst segmentAt = (plan: VideoMarkdownRunPlan, position: number) =>\n Math.max(0, firstAtOrAfter(plan.offsets, position + 1) - 1);\nconst rangeOf = (node: { position?: Nodes[\"position\"] }): Range | undefined => {\n const start = node.position?.start?.offset;\n const end = node.position?.end?.offset;\n return start === undefined || end === undefined ? undefined : { start, end };\n};\nexport const getVideoMarkdownNodeState = (\n node: Element\n): Visibility | undefined => node.data?.[stateKey] as Visibility | undefined;\n\nconst incompleteSvgRange = (raw: string, excluded: readonly Range[]) => {\n let position = 0;\n let rangeIndex = 0;\n while (position < raw.length) {\n const start = raw.indexOf(\"<\", position);\n if (start === -1) break;\n while (excluded[rangeIndex]?.end <= start) rangeIndex += 1;\n if (excluded[rangeIndex]?.start <= start) {\n position = excluded[rangeIndex].end;\n continue;\n }\n let backslashes = 0;\n for (let index = start - 1; index >= 0 && raw[index] === \"\\\\\"; index -= 1)\n backslashes += 1;\n if (backslashes % 2) {\n position = start + 1;\n continue;\n }\n const markup = readHtmlMarkup(raw, start);\n if (markup.kind === \"incomplete\")\n return /^<svg(?=[\\s/>]|$)/i.test(raw.slice(start))\n ? { start, end: raw.length }\n : undefined;\n position =\n markup.kind === \"tag\" &&\n !markup.closing &&\n !markup.selfClosing &&\n isHtmlRawTextTag(markup.name)\n ? findStreamingHtmlElementEnd(raw, start)\n : markup.kind === \"invalid\"\n ? start + 1\n : markup.end;\n }\n};\n\n// Inline HTML normalization only removes indentation and CRLF's CR. A monotonic\n// subsequence map retains the authored end offset of every remaining code unit.\nconst normalizedRawEnds = (raw: string, normalized: string) => {\n if (raw === normalized) return;\n const ends: number[] = [];\n let cursor = 0;\n for (let index = 0; index < normalized.length; index += 1) {\n cursor = raw.indexOf(normalized[index], cursor);\n if (cursor === -1)\n throw new Error(\"HTML normalization changed source characters\");\n ends.push(++cursor);\n }\n return ends;\n};\nconst rawOffset = (plan: VideoMarkdownRunPlan, offset: number, end = false) => {\n if (!plan.rawEnds) return offset;\n if (end) return offset === 0 ? 0 : plan.rawEnds[offset - 1];\n return offset === plan.markdownSource.length\n ? plan.fullSource.length\n : plan.rawEnds[offset] - 1;\n};\nconst rawRange = (plan: VideoMarkdownRunPlan, range?: Range) =>\n range && {\n start: rawOffset(plan, range.start),\n end: rawOffset(plan, range.end, true),\n };\n\n/** Transforms and raw HTML parsing use normalized coordinates until this step. */\nconst restoreRawPositions = (plan: VideoMarkdownRunPlan, tree: Root) => {\n if (!plan.rawEnds) return;\n const lines = [0];\n const newline = /\\r\\n|\\r|\\n/g;\n let match: RegExpExecArray | null;\n while ((match = newline.exec(plan.fullSource)))\n lines.push(match.index + match[0].length);\n const point = (\n value: NonNullable<Nodes[\"position\"]>[\"start\"],\n end: boolean\n ) => {\n if (value?.offset === undefined) return value;\n const offset = rawOffset(plan, value.offset, end);\n const line = firstAtOrAfter(lines, offset + 1);\n return { line, column: offset - lines[line - 1] + 1, offset };\n };\n const walk = (node: Nodes) => {\n const position = node === tree ? plan.sourceTree.position : node.position;\n if (position)\n node.position = {\n start: point(position.start, false),\n end: point(position.end, true),\n };\n if (\"children\" in node) node.children.forEach(walk);\n };\n walk(tree);\n};\n\n/** Runs parse only when source snapshots change; ticks never parse Markdown. */\nexport const createVideoMarkdownRunPlan = (\n segments: readonly RenderSegment[],\n analysis?: MarkdownSourceAnalysis\n): VideoMarkdownRunPlan => {\n const offsets: number[] = [];\n let fullSource = \"\";\n for (const segment of segments) {\n offsets.push(fullSource.length);\n fullSource += segment.value;\n }\n const received = analysis ?? getMarkdownSourceAnalysis(fullSource);\n const markdownSource = normalizeInlineHtml(fullSource, received.markdown);\n const rawEnds = normalizedRawEnds(fullSource, markdownSource);\n const parsed = rawEnds ? getMarkdownSourceAnalysis(markdownSource) : received;\n const media = segments.flatMap((segment, index) =>\n segment.type === \"markdown\" && segment.immediate\n ? [\n {\n start: rawEnds\n ? firstAtOrAfter(rawEnds, offsets[index] + 1)\n : offsets[index],\n end: rawEnds\n ? firstAtOrAfter(rawEnds, offsets[index] + segment.value.length) +\n 1\n : offsets[index] + segment.value.length,\n },\n ]\n : []\n );\n return {\n fullSource,\n markdownSource,\n rawEnds,\n segments,\n offsets,\n immediateOffsets: segments.flatMap((segment, index) =>\n segment.type === \"markdown\" && segment.immediate && !segment.pending\n ? [offsets[index]]\n : []\n ),\n sourceTree: parsed.tree,\n pendingMetadata: parsed.metadata.filter(\n (range) => range.pending && range.end === markdownSource.length\n ),\n incompleteSvg: incompleteSvgRange(\n markdownSource,\n [...parsed.literal, ...media].sort(\n (left, right) => left.start - right.start\n )\n ),\n visibility: new WeakMap(),\n };\n};\n\n// Decode each source token once and retain the raw end offset of every output\n// unit. An entity/escape becomes visible only after its entire token was typed.\ntype TextMode = \"markdown\" | \"html\" | \"code\";\nconst sourceUnits = (\n raw: string,\n range: Range,\n mode: TextMode = \"markdown\"\n) => {\n const units: { character: string; end: number }[] = [];\n const tokens =\n /\\\\[!-/:-@[-`{-~]|&(?:#(?:\\d{1,7}|x[\\da-f]{1,6})|[\\da-z]{1,31});|\\r\\n|\\r|[\\s\\S]/gi;\n const source = raw.slice(range.start, range.end);\n let token: RegExpExecArray | null;\n while ((token = tokens.exec(source))) {\n const value = token[0];\n const literal =\n mode === \"code\" || (mode === \"html\" && value.startsWith(\"\\\\\"));\n const decoded = (literal ? value : decodeString(value)).replace(\n /\\r\\n|\\r/g,\n \"\\n\"\n );\n for (let index = 0; index < decoded.length; index += 1)\n units.push({\n character: decoded[index],\n end:\n range.start +\n token.index +\n (decoded === value ? index + 1 : value.length),\n });\n }\n return units;\n};\nconst inlineCodeUnits = (raw: string, source: SourceValue) => {\n const opening = /^`+/.exec(raw.slice(source.start, source.end))?.[0] ?? \"\";\n const units = sourceUnits(\n raw,\n { start: source.start + opening.length, end: source.end - opening.length },\n \"code\"\n ).map((unit) => ({\n ...unit,\n character: unit.character === \"\\n\" ? \" \" : unit.character,\n }));\n if (\n units.length > source.value.length &&\n units[0]?.character === \" \" &&\n units.at(-1)?.character === \" \"\n )\n return units.slice(1, -1);\n return units;\n};\nconst blockCodeUnits = (raw: string, source: SourceValue) => {\n const block = raw.slice(source.start, source.end);\n const fenced = /^(?:`{3,}|~{3,})/.test(block);\n let cursor = source.start + (fenced ? block.indexOf(\"\\n\") + 1 : 0);\n const units: { character: string; end: number }[] = [];\n for (const line of source.value.split(\"\\n\")) {\n const newline = raw.indexOf(\"\\n\", cursor);\n const end = newline === -1 ? source.end : Math.min(newline, source.end);\n const lineEnd = raw[end - 1] === \"\\r\" ? end - 1 : end;\n const start = Math.max(cursor, lineEnd - line.length);\n for (let index = 0; index < line.length; index += 1)\n units.push({ character: line[index], end: start + index + 1 });\n units.push({ character: \"\\n\", end: Math.min(source.end, end + 1) });\n cursor = end + 1;\n }\n return units;\n};\n\n/** Preserve the existing SVG renderer's unfinished-header contract. */\nexport const cloneVideoMarkdownSourceTree = (\n plan: VideoMarkdownRunPlan\n): MarkdownRoot => {\n const tree = structuredClone(plan.sourceTree) as MarkdownRoot;\n type MutableNode = {\n type: string;\n value?: string;\n children?: MutableNode[];\n data?: { hName: string };\n position?: Nodes[\"position\"];\n };\n // An unfinished title is still parsed as ordinary prose by CommonMark.\n // Literalize only its HTML leaves; retain raw coordinates and any preceding\n // real HTML in the same node so immediate media keeps its stable parent.\n if (plan.pendingMetadata.length) {\n const lines = [0];\n for (let index = 0; index < plan.markdownSource.length; index += 1)\n if (plan.markdownSource[index] === \"\\n\") lines.push(index + 1);\n const pointAt = (offset: number) => {\n const line = firstAtOrAfter(lines, offset + 1);\n return { line, column: offset - lines[line - 1] + 1, offset };\n };\n const pendingStarts = plan.pendingMetadata.map(({ start }) => start);\n const literalize = (parent: MutableNode) => {\n parent.children = parent.children?.flatMap((child) => {\n if (child.children) literalize(child);\n const range = rangeOf(child);\n if (child.type !== \"html\" || !child.value || !range) return [child];\n let index = Math.max(\n 0,\n firstAtOrAfter(pendingStarts, range.start + 1) - 1\n );\n while (plan.pendingMetadata[index]?.end <= range.start) index += 1;\n if (!plan.pendingMetadata[index] || pendingStarts[index] >= range.end)\n return [child];\n const value = child.value;\n const raw = plan.markdownSource.slice(range.start, range.end);\n let ends: number[] | undefined;\n if (raw !== value) {\n let cursor = 0;\n ends = value.split(\"\").map((character) => {\n cursor = raw.indexOf(character, cursor);\n return range.start + ++cursor;\n });\n }\n const valueIndex = (offset: number) =>\n ends ? firstAtOrAfter(ends, offset + 1) : offset - range.start;\n const parts: MutableNode[] = [];\n let cursor = range.start;\n const push = (end: number, literal: boolean) => {\n if (end <= cursor) return;\n const part = value.slice(valueIndex(cursor), valueIndex(end));\n parts.push({\n ...child,\n type: literal ? \"text\" : \"html\",\n value: literal ? decodeString(part) : part,\n position: { start: pointAt(cursor), end: pointAt(end) },\n });\n cursor = end;\n };\n while (plan.pendingMetadata[index]?.start < range.end) {\n const pending = plan.pendingMetadata[index++];\n push(Math.max(cursor, pending.start), false);\n push(Math.min(range.end, pending.end), true);\n }\n push(range.end, false);\n return parts;\n });\n };\n literalize(tree as unknown as MutableNode);\n }\n const svg = plan.incompleteSvg;\n if (!svg) return tree;\n const before = plan.markdownSource.slice(0, svg.start);\n const point = {\n line: before.split(\"\\n\").length,\n column: svg.start - before.lastIndexOf(\"\\n\"),\n offset: svg.start,\n };\n const marker: MutableNode = {\n type: \"element\",\n data: { hName: \"svg\" },\n children: [],\n position: { start: point, end: tree.position!.end },\n };\n let inserted = false;\n const clip = (parent: MutableNode) => {\n parent.children = parent.children?.flatMap((child) => {\n const range = rangeOf(child);\n if (!range || range.end <= svg.start) return [child];\n if (range.start > svg.start || inserted) return [];\n if (child.children) {\n clip(child);\n return [child];\n }\n const units = sourceUnits(plan.markdownSource, range);\n let cursor = 0;\n let length = 0;\n for (const character of (child.value ?? \"\").split(\"\")) {\n while (units[cursor] && units[cursor].character !== character)\n cursor += 1;\n if (!units[cursor] || units[cursor].end > svg.start) break;\n cursor += 1;\n length += 1;\n }\n const prefix: MutableNode[] = length\n ? [\n {\n ...child,\n value: child.value!.slice(0, length),\n position: { start: child.position!.start, end: point },\n },\n ]\n : [];\n inserted = true;\n return [...prefix, marker];\n });\n };\n clip(tree as unknown as MutableNode);\n return tree;\n};\n\n/** Annotate the complete HTML tree before formatting plugins replace leaves. */\nexport const prepareVideoMarkdownRun = (\n sourcePlan: VideoMarkdownRunPlan,\n tree: Root,\n format: (tree: Root) => Root = (value) => value\n): VideoMarkdownRunPlan => {\n const plan: VideoMarkdownRunPlan = {\n ...sourcePlan,\n visibility: new WeakMap(),\n };\n restoreRawPositions(plan, tree);\n const sources = new Map<string, SourceValue>();\n const taskMarkers = new Map<string, Range>();\n const containerRanges = new Set<string>();\n const collect = (\n node: MarkdownRoot[\"children\"][number] | MarkdownSourceTree\n ) => {\n const range = rawRange(plan, rangeOf(node));\n if (range && node.type !== \"root\" && \"children\" in node)\n containerRanges.add(`${range.start}:${range.end}`);\n if (\n range &&\n node.type === \"listItem\" &&\n typeof node.checked === \"boolean\"\n ) {\n // GFM has already validated this marker and removed it from its paragraph.\n // Its value can contain a tab or line ending with container prefixes, so\n // locate its brackets only inside this confirmed item's leading source.\n const normalized = rangeOf(node)!;\n const start = plan.markdownSource.indexOf(\"[\", normalized.start);\n const end = plan.markdownSource.indexOf(\"]\", start + 1) + 1;\n if (start >= normalized.start && end > start && end <= normalized.end) {\n const marker = rawRange(plan, { start, end })!;\n taskMarkers.set(`${range.start}:${range.end}`, marker);\n const paragraph = node.children[0];\n const paragraphRange = paragraph && rawRange(plan, rangeOf(paragraph));\n // Tight items place the generated input in the li; loose items place it\n // in the first p. Exact ranges keep nested items on their own markers.\n if (paragraph?.type === \"paragraph\" && paragraphRange)\n taskMarkers.set(\n `${paragraphRange.start}:${paragraphRange.end}`,\n marker\n );\n }\n }\n if (range && \"value\" in node && typeof node.value === \"string\")\n sources.set(`${range.start}:${range.end}`, {\n ...range,\n value: node.value,\n type: node.type,\n });\n if (\"children\" in node)\n for (const child of node.children)\n collect(child as MarkdownRoot[\"children\"][number]);\n };\n collect(plan.sourceTree);\n\n const math = (node: Element) => {\n const classes = node.properties.className;\n return (\n Array.isArray(classes) &&\n classes.some(\n (value) =>\n value === \"language-math\" ||\n value === \"math-inline\" ||\n value === \"math-display\"\n )\n );\n };\n const wrapMath = (parent: Root | Element, inherited?: Range) => {\n parent.children = parent.children.map((child) => {\n if (child.type !== \"element\") return child;\n const range = rangeOf(child) ?? inherited;\n const isMath =\n math(child) ||\n (child.tagName === \"pre\" &&\n child.children.some((node) => node.type === \"element\" && math(node)));\n if (isMath && range) {\n const wrapper: Element = {\n type: \"element\",\n tagName: \"span\",\n properties: {},\n children: [child],\n position: child.position,\n };\n plan.visibility.set(wrapper, { range, atomic: true });\n return wrapper;\n }\n wrapMath(child, range);\n return child;\n }) as typeof parent.children;\n };\n wrapMath(tree);\n plan.tree = format(tree);\n\n // Generated structural parents (for example a table body) belong to their\n // positioned descendants, rather than the enclosing block's earlier start.\n const generatedRanges = new WeakMap<Nodes, Range>();\n const bindRanges = (node: Nodes): Range | undefined => {\n const authored = rangeOf(node);\n let children: Range | undefined;\n if (\"children\" in node)\n for (const child of node.children) {\n const range = bindRanges(child);\n if (range)\n children = children\n ? {\n start: Math.min(children.start, range.start),\n end: Math.max(children.end, range.end),\n }\n : range;\n }\n if (!authored && children) generatedRanges.set(node, children);\n return authored ?? children;\n };\n bindRanges(plan.tree);\n\n const containsImmediate = (range: Range) => {\n const next = firstAtOrAfter(plan.immediateOffsets, range.start);\n if (plan.immediateOffsets[next] < range.end) return true;\n const previous = plan.immediateOffsets[next - 1];\n if (previous === undefined) return false;\n const index = segmentAt(plan, previous);\n return range.start < previous + plan.segments[index].value.length;\n };\n\n type Cursor = {\n range: Range;\n mode: TextMode;\n source?: SourceValue;\n units?: ReturnType<typeof sourceUnits>;\n index: number;\n rawCursor: number;\n breakEnd?: number;\n };\n const unitsOf = (context: Cursor) =>\n (context.units ??=\n context.source?.type === \"code\"\n ? blockCodeUnits(plan.fullSource, context.source)\n : context.source?.type === \"inlineCode\"\n ? inlineCodeUnits(plan.fullSource, context.source)\n : sourceUnits(plan.fullSource, context.range, context.mode));\n const pendingMetadata = plan.pendingMetadata.map(\n (range) => rawRange(plan, range)!\n );\n const pendingStarts = pendingMetadata.map(({ start }) => start);\n const isPendingMetadata = (range: Range) => {\n const pending =\n pendingMetadata[firstAtOrAfter(pendingStarts, range.start + 1) - 1];\n return Boolean(pending && range.end <= pending.end);\n };\n const htmlRanges = [...sources.values()].filter(\n ({ type }) => type === \"html\"\n );\n // remark-flow replaces its tokenizer nodes with positionless elements.\n // Recover each replacement from the actual parsed span in its parent range.\n const flows = [...sources.values()].filter(\n ({ type }) => type === \"flowInteraction\"\n );\n const flowStarts = flows.map(({ start }) => start);\n const htmlContains = (range: Range) => {\n let low = 0;\n let high = htmlRanges.length;\n while (low < high) {\n const middle = (low + high) >>> 1;\n if (htmlRanges[middle].start <= range.start) low = middle + 1;\n else high = middle;\n }\n const html = htmlRanges[low - 1];\n return Boolean(html && html.end >= range.end);\n };\n const walk = (node: Nodes, inherited?: Cursor) => {\n let range = rangeOf(node);\n if (\n !range &&\n node.type === \"element\" &&\n node.tagName === \"custom-variable\" &&\n inherited\n ) {\n const cursor = Math.max(\n inherited.rawCursor,\n inherited.units?.[inherited.index - 1]?.end ?? 0\n );\n const flow = flows[firstAtOrAfter(flowStarts, cursor)];\n if (flow && flow.end <= inherited.range.end) range = flow;\n }\n if (\n !range &&\n node.type === \"element\" &&\n node.tagName === \"input\" &&\n node.properties.type === \"checkbox\" &&\n node.properties.disabled === true &&\n inherited\n )\n range = taskMarkers.get(\n `${inherited.range.start}:${inherited.range.end}`\n );\n // remark-breaks creates positionless breaks. Recover the authored newline\n // from the same source cursor used by the adjacent text, including CRLF.\n if (\n !range &&\n node.type === \"element\" &&\n node.tagName === \"br\" &&\n inherited\n ) {\n const units = unitsOf(inherited);\n let index = inherited.index;\n while (\n index < units.length &&\n (units[index].end <= inherited.rawCursor ||\n units[index].character !== \"\\n\")\n )\n index += 1;\n const end = units[index]?.end;\n if (end !== undefined) {\n inherited.index = index + 1;\n range = {\n start: end - (plan.fullSource.slice(end - 2, end) === \"\\r\\n\" ? 2 : 1),\n end,\n };\n }\n }\n range ??= generatedRanges.get(node);\n const source = range && sources.get(`${range.start}:${range.end}`);\n let context = inherited;\n const isCode = source?.type === \"code\" || source?.type === \"inlineCode\";\n if (\n range &&\n (!inherited ||\n range.start !== inherited.range.start ||\n range.end !== inherited.range.end)\n ) {\n context = {\n range,\n source,\n mode: isCode\n ? \"code\"\n : isPendingMetadata(range)\n ? \"markdown\"\n : htmlContains(range)\n ? \"html\"\n : (inherited?.mode ?? \"markdown\"),\n index: 0,\n rawCursor: range.start,\n };\n }\n if (node.type === \"text\" && context) {\n // Generated block-separator whitespace is not authored prose. Avoid\n // allocating the entire root's text map just to display these separators.\n if (!node.position && !node.value.trim() && context.mode !== \"code\")\n return;\n const units = unitsOf(context);\n while (units[context.index]?.end <= context.rawCursor) context.index += 1;\n const ends: number[] = [];\n const characters = node.value.split(\"\");\n // mdast-to-hast adds a newline after a Markdown break. It represents the\n // same source newline, rather than a second authored character to seek.\n if (\n context.breakEnd !== undefined &&\n characters[0] === \"\\n\" &&\n !node.position?.start\n ) {\n ends.push(context.breakEnd);\n characters.shift();\n }\n context.breakEnd = undefined;\n for (const character of characters) {\n while (\n context.index < units.length &&\n units[context.index].character !== character\n )\n context.index += 1;\n ends.push(units[context.index]?.end ?? context.range.end);\n context.index += 1;\n }\n plan.visibility.set(node, { ends });\n } else if (node.type === \"element\") {\n const state = plan.visibility.get(node);\n if (state?.atomic) return;\n const effectiveRange = range ?? context?.range;\n if (effectiveRange) {\n const waitsForEnd =\n node.tagName === \"input\" ||\n node.tagName === \"a\" ||\n node.tagName.startsWith(\"custom-\") ||\n node.tagName === \"svg\";\n const structural =\n !waitsForEnd &&\n (node.children.length > 0 ||\n (!node.position &&\n containerRanges.has(\n `${effectiveRange.start}:${effectiveRange.end}`\n )));\n const index = segmentAt(plan, effectiveRange.start);\n const segment = plan.segments[index];\n plan.visibility.set(node, {\n range: effectiveRange,\n structural,\n svg: node.tagName === \"svg\",\n immediate:\n // Ancestors of immediate HTML keep their stable host elements.\n // Leaves inside a received HTML span share its budget.\n ((structural || node.children.length > 0) &&\n containsImmediate(effectiveRange)) ||\n (segment.type === \"markdown\" &&\n segment.immediate &&\n !segment.pending &&\n effectiveRange.end <= plan.offsets[index] + segment.value.length),\n });\n }\n if (node.tagName === \"br\" && range && inherited && !htmlContains(range))\n inherited.breakEnd = range.end;\n }\n if (\"children\" in node) {\n for (const child of node.children) walk(child, context);\n const state = plan.visibility.get(node);\n // A generated token may precede its author's remaining source position:\n // GFM removes a task marker from the loose item's paragraph range.\n if (state?.structural && state.range)\n for (const child of node.children) {\n const childRange = plan.visibility.get(child)?.range;\n if (childRange && childRange.start < state.range.start)\n state.range = { ...state.range, start: childRange.start };\n }\n }\n if (inherited && context !== inherited && range)\n inherited.rawCursor = Math.max(inherited.rawCursor, range.end);\n };\n walk(plan.tree);\n return plan;\n};\n\n/** Project text and activation state without changing the complete tree shape. */\nexport const projectVideoMarkdownRun = (\n plan: VideoMarkdownRunPlan,\n renderedSegments: readonly RenderSegment[]\n): Root => {\n if (!plan.tree) throw new Error(\"Video Markdown run has not been prepared\");\n const visibleEnds = plan.segments.map(\n (segment, index) =>\n plan.offsets[index] +\n (segment.type === \"markdown\" && segment.pending\n ? 0\n : Math.min(\n renderedSegments[index]?.value.length ?? 0,\n segment.value.length\n ))\n );\n const visible = (end: number) => end <= visibleEnds[segmentAt(plan, end - 1)];\n const containsVisibleImmediate = (range: Range) => {\n const next = firstAtOrAfter(plan.immediateOffsets, range.start);\n const offset = plan.immediateOffsets[next];\n if (offset < range.end && visibleEnds[segmentAt(plan, offset)] > offset)\n return true;\n const previous = plan.immediateOffsets[next - 1];\n return (\n previous !== undefined &&\n range.start < visibleEnds[segmentAt(plan, previous)]\n );\n };\n const copy = (node: Nodes, atomic = false): Nodes => {\n const state = plan.visibility.get(node);\n if (node.type === \"text\") {\n let length = node.value.length;\n if (!atomic && state?.ends) {\n length = 0;\n while (length < state.ends.length && visible(state.ends[length]))\n length += 1;\n }\n return { ...node, value: node.value.slice(0, length) };\n }\n if (\"children\" in node) {\n const children = node.children.map((child) =>\n copy(child, atomic || Boolean(state?.atomic))\n );\n if (node.type === \"element\") {\n const projected: Element = {\n ...node,\n properties: { ...node.properties },\n children: children as Element[\"children\"],\n };\n if (state?.range) {\n const active =\n (Boolean(state.immediate) &&\n containsVisibleImmediate(state.range)) ||\n visible(state.structural ? state.range.start + 1 : state.range.end);\n const svgEnd = state.svg\n ? visibleEnds[segmentAt(plan, state.range.start)]\n : state.range.start;\n projected.data = {\n ...node.data,\n [stateKey]: {\n ...state,\n active,\n svgSource: state.svg\n ? plan.fullSource.slice(\n state.range.start,\n Math.min(\n state.range.end,\n Math.max(state.range.start, svgEnd)\n )\n )\n : undefined,\n },\n };\n }\n return projected;\n }\n return { ...node, children } as Root;\n }\n return { ...node };\n };\n return copy(plan.tree) as Root;\n};\n"],"names":["stateKey","firstAtOrAfter","values","target","low","high","middle","segmentAt","plan","position","rangeOf","node","start","end","getVideoMarkdownNodeState","incompleteSvgRange","raw","excluded","rangeIndex","backslashes","index","markup","readHtmlMarkup","isHtmlRawTextTag","findStreamingHtmlElementEnd","normalizedRawEnds","normalized","ends","cursor","rawOffset","offset","rawRange","range","restoreRawPositions","tree","lines","newline","match","point","value","line","walk","createVideoMarkdownRunPlan","segments","analysis","offsets","fullSource","segment","received","getMarkdownSourceAnalysis","markdownSource","normalizeInlineHtml","rawEnds","parsed","media","left","right","sourceUnits","mode","units","tokens","source","token","decoded","decodeString","inlineCodeUnits","opening","unit","blockCodeUnits","block","fenced","lineEnd","cloneVideoMarkdownSourceTree","pointAt","pendingStarts","literalize","parent","child","character","valueIndex","parts","push","literal","part","pending","svg","before","marker","inserted","clip","length","prefix","prepareVideoMarkdownRun","sourcePlan","format","sources","taskMarkers","containerRanges","collect","paragraph","paragraphRange","math","classes","wrapMath","inherited","wrapper","generatedRanges","bindRanges","authored","children","containsImmediate","next","previous","unitsOf","context","pendingMetadata","isPendingMetadata","htmlRanges","type","flows","flowStarts","htmlContains","html","flow","isCode","characters","effectiveRange","structural","state","childRange","projectVideoMarkdownRun","renderedSegments","visibleEnds","visible","containsVisibleImmediate","copy","atomic","projected","active","svgEnd"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"video-markdown-run.es.js","sources":["../../../../src/components/ContentRender/utils/video-markdown-run.ts"],"sourcesContent":["import type { Element, Nodes, Root } from \"hast\";\nimport type { Root as MarkdownRoot } from \"mdast\";\nimport { decodeString } from \"micromark-util-decode-string\";\nimport {\n getMarkdownSourceAnalysis,\n type MarkdownSourceAnalysis,\n type MarkdownSourceTree,\n} from \"./inline-code-ranges\";\nimport type { RenderSegment } from \"./split-content\";\nimport { normalizeInlineHtml } from \"./normalize-inline-html\";\nimport {\n readHtmlMarkup,\n isHtmlRawTextTag,\n findStreamingHtmlElementEnd,\n} from \"./html-block-end\";\n\ntype Range = { start: number; end: number };\ntype SourceValue = Range & { value: string; type: string };\ntype Visibility = {\n ends?: number[];\n range?: Range;\n atomic?: boolean;\n structural?: boolean;\n svg?: boolean;\n active?: boolean;\n immediate?: boolean;\n svgSource?: string;\n};\nexport type VideoMarkdownRunPlan = {\n fullSource: string;\n markdownSource: string;\n /** Raw end offset for each normalized UTF-16 unit, only when source changed. */\n rawEnds?: readonly number[];\n segments: readonly RenderSegment[];\n offsets: readonly number[];\n immediateOffsets: readonly number[];\n sourceTree: MarkdownSourceTree;\n incompleteSvg?: Range;\n pendingMetadata: readonly Range[];\n tree?: Root;\n visibility: WeakMap<Nodes, Visibility>;\n};\ndeclare module \"hast\" {\n interface ElementData {\n contentRenderVisibility?: Visibility;\n }\n}\nconst stateKey = \"contentRenderVisibility\";\nconst firstAtOrAfter = (values: readonly number[], target: number) => {\n let low = 0;\n let high = values.length;\n while (low < high) {\n const middle = (low + high) >>> 1;\n if (values[middle] < target) low = middle + 1;\n else high = middle;\n }\n return low;\n};\nconst segmentAt = (plan: VideoMarkdownRunPlan, position: number) =>\n Math.max(0, firstAtOrAfter(plan.offsets, position + 1) - 1);\nconst rangeOf = (node: { position?: Nodes[\"position\"] }): Range | undefined => {\n const start = node.position?.start?.offset;\n const end = node.position?.end?.offset;\n return start === undefined || end === undefined ? undefined : { start, end };\n};\nexport const getVideoMarkdownNodeState = (\n node: Element\n): Visibility | undefined => node.data?.[stateKey] as Visibility | undefined;\n\nconst incompleteSvgRange = (raw: string, excluded: readonly Range[]) => {\n let position = 0;\n let rangeIndex = 0;\n while (position < raw.length) {\n const start = raw.indexOf(\"<\", position);\n if (start === -1) break;\n while (excluded[rangeIndex]?.end <= start) rangeIndex += 1;\n if (excluded[rangeIndex]?.start <= start) {\n position = excluded[rangeIndex].end;\n continue;\n }\n let backslashes = 0;\n for (let index = start - 1; index >= 0 && raw[index] === \"\\\\\"; index -= 1)\n backslashes += 1;\n if (backslashes % 2) {\n position = start + 1;\n continue;\n }\n const markup = readHtmlMarkup(raw, start);\n if (markup.kind === \"incomplete\")\n return /^<svg(?=[\\s/>]|$)/i.test(raw.slice(start))\n ? { start, end: raw.length }\n : undefined;\n position =\n markup.kind === \"tag\" &&\n !markup.closing &&\n !markup.selfClosing &&\n isHtmlRawTextTag(markup.name)\n ? findStreamingHtmlElementEnd(raw, start)\n : markup.kind === \"invalid\"\n ? start + 1\n : markup.end;\n }\n};\n\n// Inline HTML normalization only removes indentation and CRLF's CR. A monotonic\n// subsequence map retains the authored end offset of every remaining code unit.\nconst normalizedRawEnds = (raw: string, normalized: string) => {\n if (raw === normalized) return;\n const ends: number[] = [];\n let cursor = 0;\n for (let index = 0; index < normalized.length; index += 1) {\n cursor = raw.indexOf(normalized[index], cursor);\n if (cursor === -1)\n throw new Error(\"HTML normalization changed source characters\");\n ends.push(++cursor);\n }\n return ends;\n};\nconst rawOffset = (plan: VideoMarkdownRunPlan, offset: number, end = false) => {\n if (!plan.rawEnds) return offset;\n if (end) return offset === 0 ? 0 : plan.rawEnds[offset - 1];\n return offset === plan.markdownSource.length\n ? plan.fullSource.length\n : plan.rawEnds[offset] - 1;\n};\nconst rawRange = (plan: VideoMarkdownRunPlan, range?: Range) =>\n range && {\n start: rawOffset(plan, range.start),\n end: rawOffset(plan, range.end, true),\n };\n\n/** Transforms and raw HTML parsing use normalized coordinates until this step. */\nconst restoreRawPositions = (plan: VideoMarkdownRunPlan, tree: Root) => {\n if (!plan.rawEnds) return;\n const lines = [0];\n const newline = /\\r\\n|\\r|\\n/g;\n let match: RegExpExecArray | null;\n while ((match = newline.exec(plan.fullSource)))\n lines.push(match.index + match[0].length);\n const point = (\n value: NonNullable<Nodes[\"position\"]>[\"start\"],\n end: boolean\n ) => {\n if (value?.offset === undefined) return value;\n const offset = rawOffset(plan, value.offset, end);\n const line = firstAtOrAfter(lines, offset + 1);\n return { line, column: offset - lines[line - 1] + 1, offset };\n };\n const walk = (node: Nodes) => {\n const position = node === tree ? plan.sourceTree.position : node.position;\n if (position)\n node.position = {\n start: point(position.start, false),\n end: point(position.end, true),\n };\n if (\"children\" in node) node.children.forEach(walk);\n };\n walk(tree);\n};\n\n/** Runs parse only when source snapshots change; ticks never parse Markdown. */\nexport const createVideoMarkdownRunPlan = (\n segments: readonly RenderSegment[],\n analysis?: MarkdownSourceAnalysis\n): VideoMarkdownRunPlan => {\n const offsets: number[] = [];\n let fullSource = \"\";\n for (const segment of segments) {\n offsets.push(fullSource.length);\n fullSource += segment.value;\n }\n const received = analysis ?? getMarkdownSourceAnalysis(fullSource);\n const markdownSource = normalizeInlineHtml(fullSource, received.markdown);\n const rawEnds = normalizedRawEnds(fullSource, markdownSource);\n const parsed = rawEnds ? getMarkdownSourceAnalysis(markdownSource) : received;\n const media = segments.flatMap((segment, index) =>\n segment.type === \"markdown\" && segment.immediate\n ? [\n {\n start: rawEnds\n ? firstAtOrAfter(rawEnds, offsets[index] + 1)\n : offsets[index],\n end: rawEnds\n ? firstAtOrAfter(rawEnds, offsets[index] + segment.value.length) +\n 1\n : offsets[index] + segment.value.length,\n },\n ]\n : []\n );\n return {\n fullSource,\n markdownSource,\n rawEnds,\n segments,\n offsets,\n immediateOffsets: segments.flatMap((segment, index) =>\n segment.type === \"markdown\" && segment.immediate && !segment.pending\n ? [offsets[index]]\n : []\n ),\n sourceTree: parsed.tree,\n pendingMetadata: parsed.metadata.filter(\n (range) => range.pending && range.end === markdownSource.length\n ),\n incompleteSvg: incompleteSvgRange(\n markdownSource,\n [...parsed.literal, ...media].sort(\n (left, right) => left.start - right.start\n )\n ),\n visibility: new WeakMap(),\n };\n};\n\n// Decode each source token once and retain the raw end offset of every output\n// unit. An entity/escape becomes visible only after its entire token was typed.\ntype TextMode = \"markdown\" | \"html\" | \"code\";\nconst sourceUnits = (\n raw: string,\n range: Range,\n mode: TextMode = \"markdown\"\n) => {\n const units: { character: string; end: number }[] = [];\n const tokens =\n /\\\\[!-/:-@[-`{-~]|&(?:#(?:\\d{1,7}|x[\\da-f]{1,6})|[\\da-z]{1,31});|\\r\\n|\\r|[\\s\\S]/gi;\n const source = raw.slice(range.start, range.end);\n let token: RegExpExecArray | null;\n while ((token = tokens.exec(source))) {\n const value = token[0];\n const literal =\n mode === \"code\" || (mode === \"html\" && value.startsWith(\"\\\\\"));\n const decoded = (literal ? value : decodeString(value)).replace(\n /\\r\\n|\\r/g,\n \"\\n\"\n );\n for (let index = 0; index < decoded.length; index += 1)\n units.push({\n character: decoded[index],\n end:\n range.start +\n token.index +\n (decoded === value ? index + 1 : value.length),\n });\n }\n return units;\n};\nconst inlineCodeUnits = (raw: string, source: SourceValue) => {\n const opening = /^`+/.exec(raw.slice(source.start, source.end))?.[0] ?? \"\";\n const units = sourceUnits(\n raw,\n { start: source.start + opening.length, end: source.end - opening.length },\n \"code\"\n ).map((unit) => ({\n ...unit,\n character: unit.character === \"\\n\" ? \" \" : unit.character,\n }));\n if (\n units.length > source.value.length &&\n units[0]?.character === \" \" &&\n units.at(-1)?.character === \" \"\n )\n return units.slice(1, -1);\n return units;\n};\nconst blockCodeUnits = (raw: string, source: SourceValue) => {\n const block = raw.slice(source.start, source.end);\n const fenced = /^(?:`{3,}|~{3,})/.test(block);\n let cursor = source.start + (fenced ? block.indexOf(\"\\n\") + 1 : 0);\n const units: { character: string; end: number }[] = [];\n for (const line of source.value.split(\"\\n\")) {\n const newline = raw.indexOf(\"\\n\", cursor);\n const end = newline === -1 ? source.end : Math.min(newline, source.end);\n const lineEnd = raw[end - 1] === \"\\r\" ? end - 1 : end;\n const start = Math.max(cursor, lineEnd - line.length);\n for (let index = 0; index < line.length; index += 1)\n units.push({ character: line[index], end: start + index + 1 });\n units.push({ character: \"\\n\", end: Math.min(source.end, end + 1) });\n cursor = end + 1;\n }\n return units;\n};\n\n/** Preserve the existing SVG renderer's unfinished-header contract. */\nexport const cloneVideoMarkdownSourceTree = (\n plan: VideoMarkdownRunPlan\n): MarkdownRoot => {\n const tree = structuredClone(plan.sourceTree) as MarkdownRoot;\n type MutableNode = {\n type: string;\n value?: string;\n children?: MutableNode[];\n data?: { hName: string };\n position?: Nodes[\"position\"];\n };\n // An unfinished title is still parsed as ordinary prose by CommonMark.\n // Literalize only its HTML leaves; retain raw coordinates and any preceding\n // real HTML in the same node so immediate media keeps its stable parent.\n if (plan.pendingMetadata.length) {\n const lines = [0];\n for (let index = 0; index < plan.markdownSource.length; index += 1)\n if (plan.markdownSource[index] === \"\\n\") lines.push(index + 1);\n const pointAt = (offset: number) => {\n const line = firstAtOrAfter(lines, offset + 1);\n return { line, column: offset - lines[line - 1] + 1, offset };\n };\n const pendingStarts = plan.pendingMetadata.map(({ start }) => start);\n const literalize = (parent: MutableNode) => {\n parent.children = parent.children?.flatMap((child) => {\n if (child.children) literalize(child);\n const range = rangeOf(child);\n if (child.type !== \"html\" || !child.value || !range) return [child];\n let index = Math.max(\n 0,\n firstAtOrAfter(pendingStarts, range.start + 1) - 1\n );\n while (plan.pendingMetadata[index]?.end <= range.start) index += 1;\n if (!plan.pendingMetadata[index] || pendingStarts[index] >= range.end)\n return [child];\n const value = child.value;\n const raw = plan.markdownSource.slice(range.start, range.end);\n let ends: number[] | undefined;\n if (raw !== value) {\n let cursor = 0;\n ends = value.split(\"\").map((character) => {\n cursor = raw.indexOf(character, cursor);\n return range.start + ++cursor;\n });\n }\n const valueIndex = (offset: number) =>\n ends ? firstAtOrAfter(ends, offset + 1) : offset - range.start;\n const parts: MutableNode[] = [];\n let cursor = range.start;\n const push = (end: number, literal: boolean) => {\n if (end <= cursor) return;\n const part = value.slice(valueIndex(cursor), valueIndex(end));\n parts.push({\n ...child,\n type: literal ? \"text\" : \"html\",\n value: literal ? decodeString(part) : part,\n position: { start: pointAt(cursor), end: pointAt(end) },\n });\n cursor = end;\n };\n while (plan.pendingMetadata[index]?.start < range.end) {\n const pending = plan.pendingMetadata[index++];\n push(Math.max(cursor, pending.start), false);\n push(Math.min(range.end, pending.end), true);\n }\n push(range.end, false);\n return parts;\n });\n };\n literalize(tree as unknown as MutableNode);\n }\n const svg = plan.incompleteSvg;\n if (!svg) return tree;\n const before = plan.markdownSource.slice(0, svg.start);\n const point = {\n line: before.split(\"\\n\").length,\n column: svg.start - before.lastIndexOf(\"\\n\"),\n offset: svg.start,\n };\n const marker: MutableNode = {\n type: \"element\",\n data: { hName: \"svg\" },\n children: [],\n position: { start: point, end: tree.position!.end },\n };\n let inserted = false;\n const clip = (parent: MutableNode) => {\n parent.children = parent.children?.flatMap((child) => {\n const range = rangeOf(child);\n if (!range || range.end <= svg.start) return [child];\n if (range.start > svg.start || inserted) return [];\n if (child.children) {\n clip(child);\n return [child];\n }\n const units = sourceUnits(plan.markdownSource, range);\n let cursor = 0;\n let length = 0;\n for (const character of (child.value ?? \"\").split(\"\")) {\n while (units[cursor] && units[cursor].character !== character)\n cursor += 1;\n if (!units[cursor] || units[cursor].end > svg.start) break;\n cursor += 1;\n length += 1;\n }\n const prefix: MutableNode[] = length\n ? [\n {\n ...child,\n value: child.value!.slice(0, length),\n position: { start: child.position!.start, end: point },\n },\n ]\n : [];\n inserted = true;\n return [...prefix, marker];\n });\n };\n clip(tree as unknown as MutableNode);\n return tree;\n};\n\n/** Annotate the complete HTML tree before formatting plugins replace leaves. */\nexport const prepareVideoMarkdownRun = (\n sourcePlan: VideoMarkdownRunPlan,\n tree: Root,\n format: (tree: Root) => Root = (value) => value\n): VideoMarkdownRunPlan => {\n const plan: VideoMarkdownRunPlan = {\n ...sourcePlan,\n visibility: new WeakMap(),\n };\n restoreRawPositions(plan, tree);\n const sources = new Map<string, SourceValue>();\n const taskMarkers = new Map<string, Range>();\n const containerRanges = new Set<string>();\n const collect = (\n node: MarkdownRoot[\"children\"][number] | MarkdownSourceTree\n ) => {\n const range = rawRange(plan, rangeOf(node));\n if (range && node.type !== \"root\" && \"children\" in node)\n containerRanges.add(`${range.start}:${range.end}`);\n if (\n range &&\n node.type === \"listItem\" &&\n typeof node.checked === \"boolean\"\n ) {\n // GFM has already validated this marker and removed it from its paragraph.\n // Its value can contain a tab or line ending with container prefixes, so\n // locate its brackets only inside this confirmed item's leading source.\n const normalized = rangeOf(node)!;\n const start = plan.markdownSource.indexOf(\"[\", normalized.start);\n const end = plan.markdownSource.indexOf(\"]\", start + 1) + 1;\n if (start >= normalized.start && end > start && end <= normalized.end) {\n const marker = rawRange(plan, { start, end })!;\n taskMarkers.set(`${range.start}:${range.end}`, marker);\n const paragraph = node.children[0];\n const paragraphRange = paragraph && rawRange(plan, rangeOf(paragraph));\n // Tight items place the generated input in the li; loose items place it\n // in the first p. Exact ranges keep nested items on their own markers.\n if (paragraph?.type === \"paragraph\" && paragraphRange)\n taskMarkers.set(\n `${paragraphRange.start}:${paragraphRange.end}`,\n marker\n );\n }\n }\n if (range && \"value\" in node && typeof node.value === \"string\")\n sources.set(`${range.start}:${range.end}`, {\n ...range,\n value: node.value,\n type: node.type,\n });\n if (\"children\" in node)\n for (const child of node.children)\n collect(child as MarkdownRoot[\"children\"][number]);\n };\n collect(plan.sourceTree);\n\n const math = (node: Element) => {\n const classes = node.properties.className;\n return (\n Array.isArray(classes) &&\n classes.some(\n (value) =>\n value === \"language-math\" ||\n value === \"math-inline\" ||\n value === \"math-display\"\n )\n );\n };\n const wrapMath = (parent: Root | Element, inherited?: Range) => {\n parent.children = parent.children.map((child) => {\n if (child.type !== \"element\") return child;\n const range = rangeOf(child) ?? inherited;\n const isMath =\n math(child) ||\n (child.tagName === \"pre\" &&\n child.children.some((node) => node.type === \"element\" && math(node)));\n if (isMath && range) {\n const wrapper: Element = {\n type: \"element\",\n tagName: \"span\",\n properties: {},\n children: [child],\n position: child.position,\n };\n plan.visibility.set(wrapper, { range, atomic: true });\n return wrapper;\n }\n wrapMath(child, range);\n return child;\n }) as typeof parent.children;\n };\n wrapMath(tree);\n plan.tree = format(tree);\n\n // Generated structural parents (for example a table body) belong to their\n // positioned descendants, rather than the enclosing block's earlier start.\n const generatedRanges = new WeakMap<Nodes, Range>();\n const bindRanges = (node: Nodes): Range | undefined => {\n const authored = rangeOf(node);\n let children: Range | undefined;\n if (\"children\" in node)\n for (const child of node.children) {\n const range = bindRanges(child);\n if (range)\n children = children\n ? {\n start: Math.min(children.start, range.start),\n end: Math.max(children.end, range.end),\n }\n : range;\n }\n if (!authored && children) generatedRanges.set(node, children);\n return authored ?? children;\n };\n bindRanges(plan.tree);\n\n const containsImmediate = (range: Range) => {\n const next = firstAtOrAfter(plan.immediateOffsets, range.start);\n if (plan.immediateOffsets[next] < range.end) return true;\n const previous = plan.immediateOffsets[next - 1];\n if (previous === undefined) return false;\n const index = segmentAt(plan, previous);\n return range.start < previous + plan.segments[index].value.length;\n };\n\n type Cursor = {\n range: Range;\n mode: TextMode;\n source?: SourceValue;\n units?: ReturnType<typeof sourceUnits>;\n index: number;\n rawCursor: number;\n breakEnd?: number;\n };\n const unitsOf = (context: Cursor) =>\n (context.units ??=\n context.source?.type === \"code\"\n ? blockCodeUnits(plan.fullSource, context.source)\n : context.source?.type === \"inlineCode\"\n ? inlineCodeUnits(plan.fullSource, context.source)\n : sourceUnits(plan.fullSource, context.range, context.mode));\n const pendingMetadata = plan.pendingMetadata.map((range) =>\n rawRange(plan, range)!\n );\n const pendingStarts = pendingMetadata.map(({ start }) => start);\n const isPendingMetadata = (range: Range) => {\n const pending =\n pendingMetadata[firstAtOrAfter(pendingStarts, range.start + 1) - 1];\n return Boolean(pending && range.end <= pending.end);\n };\n const htmlRanges = [...sources.values()].filter(\n ({ type }) => type === \"html\"\n );\n // remark-flow replaces its tokenizer nodes with positionless elements.\n // Recover each replacement from the actual parsed span in its parent range.\n const flows = [...sources.values()].filter(\n ({ type }) => type === \"flowInteraction\"\n );\n const flowStarts = flows.map(({ start }) => start);\n const htmlContains = (range: Range) => {\n let low = 0;\n let high = htmlRanges.length;\n while (low < high) {\n const middle = (low + high) >>> 1;\n if (htmlRanges[middle].start <= range.start) low = middle + 1;\n else high = middle;\n }\n const html = htmlRanges[low - 1];\n return Boolean(html && html.end >= range.end);\n };\n const walk = (node: Nodes, inherited?: Cursor) => {\n let range = rangeOf(node);\n if (\n !range &&\n node.type === \"element\" &&\n node.tagName === \"custom-variable\" &&\n inherited\n ) {\n const cursor = Math.max(\n inherited.rawCursor,\n inherited.units?.[inherited.index - 1]?.end ?? 0\n );\n const flow = flows[firstAtOrAfter(flowStarts, cursor)];\n if (flow && flow.end <= inherited.range.end) range = flow;\n }\n if (\n !range &&\n node.type === \"element\" &&\n node.tagName === \"input\" &&\n node.properties.type === \"checkbox\" &&\n node.properties.disabled === true &&\n inherited\n )\n range = taskMarkers.get(\n `${inherited.range.start}:${inherited.range.end}`\n );\n // remark-breaks creates positionless breaks. Recover the authored newline\n // from the same source cursor used by the adjacent text, including CRLF.\n if (\n !range &&\n node.type === \"element\" &&\n node.tagName === \"br\" &&\n inherited\n ) {\n const units = unitsOf(inherited);\n let index = inherited.index;\n while (\n index < units.length &&\n (units[index].end <= inherited.rawCursor ||\n units[index].character !== \"\\n\")\n )\n index += 1;\n const end = units[index]?.end;\n if (end !== undefined) {\n inherited.index = index + 1;\n range = {\n start: end - (plan.fullSource.slice(end - 2, end) === \"\\r\\n\" ? 2 : 1),\n end,\n };\n }\n }\n range ??= generatedRanges.get(node);\n const source = range && sources.get(`${range.start}:${range.end}`);\n let context = inherited;\n const isCode = source?.type === \"code\" || source?.type === \"inlineCode\";\n if (\n range &&\n (!inherited ||\n range.start !== inherited.range.start ||\n range.end !== inherited.range.end)\n ) {\n context = {\n range,\n source,\n mode: isCode\n ? \"code\"\n : isPendingMetadata(range)\n ? \"markdown\"\n : htmlContains(range)\n ? \"html\"\n : (inherited?.mode ?? \"markdown\"),\n index: 0,\n rawCursor: range.start,\n };\n }\n if (node.type === \"text\" && context) {\n // Generated block-separator whitespace is not authored prose. Avoid\n // allocating the entire root's text map just to display these separators.\n if (!node.position && !node.value.trim() && context.mode !== \"code\")\n return;\n const units = unitsOf(context);\n while (units[context.index]?.end <= context.rawCursor) context.index += 1;\n const ends: number[] = [];\n const characters = node.value.split(\"\");\n // mdast-to-hast adds a newline after a Markdown break. It represents the\n // same source newline, rather than a second authored character to seek.\n if (\n context.breakEnd !== undefined &&\n characters[0] === \"\\n\" &&\n !node.position?.start\n ) {\n ends.push(context.breakEnd);\n characters.shift();\n }\n context.breakEnd = undefined;\n for (const character of characters) {\n while (\n context.index < units.length &&\n units[context.index].character !== character\n )\n context.index += 1;\n ends.push(units[context.index]?.end ?? context.range.end);\n context.index += 1;\n }\n plan.visibility.set(node, { ends });\n } else if (node.type === \"element\") {\n const state = plan.visibility.get(node);\n if (state?.atomic) return;\n const effectiveRange = range ?? context?.range;\n if (effectiveRange) {\n const waitsForEnd =\n node.tagName === \"input\" ||\n node.tagName === \"a\" ||\n node.tagName.startsWith(\"custom-\") ||\n node.tagName === \"svg\";\n const structural =\n !waitsForEnd &&\n (node.children.length > 0 ||\n (!node.position &&\n containerRanges.has(\n `${effectiveRange.start}:${effectiveRange.end}`\n )));\n const index = segmentAt(plan, effectiveRange.start);\n const segment = plan.segments[index];\n plan.visibility.set(node, {\n range: effectiveRange,\n structural,\n svg: node.tagName === \"svg\",\n immediate:\n // Ancestors of immediate HTML keep their stable host elements.\n // Leaves inside a received HTML span share its budget.\n ((structural || node.children.length > 0) &&\n containsImmediate(effectiveRange)) ||\n (segment.type === \"markdown\" &&\n segment.immediate &&\n !segment.pending &&\n effectiveRange.end <= plan.offsets[index] + segment.value.length),\n });\n }\n if (node.tagName === \"br\" && range && inherited && !htmlContains(range))\n inherited.breakEnd = range.end;\n }\n if (\"children\" in node) {\n for (const child of node.children) walk(child, context);\n const state = plan.visibility.get(node);\n // A generated token may precede its author's remaining source position:\n // GFM removes a task marker from the loose item's paragraph range.\n if (state?.structural && state.range)\n for (const child of node.children) {\n const childRange = plan.visibility.get(child)?.range;\n if (childRange && childRange.start < state.range.start)\n state.range = { ...state.range, start: childRange.start };\n }\n }\n if (inherited && context !== inherited && range)\n inherited.rawCursor = Math.max(inherited.rawCursor, range.end);\n };\n walk(plan.tree);\n return plan;\n};\n\n/** Project text and activation state without changing the complete tree shape. */\nexport const projectVideoMarkdownRun = (\n plan: VideoMarkdownRunPlan,\n renderedSegments: readonly RenderSegment[]\n): Root => {\n if (!plan.tree) throw new Error(\"Video Markdown run has not been prepared\");\n const visibleEnds = plan.segments.map(\n (segment, index) =>\n plan.offsets[index] +\n (segment.type === \"markdown\" && segment.pending\n ? 0\n : Math.min(\n renderedSegments[index]?.value.length ?? 0,\n segment.value.length\n ))\n );\n const visible = (end: number) => end <= visibleEnds[segmentAt(plan, end - 1)];\n const containsVisibleImmediate = (range: Range) => {\n const next = firstAtOrAfter(plan.immediateOffsets, range.start);\n const offset = plan.immediateOffsets[next];\n if (offset < range.end && visibleEnds[segmentAt(plan, offset)] > offset)\n return true;\n const previous = plan.immediateOffsets[next - 1];\n return (\n previous !== undefined &&\n range.start < visibleEnds[segmentAt(plan, previous)]\n );\n };\n const copy = (node: Nodes, atomic = false): Nodes => {\n const state = plan.visibility.get(node);\n if (node.type === \"text\") {\n let length = node.value.length;\n if (!atomic && state?.ends) {\n length = 0;\n while (length < state.ends.length && visible(state.ends[length]))\n length += 1;\n }\n return { ...node, value: node.value.slice(0, length) };\n }\n if (\"children\" in node) {\n const children = node.children.map((child) =>\n copy(child, atomic || Boolean(state?.atomic))\n );\n if (node.type === \"element\") {\n const projected: Element = {\n ...node,\n properties: { ...node.properties },\n children: children as Element[\"children\"],\n };\n if (state?.range) {\n const active =\n (Boolean(state.immediate) &&\n containsVisibleImmediate(state.range)) ||\n visible(state.structural ? state.range.start + 1 : state.range.end);\n const svgEnd = state.svg\n ? visibleEnds[segmentAt(plan, state.range.start)]\n : state.range.start;\n projected.data = {\n ...node.data,\n [stateKey]: {\n ...state,\n active,\n svgSource: state.svg\n ? plan.fullSource.slice(\n state.range.start,\n Math.min(\n state.range.end,\n Math.max(state.range.start, svgEnd)\n )\n )\n : undefined,\n },\n };\n }\n return projected;\n }\n return { ...node, children } as Root;\n }\n return { ...node };\n };\n return copy(plan.tree) as Root;\n};\n"],"names":["stateKey","firstAtOrAfter","values","target","low","high","middle","segmentAt","plan","position","rangeOf","node","start","end","getVideoMarkdownNodeState","incompleteSvgRange","raw","excluded","rangeIndex","backslashes","index","markup","readHtmlMarkup","isHtmlRawTextTag","findStreamingHtmlElementEnd","normalizedRawEnds","normalized","ends","cursor","rawOffset","offset","rawRange","range","restoreRawPositions","tree","lines","newline","match","point","value","line","walk","createVideoMarkdownRunPlan","segments","analysis","offsets","fullSource","segment","received","getMarkdownSourceAnalysis","markdownSource","normalizeInlineHtml","rawEnds","parsed","media","left","right","sourceUnits","mode","units","tokens","source","token","decoded","decodeString","inlineCodeUnits","opening","unit","blockCodeUnits","block","fenced","lineEnd","cloneVideoMarkdownSourceTree","pointAt","pendingStarts","literalize","parent","child","character","valueIndex","parts","push","literal","part","pending","svg","before","marker","inserted","clip","length","prefix","prepareVideoMarkdownRun","sourcePlan","format","sources","taskMarkers","containerRanges","collect","paragraph","paragraphRange","math","classes","wrapMath","inherited","wrapper","generatedRanges","bindRanges","authored","children","containsImmediate","next","previous","unitsOf","context","pendingMetadata","isPendingMetadata","htmlRanges","type","flows","flowStarts","htmlContains","html","flow","isCode","characters","effectiveRange","structural","state","childRange","projectVideoMarkdownRun","renderedSegments","visibleEnds","visible","containsVisibleImmediate","copy","atomic","projected","active","svgEnd"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ScrollToBottomButton.cjs","sources":["../../../src/components/MarkdownFlow/ScrollToBottomButton.tsx"],"sourcesContent":["import React, { useCallback, type CSSProperties } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { ChevronsDown } from \"lucide-react\";\nimport { cn } from \"../../lib/utils\";\n\nexport type ScrollToBottomPlacement = \"bottom-center\" | \"bottom-right\";\nexport type ScrollToBottomPosition = \"absolute\" | \"fixed\";\n\n/** Presentation and native button props for a localized scroll-to-bottom control. */\nexport interface ScrollToBottomButtonProps
|
|
1
|
+
{"version":3,"file":"ScrollToBottomButton.cjs","sources":["../../../src/components/MarkdownFlow/ScrollToBottomButton.tsx"],"sourcesContent":["import React, { useCallback, type CSSProperties } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { ChevronsDown } from \"lucide-react\";\nimport { cn } from \"../../lib/utils\";\n\nexport type ScrollToBottomPlacement = \"bottom-center\" | \"bottom-right\";\nexport type ScrollToBottomPosition = \"absolute\" | \"fixed\";\n\n/** Presentation and native button props for a localized scroll-to-bottom control. */\nexport interface ScrollToBottomButtonProps extends Omit<\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n \"aria-label\" | \"children\"\n> {\n /** Whether the control is visible and keyboard-focusable. */\n visible: boolean;\n /** Localized accessible name for the icon-only button. */\n ariaLabel: string;\n /** Optional host element in which the library renders the button. */\n portalTarget?: HTMLElement | null;\n /** Horizontal placement within the positioning context. Defaults to bottom-center. */\n placement?: ScrollToBottomPlacement;\n /** CSS positioning model supplied by the host layout. */\n position?: ScrollToBottomPosition;\n /** Bottom offset in pixels, or any valid CSS length. */\n bottomOffset?: number | string;\n /** Right offset for bottom-right placement, in pixels or a CSS length. */\n horizontalOffset?: number | string;\n /** Stacking level within the host layout. */\n zIndex?: number;\n}\n\ntype ScrollToBottomButtonStyle = CSSProperties & {\n \"--scroll-to-bottom-bottom\"?: string;\n \"--scroll-to-bottom-horizontal\"?: string;\n \"--scroll-to-bottom-position\"?: ScrollToBottomPosition;\n};\n\nconst toCssLength = (value: number | string) =>\n typeof value === \"number\" ? `${value}px` : value;\n\n/**\n * Render the scroll control without owning scroll detection or follow state.\n *\n * @param props Visibility, localized accessible name, host layout and button events.\n * @returns A native icon button, optionally rendered into the supplied portal host.\n * @example\n * ```tsx\n * <ScrollToBottomButton\n * visible={showScrollToBottom}\n * ariaLabel=\"Scroll to bottom\"\n * onClick={scrollToBottom}\n * />\n * ```\n */\nexport const ScrollToBottomButton: React.FC<ScrollToBottomButtonProps> = ({\n visible,\n ariaLabel,\n portalTarget,\n placement = \"bottom-center\",\n position = \"absolute\",\n bottomOffset = 20,\n horizontalOffset = 20,\n zIndex = 1,\n className = \"\",\n style,\n tabIndex,\n disabled,\n type = \"button\",\n ...props\n}) => {\n const releaseHiddenFocus = useCallback(\n (button: HTMLButtonElement | null) => {\n if (!visible && button && button.ownerDocument.activeElement === button) {\n button.blur();\n }\n },\n [visible]\n );\n const buttonStyle: ScrollToBottomButtonStyle = {\n \"--scroll-to-bottom-bottom\": toCssLength(bottomOffset),\n \"--scroll-to-bottom-horizontal\": toCssLength(horizontalOffset),\n \"--scroll-to-bottom-position\": position,\n zIndex,\n ...style,\n };\n const button = (\n <button\n {...props}\n ref={releaseHiddenFocus}\n disabled={!visible || disabled}\n type={type}\n className={cn(\"scroll-to-bottom-btn\", className)}\n style={buttonStyle}\n aria-label={ariaLabel}\n aria-hidden={visible ? undefined : true}\n data-placement={placement}\n data-visible={visible ? \"true\" : \"false\"}\n tabIndex={visible ? tabIndex : -1}\n >\n <ChevronsDown size={20} aria-hidden=\"true\" focusable=\"false\" />\n </button>\n );\n return portalTarget ? createPortal(button, portalTarget) : button;\n};\n\nScrollToBottomButton.displayName = \"ScrollToBottomButton\";\n\nexport default ScrollToBottomButton;\n"],"names":["toCssLength","value","ScrollToBottomButton","visible","ariaLabel","portalTarget","placement","position","bottomOffset","horizontalOffset","zIndex","className","style","tabIndex","disabled","type","props","releaseHiddenFocus","useCallback","button","buttonStyle","jsx","cn","ChevronsDown","createPortal"],"mappings":"0SAqCMA,EAAeC,GACnB,OAAOA,GAAU,SAAW,GAAGA,CAAK,KAAOA,EAgBhCC,EAA4D,CAAC,CACxE,QAAAC,EACA,UAAAC,EACA,aAAAC,EACA,UAAAC,EAAY,gBACZ,SAAAC,EAAW,WACX,aAAAC,EAAe,GACf,iBAAAC,EAAmB,GACnB,OAAAC,EAAS,EACT,UAAAC,EAAY,GACZ,MAAAC,EACA,SAAAC,EACA,SAAAC,EACA,KAAAC,EAAO,SACP,GAAGC,CACL,IAAM,CACJ,MAAMC,EAAqBC,EAAAA,YACxBC,GAAqC,CAChC,CAAChB,GAAWgB,GAAUA,EAAO,cAAc,gBAAkBA,GAC/DA,EAAO,KAAA,CAEX,EACA,CAAChB,CAAO,CAAA,EAEJiB,EAAyC,CAC7C,4BAA6BpB,EAAYQ,CAAY,EACrD,gCAAiCR,EAAYS,CAAgB,EAC7D,8BAA+BF,EAC/B,OAAAG,EACA,GAAGE,CAAA,EAECO,EACJE,EAAAA,IAAC,SAAA,CACE,GAAGL,EACJ,IAAKC,EACL,SAAU,CAACd,GAAWW,EACtB,KAAAC,EACA,UAAWO,EAAAA,GAAG,uBAAwBX,CAAS,EAC/C,MAAOS,EACP,aAAYhB,EACZ,cAAaD,EAAU,OAAY,GACnC,iBAAgBG,EAChB,eAAcH,EAAU,OAAS,QACjC,SAAUA,EAAUU,EAAW,GAE/B,eAACU,EAAAA,QAAA,CAAa,KAAM,GAAI,cAAY,OAAO,UAAU,OAAA,CAAQ,CAAA,CAAA,EAGjE,OAAOlB,EAAemB,EAAAA,aAAaL,EAAQd,CAAY,EAAIc,CAC7D,EAEAjB,EAAqB,YAAc"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ScrollToBottomButton.es.js","sources":["../../../src/components/MarkdownFlow/ScrollToBottomButton.tsx"],"sourcesContent":["import React, { useCallback, type CSSProperties } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { ChevronsDown } from \"lucide-react\";\nimport { cn } from \"../../lib/utils\";\n\nexport type ScrollToBottomPlacement = \"bottom-center\" | \"bottom-right\";\nexport type ScrollToBottomPosition = \"absolute\" | \"fixed\";\n\n/** Presentation and native button props for a localized scroll-to-bottom control. */\nexport interface ScrollToBottomButtonProps
|
|
1
|
+
{"version":3,"file":"ScrollToBottomButton.es.js","sources":["../../../src/components/MarkdownFlow/ScrollToBottomButton.tsx"],"sourcesContent":["import React, { useCallback, type CSSProperties } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { ChevronsDown } from \"lucide-react\";\nimport { cn } from \"../../lib/utils\";\n\nexport type ScrollToBottomPlacement = \"bottom-center\" | \"bottom-right\";\nexport type ScrollToBottomPosition = \"absolute\" | \"fixed\";\n\n/** Presentation and native button props for a localized scroll-to-bottom control. */\nexport interface ScrollToBottomButtonProps extends Omit<\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n \"aria-label\" | \"children\"\n> {\n /** Whether the control is visible and keyboard-focusable. */\n visible: boolean;\n /** Localized accessible name for the icon-only button. */\n ariaLabel: string;\n /** Optional host element in which the library renders the button. */\n portalTarget?: HTMLElement | null;\n /** Horizontal placement within the positioning context. Defaults to bottom-center. */\n placement?: ScrollToBottomPlacement;\n /** CSS positioning model supplied by the host layout. */\n position?: ScrollToBottomPosition;\n /** Bottom offset in pixels, or any valid CSS length. */\n bottomOffset?: number | string;\n /** Right offset for bottom-right placement, in pixels or a CSS length. */\n horizontalOffset?: number | string;\n /** Stacking level within the host layout. */\n zIndex?: number;\n}\n\ntype ScrollToBottomButtonStyle = CSSProperties & {\n \"--scroll-to-bottom-bottom\"?: string;\n \"--scroll-to-bottom-horizontal\"?: string;\n \"--scroll-to-bottom-position\"?: ScrollToBottomPosition;\n};\n\nconst toCssLength = (value: number | string) =>\n typeof value === \"number\" ? `${value}px` : value;\n\n/**\n * Render the scroll control without owning scroll detection or follow state.\n *\n * @param props Visibility, localized accessible name, host layout and button events.\n * @returns A native icon button, optionally rendered into the supplied portal host.\n * @example\n * ```tsx\n * <ScrollToBottomButton\n * visible={showScrollToBottom}\n * ariaLabel=\"Scroll to bottom\"\n * onClick={scrollToBottom}\n * />\n * ```\n */\nexport const ScrollToBottomButton: React.FC<ScrollToBottomButtonProps> = ({\n visible,\n ariaLabel,\n portalTarget,\n placement = \"bottom-center\",\n position = \"absolute\",\n bottomOffset = 20,\n horizontalOffset = 20,\n zIndex = 1,\n className = \"\",\n style,\n tabIndex,\n disabled,\n type = \"button\",\n ...props\n}) => {\n const releaseHiddenFocus = useCallback(\n (button: HTMLButtonElement | null) => {\n if (!visible && button && button.ownerDocument.activeElement === button) {\n button.blur();\n }\n },\n [visible]\n );\n const buttonStyle: ScrollToBottomButtonStyle = {\n \"--scroll-to-bottom-bottom\": toCssLength(bottomOffset),\n \"--scroll-to-bottom-horizontal\": toCssLength(horizontalOffset),\n \"--scroll-to-bottom-position\": position,\n zIndex,\n ...style,\n };\n const button = (\n <button\n {...props}\n ref={releaseHiddenFocus}\n disabled={!visible || disabled}\n type={type}\n className={cn(\"scroll-to-bottom-btn\", className)}\n style={buttonStyle}\n aria-label={ariaLabel}\n aria-hidden={visible ? undefined : true}\n data-placement={placement}\n data-visible={visible ? \"true\" : \"false\"}\n tabIndex={visible ? tabIndex : -1}\n >\n <ChevronsDown size={20} aria-hidden=\"true\" focusable=\"false\" />\n </button>\n );\n return portalTarget ? createPortal(button, portalTarget) : button;\n};\n\nScrollToBottomButton.displayName = \"ScrollToBottomButton\";\n\nexport default ScrollToBottomButton;\n"],"names":["toCssLength","value","ScrollToBottomButton","visible","ariaLabel","portalTarget","placement","position","bottomOffset","horizontalOffset","zIndex","className","style","tabIndex","disabled","type","props","releaseHiddenFocus","useCallback","button","buttonStyle","jsx","cn","ChevronsDown","createPortal"],"mappings":";;;;;AAqCA,MAAMA,IAAc,CAACC,MACnB,OAAOA,KAAU,WAAW,GAAGA,CAAK,OAAOA,GAgBhCC,IAA4D,CAAC;AAAA,EACxE,SAAAC;AAAA,EACA,WAAAC;AAAA,EACA,cAAAC;AAAA,EACA,WAAAC,IAAY;AAAA,EACZ,UAAAC,IAAW;AAAA,EACX,cAAAC,IAAe;AAAA,EACf,kBAAAC,IAAmB;AAAA,EACnB,QAAAC,IAAS;AAAA,EACT,WAAAC,IAAY;AAAA,EACZ,OAAAC;AAAA,EACA,UAAAC;AAAA,EACA,UAAAC;AAAA,EACA,MAAAC,IAAO;AAAA,EACP,GAAGC;AACL,MAAM;AACJ,QAAMC,IAAqBC;AAAA,IACzB,CAACC,MAAqC;AACpC,MAAI,CAAChB,KAAWgB,KAAUA,EAAO,cAAc,kBAAkBA,KAC/DA,EAAO,KAAA;AAAA,IAEX;AAAA,IACA,CAAChB,CAAO;AAAA,EAAA,GAEJiB,IAAyC;AAAA,IAC7C,6BAA6BpB,EAAYQ,CAAY;AAAA,IACrD,iCAAiCR,EAAYS,CAAgB;AAAA,IAC7D,+BAA+BF;AAAA,IAC/B,QAAAG;AAAA,IACA,GAAGE;AAAA,EAAA,GAECO,IACJ,gBAAAE;AAAA,IAAC;AAAA,IAAA;AAAA,MACE,GAAGL;AAAA,MACJ,KAAKC;AAAA,MACL,UAAU,CAACd,KAAWW;AAAA,MACtB,MAAAC;AAAA,MACA,WAAWO,EAAG,wBAAwBX,CAAS;AAAA,MAC/C,OAAOS;AAAA,MACP,cAAYhB;AAAA,MACZ,eAAaD,IAAU,SAAY;AAAA,MACnC,kBAAgBG;AAAA,MAChB,gBAAcH,IAAU,SAAS;AAAA,MACjC,UAAUA,IAAUU,IAAW;AAAA,MAE/B,4BAACU,GAAA,EAAa,MAAM,IAAI,eAAY,QAAO,WAAU,QAAA,CAAQ;AAAA,IAAA;AAAA,EAAA;AAGjE,SAAOlB,IAAemB,EAAaL,GAAQd,CAAY,IAAIc;AAC7D;AAEAjB,EAAqB,cAAc;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ScrollToBottomControl.cjs","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
|
|
1
|
+
{"version":3,"file":"ScrollToBottomControl.cjs","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\n 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":"8NAyBaA,EAA8D,CAAC,CAC1E,YAAAC,EACA,WAAAC,EACA,OAAAC,EACA,aAAAC,EACA,mBAAAC,EACA,gBAAAC,EACA,eAAAC,EACA,iBAAAC,EACA,iBAAAC,EACA,SAAAC,EACA,iBAAAC,EACA,GAAGC,CACL,IAAM,CACJ,KAAM,CAAE,mBAAAC,EAAoB,eAAAC,CAAA,EAAmBC,EAAAA,kBAC7Cd,EACA,CACE,WAAAC,EACA,OAAAC,EACA,aAAAC,EACA,mBAAAC,EACA,gBAAAC,EACA,eAAAC,EACA,iBAAAC,EACA,iBAAAC,EACA,SAAAC,CAAA,CACF,EAGF,OACEM,EAAAA,IAACC,EAAAA,qBAAA,CACE,GAAGL,EACJ,QAASC,EACT,QAAS,IAAM,CACbC,EAAA,EACAH,IAAA,CACF,CAAA,CAAA,CAGN"}
|
|
@@ -1 +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
|
|
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\n 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":";;;AAyBO,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 +1 @@
|
|
|
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
|
+
{"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 | ScrollTargetRef | ScrollTargetResolver | 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 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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"}
|