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":"useScrollToBottom.es.js","sources":["../../../src/components/MarkdownFlow/useScrollToBottom.ts"],"sourcesContent":["import {\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n type RefObject,\n} from \"react\";\n\nconst useCommittedLayoutEffect =\n typeof window === \"undefined\" ? useEffect : useLayoutEffect;\n\nexport type ScrollBehavior = \"smooth\" | \"auto\";\nexport type PageScrollFallback = \"auto\" | \"always\" | \"never\";\nexport type ScrollTarget = HTMLElement | Document | Window;\nexport type ScrollTargetRef = RefObject<ScrollTarget | null>;\nexport type ScrollTargetResolver = () => ScrollTarget | null;\nexport type ScrollTargetInput =\n | ScrollTarget\n | ScrollTargetRef\n | ScrollTargetResolver\n | null;\n\nexport interface ScrollMetrics {\n scrollTop: number;\n scrollHeight: number;\n clientHeight: number;\n}\n\nexport interface ScrollPresentation {\n distanceFromBottom: number;\n isAtBottom: boolean;\n isScrollable: boolean;\n showScrollToBottom: boolean;\n}\n\nexport interface UseScrollToBottomOptions {\n /** Actual content box whose growth should be observed. Defaults to all direct element children of the viewport. */\n contentRef?: RefObject<HTMLElement | null>;\n /** Optional bottom anchor used to preserve nested-container scrollIntoView behavior. */\n endRef?: RefObject<HTMLElement | null>;\n /** Explicit scroll target or resolver. Unresolved targets stay inactive; omit to infer viewport, parent and page roots. */\n scrollTarget?: ScrollTargetInput;\n /** Whether page scrolling joins the viewport and parent targets. */\n pageScrollFallback?: PageScrollFallback;\n /** Near-bottom distance in pixels. Defaults to the strict 150px threshold. */\n scrollThreshold?: number;\n /** Optional refresh signal; DOM growth is observed without this prop. */\n contentVersion?: unknown;\n /** Follow growth while at the bottom, and pause after scrolling away. Defaults to true. */\n followNewContent?: boolean;\n /** Scroll to the end on the first mount. Defaults to false. */\n autoScrollOnInit?: boolean;\n /** User-triggered behavior. Auto and reduced-motion scrolling are immediate, regardless of host CSS. */\n behavior?: ScrollBehavior;\n}\n\nexport interface UseScrollToBottomReturn {\n showScrollToBottom: boolean;\n isAtBottom: boolean;\n followNewContent: boolean;\n scrollToBottom: (behavior?: ScrollBehavior) => void;\n /** Backward-compatible click handler that ignores React event arguments. */\n handleUserScrollToBottom: () => void;\n refresh: () => void;\n}\n\nexport interface LegacyUseScrollToBottomOptions\n extends UseScrollToBottomOptions {\n /** Retained for source compatibility; scrolling now follows browser frames and observers. */\n scrollDelay?: number;\n}\n\nconst isWindow = (target: ScrollTarget): target is Window =>\n \"window\" in target && target.window === target;\n\nconst isDocument = (target: ScrollTarget): target is Document =>\n \"nodeType\" in target && target.nodeType === 9;\n\nconst getDocumentScroller = (target: Document | Window): HTMLElement | null => {\n const document = isWindow(target) ? target.document : target;\n return (document.scrollingElement || document.documentElement) as HTMLElement;\n};\n\nconst getTargetWindow = (target: ScrollTarget): Window | null => {\n if (isWindow(target)) return target;\n if (isDocument(target)) return target.defaultView;\n return target.ownerDocument.defaultView;\n};\n\nexport const getScrollMetrics = (target: ScrollTarget): ScrollMetrics => {\n if (isWindow(target) || isDocument(target)) {\n const scroller = getDocumentScroller(target);\n const viewportHeight = isWindow(target)\n ? target.innerHeight\n : scroller?.clientHeight || 0;\n return {\n scrollTop: scroller?.scrollTop || 0,\n scrollHeight: scroller?.scrollHeight || 0,\n clientHeight: viewportHeight,\n };\n }\n return {\n scrollTop: target.scrollTop,\n scrollHeight: target.scrollHeight,\n clientHeight: target.clientHeight,\n };\n};\n\nexport const getScrollPresentation = (\n metrics: ScrollMetrics,\n threshold = 150\n): ScrollPresentation => {\n const normalizedThreshold = Math.max(0, threshold);\n const isScrollable = metrics.scrollHeight > metrics.clientHeight;\n const distanceFromBottom = Math.max(\n 0,\n metrics.scrollHeight - metrics.scrollTop - metrics.clientHeight\n );\n const isAtBottom =\n !isScrollable ||\n distanceFromBottom === 0 ||\n distanceFromBottom < normalizedThreshold;\n return {\n distanceFromBottom,\n isAtBottom,\n isScrollable,\n showScrollToBottom: isScrollable && !isAtBottom,\n };\n};\n\nexport const getCombinedScrollPresentation = (\n metrics: ScrollMetrics[],\n threshold = 150\n): ScrollPresentation => {\n const presentations = metrics.map((item) =>\n getScrollPresentation(item, threshold)\n );\n return {\n distanceFromBottom: Math.max(\n 0,\n ...presentations.map((item) => item.distanceFromBottom)\n ),\n isAtBottom: presentations.every((item) => item.isAtBottom),\n isScrollable: presentations.some((item) => item.isScrollable),\n showScrollToBottom: presentations.some((item) => item.showScrollToBottom),\n };\n};\n\nexport const resolveScrollBehavior = (\n requestedBehavior: ScrollBehavior,\n prefersReducedMotion: boolean\n): ScrollBehavior =>\n requestedBehavior === \"smooth\" && prefersReducedMotion\n ? \"auto\"\n : requestedBehavior;\n\nconst scrollTargetValue = (\n target: ScrollTargetInput | undefined\n): ScrollTarget | null => {\n if (!target) return null;\n if (typeof target === \"function\") return target();\n return \"current\" in target ? target.current : target;\n};\n\nconst hasScrollableContent = (target: ScrollTarget) => {\n const { scrollHeight, clientHeight } = getScrollMetrics(target);\n return scrollHeight > clientHeight + 1;\n};\n\nconst permitsElementScrolling = (target: HTMLElement) => {\n const overflowY =\n target.ownerDocument.defaultView?.getComputedStyle(target).overflowY;\n return [\"auto\", \"scroll\", \"hidden\", \"overlay\"].includes(overflowY ?? \"\");\n};\n\nexport const resolveScrollTargets = (\n viewportRef: RefObject<HTMLElement | null> | undefined,\n explicitTarget: ScrollTargetInput | undefined,\n pageScrollFallback: PageScrollFallback = \"auto\"\n): ScrollTarget[] => {\n const explicit = scrollTargetValue(explicitTarget);\n if (explicitTarget !== undefined) return explicit ? [explicit] : [];\n\n const viewport = viewportRef?.current;\n if (!viewport) {\n return pageScrollFallback !== \"never\" && typeof document !== \"undefined\"\n ? [document]\n : [];\n }\n\n const localTargets: ScrollTarget[] = [\n viewport,\n viewport.parentElement,\n ].filter(\n (target): target is HTMLElement =>\n target !== null && permitsElementScrolling(target)\n );\n\n const shouldUsePageScroll =\n pageScrollFallback === \"always\" ||\n (pageScrollFallback === \"auto\" && !localTargets.some(hasScrollableContent));\n if (shouldUsePageScroll) localTargets.push(viewport.ownerDocument);\n\n return localTargets;\n};\n\nexport const resolveScrollTarget = (\n viewportRef: RefObject<HTMLElement | null> | undefined,\n explicitTarget: ScrollTargetInput | undefined\n): ScrollTarget | null =>\n resolveScrollTargets(viewportRef, explicitTarget, \"auto\")[0] ?? null;\n\nconst resolveObservedContent = (\n viewportRef: RefObject<HTMLElement | null>,\n contentRef: RefObject<HTMLElement | null> | undefined\n) => {\n if (contentRef?.current) return contentRef.current;\n return viewportRef.current;\n};\n\nconst sameTargets = (left: ScrollTarget[], right: ScrollTarget[]) =>\n left.length === right.length &&\n left.every((target, index) => target === right[index]);\n\nconst getScrollPositions = (targets: ScrollTarget[]) =>\n new Map(\n targets.map((target) => [target, getScrollMetrics(target).scrollTop])\n );\n\nconst getScrollEventTarget = (target: ScrollTarget): EventTarget =>\n isDocument(target) ? target.defaultView || target : target;\n\nconst scrollTargetTo = (target: ScrollTarget, options: ScrollToOptions) => {\n if (isDocument(target)) getDocumentScroller(target)?.scrollTo(options);\n else target.scrollTo(options);\n};\n\nconst isScrollInput = (event: Event) => {\n if (event.defaultPrevented) return false;\n if (event.type === \"wheel\") return (event as WheelEvent).deltaY !== 0;\n if (event.type === \"pointerdown\")\n return !((event as PointerEvent).button > 0);\n if (event.type !== \"keydown\") return true;\n const key = event as KeyboardEvent;\n if (key.ctrlKey || key.metaKey || key.altKey) return false;\n if (\n ![\n \"ArrowUp\",\n \"ArrowDown\",\n \"PageUp\",\n \"PageDown\",\n \"Home\",\n \"End\",\n \" \",\n ].includes(key.key)\n )\n return false;\n const element = event.target as Element | null;\n if (\n element?.closest?.(\n 'input, textarea, select, [contenteditable]:not([contenteditable=\"false\"]), [role=\"textbox\"]'\n )\n )\n return false;\n return (\n key.key !== \" \" || !element?.closest?.('button, a[href], [role=\"button\"]')\n );\n};\n\nexport function useScrollToBottom(\n viewportRef: RefObject<HTMLElement | null>,\n options?: UseScrollToBottomOptions\n): UseScrollToBottomReturn;\nexport function useScrollToBottom(\n viewportRef: RefObject<HTMLElement | null>,\n dependencies?: readonly unknown[],\n options?: LegacyUseScrollToBottomOptions\n): UseScrollToBottomReturn;\nexport function useScrollToBottom(\n viewportRef: RefObject<HTMLElement | null>,\n optionsOrDependencies?: UseScrollToBottomOptions | readonly unknown[],\n legacyOptions?: LegacyUseScrollToBottomOptions\n): UseScrollToBottomReturn {\n const committedDependencies = useRef<readonly unknown[] | undefined>(\n undefined\n );\n const dependencies = Array.isArray(optionsOrDependencies)\n ? optionsOrDependencies\n : undefined;\n const previousDependencies = committedDependencies.current;\n const stableDependencies = dependencies\n ? previousDependencies?.length === dependencies.length &&\n dependencies.every((value, index) =>\n Object.is(value, previousDependencies[index])\n )\n ? previousDependencies\n : [...dependencies]\n : undefined;\n // Commit a snapshot so unrelated renders preserve legacy dependency values,\n // including NaN and object identity, without leaking an abandoned render.\n useEffect(() => {\n committedDependencies.current = stableDependencies;\n }, [stableDependencies]);\n const isLegacyCall =\n Array.isArray(optionsOrDependencies) ||\n (optionsOrDependencies === undefined && legacyOptions !== undefined);\n const options: UseScrollToBottomOptions = isLegacyCall\n ? {\n autoScrollOnInit: true,\n scrollThreshold: 10,\n ...legacyOptions,\n contentVersion: stableDependencies ?? legacyOptions?.contentVersion,\n }\n : ((optionsOrDependencies as UseScrollToBottomOptions | undefined) ?? {});\n const {\n contentRef,\n endRef,\n scrollTarget,\n pageScrollFallback = \"auto\",\n scrollThreshold = 150,\n contentVersion,\n followNewContent: followNewContentOption = true,\n autoScrollOnInit = false,\n behavior = \"smooth\",\n } = options;\n const [showScrollToBottom, setShowScrollToBottom] = useState(false);\n const [isAtBottom, setIsAtBottom] = useState(true);\n const [isFollowing, setIsFollowing] = useState(followNewContentOption);\n const [bindingRevision, setBindingRevision] = useState(0);\n const followingRef = useRef(followNewContentOption);\n const followingPositionsRef = useRef<Map<ScrollTarget, number> | null>(null);\n const followEnabledRef = useRef(followNewContentOption);\n const initializedRef = useRef(false);\n const boundTargetsRef = useRef<ScrollTarget[]>([]);\n const boundViewportRef = useRef<HTMLElement | null>(null);\n const boundContentRef = useRef<HTMLElement | null>(null);\n const programmaticScrollRef = useRef(false);\n const programmaticTargetsRef = useRef<ScrollTarget[]>([]);\n const interruptedPositionsRef = useRef<Map<ScrollTarget, number> | null>(\n null\n );\n const eventFrameRef = useRef<number | null>(null);\n const contentFrameRef = useRef<number | null>(null);\n const programmaticFrameRef = useRef<{\n view: Window;\n id: number;\n } | null>(null);\n const settleTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const setFollowing = useCallback((next: boolean) => {\n followingRef.current = next;\n setIsFollowing((current) => (current === next ? current : next));\n }, []);\n\n const clearSettleTimer = useCallback(() => {\n if (settleTimerRef.current !== null) {\n clearTimeout(settleTimerRef.current);\n settleTimerRef.current = null;\n }\n }, []);\n\n const clearProgrammaticFrame = useCallback(() => {\n if (programmaticFrameRef.current) {\n programmaticFrameRef.current.view.cancelAnimationFrame(\n programmaticFrameRef.current.id\n );\n programmaticFrameRef.current = null;\n }\n }, []);\n\n const finishProgrammaticScroll = useCallback(() => {\n programmaticScrollRef.current = false;\n clearSettleTimer();\n }, [clearSettleTimer]);\n\n const targetInputsRef = useRef({\n viewportRef,\n scrollTarget,\n pageScrollFallback,\n });\n // Read the latest committed inputs without replaying effects for equivalent\n // inline resolver functions. Abandoned renders must not change live targets.\n useCommittedLayoutEffect(() => {\n targetInputsRef.current = { viewportRef, scrollTarget, pageScrollFallback };\n });\n const getResolvedTargets = useCallback(() => {\n const inputs = targetInputsRef.current;\n return resolveScrollTargets(\n inputs.viewportRef,\n inputs.scrollTarget,\n inputs.pageScrollFallback\n );\n }, []);\n\n const applyPresentation = useCallback(\n (targets: ScrollTarget[]) => {\n if (\n programmaticScrollRef.current &&\n !sameTargets(targets, programmaticTargetsRef.current)\n ) {\n clearProgrammaticFrame();\n finishProgrammaticScroll();\n }\n if (\n interruptedPositionsRef.current &&\n !sameTargets(targets, [...interruptedPositionsRef.current.keys()])\n ) {\n interruptedPositionsRef.current = null;\n }\n const presentation = getCombinedScrollPresentation(\n targets.map(getScrollMetrics),\n scrollThreshold\n );\n setIsAtBottom(presentation.isAtBottom);\n\n if (programmaticScrollRef.current) {\n setShowScrollToBottom(\n presentation.isAtBottom ? presentation.showScrollToBottom : false\n );\n // The visibility threshold is not the native animation's destination.\n if (presentation.distanceFromBottom <= 1) {\n finishProgrammaticScroll();\n setFollowing(followEnabledRef.current);\n followingPositionsRef.current = followEnabledRef.current\n ? getScrollPositions(targets)\n : null;\n }\n return presentation;\n }\n\n setShowScrollToBottom(presentation.showScrollToBottom);\n const followingPositions = followingPositionsRef.current;\n // A queued native event can arrive after content grows but before its\n // observer runs. Unchanged positions are not a request to stop following.\n const stayedAtFollowingPosition =\n followingRef.current &&\n followingPositions !== null &&\n sameTargets(targets, [...followingPositions.keys()]) &&\n targets.every(\n (target) =>\n getScrollMetrics(target).scrollTop ===\n followingPositions.get(target)\n );\n const nextFollowing =\n !interruptedPositionsRef.current &&\n (presentation.isAtBottom || stayedAtFollowingPosition) &&\n followEnabledRef.current;\n followingPositionsRef.current = nextFollowing\n ? getScrollPositions(targets)\n : null;\n setFollowing(nextFollowing);\n return presentation;\n },\n [\n clearProgrammaticFrame,\n finishProgrammaticScroll,\n scrollThreshold,\n setFollowing,\n ]\n );\n\n const refresh = useCallback(() => {\n applyPresentation(getResolvedTargets());\n }, [applyPresentation, getResolvedTargets]);\n\n const scrollToBottom = useCallback(\n (requestedBehavior: ScrollBehavior = behavior) => {\n const targets = getResolvedTargets();\n if (targets.length === 0) return;\n\n const view = getTargetWindow(targets[0]);\n const prefersReducedMotion =\n view?.matchMedia?.(\"(prefers-reduced-motion: reduce)\").matches ?? false;\n const actualBehavior = resolveScrollBehavior(\n requestedBehavior,\n prefersReducedMotion\n );\n // Native \"auto\" can inherit CSS smooth scrolling; our auto path must finish immediately.\n const nativeBehavior =\n actualBehavior === \"auto\" ? \"instant\" : actualBehavior;\n\n interruptedPositionsRef.current = null;\n followingPositionsRef.current = null;\n programmaticScrollRef.current = true;\n programmaticTargetsRef.current = targets;\n setFollowing(followEnabledRef.current);\n setShowScrollToBottom(false);\n clearProgrammaticFrame();\n clearSettleTimer();\n\n if (endRef?.current) {\n endRef.current.scrollIntoView({\n behavior: nativeBehavior,\n block: \"end\",\n });\n } else {\n targets.forEach((target) => {\n const top = getScrollMetrics(target).scrollHeight;\n scrollTargetTo(target, { top, behavior: nativeBehavior });\n });\n }\n\n if (actualBehavior === \"auto\") {\n // Immediate native scrolling has already reached its destination;\n // retain that position if content grows before the completion frame.\n if (\n followEnabledRef.current &&\n getCombinedScrollPresentation(\n targets.map(getScrollMetrics),\n scrollThreshold\n ).isAtBottom\n ) {\n followingPositionsRef.current = getScrollPositions(targets);\n }\n if (view) {\n const id = view.requestAnimationFrame(() => {\n programmaticFrameRef.current = null;\n finishProgrammaticScroll();\n refresh();\n });\n programmaticFrameRef.current = { view, id };\n } else {\n finishProgrammaticScroll();\n refresh();\n }\n return;\n }\n\n settleTimerRef.current = setTimeout(() => {\n finishProgrammaticScroll();\n refresh();\n }, 1200);\n },\n [\n behavior,\n clearProgrammaticFrame,\n clearSettleTimer,\n endRef,\n finishProgrammaticScroll,\n getResolvedTargets,\n refresh,\n scrollThreshold,\n setFollowing,\n ]\n );\n\n const ensureTargetBinding = useCallback(() => {\n const nextTargets = getResolvedTargets();\n const nextViewport = viewportRef.current;\n const nextContent = resolveObservedContent(viewportRef, contentRef);\n if (\n sameTargets(nextTargets, boundTargetsRef.current) &&\n nextViewport === boundViewportRef.current &&\n nextContent === boundContentRef.current\n )\n return false;\n // Reconcile before any queued layout frame can follow the replacement.\n if (!sameTargets(nextTargets, boundTargetsRef.current)) {\n applyPresentation(nextTargets);\n }\n boundTargetsRef.current = nextTargets;\n boundViewportRef.current = nextViewport;\n boundContentRef.current = nextContent;\n setBindingRevision((current) => current + 1);\n return true;\n }, [applyPresentation, contentRef, getResolvedTargets, viewportRef]);\n\n useEffect(() => {\n const targets = getResolvedTargets();\n const targetWindow = targets[0]\n ? getTargetWindow(targets[0])\n : (viewportRef.current?.ownerDocument.defaultView ?? null);\n if (targets.length === 0 && !targetWindow) return;\n\n boundTargetsRef.current = targets;\n boundViewportRef.current = viewportRef.current;\n boundContentRef.current = resolveObservedContent(viewportRef, contentRef);\n const eventTargets = new Set(targets.map(getScrollEventTarget));\n const targetWindows = new Set(\n [...targets.map(getTargetWindow), targetWindow].filter(\n (view): view is Window => view !== null\n )\n );\n const visualViewports = new Set(\n Array.from(targetWindows)\n .map((view) => view.visualViewport)\n .filter((viewport): viewport is VisualViewport => Boolean(viewport))\n );\n\n const scheduleEvent = (callback: () => void) => {\n if (eventFrameRef.current !== null && targetWindow) {\n targetWindow.cancelAnimationFrame(eventFrameRef.current);\n }\n if (!targetWindow) {\n callback();\n return;\n }\n eventFrameRef.current = targetWindow.requestAnimationFrame(() => {\n eventFrameRef.current = null;\n callback();\n });\n };\n\n const lastPositions = new Map(\n targets.map((target) => [target, getScrollMetrics(target).scrollTop])\n );\n const interruptProgrammaticScroll = () => {\n if (!programmaticScrollRef.current) return;\n interruptedPositionsRef.current = new Map(\n targets.map((target) => [target, getScrollMetrics(target).scrollTop])\n );\n clearProgrammaticFrame();\n finishProgrammaticScroll();\n setFollowing(false);\n targets.forEach((target) => {\n // Stop the native animation as well as the library's completion work.\n scrollTargetTo(target, {\n top: getScrollMetrics(target).scrollTop,\n behavior: \"instant\",\n });\n });\n refresh();\n };\n const handleInput = (event: Event) => {\n if (isScrollInput(event)) interruptProgrammaticScroll();\n };\n const handleScroll = () => {\n const interruptedPositions = interruptedPositionsRef.current;\n // Cancellation itself can queue an unchanged scroll event. Only new\n // positions can release the input pause; layout refreshes cannot.\n if (\n interruptedPositions &&\n targets.some(\n (target) =>\n getScrollMetrics(target).scrollTop !==\n interruptedPositions.get(target)\n )\n ) {\n interruptedPositionsRef.current = null;\n }\n let movedAway = false;\n targets.forEach((target) => {\n const top = getScrollMetrics(target).scrollTop;\n if (top < (lastPositions.get(target) ?? top) - 1) movedAway = true;\n lastPositions.set(target, top);\n });\n // Scrollbar dragging may not emit a content pointer event in every browser.\n if (movedAway) interruptProgrammaticScroll();\n // Record user intent before an observer or content frame can follow growth.\n refresh();\n };\n\n const handleLayoutChange = () => {\n scheduleEvent(() => {\n ensureTargetBinding();\n if (initializedRef.current && followingRef.current) {\n scrollToBottom(\"auto\");\n } else {\n refresh();\n }\n });\n };\n\n const inputEvents = [\"wheel\", \"touchstart\", \"pointerdown\", \"keydown\"];\n eventTargets.forEach((eventTarget) => {\n eventTarget.addEventListener(\"scroll\", handleScroll, { passive: true });\n inputEvents.forEach((type) =>\n eventTarget.addEventListener(type, handleInput, {\n passive: true,\n capture: true,\n })\n );\n });\n targetWindows.forEach((view) =>\n view.addEventListener(\"resize\", handleLayoutChange)\n );\n visualViewports.forEach((viewport) =>\n viewport.addEventListener(\"resize\", handleLayoutChange)\n );\n\n const observerWindow = targetWindow as (Window & typeof globalThis) | null;\n const ResizeObserverConstructor = observerWindow?.ResizeObserver;\n const resizeObserver = ResizeObserverConstructor\n ? new ResizeObserverConstructor(handleLayoutChange)\n : null;\n const observeResizeTargets = () => {\n resizeObserver?.disconnect();\n const elements = new Set<Element>();\n if (viewportRef.current) elements.add(viewportRef.current);\n const observedContent = resolveObservedContent(viewportRef, contentRef);\n if (observedContent) elements.add(observedContent);\n // A fixed-height viewport does not resize when a later message or image\n // grows. Without a content wrapper, every direct child is a resize root.\n if (!contentRef?.current && viewportRef.current) {\n Array.from(viewportRef.current.children).forEach((element) =>\n elements.add(element)\n );\n }\n targets.forEach((target) => {\n if (!isWindow(target) && !isDocument(target)) elements.add(target);\n });\n elements.forEach((element) => resizeObserver?.observe(element));\n };\n observeResizeTargets();\n\n const MutationObserverConstructor = observerWindow?.MutationObserver;\n const mutationObserver = MutationObserverConstructor\n ? new MutationObserverConstructor(() => {\n observeResizeTargets();\n handleLayoutChange();\n })\n : null;\n if (viewportRef.current) {\n mutationObserver?.observe(viewportRef.current, {\n childList: true,\n characterData: true,\n subtree: true,\n });\n }\n\n refresh();\n return () => {\n eventTargets.forEach((eventTarget) => {\n eventTarget.removeEventListener(\"scroll\", handleScroll);\n inputEvents.forEach((type) =>\n eventTarget.removeEventListener(type, handleInput, true)\n );\n });\n targetWindows.forEach((view) =>\n view.removeEventListener(\"resize\", handleLayoutChange)\n );\n visualViewports.forEach((viewport) =>\n viewport.removeEventListener(\"resize\", handleLayoutChange)\n );\n resizeObserver?.disconnect();\n mutationObserver?.disconnect();\n if (eventFrameRef.current !== null && targetWindow) {\n targetWindow.cancelAnimationFrame(eventFrameRef.current);\n eventFrameRef.current = null;\n }\n if (sameTargets(boundTargetsRef.current, targets)) {\n boundTargetsRef.current = [];\n }\n };\n }, [\n applyPresentation,\n bindingRevision,\n clearProgrammaticFrame,\n contentRef,\n ensureTargetBinding,\n finishProgrammaticScroll,\n getResolvedTargets,\n refresh,\n scrollToBottom,\n setFollowing,\n viewportRef,\n ]);\n\n // Ref objects are stable even when a host replaces their nodes during commit.\n useEffect(() => {\n ensureTargetBinding();\n });\n\n useEffect(() => {\n const targets = getResolvedTargets();\n const targetWindow = targets[0] ? getTargetWindow(targets[0]) : null;\n ensureTargetBinding();\n // An explicit ref may mount later; defer initialization until it resolves.\n if (targets.length === 0) return;\n const shouldAutoScrollOnInit = !initializedRef.current && autoScrollOnInit;\n\n if (!initializedRef.current) {\n initializedRef.current = true;\n if (!autoScrollOnInit) {\n refresh();\n return;\n }\n }\n\n if (contentFrameRef.current !== null && targetWindow) {\n targetWindow.cancelAnimationFrame(contentFrameRef.current);\n }\n if (!targetWindow) {\n if (followingRef.current) scrollToBottom(\"auto\");\n else refresh();\n return;\n }\n\n contentFrameRef.current = targetWindow.requestAnimationFrame(() => {\n contentFrameRef.current = null;\n if (followingRef.current || shouldAutoScrollOnInit) {\n scrollToBottom(\"auto\");\n } else refresh();\n });\n\n return () => {\n if (contentFrameRef.current !== null) {\n targetWindow.cancelAnimationFrame(contentFrameRef.current);\n contentFrameRef.current = null;\n }\n };\n }, [\n autoScrollOnInit,\n bindingRevision,\n contentVersion,\n ensureTargetBinding,\n getResolvedTargets,\n refresh,\n scrollToBottom,\n ]);\n\n useEffect(() => {\n followEnabledRef.current = followNewContentOption;\n if (!followNewContentOption) {\n setFollowing(false);\n return;\n }\n refresh();\n }, [followNewContentOption, refresh, setFollowing]);\n\n useEffect(\n () => () => {\n clearProgrammaticFrame();\n finishProgrammaticScroll();\n },\n [clearProgrammaticFrame, finishProgrammaticScroll]\n );\n\n const handleUserScrollToBottom = useCallback(() => {\n scrollToBottom();\n }, [scrollToBottom]);\n\n return {\n showScrollToBottom,\n isAtBottom,\n followNewContent: isFollowing,\n scrollToBottom,\n handleUserScrollToBottom,\n refresh,\n };\n}\n\nexport default useScrollToBottom;\n"],"names":["useCommittedLayoutEffect","useEffect","useLayoutEffect","isWindow","target","isDocument","getDocumentScroller","document","getTargetWindow","getScrollMetrics","scroller","viewportHeight","getScrollPresentation","metrics","threshold","normalizedThreshold","isScrollable","distanceFromBottom","isAtBottom","getCombinedScrollPresentation","presentations","item","resolveScrollBehavior","requestedBehavior","prefersReducedMotion","scrollTargetValue","hasScrollableContent","scrollHeight","clientHeight","permitsElementScrolling","overflowY","resolveScrollTargets","viewportRef","explicitTarget","pageScrollFallback","explicit","viewport","localTargets","resolveObservedContent","contentRef","sameTargets","left","right","index","getScrollPositions","targets","getScrollEventTarget","scrollTargetTo","options","isScrollInput","event","key","element","useScrollToBottom","optionsOrDependencies","legacyOptions","committedDependencies","useRef","dependencies","previousDependencies","stableDependencies","value","endRef","scrollTarget","scrollThreshold","contentVersion","followNewContentOption","autoScrollOnInit","behavior","showScrollToBottom","setShowScrollToBottom","useState","setIsAtBottom","isFollowing","setIsFollowing","bindingRevision","setBindingRevision","followingRef","followingPositionsRef","followEnabledRef","initializedRef","boundTargetsRef","boundViewportRef","boundContentRef","programmaticScrollRef","programmaticTargetsRef","interruptedPositionsRef","eventFrameRef","contentFrameRef","programmaticFrameRef","settleTimerRef","setFollowing","useCallback","next","current","clearSettleTimer","clearProgrammaticFrame","finishProgrammaticScroll","targetInputsRef","getResolvedTargets","inputs","applyPresentation","presentation","followingPositions","stayedAtFollowingPosition","nextFollowing","refresh","scrollToBottom","view","actualBehavior","nativeBehavior","top","id","ensureTargetBinding","nextTargets","nextViewport","nextContent","targetWindow","eventTargets","targetWindows","visualViewports","scheduleEvent","callback","lastPositions","interruptProgrammaticScroll","handleInput","handleScroll","interruptedPositions","movedAway","handleLayoutChange","inputEvents","eventTarget","type","observerWindow","ResizeObserverConstructor","resizeObserver","observeResizeTargets","elements","observedContent","MutationObserverConstructor","mutationObserver","shouldAutoScrollOnInit","handleUserScrollToBottom"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useScrollToBottom.es.js","sources":["../../../src/components/MarkdownFlow/useScrollToBottom.ts"],"sourcesContent":["import {\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n type RefObject,\n} from \"react\";\n\nconst useCommittedLayoutEffect =\n typeof window === \"undefined\" ? useEffect : useLayoutEffect;\n\nexport type ScrollBehavior = \"smooth\" | \"auto\";\nexport type PageScrollFallback = \"auto\" | \"always\" | \"never\";\nexport type ScrollTarget = HTMLElement | Document | Window;\nexport type ScrollTargetRef = RefObject<ScrollTarget | null>;\nexport type ScrollTargetResolver = () => ScrollTarget | null;\nexport type ScrollTargetInput =\n ScrollTarget | 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":";AASA,MAAMA,KACJ,OAAO,SAAW,MAAcC,IAAYC,IA2DxCC,IAAW,CAACC,MAChB,YAAYA,KAAUA,EAAO,WAAWA,GAEpCC,IAAa,CAACD,MAClB,cAAcA,KAAUA,EAAO,aAAa,GAExCE,KAAsB,CAACF,MAAkD;AAC7E,QAAMG,IAAWJ,EAASC,CAAM,IAAIA,EAAO,WAAWA;AACtD,SAAQG,EAAS,oBAAoBA,EAAS;AAChD,GAEMC,IAAkB,CAACJ,MACnBD,EAASC,CAAM,IAAUA,IACzBC,EAAWD,CAAM,IAAUA,EAAO,cAC/BA,EAAO,cAAc,aAGjBK,IAAmB,CAACL,MAAwC;AACvE,MAAID,EAASC,CAAM,KAAKC,EAAWD,CAAM,GAAG;AAC1C,UAAMM,IAAWJ,GAAoBF,CAAM,GACrCO,IAAiBR,EAASC,CAAM,IAClCA,EAAO,cACPM,GAAU,gBAAgB;AAC9B,WAAO;AAAA,MACL,WAAWA,GAAU,aAAa;AAAA,MAClC,cAAcA,GAAU,gBAAgB;AAAA,MACxC,cAAcC;AAAA,IAAA;AAAA,EAElB;AACA,SAAO;AAAA,IACL,WAAWP,EAAO;AAAA,IAClB,cAAcA,EAAO;AAAA,IACrB,cAAcA,EAAO;AAAA,EAAA;AAEzB,GAEaQ,KAAwB,CACnCC,GACAC,IAAY,QACW;AACvB,QAAMC,IAAsB,KAAK,IAAI,GAAGD,CAAS,GAC3CE,IAAeH,EAAQ,eAAeA,EAAQ,cAC9CI,IAAqB,KAAK;AAAA,IAC9B;AAAA,IACAJ,EAAQ,eAAeA,EAAQ,YAAYA,EAAQ;AAAA,EAAA,GAE/CK,IACJ,CAACF,KACDC,MAAuB,KACvBA,IAAqBF;AACvB,SAAO;AAAA,IACL,oBAAAE;AAAA,IACA,YAAAC;AAAA,IACA,cAAAF;AAAA,IACA,oBAAoBA,KAAgB,CAACE;AAAA,EAAA;AAEzC,GAEaC,KAAgC,CAC3CN,GACAC,IAAY,QACW;AACvB,QAAMM,IAAgBP,EAAQ;AAAA,IAAI,CAACQ,MACjCT,GAAsBS,GAAMP,CAAS;AAAA,EAAA;AAEvC,SAAO;AAAA,IACL,oBAAoB,KAAK;AAAA,MACvB;AAAA,MACA,GAAGM,EAAc,IAAI,CAACC,MAASA,EAAK,kBAAkB;AAAA,IAAA;AAAA,IAExD,YAAYD,EAAc,MAAM,CAACC,MAASA,EAAK,UAAU;AAAA,IACzD,cAAcD,EAAc,KAAK,CAACC,MAASA,EAAK,YAAY;AAAA,IAC5D,oBAAoBD,EAAc,KAAK,CAACC,MAASA,EAAK,kBAAkB;AAAA,EAAA;AAE5E,GAEaC,KAAwB,CACnCC,GACAC,MAEAD,MAAsB,YAAYC,IAC9B,SACAD,GAEAE,KAAoB,CACxBrB,MAEKA,IACD,OAAOA,KAAW,aAAmBA,EAAA,IAClC,aAAaA,IAASA,EAAO,UAAUA,IAF1B,MAKhBsB,KAAuB,CAACtB,MAAyB;AACrD,QAAM,EAAE,cAAAuB,GAAc,cAAAC,MAAiBnB,EAAiBL,CAAM;AAC9D,SAAOuB,IAAeC,IAAe;AACvC,GAEMC,KAA0B,CAACzB,MAAwB;AACvD,QAAM0B,IACJ1B,EAAO,cAAc,aAAa,iBAAiBA,CAAM,EAAE;AAC7D,SAAO,CAAC,QAAQ,UAAU,UAAU,SAAS,EAAE,SAAS0B,KAAa,EAAE;AACzE,GAEaC,KAAuB,CAClCC,GACAC,GACAC,IAAyC,WACtB;AACnB,QAAMC,IAAWV,GAAkBQ,CAAc;AACjD,MAAIA,MAAmB,OAAW,QAAOE,IAAW,CAACA,CAAQ,IAAI,CAAA;AAEjE,QAAMC,IAAWJ,GAAa;AAC9B,MAAI,CAACI;AACH,WAAOF,MAAuB,WAAW,OAAO,WAAa,MACzD,CAAC,QAAQ,IACT,CAAA;AAGN,QAAMG,IAA+B;AAAA,IACnCD;AAAA,IACAA,EAAS;AAAA,EAAA,EACT;AAAA,IACA,CAAChC,MACCA,MAAW,QAAQyB,GAAwBzB,CAAM;AAAA,EAAA;AAMrD,UAFE8B,MAAuB,YACtBA,MAAuB,UAAU,CAACG,EAAa,KAAKX,EAAoB,MAClDW,EAAa,KAAKD,EAAS,aAAa,GAE1DC;AACT,GAQMC,KAAyB,CAC7BN,GACAO,MAEIA,GAAY,UAAgBA,EAAW,UACpCP,EAAY,SAGfQ,IAAc,CAACC,GAAsBC,MACzCD,EAAK,WAAWC,EAAM,UACtBD,EAAK,MAAM,CAACrC,GAAQuC,MAAUvC,MAAWsC,EAAMC,CAAK,CAAC,GAEjDC,KAAqB,CAACC,MAC1B,IAAI;AAAA,EACFA,EAAQ,IAAI,CAACzC,MAAW,CAACA,GAAQK,EAAiBL,CAAM,EAAE,SAAS,CAAC;AACtE,GAEI0C,KAAuB,CAAC1C,MAC5BC,EAAWD,CAAM,KAAIA,EAAO,eAAeA,GAEvC2C,KAAiB,CAAC3C,GAAsB4C,MAA6B;AACzE,EAAI3C,EAAWD,CAAM,OAAuBA,CAAM,GAAG,SAAS4C,CAAO,IAChE5C,EAAO,SAAS4C,CAAO;AAC9B,GAEMC,KAAgB,CAACC,MAAiB;AACtC,MAAIA,EAAM,iBAAkB,QAAO;AACnC,MAAIA,EAAM,SAAS,QAAS,QAAQA,EAAqB,WAAW;AACpE,MAAIA,EAAM,SAAS;AACjB,WAAO,EAAGA,EAAuB,SAAS;AAC5C,MAAIA,EAAM,SAAS,UAAW,QAAO;AACrC,QAAMC,IAAMD;AAEZ,MADIC,EAAI,WAAWA,EAAI,WAAWA,EAAI,UAEpC,CAAC;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,EACA,SAASA,EAAI,GAAG;AAElB,WAAO;AACT,QAAMC,IAAUF,EAAM;AACtB,SACEE,GAAS;AAAA,IACP;AAAA,EAAA,IAGK,KAEPD,EAAI,QAAQ,OAAO,CAACC,GAAS,UAAU,kCAAkC;AAE7E;AAWO,SAASC,GACdrB,GACAsB,GACAC,GACyB;AACzB,QAAMC,IAAwBC;AAAA,IAC5B;AAAA,EAAA,GAEIC,IAAe,MAAM,QAAQJ,CAAqB,IACpDA,IACA,QACEK,IAAuBH,EAAsB,SAC7CI,IAAqBF,IACvBC,GAAsB,WAAWD,EAAa,UAC9CA,EAAa;AAAA,IAAM,CAACG,GAAOlB,MACzB,OAAO,GAAGkB,GAAOF,EAAqBhB,CAAK,CAAC;AAAA,EAAA,IAE5CgB,IACA,CAAC,GAAGD,CAAY,IAClB;AAGJ,EAAAzD,EAAU,MAAM;AACd,IAAAuD,EAAsB,UAAUI;AAAA,EAClC,GAAG,CAACA,CAAkB,CAAC;AAIvB,QAAMZ,KAFJ,MAAM,QAAQM,CAAqB,KAClCA,MAA0B,UAAaC,MAAkB,SAExD;AAAA,IACE,kBAAkB;AAAA,IAClB,iBAAiB;AAAA,IACjB,GAAGA;AAAA,IACH,gBAAgBK,KAAsBL,GAAe;AAAA,EAAA,IAErDD,KAAkE,CAAA,GAClE;AAAA,IACJ,YAAAf;AAAA,IACA,QAAAuB;AAAA,IACA,cAAAC;AAAA,IACA,oBAAA7B,KAAqB;AAAA,IACrB,iBAAA8B,IAAkB;AAAA,IAClB,gBAAAC;AAAA,IACA,kBAAkBC,IAAyB;AAAA,IAC3C,kBAAAC,IAAmB;AAAA,IACnB,UAAAC,KAAW;AAAA,EAAA,IACTpB,IACE,CAACqB,IAAoBC,EAAqB,IAAIC,EAAS,EAAK,GAC5D,CAACrD,IAAYsD,EAAa,IAAID,EAAS,EAAI,GAC3C,CAACE,IAAaC,EAAc,IAAIH,EAASL,CAAsB,GAC/D,CAACS,IAAiBC,EAAkB,IAAIL,EAAS,CAAC,GAClDM,IAAepB,EAAOS,CAAsB,GAC5CY,IAAwBrB,EAAyC,IAAI,GACrEsB,IAAmBtB,EAAOS,CAAsB,GAChDc,IAAiBvB,EAAO,EAAK,GAC7BwB,IAAkBxB,EAAuB,EAAE,GAC3CyB,KAAmBzB,EAA2B,IAAI,GAClD0B,KAAkB1B,EAA2B,IAAI,GACjD2B,IAAwB3B,EAAO,EAAK,GACpC4B,KAAyB5B,EAAuB,EAAE,GAClD6B,IAA0B7B;AAAA,IAC9B;AAAA,EAAA,GAEI8B,IAAgB9B,EAAsB,IAAI,GAC1C+B,IAAkB/B,EAAsB,IAAI,GAC5CgC,IAAuBhC,EAGnB,IAAI,GACRiC,IAAiBjC,EAA6C,IAAI,GAElEkC,IAAeC,EAAY,CAACC,MAAkB;AAClD,IAAAhB,EAAa,UAAUgB,GACvBnB,GAAe,CAACoB,MAAaA,MAAYD,IAAOC,IAAUD,CAAK;AAAA,EACjE,GAAG,CAAA,CAAE,GAECE,IAAmBH,EAAY,MAAM;AACzC,IAAIF,EAAe,YAAY,SAC7B,aAAaA,EAAe,OAAO,GACnCA,EAAe,UAAU;AAAA,EAE7B,GAAG,CAAA,CAAE,GAECM,IAAyBJ,EAAY,MAAM;AAC/C,IAAIH,EAAqB,YACvBA,EAAqB,QAAQ,KAAK;AAAA,MAChCA,EAAqB,QAAQ;AAAA,IAAA,GAE/BA,EAAqB,UAAU;AAAA,EAEnC,GAAG,CAAA,CAAE,GAECQ,IAA2BL,EAAY,MAAM;AACjD,IAAAR,EAAsB,UAAU,IAChCW,EAAA;AAAA,EACF,GAAG,CAACA,CAAgB,CAAC,GAEfG,KAAkBzC,EAAO;AAAA,IAC7B,aAAAzB;AAAA,IACA,cAAA+B;AAAA,IACA,oBAAA7B;AAAA,EAAA,CACD;AAGD,EAAAlC,GAAyB,MAAM;AAC7B,IAAAkG,GAAgB,UAAU,EAAE,aAAAlE,GAAa,cAAA+B,IAAc,oBAAA7B,GAAA;AAAA,EACzD,CAAC;AACD,QAAMiE,IAAqBP,EAAY,MAAM;AAC3C,UAAMQ,IAASF,GAAgB;AAC/B,WAAOnE;AAAA,MACLqE,EAAO;AAAA,MACPA,EAAO;AAAA,MACPA,EAAO;AAAA,IAAA;AAAA,EAEX,GAAG,CAAA,CAAE,GAECC,IAAoBT;AAAA,IACxB,CAAC/C,MAA4B;AAC3B,MACEuC,EAAsB,WACtB,CAAC5C,EAAYK,GAASwC,GAAuB,OAAO,MAEpDW,EAAA,GACAC,EAAA,IAGAX,EAAwB,WACxB,CAAC9C,EAAYK,GAAS,CAAC,GAAGyC,EAAwB,QAAQ,KAAA,CAAM,CAAC,MAEjEA,EAAwB,UAAU;AAEpC,YAAMgB,IAAenF;AAAA,QACnB0B,EAAQ,IAAIpC,CAAgB;AAAA,QAC5BuD;AAAA,MAAA;AAIF,UAFAQ,GAAc8B,EAAa,UAAU,GAEjClB,EAAsB;AACxB,eAAAd;AAAA,UACEgC,EAAa,aAAaA,EAAa,qBAAqB;AAAA,QAAA,GAG1DA,EAAa,sBAAsB,MACrCL,EAAA,GACAN,EAAaZ,EAAiB,OAAO,GACrCD,EAAsB,UAAUC,EAAiB,UAC7CnC,GAAmBC,CAAO,IAC1B,OAECyD;AAGT,MAAAhC,GAAsBgC,EAAa,kBAAkB;AACrD,YAAMC,IAAqBzB,EAAsB,SAG3C0B,IACJ3B,EAAa,WACb0B,MAAuB,QACvB/D,EAAYK,GAAS,CAAC,GAAG0D,EAAmB,KAAA,CAAM,CAAC,KACnD1D,EAAQ;AAAA,QACN,CAACzC,MACCK,EAAiBL,CAAM,EAAE,cACzBmG,EAAmB,IAAInG,CAAM;AAAA,MAAA,GAE7BqG,IACJ,CAACnB,EAAwB,YACxBgB,EAAa,cAAcE,MAC5BzB,EAAiB;AACnB,aAAAD,EAAsB,UAAU2B,IAC5B7D,GAAmBC,CAAO,IAC1B,MACJ8C,EAAac,CAAa,GACnBH;AAAA,IACT;AAAA,IACA;AAAA,MACEN;AAAA,MACAC;AAAA,MACAjC;AAAA,MACA2B;AAAA,IAAA;AAAA,EACF,GAGIe,IAAUd,EAAY,MAAM;AAChC,IAAAS,EAAkBF,GAAoB;AAAA,EACxC,GAAG,CAACE,GAAmBF,CAAkB,CAAC,GAEpCQ,IAAiBf;AAAA,IACrB,CAACrE,IAAoC6C,OAAa;AAChD,YAAMvB,IAAUsD,EAAA;AAChB,UAAItD,EAAQ,WAAW,EAAG;AAE1B,YAAM+D,IAAOpG,EAAgBqC,EAAQ,CAAC,CAAC,GACjCrB,IACJoF,GAAM,aAAa,kCAAkC,EAAE,WAAW,IAC9DC,IAAiBvF;AAAA,QACrBC;AAAA,QACAC;AAAA,MAAA,GAGIsF,IACJD,MAAmB,SAAS,YAAYA;AAuB1C,UArBAvB,EAAwB,UAAU,MAClCR,EAAsB,UAAU,MAChCM,EAAsB,UAAU,IAChCC,GAAuB,UAAUxC,GACjC8C,EAAaZ,EAAiB,OAAO,GACrCT,GAAsB,EAAK,GAC3B0B,EAAA,GACAD,EAAA,GAEIjC,GAAQ,UACVA,EAAO,QAAQ,eAAe;AAAA,QAC5B,UAAUgD;AAAA,QACV,OAAO;AAAA,MAAA,CACR,IAEDjE,EAAQ,QAAQ,CAACzC,MAAW;AAC1B,cAAM2G,IAAMtG,EAAiBL,CAAM,EAAE;AACrC,QAAA2C,GAAe3C,GAAQ,EAAE,KAAA2G,GAAK,UAAUD,GAAgB;AAAA,MAC1D,CAAC,GAGCD,MAAmB,QAAQ;AAY7B,YARE9B,EAAiB,WACjB5D;AAAA,UACE0B,EAAQ,IAAIpC,CAAgB;AAAA,UAC5BuD;AAAA,QAAA,EACA,eAEFc,EAAsB,UAAUlC,GAAmBC,CAAO,IAExD+D,GAAM;AACR,gBAAMI,IAAKJ,EAAK,sBAAsB,MAAM;AAC1C,YAAAnB,EAAqB,UAAU,MAC/BQ,EAAA,GACAS,EAAA;AAAA,UACF,CAAC;AACD,UAAAjB,EAAqB,UAAU,EAAE,MAAAmB,GAAM,IAAAI,EAAA;AAAA,QACzC;AACE,UAAAf,EAAA,GACAS,EAAA;AAEF;AAAA,MACF;AAEA,MAAAhB,EAAe,UAAU,WAAW,MAAM;AACxC,QAAAO,EAAA,GACAS,EAAA;AAAA,MACF,GAAG,IAAI;AAAA,IACT;AAAA,IACA;AAAA,MACEtC;AAAA,MACA4B;AAAA,MACAD;AAAA,MACAjC;AAAA,MACAmC;AAAA,MACAE;AAAA,MACAO;AAAA,MACA1C;AAAA,MACA2B;AAAA,IAAA;AAAA,EACF,GAGIsB,IAAsBrB,EAAY,MAAM;AAC5C,UAAMsB,IAAcf,EAAA,GACdgB,IAAenF,EAAY,SAC3BoF,IAAc9E,GAAuBN,GAAaO,CAAU;AAClE,WACEC,EAAY0E,GAAajC,EAAgB,OAAO,KAChDkC,MAAiBjC,GAAiB,WAClCkC,MAAgBjC,GAAgB,UAEzB,MAEJ3C,EAAY0E,GAAajC,EAAgB,OAAO,KACnDoB,EAAkBa,CAAW,GAE/BjC,EAAgB,UAAUiC,GAC1BhC,GAAiB,UAAUiC,GAC3BhC,GAAgB,UAAUiC,GAC1BxC,GAAmB,CAACkB,MAAYA,IAAU,CAAC,GACpC;AAAA,EACT,GAAG,CAACO,GAAmB9D,GAAY4D,GAAoBnE,CAAW,CAAC;AAEnE,EAAA/B,EAAU,MAAM;AACd,UAAM4C,IAAUsD,EAAA,GACVkB,IAAexE,EAAQ,CAAC,IAC1BrC,EAAgBqC,EAAQ,CAAC,CAAC,IACzBb,EAAY,SAAS,cAAc,eAAe;AACvD,QAAIa,EAAQ,WAAW,KAAK,CAACwE,EAAc;AAE3C,IAAApC,EAAgB,UAAUpC,GAC1BqC,GAAiB,UAAUlD,EAAY,SACvCmD,GAAgB,UAAU7C,GAAuBN,GAAaO,CAAU;AACxE,UAAM+E,IAAe,IAAI,IAAIzE,EAAQ,IAAIC,EAAoB,CAAC,GACxDyE,IAAgB,IAAI;AAAA,MACxB,CAAC,GAAG1E,EAAQ,IAAIrC,CAAe,GAAG6G,CAAY,EAAE;AAAA,QAC9C,CAACT,MAAyBA,MAAS;AAAA,MAAA;AAAA,IACrC,GAEIY,IAAkB,IAAI;AAAA,MAC1B,MAAM,KAAKD,CAAa,EACrB,IAAI,CAACX,MAASA,EAAK,cAAc,EACjC,OAAO,CAACxE,MAAyC,EAAQA,CAAS;AAAA,IAAA,GAGjEqF,IAAgB,CAACC,MAAyB;AAI9C,UAHInC,EAAc,YAAY,QAAQ8B,KACpCA,EAAa,qBAAqB9B,EAAc,OAAO,GAErD,CAAC8B,GAAc;AACjB,QAAAK,EAAA;AACA;AAAA,MACF;AACA,MAAAnC,EAAc,UAAU8B,EAAa,sBAAsB,MAAM;AAC/D,QAAA9B,EAAc,UAAU,MACxBmC,EAAA;AAAA,MACF,CAAC;AAAA,IACH,GAEMC,IAAgB,IAAI;AAAA,MACxB9E,EAAQ,IAAI,CAACzC,MAAW,CAACA,GAAQK,EAAiBL,CAAM,EAAE,SAAS,CAAC;AAAA,IAAA,GAEhEwH,IAA8B,MAAM;AACxC,MAAKxC,EAAsB,YAC3BE,EAAwB,UAAU,IAAI;AAAA,QACpCzC,EAAQ,IAAI,CAACzC,MAAW,CAACA,GAAQK,EAAiBL,CAAM,EAAE,SAAS,CAAC;AAAA,MAAA,GAEtE4F,EAAA,GACAC,EAAA,GACAN,EAAa,EAAK,GAClB9C,EAAQ,QAAQ,CAACzC,MAAW;AAE1B,QAAA2C,GAAe3C,GAAQ;AAAA,UACrB,KAAKK,EAAiBL,CAAM,EAAE;AAAA,UAC9B,UAAU;AAAA,QAAA,CACX;AAAA,MACH,CAAC,GACDsG,EAAA;AAAA,IACF,GACMmB,KAAc,CAAC3E,MAAiB;AACpC,MAAID,GAAcC,CAAK,KAAG0E,EAAA;AAAA,IAC5B,GACME,KAAe,MAAM;AACzB,YAAMC,IAAuBzC,EAAwB;AAGrD,MACEyC,KACAlF,EAAQ;AAAA,QACN,CAACzC,MACCK,EAAiBL,CAAM,EAAE,cACzB2H,EAAqB,IAAI3H,CAAM;AAAA,MAAA,MAGnCkF,EAAwB,UAAU;AAEpC,UAAI0C,IAAY;AAChB,MAAAnF,EAAQ,QAAQ,CAACzC,MAAW;AAC1B,cAAM2G,KAAMtG,EAAiBL,CAAM,EAAE;AACrC,QAAI2G,MAAOY,EAAc,IAAIvH,CAAM,KAAK2G,MAAO,MAAGiB,IAAY,KAC9DL,EAAc,IAAIvH,GAAQ2G,EAAG;AAAA,MAC/B,CAAC,GAEGiB,KAAWJ,EAAA,GAEflB,EAAA;AAAA,IACF,GAEMuB,IAAqB,MAAM;AAC/B,MAAAR,EAAc,MAAM;AAClB,QAAAR,EAAA,GACIjC,EAAe,WAAWH,EAAa,UACzC8B,EAAe,MAAM,IAErBD,EAAA;AAAA,MAEJ,CAAC;AAAA,IACH,GAEMwB,KAAc,CAAC,SAAS,cAAc,eAAe,SAAS;AACpE,IAAAZ,EAAa,QAAQ,CAACa,MAAgB;AACpC,MAAAA,EAAY,iBAAiB,UAAUL,IAAc,EAAE,SAAS,IAAM,GACtEI,GAAY;AAAA,QAAQ,CAACE,MACnBD,EAAY,iBAAiBC,GAAMP,IAAa;AAAA,UAC9C,SAAS;AAAA,UACT,SAAS;AAAA,QAAA,CACV;AAAA,MAAA;AAAA,IAEL,CAAC,GACDN,EAAc;AAAA,MAAQ,CAACX,MACrBA,EAAK,iBAAiB,UAAUqB,CAAkB;AAAA,IAAA,GAEpDT,EAAgB;AAAA,MAAQ,CAACpF,MACvBA,EAAS,iBAAiB,UAAU6F,CAAkB;AAAA,IAAA;AAGxD,UAAMI,KAAiBhB,GACjBiB,KAA4BD,IAAgB,gBAC5CE,KAAiBD,KACnB,IAAIA,GAA0BL,CAAkB,IAChD,MACEO,KAAuB,MAAM;AACjC,MAAAD,IAAgB,WAAA;AAChB,YAAME,wBAAe,IAAA;AACrB,MAAIzG,EAAY,WAASyG,EAAS,IAAIzG,EAAY,OAAO;AACzD,YAAM0G,IAAkBpG,GAAuBN,GAAaO,CAAU;AACtE,MAAImG,KAAiBD,EAAS,IAAIC,CAAe,GAG7C,CAACnG,GAAY,WAAWP,EAAY,WACtC,MAAM,KAAKA,EAAY,QAAQ,QAAQ,EAAE;AAAA,QAAQ,CAACoB,MAChDqF,EAAS,IAAIrF,CAAO;AAAA,MAAA,GAGxBP,EAAQ,QAAQ,CAACzC,MAAW;AAC1B,QAAI,CAACD,EAASC,CAAM,KAAK,CAACC,EAAWD,CAAM,KAAGqI,EAAS,IAAIrI,CAAM;AAAA,MACnE,CAAC,GACDqI,EAAS,QAAQ,CAACrF,MAAYmF,IAAgB,QAAQnF,CAAO,CAAC;AAAA,IAChE;AACA,IAAAoF,GAAA;AAEA,UAAMG,KAA8BN,IAAgB,kBAC9CO,KAAmBD,KACrB,IAAIA,GAA4B,MAAM;AACpC,MAAAH,GAAA,GACAP,EAAA;AAAA,IACF,CAAC,IACD;AACJ,WAAIjG,EAAY,WACd4G,IAAkB,QAAQ5G,EAAY,SAAS;AAAA,MAC7C,WAAW;AAAA,MACX,eAAe;AAAA,MACf,SAAS;AAAA,IAAA,CACV,GAGH0E,EAAA,GACO,MAAM;AACX,MAAAY,EAAa,QAAQ,CAACa,MAAgB;AACpC,QAAAA,EAAY,oBAAoB,UAAUL,EAAY,GACtDI,GAAY;AAAA,UAAQ,CAACE,MACnBD,EAAY,oBAAoBC,GAAMP,IAAa,EAAI;AAAA,QAAA;AAAA,MAE3D,CAAC,GACDN,EAAc;AAAA,QAAQ,CAACX,MACrBA,EAAK,oBAAoB,UAAUqB,CAAkB;AAAA,MAAA,GAEvDT,EAAgB;AAAA,QAAQ,CAACpF,MACvBA,EAAS,oBAAoB,UAAU6F,CAAkB;AAAA,MAAA,GAE3DM,IAAgB,WAAA,GAChBK,IAAkB,WAAA,GACdrD,EAAc,YAAY,QAAQ8B,MACpCA,EAAa,qBAAqB9B,EAAc,OAAO,GACvDA,EAAc,UAAU,OAEtB/C,EAAYyC,EAAgB,SAASpC,CAAO,MAC9CoC,EAAgB,UAAU,CAAA;AAAA,IAE9B;AAAA,EACF,GAAG;AAAA,IACDoB;AAAA,IACA1B;AAAA,IACAqB;AAAA,IACAzD;AAAA,IACA0E;AAAA,IACAhB;AAAA,IACAE;AAAA,IACAO;AAAA,IACAC;AAAA,IACAhB;AAAA,IACA3D;AAAA,EAAA,CACD,GAGD/B,EAAU,MAAM;AACd,IAAAgH,EAAA;AAAA,EACF,CAAC,GAEDhH,EAAU,MAAM;AACd,UAAM4C,IAAUsD,EAAA,GACVkB,IAAexE,EAAQ,CAAC,IAAIrC,EAAgBqC,EAAQ,CAAC,CAAC,IAAI;AAGhE,QAFAoE,EAAA,GAEIpE,EAAQ,WAAW,EAAG;AAC1B,UAAMgG,IAAyB,CAAC7D,EAAe,WAAWb;AAE1D,QAAI,CAACa,EAAe,YAClBA,EAAe,UAAU,IACrB,CAACb,IAAkB;AACrB,MAAAuC,EAAA;AACA;AAAA,IACF;AAMF,QAHIlB,EAAgB,YAAY,QAAQ6B,KACtCA,EAAa,qBAAqB7B,EAAgB,OAAO,GAEvD,CAAC6B,GAAc;AACjB,MAAIxC,EAAa,UAAS8B,EAAe,MAAM,IAC1CD,EAAA;AACL;AAAA,IACF;AAEA,WAAAlB,EAAgB,UAAU6B,EAAa,sBAAsB,MAAM;AACjE,MAAA7B,EAAgB,UAAU,MACtBX,EAAa,WAAWgE,IAC1BlC,EAAe,MAAM,IAChBD,EAAA;AAAA,IACT,CAAC,GAEM,MAAM;AACX,MAAIlB,EAAgB,YAAY,SAC9B6B,EAAa,qBAAqB7B,EAAgB,OAAO,GACzDA,EAAgB,UAAU;AAAA,IAE9B;AAAA,EACF,GAAG;AAAA,IACDrB;AAAA,IACAQ;AAAA,IACAV;AAAA,IACAgD;AAAA,IACAd;AAAA,IACAO;AAAA,IACAC;AAAA,EAAA,CACD,GAED1G,EAAU,MAAM;AAEd,QADA8E,EAAiB,UAAUb,GACvB,CAACA,GAAwB;AAC3B,MAAAyB,EAAa,EAAK;AAClB;AAAA,IACF;AACA,IAAAe,EAAA;AAAA,EACF,GAAG,CAACxC,GAAwBwC,GAASf,CAAY,CAAC,GAElD1F;AAAA,IACE,MAAM,MAAM;AACV,MAAA+F,EAAA,GACAC,EAAA;AAAA,IACF;AAAA,IACA,CAACD,GAAwBC,CAAwB;AAAA,EAAA;AAGnD,QAAM6C,KAA2BlD,EAAY,MAAM;AACjD,IAAAe,EAAA;AAAA,EACF,GAAG,CAACA,CAAc,CAAC;AAEnB,SAAO;AAAA,IACL,oBAAAtC;AAAA,IACA,YAAAnD;AAAA,IACA,kBAAkBuD;AAAA,IAClB,gBAAAkC;AAAA,IACA,0BAAAmC;AAAA,IACA,SAAApC;AAAA,EAAA;AAEJ;"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const c=require("react/jsx-runtime"),r=require("react"),Je=require("../../node_modules/@uiw/react-codemirror/esm/index.cjs"),Xe=require("../../node_modules/@codemirror/autocomplete/dist/index.cjs"),Ie=require("../../node_modules/@codemirror/view/dist/index.cjs"),Ze=require("../../node_modules/@codemirror/lang-markdown/dist/index.cjs"),xe=require("../../node_modules/@codemirror/language/dist/index.cjs"),ee=require("../ui/tooltip.cjs"),Me=require("./components/CustomDialog.cjs"),et=require("./components/CustomPopover.cjs"),tt=require("./components/EditorToolbar.cjs"),nt=require("./components/VariableSearchDropdown.cjs"),rt=require("./editor-context.cjs"),ot=require("./components/ImageInject.cjs"),lt=require("./components/VideoInject.cjs"),at=require("./components/VariableSelect.cjs"),h=require("./types.cjs");;/* empty css */const U=require("./utils.cjs"),st=require("./plugins/ImgPlaceholder.cjs"),it=require("./plugins/VideoPlaceholder.cjs"),ct=require("./plugins/mediaPlaceholderLabels.cjs"),ut=require("./plugins/VariablePlaceholder.cjs"),Ee=require("./plugins/SyntaxHighlighter.cjs"),te=require("../../node_modules/i18next/dist/esm/i18next.cjs"),T=require("./editorI18n.cjs"),ne=require("../../lib/locale.cjs"),ft=require("../../lib/useDetachedLanguage.cjs"),ht=require("../../lib/useResolvedDirection.cjs"),mt=require("../../node_modules/react-i18next/dist/es/initReactI18next.cjs"),dt=require("../../node_modules/react-i18next/dist/es/useTranslation.cjs"),y=require("../../_virtual/index.cjs");te.default.isInitialized?Object.entries(T.editorLocaleResources).forEach(([S,g])=>{te.default.addResourceBundle(S,"translation",g.translation,!0,!0)}):te.default.use(mt.initReactI18next).init({resources:T.editorLocaleResources,lng:T.DEFAULT_EDITOR_LOCALE,fallbackLng:T.DEFAULT_EDITOR_LOCALE,interpolation:{escapeValue:!1}});const ve=[],Oe=(S,g)=>{if(!S||g<0)return!1;for(const s of y.distExports.findDocumentVariableMarkers(S))if(s.name!==null&&g>=s.start+2&&g<=s.end-2)return!0;return!1},pt=(S="")=>S?y.distExports.formatVariableReference(S):"{{ }}",gt=({content:S="",editMode:g="codeEdit",questionMode:s=!1,variables:re,systemVariables:oe,onChange:P,onBlur:we,locale:G,lang:Le,uploadProps:Te,disabled:o=!1,toolbarActionsRight:Q,onReady:ye})=>{const{t:i,i18n:W}=dt.useTranslation(),q=ne.normalizeMarkdownFlowLocale(G??T.DEFAULT_EDITOR_LOCALE),le=ne.getMarkdownFlowDirection(G),ae=Le??ne.getMarkdownFlowLanguage(G);r.useEffect(()=>{W.language!==q&&W.changeLanguage(q)},[W,q]);const m=T.getEditorLocaleMessages(q),V=r.useMemo(()=>({image:i("toolbarInsertImage",{defaultValue:"Insert image"}),video:i("toolbarInsertVideo",{defaultValue:"Insert video"}),variable:i("slashVariable",{defaultValue:"Variable"}),addVariable:i("toolbarInsertNewVariable",{defaultValue:"Insert new variable"}),search:i("toolbarInsertExistingVariable",{defaultValue:"Insert existing variable"}),confirmOutput:i("toolbarConfirmOutput",{defaultValue:"Confirm output"}),insertLink:i("toolbarInsertLink",{defaultValue:"Insert link"}),insertButton:i("toolbarInsertButton",{defaultValue:"Insert button"}),insertSingleChoice:i("toolbarInsertSingleChoice",{defaultValue:"Insert single choice"}),insertMultiChoice:i("toolbarInsertMultiChoice",{defaultValue:"Insert multi choice"}),insertInput:i("toolbarInsertInput",{defaultValue:"Insert input"}),singleChoiceOption1:i("toolbarChoiceOption1",{defaultValue:"Option 1"}),singleChoiceOption2:i("toolbarChoiceOption2",{defaultValue:"Option 2"}),inputPlaceholder:i("toolbarInputPlaceholder",{defaultValue:"Please enter"})}),[i]),Pe=r.useMemo(()=>({searchPlaceholder:i("variableSearchPlaceholder",{defaultValue:"Search variable"}),systemLabel:i("variableSectionSystem","System Variables"),customLabel:i("variableSectionCustom","Custom Variables"),emptyLabel:i("variableNotFound","No variables found")}),[i]),je=g==="quickEdit"?i("placeholderQuickEdit",{defaultValue:i("placeholderCodeEdit",{defaultValue:i("placeholder")})}):i("placeholderCodeEdit",{defaultValue:i("placeholder")}),j=r.useMemo(()=>{const e=new Set;return(oe??ve).flatMap(n=>{const l=typeof n?.name=="string"?y.distExports.normalizeVariableName(n.name):null;return l===null||e.has(l)?[]:(e.add(l),[{...n,name:l}])})},[oe]),K=r.useMemo(()=>{const e=new Set(j.map(l=>l.name)),n=new Set;return(re??ve).flatMap(l=>{const t=typeof l?.name=="string"?y.distExports.normalizeVariableName(l.name):null;return t===null||e.has(t)||n.has(t)?[]:(n.add(t),[{...l,name:t}])})},[re,j]),[Y,x]=r.useState(!1),[J,v]=r.useState(!1),$=r.useRef(null),R=ft.useDetachedLanguage($,ae),{resolvedDirection:D}=ht.useResolvedDirection($,le),[Re,N]=r.useState(null),[se,X]=r.useState(K),[F,De]=r.useState(j);r.useEffect(()=>{X(K)},[K]),r.useEffect(()=>{De(j)},[j]);const[k,E]=r.useState(h.SelectedOption.Empty),[f,A]=r.useState(),a=r.useRef(null),z=r.useRef(null),_=r.useRef(null),[Z,ie]=r.useState(!1),p=r.useCallback(()=>{ie(!1),_.current=null},[]);r.useEffect(()=>{s&&p()},[p,s]);const Ne=r.useCallback(e=>{if(!o){if(Z&&_.current===e){p();return}_.current=e,ie(!0)}},[p,o,Z]),Ae={selectedOption:k,setSelectedOption:E,dialogOpen:Y,setDialogOpen:x,popoverOpen:J,setPopoverOpen:v,popoverPosition:Re,setPopoverPosition:N};r.useEffect(()=>{o&&(x(!1),v(!1),E(h.SelectedOption.Empty),A(null),N(null),p())},[p,o,x,v,N,E,A]);const O=r.useCallback(e=>{if(s||g!=="quickEdit"||!e)return;const n=y.distExports.extractVariableNames(e);if(!n.length)return;const l=new Set(F.map(t=>t.name));X(t=>{const u=new Set(t.map(C=>C.name)),d=new Set,b=[];return n.forEach(C=>{const I=C;!C||l.has(I)||u.has(I)||d.has(I)||(b.push({name:C}),d.add(I))}),b.length?[...b,...t]:t})},[g,s,F]);r.useEffect(()=>{O(S)},[S,O]);const M=r.useCallback(e=>{if(!(o||s&&e===h.SelectedOption.Variable))if(p(),E(e),e===h.SelectedOption.Variable){if(a.current){const{state:n}=a.current,l=n.selection.main.from,t=a.current.coordsAtPos(l);t&&N({x:t.left,y:t.bottom})}v(!0)}else x(!0)},[p,o,s]),w=r.useCallback(e=>{if(o||!a.current)return;const{state:n,dispatch:l}=a.current,t=n.selection.main.from;l({changes:{from:t,insert:e},selection:{anchor:t+e.length}})},[a,o]),ce=r.useCallback(e=>{if(o||!a.current)return;const{state:n,dispatch:l}=a.current,t=n.selection.main;l({changes:{from:t.from,to:t.to,insert:e},selection:{anchor:t.from+e.length}})},[o]),ue=r.useCallback(()=>{a.current?.focus()},[]),fe=r.useCallback(()=>a.current?.state.doc.toString()??"",[]),he=r.useCallback(e=>{if(o)return;if(!a.current){P?.(e);return}const n=a.current,{state:l,dispatch:t}=n;t({changes:{from:0,to:l.doc.length,insert:e},selection:{anchor:e.length}})},[o,P]),B=r.useCallback(()=>{if(o||!f||!a.current||f.from===-1)return;const{from:e,to:n}=f,{dispatch:l}=a.current;l({changes:{from:e,to:n,insert:""}})},[f,a,o]),H=r.useCallback((e,n,l=!1)=>{if(o||!a.current)return;const t=a.current,{state:u,dispatch:d}=t,b=n??u.selection.main,C=pt(e);if(!C)return;const I=y.distExports.normalizeVariableName(e)??"",Ye=l?C.length:3+I.length;d({changes:{from:b.from,to:b.to,insert:C},selection:{anchor:b.from+Ye}}),t.focus()},[o]),qe=r.useCallback(()=>{o||(p(),H(""))},[p,o,H]),$e=r.useCallback(()=>{if(o||!a.current)return;const e=a.current,{state:n,dispatch:l}=e,t=n.selection.main;l({changes:{from:t.from,to:t.to,insert:"======"},selection:{anchor:t.from+3}}),e.focus()},[o]),Fe=r.useCallback(()=>{if(o||!a.current)return;const e=a.current,{state:n,dispatch:l}=e,t=n.selection.main;l({changes:{from:t.from,to:t.to,insert:"[]()"},selection:{anchor:t.from+1}}),e.focus()},[o]),ze=r.useCallback(()=>{if(o||!a.current)return;const e=a.current,{state:n,dispatch:l}=e,t=n.selection.main;l({changes:{from:t.from,to:t.to,insert:"?[]"},selection:{anchor:t.from+2}}),e.focus()},[o]),_e=r.useCallback(()=>{if(o||!a.current)return;const e=a.current,{state:n,dispatch:l}=e,t=n.selection.main,u=V.singleChoiceOption1,d=V.singleChoiceOption2,b=`?[%{{ ${s?m.questionPlaceholder:""} }} ${u} | ${d}]`;l({changes:{from:t.from,to:t.to,insert:b},selection:{anchor:t.from+6,head:t.from+6+(s?m.questionPlaceholder.length:0)}}),e.focus()},[o,V.singleChoiceOption1,V.singleChoiceOption2,s,m.questionPlaceholder]),Be=r.useCallback(()=>{if(o||!a.current)return;const e=a.current,{state:n,dispatch:l}=e,t=n.selection.main,u=V.singleChoiceOption1,d=V.singleChoiceOption2,b=`?[%{{ ${s?m.questionPlaceholder:""} }} ${u} || ${d}]`;l({changes:{from:t.from,to:t.to,insert:b},selection:{anchor:t.from+6,head:t.from+6+(s?m.questionPlaceholder.length:0)}}),e.focus()},[o,V.singleChoiceOption1,V.singleChoiceOption2,s,m.questionPlaceholder]),He=r.useCallback(()=>{if(o||!a.current)return;const e=a.current,{state:n,dispatch:l}=e,t=n.selection.main,u=V.inputPlaceholder??"请输入",d=`?[%{{ ${s?m.questionPlaceholder:""} }}...${u}]`;l({changes:{from:t.from,to:t.to,insert:d},selection:{anchor:t.from+6,head:t.from+6+(s?m.questionPlaceholder.length:0)}}),e.focus()},[o,V.inputPlaceholder,s,m.questionPlaceholder]),Ue=r.useCallback(({resourceUrl:e,resourceTitle:n,scalePercent:l})=>{if(!e||o)return;const t=U.getImageContentToInsert({resourceUrl:e,resourceTitle:n,scalePercent:l});if(f?.type===h.SelectedOption.Image){if(B(),!a.current)return;const{dispatch:u}=a.current;u({changes:{from:f.from,insert:t}})}else w(t);x(!1)},[B,o,w,f]),Ge=r.useCallback(({resourceUrl:e,resourceTitle:n})=>{if(o)return;const l=U.getVideoContentToInsert(e,n);if(f?.type===h.SelectedOption.Video){if(B(),!a.current)return;const{dispatch:t}=a.current;t({changes:{from:f.from,insert:l}})}else w(l);x(!1)},[B,o,w,f]),me=r.useCallback(e=>{if(o)return;const n=f?.type===h.SelectedOption.Variable?{from:f.from,to:f.to}:void 0;H(e.name,n,!0),v(!1),p()},[o,H,f,p]),de=r.useCallback(()=>Xe.autocompletion({override:[U.createSlashCommands(M,{image:m.slashImage,video:m.slashVideo,variable:m.slashVariable},{enableVariables:!s})]}),[m.slashImage,m.slashVideo,m.slashVariable,M,s]),pe=r.useCallback(e=>{if(a.current=e.view,!s&&g==="quickEdit"&&z.current&&e.selectionSet){const n=e.state.selection.main.head,l=e.state.doc.toString();Oe(l,n)||(O(l),z.current=null)}},[O,g,s]),ge=r.useCallback(e=>{if(e.stopPropagation(),o)return;const{type:n,from:l,to:t,dataset:u,target:d}=e.detail;if(s&&n===h.SelectedOption.Variable)return;const b=U.parseContentInfo(n,u);if(A({type:n,value:b,from:l,to:t}),E(n),n===h.SelectedOption.Variable){if(d){const C=d.getBoundingClientRect(),I=d.ownerDocument.defaultView?.getComputedStyle($.current??d).direction;N({x:I==="rtl"?C.right:C.left,y:C.bottom})}v(!0)}else x(!0)},[o,s]);r.useEffect(()=>{Y||(E(h.SelectedOption.Empty),A(null))},[Y]),r.useEffect(()=>{!J&&k===h.SelectedOption.Variable&&(E(h.SelectedOption.Empty),A(null))},[J,k]),r.useEffect(()=>{const e=n=>{n.detail.view===a.current&&ge(n)};return window.addEventListener("globalTagClick",e),()=>{window.removeEventListener("globalTagClick",e)}},[ge]);const be=i("imageDefaultTitle"),Ce=i("videoDefaultTitle"),Se=r.useMemo(()=>ct.mediaPlaceholderLabels.of({image:be,video:Ce}),[be,Ce]),Qe=r.useMemo(()=>{const e=[Ie.EditorView.lineWrapping,Ze.markdown(),xe.syntaxHighlighting(xe.defaultHighlightStyle),s?Ee.QuestionSyntaxHighlighter:Ee.default];return o||e.push(de()),g==="quickEdit"&&(e.push(Se,st.default,it.default),s||e.push(ut.default)),e.push(Ie.EditorView.updateListener.of(n=>{pe(n)})),e},[o,g,de,pe,Se,s]),We=r.useCallback(e=>{if(o)return;if(s){P?.(e);return}const n=a.current?.state.selection.main.head??-1;Oe(e,n)?z.current=e:(z.current=null,O(e)),P?.(e)},[O,P,o,s]),Ve=!s&&!o&&Z,L=r.useMemo(()=>({insertTextAtCursor:w,replaceSelection:ce,focus:ue,getContent:fe,setContent:he}),[ue,fe,w,ce,he]),ke=r.useCallback(e=>{o||"render"in e||e.onClick?.(L)},[o,L]),Ke=r.useMemo(()=>Q?.length?c.jsx("div",{className:"markdown-flow-editor-toolbar-right",children:Q.map(e=>{if("render"in e)return c.jsx("div",{className:"markdown-flow-editor-toolbar-right-item",children:e.render(L)},e.key);const n=e.label||e.tooltip||void 0,l=c.jsxs("button",{type:"button",disabled:o||e.disabled,onClick:()=>ke(e),className:"markdown-flow-editor-toolbar-right-button","aria-label":n,title:e.label||e.tooltip,children:[e.icon?c.jsx("span",{className:"toolbar-right-icon",children:e.icon}):null,e.label?c.jsx("span",{className:"toolbar-right-label",children:e.label}):null]},e.key),t=e.tooltip?c.jsxs(ee.Tooltip,{children:[c.jsx(ee.TooltipTrigger,{asChild:!0,children:l}),c.jsx(ee.TooltipContent,{side:"top",dir:D,lang:R,children:e.tooltip})]}):l;return c.jsx("div",{className:"markdown-flow-editor-toolbar-right-item",children:t},e.key)})}):null,[o,L,ke,D,R,Q]);return r.useEffect(()=>{ye?.(L)},[L]),c.jsxs("div",{className:"markdown-flow-editor",ref:$,dir:le,lang:ae,"data-disabled":o?"true":void 0,"aria-disabled":o,children:[c.jsx(tt.default,{disabled:o,enableVariables:!s,labels:V,tooltipDirection:D,tooltipLanguage:R,onSelect:M,onInsertVariablePlaceholder:qe,onVariableSearchToggle:Ne,onVariableSearchClose:p,onInsertConfirmOutput:$e,onInsertLink:Fe,onInsertButton:ze,onInsertSingleChoice:_e,onInsertMultiChoice:Be,onInsertInputField:He,variableSearchActive:Ve,rightSlot:Ke}),!s&&c.jsx(nt.default,{open:Ve,anchorElement:_.current,onClose:p,onSelect:me,variables:se,systemVariables:F,labels:Pe}),c.jsx("div",{className:"markdown-flow-editor-body relative overflow-auto",children:c.jsxs(rt.default.Provider,{value:Ae,children:[c.jsx(Je.default,{extensions:Qe,basicSetup:{lineNumbers:!1,searchKeymap:!1,syntaxHighlighting:!0,highlightActiveLine:!0,highlightActiveLineGutter:!0,foldGutter:!1},className:"rounded-md",placeholder:je,value:S,theme:"light",minHeight:"2rem",editable:!o,onChange:We,onBlur:we}),!o&&c.jsxs(Me.default,{dir:D,lang:R,labels:{closeButtonLabel:i("dialogCloseLabel"),title:k===h.SelectedOption.Image?i("dialogTitleImage"):k===h.SelectedOption.Video?i("dialogTitleVideo"):k===h.SelectedOption.Variable?i("dialogTitleVariable"):i("dialogTitle")},children:[k===h.SelectedOption.Image&&c.jsx(ot.default,{value:f?.value,onSelect:Ue,uploadProps:Te}),k===h.SelectedOption.Video&&c.jsx(lt.default,{value:f?.value,onSelect:Ge})]}),!o&&!s&&c.jsx(et.default,{dir:D,lang:R,children:c.jsx(at.default,{variables:se,systemVariables:F,selectedName:f?.value?.variableName,onSelect:me,onAddVariable:e=>{X(n=>{const l=e.name;return n.some(u=>u.name===l)?n:[e,...n]})}})})]})})]})};exports.default=gt;
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const c=require("react/jsx-runtime"),n=require("react"),Ie=require("../../node_modules/@uiw/react-codemirror/esm/index.cjs"),ke=require("../../node_modules/@codemirror/autocomplete/dist/index.cjs"),Z=require("../../node_modules/@codemirror/view/dist/index.cjs"),ve=require("../../node_modules/@codemirror/lang-markdown/dist/index.cjs"),ee=require("../../node_modules/@codemirror/language/dist/index.cjs"),N=require("../ui/tooltip.cjs"),Le=require("./components/CustomDialog.cjs"),Oe=require("./components/EditorToolbar.cjs"),we=require("./editor-context.cjs"),xe=require("./components/ImageInject.cjs"),Te=require("./components/VideoInject.cjs"),d=require("./types.cjs");;/* empty css */const b=require("./utils.cjs"),Ee=require("./plugins/ImgPlaceholder.cjs"),Se=require("./plugins/VideoPlaceholder.cjs"),be=require("./plugins/mediaPlaceholderLabels.cjs"),Ve=require("./plugins/SyntaxHighlighter.cjs"),A=require("../../node_modules/i18next/dist/esm/i18next.cjs"),I=require("./editorI18n.cjs"),F=require("../../lib/locale.cjs"),qe=require("../../lib/useDetachedLanguage.cjs"),je=require("../../lib/useResolvedDirection.cjs"),ye=require("../../node_modules/react-i18next/dist/es/initReactI18next.cjs"),De=require("../../node_modules/react-i18next/dist/es/useTranslation.cjs");A.default.isInitialized?Object.entries(I.editorLocaleResources).forEach(([V,k])=>{A.default.addResourceBundle(V,"translation",k.translation,!0,!0)}):A.default.use(ye.initReactI18next).init({resources:I.editorLocaleResources,lng:I.DEFAULT_EDITOR_LOCALE,fallbackLng:I.DEFAULT_EDITOR_LOCALE,interpolation:{escapeValue:!1}});const Re=({content:V="",editMode:k="codeEdit",onChange:L,onBlur:te,locale:q,lang:oe,uploadProps:ne,disabled:t=!1,toolbarActionsRight:j,onReady:re})=>{const{t:s,i18n:y}=De.useTranslation(),O=F.normalizeMarkdownFlowLocale(q??I.DEFAULT_EDITOR_LOCALE),_=F.getMarkdownFlowDirection(q),$=oe??F.getMarkdownFlowLanguage(q);n.useEffect(()=>{y.language!==O&&y.changeLanguage(O)},[y,O]);const w=I.getEditorLocaleMessages(O),u=n.useMemo(()=>({image:s("toolbarInsertImage",{defaultValue:"Insert image"}),video:s("toolbarInsertVideo",{defaultValue:"Insert video"}),confirmOutput:s("toolbarConfirmOutput",{defaultValue:"Confirm output"}),insertLink:s("toolbarInsertLink",{defaultValue:"Insert link"}),insertButton:s("toolbarInsertButton",{defaultValue:"Insert button"}),insertSingleChoice:s("toolbarInsertSingleChoice",{defaultValue:"Insert single choice"}),insertMultiChoice:s("toolbarInsertMultiChoice",{defaultValue:"Insert multi choice"}),insertInput:s("toolbarInsertInput",{defaultValue:"Insert input"}),singleChoiceOption1:s("toolbarChoiceOption1",{defaultValue:"Option 1"}),singleChoiceOption2:s("toolbarChoiceOption2",{defaultValue:"Option 2"}),inputPlaceholder:s("toolbarInputPlaceholder",{defaultValue:"Please enter"})}),[s]),ie=k==="quickEdit"?s("placeholderQuickEdit",{defaultValue:s("placeholderCodeEdit",{defaultValue:s("placeholder")})}):s("placeholderCodeEdit",{defaultValue:s("placeholder")}),[D,h]=n.useState(!1),R=n.useRef(null),x=qe.useDetachedLanguage(R,$),{resolvedDirection:T}=je.useResolvedDirection(R,_),[v,m]=n.useState(d.SelectedOption.Empty),[a,E]=n.useState(),i=n.useRef(null),le={selectedOption:v,setSelectedOption:m,dialogOpen:D,setDialogOpen:h};n.useEffect(()=>{t&&(h(!1),m(d.SelectedOption.Empty),E(null))},[t,h,m,E]);const P=n.useCallback(e=>{t||(m(e),h(!0))},[t]),g=n.useCallback(e=>{if(t||!i.current)return;const{state:r,dispatch:l}=i.current,o=r.selection.main.from;l({changes:{from:o,insert:e},selection:{anchor:o+e.length}})},[i,t]),B=n.useCallback(e=>{if(t||!i.current)return;const{state:r,dispatch:l}=i.current,o=r.selection.main;l({changes:{from:o.from,to:o.to,insert:e},selection:{anchor:o.from+e.length}})},[t]),H=n.useCallback(()=>{i.current?.focus()},[]),U=n.useCallback(()=>i.current?.state.doc.toString()??"",[]),z=n.useCallback(e=>{if(t)return;if(!i.current){L?.(e);return}const r=i.current,{state:l,dispatch:o}=r;o({changes:{from:0,to:l.doc.length,insert:e},selection:{anchor:e.length}})},[t,L]),S=n.useCallback(()=>{if(t||!a||!i.current||a.from===-1)return;const{from:e,to:r}=a,{dispatch:l}=i.current;l({changes:{from:e,to:r,insert:""}})},[a,i,t]),se=n.useCallback(()=>{if(t||!i.current)return;const e=i.current,{state:r,dispatch:l}=e,o=r.selection.main;l({changes:{from:o.from,to:o.to,insert:"======"},selection:{anchor:o.from+3}}),e.focus()},[t]),ce=n.useCallback(()=>{if(t||!i.current)return;const e=i.current,{state:r,dispatch:l}=e,o=r.selection.main;l({changes:{from:o.from,to:o.to,insert:"[]()"},selection:{anchor:o.from+1}}),e.focus()},[t]),ae=n.useCallback(()=>{if(t||!i.current)return;const e=i.current,{state:r,dispatch:l}=e,o=r.selection.main;l({changes:{from:o.from,to:o.to,insert:"?[]"},selection:{anchor:o.from+2}}),e.focus()},[t]),ue=n.useCallback(()=>{if(t||!i.current)return;const e=i.current,{state:r,dispatch:l}=e,o=r.selection.main,f=u.singleChoiceOption1,p=u.singleChoiceOption2,M=`?[%{{ }} ${f} | ${p}]`;l({changes:{from:o.from,to:o.to,insert:M},selection:{anchor:o.from+6}}),e.focus()},[t,u.singleChoiceOption1,u.singleChoiceOption2]),fe=n.useCallback(()=>{if(t||!i.current)return;const e=i.current,{state:r,dispatch:l}=e,o=r.selection.main,f=u.singleChoiceOption1,p=u.singleChoiceOption2,M=`?[%{{ }} ${f} || ${p}]`;l({changes:{from:o.from,to:o.to,insert:M},selection:{anchor:o.from+6}}),e.focus()},[t,u.singleChoiceOption1,u.singleChoiceOption2]),de=n.useCallback(()=>{if(t||!i.current)return;const e=i.current,{state:r,dispatch:l}=e,o=r.selection.main,p=`?[%{{ }}...${u.inputPlaceholder??"请输入"}]`;l({changes:{from:o.from,to:o.to,insert:p},selection:{anchor:o.from+6}}),e.focus()},[t,u.inputPlaceholder]),he=n.useCallback(({resourceUrl:e,resourceTitle:r,scalePercent:l})=>{if(!e||t)return;const o=b.getImageContentToInsert({resourceUrl:e,resourceTitle:r,scalePercent:l});if(a?.type===d.SelectedOption.Image){if(S(),!i.current)return;const{dispatch:f}=i.current;f({changes:{from:a.from,insert:o}})}else g(o);h(!1)},[S,t,g,a]),pe=n.useCallback(({resourceUrl:e,resourceTitle:r})=>{if(t)return;const l=b.getVideoContentToInsert(e,r);if(a?.type===d.SelectedOption.Video){if(S(),!i.current)return;const{dispatch:o}=i.current;o({changes:{from:a.from,insert:l}})}else g(l);h(!1)},[S,t,g,a]),G=n.useCallback(()=>ke.autocompletion({override:[b.createSlashCommands(P,{image:w.slashImage,video:w.slashVideo})]}),[w.slashImage,w.slashVideo,P]),W=n.useCallback(e=>{i.current=e.view},[]),K=n.useCallback(e=>{if(e.stopPropagation(),t)return;const{type:r,from:l,to:o,dataset:f}=e.detail,p=b.parseContentInfo(r,f);E({type:r,value:p,from:l,to:o}),m(r),h(!0)},[t]);n.useEffect(()=>{D||(m(d.SelectedOption.Empty),E(null))},[D]),n.useEffect(()=>{const e=r=>{r.detail.view===i.current&&K(r)};return window.addEventListener("globalTagClick",e),()=>{window.removeEventListener("globalTagClick",e)}},[K]);const Q=s("imageDefaultTitle"),J=s("videoDefaultTitle"),X=n.useMemo(()=>be.mediaPlaceholderLabels.of({image:Q,video:J}),[Q,J]),me=n.useMemo(()=>{const e=[Z.EditorView.lineWrapping,ve.markdown(),ee.syntaxHighlighting(ee.defaultHighlightStyle),Ve.default];return t||e.push(G()),k==="quickEdit"&&e.push(X,Ee.default,Se.default),e.push(Z.EditorView.updateListener.of(r=>{W(r)})),e},[t,k,G,W,X]),ge=n.useCallback(e=>{t||L?.(e)},[L,t]),C=n.useMemo(()=>({insertTextAtCursor:g,replaceSelection:B,focus:H,getContent:U,setContent:z}),[H,U,g,B,z]),Y=n.useCallback(e=>{t||"render"in e||e.onClick?.(C)},[t,C]),Ce=n.useMemo(()=>j?.length?c.jsx("div",{className:"markdown-flow-editor-toolbar-right",children:j.map(e=>{if("render"in e)return c.jsx("div",{className:"markdown-flow-editor-toolbar-right-item",children:e.render(C)},e.key);const r=e.label||e.tooltip||void 0,l=c.jsxs("button",{type:"button",disabled:t||e.disabled,onClick:()=>Y(e),className:"markdown-flow-editor-toolbar-right-button","aria-label":r,title:e.label||e.tooltip,children:[e.icon?c.jsx("span",{className:"toolbar-right-icon",children:e.icon}):null,e.label?c.jsx("span",{className:"toolbar-right-label",children:e.label}):null]},e.key),o=e.tooltip?c.jsxs(N.Tooltip,{children:[c.jsx(N.TooltipTrigger,{asChild:!0,children:l}),c.jsx(N.TooltipContent,{side:"top",dir:T,lang:x,children:e.tooltip})]}):l;return c.jsx("div",{className:"markdown-flow-editor-toolbar-right-item",children:o},e.key)})}):null,[t,C,Y,T,x,j]);return n.useEffect(()=>{re?.(C)},[C]),c.jsxs("div",{className:"markdown-flow-editor",ref:R,dir:_,lang:$,"data-disabled":t?"true":void 0,"aria-disabled":t,children:[c.jsx(Oe.default,{disabled:t,labels:u,tooltipDirection:T,tooltipLanguage:x,onSelect:P,onInsertConfirmOutput:se,onInsertLink:ce,onInsertButton:ae,onInsertSingleChoice:ue,onInsertMultiChoice:fe,onInsertInputField:de,rightSlot:Ce}),c.jsx("div",{className:"markdown-flow-editor-body relative overflow-auto",children:c.jsxs(we.default.Provider,{value:le,children:[c.jsx(Ie.default,{extensions:me,basicSetup:{lineNumbers:!1,searchKeymap:!1,syntaxHighlighting:!0,highlightActiveLine:!0,highlightActiveLineGutter:!0,foldGutter:!1},className:"rounded-md",placeholder:ie,value:V,theme:"light",minHeight:"2rem",editable:!t,onChange:ge,onBlur:te}),!t&&c.jsxs(Le.default,{dir:T,lang:x,labels:{closeButtonLabel:s("dialogCloseLabel"),title:v===d.SelectedOption.Image?s("dialogTitleImage"):v===d.SelectedOption.Video?s("dialogTitleVideo"):s("dialogTitle")},children:[v===d.SelectedOption.Image&&c.jsx(xe.default,{value:a?.value,onSelect:he,uploadProps:ne}),v===d.SelectedOption.Video&&c.jsx(Te.default,{value:a?.value,onSelect:pe})]})]})})]})};exports.default=Re;
|
|
2
2
|
//# sourceMappingURL=MarkdownFlowEditor.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MarkdownFlowEditor.cjs","sources":["../../../src/components/MarkdownFlowEditor/MarkdownFlowEditor.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState, useCallback, useRef, useEffect, useMemo } from \"react\";\nimport CodeMirror from \"@uiw/react-codemirror\";\nimport { autocompletion } from \"@codemirror/autocomplete\";\nimport { EditorView, ViewUpdate } from \"@codemirror/view\";\nimport { markdown } from \"@codemirror/lang-markdown\";\nimport {\n syntaxHighlighting,\n defaultHighlightStyle,\n} from \"@codemirror/language\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"../ui/tooltip\";\nimport CustomDialog from \"./components/CustomDialog\";\nimport CustomPopover from \"./components/CustomPopover\";\nimport EditorToolbar from \"./components/EditorToolbar\";\nimport VariableSearchDropdown from \"./components/VariableSearchDropdown\";\nimport EditorContext from \"./editor-context\";\nimport ImageInject from \"./components/ImageInject\";\nimport VideoInject from \"./components/VideoInject\";\nimport VariableSelect from \"./components/VariableSelect\";\nimport {\n SelectedOption,\n IEditorContext,\n Variable,\n SelectContentInfo,\n PopoverPosition,\n EditorAction,\n EditorApi,\n} from \"./types\";\nimport \"./markdownFlowEditor.css\";\n\nimport {\n createSlashCommands,\n parseContentInfo,\n getImageContentToInsert,\n getVideoContentToInsert,\n extractVariableNames,\n findDocumentVariableMarkers,\n formatVariableReference,\n normalizeVariableName,\n} from \"./utils\";\nimport ImgPlaceholder from \"./plugins/ImgPlaceholder\";\nimport VideoPlaceholder from \"./plugins/VideoPlaceholder\";\nimport { mediaPlaceholderLabels } from \"./plugins/mediaPlaceholderLabels\";\nimport VariablePlaceholder from \"./plugins/VariablePlaceholder\";\nimport SyntaxHighlighter, {\n QuestionSyntaxHighlighter,\n} from \"./plugins/SyntaxHighlighter\";\n// import createFixedTextPlaceholder from \"./plugins/FixedTextPlaceholder\";\n// import DividerPlaceholder from \"./plugins/DividerPlaceholder\";\nimport { initReactI18next, useTranslation } from \"react-i18next\";\nimport i18next from \"i18next\";\nimport { UploadProps } from \"./uploadTypes\";\nimport {\n DEFAULT_EDITOR_LOCALE,\n editorLocaleResources,\n getEditorLocaleMessages,\n} from \"./editorI18n\";\nimport {\n getMarkdownFlowDirection,\n getMarkdownFlowLanguage,\n normalizeMarkdownFlowLocale,\n type MarkdownFlowLocale,\n} from \"../../lib/locale\";\nimport { useDetachedLanguage } from \"../../lib/useDetachedLanguage\";\nimport { useResolvedDirection } from \"../../lib/useResolvedDirection\";\n\nif (!i18next.isInitialized) {\n i18next.use(initReactI18next).init({\n resources: editorLocaleResources,\n lng: DEFAULT_EDITOR_LOCALE,\n fallbackLng: DEFAULT_EDITOR_LOCALE,\n interpolation: { escapeValue: false },\n });\n} else {\n Object.entries(editorLocaleResources).forEach(([lng, resource]) => {\n i18next.addResourceBundle(\n lng,\n \"translation\",\n resource.translation,\n true,\n true\n );\n });\n}\n\nexport enum EditMode {\n CodeEdit = \"codeEdit\",\n QuickEdit = \"quickEdit\",\n}\n\ntype EditorProps = {\n content?: string;\n editMode?: EditMode;\n /** Author questions and memory answers without variable authoring controls. */\n questionMode?: boolean;\n variables?: Variable[];\n systemVariables?: Variable[];\n onChange?: (value: string) => void;\n onBlur?: () => void;\n locale?: MarkdownFlowLocale;\n /** Overrides the locale-derived language. */\n lang?: string;\n uploadProps?: UploadProps;\n disabled?: boolean;\n toolbarActionsRight?: EditorAction[];\n onReady?: (api: EditorApi) => void;\n};\n\nconst EMPTY_VARIABLES: Variable[] = [];\n\n// Detect whether cursor is still inside a {{variable}} expression\nconst isCursorInsideVariableExpression = (\n content: string,\n cursorPosition: number\n) => {\n if (!content || cursorPosition < 0) {\n return false;\n }\n for (const marker of findDocumentVariableMarkers(content)) {\n if (\n marker.name !== null &&\n cursorPosition >= marker.start + 2 &&\n cursorPosition <= marker.end - 2\n ) {\n return true;\n }\n }\n\n return false;\n};\n\nconst buildVariableTemplate = (variableName = \"\") =>\n variableName ? formatVariableReference(variableName) : \"{{ }}\";\n\nconst Editor: React.FC<EditorProps> = ({\n content = \"\",\n editMode = EditMode.CodeEdit,\n questionMode = false,\n variables: initialVariables,\n systemVariables: initialSystemVariables,\n onChange,\n onBlur,\n locale,\n lang,\n uploadProps,\n disabled = false,\n toolbarActionsRight,\n onReady,\n}) => {\n const { t, i18n } = useTranslation();\n const resolvedLocale = normalizeMarkdownFlowLocale(\n locale ?? DEFAULT_EDITOR_LOCALE\n );\n const direction = getMarkdownFlowDirection(locale);\n const language = lang ?? getMarkdownFlowLanguage(locale);\n\n useEffect(() => {\n if (i18n.language !== resolvedLocale) {\n i18n.changeLanguage(resolvedLocale);\n }\n }, [i18n, resolvedLocale]);\n\n const currentStrings = getEditorLocaleMessages(resolvedLocale);\n const toolbarLabels = useMemo(\n () => ({\n image: t(\"toolbarInsertImage\", {\n defaultValue: \"Insert image\",\n }),\n video: t(\"toolbarInsertVideo\", {\n defaultValue: \"Insert video\",\n }),\n variable: t(\"slashVariable\", {\n defaultValue: \"Variable\",\n }),\n addVariable: t(\"toolbarInsertNewVariable\", {\n defaultValue: \"Insert new variable\",\n }),\n search: t(\"toolbarInsertExistingVariable\", {\n defaultValue: \"Insert existing variable\",\n }),\n confirmOutput: t(\"toolbarConfirmOutput\", {\n defaultValue: \"Confirm output\",\n }),\n insertLink: t(\"toolbarInsertLink\", {\n defaultValue: \"Insert link\",\n }),\n insertButton: t(\"toolbarInsertButton\", {\n defaultValue: \"Insert button\",\n }),\n insertSingleChoice: t(\"toolbarInsertSingleChoice\", {\n defaultValue: \"Insert single choice\",\n }),\n insertMultiChoice: t(\"toolbarInsertMultiChoice\", {\n defaultValue: \"Insert multi choice\",\n }),\n insertInput: t(\"toolbarInsertInput\", {\n defaultValue: \"Insert input\",\n }),\n singleChoiceOption1: t(\"toolbarChoiceOption1\", {\n defaultValue: \"Option 1\",\n }),\n singleChoiceOption2: t(\"toolbarChoiceOption2\", {\n defaultValue: \"Option 2\",\n }),\n inputPlaceholder: t(\"toolbarInputPlaceholder\", {\n defaultValue: \"Please enter\",\n }),\n }),\n [t]\n );\n const variableSearchLabels = useMemo(\n () => ({\n searchPlaceholder: t(\"variableSearchPlaceholder\", {\n defaultValue: \"Search variable\",\n }),\n systemLabel: t(\"variableSectionSystem\", \"System Variables\"),\n customLabel: t(\"variableSectionCustom\", \"Custom Variables\"),\n emptyLabel: t(\"variableNotFound\", \"No variables found\"),\n }),\n [t]\n );\n const placeholderText =\n editMode === EditMode.QuickEdit\n ? t(\"placeholderQuickEdit\", {\n defaultValue: t(\"placeholderCodeEdit\", {\n defaultValue: t(\"placeholder\"),\n }),\n })\n : t(\"placeholderCodeEdit\", { defaultValue: t(\"placeholder\") });\n // Only boundary whitespace is normalized; key identity remains case-sensitive.\n const normalizedSystemVariables = useMemo(() => {\n const seen = new Set<string>();\n return (initialSystemVariables ?? EMPTY_VARIABLES).flatMap((variable) => {\n const name =\n typeof variable?.name === \"string\"\n ? normalizeVariableName(variable.name)\n : null;\n if (name === null || seen.has(name)) return [];\n seen.add(name);\n return [{ ...variable, name }];\n });\n }, [initialSystemVariables]);\n\n const normalizedCustomVariables = useMemo(() => {\n const systemNameSet = new Set(\n normalizedSystemVariables.map((variable) => variable.name)\n );\n const seen = new Set<string>();\n return (initialVariables ?? EMPTY_VARIABLES).flatMap((variable) => {\n const name =\n typeof variable?.name === \"string\"\n ? normalizeVariableName(variable.name)\n : null;\n if (name === null || systemNameSet.has(name) || seen.has(name)) return [];\n seen.add(name);\n return [{ ...variable, name }];\n });\n }, [initialVariables, normalizedSystemVariables]);\n\n const [dialogOpen, setDialogOpen] = useState(false);\n const [popoverOpen, setPopoverOpen] = useState(false);\n const editorRootRef = useRef<HTMLDivElement>(null);\n const portalLanguage = useDetachedLanguage(editorRootRef, language);\n const { resolvedDirection: portalDirection } = useResolvedDirection(\n editorRootRef,\n direction\n );\n const [popoverPosition, setPopoverPosition] =\n useState<PopoverPosition | null>(null);\n const [variables, setVariables] = useState<Variable[]>(\n normalizedCustomVariables\n );\n const [systemVariables, setSystemVariables] = useState<Variable[]>(\n normalizedSystemVariables\n );\n\n useEffect(() => {\n setVariables(normalizedCustomVariables);\n }, [normalizedCustomVariables]);\n\n useEffect(() => {\n setSystemVariables(normalizedSystemVariables);\n }, [normalizedSystemVariables]);\n\n const [selectedOption, setSelectedOption] = useState<SelectedOption>(\n SelectedOption.Empty\n );\n const [selectContentInfo, setSelectContentInfo] =\n useState<SelectContentInfo | null>();\n const editorViewRef = useRef<EditorView | null>(null);\n const pendingVariableContentRef = useRef<string | null>(null);\n const variableSearchAnchorRef = useRef<HTMLButtonElement | null>(null);\n const [variableSearchOpen, setVariableSearchOpen] = useState(false);\n const closeVariableSearch = useCallback(() => {\n setVariableSearchOpen(false);\n variableSearchAnchorRef.current = null;\n }, []);\n\n useEffect(() => {\n if (questionMode) {\n closeVariableSearch();\n }\n }, [closeVariableSearch, questionMode]);\n const handleVariableSearchToggle = useCallback(\n (button: HTMLButtonElement) => {\n if (disabled) {\n return;\n }\n if (variableSearchOpen && variableSearchAnchorRef.current === button) {\n closeVariableSearch();\n return;\n }\n variableSearchAnchorRef.current = button;\n setVariableSearchOpen(true);\n },\n [closeVariableSearch, disabled, variableSearchOpen]\n );\n\n const editorContextValue: IEditorContext = {\n selectedOption,\n setSelectedOption,\n dialogOpen,\n setDialogOpen,\n popoverOpen,\n setPopoverOpen,\n popoverPosition,\n setPopoverPosition,\n };\n\n useEffect(() => {\n if (!disabled) {\n return;\n }\n setDialogOpen(false);\n setPopoverOpen(false);\n setSelectedOption(SelectedOption.Empty);\n setSelectContentInfo(null);\n setPopoverPosition(null);\n closeVariableSearch();\n }, [\n closeVariableSearch,\n disabled,\n setDialogOpen,\n setPopoverOpen,\n setPopoverPosition,\n setSelectedOption,\n setSelectContentInfo,\n ]);\n\n const addVariablesFromContent = useCallback(\n (text: string) => {\n if (questionMode || editMode !== EditMode.QuickEdit || !text) {\n return;\n }\n\n const names = extractVariableNames(text);\n if (!names.length) {\n return;\n }\n\n const systemNameSet = new Set(\n systemVariables.map((variable) => variable.name)\n );\n\n setVariables((prev) => {\n const existingNames = new Set(prev.map((variable) => variable.name));\n const addedNames = new Set<string>();\n const newVariables: Variable[] = [];\n\n names.forEach((rawName) => {\n const normalized = rawName;\n if (\n !rawName ||\n systemNameSet.has(normalized) ||\n existingNames.has(normalized) ||\n addedNames.has(normalized)\n ) {\n return;\n }\n newVariables.push({ name: rawName });\n addedNames.add(normalized);\n });\n\n if (!newVariables.length) {\n return prev;\n }\n\n return [...newVariables, ...prev];\n });\n },\n [editMode, questionMode, systemVariables]\n );\n\n useEffect(() => {\n addVariablesFromContent(content);\n }, [content, addVariablesFromContent]);\n\n // const insertFixedText = useCallback(() => {\n // if (!editorViewRef.current) return;\n // const view = editorViewRef.current;\n // const { state, dispatch } = view;\n // const selection = state.selection.main;\n // const selectedText = state.sliceDoc(selection.from, selection.to);\n // const startTag = \"===\";\n // const endTag = \"===\";\n // const insertContent = `${startTag}${selectedText ?? \"\"}${endTag}`;\n\n // dispatch({\n // changes: {\n // from: selection.from,\n // to: selection.to,\n // insert: insertContent,\n // },\n // selection: {\n // anchor: selection.from + startTag.length + (selectedText?.length ?? 0),\n // },\n // });\n // view.focus();\n // }, []);\n\n // const insertDivider = useCallback(() => {\n // if (!editorViewRef.current) return;\n // const view = editorViewRef.current;\n // const { state, dispatch } = view;\n // const selection = state.selection.main;\n // const insertContent = `\\n\\n---\\n\\n`;\n\n // dispatch({\n // changes: {\n // from: selection.from,\n // to: selection.to,\n // insert: insertContent,\n // },\n // selection: {\n // anchor: selection.from + insertContent.length,\n // },\n // });\n // view.focus();\n // }, []);\n\n const onSelectedOption = useCallback(\n (option: SelectedOption) => {\n if (disabled || (questionMode && option === SelectedOption.Variable)) {\n return;\n }\n closeVariableSearch();\n // if (option === SelectedOption.FixedText) {\n // insertFixedText();\n // setSelectedOption(SelectedOption.Empty);\n // setDialogOpen(false);\n // setPopoverOpen(false);\n // setSelectContentInfo(null);\n // setPopoverPosition(null);\n // return;\n // }\n\n // if (option === SelectedOption.Divider) {\n // insertDivider();\n // setSelectedOption(SelectedOption.Empty);\n // setDialogOpen(false);\n // setPopoverOpen(false);\n // setSelectContentInfo(null);\n // setPopoverPosition(null);\n // return;\n // }\n\n setSelectedOption(option);\n\n if (option === SelectedOption.Variable) {\n if (editorViewRef.current) {\n const { state } = editorViewRef.current;\n const pos = state.selection.main.from;\n const coords = editorViewRef.current.coordsAtPos(pos);\n if (coords) {\n setPopoverPosition({\n x: coords.left,\n y: coords.bottom,\n });\n }\n }\n setPopoverOpen(true);\n } else {\n setDialogOpen(true);\n }\n },\n [closeVariableSearch, disabled, questionMode]\n );\n\n const insertText = useCallback(\n (text: string) => {\n if (disabled || !editorViewRef.current) return;\n\n const { state, dispatch } = editorViewRef.current;\n const from = state.selection.main.from;\n\n dispatch({\n changes: { from, insert: text },\n selection: { anchor: from + text.length },\n });\n },\n [editorViewRef, disabled]\n );\n\n const replaceSelection = useCallback(\n (text: string) => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const { state, dispatch } = editorViewRef.current;\n const selection = state.selection.main;\n dispatch({\n changes: { from: selection.from, to: selection.to, insert: text },\n selection: { anchor: selection.from + text.length },\n });\n },\n [disabled]\n );\n\n const focusEditor = useCallback(() => {\n editorViewRef.current?.focus();\n }, []);\n\n const getContent = useCallback(() => {\n return editorViewRef.current?.state.doc.toString() ?? \"\";\n }, []);\n\n const setContent = useCallback(\n (text: string) => {\n if (disabled) {\n return;\n }\n if (!editorViewRef.current) {\n onChange?.(text);\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n dispatch({\n changes: { from: 0, to: state.doc.length, insert: text },\n selection: { anchor: text.length },\n });\n },\n [disabled, onChange]\n );\n\n const deleteSelectedContent = useCallback(() => {\n if (disabled) {\n return;\n }\n if (\n !selectContentInfo ||\n !editorViewRef.current ||\n selectContentInfo.from === -1\n )\n return;\n\n const { from, to } = selectContentInfo;\n const { dispatch } = editorViewRef.current;\n\n dispatch({\n changes: { from, to, insert: \"\" },\n });\n }, [selectContentInfo, editorViewRef, disabled]);\n\n const insertVariableContent = useCallback(\n (\n variableName: string,\n range?: { from: number; to: number },\n placeCursorAtEnd = false\n ) => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n const selection = range ?? state.selection.main;\n const template = buildVariableTemplate(variableName);\n if (!template) return;\n const name = normalizeVariableName(variableName) ?? \"\";\n const cursorOffset = placeCursorAtEnd ? template.length : 3 + name.length; // Opening braces and one padding space\n\n dispatch({\n changes: {\n from: selection.from,\n to: selection.to,\n insert: template,\n },\n selection: {\n anchor: selection.from + cursorOffset,\n },\n });\n view.focus();\n },\n [disabled]\n );\n\n const insertVariableTemplate = useCallback(() => {\n if (disabled) {\n return;\n }\n closeVariableSearch();\n insertVariableContent(\"\");\n }, [closeVariableSearch, disabled, insertVariableContent]);\n\n const insertConfirmOutputMarker = useCallback(() => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n const selection = state.selection.main;\n const template = \"======\";\n dispatch({\n changes: {\n from: selection.from,\n to: selection.to,\n insert: template,\n },\n selection: {\n anchor: selection.from + 3,\n },\n });\n view.focus();\n }, [disabled]);\n\n const insertLinkTemplate = useCallback(() => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n const selection = state.selection.main;\n const template = \"[]()\";\n dispatch({\n changes: {\n from: selection.from,\n to: selection.to,\n insert: template,\n },\n selection: {\n anchor: selection.from + 1,\n },\n });\n view.focus();\n }, [disabled]);\n\n const insertButtonTemplate = useCallback(() => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n const selection = state.selection.main;\n const template = \"?[]\";\n dispatch({\n changes: {\n from: selection.from,\n to: selection.to,\n insert: template,\n },\n selection: {\n anchor: selection.from + 2,\n },\n });\n view.focus();\n }, [disabled]);\n\n const insertSingleChoiceTemplate = useCallback(() => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n const selection = state.selection.main;\n const optionLabel1 = toolbarLabels.singleChoiceOption1;\n const optionLabel2 = toolbarLabels.singleChoiceOption2;\n const template = `?[%{{ ${questionMode ? currentStrings.questionPlaceholder : \"\"} }} ${optionLabel1} | ${optionLabel2}]`;\n dispatch({\n changes: {\n from: selection.from,\n to: selection.to,\n insert: template,\n },\n selection: {\n anchor: selection.from + 6,\n head:\n selection.from +\n 6 +\n (questionMode ? currentStrings.questionPlaceholder.length : 0),\n },\n });\n view.focus();\n }, [\n disabled,\n toolbarLabels.singleChoiceOption1,\n toolbarLabels.singleChoiceOption2,\n questionMode,\n currentStrings.questionPlaceholder,\n ]);\n\n const insertMultiChoiceTemplate = useCallback(() => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n const selection = state.selection.main;\n const optionLabel1 = toolbarLabels.singleChoiceOption1;\n const optionLabel2 = toolbarLabels.singleChoiceOption2;\n const template = `?[%{{ ${questionMode ? currentStrings.questionPlaceholder : \"\"} }} ${optionLabel1} || ${optionLabel2}]`;\n dispatch({\n changes: {\n from: selection.from,\n to: selection.to,\n insert: template,\n },\n selection: {\n anchor: selection.from + 6,\n head:\n selection.from +\n 6 +\n (questionMode ? currentStrings.questionPlaceholder.length : 0),\n },\n });\n view.focus();\n }, [\n disabled,\n toolbarLabels.singleChoiceOption1,\n toolbarLabels.singleChoiceOption2,\n questionMode,\n currentStrings.questionPlaceholder,\n ]);\n\n const insertInputFieldTemplate = useCallback(() => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n const selection = state.selection.main;\n const placeholder = toolbarLabels.inputPlaceholder ?? \"请输入\";\n const template = `?[%{{ ${questionMode ? currentStrings.questionPlaceholder : \"\"} }}...${placeholder}]`;\n dispatch({\n changes: {\n from: selection.from,\n to: selection.to,\n insert: template,\n },\n selection: {\n anchor: selection.from + 6,\n head:\n selection.from +\n 6 +\n (questionMode ? currentStrings.questionPlaceholder.length : 0),\n },\n });\n view.focus();\n }, [\n disabled,\n toolbarLabels.inputPlaceholder,\n questionMode,\n currentStrings.questionPlaceholder,\n ]);\n\n const handleSelectImage = useCallback(\n ({\n resourceUrl,\n resourceTitle,\n scalePercent,\n }: {\n resourceUrl?: string;\n resourceTitle?: string;\n scalePercent?: number;\n }) => {\n if (!resourceUrl || disabled) return;\n const textToInsert = getImageContentToInsert({\n resourceUrl,\n resourceTitle,\n scalePercent,\n });\n if (selectContentInfo?.type === SelectedOption.Image) {\n deleteSelectedContent();\n if (!editorViewRef.current) return;\n const { dispatch } = editorViewRef.current;\n dispatch({\n changes: { from: selectContentInfo.from, insert: textToInsert },\n });\n } else {\n insertText(textToInsert);\n }\n setDialogOpen(false);\n },\n [deleteSelectedContent, disabled, insertText, selectContentInfo]\n );\n\n const handleSelectVideo = useCallback(\n ({\n resourceUrl,\n resourceTitle,\n }: {\n resourceUrl: string;\n resourceTitle: string;\n }) => {\n if (disabled) {\n return;\n }\n const textToInsert = getVideoContentToInsert(resourceUrl, resourceTitle);\n if (selectContentInfo?.type === SelectedOption.Video) {\n deleteSelectedContent();\n if (!editorViewRef.current) return;\n const { dispatch } = editorViewRef.current;\n dispatch({\n changes: { from: selectContentInfo.from, insert: textToInsert },\n });\n } else {\n insertText(textToInsert);\n }\n setDialogOpen(false);\n },\n [deleteSelectedContent, disabled, insertText, selectContentInfo]\n );\n\n const handleSelectVariable = useCallback(\n (variable: Variable) => {\n if (disabled) {\n return;\n }\n const selectionRange =\n selectContentInfo?.type === SelectedOption.Variable\n ? { from: selectContentInfo.from, to: selectContentInfo.to }\n : undefined;\n insertVariableContent(variable.name, selectionRange, true);\n setPopoverOpen(false);\n closeVariableSearch();\n },\n [disabled, insertVariableContent, selectContentInfo, closeVariableSearch]\n );\n\n const slashCommandsExtension = useCallback(() => {\n return autocompletion({\n override: [\n createSlashCommands(\n onSelectedOption,\n {\n // divider: currentStrings.slashDivider,\n // fixedText: currentStrings.slashFixedText,\n image: currentStrings.slashImage,\n video: currentStrings.slashVideo,\n variable: currentStrings.slashVariable,\n },\n { enableVariables: !questionMode }\n ),\n ],\n });\n }, [\n // currentStrings.slashDivider,\n // currentStrings.slashFixedText,\n currentStrings.slashImage,\n currentStrings.slashVideo,\n currentStrings.slashVariable,\n onSelectedOption,\n questionMode,\n ]);\n\n // const fixedTextPlaceholderExtension = useMemo(\n // () =>\n // createFixedTextPlaceholder(\n // currentStrings.fixedTextPlaceholder ?? \"添加固定文本\",\n // currentStrings.fixedTextTooltip ??\n // currentStrings.slashFixedText ??\n // \"固定文本\"\n // ),\n // [\n // currentStrings.fixedTextPlaceholder,\n // currentStrings.fixedTextTooltip,\n // currentStrings.slashFixedText,\n // ]\n // );\n\n const handleEditorUpdate = useCallback(\n (update: ViewUpdate) => {\n editorViewRef.current = update.view;\n if (\n !questionMode &&\n editMode === EditMode.QuickEdit &&\n pendingVariableContentRef.current &&\n update.selectionSet\n ) {\n const cursorPosition = update.state.selection.main.head;\n const docText = update.state.doc.toString();\n const stillInside = isCursorInsideVariableExpression(\n docText,\n cursorPosition\n );\n if (!stillInside) {\n addVariablesFromContent(docText);\n pendingVariableContentRef.current = null;\n }\n }\n },\n [addVariablesFromContent, editMode, questionMode]\n );\n\n const handleTagClick = useCallback(\n (event: any) => {\n event.stopPropagation();\n if (disabled) {\n return;\n }\n const { type, from, to, dataset, target } = event.detail;\n if (questionMode && type === SelectedOption.Variable) return;\n const value = parseContentInfo(type, dataset);\n setSelectContentInfo({\n type,\n value,\n from,\n to,\n });\n setSelectedOption(type);\n\n if (type === SelectedOption.Variable) {\n if (target) {\n const rect = target.getBoundingClientRect();\n const anchorDirection =\n target.ownerDocument.defaultView?.getComputedStyle(\n editorRootRef.current ?? target\n ).direction;\n setPopoverPosition({\n x: anchorDirection === \"rtl\" ? rect.right : rect.left,\n y: rect.bottom,\n });\n }\n setPopoverOpen(true);\n } else {\n setDialogOpen(true);\n }\n },\n [disabled, questionMode]\n );\n\n useEffect(() => {\n if (!dialogOpen) {\n setSelectedOption(SelectedOption.Empty);\n setSelectContentInfo(null);\n }\n }, [dialogOpen]);\n\n useEffect(() => {\n if (!popoverOpen && selectedOption === SelectedOption.Variable) {\n setSelectedOption(SelectedOption.Empty);\n setSelectContentInfo(null);\n }\n }, [popoverOpen, selectedOption]);\n\n useEffect(() => {\n const handleWrap = (e: any) => {\n if (e.detail.view === editorViewRef.current) {\n handleTagClick(e);\n }\n };\n window.addEventListener(\"globalTagClick\", handleWrap);\n return () => {\n window.removeEventListener(\"globalTagClick\", handleWrap);\n };\n }, [handleTagClick]);\n\n const imagePlaceholderTitle = t(\"imageDefaultTitle\");\n const videoPlaceholderTitle = t(\"videoDefaultTitle\");\n const mediaPlaceholderLabelsExtension = useMemo(\n () =>\n mediaPlaceholderLabels.of({\n image: imagePlaceholderTitle,\n video: videoPlaceholderTitle,\n }),\n [imagePlaceholderTitle, videoPlaceholderTitle]\n );\n\n const editorExtensions = useMemo(() => {\n const extensions = [\n EditorView.lineWrapping,\n markdown(),\n syntaxHighlighting(defaultHighlightStyle),\n questionMode ? QuestionSyntaxHighlighter : SyntaxHighlighter,\n ];\n\n if (!disabled) {\n extensions.push(slashCommandsExtension());\n }\n\n if (editMode === EditMode.QuickEdit) {\n extensions.push(\n mediaPlaceholderLabelsExtension,\n ImgPlaceholder,\n VideoPlaceholder\n // fixedTextPlaceholderExtension,\n // DividerPlaceholder,\n );\n if (!questionMode) extensions.push(VariablePlaceholder);\n }\n\n extensions.push(\n EditorView.updateListener.of((update) => {\n handleEditorUpdate(update);\n })\n );\n\n return extensions;\n }, [\n disabled,\n editMode,\n slashCommandsExtension,\n handleEditorUpdate,\n mediaPlaceholderLabelsExtension,\n questionMode,\n ]);\n\n const handleContentChange = useCallback(\n (value: string) => {\n if (disabled) {\n return;\n }\n if (questionMode) {\n onChange?.(value);\n return;\n }\n const cursorPosition =\n editorViewRef.current?.state.selection.main.head ?? -1;\n const skipAddition = isCursorInsideVariableExpression(\n value,\n cursorPosition\n );\n if (skipAddition) {\n pendingVariableContentRef.current = value;\n } else {\n pendingVariableContentRef.current = null;\n addVariablesFromContent(value);\n }\n onChange?.(value);\n },\n [addVariablesFromContent, onChange, disabled, questionMode]\n );\n\n const isVariableSearchOpen = !questionMode && !disabled && variableSearchOpen;\n const editorApi = useMemo(\n () => ({\n insertTextAtCursor: insertText,\n replaceSelection,\n focus: focusEditor,\n getContent,\n setContent,\n }),\n [focusEditor, getContent, insertText, replaceSelection, setContent]\n );\n\n const handleToolbarActionClick = useCallback(\n (action: EditorAction) => {\n if (disabled || \"render\" in action) {\n return;\n }\n action.onClick?.(editorApi);\n },\n [disabled, editorApi]\n );\n\n const toolbarRightSlot = useMemo(() => {\n if (!toolbarActionsRight?.length) {\n return null;\n }\n return (\n <div className=\"markdown-flow-editor-toolbar-right\">\n {toolbarActionsRight.map((action) => {\n if (\"render\" in action) {\n return (\n <div\n className=\"markdown-flow-editor-toolbar-right-item\"\n key={action.key}\n >\n {action.render(editorApi)}\n </div>\n );\n }\n const ariaLabel = action.label || action.tooltip || undefined;\n const button = (\n <button\n type=\"button\"\n key={action.key}\n disabled={disabled || action.disabled}\n onClick={() => handleToolbarActionClick(action)}\n className=\"markdown-flow-editor-toolbar-right-button\"\n aria-label={ariaLabel}\n title={action.label || action.tooltip}\n >\n {action.icon ? (\n <span className=\"toolbar-right-icon\">{action.icon}</span>\n ) : null}\n {action.label ? (\n <span className=\"toolbar-right-label\">{action.label}</span>\n ) : null}\n </button>\n );\n const wrapped = action.tooltip ? (\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent\n side=\"top\"\n dir={portalDirection}\n lang={portalLanguage}\n >\n {action.tooltip}\n </TooltipContent>\n </Tooltip>\n ) : (\n button\n );\n return (\n <div\n className=\"markdown-flow-editor-toolbar-right-item\"\n key={action.key}\n >\n {wrapped}\n </div>\n );\n })}\n </div>\n );\n }, [\n disabled,\n editorApi,\n handleToolbarActionClick,\n portalDirection,\n portalLanguage,\n toolbarActionsRight,\n ]);\n\n useEffect(() => {\n onReady?.(editorApi);\n }, [editorApi]);\n\n return (\n <div\n className=\"markdown-flow-editor\"\n ref={editorRootRef}\n dir={direction}\n lang={language}\n data-disabled={disabled ? \"true\" : undefined}\n aria-disabled={disabled}\n >\n <EditorToolbar\n disabled={disabled}\n enableVariables={!questionMode}\n labels={toolbarLabels}\n tooltipDirection={portalDirection}\n tooltipLanguage={portalLanguage}\n onSelect={onSelectedOption}\n onInsertVariablePlaceholder={insertVariableTemplate}\n onVariableSearchToggle={handleVariableSearchToggle}\n onVariableSearchClose={closeVariableSearch}\n onInsertConfirmOutput={insertConfirmOutputMarker}\n onInsertLink={insertLinkTemplate}\n onInsertButton={insertButtonTemplate}\n onInsertSingleChoice={insertSingleChoiceTemplate}\n onInsertMultiChoice={insertMultiChoiceTemplate}\n onInsertInputField={insertInputFieldTemplate}\n variableSearchActive={isVariableSearchOpen}\n rightSlot={toolbarRightSlot}\n />\n {!questionMode && (\n <VariableSearchDropdown\n open={isVariableSearchOpen}\n anchorElement={variableSearchAnchorRef.current}\n onClose={closeVariableSearch}\n onSelect={handleSelectVariable}\n variables={variables}\n systemVariables={systemVariables}\n labels={variableSearchLabels}\n />\n )}\n <div className=\"markdown-flow-editor-body relative overflow-auto\">\n <EditorContext.Provider value={editorContextValue}>\n <CodeMirror\n extensions={editorExtensions}\n basicSetup={{\n lineNumbers: false,\n searchKeymap: false,\n syntaxHighlighting: true,\n highlightActiveLine: true,\n highlightActiveLineGutter: true,\n foldGutter: false,\n }}\n className=\"rounded-md\"\n placeholder={placeholderText}\n value={content}\n theme=\"light\"\n minHeight=\"2rem\"\n editable={!disabled}\n onChange={handleContentChange}\n onBlur={onBlur}\n />\n {!disabled && (\n <CustomDialog\n dir={portalDirection}\n lang={portalLanguage}\n labels={{\n closeButtonLabel: t(\"dialogCloseLabel\"),\n title:\n selectedOption === SelectedOption.Image\n ? t(\"dialogTitleImage\")\n : selectedOption === SelectedOption.Video\n ? t(\"dialogTitleVideo\")\n : selectedOption === SelectedOption.Variable\n ? t(\"dialogTitleVariable\")\n : t(\"dialogTitle\"),\n }}\n >\n {selectedOption === SelectedOption.Image && (\n <ImageInject\n value={selectContentInfo?.value}\n onSelect={handleSelectImage}\n uploadProps={uploadProps}\n />\n )}\n {selectedOption === SelectedOption.Video && (\n <VideoInject\n value={selectContentInfo?.value}\n onSelect={handleSelectVideo}\n />\n )}\n </CustomDialog>\n )}\n\n {!disabled && !questionMode && (\n <CustomPopover dir={portalDirection} lang={portalLanguage}>\n <VariableSelect\n variables={variables}\n systemVariables={systemVariables}\n selectedName={selectContentInfo?.value?.variableName}\n onSelect={handleSelectVariable}\n onAddVariable={(variable) => {\n setVariables((prev) => {\n const normalized = variable.name;\n const exists = prev.some(\n (item) => item.name === normalized\n );\n if (exists) {\n return prev;\n }\n return [variable, ...prev];\n });\n }}\n />\n </CustomPopover>\n )}\n </EditorContext.Provider>\n </div>\n </div>\n );\n};\n\nexport default Editor;\n"],"names":["i18next","editorLocaleResources","lng","resource","initReactI18next","DEFAULT_EDITOR_LOCALE","EMPTY_VARIABLES","isCursorInsideVariableExpression","content","cursorPosition","marker","findDocumentVariableMarkers","buildVariableTemplate","variableName","formatVariableReference","Editor","editMode","questionMode","initialVariables","initialSystemVariables","onChange","onBlur","locale","lang","uploadProps","disabled","toolbarActionsRight","onReady","t","i18n","useTranslation","resolvedLocale","normalizeMarkdownFlowLocale","direction","getMarkdownFlowDirection","language","getMarkdownFlowLanguage","useEffect","currentStrings","getEditorLocaleMessages","toolbarLabels","useMemo","variableSearchLabels","placeholderText","normalizedSystemVariables","seen","variable","name","normalizeVariableName","normalizedCustomVariables","systemNameSet","dialogOpen","setDialogOpen","useState","popoverOpen","setPopoverOpen","editorRootRef","useRef","portalLanguage","useDetachedLanguage","portalDirection","useResolvedDirection","popoverPosition","setPopoverPosition","variables","setVariables","systemVariables","setSystemVariables","selectedOption","setSelectedOption","SelectedOption","selectContentInfo","setSelectContentInfo","editorViewRef","pendingVariableContentRef","variableSearchAnchorRef","variableSearchOpen","setVariableSearchOpen","closeVariableSearch","useCallback","handleVariableSearchToggle","button","editorContextValue","addVariablesFromContent","text","names","extractVariableNames","prev","existingNames","addedNames","newVariables","rawName","normalized","onSelectedOption","option","state","pos","coords","insertText","dispatch","from","replaceSelection","selection","focusEditor","getContent","setContent","view","deleteSelectedContent","to","insertVariableContent","range","placeCursorAtEnd","template","cursorOffset","insertVariableTemplate","insertConfirmOutputMarker","insertLinkTemplate","insertButtonTemplate","insertSingleChoiceTemplate","optionLabel1","optionLabel2","insertMultiChoiceTemplate","insertInputFieldTemplate","placeholder","handleSelectImage","resourceUrl","resourceTitle","scalePercent","textToInsert","getImageContentToInsert","handleSelectVideo","getVideoContentToInsert","handleSelectVariable","selectionRange","slashCommandsExtension","autocompletion","createSlashCommands","handleEditorUpdate","update","docText","handleTagClick","event","type","dataset","target","value","parseContentInfo","rect","anchorDirection","handleWrap","e","imagePlaceholderTitle","videoPlaceholderTitle","mediaPlaceholderLabelsExtension","mediaPlaceholderLabels","editorExtensions","extensions","EditorView","markdown","syntaxHighlighting","defaultHighlightStyle","QuestionSyntaxHighlighter","SyntaxHighlighter","ImgPlaceholder","VideoPlaceholder","VariablePlaceholder","handleContentChange","isVariableSearchOpen","editorApi","handleToolbarActionClick","action","toolbarRightSlot","jsx","ariaLabel","jsxs","wrapped","Tooltip","TooltipTrigger","TooltipContent","EditorToolbar","VariableSearchDropdown","EditorContext","CodeMirror","CustomDialog","ImageInject","VideoInject","CustomPopover","VariableSelect","item"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"MarkdownFlowEditor.cjs","sources":["../../../src/components/MarkdownFlowEditor/MarkdownFlowEditor.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState, useCallback, useRef, useEffect, useMemo } from \"react\";\nimport CodeMirror from \"@uiw/react-codemirror\";\nimport { autocompletion } from \"@codemirror/autocomplete\";\nimport { EditorView, ViewUpdate } from \"@codemirror/view\";\nimport { markdown } from \"@codemirror/lang-markdown\";\nimport {\n syntaxHighlighting,\n defaultHighlightStyle,\n} from \"@codemirror/language\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"../ui/tooltip\";\nimport CustomDialog from \"./components/CustomDialog\";\nimport EditorToolbar from \"./components/EditorToolbar\";\nimport EditorContext from \"./editor-context\";\nimport ImageInject from \"./components/ImageInject\";\nimport VideoInject from \"./components/VideoInject\";\nimport {\n SelectedOption,\n IEditorContext,\n Variable,\n SelectContentInfo,\n EditorAction,\n EditorApi,\n} from \"./types\";\nimport \"./markdownFlowEditor.css\";\n\nimport {\n createSlashCommands,\n parseContentInfo,\n getImageContentToInsert,\n getVideoContentToInsert,\n} from \"./utils\";\nimport ImgPlaceholder from \"./plugins/ImgPlaceholder\";\nimport VideoPlaceholder from \"./plugins/VideoPlaceholder\";\nimport { mediaPlaceholderLabels } from \"./plugins/mediaPlaceholderLabels\";\nimport SyntaxHighlighter from \"./plugins/SyntaxHighlighter\";\n// import createFixedTextPlaceholder from \"./plugins/FixedTextPlaceholder\";\n// import DividerPlaceholder from \"./plugins/DividerPlaceholder\";\nimport { initReactI18next, useTranslation } from \"react-i18next\";\nimport i18next from \"i18next\";\nimport { UploadProps } from \"./uploadTypes\";\nimport {\n DEFAULT_EDITOR_LOCALE,\n editorLocaleResources,\n getEditorLocaleMessages,\n} from \"./editorI18n\";\nimport {\n getMarkdownFlowDirection,\n getMarkdownFlowLanguage,\n normalizeMarkdownFlowLocale,\n type MarkdownFlowLocale,\n} from \"../../lib/locale\";\nimport { useDetachedLanguage } from \"../../lib/useDetachedLanguage\";\nimport { useResolvedDirection } from \"../../lib/useResolvedDirection\";\n\nif (!i18next.isInitialized) {\n i18next.use(initReactI18next).init({\n resources: editorLocaleResources,\n lng: DEFAULT_EDITOR_LOCALE,\n fallbackLng: DEFAULT_EDITOR_LOCALE,\n interpolation: { escapeValue: false },\n });\n} else {\n Object.entries(editorLocaleResources).forEach(([lng, resource]) => {\n i18next.addResourceBundle(\n lng,\n \"translation\",\n resource.translation,\n true,\n true\n );\n });\n}\n\nexport enum EditMode {\n CodeEdit = \"codeEdit\",\n QuickEdit = \"quickEdit\",\n}\n\ntype EditorProps = {\n content?: string;\n editMode?: EditMode;\n /** @deprecated Variable picking is no longer supported. Retained for compatibility. */\n variables?: Variable[];\n /** @deprecated Variable picking is no longer supported. Retained for compatibility. */\n systemVariables?: Variable[];\n onChange?: (value: string) => void;\n onBlur?: () => void;\n locale?: MarkdownFlowLocale;\n /** Overrides the locale-derived language. */\n lang?: string;\n uploadProps?: UploadProps;\n disabled?: boolean;\n toolbarActionsRight?: EditorAction[];\n onReady?: (api: EditorApi) => void;\n};\n\nconst Editor: React.FC<EditorProps> = ({\n content = \"\",\n editMode = EditMode.CodeEdit,\n onChange,\n onBlur,\n locale,\n lang,\n uploadProps,\n disabled = false,\n toolbarActionsRight,\n onReady,\n}) => {\n const { t, i18n } = useTranslation();\n const resolvedLocale = normalizeMarkdownFlowLocale(\n locale ?? DEFAULT_EDITOR_LOCALE\n );\n const direction = getMarkdownFlowDirection(locale);\n const language = lang ?? getMarkdownFlowLanguage(locale);\n\n useEffect(() => {\n if (i18n.language !== resolvedLocale) {\n i18n.changeLanguage(resolvedLocale);\n }\n }, [i18n, resolvedLocale]);\n\n const currentStrings = getEditorLocaleMessages(resolvedLocale);\n const toolbarLabels = useMemo(\n () => ({\n image: t(\"toolbarInsertImage\", {\n defaultValue: \"Insert image\",\n }),\n video: t(\"toolbarInsertVideo\", {\n defaultValue: \"Insert video\",\n }),\n confirmOutput: t(\"toolbarConfirmOutput\", {\n defaultValue: \"Confirm output\",\n }),\n insertLink: t(\"toolbarInsertLink\", {\n defaultValue: \"Insert link\",\n }),\n insertButton: t(\"toolbarInsertButton\", {\n defaultValue: \"Insert button\",\n }),\n insertSingleChoice: t(\"toolbarInsertSingleChoice\", {\n defaultValue: \"Insert single choice\",\n }),\n insertMultiChoice: t(\"toolbarInsertMultiChoice\", {\n defaultValue: \"Insert multi choice\",\n }),\n insertInput: t(\"toolbarInsertInput\", {\n defaultValue: \"Insert input\",\n }),\n singleChoiceOption1: t(\"toolbarChoiceOption1\", {\n defaultValue: \"Option 1\",\n }),\n singleChoiceOption2: t(\"toolbarChoiceOption2\", {\n defaultValue: \"Option 2\",\n }),\n inputPlaceholder: t(\"toolbarInputPlaceholder\", {\n defaultValue: \"Please enter\",\n }),\n }),\n [t]\n );\n const placeholderText =\n editMode === EditMode.QuickEdit\n ? t(\"placeholderQuickEdit\", {\n defaultValue: t(\"placeholderCodeEdit\", {\n defaultValue: t(\"placeholder\"),\n }),\n })\n : t(\"placeholderCodeEdit\", { defaultValue: t(\"placeholder\") });\n const [dialogOpen, setDialogOpen] = useState(false);\n const editorRootRef = useRef<HTMLDivElement>(null);\n const portalLanguage = useDetachedLanguage(editorRootRef, language);\n const { resolvedDirection: portalDirection } = useResolvedDirection(\n editorRootRef,\n direction\n );\n const [selectedOption, setSelectedOption] = useState<SelectedOption>(\n SelectedOption.Empty\n );\n const [selectContentInfo, setSelectContentInfo] =\n useState<SelectContentInfo | null>();\n const editorViewRef = useRef<EditorView | null>(null);\n const editorContextValue: IEditorContext = {\n selectedOption,\n setSelectedOption,\n dialogOpen,\n setDialogOpen,\n };\n\n useEffect(() => {\n if (!disabled) {\n return;\n }\n setDialogOpen(false);\n setSelectedOption(SelectedOption.Empty);\n setSelectContentInfo(null);\n }, [disabled, setDialogOpen, setSelectedOption, setSelectContentInfo]);\n\n // const insertFixedText = useCallback(() => {\n // if (!editorViewRef.current) return;\n // const view = editorViewRef.current;\n // const { state, dispatch } = view;\n // const selection = state.selection.main;\n // const selectedText = state.sliceDoc(selection.from, selection.to);\n // const startTag = \"===\";\n // const endTag = \"===\";\n // const insertContent = `${startTag}${selectedText ?? \"\"}${endTag}`;\n\n // dispatch({\n // changes: {\n // from: selection.from,\n // to: selection.to,\n // insert: insertContent,\n // },\n // selection: {\n // anchor: selection.from + startTag.length + (selectedText?.length ?? 0),\n // },\n // });\n // view.focus();\n // }, []);\n\n // const insertDivider = useCallback(() => {\n // if (!editorViewRef.current) return;\n // const view = editorViewRef.current;\n // const { state, dispatch } = view;\n // const selection = state.selection.main;\n // const insertContent = `\\n\\n---\\n\\n`;\n\n // dispatch({\n // changes: {\n // from: selection.from,\n // to: selection.to,\n // insert: insertContent,\n // },\n // selection: {\n // anchor: selection.from + insertContent.length,\n // },\n // });\n // view.focus();\n // }, []);\n\n const onSelectedOption = useCallback(\n (option: SelectedOption) => {\n if (disabled) {\n return;\n }\n // if (option === SelectedOption.FixedText) {\n // insertFixedText();\n // setSelectedOption(SelectedOption.Empty);\n // setDialogOpen(false);\n // setSelectContentInfo(null);\n // return;\n // }\n\n // if (option === SelectedOption.Divider) {\n // insertDivider();\n // setSelectedOption(SelectedOption.Empty);\n // setDialogOpen(false);\n // setSelectContentInfo(null);\n // return;\n // }\n\n setSelectedOption(option);\n\n setDialogOpen(true);\n },\n [disabled]\n );\n\n const insertText = useCallback(\n (text: string) => {\n if (disabled || !editorViewRef.current) return;\n\n const { state, dispatch } = editorViewRef.current;\n const from = state.selection.main.from;\n\n dispatch({\n changes: { from, insert: text },\n selection: { anchor: from + text.length },\n });\n },\n [editorViewRef, disabled]\n );\n\n const replaceSelection = useCallback(\n (text: string) => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const { state, dispatch } = editorViewRef.current;\n const selection = state.selection.main;\n dispatch({\n changes: { from: selection.from, to: selection.to, insert: text },\n selection: { anchor: selection.from + text.length },\n });\n },\n [disabled]\n );\n\n const focusEditor = useCallback(() => {\n editorViewRef.current?.focus();\n }, []);\n\n const getContent = useCallback(() => {\n return editorViewRef.current?.state.doc.toString() ?? \"\";\n }, []);\n\n const setContent = useCallback(\n (text: string) => {\n if (disabled) {\n return;\n }\n if (!editorViewRef.current) {\n onChange?.(text);\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n dispatch({\n changes: { from: 0, to: state.doc.length, insert: text },\n selection: { anchor: text.length },\n });\n },\n [disabled, onChange]\n );\n\n const deleteSelectedContent = useCallback(() => {\n if (disabled) {\n return;\n }\n if (\n !selectContentInfo ||\n !editorViewRef.current ||\n selectContentInfo.from === -1\n )\n return;\n\n const { from, to } = selectContentInfo;\n const { dispatch } = editorViewRef.current;\n\n dispatch({\n changes: { from, to, insert: \"\" },\n });\n }, [selectContentInfo, editorViewRef, disabled]);\n\n const insertConfirmOutputMarker = useCallback(() => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n const selection = state.selection.main;\n const template = \"======\";\n dispatch({\n changes: {\n from: selection.from,\n to: selection.to,\n insert: template,\n },\n selection: {\n anchor: selection.from + 3,\n },\n });\n view.focus();\n }, [disabled]);\n\n const insertLinkTemplate = useCallback(() => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n const selection = state.selection.main;\n const template = \"[]()\";\n dispatch({\n changes: {\n from: selection.from,\n to: selection.to,\n insert: template,\n },\n selection: {\n anchor: selection.from + 1,\n },\n });\n view.focus();\n }, [disabled]);\n\n const insertButtonTemplate = useCallback(() => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n const selection = state.selection.main;\n const template = \"?[]\";\n dispatch({\n changes: {\n from: selection.from,\n to: selection.to,\n insert: template,\n },\n selection: {\n anchor: selection.from + 2,\n },\n });\n view.focus();\n }, [disabled]);\n\n const insertSingleChoiceTemplate = useCallback(() => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n const selection = state.selection.main;\n const optionLabel1 = toolbarLabels.singleChoiceOption1;\n const optionLabel2 = toolbarLabels.singleChoiceOption2;\n const template = `?[%{{ }} ${optionLabel1} | ${optionLabel2}]`;\n dispatch({\n changes: {\n from: selection.from,\n to: selection.to,\n insert: template,\n },\n selection: {\n anchor: selection.from + 6,\n },\n });\n view.focus();\n }, [\n disabled,\n toolbarLabels.singleChoiceOption1,\n toolbarLabels.singleChoiceOption2,\n ]);\n\n const insertMultiChoiceTemplate = useCallback(() => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n const selection = state.selection.main;\n const optionLabel1 = toolbarLabels.singleChoiceOption1;\n const optionLabel2 = toolbarLabels.singleChoiceOption2;\n const template = `?[%{{ }} ${optionLabel1} || ${optionLabel2}]`;\n dispatch({\n changes: {\n from: selection.from,\n to: selection.to,\n insert: template,\n },\n selection: {\n anchor: selection.from + 6,\n },\n });\n view.focus();\n }, [\n disabled,\n toolbarLabels.singleChoiceOption1,\n toolbarLabels.singleChoiceOption2,\n ]);\n\n const insertInputFieldTemplate = useCallback(() => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n const selection = state.selection.main;\n const placeholder = toolbarLabels.inputPlaceholder ?? \"请输入\";\n const template = `?[%{{ }}...${placeholder}]`;\n dispatch({\n changes: {\n from: selection.from,\n to: selection.to,\n insert: template,\n },\n selection: {\n anchor: selection.from + 6,\n },\n });\n view.focus();\n }, [disabled, toolbarLabels.inputPlaceholder]);\n\n const handleSelectImage = useCallback(\n ({\n resourceUrl,\n resourceTitle,\n scalePercent,\n }: {\n resourceUrl?: string;\n resourceTitle?: string;\n scalePercent?: number;\n }) => {\n if (!resourceUrl || disabled) return;\n const textToInsert = getImageContentToInsert({\n resourceUrl,\n resourceTitle,\n scalePercent,\n });\n if (selectContentInfo?.type === SelectedOption.Image) {\n deleteSelectedContent();\n if (!editorViewRef.current) return;\n const { dispatch } = editorViewRef.current;\n dispatch({\n changes: { from: selectContentInfo.from, insert: textToInsert },\n });\n } else {\n insertText(textToInsert);\n }\n setDialogOpen(false);\n },\n [deleteSelectedContent, disabled, insertText, selectContentInfo]\n );\n\n const handleSelectVideo = useCallback(\n ({\n resourceUrl,\n resourceTitle,\n }: {\n resourceUrl: string;\n resourceTitle: string;\n }) => {\n if (disabled) {\n return;\n }\n const textToInsert = getVideoContentToInsert(resourceUrl, resourceTitle);\n if (selectContentInfo?.type === SelectedOption.Video) {\n deleteSelectedContent();\n if (!editorViewRef.current) return;\n const { dispatch } = editorViewRef.current;\n dispatch({\n changes: { from: selectContentInfo.from, insert: textToInsert },\n });\n } else {\n insertText(textToInsert);\n }\n setDialogOpen(false);\n },\n [deleteSelectedContent, disabled, insertText, selectContentInfo]\n );\n\n const slashCommandsExtension = useCallback(() => {\n return autocompletion({\n override: [\n createSlashCommands(onSelectedOption, {\n // divider: currentStrings.slashDivider,\n // fixedText: currentStrings.slashFixedText,\n image: currentStrings.slashImage,\n video: currentStrings.slashVideo,\n }),\n ],\n });\n }, [\n // currentStrings.slashDivider,\n // currentStrings.slashFixedText,\n currentStrings.slashImage,\n currentStrings.slashVideo,\n onSelectedOption,\n ]);\n\n // const fixedTextPlaceholderExtension = useMemo(\n // () =>\n // createFixedTextPlaceholder(\n // currentStrings.fixedTextPlaceholder ?? \"添加固定文本\",\n // currentStrings.fixedTextTooltip ??\n // currentStrings.slashFixedText ??\n // \"固定文本\"\n // ),\n // [\n // currentStrings.fixedTextPlaceholder,\n // currentStrings.fixedTextTooltip,\n // currentStrings.slashFixedText,\n // ]\n // );\n\n const handleEditorUpdate = useCallback((update: ViewUpdate) => {\n editorViewRef.current = update.view;\n }, []);\n\n const handleTagClick = useCallback(\n (event: any) => {\n event.stopPropagation();\n if (disabled) {\n return;\n }\n const { type, from, to, dataset } = event.detail;\n const value = parseContentInfo(type, dataset);\n setSelectContentInfo({\n type,\n value,\n from,\n to,\n });\n setSelectedOption(type);\n\n setDialogOpen(true);\n },\n [disabled]\n );\n\n useEffect(() => {\n if (!dialogOpen) {\n setSelectedOption(SelectedOption.Empty);\n setSelectContentInfo(null);\n }\n }, [dialogOpen]);\n\n useEffect(() => {\n const handleWrap = (e: any) => {\n if (e.detail.view === editorViewRef.current) {\n handleTagClick(e);\n }\n };\n window.addEventListener(\"globalTagClick\", handleWrap);\n return () => {\n window.removeEventListener(\"globalTagClick\", handleWrap);\n };\n }, [handleTagClick]);\n\n const imagePlaceholderTitle = t(\"imageDefaultTitle\");\n const videoPlaceholderTitle = t(\"videoDefaultTitle\");\n const mediaPlaceholderLabelsExtension = useMemo(\n () =>\n mediaPlaceholderLabels.of({\n image: imagePlaceholderTitle,\n video: videoPlaceholderTitle,\n }),\n [imagePlaceholderTitle, videoPlaceholderTitle]\n );\n\n const editorExtensions = useMemo(() => {\n const extensions = [\n EditorView.lineWrapping,\n markdown(),\n syntaxHighlighting(defaultHighlightStyle),\n SyntaxHighlighter,\n ];\n\n if (!disabled) {\n extensions.push(slashCommandsExtension());\n }\n\n if (editMode === EditMode.QuickEdit) {\n extensions.push(\n mediaPlaceholderLabelsExtension,\n ImgPlaceholder,\n VideoPlaceholder\n // fixedTextPlaceholderExtension,\n // DividerPlaceholder,\n );\n }\n\n extensions.push(\n EditorView.updateListener.of((update) => {\n handleEditorUpdate(update);\n })\n );\n\n return extensions;\n }, [\n disabled,\n editMode,\n slashCommandsExtension,\n handleEditorUpdate,\n mediaPlaceholderLabelsExtension,\n ]);\n\n const handleContentChange = useCallback(\n (value: string) => {\n if (disabled) {\n return;\n }\n onChange?.(value);\n },\n [onChange, disabled]\n );\n\n const editorApi = useMemo(\n () => ({\n insertTextAtCursor: insertText,\n replaceSelection,\n focus: focusEditor,\n getContent,\n setContent,\n }),\n [focusEditor, getContent, insertText, replaceSelection, setContent]\n );\n\n const handleToolbarActionClick = useCallback(\n (action: EditorAction) => {\n if (disabled || \"render\" in action) {\n return;\n }\n action.onClick?.(editorApi);\n },\n [disabled, editorApi]\n );\n\n const toolbarRightSlot = useMemo(() => {\n if (!toolbarActionsRight?.length) {\n return null;\n }\n return (\n <div className=\"markdown-flow-editor-toolbar-right\">\n {toolbarActionsRight.map((action) => {\n if (\"render\" in action) {\n return (\n <div\n className=\"markdown-flow-editor-toolbar-right-item\"\n key={action.key}\n >\n {action.render(editorApi)}\n </div>\n );\n }\n const ariaLabel = action.label || action.tooltip || undefined;\n const button = (\n <button\n type=\"button\"\n key={action.key}\n disabled={disabled || action.disabled}\n onClick={() => handleToolbarActionClick(action)}\n className=\"markdown-flow-editor-toolbar-right-button\"\n aria-label={ariaLabel}\n title={action.label || action.tooltip}\n >\n {action.icon ? (\n <span className=\"toolbar-right-icon\">{action.icon}</span>\n ) : null}\n {action.label ? (\n <span className=\"toolbar-right-label\">{action.label}</span>\n ) : null}\n </button>\n );\n const wrapped = action.tooltip ? (\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent\n side=\"top\"\n dir={portalDirection}\n lang={portalLanguage}\n >\n {action.tooltip}\n </TooltipContent>\n </Tooltip>\n ) : (\n button\n );\n return (\n <div\n className=\"markdown-flow-editor-toolbar-right-item\"\n key={action.key}\n >\n {wrapped}\n </div>\n );\n })}\n </div>\n );\n }, [\n disabled,\n editorApi,\n handleToolbarActionClick,\n portalDirection,\n portalLanguage,\n toolbarActionsRight,\n ]);\n\n useEffect(() => {\n onReady?.(editorApi);\n }, [editorApi]);\n\n return (\n <div\n className=\"markdown-flow-editor\"\n ref={editorRootRef}\n dir={direction}\n lang={language}\n data-disabled={disabled ? \"true\" : undefined}\n aria-disabled={disabled}\n >\n <EditorToolbar\n disabled={disabled}\n labels={toolbarLabels}\n tooltipDirection={portalDirection}\n tooltipLanguage={portalLanguage}\n onSelect={onSelectedOption}\n onInsertConfirmOutput={insertConfirmOutputMarker}\n onInsertLink={insertLinkTemplate}\n onInsertButton={insertButtonTemplate}\n onInsertSingleChoice={insertSingleChoiceTemplate}\n onInsertMultiChoice={insertMultiChoiceTemplate}\n onInsertInputField={insertInputFieldTemplate}\n rightSlot={toolbarRightSlot}\n />\n <div className=\"markdown-flow-editor-body relative overflow-auto\">\n <EditorContext.Provider value={editorContextValue}>\n <CodeMirror\n extensions={editorExtensions}\n basicSetup={{\n lineNumbers: false,\n searchKeymap: false,\n syntaxHighlighting: true,\n highlightActiveLine: true,\n highlightActiveLineGutter: true,\n foldGutter: false,\n }}\n className=\"rounded-md\"\n placeholder={placeholderText}\n value={content}\n theme=\"light\"\n minHeight=\"2rem\"\n editable={!disabled}\n onChange={handleContentChange}\n onBlur={onBlur}\n />\n {!disabled && (\n <CustomDialog\n dir={portalDirection}\n lang={portalLanguage}\n labels={{\n closeButtonLabel: t(\"dialogCloseLabel\"),\n title:\n selectedOption === SelectedOption.Image\n ? t(\"dialogTitleImage\")\n : selectedOption === SelectedOption.Video\n ? t(\"dialogTitleVideo\")\n : t(\"dialogTitle\"),\n }}\n >\n {selectedOption === SelectedOption.Image && (\n <ImageInject\n value={selectContentInfo?.value}\n onSelect={handleSelectImage}\n uploadProps={uploadProps}\n />\n )}\n {selectedOption === SelectedOption.Video && (\n <VideoInject\n value={selectContentInfo?.value}\n onSelect={handleSelectVideo}\n />\n )}\n </CustomDialog>\n )}\n </EditorContext.Provider>\n </div>\n </div>\n );\n};\n\nexport default Editor;\n"],"names":["i18next","editorLocaleResources","lng","resource","initReactI18next","DEFAULT_EDITOR_LOCALE","Editor","content","editMode","onChange","onBlur","locale","lang","uploadProps","disabled","toolbarActionsRight","onReady","t","i18n","useTranslation","resolvedLocale","normalizeMarkdownFlowLocale","direction","getMarkdownFlowDirection","language","getMarkdownFlowLanguage","useEffect","currentStrings","getEditorLocaleMessages","toolbarLabels","useMemo","placeholderText","dialogOpen","setDialogOpen","useState","editorRootRef","useRef","portalLanguage","useDetachedLanguage","portalDirection","useResolvedDirection","selectedOption","setSelectedOption","SelectedOption","selectContentInfo","setSelectContentInfo","editorViewRef","editorContextValue","onSelectedOption","useCallback","option","insertText","text","state","dispatch","from","replaceSelection","selection","focusEditor","getContent","setContent","view","deleteSelectedContent","to","insertConfirmOutputMarker","insertLinkTemplate","insertButtonTemplate","insertSingleChoiceTemplate","optionLabel1","optionLabel2","template","insertMultiChoiceTemplate","insertInputFieldTemplate","handleSelectImage","resourceUrl","resourceTitle","scalePercent","textToInsert","getImageContentToInsert","handleSelectVideo","getVideoContentToInsert","slashCommandsExtension","autocompletion","createSlashCommands","handleEditorUpdate","update","handleTagClick","event","type","dataset","value","parseContentInfo","handleWrap","e","imagePlaceholderTitle","videoPlaceholderTitle","mediaPlaceholderLabelsExtension","mediaPlaceholderLabels","editorExtensions","extensions","EditorView","markdown","syntaxHighlighting","defaultHighlightStyle","SyntaxHighlighter","ImgPlaceholder","VideoPlaceholder","handleContentChange","editorApi","handleToolbarActionClick","action","toolbarRightSlot","jsx","ariaLabel","button","jsxs","wrapped","Tooltip","TooltipTrigger","TooltipContent","EditorToolbar","EditorContext","CodeMirror","CustomDialog","ImageInject","VideoInject"],"mappings":"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"}
|
|
@@ -8,9 +8,9 @@ export declare enum EditMode {
|
|
|
8
8
|
type EditorProps = {
|
|
9
9
|
content?: string;
|
|
10
10
|
editMode?: EditMode;
|
|
11
|
-
/**
|
|
12
|
-
questionMode?: boolean;
|
|
11
|
+
/** @deprecated Variable picking is no longer supported. Retained for compatibility. */
|
|
13
12
|
variables?: Variable[];
|
|
13
|
+
/** @deprecated Variable picking is no longer supported. Retained for compatibility. */
|
|
14
14
|
systemVariables?: Variable[];
|
|
15
15
|
onChange?: (value: string) => void;
|
|
16
16
|
onBlur?: () => void;
|