markdown-flow-ui 0.2.14 → 0.2.16-dev.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -0
- package/dist/assets/markdown-flow-ui.css +10 -1
- package/dist/components/ContentRender/CodeBlock.cjs +1 -1
- package/dist/components/ContentRender/CodeBlock.cjs.map +1 -1
- package/dist/components/ContentRender/CodeBlock.d.ts +5 -0
- package/dist/components/ContentRender/CodeBlock.es.js +41 -38
- package/dist/components/ContentRender/CodeBlock.es.js.map +1 -1
- package/dist/components/ContentRender/ContentRender.cjs +2 -2
- package/dist/components/ContentRender/ContentRender.cjs.map +1 -1
- package/dist/components/ContentRender/ContentRender.d.ts +12 -4
- package/dist/components/ContentRender/ContentRender.es.js +436 -306
- package/dist/components/ContentRender/ContentRender.es.js.map +1 -1
- package/dist/components/ContentRender/IframeSandbox.cjs +7 -7
- package/dist/components/ContentRender/IframeSandbox.cjs.map +1 -1
- package/dist/components/ContentRender/IframeSandbox.d.ts +5 -1
- package/dist/components/ContentRender/IframeSandbox.es.js +311 -266
- package/dist/components/ContentRender/IframeSandbox.es.js.map +1 -1
- package/dist/components/ContentRender/MarkdownFlowInput.cjs +1 -1
- package/dist/components/ContentRender/MarkdownFlowInput.cjs.map +1 -1
- package/dist/components/ContentRender/MarkdownFlowInput.d.ts +5 -1
- package/dist/components/ContentRender/MarkdownFlowInput.es.js +37 -32
- package/dist/components/ContentRender/MarkdownFlowInput.es.js.map +1 -1
- package/dist/components/ContentRender/SandboxApp.cjs +2 -2
- package/dist/components/ContentRender/SandboxApp.cjs.map +1 -1
- package/dist/components/ContentRender/SandboxApp.d.ts +5 -1
- package/dist/components/ContentRender/SandboxApp.es.js +108 -103
- package/dist/components/ContentRender/SandboxApp.es.js.map +1 -1
- package/dist/components/ContentRender/blackboard-vendor.d.ts +1 -1
- package/dist/components/ContentRender/contentRenderI18n.cjs +1 -1
- package/dist/components/ContentRender/contentRenderI18n.cjs.map +1 -1
- package/dist/components/ContentRender/contentRenderI18n.d.ts +6 -1
- package/dist/components/ContentRender/contentRenderI18n.es.js +5 -56
- package/dist/components/ContentRender/contentRenderI18n.es.js.map +1 -1
- package/dist/components/ContentRender/contentRenderI18n.test.d.ts +1 -0
- package/dist/components/ContentRender/index.cjs +1 -1
- package/dist/components/ContentRender/index.d.ts +11 -11
- package/dist/components/ContentRender/index.es.js +1 -2
- package/dist/components/ContentRender/index.es.js.map +1 -1
- package/dist/components/ContentRender/locales/contentRender.json.cjs +2 -0
- package/dist/components/ContentRender/locales/contentRender.json.cjs.map +1 -0
- package/dist/components/ContentRender/locales/contentRender.json.d.ts +90 -0
- package/dist/components/ContentRender/locales/contentRender.json.es.js +11 -0
- package/dist/components/ContentRender/locales/contentRender.json.es.js.map +1 -0
- package/dist/components/ContentRender/plugins/CustomVariable.cjs +1 -1
- package/dist/components/ContentRender/plugins/CustomVariable.cjs.map +1 -1
- package/dist/components/ContentRender/plugins/CustomVariable.d.ts +7 -3
- package/dist/components/ContentRender/plugins/CustomVariable.es.js +165 -151
- package/dist/components/ContentRender/plugins/CustomVariable.es.js.map +1 -1
- package/dist/components/ContentRender/plugins/MermaidChart.cjs +1 -1
- package/dist/components/ContentRender/plugins/MermaidChart.cjs.map +1 -1
- package/dist/components/ContentRender/plugins/MermaidChart.d.ts +1 -0
- package/dist/components/ContentRender/plugins/MermaidChart.es.js +68 -44
- package/dist/components/ContentRender/plugins/MermaidChart.es.js.map +1 -1
- package/dist/components/ContentRender/typewriterPacing.fixtures.d.ts +14 -0
- package/dist/components/ContentRender/utils/typewriter-pacing.cjs +3 -0
- package/dist/components/ContentRender/utils/typewriter-pacing.cjs.map +1 -0
- package/dist/components/ContentRender/utils/typewriter-pacing.d.ts +27 -0
- package/dist/components/ContentRender/utils/typewriter-pacing.es.js +98 -0
- package/dist/components/ContentRender/utils/typewriter-pacing.es.js.map +1 -0
- package/dist/components/ContentRender/utils/typewriter-pacing.test.d.ts +1 -0
- package/dist/components/MarkdownFlow/MarkdownFlow.cjs +1 -1
- package/dist/components/MarkdownFlow/MarkdownFlow.cjs.map +1 -1
- package/dist/components/MarkdownFlow/MarkdownFlow.d.ts +12 -4
- package/dist/components/MarkdownFlow/MarkdownFlow.es.js +51 -39
- package/dist/components/MarkdownFlow/MarkdownFlow.es.js.map +1 -1
- package/dist/components/MarkdownFlow/ScrollToBottomButton.cjs +1 -1
- package/dist/components/MarkdownFlow/ScrollToBottomButton.cjs.map +1 -1
- package/dist/components/MarkdownFlow/ScrollToBottomButton.d.ts +31 -1
- package/dist/components/MarkdownFlow/ScrollToBottomButton.es.js +46 -17
- package/dist/components/MarkdownFlow/ScrollToBottomButton.es.js.map +1 -1
- package/dist/components/MarkdownFlow/ScrollToBottomControl.cjs +2 -0
- package/dist/components/MarkdownFlow/ScrollToBottomControl.cjs.map +1 -0
- package/dist/components/MarkdownFlow/ScrollToBottomControl.d.ts +18 -0
- package/dist/components/MarkdownFlow/ScrollToBottomControl.es.js +47 -0
- package/dist/components/MarkdownFlow/ScrollToBottomControl.es.js.map +1 -0
- package/dist/components/MarkdownFlow/ScrollableMarkdownFlow.cjs +1 -1
- package/dist/components/MarkdownFlow/ScrollableMarkdownFlow.cjs.map +1 -1
- package/dist/components/MarkdownFlow/ScrollableMarkdownFlow.d.ts +1 -1
- package/dist/components/MarkdownFlow/ScrollableMarkdownFlow.es.js +33 -52
- package/dist/components/MarkdownFlow/ScrollableMarkdownFlow.es.js.map +1 -1
- package/dist/components/MarkdownFlow/index.cjs +1 -1
- package/dist/components/MarkdownFlow/index.d.ts +9 -6
- package/dist/components/MarkdownFlow/index.es.js +6 -6
- package/dist/components/MarkdownFlow/index.es.js.map +1 -1
- package/dist/components/MarkdownFlow/useScrollToBottom.cjs +1 -1
- package/dist/components/MarkdownFlow/useScrollToBottom.cjs.map +1 -1
- package/dist/components/MarkdownFlow/useScrollToBottom.d.ts +40 -8
- package/dist/components/MarkdownFlow/useScrollToBottom.es.js +352 -83
- package/dist/components/MarkdownFlow/useScrollToBottom.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/MarkdownFlowEditor.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/MarkdownFlowEditor.cjs.map +1 -1
- package/dist/components/MarkdownFlowEditor/MarkdownFlowEditor.d.ts +5 -3
- package/dist/components/MarkdownFlowEditor/MarkdownFlowEditor.es.js +371 -324
- package/dist/components/MarkdownFlowEditor/MarkdownFlowEditor.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/components/CustomDialog.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/components/CustomDialog.cjs.map +1 -1
- package/dist/components/MarkdownFlowEditor/components/CustomDialog.d.ts +10 -0
- package/dist/components/MarkdownFlowEditor/components/CustomDialog.es.js +22 -19
- package/dist/components/MarkdownFlowEditor/components/CustomDialog.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/components/CustomPopover.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/components/CustomPopover.cjs.map +1 -1
- package/dist/components/MarkdownFlowEditor/components/CustomPopover.d.ts +8 -0
- package/dist/components/MarkdownFlowEditor/components/CustomPopover.es.js +19 -15
- package/dist/components/MarkdownFlowEditor/components/CustomPopover.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/components/EditorToolbar.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/components/EditorToolbar.cjs.map +1 -1
- package/dist/components/MarkdownFlowEditor/components/EditorToolbar.d.ts +4 -1
- package/dist/components/MarkdownFlowEditor/components/EditorToolbar.es.js +99 -93
- package/dist/components/MarkdownFlowEditor/components/EditorToolbar.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/components/ImageInject.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/components/ImageInject.cjs.map +1 -1
- package/dist/components/MarkdownFlowEditor/components/ImageInject.d.ts +1 -1
- package/dist/components/MarkdownFlowEditor/components/ImageInject.es.js +183 -182
- package/dist/components/MarkdownFlowEditor/components/ImageInject.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/components/VariableSearchDropdown.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/components/VariableSearchDropdown.cjs.map +1 -1
- package/dist/components/MarkdownFlowEditor/components/VariableSearchDropdown.d.ts +1 -1
- package/dist/components/MarkdownFlowEditor/components/VariableSearchDropdown.es.js +107 -103
- package/dist/components/MarkdownFlowEditor/components/VariableSearchDropdown.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/components/VariableSelect.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/components/VariableSelect.cjs.map +1 -1
- package/dist/components/MarkdownFlowEditor/components/VariableSelect.d.ts +1 -1
- package/dist/components/MarkdownFlowEditor/components/VariableSelect.es.js +106 -106
- package/dist/components/MarkdownFlowEditor/components/VariableSelect.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/components/VideoInject.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/components/VideoInject.cjs.map +1 -1
- package/dist/components/MarkdownFlowEditor/components/VideoInject.es.js +64 -63
- package/dist/components/MarkdownFlowEditor/components/VideoInject.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/components/icons/ButtonIcon.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/components/icons/ButtonIcon.cjs.map +1 -1
- package/dist/components/MarkdownFlowEditor/components/icons/ButtonIcon.es.js +13 -13
- package/dist/components/MarkdownFlowEditor/components/icons/ButtonIcon.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/components/icons/SearchBracesIcon.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/components/icons/SearchBracesIcon.cjs.map +1 -1
- package/dist/components/MarkdownFlowEditor/components/icons/SearchBracesIcon.es.js +12 -12
- package/dist/components/MarkdownFlowEditor/components/icons/SearchBracesIcon.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/editor-context.d.ts +1 -1
- package/dist/components/MarkdownFlowEditor/editorI18n.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/editorI18n.cjs.map +1 -1
- package/dist/components/MarkdownFlowEditor/editorI18n.d.ts +290 -0
- package/dist/components/MarkdownFlowEditor/editorI18n.es.js +12 -8
- package/dist/components/MarkdownFlowEditor/editorI18n.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/editorI18n.test.d.ts +1 -0
- package/dist/components/MarkdownFlowEditor/index.d.ts +6 -6
- package/dist/components/MarkdownFlowEditor/locales/ar-SA.json.cjs +2 -0
- package/dist/components/MarkdownFlowEditor/locales/ar-SA.json.cjs.map +1 -0
- package/dist/components/MarkdownFlowEditor/locales/ar-SA.json.d.ts +72 -0
- package/dist/components/MarkdownFlowEditor/locales/ar-SA.json.es.js +140 -0
- package/dist/components/MarkdownFlowEditor/locales/ar-SA.json.es.js.map +1 -0
- package/dist/components/MarkdownFlowEditor/locales/en-US.json.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/locales/en-US.json.d.ts +2 -0
- package/dist/components/MarkdownFlowEditor/locales/en-US.json.es.js +118 -114
- package/dist/components/MarkdownFlowEditor/locales/en-US.json.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/locales/fr-FR.json.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/locales/fr-FR.json.d.ts +2 -0
- package/dist/components/MarkdownFlowEditor/locales/fr-FR.json.es.js +118 -114
- package/dist/components/MarkdownFlowEditor/locales/fr-FR.json.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/locales/th-TH.json.cjs +2 -0
- package/dist/components/MarkdownFlowEditor/locales/th-TH.json.cjs.map +1 -0
- package/dist/components/MarkdownFlowEditor/locales/th-TH.json.d.ts +72 -0
- package/dist/components/MarkdownFlowEditor/locales/th-TH.json.es.js +140 -0
- package/dist/components/MarkdownFlowEditor/locales/th-TH.json.es.js.map +1 -0
- package/dist/components/MarkdownFlowEditor/locales/zh-CN.json.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/locales/zh-CN.json.d.ts +2 -0
- package/dist/components/MarkdownFlowEditor/locales/zh-CN.json.es.js +70 -66
- package/dist/components/MarkdownFlowEditor/locales/zh-CN.json.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/plugins/ImgPlaceholder.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/plugins/ImgPlaceholder.cjs.map +1 -1
- package/dist/components/MarkdownFlowEditor/plugins/ImgPlaceholder.es.js +40 -35
- package/dist/components/MarkdownFlowEditor/plugins/ImgPlaceholder.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/plugins/PlaceholderWidget.d.ts +1 -1
- package/dist/components/MarkdownFlowEditor/plugins/VideoPlaceholder.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/plugins/VideoPlaceholder.cjs.map +1 -1
- package/dist/components/MarkdownFlowEditor/plugins/VideoPlaceholder.es.js +27 -23
- package/dist/components/MarkdownFlowEditor/plugins/VideoPlaceholder.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/plugins/mediaPlaceholderLabels.cjs +2 -0
- package/dist/components/MarkdownFlowEditor/plugins/mediaPlaceholderLabels.cjs.map +1 -0
- package/dist/components/MarkdownFlowEditor/plugins/mediaPlaceholderLabels.d.ts +7 -0
- package/dist/components/MarkdownFlowEditor/plugins/mediaPlaceholderLabels.es.js +12 -0
- package/dist/components/MarkdownFlowEditor/plugins/mediaPlaceholderLabels.es.js.map +1 -0
- package/dist/components/MarkdownFlowEditor/utils.d.ts +1 -1
- package/dist/components/Slide/MarkdownSlideScaling.cjs +1 -1
- package/dist/components/Slide/MarkdownSlideScaling.cjs.map +1 -1
- package/dist/components/Slide/MarkdownSlideScaling.d.ts +1 -1
- package/dist/components/Slide/MarkdownSlideScaling.es.js +20 -20
- package/dist/components/Slide/MarkdownSlideScaling.es.js.map +1 -1
- package/dist/components/Slide/MobilePlayerSettingsSheet.cjs +1 -1
- package/dist/components/Slide/MobilePlayerSettingsSheet.cjs.map +1 -1
- package/dist/components/Slide/MobilePlayerSettingsSheet.d.ts +7 -2
- package/dist/components/Slide/MobilePlayerSettingsSheet.es.js +61 -57
- package/dist/components/Slide/MobilePlayerSettingsSheet.es.js.map +1 -1
- package/dist/components/Slide/Player.cjs +1 -1
- package/dist/components/Slide/Player.cjs.map +1 -1
- package/dist/components/Slide/Player.d.ts +6 -6
- package/dist/components/Slide/Player.es.js +547 -541
- package/dist/components/Slide/Player.es.js.map +1 -1
- package/dist/components/Slide/Slide.cjs +1 -1
- package/dist/components/Slide/Slide.cjs.map +1 -1
- package/dist/components/Slide/Slide.d.ts +14 -12
- package/dist/components/Slide/Slide.es.js +745 -726
- package/dist/components/Slide/Slide.es.js.map +1 -1
- package/dist/components/Slide/SubtitleOverlay.cjs +1 -1
- package/dist/components/Slide/SubtitleOverlay.cjs.map +1 -1
- package/dist/components/Slide/SubtitleOverlay.d.ts +2 -2
- package/dist/components/Slide/SubtitleOverlay.es.js +17 -17
- package/dist/components/Slide/SubtitleOverlay.es.js.map +1 -1
- package/dist/components/Slide/diff-utils.d.ts +1 -1
- package/dist/components/Slide/index.d.ts +12 -12
- package/dist/components/Slide/locales/slide.json.cjs +2 -0
- package/dist/components/Slide/locales/slide.json.cjs.map +1 -0
- package/dist/components/Slide/locales/slide.json.d.ts +205 -0
- package/dist/components/Slide/locales/slide.json.es.js +11 -0
- package/dist/components/Slide/locales/slide.json.es.js.map +1 -0
- package/dist/components/Slide/slideI18n.cjs +1 -1
- package/dist/components/Slide/slideI18n.cjs.map +1 -1
- package/dist/components/Slide/slideI18n.d.ts +6 -3
- package/dist/components/Slide/slideI18n.es.js +10 -155
- package/dist/components/Slide/slideI18n.es.js.map +1 -1
- package/dist/components/Slide/useSlide.d.ts +1 -1
- package/dist/components/Slide/utils/appendedMarkerAdvance.d.ts +1 -1
- package/dist/components/Slide/utils/audioSegments.d.ts +1 -1
- package/dist/components/Slide/utils/interactionResolution.d.ts +2 -2
- package/dist/components/Slide/utils/listenModeElementList.d.ts +2 -2
- package/dist/components/Slide/utils/markdownScaling.d.ts +1 -1
- package/dist/components/Slide/utils/playerCustomActions.d.ts +2 -2
- package/dist/components/Slide/utils/playerKeyboardShortcuts.cjs +1 -1
- package/dist/components/Slide/utils/playerKeyboardShortcuts.cjs.map +1 -1
- package/dist/components/Slide/utils/playerKeyboardShortcuts.d.ts +1 -1
- package/dist/components/Slide/utils/playerKeyboardShortcuts.es.js +20 -20
- package/dist/components/Slide/utils/playerKeyboardShortcuts.es.js.map +1 -1
- package/dist/components/Slide/utils/runStreamFixture.d.ts +1 -1
- package/dist/components/Slide/utils/segmentSeek.d.ts +1 -1
- package/dist/components/Slide/utils/silentStepAutoAdvance.d.ts +1 -1
- package/dist/components/Slide/utils/streamingNavigation.d.ts +1 -1
- package/dist/components/Slide/utils/subtitleCue.d.ts +1 -1
- package/dist/components/Slide/utils/subtitleJumpNavigation.d.ts +1 -1
- package/dist/components/index.d.ts +22 -18
- package/dist/components/ui/button.cjs +1 -1
- package/dist/components/ui/button.cjs.map +1 -1
- package/dist/components/ui/button.es.js +12 -13
- package/dist/components/ui/button.es.js.map +1 -1
- package/dist/components/ui/checkbox.cjs +1 -1
- package/dist/components/ui/checkbox.cjs.map +1 -1
- package/dist/components/ui/checkbox.es.js +35 -35
- package/dist/components/ui/checkbox.es.js.map +1 -1
- package/dist/components/ui/dialog.cjs +1 -1
- package/dist/components/ui/dialog.cjs.map +1 -1
- package/dist/components/ui/dialog.d.ts +5 -1
- package/dist/components/ui/dialog.es.js +37 -37
- package/dist/components/ui/dialog.es.js.map +1 -1
- package/dist/components/ui/input.cjs +1 -1
- package/dist/components/ui/input.cjs.map +1 -1
- package/dist/components/ui/input.es.js +4 -4
- package/dist/components/ui/input.es.js.map +1 -1
- package/dist/components/ui/inputGroup/button.cjs +1 -1
- package/dist/components/ui/inputGroup/button.cjs.map +1 -1
- package/dist/components/ui/inputGroup/button.es.js +9 -10
- package/dist/components/ui/inputGroup/button.es.js.map +1 -1
- package/dist/components/ui/inputGroup/input-group.cjs +1 -1
- package/dist/components/ui/inputGroup/input-group.cjs.map +1 -1
- package/dist/components/ui/inputGroup/input-group.d.ts +1 -1
- package/dist/components/ui/inputGroup/input-group.es.js +10 -10
- package/dist/components/ui/inputGroup/input-group.es.js.map +1 -1
- package/dist/components/ui/inputGroup/textarea.cjs +1 -1
- package/dist/components/ui/inputGroup/textarea.cjs.map +1 -1
- package/dist/components/ui/inputGroup/textarea.es.js +2 -2
- package/dist/components/ui/inputGroup/textarea.es.js.map +1 -1
- package/dist/components/ui/loading-overlay-card.cjs +2 -2
- package/dist/components/ui/loading-overlay-card.cjs.map +1 -1
- package/dist/components/ui/loading-overlay-card.es.js +11 -11
- package/dist/components/ui/loading-overlay-card.es.js.map +1 -1
- package/dist/components/ui/popover.cjs +1 -1
- package/dist/components/ui/popover.cjs.map +1 -1
- package/dist/components/ui/popover.es.js +6 -6
- package/dist/components/ui/popover.es.js.map +1 -1
- package/dist/components/ui/tooltip.cjs +1 -1
- package/dist/components/ui/tooltip.cjs.map +1 -1
- package/dist/components/ui/tooltip.es.js +16 -16
- package/dist/components/ui/tooltip.es.js.map +1 -1
- package/dist/editor.d.ts +2 -2
- package/dist/fonts/KaTeX_AMS-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_AMS-Regular.woff +0 -0
- package/dist/fonts/KaTeX_AMS-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Caligraphic-Bold.ttf +0 -0
- package/dist/fonts/KaTeX_Caligraphic-Bold.woff +0 -0
- package/dist/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
- package/dist/fonts/KaTeX_Caligraphic-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_Caligraphic-Regular.woff +0 -0
- package/dist/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Fraktur-Bold.ttf +0 -0
- package/dist/fonts/KaTeX_Fraktur-Bold.woff +0 -0
- package/dist/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
- package/dist/fonts/KaTeX_Fraktur-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_Fraktur-Regular.woff +0 -0
- package/dist/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Main-Bold.ttf +0 -0
- package/dist/fonts/KaTeX_Main-Bold.woff +0 -0
- package/dist/fonts/KaTeX_Main-Bold.woff2 +0 -0
- package/dist/fonts/KaTeX_Main-BoldItalic.ttf +0 -0
- package/dist/fonts/KaTeX_Main-BoldItalic.woff +0 -0
- package/dist/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
- package/dist/fonts/KaTeX_Main-Italic.ttf +0 -0
- package/dist/fonts/KaTeX_Main-Italic.woff +0 -0
- package/dist/fonts/KaTeX_Main-Italic.woff2 +0 -0
- package/dist/fonts/KaTeX_Main-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_Main-Regular.woff +0 -0
- package/dist/fonts/KaTeX_Main-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Math-BoldItalic.ttf +0 -0
- package/dist/fonts/KaTeX_Math-BoldItalic.woff +0 -0
- package/dist/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
- package/dist/fonts/KaTeX_Math-Italic.ttf +0 -0
- package/dist/fonts/KaTeX_Math-Italic.woff +0 -0
- package/dist/fonts/KaTeX_Math-Italic.woff2 +0 -0
- package/dist/fonts/KaTeX_SansSerif-Bold.ttf +0 -0
- package/dist/fonts/KaTeX_SansSerif-Bold.woff +0 -0
- package/dist/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
- package/dist/fonts/KaTeX_SansSerif-Italic.ttf +0 -0
- package/dist/fonts/KaTeX_SansSerif-Italic.woff +0 -0
- package/dist/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
- package/dist/fonts/KaTeX_SansSerif-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_SansSerif-Regular.woff +0 -0
- package/dist/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Script-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_Script-Regular.woff +0 -0
- package/dist/fonts/KaTeX_Script-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Size1-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_Size1-Regular.woff +0 -0
- package/dist/fonts/KaTeX_Size1-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Size2-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_Size2-Regular.woff +0 -0
- package/dist/fonts/KaTeX_Size2-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Size3-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_Size3-Regular.woff +0 -0
- package/dist/fonts/KaTeX_Size3-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Size4-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_Size4-Regular.woff +0 -0
- package/dist/fonts/KaTeX_Size4-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Typewriter-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_Typewriter-Regular.woff +0 -0
- package/dist/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.es.js +22 -19
- package/dist/index.es.js.map +1 -1
- package/dist/lib/locale.cjs +1 -1
- package/dist/lib/locale.cjs.map +1 -1
- package/dist/lib/locale.d.ts +5 -1
- package/dist/lib/locale.es.js +26 -13
- package/dist/lib/locale.es.js.map +1 -1
- package/dist/lib/locale.test.d.ts +1 -0
- package/dist/lib/useDetachedLanguage.cjs +2 -0
- package/dist/lib/useDetachedLanguage.cjs.map +1 -0
- package/dist/lib/useDetachedLanguage.d.ts +3 -0
- package/dist/lib/useDetachedLanguage.es.js +25 -0
- package/dist/lib/useDetachedLanguage.es.js.map +1 -0
- package/dist/lib/useResolvedDirection.cjs +2 -0
- package/dist/lib/useResolvedDirection.cjs.map +1 -0
- package/dist/lib/useResolvedDirection.d.ts +6 -0
- package/dist/lib/useResolvedDirection.es.js +37 -0
- package/dist/lib/useResolvedDirection.es.js.map +1 -0
- package/dist/markdown-flow-ui-lib.css +1 -1
- package/dist/node_modules/@radix-ui/react-arrow/dist/index.cjs +1 -1
- package/dist/node_modules/@radix-ui/react-arrow/dist/index.cjs.map +1 -1
- package/dist/node_modules/@radix-ui/react-arrow/dist/index.es.js +6 -6
- package/dist/node_modules/@radix-ui/react-arrow/dist/index.es.js.map +1 -1
- package/dist/node_modules/@radix-ui/react-context/dist/index.cjs +1 -1
- package/dist/node_modules/@radix-ui/react-context/dist/index.cjs.map +1 -1
- package/dist/node_modules/@radix-ui/react-context/dist/index.es.js +21 -21
- package/dist/node_modules/@radix-ui/react-context/dist/index.es.js.map +1 -1
- package/dist/node_modules/@radix-ui/react-dialog/dist/index.cjs +2 -2
- package/dist/node_modules/@radix-ui/react-dialog/dist/index.cjs.map +1 -1
- package/dist/node_modules/@radix-ui/react-dialog/dist/index.es.js +100 -100
- package/dist/node_modules/@radix-ui/react-dialog/dist/index.es.js.map +1 -1
- package/dist/node_modules/@radix-ui/react-dismissable-layer/dist/index.cjs +1 -1
- package/dist/node_modules/@radix-ui/react-dismissable-layer/dist/index.cjs.map +1 -1
- package/dist/node_modules/@radix-ui/react-dismissable-layer/dist/index.es.js +38 -38
- package/dist/node_modules/@radix-ui/react-dismissable-layer/dist/index.es.js.map +1 -1
- package/dist/node_modules/@radix-ui/react-focus-scope/dist/index.cjs +1 -1
- package/dist/node_modules/@radix-ui/react-focus-scope/dist/index.cjs.map +1 -1
- package/dist/node_modules/@radix-ui/react-focus-scope/dist/index.es.js +9 -9
- package/dist/node_modules/@radix-ui/react-focus-scope/dist/index.es.js.map +1 -1
- package/dist/node_modules/@radix-ui/react-popover/dist/index.cjs +1 -1
- package/dist/node_modules/@radix-ui/react-popover/dist/index.cjs.map +1 -1
- package/dist/node_modules/@radix-ui/react-popover/dist/index.es.js +95 -95
- package/dist/node_modules/@radix-ui/react-popover/dist/index.es.js.map +1 -1
- package/dist/node_modules/@radix-ui/react-popper/dist/index.cjs +1 -1
- package/dist/node_modules/@radix-ui/react-popper/dist/index.cjs.map +1 -1
- package/dist/node_modules/@radix-ui/react-popper/dist/index.es.js +48 -48
- package/dist/node_modules/@radix-ui/react-popper/dist/index.es.js.map +1 -1
- package/dist/node_modules/@radix-ui/react-portal/dist/index.cjs +1 -1
- package/dist/node_modules/@radix-ui/react-portal/dist/index.cjs.map +1 -1
- package/dist/node_modules/@radix-ui/react-portal/dist/index.es.js +6 -6
- package/dist/node_modules/@radix-ui/react-portal/dist/index.es.js.map +1 -1
- package/dist/node_modules/@radix-ui/react-primitive/dist/index.cjs +1 -1
- package/dist/node_modules/@radix-ui/react-primitive/dist/index.cjs.map +1 -1
- package/dist/node_modules/@radix-ui/react-primitive/dist/index.es.js +9 -9
- package/dist/node_modules/@radix-ui/react-primitive/dist/index.es.js.map +1 -1
- package/dist/node_modules/@radix-ui/react-slot/dist/index.cjs +1 -1
- package/dist/node_modules/@radix-ui/react-slot/dist/index.cjs.map +1 -1
- package/dist/node_modules/@radix-ui/react-slot/dist/index.es.js +17 -17
- package/dist/node_modules/@radix-ui/react-slot/dist/index.es.js.map +1 -1
- package/dist/node_modules/@radix-ui/react-tooltip/dist/index.cjs +1 -1
- package/dist/node_modules/@radix-ui/react-tooltip/dist/index.cjs.map +1 -1
- package/dist/node_modules/@radix-ui/react-tooltip/dist/index.es.js +100 -100
- package/dist/node_modules/@radix-ui/react-tooltip/dist/index.es.js.map +1 -1
- package/dist/node_modules/@radix-ui/react-visually-hidden/dist/index.cjs +1 -1
- package/dist/node_modules/@radix-ui/react-visually-hidden/dist/index.cjs.map +1 -1
- package/dist/node_modules/@radix-ui/react-visually-hidden/dist/index.es.js +6 -6
- package/dist/node_modules/@radix-ui/react-visually-hidden/dist/index.es.js.map +1 -1
- package/dist/node_modules/@uiw/react-codemirror/esm/index.cjs +1 -1
- package/dist/node_modules/@uiw/react-codemirror/esm/index.cjs.map +1 -1
- package/dist/node_modules/@uiw/react-codemirror/esm/index.es.js +27 -27
- package/dist/node_modules/@uiw/react-codemirror/esm/index.es.js.map +1 -1
- package/dist/node_modules/lucide-react/dist/esm/icons/{chevron-down.cjs → chevrons-down.cjs} +2 -2
- package/dist/node_modules/lucide-react/dist/esm/icons/chevrons-down.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/{chevron-down.es.js → chevrons-down.es.js} +6 -3
- package/dist/node_modules/lucide-react/dist/esm/icons/chevrons-down.es.js.map +1 -0
- package/dist/node_modules/react-markdown/lib/index.cjs +1 -1
- package/dist/node_modules/react-markdown/lib/index.cjs.map +1 -1
- package/dist/node_modules/react-markdown/lib/index.es.js +39 -39
- package/dist/node_modules/react-markdown/lib/index.es.js.map +1 -1
- package/dist/renderer.cjs +1 -1
- package/dist/renderer.d.ts +18 -17
- package/dist/renderer.es.js +20 -17
- package/dist/renderer.es.js.map +1 -1
- package/dist/scroll.cjs +1 -1
- package/dist/scroll.d.ts +6 -3
- package/dist/scroll.es.js +4 -2
- package/dist/scroll.es.js.map +1 -1
- package/dist/slide.d.ts +3 -3
- package/package.json +5 -2
- package/dist/_virtual/jsx-runtime.cjs +0 -2
- package/dist/_virtual/jsx-runtime.cjs.map +0 -1
- package/dist/_virtual/jsx-runtime.es.js +0 -6
- package/dist/_virtual/jsx-runtime.es.js.map +0 -1
- package/dist/_virtual/jsx-runtime.es2.js +0 -5
- package/dist/_virtual/jsx-runtime.es2.js.map +0 -1
- package/dist/_virtual/jsx-runtime2.cjs +0 -2
- package/dist/_virtual/jsx-runtime2.cjs.map +0 -1
- package/dist/_virtual/react-jsx-runtime.development.cjs +0 -2
- package/dist/_virtual/react-jsx-runtime.development.cjs.map +0 -1
- package/dist/_virtual/react-jsx-runtime.development.es.js +0 -5
- package/dist/_virtual/react-jsx-runtime.development.es.js.map +0 -1
- package/dist/_virtual/react-jsx-runtime.production.cjs +0 -2
- package/dist/_virtual/react-jsx-runtime.production.cjs.map +0 -1
- package/dist/_virtual/react-jsx-runtime.production.es.js +0 -5
- package/dist/_virtual/react-jsx-runtime.production.es.js.map +0 -1
- package/dist/lib/localeTextMap.cjs +0 -2
- package/dist/lib/localeTextMap.cjs.map +0 -1
- package/dist/lib/localeTextMap.es.js +0 -5
- package/dist/lib/localeTextMap.es.js.map +0 -1
- package/dist/node_modules/lucide-react/dist/esm/icons/chevron-down.cjs.map +0 -1
- package/dist/node_modules/lucide-react/dist/esm/icons/chevron-down.es.js.map +0 -1
- package/dist/node_modules/react/cjs/react-jsx-runtime.development.cjs +0 -24
- package/dist/node_modules/react/cjs/react-jsx-runtime.development.cjs.map +0 -1
- package/dist/node_modules/react/cjs/react-jsx-runtime.development.es.js +0 -409
- package/dist/node_modules/react/cjs/react-jsx-runtime.development.es.js.map +0 -1
- package/dist/node_modules/react/cjs/react-jsx-runtime.production.cjs +0 -10
- package/dist/node_modules/react/cjs/react-jsx-runtime.production.cjs.map +0 -1
- package/dist/node_modules/react/cjs/react-jsx-runtime.production.es.js +0 -36
- package/dist/node_modules/react/cjs/react-jsx-runtime.production.es.js.map +0 -1
- package/dist/node_modules/react/jsx-runtime.cjs +0 -2
- package/dist/node_modules/react/jsx-runtime.cjs.map +0 -1
- package/dist/node_modules/react/jsx-runtime.es.js +0 -11
- package/dist/node_modules/react/jsx-runtime.es.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ImageInject.es.js","sources":["../../../../src/components/MarkdownFlowEditor/components/ImageInject.tsx"],"sourcesContent":["/** inject image to mc-editor */\nimport React, { useContext, useEffect, useMemo, useState } from \"react\";\nimport { Button } from \"../../ui/button\";\nimport { Input } from \"../../ui/input\";\nimport { useTranslation } from \"react-i18next\";\nimport { Loader2, Upload } from \"lucide-react\";\n\nimport EditorContext from \"../editor-context\";\nimport { isValidImageUrl, sanitizeImageUrl } from \"../utils/image\";\nimport { UploadProps, UploadRequestOption } from \"../uploadTypes\";\n\nexport type ImageResource = {\n resourceUrl: string;\n resourceTitle?: string;\n scalePercent?: number;\n};\n\nexport interface ImageInjectProps {\n value?: Partial<ImageResource>;\n onSelect: (resource: ImageResource) => void;\n uploadProps?: UploadProps;\n}\n\nconst ImageInject = React.forwardRef<HTMLDivElement, ImageInjectProps>(\n ({ value, onSelect, uploadProps }, ref) => {\n const { t } = useTranslation();\n const { setDialogOpen } = useContext(EditorContext);\n\n const [resource, setResource] = useState<ImageResource>({\n resourceUrl: value?.resourceUrl ?? \"\",\n resourceTitle: value?.resourceTitle ?? \"\",\n scalePercent: value?.scalePercent ?? 100,\n });\n const [previewLoaded, setPreviewLoaded] = useState<boolean>(\n Boolean(value?.resourceUrl)\n );\n const [tempUrl, setTempUrl] = useState<string>(value?.resourceUrl ?? \"\");\n const [scale, setScale] = useState<number | undefined>(\n value?.scalePercent ?? 100\n );\n const [scaleInputValue, setScaleInputValue] = useState<string>(\n value?.scalePercent !== undefined ? String(value.scalePercent) : \"100\"\n );\n const [errorTip, setErrorTip] = useState<string>(\"\");\n const [uploadStatus, setUploadStatus] = useState<\n \"idle\" | \"loading\" | \"success\" | \"error\"\n >(\"idle\");\n const isUploading = uploadStatus === \"loading\";\n\n useEffect(() => {\n if (value?.resourceUrl) {\n setResource((prev) => ({\n ...prev,\n resourceUrl: value.resourceUrl ?? \"\",\n resourceTitle: value.resourceTitle ?? prev.resourceTitle ?? \"\",\n scalePercent: value.scalePercent ?? prev.scalePercent ?? 100,\n }));\n setTempUrl(value.resourceUrl ?? \"\");\n const resolvedScale =\n value.scalePercent !== undefined ? value.scalePercent : 100;\n setScale(resolvedScale);\n setScaleInputValue(\n value.scalePercent !== undefined\n ? String(value.scalePercent)\n : String(resolvedScale)\n );\n setPreviewLoaded(true);\n }\n setUploadStatus(\"idle\");\n }, [value]);\n\n const handleCancel = () => {\n if (isUploading) return;\n setDialogOpen(false);\n };\n\n const applyImage = (url: string, name?: string) => {\n const sanitizedUrl = sanitizeImageUrl(url);\n setResource({\n resourceUrl: sanitizedUrl,\n resourceTitle: name || resource.resourceTitle || t(\"imageDefaultTitle\"),\n scalePercent: scale,\n });\n setTempUrl(sanitizedUrl);\n setPreviewLoaded(true);\n setErrorTip(\"\");\n if (uploadStatus === \"loading\") {\n setUploadStatus(\"success\");\n }\n };\n\n const handleSelect = () => {\n if (isUploading) return;\n if (!resource.resourceUrl) return;\n onSelect({\n resourceUrl: resource.resourceUrl,\n resourceTitle:\n resource.resourceTitle || t(\"imageDefaultTitle\", \"Image name\"),\n scalePercent: scale,\n });\n setDialogOpen(false);\n };\n\n const handleUrlChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const url = e.target.value.trim();\n setTempUrl(url);\n setPreviewLoaded(false);\n setErrorTip(\"\");\n };\n\n const handleTitleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setResource((prev) => ({\n ...prev,\n resourceTitle: e.target.value,\n }));\n };\n\n const handleScaleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const inputValue = e.target.value.replace(/[^\\d]/g, \"\");\n setScaleInputValue(inputValue);\n if (!inputValue) {\n setScale(undefined);\n setResource((prev) => ({\n ...prev,\n scalePercent: undefined,\n }));\n return;\n }\n const numeric = Math.max(1, Math.min(1000, Number(inputValue)));\n setScale(numeric);\n setResource((prev) => ({\n ...prev,\n scalePercent: numeric,\n }));\n };\n\n const handleRun = () => {\n if (isUploading) return;\n setUploadStatus(\"idle\");\n if (!tempUrl) {\n setErrorTip(t(\"imageUrlRequired\", \"Please enter image URL\"));\n return;\n }\n if (!isValidImageUrl(tempUrl)) {\n setErrorTip(t(\"imageInvalidUrl\", \"Please enter a valid image URL\"));\n return;\n }\n applyImage(tempUrl);\n if (!resource.resourceTitle && tempUrl) {\n try {\n const parsed = new URL(tempUrl);\n const name = decodeURIComponent(\n parsed.pathname.split(\"/\").filter(Boolean).pop() ?? \"\"\n );\n if (name) {\n setResource((prev) => ({\n ...prev,\n resourceTitle: name,\n }));\n }\n } catch (error) {\n // ignore\n console.error(error);\n }\n }\n };\n\n const finalize = (url: string, fileName: string) => {\n setUploadStatus(\"success\");\n applyImage(url, fileName);\n };\n\n const handleUploadError = (error: any, currentFile: File) => {\n const message =\n error?.message || t(\"imageUploadError\", \"Upload failed, please retry\");\n setErrorTip(message);\n setUploadStatus(\"error\");\n setPreviewLoaded(Boolean(resource.resourceUrl));\n uploadProps?.onError?.(error, currentFile);\n };\n\n const runCustomRequest = async (targetFile: File) => {\n const options: UploadRequestOption = {\n file: targetFile,\n filename: uploadProps?.name,\n data:\n typeof uploadProps?.data === \"function\"\n ? await uploadProps.data(targetFile)\n : uploadProps?.data,\n headers: uploadProps?.headers,\n withCredentials: uploadProps?.withCredentials,\n action:\n typeof uploadProps?.action === \"function\"\n ? await uploadProps.action(targetFile)\n : uploadProps?.action,\n onProgress: (event) => uploadProps?.onProgress?.(event, targetFile),\n onError: (error) => handleUploadError(error, targetFile),\n onSuccess: (response: any) => {\n uploadProps?.onSuccess?.(response, targetFile);\n const url =\n typeof response === \"string\"\n ? response\n : (response?.url ?? response?.data?.url);\n if (url) {\n finalize(url, targetFile.name);\n } else {\n handleUploadError(new Error(\"INVALID_RESPONSE\"), targetFile);\n }\n },\n };\n uploadProps?.customRequest?.(options);\n };\n\n const runActionUpload = async (targetFile: File) => {\n const action =\n typeof uploadProps?.action === \"function\"\n ? await uploadProps.action(targetFile)\n : uploadProps?.action;\n if (!action) {\n finalize(URL.createObjectURL(targetFile), targetFile.name);\n return;\n }\n\n try {\n const formData = new FormData();\n formData.append(uploadProps?.name ?? \"file\", targetFile);\n const extraData =\n typeof uploadProps?.data === \"function\"\n ? await uploadProps.data(targetFile)\n : uploadProps?.data;\n if (extraData) {\n Object.entries(extraData).forEach(([key, val]) => {\n formData.append(key, val as any);\n });\n }\n\n const response = await fetch(action, {\n method: \"POST\",\n body: formData,\n headers: uploadProps?.headers,\n credentials: uploadProps?.withCredentials ? \"include\" : \"same-origin\",\n });\n const result = await response.json();\n uploadProps?.onSuccess?.(result, targetFile);\n const url = typeof result === \"string\" ? result : result?.data;\n\n if (url) {\n finalize(url, targetFile.name);\n } else {\n handleUploadError(new Error(\"INVALID_RESPONSE\"), targetFile);\n }\n } catch (error: any) {\n handleUploadError(error, targetFile);\n }\n };\n\n const triggerUpload = async (file: File) => {\n try {\n setErrorTip(\"\");\n let candidate: File | Blob | boolean | void = file;\n if (uploadProps?.beforeUpload) {\n candidate = await uploadProps.beforeUpload(file);\n if (candidate === false) {\n return;\n }\n }\n\n if (candidate instanceof Blob && !(candidate instanceof File)) {\n candidate = new File([candidate], file.name, {\n type: candidate.type || file.type,\n });\n }\n\n const finalFile = candidate instanceof File ? candidate : file;\n setUploadStatus(\"loading\");\n setPreviewLoaded(false);\n\n if (uploadProps?.customRequest) {\n await runCustomRequest(finalFile);\n return;\n }\n if (uploadProps?.action) {\n await runActionUpload(finalFile);\n return;\n }\n\n const localUrl = URL.createObjectURL(finalFile);\n finalize(localUrl, finalFile.name);\n uploadProps?.onSuccess?.({ url: localUrl }, finalFile);\n } catch (error: any) {\n setUploadStatus(\"error\");\n handleUploadError(error, file);\n }\n };\n\n const onFileInputChange = async (\n event: React.ChangeEvent<HTMLInputElement>\n ) => {\n const file = event.target.files?.[0];\n if (!file) return;\n await triggerUpload(file);\n event.target.value = \"\";\n };\n\n const scaleInput = useMemo(\n () => (\n <div className=\"flex items-center gap-2\">\n <Input\n type=\"text\"\n value={scaleInputValue}\n onChange={handleScaleChange}\n className=\"w-24\"\n inputMode=\"numeric\"\n pattern=\"[0-9]*\"\n />\n <span>%</span>\n </div>\n ),\n [scaleInputValue]\n );\n\n return (\n <div ref={ref} className=\"space-y-6\">\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium text-foreground\">\n {t(\"imageUrlLabel\", \"URL\")}\n </label>\n <div className=\"flex gap-2\">\n <Input\n type=\"text\"\n placeholder={t(\"imageUrlPlaceholder\", \"Please enter image URL\")}\n value={tempUrl}\n onChange={handleUrlChange}\n autoComplete=\"off\"\n />\n <Button\n className=\"h-8\"\n variant=\"outline\"\n type=\"button\"\n onClick={handleRun}\n >\n {t(\"imageRunButton\", \"Preview\")}\n </Button>\n </div>\n </div>\n\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium text-foreground\">\n {t(\"imageUploadLabel\", \"Upload\")}\n </label>\n <label\n className={`relative group flex h-48 w-full flex-col items-center justify-center overflow-hidden rounded-lg border border-dashed transition-colors ${\n previewLoaded ? \"bg-muted/40\" : \"bg-muted/10\"\n } ${\n isUploading\n ? \"cursor-wait opacity-80 pointer-events-none\"\n : \"cursor-pointer\"\n }`}\n >\n {isUploading && (\n <div className=\"absolute inset-0 z-10 flex flex-col items-center justify-center gap-2 bg-background/80\">\n <Loader2 className=\"h-6 w-6 animate-spin text-primary\" />\n <span className=\"text-sm text-muted-foreground\">\n {t(\"imageUploading\", \"Uploading...\")}\n </span>\n </div>\n )}\n {previewLoaded && resource.resourceUrl ? (\n <>\n {/* eslint-disable-next-line @next/next/no-img-element */}\n <img\n src={resource.resourceUrl}\n alt={resource.resourceTitle || \"preview\"}\n className=\"h-full w-full object-contain\"\n />\n {!isUploading && (\n <div className=\"pointer-events-none absolute inset-0 flex flex-col items-center justify-center gap-2 bg-[#D7D7D7] opacity-0 transition-opacity duration-200 group-hover:opacity-100\">\n <Upload\n className=\"h-6 w-6\"\n style={{\n color: \"var(--base-muted-foreground, #737373)\",\n }}\n />\n <span\n className=\"text-sm\"\n style={{\n color: \"var(--base-muted-foreground, #737373)\",\n }}\n >\n {t(\n \"imageUploadPlaceholder\",\n \"Drag files or click to upload\"\n )}\n </span>\n </div>\n )}\n </>\n ) : (\n <div className=\"flex flex-col items-center gap-2 text-sm text-muted-foreground\">\n <Upload className=\"h-6 w-6\" />\n <span>\n {t(\"imageUploadPlaceholder\", \"Drag files or click to upload\")}\n </span>\n </div>\n )}\n <input\n type=\"file\"\n accept=\"image/*\"\n className=\"hidden\"\n disabled={isUploading}\n onChange={onFileInputChange}\n />\n </label>\n {uploadStatus === \"success\" && (\n <p className=\"text-xs text-muted-foreground\">\n {t(\"imageUploadSuccess\", \"Upload complete\")}\n </p>\n )}\n </div>\n\n {previewLoaded && resource.resourceUrl && (\n <>\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium text-foreground\">\n {t(\"imageTitleLabel\", \"Image Title\")}\n </label>\n <Input\n type=\"text\"\n placeholder={t(\n \"imageTitlePlaceholder\",\n \"Please enter image title\"\n )}\n value={resource.resourceTitle || \"\"}\n onChange={handleTitleChange}\n />\n </div>\n\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium text-foreground\">\n {t(\"imageScaleLabel\", \"Scale\")}\n </label>\n {scaleInput}\n </div>\n </>\n )}\n\n {!!errorTip && <p className=\"text-xs text-destructive\">{errorTip}</p>}\n\n <div className=\"flex justify-end gap-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={handleCancel}\n disabled={isUploading}\n >\n {t(\"imageCancelButton\", \"Cancel\")}\n </Button>\n <Button\n className=\"h-8\"\n onClick={handleSelect}\n disabled={!resource?.resourceUrl || isUploading}\n >\n {t(\"imageUseButton\", \"Use Image\")}\n </Button>\n </div>\n </div>\n );\n }\n);\n\nImageInject.displayName = \"ImageInject\";\n\nexport default ImageInject;\n"],"names":["ImageInject","React","value","onSelect","uploadProps","ref","t","useTranslation","setDialogOpen","useContext","EditorContext","resource","setResource","useState","previewLoaded","setPreviewLoaded","tempUrl","setTempUrl","scale","setScale","scaleInputValue","setScaleInputValue","errorTip","setErrorTip","uploadStatus","setUploadStatus","isUploading","useEffect","prev","resolvedScale","handleCancel","applyImage","url","name","sanitizedUrl","sanitizeImageUrl","handleSelect","handleUrlChange","handleTitleChange","handleScaleChange","inputValue","numeric","handleRun","isValidImageUrl","parsed","error","finalize","fileName","handleUploadError","currentFile","message","runCustomRequest","targetFile","options","event","response","runActionUpload","action","formData","extraData","key","val","result","triggerUpload","file","candidate","finalFile","localUrl","onFileInputChange","scaleInput","useMemo","jsxs","jsx","Input","Button","Loader2","Fragment","Upload"],"mappings":";;;;;;;;;AAuBA,MAAMA,KAAcC,EAAM;AAAA,EACxB,CAAC,EAAE,OAAAC,GAAO,UAAAC,GAAU,aAAAC,EAAA,GAAeC,MAAQ;AACzC,UAAM,EAAE,GAAAC,EAAA,IAAMC,GAAA,GACR,EAAE,eAAAC,EAAA,IAAkBC,EAAWC,CAAa,GAE5C,CAACC,GAAUC,CAAW,IAAIC,EAAwB;AAAA,MACtD,aAAaX,GAAO,eAAe;AAAA,MACnC,eAAeA,GAAO,iBAAiB;AAAA,MACvC,cAAcA,GAAO,gBAAgB;AAAA,IAAA,CACtC,GACK,CAACY,GAAeC,CAAgB,IAAIF;AAAA,MACxC,EAAQX,GAAO;AAAA,IAAW,GAEtB,CAACc,GAASC,CAAU,IAAIJ,EAAiBX,GAAO,eAAe,EAAE,GACjE,CAACgB,GAAOC,CAAQ,IAAIN;AAAA,MACxBX,GAAO,gBAAgB;AAAA,IAAA,GAEnB,CAACkB,GAAiBC,CAAkB,IAAIR;AAAA,MAC5CX,GAAO,iBAAiB,SAAY,OAAOA,EAAM,YAAY,IAAI;AAAA,IAAA,GAE7D,CAACoB,GAAUC,CAAW,IAAIV,EAAiB,EAAE,GAC7C,CAACW,GAAcC,CAAe,IAAIZ,EAEtC,MAAM,GACFa,IAAcF,MAAiB;AAErC,IAAAG,EAAU,MAAM;AACd,UAAIzB,GAAO,aAAa;AACtB,QAAAU,EAAY,CAACgB,OAAU;AAAA,UACrB,GAAGA;AAAA,UACH,aAAa1B,EAAM,eAAe;AAAA,UAClC,eAAeA,EAAM,iBAAiB0B,EAAK,iBAAiB;AAAA,UAC5D,cAAc1B,EAAM,gBAAgB0B,EAAK,gBAAgB;AAAA,QAAA,EACzD,GACFX,EAAWf,EAAM,eAAe,EAAE;AAClC,cAAM2B,IACJ3B,EAAM,iBAAiB,SAAYA,EAAM,eAAe;AAC1D,QAAAiB,EAASU,CAAa,GACtBR;AAAA,UACEnB,EAAM,iBAAiB,SACnB,OAAOA,EAAM,YAAY,IACzB,OAAO2B,CAAa;AAAA,QAAA,GAE1Bd,EAAiB,EAAI;AAAA,MACvB;AACA,MAAAU,EAAgB,MAAM;AAAA,IACxB,GAAG,CAACvB,CAAK,CAAC;AAEV,UAAM4B,IAAe,MAAM;AACzB,MAAIJ,KACJlB,EAAc,EAAK;AAAA,IACrB,GAEMuB,IAAa,CAACC,GAAaC,MAAkB;AACjD,YAAMC,IAAeC,GAAiBH,CAAG;AACzC,MAAApB,EAAY;AAAA,QACV,aAAasB;AAAA,QACb,eAAeD,KAAQtB,EAAS,iBAAiBL,EAAE,mBAAmB;AAAA,QACtE,cAAcY;AAAA,MAAA,CACf,GACDD,EAAWiB,CAAY,GACvBnB,EAAiB,EAAI,GACrBQ,EAAY,EAAE,GACVC,MAAiB,aACnBC,EAAgB,SAAS;AAAA,IAE7B,GAEMW,IAAe,MAAM;AACzB,MAAIV,KACCf,EAAS,gBACdR,EAAS;AAAA,QACP,aAAaQ,EAAS;AAAA,QACtB,eACEA,EAAS,iBAAiBL,EAAE,qBAAqB,YAAY;AAAA,QAC/D,cAAcY;AAAA,MAAA,CACf,GACDV,EAAc,EAAK;AAAA,IACrB,GAEM6B,IAAkB,CAAC,MAA2C;AAClE,YAAML,IAAM,EAAE,OAAO,MAAM,KAAA;AAC3B,MAAAf,EAAWe,CAAG,GACdjB,EAAiB,EAAK,GACtBQ,EAAY,EAAE;AAAA,IAChB,GAEMe,IAAoB,CAAC,MAA2C;AACpE,MAAA1B,EAAY,CAACgB,OAAU;AAAA,QACrB,GAAGA;AAAA,QACH,eAAe,EAAE,OAAO;AAAA,MAAA,EACxB;AAAA,IACJ,GAEMW,IAAoB,CAAC,MAA2C;AACpE,YAAMC,IAAa,EAAE,OAAO,MAAM,QAAQ,UAAU,EAAE;AAEtD,UADAnB,EAAmBmB,CAAU,GACzB,CAACA,GAAY;AACf,QAAArB,EAAS,MAAS,GAClBP,EAAY,CAACgB,OAAU;AAAA,UACrB,GAAGA;AAAA,UACH,cAAc;AAAA,QAAA,EACd;AACF;AAAA,MACF;AACA,YAAMa,IAAU,KAAK,IAAI,GAAG,KAAK,IAAI,KAAM,OAAOD,CAAU,CAAC,CAAC;AAC9D,MAAArB,EAASsB,CAAO,GAChB7B,EAAY,CAACgB,OAAU;AAAA,QACrB,GAAGA;AAAA,QACH,cAAca;AAAA,MAAA,EACd;AAAA,IACJ,GAEMC,IAAY,MAAM;AACtB,UAAI,CAAAhB,GAEJ;AAAA,YADAD,EAAgB,MAAM,GAClB,CAACT,GAAS;AACZ,UAAAO,EAAYjB,EAAE,oBAAoB,wBAAwB,CAAC;AAC3D;AAAA,QACF;AACA,YAAI,CAACqC,EAAgB3B,CAAO,GAAG;AAC7B,UAAAO,EAAYjB,EAAE,mBAAmB,gCAAgC,CAAC;AAClE;AAAA,QACF;AAEA,YADAyB,EAAWf,CAAO,GACd,CAACL,EAAS,iBAAiBK;AAC7B,cAAI;AACF,kBAAM4B,IAAS,IAAI,IAAI5B,CAAO,GACxBiB,IAAO;AAAA,cACXW,EAAO,SAAS,MAAM,GAAG,EAAE,OAAO,OAAO,EAAE,SAAS;AAAA,YAAA;AAEtD,YAAIX,KACFrB,EAAY,CAACgB,OAAU;AAAA,cACrB,GAAGA;AAAA,cACH,eAAeK;AAAA,YAAA,EACf;AAAA,UAEN,SAASY,GAAO;AAEd,oBAAQ,MAAMA,CAAK;AAAA,UACrB;AAAA;AAAA,IAEJ,GAEMC,IAAW,CAACd,GAAae,MAAqB;AAClD,MAAAtB,EAAgB,SAAS,GACzBM,EAAWC,GAAKe,CAAQ;AAAA,IAC1B,GAEMC,IAAoB,CAACH,GAAYI,MAAsB;AAC3D,YAAMC,IACJL,GAAO,WAAWvC,EAAE,oBAAoB,6BAA6B;AACvE,MAAAiB,EAAY2B,CAAO,GACnBzB,EAAgB,OAAO,GACvBV,EAAiB,EAAQJ,EAAS,WAAY,GAC9CP,GAAa,UAAUyC,GAAOI,CAAW;AAAA,IAC3C,GAEME,IAAmB,OAAOC,MAAqB;AACnD,YAAMC,IAA+B;AAAA,QACnC,MAAMD;AAAA,QACN,UAAUhD,GAAa;AAAA,QACvB,MACE,OAAOA,GAAa,QAAS,aACzB,MAAMA,EAAY,KAAKgD,CAAU,IACjChD,GAAa;AAAA,QACnB,SAASA,GAAa;AAAA,QACtB,iBAAiBA,GAAa;AAAA,QAC9B,QACE,OAAOA,GAAa,UAAW,aAC3B,MAAMA,EAAY,OAAOgD,CAAU,IACnChD,GAAa;AAAA,QACnB,YAAY,CAACkD,MAAUlD,GAAa,aAAakD,GAAOF,CAAU;AAAA,QAClE,SAAS,CAACP,MAAUG,EAAkBH,GAAOO,CAAU;AAAA,QACvD,WAAW,CAACG,MAAkB;AAC5B,UAAAnD,GAAa,YAAYmD,GAAUH,CAAU;AAC7C,gBAAMpB,IACJ,OAAOuB,KAAa,WAChBA,IACCA,GAAU,OAAOA,GAAU,MAAM;AACxC,UAAIvB,IACFc,EAASd,GAAKoB,EAAW,IAAI,IAE7BJ,EAAkB,IAAI,MAAM,kBAAkB,GAAGI,CAAU;AAAA,QAE/D;AAAA,MAAA;AAEF,MAAAhD,GAAa,gBAAgBiD,CAAO;AAAA,IACtC,GAEMG,IAAkB,OAAOJ,MAAqB;AAClD,YAAMK,IACJ,OAAOrD,GAAa,UAAW,aAC3B,MAAMA,EAAY,OAAOgD,CAAU,IACnChD,GAAa;AACnB,UAAI,CAACqD,GAAQ;AACX,QAAAX,EAAS,IAAI,gBAAgBM,CAAU,GAAGA,EAAW,IAAI;AACzD;AAAA,MACF;AAEA,UAAI;AACF,cAAMM,IAAW,IAAI,SAAA;AACrB,QAAAA,EAAS,OAAOtD,GAAa,QAAQ,QAAQgD,CAAU;AACvD,cAAMO,IACJ,OAAOvD,GAAa,QAAS,aACzB,MAAMA,EAAY,KAAKgD,CAAU,IACjChD,GAAa;AACnB,QAAIuD,KACF,OAAO,QAAQA,CAAS,EAAE,QAAQ,CAAC,CAACC,GAAKC,CAAG,MAAM;AAChD,UAAAH,EAAS,OAAOE,GAAKC,CAAU;AAAA,QACjC,CAAC;AASH,cAAMC,IAAS,OANE,MAAM,MAAML,GAAQ;AAAA,UACnC,QAAQ;AAAA,UACR,MAAMC;AAAA,UACN,SAAStD,GAAa;AAAA,UACtB,aAAaA,GAAa,kBAAkB,YAAY;AAAA,QAAA,CACzD,GAC6B,KAAA;AAC9B,QAAAA,GAAa,YAAY0D,GAAQV,CAAU;AAC3C,cAAMpB,IAAM,OAAO8B,KAAW,WAAWA,IAASA,GAAQ;AAE1D,QAAI9B,IACFc,EAASd,GAAKoB,EAAW,IAAI,IAE7BJ,EAAkB,IAAI,MAAM,kBAAkB,GAAGI,CAAU;AAAA,MAE/D,SAASP,GAAY;AACnB,QAAAG,EAAkBH,GAAOO,CAAU;AAAA,MACrC;AAAA,IACF,GAEMW,IAAgB,OAAOC,MAAe;AAC1C,UAAI;AACF,QAAAzC,EAAY,EAAE;AACd,YAAI0C,IAA0CD;AAC9C,YAAI5D,GAAa,iBACf6D,IAAY,MAAM7D,EAAY,aAAa4D,CAAI,GAC3CC,MAAc;AAChB;AAIJ,QAAIA,aAAqB,QAAQ,EAAEA,aAAqB,UACtDA,IAAY,IAAI,KAAK,CAACA,CAAS,GAAGD,EAAK,MAAM;AAAA,UAC3C,MAAMC,EAAU,QAAQD,EAAK;AAAA,QAAA,CAC9B;AAGH,cAAME,IAAYD,aAAqB,OAAOA,IAAYD;AAI1D,YAHAvC,EAAgB,SAAS,GACzBV,EAAiB,EAAK,GAElBX,GAAa,eAAe;AAC9B,gBAAM+C,EAAiBe,CAAS;AAChC;AAAA,QACF;AACA,YAAI9D,GAAa,QAAQ;AACvB,gBAAMoD,EAAgBU,CAAS;AAC/B;AAAA,QACF;AAEA,cAAMC,IAAW,IAAI,gBAAgBD,CAAS;AAC9C,QAAApB,EAASqB,GAAUD,EAAU,IAAI,GACjC9D,GAAa,YAAY,EAAE,KAAK+D,EAAA,GAAYD,CAAS;AAAA,MACvD,SAASrB,GAAY;AACnB,QAAApB,EAAgB,OAAO,GACvBuB,EAAkBH,GAAOmB,CAAI;AAAA,MAC/B;AAAA,IACF,GAEMI,IAAoB,OACxBd,MACG;AACH,YAAMU,IAAOV,EAAM,OAAO,QAAQ,CAAC;AACnC,MAAKU,MACL,MAAMD,EAAcC,CAAI,GACxBV,EAAM,OAAO,QAAQ;AAAA,IACvB,GAEMe,IAAaC;AAAA,MACjB,MACEC,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,QAAAC,gBAAAA,EAAAA;AAAAA,UAACC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,OAAOrD;AAAA,YACP,UAAUmB;AAAA,YACV,WAAU;AAAA,YACV,WAAU;AAAA,YACV,SAAQ;AAAA,UAAA;AAAA,QAAA;AAAA,QAEViC,gBAAAA,EAAAA,IAAC,UAAK,UAAA,IAAA,CAAC;AAAA,MAAA,GACT;AAAA,MAEF,CAACpD,CAAe;AAAA,IAAA;AAGlB,WACEmD,gBAAAA,EAAAA,KAAC,OAAA,EAAI,KAAAlE,GAAU,WAAU,aACvB,UAAA;AAAA,MAAAkE,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,QAAAC,gBAAAA,MAAC,WAAM,WAAU,uCACd,UAAAlE,EAAE,iBAAiB,KAAK,GAC3B;AAAA,QACAiE,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,cACb,UAAA;AAAA,UAAAC,gBAAAA,EAAAA;AAAAA,YAACC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,aAAanE,EAAE,uBAAuB,wBAAwB;AAAA,cAC9D,OAAOU;AAAA,cACP,UAAUqB;AAAA,cACV,cAAa;AAAA,YAAA;AAAA,UAAA;AAAA,UAEfmC,gBAAAA,EAAAA;AAAAA,YAACE;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cACV,SAAQ;AAAA,cACR,MAAK;AAAA,cACL,SAAShC;AAAA,cAER,UAAApC,EAAE,kBAAkB,SAAS;AAAA,YAAA;AAAA,UAAA;AAAA,QAChC,EAAA,CACF;AAAA,MAAA,GACF;AAAA,MAEAiE,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,QAAAC,gBAAAA,MAAC,WAAM,WAAU,uCACd,UAAAlE,EAAE,oBAAoB,QAAQ,GACjC;AAAA,QACAiE,gBAAAA,EAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAW,0IACTzD,IAAgB,gBAAgB,aAClC,IACEY,IACI,+CACA,gBACN;AAAA,YAEC,UAAA;AAAA,cAAAA,KACC6C,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,0FACb,UAAA;AAAA,gBAAAC,gBAAAA,EAAAA,IAACG,IAAA,EAAQ,WAAU,oCAAA,CAAoC;AAAA,sCACtD,QAAA,EAAK,WAAU,iCACb,UAAArE,EAAE,kBAAkB,cAAc,EAAA,CACrC;AAAA,cAAA,GACF;AAAA,cAEDQ,KAAiBH,EAAS,cACzB4D,gBAAAA,EAAAA,KAAAK,EAAAA,UAAA,EAEE,UAAA;AAAA,gBAAAJ,gBAAAA,EAAAA;AAAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,KAAK7D,EAAS;AAAA,oBACd,KAAKA,EAAS,iBAAiB;AAAA,oBAC/B,WAAU;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAEX,CAACe,KACA6C,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,uKACb,UAAA;AAAA,kBAAAC,gBAAAA,EAAAA;AAAAA,oBAACK;AAAA,oBAAA;AAAA,sBACC,WAAU;AAAA,sBACV,OAAO;AAAA,wBACL,OAAO;AAAA,sBAAA;AAAA,oBACT;AAAA,kBAAA;AAAA,kBAEFL,gBAAAA,EAAAA;AAAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,WAAU;AAAA,sBACV,OAAO;AAAA,wBACL,OAAO;AAAA,sBAAA;AAAA,sBAGR,UAAAlE;AAAA,wBACC;AAAA,wBACA;AAAA,sBAAA;AAAA,oBACF;AAAA,kBAAA;AAAA,gBACF,EAAA,CACF;AAAA,cAAA,EAAA,CAEJ,IAEAiE,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,kEACb,UAAA;AAAA,gBAAAC,gBAAAA,EAAAA,IAACK,GAAA,EAAO,WAAU,UAAA,CAAU;AAAA,gBAC5BL,gBAAAA,EAAAA,IAAC,QAAA,EACE,UAAAlE,EAAE,0BAA0B,+BAA+B,EAAA,CAC9D;AAAA,cAAA,GACF;AAAA,cAEFkE,gBAAAA,EAAAA;AAAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,MAAK;AAAA,kBACL,QAAO;AAAA,kBACP,WAAU;AAAA,kBACV,UAAU9C;AAAA,kBACV,UAAU0C;AAAA,gBAAA;AAAA,cAAA;AAAA,YACZ;AAAA,UAAA;AAAA,QAAA;AAAA,QAED5C,MAAiB,aAChBgD,gBAAAA,MAAC,KAAA,EAAE,WAAU,iCACV,UAAAlE,EAAE,sBAAsB,iBAAiB,EAAA,CAC5C;AAAA,MAAA,GAEJ;AAAA,MAECQ,KAAiBH,EAAS,eACzB4D,gBAAAA,EAAAA,KAAAK,EAAAA,UAAA,EACE,UAAA;AAAA,QAAAL,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,UAAAC,gBAAAA,MAAC,WAAM,WAAU,uCACd,UAAAlE,EAAE,mBAAmB,aAAa,GACrC;AAAA,UACAkE,gBAAAA,EAAAA;AAAAA,YAACC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,aAAanE;AAAA,gBACX;AAAA,gBACA;AAAA,cAAA;AAAA,cAEF,OAAOK,EAAS,iBAAiB;AAAA,cACjC,UAAU2B;AAAA,YAAA;AAAA,UAAA;AAAA,QACZ,GACF;AAAA,QAEAiC,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,UAAAC,gBAAAA,MAAC,WAAM,WAAU,uCACd,UAAAlE,EAAE,mBAAmB,OAAO,GAC/B;AAAA,UACC+D;AAAA,QAAA,EAAA,CACH;AAAA,MAAA,GACF;AAAA,MAGD,CAAC,CAAC/C,2BAAa,KAAA,EAAE,WAAU,4BAA4B,UAAAA,GAAS;AAAA,MAEjEiD,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,0BACb,UAAA;AAAA,QAAAC,gBAAAA,EAAAA;AAAAA,UAACE;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAQ;AAAA,YACR,SAAS5C;AAAA,YACT,UAAUJ;AAAA,YAET,UAAApB,EAAE,qBAAqB,QAAQ;AAAA,UAAA;AAAA,QAAA;AAAA,QAElCkE,gBAAAA,EAAAA;AAAAA,UAACE;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,SAAStC;AAAA,YACT,UAAU,CAACzB,GAAU,eAAee;AAAA,YAEnC,UAAApB,EAAE,kBAAkB,WAAW;AAAA,UAAA;AAAA,QAAA;AAAA,MAClC,EAAA,CACF;AAAA,IAAA,GACF;AAAA,EAEJ;AACF;AAEAN,GAAY,cAAc;"}
|
|
1
|
+
{"version":3,"file":"ImageInject.es.js","sources":["../../../../src/components/MarkdownFlowEditor/components/ImageInject.tsx"],"sourcesContent":["/** inject image to mc-editor */\nimport React, { useContext, useEffect, useMemo, useState } from \"react\";\nimport { Button } from \"../../ui/button\";\nimport { Input } from \"../../ui/input\";\nimport { useTranslation } from \"react-i18next\";\nimport { Loader2, Upload } from \"lucide-react\";\n\nimport EditorContext from \"../editor-context\";\nimport { isValidImageUrl, sanitizeImageUrl } from \"../utils/image\";\nimport { UploadProps, UploadRequestOption } from \"../uploadTypes\";\n\nexport type ImageResource = {\n resourceUrl: string;\n resourceTitle?: string;\n scalePercent?: number;\n};\n\nexport interface ImageInjectProps {\n value?: Partial<ImageResource>;\n onSelect: (resource: ImageResource) => void;\n uploadProps?: UploadProps;\n}\n\nconst ImageInject = React.forwardRef<HTMLDivElement, ImageInjectProps>(\n ({ value, onSelect, uploadProps }, ref) => {\n const { t } = useTranslation();\n const { setDialogOpen } = useContext(EditorContext);\n\n const [resource, setResource] = useState<ImageResource>({\n resourceUrl: value?.resourceUrl ?? \"\",\n resourceTitle: value?.resourceTitle ?? \"\",\n scalePercent: value?.scalePercent ?? 100,\n });\n const [previewLoaded, setPreviewLoaded] = useState<boolean>(\n Boolean(value?.resourceUrl)\n );\n const [tempUrl, setTempUrl] = useState<string>(value?.resourceUrl ?? \"\");\n const [scale, setScale] = useState<number | undefined>(\n value?.scalePercent ?? 100\n );\n const [scaleInputValue, setScaleInputValue] = useState<string>(\n value?.scalePercent !== undefined ? String(value.scalePercent) : \"100\"\n );\n const [errorTip, setErrorTip] = useState<string>(\"\");\n const [uploadStatus, setUploadStatus] = useState<\n \"idle\" | \"loading\" | \"success\" | \"error\"\n >(\"idle\");\n const isUploading = uploadStatus === \"loading\";\n\n useEffect(() => {\n if (value?.resourceUrl) {\n setResource((prev) => ({\n ...prev,\n resourceUrl: value.resourceUrl ?? \"\",\n resourceTitle: value.resourceTitle ?? prev.resourceTitle ?? \"\",\n scalePercent: value.scalePercent ?? prev.scalePercent ?? 100,\n }));\n setTempUrl(value.resourceUrl ?? \"\");\n const resolvedScale =\n value.scalePercent !== undefined ? value.scalePercent : 100;\n setScale(resolvedScale);\n setScaleInputValue(\n value.scalePercent !== undefined\n ? String(value.scalePercent)\n : String(resolvedScale)\n );\n setPreviewLoaded(true);\n }\n setUploadStatus(\"idle\");\n }, [value]);\n\n const handleCancel = () => {\n if (isUploading) return;\n setDialogOpen(false);\n };\n\n const applyImage = (url: string, name?: string) => {\n const sanitizedUrl = sanitizeImageUrl(url);\n setResource({\n resourceUrl: sanitizedUrl,\n resourceTitle: name || resource.resourceTitle || t(\"imageDefaultTitle\"),\n scalePercent: scale,\n });\n setTempUrl(sanitizedUrl);\n setPreviewLoaded(true);\n setErrorTip(\"\");\n if (uploadStatus === \"loading\") {\n setUploadStatus(\"success\");\n }\n };\n\n const handleSelect = () => {\n if (isUploading) return;\n if (!resource.resourceUrl) return;\n onSelect({\n resourceUrl: resource.resourceUrl,\n resourceTitle:\n resource.resourceTitle || t(\"imageDefaultTitle\", \"Image name\"),\n scalePercent: scale,\n });\n setDialogOpen(false);\n };\n\n const handleUrlChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const url = e.target.value.trim();\n setTempUrl(url);\n setPreviewLoaded(false);\n setErrorTip(\"\");\n };\n\n const handleTitleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setResource((prev) => ({\n ...prev,\n resourceTitle: e.target.value,\n }));\n };\n\n const handleScaleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const inputValue = e.target.value.replace(/[^\\d]/g, \"\");\n setScaleInputValue(inputValue);\n if (!inputValue) {\n setScale(undefined);\n setResource((prev) => ({\n ...prev,\n scalePercent: undefined,\n }));\n return;\n }\n const numeric = Math.max(1, Math.min(1000, Number(inputValue)));\n setScale(numeric);\n setResource((prev) => ({\n ...prev,\n scalePercent: numeric,\n }));\n };\n\n const handleRun = () => {\n if (isUploading) return;\n setUploadStatus(\"idle\");\n if (!tempUrl) {\n setErrorTip(t(\"imageUrlRequired\", \"Please enter image URL\"));\n return;\n }\n if (!isValidImageUrl(tempUrl)) {\n setErrorTip(t(\"imageInvalidUrl\", \"Please enter a valid image URL\"));\n return;\n }\n applyImage(tempUrl);\n if (!resource.resourceTitle && tempUrl) {\n try {\n const parsed = new URL(tempUrl);\n const name = decodeURIComponent(\n parsed.pathname.split(\"/\").filter(Boolean).pop() ?? \"\"\n );\n if (name) {\n setResource((prev) => ({\n ...prev,\n resourceTitle: name,\n }));\n }\n } catch (error) {\n // ignore\n console.error(error);\n }\n }\n };\n\n const finalize = (url: string, fileName: string) => {\n setUploadStatus(\"success\");\n applyImage(url, fileName);\n };\n\n const handleUploadError = (error: any, currentFile: File) => {\n const message =\n error?.message || t(\"imageUploadError\", \"Upload failed, please retry\");\n setErrorTip(message);\n setUploadStatus(\"error\");\n setPreviewLoaded(Boolean(resource.resourceUrl));\n uploadProps?.onError?.(error, currentFile);\n };\n\n const runCustomRequest = async (targetFile: File) => {\n const options: UploadRequestOption = {\n file: targetFile,\n filename: uploadProps?.name,\n data:\n typeof uploadProps?.data === \"function\"\n ? await uploadProps.data(targetFile)\n : uploadProps?.data,\n headers: uploadProps?.headers,\n withCredentials: uploadProps?.withCredentials,\n action:\n typeof uploadProps?.action === \"function\"\n ? await uploadProps.action(targetFile)\n : uploadProps?.action,\n onProgress: (event) => uploadProps?.onProgress?.(event, targetFile),\n onError: (error) => handleUploadError(error, targetFile),\n onSuccess: (response: any) => {\n uploadProps?.onSuccess?.(response, targetFile);\n const url =\n typeof response === \"string\"\n ? response\n : (response?.url ?? response?.data?.url);\n if (url) {\n finalize(url, targetFile.name);\n } else {\n handleUploadError(new Error(\"INVALID_RESPONSE\"), targetFile);\n }\n },\n };\n uploadProps?.customRequest?.(options);\n };\n\n const runActionUpload = async (targetFile: File) => {\n const action =\n typeof uploadProps?.action === \"function\"\n ? await uploadProps.action(targetFile)\n : uploadProps?.action;\n if (!action) {\n finalize(URL.createObjectURL(targetFile), targetFile.name);\n return;\n }\n\n try {\n const formData = new FormData();\n formData.append(uploadProps?.name ?? \"file\", targetFile);\n const extraData =\n typeof uploadProps?.data === \"function\"\n ? await uploadProps.data(targetFile)\n : uploadProps?.data;\n if (extraData) {\n Object.entries(extraData).forEach(([key, val]) => {\n formData.append(key, val as any);\n });\n }\n\n const response = await fetch(action, {\n method: \"POST\",\n body: formData,\n headers: uploadProps?.headers,\n credentials: uploadProps?.withCredentials ? \"include\" : \"same-origin\",\n });\n const result = await response.json();\n uploadProps?.onSuccess?.(result, targetFile);\n const url = typeof result === \"string\" ? result : result?.data;\n\n if (url) {\n finalize(url, targetFile.name);\n } else {\n handleUploadError(new Error(\"INVALID_RESPONSE\"), targetFile);\n }\n } catch (error: any) {\n handleUploadError(error, targetFile);\n }\n };\n\n const triggerUpload = async (file: File) => {\n try {\n setErrorTip(\"\");\n let candidate: File | Blob | boolean | void = file;\n if (uploadProps?.beforeUpload) {\n candidate = await uploadProps.beforeUpload(file);\n if (candidate === false) {\n return;\n }\n }\n\n if (candidate instanceof Blob && !(candidate instanceof File)) {\n candidate = new File([candidate], file.name, {\n type: candidate.type || file.type,\n });\n }\n\n const finalFile = candidate instanceof File ? candidate : file;\n setUploadStatus(\"loading\");\n setPreviewLoaded(false);\n\n if (uploadProps?.customRequest) {\n await runCustomRequest(finalFile);\n return;\n }\n if (uploadProps?.action) {\n await runActionUpload(finalFile);\n return;\n }\n\n const localUrl = URL.createObjectURL(finalFile);\n finalize(localUrl, finalFile.name);\n uploadProps?.onSuccess?.({ url: localUrl }, finalFile);\n } catch (error: any) {\n setUploadStatus(\"error\");\n handleUploadError(error, file);\n }\n };\n\n const onFileInputChange = async (\n event: React.ChangeEvent<HTMLInputElement>\n ) => {\n const file = event.target.files?.[0];\n if (!file) return;\n await triggerUpload(file);\n event.target.value = \"\";\n };\n\n const scaleInput = useMemo(\n () => (\n <div className=\"flex items-center gap-2\">\n <Input\n type=\"text\"\n value={scaleInputValue}\n onChange={handleScaleChange}\n className=\"w-24\"\n inputMode=\"numeric\"\n pattern=\"[0-9]*\"\n />\n <span>%</span>\n </div>\n ),\n [scaleInputValue]\n );\n\n return (\n <div ref={ref} className=\"space-y-6\">\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium text-foreground\">\n {t(\"imageUrlLabel\", \"URL\")}\n </label>\n <div className=\"flex gap-2\">\n <Input\n type=\"text\"\n placeholder={t(\"imageUrlPlaceholder\", \"Please enter image URL\")}\n dir=\"ltr\"\n value={tempUrl}\n onChange={handleUrlChange}\n autoComplete=\"off\"\n />\n <Button\n className=\"h-8\"\n variant=\"outline\"\n type=\"button\"\n onClick={handleRun}\n >\n {t(\"imageRunButton\", \"Preview\")}\n </Button>\n </div>\n </div>\n\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium text-foreground\">\n {t(\"imageUploadLabel\", \"Upload\")}\n </label>\n <label\n className={`relative group flex h-48 w-full flex-col items-center justify-center overflow-hidden rounded-lg border border-dashed transition-colors ${\n previewLoaded ? \"bg-muted/40\" : \"bg-muted/10\"\n } ${\n isUploading\n ? \"cursor-wait opacity-80 pointer-events-none\"\n : \"cursor-pointer\"\n }`}\n >\n {isUploading && (\n <div className=\"absolute inset-0 z-10 flex flex-col items-center justify-center gap-2 bg-background/80\">\n <Loader2 className=\"h-6 w-6 animate-spin text-primary\" />\n <span className=\"text-sm text-muted-foreground\">\n {t(\"imageUploading\", \"Uploading...\")}\n </span>\n </div>\n )}\n {previewLoaded && resource.resourceUrl ? (\n <>\n {/* eslint-disable-next-line @next/next/no-img-element */}\n <img\n src={resource.resourceUrl}\n alt={resource.resourceTitle || t(\"imageDefaultTitle\")}\n className=\"h-full w-full object-contain\"\n />\n {!isUploading && (\n <div className=\"pointer-events-none absolute inset-0 flex flex-col items-center justify-center gap-2 bg-[#D7D7D7] opacity-0 transition-opacity duration-200 group-hover:opacity-100\">\n <Upload\n className=\"h-6 w-6\"\n style={{\n color: \"var(--base-muted-foreground, #737373)\",\n }}\n />\n <span\n className=\"text-sm\"\n style={{\n color: \"var(--base-muted-foreground, #737373)\",\n }}\n >\n {t(\n \"imageUploadPlaceholder\",\n \"Drag files or click to upload\"\n )}\n </span>\n </div>\n )}\n </>\n ) : (\n <div className=\"flex flex-col items-center gap-2 text-sm text-muted-foreground\">\n <Upload className=\"h-6 w-6\" />\n <span>\n {t(\"imageUploadPlaceholder\", \"Drag files or click to upload\")}\n </span>\n </div>\n )}\n <input\n type=\"file\"\n accept=\"image/*\"\n className=\"hidden\"\n disabled={isUploading}\n onChange={onFileInputChange}\n />\n </label>\n {uploadStatus === \"success\" && (\n <p className=\"text-xs text-muted-foreground\">\n {t(\"imageUploadSuccess\", \"Upload complete\")}\n </p>\n )}\n </div>\n\n {previewLoaded && resource.resourceUrl && (\n <>\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium text-foreground\">\n {t(\"imageTitleLabel\", \"Image Title\")}\n </label>\n <Input\n type=\"text\"\n placeholder={t(\n \"imageTitlePlaceholder\",\n \"Please enter image title\"\n )}\n value={resource.resourceTitle || \"\"}\n onChange={handleTitleChange}\n />\n </div>\n\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium text-foreground\">\n {t(\"imageScaleLabel\", \"Scale\")}\n </label>\n {scaleInput}\n </div>\n </>\n )}\n\n {!!errorTip && <p className=\"text-xs text-destructive\">{errorTip}</p>}\n\n <div className=\"flex justify-end gap-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={handleCancel}\n disabled={isUploading}\n >\n {t(\"imageCancelButton\", \"Cancel\")}\n </Button>\n <Button\n className=\"h-8\"\n onClick={handleSelect}\n disabled={!resource?.resourceUrl || isUploading}\n >\n {t(\"imageUseButton\", \"Use Image\")}\n </Button>\n </div>\n </div>\n );\n }\n);\n\nImageInject.displayName = \"ImageInject\";\n\nexport default ImageInject;\n"],"names":["ImageInject","React","value","onSelect","uploadProps","ref","t","useTranslation","setDialogOpen","useContext","EditorContext","resource","setResource","useState","previewLoaded","setPreviewLoaded","tempUrl","setTempUrl","scale","setScale","scaleInputValue","setScaleInputValue","errorTip","setErrorTip","uploadStatus","setUploadStatus","isUploading","useEffect","prev","resolvedScale","handleCancel","applyImage","url","name","sanitizedUrl","sanitizeImageUrl","handleSelect","handleUrlChange","handleTitleChange","handleScaleChange","inputValue","numeric","handleRun","isValidImageUrl","parsed","error","finalize","fileName","handleUploadError","currentFile","message","runCustomRequest","targetFile","options","event","response","runActionUpload","action","formData","extraData","key","val","result","triggerUpload","file","candidate","finalFile","localUrl","onFileInputChange","scaleInput","useMemo","jsxs","jsx","Input","Button","Loader2","Fragment","Upload"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const s=require("
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const s=require("react/jsx-runtime"),a=require("react"),q=require("../../ui/input.cjs"),R=require("../../../lib/utils.cjs"),I=require("../../../node_modules/lucide-react/dist/esm/icons/search.cjs"),V=({open:u,anchorElement:r,onClose:l,onSelect:j,variables:N,systemVariables:L,labels:h})=>{const f=a.useRef(null),M=a.useRef(null),[k,D]=a.useState(""),[C,$]=a.useState({left:0,top:0}),[x,o]=a.useState(-1),v=a.useCallback(()=>{if(!r)return;const e=r.getBoundingClientRect(),t=r.ownerDocument,n=t.defaultView;if(!n)return;const c=f.current?.getBoundingClientRect().width??0,w=n.getComputedStyle(r).direction==="rtl"?e.right-c:e.left,b=Math.max(8,t.documentElement.clientWidth-c-8);$({left:Math.min(Math.max(8,w),b),top:e.bottom+8})},[r]);a.useEffect(()=>{if(!u){D(""),o(-1);return}const e=r?.ownerDocument.defaultView;if(!e)return;v();const t=e.setTimeout(()=>{M.current?.focus()},0),n=w=>{const b=w.target;f.current&&!f.current.contains(b)&&r&&!r.contains(b)&&l()},c=()=>v();return e.addEventListener("mousedown",n),e.addEventListener("scroll",c,!0),e.addEventListener("resize",c),()=>{e.clearTimeout(t),e.removeEventListener("mousedown",n),e.removeEventListener("scroll",c,!0),e.removeEventListener("resize",c)}},[u,r,l,v]);const p=k.trim().toLowerCase(),g=a.useCallback(e=>{if(!p)return!0;const t=e.name.toLowerCase().includes(p),n=e.label?e.label.toLowerCase().includes(p):!1;return t||n},[p]),m=a.useMemo(()=>L.filter(g),[L,g]),d=a.useMemo(()=>N.filter(g),[N,g]),i=a.useMemo(()=>[...m.map(e=>({group:"system",variable:e})),...d.map(e=>({group:"custom",variable:e}))],[m,d]),S=a.useMemo(()=>{const e=new Map;return i.forEach((t,n)=>{e.set(`${t.group}-${t.variable.name}`,n)}),e},[i]);a.useEffect(()=>{(!u||!i.length)&&o(-1)},[u,i.length]);const y=a.useCallback(e=>{j(e),l()},[l,j]),E=e=>{if(!i.length){e.key==="Escape"&&l();return}if(e.key==="ArrowDown")e.preventDefault(),o(t=>(t+1)%i.length);else if(e.key==="ArrowUp")e.preventDefault(),o(t=>t<=0?i.length-1:t-1);else if(e.key==="Enter"){e.preventDefault();const t=i[x];t&&y(t.variable)}else e.key==="Escape"&&(e.preventDefault(),l())};return u?s.jsxs("div",{ref:f,className:"markdown-flow-editor-variable-search",style:{position:"fixed",left:`${C.left}px`,top:`${C.top}px`},children:[s.jsxs("div",{className:"relative",children:[s.jsx(I.default,{className:"variable-search-icon"}),s.jsx(q.Input,{ref:M,value:k,placeholder:h.searchPlaceholder,onChange:e=>D(e.target.value),onKeyDown:E,className:"variable-search-input"})]}),s.jsxs("div",{className:"variable-search-list",children:[m.length>0&&s.jsxs("div",{className:"variable-search-section",children:[s.jsx("p",{className:"variable-search-section-title",children:h.systemLabel}),m.map(e=>{const t=S.get(`system-${e.name}`)??-1,n=x===t;return s.jsxs("button",{type:"button",onClick:()=>y(e),onMouseEnter:()=>{t>=0&&o(t)},className:R.cn("variable-search-item",n&&"variable-search-item-active"),children:[s.jsx("span",{className:"variable-search-item-name",children:e.name}),e.label&&s.jsx("span",{className:"variable-search-item-label",children:e.label})]},`system-${e.name}`)})]}),d.length>0&&s.jsxs("div",{className:"variable-search-section",children:[s.jsx("p",{className:"variable-search-section-title",children:h.customLabel}),d.map(e=>{const t=S.get(`custom-${e.name}`)??-1,n=x===t;return s.jsxs("button",{type:"button",onClick:()=>y(e),onMouseEnter:()=>{t>=0&&o(t)},className:R.cn("variable-search-item",n&&"variable-search-item-active"),children:[s.jsx("span",{className:"variable-search-item-name",children:e.name}),e.label&&s.jsx("span",{className:"variable-search-item-label",children:e.label})]},`custom-${e.name}`)})]}),m.length===0&&d.length===0&&s.jsx("div",{className:"variable-search-empty",children:h.emptyLabel})]})]}):null};exports.default=V;
|
|
2
2
|
//# sourceMappingURL=VariableSearchDropdown.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VariableSearchDropdown.cjs","sources":["../../../../src/components/MarkdownFlowEditor/components/VariableSearchDropdown.tsx"],"sourcesContent":["import type React from \"react\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { Search } from \"lucide-react\";\nimport { Variable } from \"../types\";\nimport { Input } from \"../../ui/input\";\nimport { cn } from \"../../../lib/utils\";\n\ninterface VariableSearchDropdownProps {\n open: boolean;\n anchorElement: HTMLElement | null;\n onClose: () => void;\n onSelect: (variable: Variable) => void;\n variables: Variable[];\n systemVariables: Variable[];\n labels: {\n searchPlaceholder: string;\n systemLabel: string;\n customLabel: string;\n emptyLabel: string;\n };\n}\n\nconst VariableSearchDropdown: React.FC<VariableSearchDropdownProps> = ({\n open,\n anchorElement,\n onClose,\n onSelect,\n variables,\n systemVariables,\n labels,\n}) => {\n const containerRef = useRef<HTMLDivElement | null>(null);\n const inputRef = useRef<HTMLInputElement | null>(null);\n const [query, setQuery] = useState(\"\");\n const [position, setPosition] = useState({ left: 0, top: 0 });\n const [highlightIndex, setHighlightIndex] = useState(-1);\n\n const updatePosition = useCallback(() => {\n if (!anchorElement) return;\n const rect = anchorElement.getBoundingClientRect();\n setPosition({\n left: rect.left,\n top: rect.bottom + 8,\n });\n }, [anchorElement]);\n\n useEffect(() => {\n if (!open) {\n setQuery(\"\");\n setHighlightIndex(-1);\n return;\n }\n updatePosition();\n const focusTimer = window.setTimeout(() => {\n inputRef.current?.focus();\n }, 0);\n const handleClick = (event: MouseEvent) => {\n const target = event.target as Node | null;\n if (\n containerRef.current &&\n !containerRef.current.contains(target) &&\n anchorElement &&\n !anchorElement.contains(target)\n ) {\n onClose();\n }\n };\n const handleScroll = () => updatePosition();\n window.addEventListener(\"mousedown\", handleClick);\n window.addEventListener(\"scroll\", handleScroll, true);\n window.addEventListener(\"resize\", handleScroll);\n\n return () => {\n window.clearTimeout(focusTimer);\n window.removeEventListener(\"mousedown\", handleClick);\n window.removeEventListener(\"scroll\", handleScroll, true);\n window.removeEventListener(\"resize\", handleScroll);\n };\n }, [open, anchorElement, onClose, updatePosition]);\n\n const normalizedQuery = query.trim().toLowerCase();\n const filterVariable = useCallback(\n (variable: Variable) => {\n if (!normalizedQuery) return true;\n const nameMatch = variable.name.toLowerCase().includes(normalizedQuery);\n const labelMatch = variable.label\n ? variable.label.toLowerCase().includes(normalizedQuery)\n : false;\n return nameMatch || labelMatch;\n },\n [normalizedQuery]\n );\n\n const filteredSystemVariables = useMemo(\n () => systemVariables.filter(filterVariable),\n [systemVariables, filterVariable]\n );\n const filteredCustomVariables = useMemo(\n () => variables.filter(filterVariable),\n [variables, filterVariable]\n );\n\n const orderedItems = useMemo(\n () => [\n ...filteredSystemVariables.map((variable) => ({\n group: \"system\" as const,\n variable,\n })),\n ...filteredCustomVariables.map((variable) => ({\n group: \"custom\" as const,\n variable,\n })),\n ],\n [filteredSystemVariables, filteredCustomVariables]\n );\n\n const indexesByKey = useMemo(() => {\n const map = new Map<string, number>();\n orderedItems.forEach((item, index) => {\n map.set(`${item.group}-${item.variable.name}`, index);\n });\n return map;\n }, [orderedItems]);\n\n useEffect(() => {\n if (!open || !orderedItems.length) {\n setHighlightIndex(-1);\n }\n }, [open, orderedItems.length]);\n\n const handleSelect = useCallback(\n (variable: Variable) => {\n onSelect(variable);\n onClose();\n },\n [onClose, onSelect]\n );\n\n const handleInputKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (!orderedItems.length) {\n if (event.key === \"Escape\") {\n onClose();\n }\n return;\n }\n if (event.key === \"ArrowDown\") {\n event.preventDefault();\n setHighlightIndex((prev) => (prev + 1) % orderedItems.length);\n } else if (event.key === \"ArrowUp\") {\n event.preventDefault();\n setHighlightIndex((prev) =>\n prev <= 0 ? orderedItems.length - 1 : prev - 1\n );\n } else if (event.key === \"Enter\") {\n event.preventDefault();\n const item = orderedItems[highlightIndex];\n if (item) {\n handleSelect(item.variable);\n }\n } else if (event.key === \"Escape\") {\n event.preventDefault();\n onClose();\n }\n };\n\n if (!open) {\n return null;\n }\n\n return (\n <div\n ref={containerRef}\n className=\"markdown-flow-editor-variable-search\"\n style={{\n position: \"fixed\",\n left: `${position.left}px`,\n top: `${position.top}px`,\n }}\n >\n <div className=\"relative\">\n <Search className=\"variable-search-icon\" />\n <Input\n ref={inputRef}\n value={query}\n placeholder={labels.searchPlaceholder}\n onChange={(event) => setQuery(event.target.value)}\n onKeyDown={handleInputKeyDown}\n className=\"variable-search-input\"\n />\n </div>\n <div className=\"variable-search-list\">\n {filteredSystemVariables.length > 0 && (\n <div className=\"variable-search-section\">\n <p className=\"variable-search-section-title\">\n {labels.systemLabel}\n </p>\n {filteredSystemVariables.map((variable) => {\n const index = indexesByKey.get(`system-${variable.name}`) ?? -1;\n const isActive = highlightIndex === index;\n return (\n <button\n key={`system-${variable.name}`}\n type=\"button\"\n onClick={() => handleSelect(variable)}\n onMouseEnter={() => {\n if (index >= 0) {\n setHighlightIndex(index);\n }\n }}\n className={cn(\n \"variable-search-item\",\n isActive && \"variable-search-item-active\"\n )}\n >\n <span className=\"variable-search-item-name\">\n {variable.name}\n </span>\n {variable.label && (\n <span className=\"variable-search-item-label\">\n {variable.label}\n </span>\n )}\n </button>\n );\n })}\n </div>\n )}\n\n {filteredCustomVariables.length > 0 && (\n <div className=\"variable-search-section\">\n <p className=\"variable-search-section-title\">\n {labels.customLabel}\n </p>\n {filteredCustomVariables.map((variable) => {\n const index = indexesByKey.get(`custom-${variable.name}`) ?? -1;\n const isActive = highlightIndex === index;\n return (\n <button\n key={`custom-${variable.name}`}\n type=\"button\"\n onClick={() => handleSelect(variable)}\n onMouseEnter={() => {\n if (index >= 0) {\n setHighlightIndex(index);\n }\n }}\n className={cn(\n \"variable-search-item\",\n isActive && \"variable-search-item-active\"\n )}\n >\n <span className=\"variable-search-item-name\">\n {variable.name}\n </span>\n {variable.label && (\n <span className=\"variable-search-item-label\">\n {variable.label}\n </span>\n )}\n </button>\n );\n })}\n </div>\n )}\n\n {filteredSystemVariables.length === 0 &&\n filteredCustomVariables.length === 0 && (\n <div className=\"variable-search-empty\">{labels.emptyLabel}</div>\n )}\n </div>\n </div>\n );\n};\n\nexport default VariableSearchDropdown;\n"],"names":["VariableSearchDropdown","open","anchorElement","onClose","onSelect","variables","systemVariables","labels","containerRef","useRef","inputRef","query","setQuery","useState","position","setPosition","highlightIndex","setHighlightIndex","updatePosition","useCallback","rect","useEffect","focusTimer","handleClick","event","target","handleScroll","normalizedQuery","filterVariable","variable","nameMatch","labelMatch","filteredSystemVariables","useMemo","filteredCustomVariables","orderedItems","indexesByKey","map","item","index","handleSelect","handleInputKeyDown","prev","jsxs","jsx","Search","Input","isActive","cn"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"VariableSearchDropdown.cjs","sources":["../../../../src/components/MarkdownFlowEditor/components/VariableSearchDropdown.tsx"],"sourcesContent":["import React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { Search } from \"lucide-react\";\nimport { Variable } from \"../types\";\nimport { Input } from \"../../ui/input\";\nimport { cn } from \"../../../lib/utils\";\n\ninterface VariableSearchDropdownProps {\n open: boolean;\n anchorElement: HTMLElement | null;\n onClose: () => void;\n onSelect: (variable: Variable) => void;\n variables: Variable[];\n systemVariables: Variable[];\n labels: {\n searchPlaceholder: string;\n systemLabel: string;\n customLabel: string;\n emptyLabel: string;\n };\n}\n\nconst VariableSearchDropdown: React.FC<VariableSearchDropdownProps> = ({\n open,\n anchorElement,\n onClose,\n onSelect,\n variables,\n systemVariables,\n labels,\n}) => {\n const containerRef = useRef<HTMLDivElement | null>(null);\n const inputRef = useRef<HTMLInputElement | null>(null);\n const [query, setQuery] = useState(\"\");\n const [position, setPosition] = useState({ left: 0, top: 0 });\n const [highlightIndex, setHighlightIndex] = useState(-1);\n\n const updatePosition = useCallback(() => {\n if (!anchorElement) return;\n const rect = anchorElement.getBoundingClientRect();\n const doc = anchorElement.ownerDocument;\n const view = doc.defaultView;\n if (!view) return;\n const width = containerRef.current?.getBoundingClientRect().width ?? 0;\n const desiredLeft =\n view.getComputedStyle(anchorElement).direction === \"rtl\"\n ? rect.right - width\n : rect.left;\n const maxLeft = Math.max(8, doc.documentElement.clientWidth - width - 8);\n setPosition({\n left: Math.min(Math.max(8, desiredLeft), maxLeft),\n top: rect.bottom + 8,\n });\n }, [anchorElement]);\n\n useEffect(() => {\n if (!open) {\n setQuery(\"\");\n setHighlightIndex(-1);\n return;\n }\n const view = anchorElement?.ownerDocument.defaultView;\n if (!view) return;\n updatePosition();\n const focusTimer = view.setTimeout(() => {\n inputRef.current?.focus();\n }, 0);\n const handleClick = (event: MouseEvent) => {\n const target = event.target as Node | null;\n if (\n containerRef.current &&\n !containerRef.current.contains(target) &&\n anchorElement &&\n !anchorElement.contains(target)\n ) {\n onClose();\n }\n };\n const handleScroll = () => updatePosition();\n view.addEventListener(\"mousedown\", handleClick);\n view.addEventListener(\"scroll\", handleScroll, true);\n view.addEventListener(\"resize\", handleScroll);\n\n return () => {\n view.clearTimeout(focusTimer);\n view.removeEventListener(\"mousedown\", handleClick);\n view.removeEventListener(\"scroll\", handleScroll, true);\n view.removeEventListener(\"resize\", handleScroll);\n };\n }, [open, anchorElement, onClose, updatePosition]);\n\n const normalizedQuery = query.trim().toLowerCase();\n const filterVariable = useCallback(\n (variable: Variable) => {\n if (!normalizedQuery) return true;\n const nameMatch = variable.name.toLowerCase().includes(normalizedQuery);\n const labelMatch = variable.label\n ? variable.label.toLowerCase().includes(normalizedQuery)\n : false;\n return nameMatch || labelMatch;\n },\n [normalizedQuery]\n );\n\n const filteredSystemVariables = useMemo(\n () => systemVariables.filter(filterVariable),\n [systemVariables, filterVariable]\n );\n const filteredCustomVariables = useMemo(\n () => variables.filter(filterVariable),\n [variables, filterVariable]\n );\n\n const orderedItems = useMemo(\n () => [\n ...filteredSystemVariables.map((variable) => ({\n group: \"system\" as const,\n variable,\n })),\n ...filteredCustomVariables.map((variable) => ({\n group: \"custom\" as const,\n variable,\n })),\n ],\n [filteredSystemVariables, filteredCustomVariables]\n );\n\n const indexesByKey = useMemo(() => {\n const map = new Map<string, number>();\n orderedItems.forEach((item, index) => {\n map.set(`${item.group}-${item.variable.name}`, index);\n });\n return map;\n }, [orderedItems]);\n\n useEffect(() => {\n if (!open || !orderedItems.length) {\n setHighlightIndex(-1);\n }\n }, [open, orderedItems.length]);\n\n const handleSelect = useCallback(\n (variable: Variable) => {\n onSelect(variable);\n onClose();\n },\n [onClose, onSelect]\n );\n\n const handleInputKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (!orderedItems.length) {\n if (event.key === \"Escape\") {\n onClose();\n }\n return;\n }\n if (event.key === \"ArrowDown\") {\n event.preventDefault();\n setHighlightIndex((prev) => (prev + 1) % orderedItems.length);\n } else if (event.key === \"ArrowUp\") {\n event.preventDefault();\n setHighlightIndex((prev) =>\n prev <= 0 ? orderedItems.length - 1 : prev - 1\n );\n } else if (event.key === \"Enter\") {\n event.preventDefault();\n const item = orderedItems[highlightIndex];\n if (item) {\n handleSelect(item.variable);\n }\n } else if (event.key === \"Escape\") {\n event.preventDefault();\n onClose();\n }\n };\n\n if (!open) {\n return null;\n }\n\n return (\n <div\n ref={containerRef}\n className=\"markdown-flow-editor-variable-search\"\n style={{\n position: \"fixed\",\n left: `${position.left}px`,\n top: `${position.top}px`,\n }}\n >\n <div className=\"relative\">\n <Search className=\"variable-search-icon\" />\n <Input\n ref={inputRef}\n value={query}\n placeholder={labels.searchPlaceholder}\n onChange={(event) => setQuery(event.target.value)}\n onKeyDown={handleInputKeyDown}\n className=\"variable-search-input\"\n />\n </div>\n <div className=\"variable-search-list\">\n {filteredSystemVariables.length > 0 && (\n <div className=\"variable-search-section\">\n <p className=\"variable-search-section-title\">\n {labels.systemLabel}\n </p>\n {filteredSystemVariables.map((variable) => {\n const index = indexesByKey.get(`system-${variable.name}`) ?? -1;\n const isActive = highlightIndex === index;\n return (\n <button\n key={`system-${variable.name}`}\n type=\"button\"\n onClick={() => handleSelect(variable)}\n onMouseEnter={() => {\n if (index >= 0) {\n setHighlightIndex(index);\n }\n }}\n className={cn(\n \"variable-search-item\",\n isActive && \"variable-search-item-active\"\n )}\n >\n <span className=\"variable-search-item-name\">\n {variable.name}\n </span>\n {variable.label && (\n <span className=\"variable-search-item-label\">\n {variable.label}\n </span>\n )}\n </button>\n );\n })}\n </div>\n )}\n\n {filteredCustomVariables.length > 0 && (\n <div className=\"variable-search-section\">\n <p className=\"variable-search-section-title\">\n {labels.customLabel}\n </p>\n {filteredCustomVariables.map((variable) => {\n const index = indexesByKey.get(`custom-${variable.name}`) ?? -1;\n const isActive = highlightIndex === index;\n return (\n <button\n key={`custom-${variable.name}`}\n type=\"button\"\n onClick={() => handleSelect(variable)}\n onMouseEnter={() => {\n if (index >= 0) {\n setHighlightIndex(index);\n }\n }}\n className={cn(\n \"variable-search-item\",\n isActive && \"variable-search-item-active\"\n )}\n >\n <span className=\"variable-search-item-name\">\n {variable.name}\n </span>\n {variable.label && (\n <span className=\"variable-search-item-label\">\n {variable.label}\n </span>\n )}\n </button>\n );\n })}\n </div>\n )}\n\n {filteredSystemVariables.length === 0 &&\n filteredCustomVariables.length === 0 && (\n <div className=\"variable-search-empty\">{labels.emptyLabel}</div>\n )}\n </div>\n </div>\n );\n};\n\nexport default VariableSearchDropdown;\n"],"names":["VariableSearchDropdown","open","anchorElement","onClose","onSelect","variables","systemVariables","labels","containerRef","useRef","inputRef","query","setQuery","useState","position","setPosition","highlightIndex","setHighlightIndex","updatePosition","useCallback","rect","doc","view","width","desiredLeft","maxLeft","useEffect","focusTimer","handleClick","event","target","handleScroll","normalizedQuery","filterVariable","variable","nameMatch","labelMatch","filteredSystemVariables","useMemo","filteredCustomVariables","orderedItems","indexesByKey","map","item","index","handleSelect","handleInputKeyDown","prev","jsxs","jsx","Search","Input","isActive","cn"],"mappings":"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"}
|
|
@@ -1,180 +1,184 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { useRef as
|
|
3
|
-
import { Input as
|
|
4
|
-
import { cn as
|
|
5
|
-
import
|
|
6
|
-
const
|
|
7
|
-
open:
|
|
8
|
-
anchorElement:
|
|
9
|
-
onClose:
|
|
10
|
-
onSelect:
|
|
11
|
-
variables:
|
|
12
|
-
systemVariables:
|
|
13
|
-
labels:
|
|
1
|
+
import { jsxs as c, jsx as a } from "react/jsx-runtime";
|
|
2
|
+
import { useRef as R, useState as L, useCallback as k, useEffect as V, useMemo as b } from "react";
|
|
3
|
+
import { Input as P } from "../../ui/input.es.js";
|
|
4
|
+
import { cn as z } from "../../../lib/utils.es.js";
|
|
5
|
+
import T from "../../../node_modules/lucide-react/dist/esm/icons/search.es.js";
|
|
6
|
+
const W = ({
|
|
7
|
+
open: m,
|
|
8
|
+
anchorElement: r,
|
|
9
|
+
onClose: l,
|
|
10
|
+
onSelect: D,
|
|
11
|
+
variables: M,
|
|
12
|
+
systemVariables: $,
|
|
13
|
+
labels: h
|
|
14
14
|
}) => {
|
|
15
|
-
const
|
|
16
|
-
if (!
|
|
17
|
-
const e =
|
|
18
|
-
|
|
19
|
-
|
|
15
|
+
const f = R(null), C = R(null), [A, E] = L(""), [S, B] = L({ left: 0, top: 0 }), [w, o] = L(-1), y = k(() => {
|
|
16
|
+
if (!r) return;
|
|
17
|
+
const e = r.getBoundingClientRect(), t = r.ownerDocument, s = t.defaultView;
|
|
18
|
+
if (!s) return;
|
|
19
|
+
const i = f.current?.getBoundingClientRect().width ?? 0, x = s.getComputedStyle(r).direction === "rtl" ? e.right - i : e.left, v = Math.max(8, t.documentElement.clientWidth - i - 8);
|
|
20
|
+
B({
|
|
21
|
+
left: Math.min(Math.max(8, x), v),
|
|
20
22
|
top: e.bottom + 8
|
|
21
23
|
});
|
|
22
|
-
}, [
|
|
23
|
-
|
|
24
|
-
if (!
|
|
25
|
-
E(""),
|
|
24
|
+
}, [r]);
|
|
25
|
+
V(() => {
|
|
26
|
+
if (!m) {
|
|
27
|
+
E(""), o(-1);
|
|
26
28
|
return;
|
|
27
29
|
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
30
|
+
const e = r?.ownerDocument.defaultView;
|
|
31
|
+
if (!e) return;
|
|
32
|
+
y();
|
|
33
|
+
const t = e.setTimeout(() => {
|
|
34
|
+
C.current?.focus();
|
|
35
|
+
}, 0), s = (x) => {
|
|
36
|
+
const v = x.target;
|
|
37
|
+
f.current && !f.current.contains(v) && r && !r.contains(v) && l();
|
|
38
|
+
}, i = () => y();
|
|
39
|
+
return e.addEventListener("mousedown", s), e.addEventListener("scroll", i, !0), e.addEventListener("resize", i), () => {
|
|
40
|
+
e.clearTimeout(t), e.removeEventListener("mousedown", s), e.removeEventListener("scroll", i, !0), e.removeEventListener("resize", i);
|
|
37
41
|
};
|
|
38
|
-
}, [
|
|
39
|
-
const
|
|
42
|
+
}, [m, r, l, y]);
|
|
43
|
+
const p = A.trim().toLowerCase(), g = k(
|
|
40
44
|
(e) => {
|
|
41
|
-
if (!
|
|
42
|
-
const t = e.name.toLowerCase().includes(
|
|
43
|
-
return t ||
|
|
45
|
+
if (!p) return !0;
|
|
46
|
+
const t = e.name.toLowerCase().includes(p), s = e.label ? e.label.toLowerCase().includes(p) : !1;
|
|
47
|
+
return t || s;
|
|
44
48
|
},
|
|
45
|
-
[
|
|
46
|
-
),
|
|
47
|
-
() =>
|
|
48
|
-
[
|
|
49
|
-
),
|
|
50
|
-
() =>
|
|
51
|
-
[
|
|
52
|
-
),
|
|
49
|
+
[p]
|
|
50
|
+
), u = b(
|
|
51
|
+
() => $.filter(g),
|
|
52
|
+
[$, g]
|
|
53
|
+
), d = b(
|
|
54
|
+
() => M.filter(g),
|
|
55
|
+
[M, g]
|
|
56
|
+
), n = b(
|
|
53
57
|
() => [
|
|
54
|
-
...
|
|
58
|
+
...u.map((e) => ({
|
|
55
59
|
group: "system",
|
|
56
60
|
variable: e
|
|
57
61
|
})),
|
|
58
|
-
...
|
|
62
|
+
...d.map((e) => ({
|
|
59
63
|
group: "custom",
|
|
60
64
|
variable: e
|
|
61
65
|
}))
|
|
62
66
|
],
|
|
63
|
-
[
|
|
64
|
-
),
|
|
67
|
+
[u, d]
|
|
68
|
+
), I = b(() => {
|
|
65
69
|
const e = /* @__PURE__ */ new Map();
|
|
66
|
-
return
|
|
67
|
-
e.set(`${t.group}-${t.variable.name}`,
|
|
70
|
+
return n.forEach((t, s) => {
|
|
71
|
+
e.set(`${t.group}-${t.variable.name}`, s);
|
|
68
72
|
}), e;
|
|
69
|
-
}, [
|
|
70
|
-
|
|
71
|
-
(!
|
|
72
|
-
}, [
|
|
73
|
-
const
|
|
73
|
+
}, [n]);
|
|
74
|
+
V(() => {
|
|
75
|
+
(!m || !n.length) && o(-1);
|
|
76
|
+
}, [m, n.length]);
|
|
77
|
+
const N = k(
|
|
74
78
|
(e) => {
|
|
75
|
-
|
|
79
|
+
D(e), l();
|
|
76
80
|
},
|
|
77
|
-
[
|
|
78
|
-
),
|
|
79
|
-
if (!
|
|
80
|
-
e.key === "Escape" &&
|
|
81
|
+
[l, D]
|
|
82
|
+
), K = (e) => {
|
|
83
|
+
if (!n.length) {
|
|
84
|
+
e.key === "Escape" && l();
|
|
81
85
|
return;
|
|
82
86
|
}
|
|
83
87
|
if (e.key === "ArrowDown")
|
|
84
|
-
e.preventDefault(),
|
|
88
|
+
e.preventDefault(), o((t) => (t + 1) % n.length);
|
|
85
89
|
else if (e.key === "ArrowUp")
|
|
86
|
-
e.preventDefault(),
|
|
87
|
-
(t) => t <= 0 ?
|
|
90
|
+
e.preventDefault(), o(
|
|
91
|
+
(t) => t <= 0 ? n.length - 1 : t - 1
|
|
88
92
|
);
|
|
89
93
|
else if (e.key === "Enter") {
|
|
90
94
|
e.preventDefault();
|
|
91
|
-
const t =
|
|
92
|
-
t &&
|
|
93
|
-
} else e.key === "Escape" && (e.preventDefault(),
|
|
95
|
+
const t = n[w];
|
|
96
|
+
t && N(t.variable);
|
|
97
|
+
} else e.key === "Escape" && (e.preventDefault(), l());
|
|
94
98
|
};
|
|
95
|
-
return
|
|
99
|
+
return m ? /* @__PURE__ */ c(
|
|
96
100
|
"div",
|
|
97
101
|
{
|
|
98
|
-
ref:
|
|
102
|
+
ref: f,
|
|
99
103
|
className: "markdown-flow-editor-variable-search",
|
|
100
104
|
style: {
|
|
101
105
|
position: "fixed",
|
|
102
|
-
left: `${
|
|
103
|
-
top: `${
|
|
106
|
+
left: `${S.left}px`,
|
|
107
|
+
top: `${S.top}px`
|
|
104
108
|
},
|
|
105
109
|
children: [
|
|
106
|
-
/* @__PURE__ */
|
|
107
|
-
/* @__PURE__ */
|
|
108
|
-
/* @__PURE__ */
|
|
109
|
-
|
|
110
|
+
/* @__PURE__ */ c("div", { className: "relative", children: [
|
|
111
|
+
/* @__PURE__ */ a(T, { className: "variable-search-icon" }),
|
|
112
|
+
/* @__PURE__ */ a(
|
|
113
|
+
P,
|
|
110
114
|
{
|
|
111
|
-
ref:
|
|
112
|
-
value:
|
|
113
|
-
placeholder:
|
|
115
|
+
ref: C,
|
|
116
|
+
value: A,
|
|
117
|
+
placeholder: h.searchPlaceholder,
|
|
114
118
|
onChange: (e) => E(e.target.value),
|
|
115
|
-
onKeyDown:
|
|
119
|
+
onKeyDown: K,
|
|
116
120
|
className: "variable-search-input"
|
|
117
121
|
}
|
|
118
122
|
)
|
|
119
123
|
] }),
|
|
120
|
-
/* @__PURE__ */
|
|
121
|
-
|
|
122
|
-
/* @__PURE__ */
|
|
123
|
-
|
|
124
|
-
const t =
|
|
125
|
-
return /* @__PURE__ */
|
|
124
|
+
/* @__PURE__ */ c("div", { className: "variable-search-list", children: [
|
|
125
|
+
u.length > 0 && /* @__PURE__ */ c("div", { className: "variable-search-section", children: [
|
|
126
|
+
/* @__PURE__ */ a("p", { className: "variable-search-section-title", children: h.systemLabel }),
|
|
127
|
+
u.map((e) => {
|
|
128
|
+
const t = I.get(`system-${e.name}`) ?? -1;
|
|
129
|
+
return /* @__PURE__ */ c(
|
|
126
130
|
"button",
|
|
127
131
|
{
|
|
128
132
|
type: "button",
|
|
129
|
-
onClick: () =>
|
|
133
|
+
onClick: () => N(e),
|
|
130
134
|
onMouseEnter: () => {
|
|
131
|
-
t >= 0 &&
|
|
135
|
+
t >= 0 && o(t);
|
|
132
136
|
},
|
|
133
|
-
className:
|
|
137
|
+
className: z(
|
|
134
138
|
"variable-search-item",
|
|
135
|
-
|
|
139
|
+
w === t && "variable-search-item-active"
|
|
136
140
|
),
|
|
137
141
|
children: [
|
|
138
|
-
/* @__PURE__ */
|
|
139
|
-
e.label && /* @__PURE__ */
|
|
142
|
+
/* @__PURE__ */ a("span", { className: "variable-search-item-name", children: e.name }),
|
|
143
|
+
e.label && /* @__PURE__ */ a("span", { className: "variable-search-item-label", children: e.label })
|
|
140
144
|
]
|
|
141
145
|
},
|
|
142
146
|
`system-${e.name}`
|
|
143
147
|
);
|
|
144
148
|
})
|
|
145
149
|
] }),
|
|
146
|
-
|
|
147
|
-
/* @__PURE__ */
|
|
148
|
-
|
|
149
|
-
const t =
|
|
150
|
-
return /* @__PURE__ */
|
|
150
|
+
d.length > 0 && /* @__PURE__ */ c("div", { className: "variable-search-section", children: [
|
|
151
|
+
/* @__PURE__ */ a("p", { className: "variable-search-section-title", children: h.customLabel }),
|
|
152
|
+
d.map((e) => {
|
|
153
|
+
const t = I.get(`custom-${e.name}`) ?? -1;
|
|
154
|
+
return /* @__PURE__ */ c(
|
|
151
155
|
"button",
|
|
152
156
|
{
|
|
153
157
|
type: "button",
|
|
154
|
-
onClick: () =>
|
|
158
|
+
onClick: () => N(e),
|
|
155
159
|
onMouseEnter: () => {
|
|
156
|
-
t >= 0 &&
|
|
160
|
+
t >= 0 && o(t);
|
|
157
161
|
},
|
|
158
|
-
className:
|
|
162
|
+
className: z(
|
|
159
163
|
"variable-search-item",
|
|
160
|
-
|
|
164
|
+
w === t && "variable-search-item-active"
|
|
161
165
|
),
|
|
162
166
|
children: [
|
|
163
|
-
/* @__PURE__ */
|
|
164
|
-
e.label && /* @__PURE__ */
|
|
167
|
+
/* @__PURE__ */ a("span", { className: "variable-search-item-name", children: e.name }),
|
|
168
|
+
e.label && /* @__PURE__ */ a("span", { className: "variable-search-item-label", children: e.label })
|
|
165
169
|
]
|
|
166
170
|
},
|
|
167
171
|
`custom-${e.name}`
|
|
168
172
|
);
|
|
169
173
|
})
|
|
170
174
|
] }),
|
|
171
|
-
|
|
175
|
+
u.length === 0 && d.length === 0 && /* @__PURE__ */ a("div", { className: "variable-search-empty", children: h.emptyLabel })
|
|
172
176
|
] })
|
|
173
177
|
]
|
|
174
178
|
}
|
|
175
179
|
) : null;
|
|
176
180
|
};
|
|
177
181
|
export {
|
|
178
|
-
|
|
182
|
+
W as default
|
|
179
183
|
};
|
|
180
184
|
//# sourceMappingURL=VariableSearchDropdown.es.js.map
|