markdown-flow-ui 0.1.111 → 0.1.112

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.
Files changed (39) hide show
  1. package/dist/_virtual/index.cjs10.js +1 -1
  2. package/dist/_virtual/index.cjs9.js +1 -1
  3. package/dist/_virtual/index.es10.js +2 -2
  4. package/dist/_virtual/index.es9.js +2 -2
  5. package/dist/assets/markdown-flow-ui.css +1 -1
  6. package/dist/components/MarkdownFlowEditor/MarkdownFlowEditor.cjs.js +1 -1
  7. package/dist/components/MarkdownFlowEditor/MarkdownFlowEditor.cjs.js.map +1 -1
  8. package/dist/components/MarkdownFlowEditor/MarkdownFlowEditor.es.js +321 -317
  9. package/dist/components/MarkdownFlowEditor/MarkdownFlowEditor.es.js.map +1 -1
  10. package/dist/components/MarkdownFlowEditor/plugins/ImgPlaceholder.cjs.js +1 -1
  11. package/dist/components/MarkdownFlowEditor/plugins/ImgPlaceholder.cjs.js.map +1 -1
  12. package/dist/components/MarkdownFlowEditor/plugins/ImgPlaceholder.es.js +48 -44
  13. package/dist/components/MarkdownFlowEditor/plugins/ImgPlaceholder.es.js.map +1 -1
  14. package/dist/components/MarkdownFlowEditor/plugins/PlaceholderWidget.cjs.js +1 -1
  15. package/dist/components/MarkdownFlowEditor/plugins/PlaceholderWidget.cjs.js.map +1 -1
  16. package/dist/components/MarkdownFlowEditor/plugins/PlaceholderWidget.d.ts +1 -0
  17. package/dist/components/MarkdownFlowEditor/plugins/PlaceholderWidget.es.js +38 -28
  18. package/dist/components/MarkdownFlowEditor/plugins/PlaceholderWidget.es.js.map +1 -1
  19. package/dist/components/MarkdownFlowEditor/plugins/VideoPlaceholder.cjs.js +1 -1
  20. package/dist/components/MarkdownFlowEditor/plugins/VideoPlaceholder.cjs.js.map +1 -1
  21. package/dist/components/MarkdownFlowEditor/plugins/VideoPlaceholder.es.js +28 -26
  22. package/dist/components/MarkdownFlowEditor/plugins/VideoPlaceholder.es.js.map +1 -1
  23. package/dist/components/MarkdownFlowEditor/utils.cjs.js +1 -1
  24. package/dist/components/MarkdownFlowEditor/utils.cjs.js.map +1 -1
  25. package/dist/components/MarkdownFlowEditor/utils.d.ts +8 -1
  26. package/dist/components/MarkdownFlowEditor/utils.es.js +59 -39
  27. package/dist/components/MarkdownFlowEditor/utils.es.js.map +1 -1
  28. package/dist/components/Slide/Slide.cjs.js.map +1 -1
  29. package/dist/components/Slide/Slide.es.js.map +1 -1
  30. package/dist/components/Slide/useSlide.cjs.js.map +1 -1
  31. package/dist/components/Slide/useSlide.es.js.map +1 -1
  32. package/dist/components/Slide/utils/streamingNavigation.cjs.js.map +1 -1
  33. package/dist/components/Slide/utils/streamingNavigation.es.js.map +1 -1
  34. package/dist/markdown-flow-ui/node_modules/.pnpm/@braintree_sanitize-url@7.1.1/node_modules/@braintree/sanitize-url/dist/index.cjs.js +1 -1
  35. package/dist/markdown-flow-ui/node_modules/.pnpm/@braintree_sanitize-url@7.1.1/node_modules/@braintree/sanitize-url/dist/index.cjs.js.map +1 -1
  36. package/dist/markdown-flow-ui/node_modules/.pnpm/@braintree_sanitize-url@7.1.1/node_modules/@braintree/sanitize-url/dist/index.es.js +1 -1
  37. package/dist/markdown-flow-ui/node_modules/.pnpm/classnames@2.5.1/node_modules/classnames/index.cjs.js +1 -1
  38. package/dist/markdown-flow-ui/node_modules/.pnpm/classnames@2.5.1/node_modules/classnames/index.es.js +1 -1
  39. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"MarkdownFlowEditor.es.js","sources":["../../../src/components/MarkdownFlowEditor/MarkdownFlowEditor.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState, useCallback, useRef, useEffect, useMemo } from \"react\";\nimport CodeMirror from \"@uiw/react-codemirror\";\nimport { autocompletion } from \"@codemirror/autocomplete\";\nimport { EditorView, ViewUpdate } from \"@codemirror/view\";\nimport { markdown } from \"@codemirror/lang-markdown\";\nimport {\n syntaxHighlighting,\n defaultHighlightStyle,\n} from \"@codemirror/language\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"../ui/tooltip\";\nimport CustomDialog from \"./components/CustomDialog\";\nimport CustomPopover from \"./components/CustomPopover\";\nimport EditorToolbar from \"./components/EditorToolbar\";\nimport VariableSearchDropdown from \"./components/VariableSearchDropdown\";\nimport EditorContext from \"./editor-context\";\nimport ImageInject from \"./components/ImageInject\";\nimport VideoInject from \"./components/VideoInject\";\nimport VariableSelect from \"./components/VariableSelect\";\nimport {\n SelectedOption,\n IEditorContext,\n Variable,\n SelectContentInfo,\n PopoverPosition,\n EditorAction,\n EditorApi,\n} from \"./types\";\nimport \"./markdownFlowEditor.css\";\n\nimport {\n createSlashCommands,\n parseContentInfo,\n getVideoContentToInsert,\n extractVariableNames,\n createVariableExpressionRegexp,\n} from \"./utils\";\nimport ImgPlaceholder from \"./plugins/ImgPlaceholder\";\nimport VideoPlaceholder from \"./plugins/VideoPlaceholder\";\nimport VariablePlaceholder from \"./plugins/VariablePlaceholder\";\nimport SyntaxHighlighter from \"./plugins/SyntaxHighlighter\";\n// import createFixedTextPlaceholder from \"./plugins/FixedTextPlaceholder\";\n// import DividerPlaceholder from \"./plugins/DividerPlaceholder\";\nimport enUS from \"./locales/en-US.json\";\nimport zhCN from \"./locales/zh-CN.json\";\nimport { initReactI18next, useTranslation } from \"react-i18next\";\nimport i18next from \"i18next\";\nimport { UploadProps } from \"./uploadTypes\";\n\nconst resources = {\n \"en-US\": { translation: enUS },\n \"zh-CN\": { translation: zhCN },\n};\n\nif (!i18next.isInitialized) {\n i18next.use(initReactI18next).init({\n resources,\n lng: \"en-US\",\n fallbackLng: \"en-US\",\n interpolation: { escapeValue: false },\n });\n} else {\n Object.entries(resources).forEach(([lng, resource]) => {\n i18next.addResourceBundle(\n lng,\n \"translation\",\n resource.translation,\n true,\n true\n );\n });\n}\n\nexport enum EditMode {\n CodeEdit = \"codeEdit\",\n QuickEdit = \"quickEdit\",\n}\n\ntype EditorProps = {\n content?: string;\n editMode?: EditMode;\n variables?: Variable[];\n systemVariables?: Variable[];\n onChange?: (value: string) => void;\n onBlur?: () => void;\n locale?: \"en-US\" | \"zh-CN\";\n uploadProps?: UploadProps;\n disabled?: boolean;\n toolbarActionsRight?: EditorAction[];\n onReady?: (api: EditorApi) => void;\n};\n\nconst EMPTY_VARIABLES: Variable[] = [];\n\n// Detect whether cursor is still inside a {{variable}} expression\nconst isCursorInsideVariableExpression = (\n content: string,\n cursorPosition: number\n) => {\n if (!content || cursorPosition < 0) {\n return false;\n }\n const regexp = createVariableExpressionRegexp();\n let match: RegExpExecArray | null;\n\n while ((match = regexp.exec(content)) !== null) {\n const matchStart = match.index ?? 0;\n const matchEnd = matchStart + match[0].length;\n const innerStart = matchStart + 2;\n const innerEnd = matchEnd - 2;\n if (cursorPosition >= innerStart && cursorPosition <= innerEnd) {\n return true;\n }\n if (regexp.lastIndex === match.index) {\n regexp.lastIndex++;\n }\n }\n\n return false;\n};\n\nconst buildVariableTemplate = (variableName = \"\") => `{{${variableName}}}`;\n\nconst Editor: React.FC<EditorProps> = ({\n content = \"\",\n editMode = EditMode.CodeEdit,\n variables: initialVariables,\n systemVariables: initialSystemVariables,\n onChange,\n onBlur,\n locale = \"en-US\",\n uploadProps,\n disabled = false,\n toolbarActionsRight,\n onReady,\n}) => {\n const { t, i18n } = useTranslation();\n useEffect(() => {\n if (locale && i18n.language !== locale) {\n i18n.changeLanguage(locale);\n }\n }, [i18n, locale]);\n const activeLocale = (locale || i18n.language) as \"en-US\" | \"zh-CN\";\n const currentStrings = resources[activeLocale]?.translation ?? enUS;\n const toolbarLabels = useMemo(\n () => ({\n image: t(\"toolbarInsertImage\", {\n defaultValue: \"Insert image\",\n }),\n video: t(\"toolbarInsertVideo\", {\n defaultValue: \"Insert video\",\n }),\n addVariable: t(\"toolbarInsertNewVariable\", {\n defaultValue: \"Insert new variable\",\n }),\n search: t(\"toolbarInsertExistingVariable\", {\n defaultValue: \"Insert existing variable\",\n }),\n confirmOutput: t(\"toolbarConfirmOutput\", {\n defaultValue: \"Confirm output\",\n }),\n insertLink: t(\"toolbarInsertLink\", {\n defaultValue: \"Insert link\",\n }),\n insertButton: t(\"toolbarInsertButton\", {\n defaultValue: \"Insert button\",\n }),\n insertSingleChoice: t(\"toolbarInsertSingleChoice\", {\n defaultValue: \"Insert single choice\",\n }),\n insertMultiChoice: t(\"toolbarInsertMultiChoice\", {\n defaultValue: \"Insert multi choice\",\n }),\n insertInput: t(\"toolbarInsertInput\", {\n defaultValue: \"Insert input\",\n }),\n singleChoiceOption1: t(\"toolbarChoiceOption1\", {\n defaultValue: \"Option 1\",\n }),\n singleChoiceOption2: t(\"toolbarChoiceOption2\", {\n defaultValue: \"Option 2\",\n }),\n inputPlaceholder: t(\"toolbarInputPlaceholder\", {\n defaultValue: \"Please enter\",\n }),\n }),\n [t]\n );\n const variableSearchLabels = useMemo(\n () => ({\n searchPlaceholder: t(\"variableSearchPlaceholder\", {\n defaultValue: \"Search variable\",\n }),\n systemLabel: t(\"variableSectionSystem\", \"System Variables\"),\n customLabel: t(\"variableSectionCustom\", \"Custom Variables\"),\n emptyLabel: t(\"variableNotFound\", \"No variables found\"),\n }),\n [t]\n );\n const placeholderText =\n editMode === EditMode.QuickEdit\n ? t(\"placeholderQuickEdit\", {\n defaultValue: t(\"placeholderCodeEdit\", {\n defaultValue: t(\"placeholder\"),\n }),\n })\n : t(\"placeholderCodeEdit\", { defaultValue: t(\"placeholder\") });\n // Normalize variables to avoid duplicating system variables in the custom list\n const normalizedSystemVariables = useMemo(() => {\n const seen = new Set<string>();\n return (initialSystemVariables ?? EMPTY_VARIABLES).filter((variable) => {\n const normalized =\n typeof variable?.name === \"string\" ? variable.name.toLowerCase() : \"\";\n if (!normalized || seen.has(normalized)) {\n return false;\n }\n seen.add(normalized);\n return true;\n });\n }, [initialSystemVariables]);\n\n const normalizedCustomVariables = useMemo(() => {\n const systemNameSet = new Set(\n normalizedSystemVariables.map((variable) => variable.name.toLowerCase())\n );\n const seen = new Set<string>();\n return (initialVariables ?? EMPTY_VARIABLES).filter((variable) => {\n const normalized =\n typeof variable?.name === \"string\" ? variable.name.toLowerCase() : \"\";\n if (\n !normalized ||\n systemNameSet.has(normalized) ||\n seen.has(normalized)\n ) {\n return false;\n }\n seen.add(normalized);\n return true;\n });\n }, [initialVariables, normalizedSystemVariables]);\n\n const [dialogOpen, setDialogOpen] = useState(false);\n const [popoverOpen, setPopoverOpen] = useState(false);\n const [popoverPosition, setPopoverPosition] =\n useState<PopoverPosition | null>(null);\n const [variables, setVariables] = useState<Variable[]>(\n normalizedCustomVariables\n );\n const [systemVariables, setSystemVariables] = useState<Variable[]>(\n normalizedSystemVariables\n );\n\n useEffect(() => {\n setVariables(normalizedCustomVariables);\n }, [normalizedCustomVariables]);\n\n useEffect(() => {\n setSystemVariables(normalizedSystemVariables);\n }, [normalizedSystemVariables]);\n\n const [selectedOption, setSelectedOption] = useState<SelectedOption>(\n SelectedOption.Empty\n );\n const [selectContentInfo, setSelectContentInfo] =\n useState<SelectContentInfo | null>();\n const editorViewRef = useRef<EditorView | null>(null);\n const pendingVariableContentRef = useRef<string | null>(null);\n const variableSearchAnchorRef = useRef<HTMLButtonElement | null>(null);\n const [variableSearchOpen, setVariableSearchOpen] = useState(false);\n const closeVariableSearch = useCallback(() => {\n setVariableSearchOpen(false);\n variableSearchAnchorRef.current = null;\n }, []);\n const handleVariableSearchToggle = useCallback(\n (button: HTMLButtonElement) => {\n if (disabled) {\n return;\n }\n if (variableSearchOpen && variableSearchAnchorRef.current === button) {\n closeVariableSearch();\n return;\n }\n variableSearchAnchorRef.current = button;\n setVariableSearchOpen(true);\n },\n [closeVariableSearch, disabled, variableSearchOpen]\n );\n\n const editorContextValue: IEditorContext = {\n selectedOption,\n setSelectedOption,\n dialogOpen,\n setDialogOpen,\n popoverOpen,\n setPopoverOpen,\n popoverPosition,\n setPopoverPosition,\n };\n\n useEffect(() => {\n if (!disabled) {\n return;\n }\n setDialogOpen(false);\n setPopoverOpen(false);\n setSelectedOption(SelectedOption.Empty);\n setSelectContentInfo(null);\n setPopoverPosition(null);\n closeVariableSearch();\n }, [\n closeVariableSearch,\n disabled,\n setDialogOpen,\n setPopoverOpen,\n setPopoverPosition,\n setSelectedOption,\n setSelectContentInfo,\n ]);\n\n const addVariablesFromContent = useCallback(\n (text: string) => {\n if (editMode !== EditMode.QuickEdit || !text) {\n return;\n }\n\n const names = extractVariableNames(text);\n if (!names.length) {\n return;\n }\n\n const systemNameSet = new Set(\n systemVariables.map((variable) => variable.name.toLowerCase())\n );\n\n setVariables((prev) => {\n const existingNames = new Set(\n prev.map((variable) => variable.name.toLowerCase())\n );\n const addedNames = new Set<string>();\n const newVariables: Variable[] = [];\n\n names.forEach((rawName) => {\n const normalized = rawName.toLowerCase();\n if (\n !rawName ||\n systemNameSet.has(normalized) ||\n existingNames.has(normalized) ||\n addedNames.has(normalized)\n ) {\n return;\n }\n newVariables.push({ name: rawName });\n addedNames.add(normalized);\n });\n\n if (!newVariables.length) {\n return prev;\n }\n\n return [...newVariables, ...prev];\n });\n },\n [editMode, systemVariables]\n );\n\n useEffect(() => {\n addVariablesFromContent(content);\n }, [content, addVariablesFromContent]);\n\n // const insertFixedText = useCallback(() => {\n // if (!editorViewRef.current) return;\n // const view = editorViewRef.current;\n // const { state, dispatch } = view;\n // const selection = state.selection.main;\n // const selectedText = state.sliceDoc(selection.from, selection.to);\n // const startTag = \"===\";\n // const endTag = \"===\";\n // const insertContent = `${startTag}${selectedText ?? \"\"}${endTag}`;\n\n // dispatch({\n // changes: {\n // from: selection.from,\n // to: selection.to,\n // insert: insertContent,\n // },\n // selection: {\n // anchor: selection.from + startTag.length + (selectedText?.length ?? 0),\n // },\n // });\n // view.focus();\n // }, []);\n\n // const insertDivider = useCallback(() => {\n // if (!editorViewRef.current) return;\n // const view = editorViewRef.current;\n // const { state, dispatch } = view;\n // const selection = state.selection.main;\n // const insertContent = `\\n\\n---\\n\\n`;\n\n // dispatch({\n // changes: {\n // from: selection.from,\n // to: selection.to,\n // insert: insertContent,\n // },\n // selection: {\n // anchor: selection.from + insertContent.length,\n // },\n // });\n // view.focus();\n // }, []);\n\n const onSelectedOption = useCallback(\n (option: SelectedOption) => {\n if (disabled) {\n return;\n }\n closeVariableSearch();\n // if (option === SelectedOption.FixedText) {\n // insertFixedText();\n // setSelectedOption(SelectedOption.Empty);\n // setDialogOpen(false);\n // setPopoverOpen(false);\n // setSelectContentInfo(null);\n // setPopoverPosition(null);\n // return;\n // }\n\n // if (option === SelectedOption.Divider) {\n // insertDivider();\n // setSelectedOption(SelectedOption.Empty);\n // setDialogOpen(false);\n // setPopoverOpen(false);\n // setSelectContentInfo(null);\n // setPopoverPosition(null);\n // return;\n // }\n\n setSelectedOption(option);\n\n if (option === SelectedOption.Variable) {\n if (editorViewRef.current) {\n const { state } = editorViewRef.current;\n const pos = state.selection.main.from;\n const coords = editorViewRef.current.coordsAtPos(pos);\n if (coords) {\n setPopoverPosition({\n x: coords.left,\n y: coords.bottom,\n });\n }\n }\n setPopoverOpen(true);\n } else {\n setDialogOpen(true);\n }\n },\n [closeVariableSearch, disabled]\n );\n\n const insertText = useCallback(\n (text: string) => {\n if (disabled || !editorViewRef.current) return;\n\n const { state, dispatch } = editorViewRef.current;\n const from = state.selection.main.from;\n\n dispatch({\n changes: { from, insert: text },\n selection: { anchor: from + text.length },\n });\n },\n [editorViewRef, disabled]\n );\n\n const replaceSelection = useCallback(\n (text: string) => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const { state, dispatch } = editorViewRef.current;\n const selection = state.selection.main;\n dispatch({\n changes: { from: selection.from, to: selection.to, insert: text },\n selection: { anchor: selection.from + text.length },\n });\n },\n [disabled]\n );\n\n const focusEditor = useCallback(() => {\n editorViewRef.current?.focus();\n }, []);\n\n const getContent = useCallback(() => {\n return editorViewRef.current?.state.doc.toString() ?? \"\";\n }, []);\n\n const setContent = useCallback(\n (text: string) => {\n if (disabled) {\n return;\n }\n if (!editorViewRef.current) {\n onChange?.(text);\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n dispatch({\n changes: { from: 0, to: state.doc.length, insert: text },\n selection: { anchor: text.length },\n });\n },\n [disabled, onChange]\n );\n\n const deleteSelectedContent = useCallback(() => {\n if (disabled) {\n return;\n }\n if (\n !selectContentInfo ||\n !editorViewRef.current ||\n selectContentInfo.from === -1\n )\n return;\n\n const { from, to } = selectContentInfo;\n const { dispatch } = editorViewRef.current;\n\n dispatch({\n changes: { from, to, insert: \"\" },\n });\n }, [selectContentInfo, editorViewRef, disabled]);\n\n const insertVariableContent = useCallback(\n (\n variableName: string,\n range?: { from: number; to: number },\n placeCursorAtEnd = false\n ) => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n const selection = range ?? state.selection.main;\n const template = buildVariableTemplate(variableName);\n const cursorOffset = placeCursorAtEnd\n ? template.length\n : 2 + variableName.length; // 2 braces before variable content\n\n dispatch({\n changes: {\n from: selection.from,\n to: selection.to,\n insert: template,\n },\n selection: {\n anchor: selection.from + cursorOffset,\n },\n });\n view.focus();\n },\n [disabled]\n );\n\n const insertVariableTemplate = useCallback(() => {\n if (disabled) {\n return;\n }\n closeVariableSearch();\n insertVariableContent(\"\");\n }, [closeVariableSearch, disabled, insertVariableContent]);\n\n const insertConfirmOutputMarker = useCallback(() => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n const selection = state.selection.main;\n const template = \"======\";\n dispatch({\n changes: {\n from: selection.from,\n to: selection.to,\n insert: template,\n },\n selection: {\n anchor: selection.from + 3,\n },\n });\n view.focus();\n }, [disabled]);\n\n const insertLinkTemplate = useCallback(() => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n const selection = state.selection.main;\n const template = \"[]()\";\n dispatch({\n changes: {\n from: selection.from,\n to: selection.to,\n insert: template,\n },\n selection: {\n anchor: selection.from + 1,\n },\n });\n view.focus();\n }, [disabled]);\n\n const insertButtonTemplate = useCallback(() => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n const selection = state.selection.main;\n const template = \"?[]\";\n dispatch({\n changes: {\n from: selection.from,\n to: selection.to,\n insert: template,\n },\n selection: {\n anchor: selection.from + 2,\n },\n });\n view.focus();\n }, [disabled]);\n\n const insertSingleChoiceTemplate = useCallback(() => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n const selection = state.selection.main;\n const optionLabel1 = toolbarLabels.singleChoiceOption1;\n const optionLabel2 = toolbarLabels.singleChoiceOption2;\n const template = `?[%{{}} ${optionLabel1} | ${optionLabel2}]`;\n dispatch({\n changes: {\n from: selection.from,\n to: selection.to,\n insert: template,\n },\n selection: {\n anchor: selection.from + 5,\n },\n });\n view.focus();\n }, [\n disabled,\n toolbarLabels.singleChoiceOption1,\n toolbarLabels.singleChoiceOption2,\n ]);\n\n const insertMultiChoiceTemplate = useCallback(() => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n const selection = state.selection.main;\n const optionLabel1 = toolbarLabels.singleChoiceOption1;\n const optionLabel2 = toolbarLabels.singleChoiceOption2;\n const template = `?[%{{}} ${optionLabel1} || ${optionLabel2}]`;\n dispatch({\n changes: {\n from: selection.from,\n to: selection.to,\n insert: template,\n },\n selection: {\n anchor: selection.from + 5,\n },\n });\n view.focus();\n }, [\n disabled,\n toolbarLabels.singleChoiceOption1,\n toolbarLabels.singleChoiceOption2,\n ]);\n\n const insertInputFieldTemplate = useCallback(() => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n const selection = state.selection.main;\n const placeholder = toolbarLabels.inputPlaceholder ?? \"请输入\";\n const template = `?[%{{}}...${placeholder}]`;\n dispatch({\n changes: {\n from: selection.from,\n to: selection.to,\n insert: template,\n },\n selection: {\n anchor: selection.from + 5,\n },\n });\n view.focus();\n }, [disabled, toolbarLabels.inputPlaceholder]);\n\n const handleSelectImage = useCallback(\n ({\n resourceUrl,\n resourceTitle,\n scalePercent,\n }: {\n resourceUrl?: string;\n resourceTitle?: string;\n scalePercent?: number;\n }) => {\n if (!resourceUrl || disabled) return;\n const sanitizedHtmlUrl = resourceUrl.replace(/\"/g, \"&quot;\");\n const clampedScale =\n typeof scalePercent === \"number\"\n ? Math.max(1, Math.min(1000, Math.round(scalePercent)))\n : undefined;\n const sanitizedTitle = resourceTitle?.replace(/\"/g, \"&quot;\");\n const escapeMarkdownText = (text: string) =>\n text.replace(/([\\[\\]\\\\])/g, \"\\\\$1\");\n const markdownTitle = resourceTitle\n ? escapeMarkdownText(resourceTitle)\n : \"\";\n const widthAttribute =\n typeof clampedScale === \"number\" && clampedScale !== 100\n ? ` width=\"${clampedScale}%\"`\n : \"\";\n const htmlTitleAttributes = sanitizedTitle\n ? ` alt=\"${sanitizedTitle}\" title=\"${sanitizedTitle}\"`\n : \"\";\n\n const textToInsert =\n !clampedScale || clampedScale === 100\n ? `![${markdownTitle}](${resourceUrl})`\n : `<img src=\"${sanitizedHtmlUrl}\"${htmlTitleAttributes}${widthAttribute} />`;\n if (selectContentInfo?.type === SelectedOption.Image) {\n deleteSelectedContent();\n if (!editorViewRef.current) return;\n const { dispatch } = editorViewRef.current;\n dispatch({\n changes: { from: selectContentInfo.from, insert: textToInsert },\n });\n } else {\n insertText(textToInsert);\n }\n setDialogOpen(false);\n },\n [insertText, selectedOption, disabled]\n );\n\n const handleSelectVideo = useCallback(\n ({\n resourceUrl,\n resourceTitle,\n }: {\n resourceUrl: string;\n resourceTitle: string;\n }) => {\n if (disabled) {\n return;\n }\n const textToInsert = getVideoContentToInsert(resourceUrl, resourceTitle);\n if (selectContentInfo?.type === SelectedOption.Video) {\n deleteSelectedContent();\n if (!editorViewRef.current) return;\n const { dispatch } = editorViewRef.current;\n dispatch({\n changes: { from: selectContentInfo.from, insert: textToInsert },\n });\n } else {\n insertText(textToInsert);\n }\n setDialogOpen(false);\n },\n [insertText, selectedOption, disabled]\n );\n\n const handleSelectVariable = useCallback(\n (variable: Variable) => {\n if (disabled) {\n return;\n }\n const selectionRange =\n selectContentInfo?.type === SelectedOption.Variable\n ? { from: selectContentInfo.from, to: selectContentInfo.to }\n : undefined;\n insertVariableContent(variable.name, selectionRange, true);\n setPopoverOpen(false);\n closeVariableSearch();\n },\n [disabled, insertVariableContent, selectContentInfo, closeVariableSearch]\n );\n\n const slashCommandsExtension = useCallback(() => {\n return autocompletion({\n override: [\n createSlashCommands(onSelectedOption, {\n // divider: currentStrings.slashDivider,\n // fixedText: currentStrings.slashFixedText,\n image: currentStrings.slashImage,\n video: currentStrings.slashVideo,\n variable: currentStrings.slashVariable,\n }),\n ],\n });\n }, [\n // currentStrings.slashDivider,\n // currentStrings.slashFixedText,\n currentStrings.slashImage,\n currentStrings.slashVideo,\n currentStrings.slashVariable,\n onSelectedOption,\n ]);\n\n // const fixedTextPlaceholderExtension = useMemo(\n // () =>\n // createFixedTextPlaceholder(\n // currentStrings.fixedTextPlaceholder ?? \"添加固定文本\",\n // currentStrings.fixedTextTooltip ??\n // currentStrings.slashFixedText ??\n // \"固定文本\"\n // ),\n // [\n // currentStrings.fixedTextPlaceholder,\n // currentStrings.fixedTextTooltip,\n // currentStrings.slashFixedText,\n // ]\n // );\n\n const handleEditorUpdate = useCallback(\n (update: ViewUpdate) => {\n editorViewRef.current = update.view;\n if (\n editMode === EditMode.QuickEdit &&\n pendingVariableContentRef.current &&\n update.selectionSet\n ) {\n const cursorPosition = update.state.selection.main.head;\n const docText = update.state.doc.toString();\n const stillInside = isCursorInsideVariableExpression(\n docText,\n cursorPosition\n );\n if (!stillInside) {\n addVariablesFromContent(docText);\n pendingVariableContentRef.current = null;\n }\n }\n },\n [addVariablesFromContent, editMode]\n );\n\n const handleTagClick = useCallback(\n (event: any) => {\n event.stopPropagation();\n if (disabled) {\n return;\n }\n const { type, from, to, dataset, target } = event.detail;\n const value = parseContentInfo(type, dataset);\n setSelectContentInfo({\n type,\n value,\n from,\n to,\n });\n setSelectedOption(type);\n\n if (type === SelectedOption.Variable) {\n if (target) {\n const rect = target.getBoundingClientRect();\n setPopoverPosition({\n x: rect.left,\n y: rect.bottom,\n });\n }\n setPopoverOpen(true);\n } else {\n setDialogOpen(true);\n }\n },\n [disabled]\n );\n\n useEffect(() => {\n if (!dialogOpen) {\n setSelectedOption(SelectedOption.Empty);\n setSelectContentInfo(null);\n }\n }, [dialogOpen]);\n\n useEffect(() => {\n if (!popoverOpen && selectedOption === SelectedOption.Variable) {\n setSelectedOption(SelectedOption.Empty);\n setSelectContentInfo(null);\n }\n }, [popoverOpen, selectedOption]);\n\n useEffect(() => {\n const handleWrap = (e: any) => {\n if (e.detail.view === editorViewRef.current) {\n handleTagClick(e);\n }\n };\n window.addEventListener(\"globalTagClick\", handleWrap);\n return () => {\n window.removeEventListener(\"globalTagClick\", handleWrap);\n };\n }, [handleTagClick]);\n\n const editorExtensions = useMemo(() => {\n const extensions = [\n EditorView.lineWrapping,\n markdown(),\n syntaxHighlighting(defaultHighlightStyle),\n SyntaxHighlighter,\n ];\n\n if (!disabled) {\n extensions.push(slashCommandsExtension());\n }\n\n if (editMode === EditMode.QuickEdit) {\n extensions.push(\n ImgPlaceholder,\n VideoPlaceholder,\n VariablePlaceholder\n // fixedTextPlaceholderExtension,\n // DividerPlaceholder,\n );\n }\n\n extensions.push(\n EditorView.updateListener.of((update) => {\n handleEditorUpdate(update);\n })\n );\n\n return extensions;\n }, [disabled, editMode, slashCommandsExtension, handleEditorUpdate]);\n\n const handleContentChange = useCallback(\n (value: string) => {\n if (disabled) {\n return;\n }\n const cursorPosition =\n editorViewRef.current?.state.selection.main.head ?? -1;\n const skipAddition = isCursorInsideVariableExpression(\n value,\n cursorPosition\n );\n if (skipAddition) {\n pendingVariableContentRef.current = value;\n } else {\n pendingVariableContentRef.current = null;\n addVariablesFromContent(value);\n }\n onChange?.(value);\n },\n [addVariablesFromContent, onChange, disabled]\n );\n\n const isVariableSearchOpen = !disabled && variableSearchOpen;\n const editorApi = useMemo(\n () => ({\n insertTextAtCursor: insertText,\n replaceSelection,\n focus: focusEditor,\n getContent,\n setContent,\n }),\n [focusEditor, getContent, insertText, replaceSelection, setContent]\n );\n\n const handleToolbarActionClick = useCallback(\n (action: EditorAction) => {\n if (disabled || \"render\" in action) {\n return;\n }\n action.onClick?.(editorApi);\n },\n [disabled, editorApi]\n );\n\n const toolbarRightSlot = useMemo(() => {\n if (!toolbarActionsRight?.length) {\n return null;\n }\n return (\n <div className=\"markdown-flow-editor-toolbar-right\">\n {toolbarActionsRight.map((action) => {\n if (\"render\" in action) {\n return (\n <div\n className=\"markdown-flow-editor-toolbar-right-item\"\n key={action.key}\n >\n {action.render(editorApi)}\n </div>\n );\n }\n const ariaLabel = action.label || action.tooltip || undefined;\n const button = (\n <button\n type=\"button\"\n key={action.key}\n disabled={disabled || action.disabled}\n onClick={() => handleToolbarActionClick(action)}\n className=\"markdown-flow-editor-toolbar-right-button\"\n aria-label={ariaLabel}\n title={action.label || action.tooltip}\n >\n {action.icon ? (\n <span className=\"toolbar-right-icon\">{action.icon}</span>\n ) : null}\n {action.label ? (\n <span className=\"toolbar-right-label\">{action.label}</span>\n ) : null}\n </button>\n );\n const wrapped = action.tooltip ? (\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent side=\"top\">{action.tooltip}</TooltipContent>\n </Tooltip>\n ) : (\n button\n );\n return (\n <div\n className=\"markdown-flow-editor-toolbar-right-item\"\n key={action.key}\n >\n {wrapped}\n </div>\n );\n })}\n </div>\n );\n }, [disabled, editorApi, handleToolbarActionClick, toolbarActionsRight]);\n\n useEffect(() => {\n onReady?.(editorApi);\n }, [editorApi]);\n\n return (\n <div\n className=\"markdown-flow-editor\"\n data-disabled={disabled ? \"true\" : undefined}\n aria-disabled={disabled}\n >\n <EditorToolbar\n disabled={disabled}\n labels={toolbarLabels}\n onSelect={onSelectedOption}\n onInsertVariablePlaceholder={insertVariableTemplate}\n onVariableSearchToggle={handleVariableSearchToggle}\n onVariableSearchClose={closeVariableSearch}\n onInsertConfirmOutput={insertConfirmOutputMarker}\n onInsertLink={insertLinkTemplate}\n onInsertButton={insertButtonTemplate}\n onInsertSingleChoice={insertSingleChoiceTemplate}\n onInsertMultiChoice={insertMultiChoiceTemplate}\n onInsertInputField={insertInputFieldTemplate}\n variableSearchActive={isVariableSearchOpen}\n rightSlot={toolbarRightSlot}\n />\n <VariableSearchDropdown\n open={isVariableSearchOpen}\n anchorElement={variableSearchAnchorRef.current}\n onClose={closeVariableSearch}\n onSelect={handleSelectVariable}\n variables={variables}\n systemVariables={systemVariables}\n labels={variableSearchLabels}\n />\n <div className=\"markdown-flow-editor-body relative overflow-auto\">\n <EditorContext.Provider value={editorContextValue}>\n <CodeMirror\n extensions={editorExtensions}\n basicSetup={{\n lineNumbers: false,\n syntaxHighlighting: true,\n highlightActiveLine: true,\n highlightActiveLineGutter: true,\n foldGutter: false,\n }}\n className=\"rounded-md\"\n placeholder={placeholderText}\n value={content}\n theme=\"light\"\n minHeight=\"2rem\"\n editable={!disabled}\n onChange={handleContentChange}\n onBlur={onBlur}\n />\n {!disabled && (\n <CustomDialog\n labels={{\n title:\n selectedOption === SelectedOption.Image\n ? t(\"dialogTitleImage\")\n : selectedOption === SelectedOption.Video\n ? t(\"dialogTitleVideo\")\n : selectedOption === SelectedOption.Variable\n ? t(\"dialogTitleVariable\")\n : t(\"dialogTitle\"),\n }}\n >\n {selectedOption === SelectedOption.Image && (\n <ImageInject\n value={selectContentInfo?.value}\n onSelect={handleSelectImage}\n uploadProps={uploadProps}\n />\n )}\n {selectedOption === SelectedOption.Video && (\n <VideoInject\n value={selectContentInfo?.value}\n onSelect={handleSelectVideo}\n />\n )}\n </CustomDialog>\n )}\n\n {!disabled && (\n <CustomPopover>\n <VariableSelect\n variables={variables}\n systemVariables={systemVariables}\n selectedName={selectContentInfo?.value?.variableName}\n onSelect={handleSelectVariable}\n onAddVariable={(variable) => {\n setVariables((prev) => {\n const normalized = variable.name.toLowerCase();\n const exists = prev.some(\n (item) => item.name.toLowerCase() === normalized\n );\n if (exists) {\n return prev;\n }\n return [variable, ...prev];\n });\n }}\n />\n </CustomPopover>\n )}\n </EditorContext.Provider>\n </div>\n </div>\n );\n};\n\nexport default Editor;\n"],"names":["resources","enUS","zhCN","i18next","lng","resource","initReactI18next","EMPTY_VARIABLES","isCursorInsideVariableExpression","content","cursorPosition","regexp","createVariableExpressionRegexp","match","matchStart","matchEnd","innerStart","innerEnd","buildVariableTemplate","variableName","Editor","editMode","initialVariables","initialSystemVariables","onChange","onBlur","locale","uploadProps","disabled","toolbarActionsRight","onReady","t","i18n","useTranslation","useEffect","activeLocale","currentStrings","toolbarLabels","useMemo","variableSearchLabels","placeholderText","normalizedSystemVariables","seen","variable","normalized","normalizedCustomVariables","systemNameSet","dialogOpen","setDialogOpen","useState","popoverOpen","setPopoverOpen","popoverPosition","setPopoverPosition","variables","setVariables","systemVariables","setSystemVariables","selectedOption","setSelectedOption","SelectedOption","selectContentInfo","setSelectContentInfo","editorViewRef","useRef","pendingVariableContentRef","variableSearchAnchorRef","variableSearchOpen","setVariableSearchOpen","closeVariableSearch","useCallback","handleVariableSearchToggle","button","editorContextValue","addVariablesFromContent","text","names","extractVariableNames","prev","existingNames","addedNames","newVariables","rawName","onSelectedOption","option","state","pos","coords","insertText","dispatch","from","replaceSelection","selection","focusEditor","getContent","setContent","view","deleteSelectedContent","to","insertVariableContent","range","placeCursorAtEnd","template","cursorOffset","insertVariableTemplate","insertConfirmOutputMarker","insertLinkTemplate","insertButtonTemplate","insertSingleChoiceTemplate","optionLabel1","optionLabel2","insertMultiChoiceTemplate","insertInputFieldTemplate","handleSelectImage","resourceUrl","resourceTitle","scalePercent","sanitizedHtmlUrl","clampedScale","sanitizedTitle","markdownTitle","widthAttribute","htmlTitleAttributes","textToInsert","handleSelectVideo","getVideoContentToInsert","handleSelectVariable","selectionRange","slashCommandsExtension","autocompletion","createSlashCommands","handleEditorUpdate","update","docText","handleTagClick","event","type","dataset","target","value","parseContentInfo","rect","handleWrap","e","editorExtensions","extensions","EditorView","markdown","syntaxHighlighting","defaultHighlightStyle","SyntaxHighlighter","ImgPlaceholder","VideoPlaceholder","VariablePlaceholder","handleContentChange","isVariableSearchOpen","editorApi","handleToolbarActionClick","action","toolbarRightSlot","jsx","ariaLabel","jsxs","wrapped","Tooltip","TooltipTrigger","TooltipContent","EditorToolbar","VariableSearchDropdown","EditorContext","CodeMirror","CustomDialog","ImageInject","VideoInject","CustomPopover","VariableSelect","item"],"mappings":"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"}
1
+ {"version":3,"file":"MarkdownFlowEditor.es.js","sources":["../../../src/components/MarkdownFlowEditor/MarkdownFlowEditor.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState, useCallback, useRef, useEffect, useMemo } from \"react\";\nimport CodeMirror from \"@uiw/react-codemirror\";\nimport { autocompletion } from \"@codemirror/autocomplete\";\nimport { EditorView, ViewUpdate } from \"@codemirror/view\";\nimport { markdown } from \"@codemirror/lang-markdown\";\nimport {\n syntaxHighlighting,\n defaultHighlightStyle,\n} from \"@codemirror/language\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"../ui/tooltip\";\nimport CustomDialog from \"./components/CustomDialog\";\nimport CustomPopover from \"./components/CustomPopover\";\nimport EditorToolbar from \"./components/EditorToolbar\";\nimport VariableSearchDropdown from \"./components/VariableSearchDropdown\";\nimport EditorContext from \"./editor-context\";\nimport ImageInject from \"./components/ImageInject\";\nimport VideoInject from \"./components/VideoInject\";\nimport VariableSelect from \"./components/VariableSelect\";\nimport {\n SelectedOption,\n IEditorContext,\n Variable,\n SelectContentInfo,\n PopoverPosition,\n EditorAction,\n EditorApi,\n} from \"./types\";\nimport \"./markdownFlowEditor.css\";\n\nimport {\n createSlashCommands,\n parseContentInfo,\n getImageContentToInsert,\n getVideoContentToInsert,\n extractVariableNames,\n createVariableExpressionRegexp,\n} from \"./utils\";\nimport ImgPlaceholder from \"./plugins/ImgPlaceholder\";\nimport VideoPlaceholder from \"./plugins/VideoPlaceholder\";\nimport VariablePlaceholder from \"./plugins/VariablePlaceholder\";\nimport SyntaxHighlighter from \"./plugins/SyntaxHighlighter\";\n// import createFixedTextPlaceholder from \"./plugins/FixedTextPlaceholder\";\n// import DividerPlaceholder from \"./plugins/DividerPlaceholder\";\nimport enUS from \"./locales/en-US.json\";\nimport zhCN from \"./locales/zh-CN.json\";\nimport { initReactI18next, useTranslation } from \"react-i18next\";\nimport i18next from \"i18next\";\nimport { UploadProps } from \"./uploadTypes\";\n\nconst resources = {\n \"en-US\": { translation: enUS },\n \"zh-CN\": { translation: zhCN },\n};\n\nif (!i18next.isInitialized) {\n i18next.use(initReactI18next).init({\n resources,\n lng: \"en-US\",\n fallbackLng: \"en-US\",\n interpolation: { escapeValue: false },\n });\n} else {\n Object.entries(resources).forEach(([lng, resource]) => {\n i18next.addResourceBundle(\n lng,\n \"translation\",\n resource.translation,\n true,\n true\n );\n });\n}\n\nexport enum EditMode {\n CodeEdit = \"codeEdit\",\n QuickEdit = \"quickEdit\",\n}\n\ntype EditorProps = {\n content?: string;\n editMode?: EditMode;\n variables?: Variable[];\n systemVariables?: Variable[];\n onChange?: (value: string) => void;\n onBlur?: () => void;\n locale?: \"en-US\" | \"zh-CN\";\n uploadProps?: UploadProps;\n disabled?: boolean;\n toolbarActionsRight?: EditorAction[];\n onReady?: (api: EditorApi) => void;\n};\n\nconst EMPTY_VARIABLES: Variable[] = [];\n\n// Detect whether cursor is still inside a {{variable}} expression\nconst isCursorInsideVariableExpression = (\n content: string,\n cursorPosition: number\n) => {\n if (!content || cursorPosition < 0) {\n return false;\n }\n const regexp = createVariableExpressionRegexp();\n let match: RegExpExecArray | null;\n\n while ((match = regexp.exec(content)) !== null) {\n const matchStart = match.index ?? 0;\n const matchEnd = matchStart + match[0].length;\n const innerStart = matchStart + 2;\n const innerEnd = matchEnd - 2;\n if (cursorPosition >= innerStart && cursorPosition <= innerEnd) {\n return true;\n }\n if (regexp.lastIndex === match.index) {\n regexp.lastIndex++;\n }\n }\n\n return false;\n};\n\nconst buildVariableTemplate = (variableName = \"\") => `{{${variableName}}}`;\n\nconst Editor: React.FC<EditorProps> = ({\n content = \"\",\n editMode = EditMode.CodeEdit,\n variables: initialVariables,\n systemVariables: initialSystemVariables,\n onChange,\n onBlur,\n locale = \"en-US\",\n uploadProps,\n disabled = false,\n toolbarActionsRight,\n onReady,\n}) => {\n const { t, i18n } = useTranslation();\n useEffect(() => {\n if (locale && i18n.language !== locale) {\n i18n.changeLanguage(locale);\n }\n }, [i18n, locale]);\n const activeLocale = (locale || i18n.language) as \"en-US\" | \"zh-CN\";\n const currentStrings = resources[activeLocale]?.translation ?? enUS;\n const toolbarLabels = useMemo(\n () => ({\n image: t(\"toolbarInsertImage\", {\n defaultValue: \"Insert image\",\n }),\n video: t(\"toolbarInsertVideo\", {\n defaultValue: \"Insert video\",\n }),\n addVariable: t(\"toolbarInsertNewVariable\", {\n defaultValue: \"Insert new variable\",\n }),\n search: t(\"toolbarInsertExistingVariable\", {\n defaultValue: \"Insert existing variable\",\n }),\n confirmOutput: t(\"toolbarConfirmOutput\", {\n defaultValue: \"Confirm output\",\n }),\n insertLink: t(\"toolbarInsertLink\", {\n defaultValue: \"Insert link\",\n }),\n insertButton: t(\"toolbarInsertButton\", {\n defaultValue: \"Insert button\",\n }),\n insertSingleChoice: t(\"toolbarInsertSingleChoice\", {\n defaultValue: \"Insert single choice\",\n }),\n insertMultiChoice: t(\"toolbarInsertMultiChoice\", {\n defaultValue: \"Insert multi choice\",\n }),\n insertInput: t(\"toolbarInsertInput\", {\n defaultValue: \"Insert input\",\n }),\n singleChoiceOption1: t(\"toolbarChoiceOption1\", {\n defaultValue: \"Option 1\",\n }),\n singleChoiceOption2: t(\"toolbarChoiceOption2\", {\n defaultValue: \"Option 2\",\n }),\n inputPlaceholder: t(\"toolbarInputPlaceholder\", {\n defaultValue: \"Please enter\",\n }),\n }),\n [t]\n );\n const variableSearchLabels = useMemo(\n () => ({\n searchPlaceholder: t(\"variableSearchPlaceholder\", {\n defaultValue: \"Search variable\",\n }),\n systemLabel: t(\"variableSectionSystem\", \"System Variables\"),\n customLabel: t(\"variableSectionCustom\", \"Custom Variables\"),\n emptyLabel: t(\"variableNotFound\", \"No variables found\"),\n }),\n [t]\n );\n const placeholderText =\n editMode === EditMode.QuickEdit\n ? t(\"placeholderQuickEdit\", {\n defaultValue: t(\"placeholderCodeEdit\", {\n defaultValue: t(\"placeholder\"),\n }),\n })\n : t(\"placeholderCodeEdit\", { defaultValue: t(\"placeholder\") });\n // Normalize variables to avoid duplicating system variables in the custom list\n const normalizedSystemVariables = useMemo(() => {\n const seen = new Set<string>();\n return (initialSystemVariables ?? EMPTY_VARIABLES).filter((variable) => {\n const normalized =\n typeof variable?.name === \"string\" ? variable.name.toLowerCase() : \"\";\n if (!normalized || seen.has(normalized)) {\n return false;\n }\n seen.add(normalized);\n return true;\n });\n }, [initialSystemVariables]);\n\n const normalizedCustomVariables = useMemo(() => {\n const systemNameSet = new Set(\n normalizedSystemVariables.map((variable) => variable.name.toLowerCase())\n );\n const seen = new Set<string>();\n return (initialVariables ?? EMPTY_VARIABLES).filter((variable) => {\n const normalized =\n typeof variable?.name === \"string\" ? variable.name.toLowerCase() : \"\";\n if (\n !normalized ||\n systemNameSet.has(normalized) ||\n seen.has(normalized)\n ) {\n return false;\n }\n seen.add(normalized);\n return true;\n });\n }, [initialVariables, normalizedSystemVariables]);\n\n const [dialogOpen, setDialogOpen] = useState(false);\n const [popoverOpen, setPopoverOpen] = useState(false);\n const [popoverPosition, setPopoverPosition] =\n useState<PopoverPosition | null>(null);\n const [variables, setVariables] = useState<Variable[]>(\n normalizedCustomVariables\n );\n const [systemVariables, setSystemVariables] = useState<Variable[]>(\n normalizedSystemVariables\n );\n\n useEffect(() => {\n setVariables(normalizedCustomVariables);\n }, [normalizedCustomVariables]);\n\n useEffect(() => {\n setSystemVariables(normalizedSystemVariables);\n }, [normalizedSystemVariables]);\n\n const [selectedOption, setSelectedOption] = useState<SelectedOption>(\n SelectedOption.Empty\n );\n const [selectContentInfo, setSelectContentInfo] =\n useState<SelectContentInfo | null>();\n const editorViewRef = useRef<EditorView | null>(null);\n const pendingVariableContentRef = useRef<string | null>(null);\n const variableSearchAnchorRef = useRef<HTMLButtonElement | null>(null);\n const [variableSearchOpen, setVariableSearchOpen] = useState(false);\n const closeVariableSearch = useCallback(() => {\n setVariableSearchOpen(false);\n variableSearchAnchorRef.current = null;\n }, []);\n const handleVariableSearchToggle = useCallback(\n (button: HTMLButtonElement) => {\n if (disabled) {\n return;\n }\n if (variableSearchOpen && variableSearchAnchorRef.current === button) {\n closeVariableSearch();\n return;\n }\n variableSearchAnchorRef.current = button;\n setVariableSearchOpen(true);\n },\n [closeVariableSearch, disabled, variableSearchOpen]\n );\n\n const editorContextValue: IEditorContext = {\n selectedOption,\n setSelectedOption,\n dialogOpen,\n setDialogOpen,\n popoverOpen,\n setPopoverOpen,\n popoverPosition,\n setPopoverPosition,\n };\n\n useEffect(() => {\n if (!disabled) {\n return;\n }\n setDialogOpen(false);\n setPopoverOpen(false);\n setSelectedOption(SelectedOption.Empty);\n setSelectContentInfo(null);\n setPopoverPosition(null);\n closeVariableSearch();\n }, [\n closeVariableSearch,\n disabled,\n setDialogOpen,\n setPopoverOpen,\n setPopoverPosition,\n setSelectedOption,\n setSelectContentInfo,\n ]);\n\n const addVariablesFromContent = useCallback(\n (text: string) => {\n if (editMode !== EditMode.QuickEdit || !text) {\n return;\n }\n\n const names = extractVariableNames(text);\n if (!names.length) {\n return;\n }\n\n const systemNameSet = new Set(\n systemVariables.map((variable) => variable.name.toLowerCase())\n );\n\n setVariables((prev) => {\n const existingNames = new Set(\n prev.map((variable) => variable.name.toLowerCase())\n );\n const addedNames = new Set<string>();\n const newVariables: Variable[] = [];\n\n names.forEach((rawName) => {\n const normalized = rawName.toLowerCase();\n if (\n !rawName ||\n systemNameSet.has(normalized) ||\n existingNames.has(normalized) ||\n addedNames.has(normalized)\n ) {\n return;\n }\n newVariables.push({ name: rawName });\n addedNames.add(normalized);\n });\n\n if (!newVariables.length) {\n return prev;\n }\n\n return [...newVariables, ...prev];\n });\n },\n [editMode, systemVariables]\n );\n\n useEffect(() => {\n addVariablesFromContent(content);\n }, [content, addVariablesFromContent]);\n\n // const insertFixedText = useCallback(() => {\n // if (!editorViewRef.current) return;\n // const view = editorViewRef.current;\n // const { state, dispatch } = view;\n // const selection = state.selection.main;\n // const selectedText = state.sliceDoc(selection.from, selection.to);\n // const startTag = \"===\";\n // const endTag = \"===\";\n // const insertContent = `${startTag}${selectedText ?? \"\"}${endTag}`;\n\n // dispatch({\n // changes: {\n // from: selection.from,\n // to: selection.to,\n // insert: insertContent,\n // },\n // selection: {\n // anchor: selection.from + startTag.length + (selectedText?.length ?? 0),\n // },\n // });\n // view.focus();\n // }, []);\n\n // const insertDivider = useCallback(() => {\n // if (!editorViewRef.current) return;\n // const view = editorViewRef.current;\n // const { state, dispatch } = view;\n // const selection = state.selection.main;\n // const insertContent = `\\n\\n---\\n\\n`;\n\n // dispatch({\n // changes: {\n // from: selection.from,\n // to: selection.to,\n // insert: insertContent,\n // },\n // selection: {\n // anchor: selection.from + insertContent.length,\n // },\n // });\n // view.focus();\n // }, []);\n\n const onSelectedOption = useCallback(\n (option: SelectedOption) => {\n if (disabled) {\n return;\n }\n closeVariableSearch();\n // if (option === SelectedOption.FixedText) {\n // insertFixedText();\n // setSelectedOption(SelectedOption.Empty);\n // setDialogOpen(false);\n // setPopoverOpen(false);\n // setSelectContentInfo(null);\n // setPopoverPosition(null);\n // return;\n // }\n\n // if (option === SelectedOption.Divider) {\n // insertDivider();\n // setSelectedOption(SelectedOption.Empty);\n // setDialogOpen(false);\n // setPopoverOpen(false);\n // setSelectContentInfo(null);\n // setPopoverPosition(null);\n // return;\n // }\n\n setSelectedOption(option);\n\n if (option === SelectedOption.Variable) {\n if (editorViewRef.current) {\n const { state } = editorViewRef.current;\n const pos = state.selection.main.from;\n const coords = editorViewRef.current.coordsAtPos(pos);\n if (coords) {\n setPopoverPosition({\n x: coords.left,\n y: coords.bottom,\n });\n }\n }\n setPopoverOpen(true);\n } else {\n setDialogOpen(true);\n }\n },\n [closeVariableSearch, disabled]\n );\n\n const insertText = useCallback(\n (text: string) => {\n if (disabled || !editorViewRef.current) return;\n\n const { state, dispatch } = editorViewRef.current;\n const from = state.selection.main.from;\n\n dispatch({\n changes: { from, insert: text },\n selection: { anchor: from + text.length },\n });\n },\n [editorViewRef, disabled]\n );\n\n const replaceSelection = useCallback(\n (text: string) => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const { state, dispatch } = editorViewRef.current;\n const selection = state.selection.main;\n dispatch({\n changes: { from: selection.from, to: selection.to, insert: text },\n selection: { anchor: selection.from + text.length },\n });\n },\n [disabled]\n );\n\n const focusEditor = useCallback(() => {\n editorViewRef.current?.focus();\n }, []);\n\n const getContent = useCallback(() => {\n return editorViewRef.current?.state.doc.toString() ?? \"\";\n }, []);\n\n const setContent = useCallback(\n (text: string) => {\n if (disabled) {\n return;\n }\n if (!editorViewRef.current) {\n onChange?.(text);\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n dispatch({\n changes: { from: 0, to: state.doc.length, insert: text },\n selection: { anchor: text.length },\n });\n },\n [disabled, onChange]\n );\n\n const deleteSelectedContent = useCallback(() => {\n if (disabled) {\n return;\n }\n if (\n !selectContentInfo ||\n !editorViewRef.current ||\n selectContentInfo.from === -1\n )\n return;\n\n const { from, to } = selectContentInfo;\n const { dispatch } = editorViewRef.current;\n\n dispatch({\n changes: { from, to, insert: \"\" },\n });\n }, [selectContentInfo, editorViewRef, disabled]);\n\n const insertVariableContent = useCallback(\n (\n variableName: string,\n range?: { from: number; to: number },\n placeCursorAtEnd = false\n ) => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n const selection = range ?? state.selection.main;\n const template = buildVariableTemplate(variableName);\n const cursorOffset = placeCursorAtEnd\n ? template.length\n : 2 + variableName.length; // 2 braces before variable content\n\n dispatch({\n changes: {\n from: selection.from,\n to: selection.to,\n insert: template,\n },\n selection: {\n anchor: selection.from + cursorOffset,\n },\n });\n view.focus();\n },\n [disabled]\n );\n\n const insertVariableTemplate = useCallback(() => {\n if (disabled) {\n return;\n }\n closeVariableSearch();\n insertVariableContent(\"\");\n }, [closeVariableSearch, disabled, insertVariableContent]);\n\n const insertConfirmOutputMarker = useCallback(() => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n const selection = state.selection.main;\n const template = \"======\";\n dispatch({\n changes: {\n from: selection.from,\n to: selection.to,\n insert: template,\n },\n selection: {\n anchor: selection.from + 3,\n },\n });\n view.focus();\n }, [disabled]);\n\n const insertLinkTemplate = useCallback(() => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n const selection = state.selection.main;\n const template = \"[]()\";\n dispatch({\n changes: {\n from: selection.from,\n to: selection.to,\n insert: template,\n },\n selection: {\n anchor: selection.from + 1,\n },\n });\n view.focus();\n }, [disabled]);\n\n const insertButtonTemplate = useCallback(() => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n const selection = state.selection.main;\n const template = \"?[]\";\n dispatch({\n changes: {\n from: selection.from,\n to: selection.to,\n insert: template,\n },\n selection: {\n anchor: selection.from + 2,\n },\n });\n view.focus();\n }, [disabled]);\n\n const insertSingleChoiceTemplate = useCallback(() => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n const selection = state.selection.main;\n const optionLabel1 = toolbarLabels.singleChoiceOption1;\n const optionLabel2 = toolbarLabels.singleChoiceOption2;\n const template = `?[%{{}} ${optionLabel1} | ${optionLabel2}]`;\n dispatch({\n changes: {\n from: selection.from,\n to: selection.to,\n insert: template,\n },\n selection: {\n anchor: selection.from + 5,\n },\n });\n view.focus();\n }, [\n disabled,\n toolbarLabels.singleChoiceOption1,\n toolbarLabels.singleChoiceOption2,\n ]);\n\n const insertMultiChoiceTemplate = useCallback(() => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n const selection = state.selection.main;\n const optionLabel1 = toolbarLabels.singleChoiceOption1;\n const optionLabel2 = toolbarLabels.singleChoiceOption2;\n const template = `?[%{{}} ${optionLabel1} || ${optionLabel2}]`;\n dispatch({\n changes: {\n from: selection.from,\n to: selection.to,\n insert: template,\n },\n selection: {\n anchor: selection.from + 5,\n },\n });\n view.focus();\n }, [\n disabled,\n toolbarLabels.singleChoiceOption1,\n toolbarLabels.singleChoiceOption2,\n ]);\n\n const insertInputFieldTemplate = useCallback(() => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n const selection = state.selection.main;\n const placeholder = toolbarLabels.inputPlaceholder ?? \"请输入\";\n const template = `?[%{{}}...${placeholder}]`;\n dispatch({\n changes: {\n from: selection.from,\n to: selection.to,\n insert: template,\n },\n selection: {\n anchor: selection.from + 5,\n },\n });\n view.focus();\n }, [disabled, toolbarLabels.inputPlaceholder]);\n\n const handleSelectImage = useCallback(\n ({\n resourceUrl,\n resourceTitle,\n scalePercent,\n }: {\n resourceUrl?: string;\n resourceTitle?: string;\n scalePercent?: number;\n }) => {\n if (!resourceUrl || disabled) return;\n const textToInsert = getImageContentToInsert({\n resourceUrl,\n resourceTitle,\n scalePercent,\n });\n if (selectContentInfo?.type === SelectedOption.Image) {\n deleteSelectedContent();\n if (!editorViewRef.current) return;\n const { dispatch } = editorViewRef.current;\n dispatch({\n changes: { from: selectContentInfo.from, insert: textToInsert },\n });\n } else {\n insertText(textToInsert);\n }\n setDialogOpen(false);\n },\n [deleteSelectedContent, disabled, insertText, selectContentInfo]\n );\n\n const handleSelectVideo = useCallback(\n ({\n resourceUrl,\n resourceTitle,\n }: {\n resourceUrl: string;\n resourceTitle: string;\n }) => {\n if (disabled) {\n return;\n }\n const textToInsert = getVideoContentToInsert(resourceUrl, resourceTitle);\n if (selectContentInfo?.type === SelectedOption.Video) {\n deleteSelectedContent();\n if (!editorViewRef.current) return;\n const { dispatch } = editorViewRef.current;\n dispatch({\n changes: { from: selectContentInfo.from, insert: textToInsert },\n });\n } else {\n insertText(textToInsert);\n }\n setDialogOpen(false);\n },\n [deleteSelectedContent, disabled, insertText, selectContentInfo]\n );\n\n const handleSelectVariable = useCallback(\n (variable: Variable) => {\n if (disabled) {\n return;\n }\n const selectionRange =\n selectContentInfo?.type === SelectedOption.Variable\n ? { from: selectContentInfo.from, to: selectContentInfo.to }\n : undefined;\n insertVariableContent(variable.name, selectionRange, true);\n setPopoverOpen(false);\n closeVariableSearch();\n },\n [disabled, insertVariableContent, selectContentInfo, closeVariableSearch]\n );\n\n const slashCommandsExtension = useCallback(() => {\n return autocompletion({\n override: [\n createSlashCommands(onSelectedOption, {\n // divider: currentStrings.slashDivider,\n // fixedText: currentStrings.slashFixedText,\n image: currentStrings.slashImage,\n video: currentStrings.slashVideo,\n variable: currentStrings.slashVariable,\n }),\n ],\n });\n }, [\n // currentStrings.slashDivider,\n // currentStrings.slashFixedText,\n currentStrings.slashImage,\n currentStrings.slashVideo,\n currentStrings.slashVariable,\n onSelectedOption,\n ]);\n\n // const fixedTextPlaceholderExtension = useMemo(\n // () =>\n // createFixedTextPlaceholder(\n // currentStrings.fixedTextPlaceholder ?? \"添加固定文本\",\n // currentStrings.fixedTextTooltip ??\n // currentStrings.slashFixedText ??\n // \"固定文本\"\n // ),\n // [\n // currentStrings.fixedTextPlaceholder,\n // currentStrings.fixedTextTooltip,\n // currentStrings.slashFixedText,\n // ]\n // );\n\n const handleEditorUpdate = useCallback(\n (update: ViewUpdate) => {\n editorViewRef.current = update.view;\n if (\n editMode === EditMode.QuickEdit &&\n pendingVariableContentRef.current &&\n update.selectionSet\n ) {\n const cursorPosition = update.state.selection.main.head;\n const docText = update.state.doc.toString();\n const stillInside = isCursorInsideVariableExpression(\n docText,\n cursorPosition\n );\n if (!stillInside) {\n addVariablesFromContent(docText);\n pendingVariableContentRef.current = null;\n }\n }\n },\n [addVariablesFromContent, editMode]\n );\n\n const handleTagClick = useCallback(\n (event: any) => {\n event.stopPropagation();\n if (disabled) {\n return;\n }\n const { type, from, to, dataset, target } = event.detail;\n const value = parseContentInfo(type, dataset);\n setSelectContentInfo({\n type,\n value,\n from,\n to,\n });\n setSelectedOption(type);\n\n if (type === SelectedOption.Variable) {\n if (target) {\n const rect = target.getBoundingClientRect();\n setPopoverPosition({\n x: rect.left,\n y: rect.bottom,\n });\n }\n setPopoverOpen(true);\n } else {\n setDialogOpen(true);\n }\n },\n [disabled]\n );\n\n useEffect(() => {\n if (!dialogOpen) {\n setSelectedOption(SelectedOption.Empty);\n setSelectContentInfo(null);\n }\n }, [dialogOpen]);\n\n useEffect(() => {\n if (!popoverOpen && selectedOption === SelectedOption.Variable) {\n setSelectedOption(SelectedOption.Empty);\n setSelectContentInfo(null);\n }\n }, [popoverOpen, selectedOption]);\n\n useEffect(() => {\n const handleWrap = (e: any) => {\n if (e.detail.view === editorViewRef.current) {\n handleTagClick(e);\n }\n };\n window.addEventListener(\"globalTagClick\", handleWrap);\n return () => {\n window.removeEventListener(\"globalTagClick\", handleWrap);\n };\n }, [handleTagClick]);\n\n const editorExtensions = useMemo(() => {\n const extensions = [\n EditorView.lineWrapping,\n markdown(),\n syntaxHighlighting(defaultHighlightStyle),\n SyntaxHighlighter,\n ];\n\n if (!disabled) {\n extensions.push(slashCommandsExtension());\n }\n\n if (editMode === EditMode.QuickEdit) {\n extensions.push(\n ImgPlaceholder,\n VideoPlaceholder,\n VariablePlaceholder\n // fixedTextPlaceholderExtension,\n // DividerPlaceholder,\n );\n }\n\n extensions.push(\n EditorView.updateListener.of((update) => {\n handleEditorUpdate(update);\n })\n );\n\n return extensions;\n }, [disabled, editMode, slashCommandsExtension, handleEditorUpdate]);\n\n const handleContentChange = useCallback(\n (value: string) => {\n if (disabled) {\n return;\n }\n const cursorPosition =\n editorViewRef.current?.state.selection.main.head ?? -1;\n const skipAddition = isCursorInsideVariableExpression(\n value,\n cursorPosition\n );\n if (skipAddition) {\n pendingVariableContentRef.current = value;\n } else {\n pendingVariableContentRef.current = null;\n addVariablesFromContent(value);\n }\n onChange?.(value);\n },\n [addVariablesFromContent, onChange, disabled]\n );\n\n const isVariableSearchOpen = !disabled && variableSearchOpen;\n const editorApi = useMemo(\n () => ({\n insertTextAtCursor: insertText,\n replaceSelection,\n focus: focusEditor,\n getContent,\n setContent,\n }),\n [focusEditor, getContent, insertText, replaceSelection, setContent]\n );\n\n const handleToolbarActionClick = useCallback(\n (action: EditorAction) => {\n if (disabled || \"render\" in action) {\n return;\n }\n action.onClick?.(editorApi);\n },\n [disabled, editorApi]\n );\n\n const toolbarRightSlot = useMemo(() => {\n if (!toolbarActionsRight?.length) {\n return null;\n }\n return (\n <div className=\"markdown-flow-editor-toolbar-right\">\n {toolbarActionsRight.map((action) => {\n if (\"render\" in action) {\n return (\n <div\n className=\"markdown-flow-editor-toolbar-right-item\"\n key={action.key}\n >\n {action.render(editorApi)}\n </div>\n );\n }\n const ariaLabel = action.label || action.tooltip || undefined;\n const button = (\n <button\n type=\"button\"\n key={action.key}\n disabled={disabled || action.disabled}\n onClick={() => handleToolbarActionClick(action)}\n className=\"markdown-flow-editor-toolbar-right-button\"\n aria-label={ariaLabel}\n title={action.label || action.tooltip}\n >\n {action.icon ? (\n <span className=\"toolbar-right-icon\">{action.icon}</span>\n ) : null}\n {action.label ? (\n <span className=\"toolbar-right-label\">{action.label}</span>\n ) : null}\n </button>\n );\n const wrapped = action.tooltip ? (\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent side=\"top\">{action.tooltip}</TooltipContent>\n </Tooltip>\n ) : (\n button\n );\n return (\n <div\n className=\"markdown-flow-editor-toolbar-right-item\"\n key={action.key}\n >\n {wrapped}\n </div>\n );\n })}\n </div>\n );\n }, [disabled, editorApi, handleToolbarActionClick, toolbarActionsRight]);\n\n useEffect(() => {\n onReady?.(editorApi);\n }, [editorApi]);\n\n return (\n <div\n className=\"markdown-flow-editor\"\n data-disabled={disabled ? \"true\" : undefined}\n aria-disabled={disabled}\n >\n <EditorToolbar\n disabled={disabled}\n labels={toolbarLabels}\n onSelect={onSelectedOption}\n onInsertVariablePlaceholder={insertVariableTemplate}\n onVariableSearchToggle={handleVariableSearchToggle}\n onVariableSearchClose={closeVariableSearch}\n onInsertConfirmOutput={insertConfirmOutputMarker}\n onInsertLink={insertLinkTemplate}\n onInsertButton={insertButtonTemplate}\n onInsertSingleChoice={insertSingleChoiceTemplate}\n onInsertMultiChoice={insertMultiChoiceTemplate}\n onInsertInputField={insertInputFieldTemplate}\n variableSearchActive={isVariableSearchOpen}\n rightSlot={toolbarRightSlot}\n />\n <VariableSearchDropdown\n open={isVariableSearchOpen}\n anchorElement={variableSearchAnchorRef.current}\n onClose={closeVariableSearch}\n onSelect={handleSelectVariable}\n variables={variables}\n systemVariables={systemVariables}\n labels={variableSearchLabels}\n />\n <div className=\"markdown-flow-editor-body relative overflow-auto\">\n <EditorContext.Provider value={editorContextValue}>\n <CodeMirror\n extensions={editorExtensions}\n basicSetup={{\n lineNumbers: false,\n syntaxHighlighting: true,\n highlightActiveLine: true,\n highlightActiveLineGutter: true,\n foldGutter: false,\n }}\n className=\"rounded-md\"\n placeholder={placeholderText}\n value={content}\n theme=\"light\"\n minHeight=\"2rem\"\n editable={!disabled}\n onChange={handleContentChange}\n onBlur={onBlur}\n />\n {!disabled && (\n <CustomDialog\n labels={{\n title:\n selectedOption === SelectedOption.Image\n ? t(\"dialogTitleImage\")\n : selectedOption === SelectedOption.Video\n ? t(\"dialogTitleVideo\")\n : selectedOption === SelectedOption.Variable\n ? t(\"dialogTitleVariable\")\n : t(\"dialogTitle\"),\n }}\n >\n {selectedOption === SelectedOption.Image && (\n <ImageInject\n value={selectContentInfo?.value}\n onSelect={handleSelectImage}\n uploadProps={uploadProps}\n />\n )}\n {selectedOption === SelectedOption.Video && (\n <VideoInject\n value={selectContentInfo?.value}\n onSelect={handleSelectVideo}\n />\n )}\n </CustomDialog>\n )}\n\n {!disabled && (\n <CustomPopover>\n <VariableSelect\n variables={variables}\n systemVariables={systemVariables}\n selectedName={selectContentInfo?.value?.variableName}\n onSelect={handleSelectVariable}\n onAddVariable={(variable) => {\n setVariables((prev) => {\n const normalized = variable.name.toLowerCase();\n const exists = prev.some(\n (item) => item.name.toLowerCase() === normalized\n );\n if (exists) {\n return prev;\n }\n return [variable, ...prev];\n });\n }}\n />\n </CustomPopover>\n )}\n </EditorContext.Provider>\n </div>\n </div>\n );\n};\n\nexport default Editor;\n"],"names":["resources","enUS","zhCN","i18next","lng","resource","initReactI18next","EMPTY_VARIABLES","isCursorInsideVariableExpression","content","cursorPosition","regexp","createVariableExpressionRegexp","match","matchStart","matchEnd","innerStart","innerEnd","buildVariableTemplate","variableName","Editor","editMode","initialVariables","initialSystemVariables","onChange","onBlur","locale","uploadProps","disabled","toolbarActionsRight","onReady","t","i18n","useTranslation","useEffect","activeLocale","currentStrings","toolbarLabels","useMemo","variableSearchLabels","placeholderText","normalizedSystemVariables","seen","variable","normalized","normalizedCustomVariables","systemNameSet","dialogOpen","setDialogOpen","useState","popoverOpen","setPopoverOpen","popoverPosition","setPopoverPosition","variables","setVariables","systemVariables","setSystemVariables","selectedOption","setSelectedOption","SelectedOption","selectContentInfo","setSelectContentInfo","editorViewRef","useRef","pendingVariableContentRef","variableSearchAnchorRef","variableSearchOpen","setVariableSearchOpen","closeVariableSearch","useCallback","handleVariableSearchToggle","button","editorContextValue","addVariablesFromContent","text","names","extractVariableNames","prev","existingNames","addedNames","newVariables","rawName","onSelectedOption","option","state","pos","coords","insertText","dispatch","from","replaceSelection","selection","focusEditor","getContent","setContent","view","deleteSelectedContent","to","insertVariableContent","range","placeCursorAtEnd","template","cursorOffset","insertVariableTemplate","insertConfirmOutputMarker","insertLinkTemplate","insertButtonTemplate","insertSingleChoiceTemplate","optionLabel1","optionLabel2","insertMultiChoiceTemplate","insertInputFieldTemplate","handleSelectImage","resourceUrl","resourceTitle","scalePercent","textToInsert","getImageContentToInsert","handleSelectVideo","getVideoContentToInsert","handleSelectVariable","selectionRange","slashCommandsExtension","autocompletion","createSlashCommands","handleEditorUpdate","update","docText","handleTagClick","event","type","dataset","target","value","parseContentInfo","rect","handleWrap","e","editorExtensions","extensions","EditorView","markdown","syntaxHighlighting","defaultHighlightStyle","SyntaxHighlighter","ImgPlaceholder","VideoPlaceholder","VariablePlaceholder","handleContentChange","isVariableSearchOpen","editorApi","handleToolbarActionClick","action","toolbarRightSlot","jsx","ariaLabel","jsxs","wrapped","Tooltip","TooltipTrigger","TooltipContent","EditorToolbar","VariableSearchDropdown","EditorContext","CodeMirror","CustomDialog","ImageInject","VideoInject","CustomPopover","VariableSelect","item"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmDA,MAAMA,KAAY;AAAA,EAChB,SAAS,EAAE,aAAaC,GAAA;AAAA,EACxB,SAAS,EAAE,aAAaC,GAAA;AAC1B;AAEKC,GAAQ,gBAQX,OAAO,QAAQH,EAAS,EAAE,QAAQ,CAAC,CAACI,GAAKC,CAAQ,MAAM;AACrDF,EAAAA,GAAQ;AAAA,IACNC;AAAA,IACA;AAAA,IACAC,EAAS;AAAA,IACT;AAAA,IACA;AAAA,EAAA;AAEJ,CAAC,IAfDF,GAAQ,IAAIG,EAAgB,EAAE,KAAK;AAAA,EACjC,WAAAN;AAAA,EACA,KAAK;AAAA,EACL,aAAa;AAAA,EACb,eAAe,EAAE,aAAa,GAAA;AAAM,CACrC;AAgCH,MAAMO,KAA8B,CAAA,GAG9BC,KAAmC,CACvCC,GACAC,MACG;AACH,MAAI,CAACD,KAAWC,IAAiB;AAC/B,WAAO;AAET,QAAMC,IAASC,GAAA;AACf,MAAIC;AAEJ,UAAQA,IAAQF,EAAO,KAAKF,CAAO,OAAO,QAAM;AAC9C,UAAMK,IAAaD,EAAM,SAAS,GAC5BE,IAAWD,IAAaD,EAAM,CAAC,EAAE,QACjCG,IAAaF,IAAa,GAC1BG,IAAWF,IAAW;AAC5B,QAAIL,KAAkBM,KAAcN,KAAkBO;AACpD,aAAO;AAET,IAAIN,EAAO,cAAcE,EAAM,SAC7BF,EAAO;AAAA,EAEX;AAEA,SAAO;AACT,GAEMO,KAAwB,CAACC,IAAe,OAAO,KAAKA,CAAY,MAEhEC,KAAgC,CAAC;AAAA,EACrC,SAAAX,IAAU;AAAA,EACV,UAAAY,IAAW;AAAA,EACX,WAAWC;AAAA,EACX,iBAAiBC;AAAA,EACjB,UAAAC;AAAA,EACA,QAAAC;AAAA,EACA,QAAAC,IAAS;AAAA,EACT,aAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,qBAAAC;AAAA,EACA,SAAAC;AACF,MAAM;AACJ,QAAM,EAAE,GAAAC,GAAG,MAAAC,EAAA,IAASC,GAAA;AACpB,EAAAC,EAAU,MAAM;AACd,IAAIR,KAAUM,EAAK,aAAaN,KAC9BM,EAAK,eAAeN,CAAM;AAAA,EAE9B,GAAG,CAACM,GAAMN,CAAM,CAAC;AACjB,QAAMS,KAAgBT,KAAUM,EAAK,UAC/BI,IAAiBpC,GAAUmC,EAAY,GAAG,eAAelC,IACzDoC,IAAgBC;AAAA,IACpB,OAAO;AAAA,MACL,OAAOP,EAAE,sBAAsB;AAAA,QAC7B,cAAc;AAAA,MAAA,CACf;AAAA,MACD,OAAOA,EAAE,sBAAsB;AAAA,QAC7B,cAAc;AAAA,MAAA,CACf;AAAA,MACD,aAAaA,EAAE,4BAA4B;AAAA,QACzC,cAAc;AAAA,MAAA,CACf;AAAA,MACD,QAAQA,EAAE,iCAAiC;AAAA,QACzC,cAAc;AAAA,MAAA,CACf;AAAA,MACD,eAAeA,EAAE,wBAAwB;AAAA,QACvC,cAAc;AAAA,MAAA,CACf;AAAA,MACD,YAAYA,EAAE,qBAAqB;AAAA,QACjC,cAAc;AAAA,MAAA,CACf;AAAA,MACD,cAAcA,EAAE,uBAAuB;AAAA,QACrC,cAAc;AAAA,MAAA,CACf;AAAA,MACD,oBAAoBA,EAAE,6BAA6B;AAAA,QACjD,cAAc;AAAA,MAAA,CACf;AAAA,MACD,mBAAmBA,EAAE,4BAA4B;AAAA,QAC/C,cAAc;AAAA,MAAA,CACf;AAAA,MACD,aAAaA,EAAE,sBAAsB;AAAA,QACnC,cAAc;AAAA,MAAA,CACf;AAAA,MACD,qBAAqBA,EAAE,wBAAwB;AAAA,QAC7C,cAAc;AAAA,MAAA,CACf;AAAA,MACD,qBAAqBA,EAAE,wBAAwB;AAAA,QAC7C,cAAc;AAAA,MAAA,CACf;AAAA,MACD,kBAAkBA,EAAE,2BAA2B;AAAA,QAC7C,cAAc;AAAA,MAAA,CACf;AAAA,IAAA;AAAA,IAEH,CAACA,CAAC;AAAA,EAAA,GAEEQ,KAAuBD;AAAA,IAC3B,OAAO;AAAA,MACL,mBAAmBP,EAAE,6BAA6B;AAAA,QAChD,cAAc;AAAA,MAAA,CACf;AAAA,MACD,aAAaA,EAAE,yBAAyB,kBAAkB;AAAA,MAC1D,aAAaA,EAAE,yBAAyB,kBAAkB;AAAA,MAC1D,YAAYA,EAAE,oBAAoB,oBAAoB;AAAA,IAAA;AAAA,IAExD,CAACA,CAAC;AAAA,EAAA,GAEES,KACJnB,MAAa,cACTU,EAAE,wBAAwB;AAAA,IACxB,cAAcA,EAAE,uBAAuB;AAAA,MACrC,cAAcA,EAAE,aAAa;AAAA,IAAA,CAC9B;AAAA,EAAA,CACF,IACDA,EAAE,uBAAuB,EAAE,cAAcA,EAAE,aAAa,GAAG,GAE3DU,IAA4BH,EAAQ,MAAM;AAC9C,UAAMI,wBAAW,IAAA;AACjB,YAAQnB,KAA0BhB,IAAiB,OAAO,CAACoC,MAAa;AACtE,YAAMC,IACJ,OAAOD,GAAU,QAAS,WAAWA,EAAS,KAAK,gBAAgB;AACrE,aAAI,CAACC,KAAcF,EAAK,IAAIE,CAAU,IAC7B,MAETF,EAAK,IAAIE,CAAU,GACZ;AAAA,IACT,CAAC;AAAA,EACH,GAAG,CAACrB,CAAsB,CAAC,GAErBsB,IAA4BP,EAAQ,MAAM;AAC9C,UAAMQ,IAAgB,IAAI;AAAA,MACxBL,EAA0B,IAAI,CAACE,MAAaA,EAAS,KAAK,aAAa;AAAA,IAAA,GAEnED,wBAAW,IAAA;AACjB,YAAQpB,KAAoBf,IAAiB,OAAO,CAACoC,MAAa;AAChE,YAAMC,IACJ,OAAOD,GAAU,QAAS,WAAWA,EAAS,KAAK,gBAAgB;AACrE,aACE,CAACC,KACDE,EAAc,IAAIF,CAAU,KAC5BF,EAAK,IAAIE,CAAU,IAEZ,MAETF,EAAK,IAAIE,CAAU,GACZ;AAAA,IACT,CAAC;AAAA,EACH,GAAG,CAACtB,GAAkBmB,CAAyB,CAAC,GAE1C,CAACM,GAAYC,CAAa,IAAIC,EAAS,EAAK,GAC5C,CAACC,GAAaC,CAAc,IAAIF,EAAS,EAAK,GAC9C,CAACG,IAAiBC,CAAkB,IACxCJ,EAAiC,IAAI,GACjC,CAACK,IAAWC,CAAY,IAAIN;AAAA,IAChCJ;AAAA,EAAA,GAEI,CAACW,GAAiBC,EAAkB,IAAIR;AAAA,IAC5CR;AAAA,EAAA;AAGF,EAAAP,EAAU,MAAM;AACd,IAAAqB,EAAaV,CAAyB;AAAA,EACxC,GAAG,CAACA,CAAyB,CAAC,GAE9BX,EAAU,MAAM;AACd,IAAAuB,GAAmBhB,CAAyB;AAAA,EAC9C,GAAG,CAACA,CAAyB,CAAC;AAE9B,QAAM,CAACiB,GAAgBC,CAAiB,IAAIV;AAAA,IAC1CW,EAAe;AAAA,EAAA,GAEX,CAACC,GAAmBC,CAAoB,IAC5Cb,EAAA,GACIc,IAAgBC,EAA0B,IAAI,GAC9CC,IAA4BD,EAAsB,IAAI,GACtDE,IAA0BF,EAAiC,IAAI,GAC/D,CAACG,GAAoBC,EAAqB,IAAInB,EAAS,EAAK,GAC5DoB,IAAsBC,EAAY,MAAM;AAC5C,IAAAF,GAAsB,EAAK,GAC3BF,EAAwB,UAAU;AAAA,EACpC,GAAG,CAAA,CAAE,GACCK,KAA6BD;AAAA,IACjC,CAACE,MAA8B;AAC7B,UAAI,CAAA5C,GAGJ;AAAA,YAAIuC,KAAsBD,EAAwB,YAAYM,GAAQ;AACpE,UAAAH,EAAA;AACA;AAAA,QACF;AACA,QAAAH,EAAwB,UAAUM,GAClCJ,GAAsB,EAAI;AAAA;AAAA,IAC5B;AAAA,IACA,CAACC,GAAqBzC,GAAUuC,CAAkB;AAAA,EAAA,GAG9CM,KAAqC;AAAA,IACzC,gBAAAf;AAAA,IACA,mBAAAC;AAAA,IACA,YAAAZ;AAAA,IACA,eAAAC;AAAA,IACA,aAAAE;AAAA,IACA,gBAAAC;AAAA,IACA,iBAAAC;AAAA,IACA,oBAAAC;AAAA,EAAA;AAGF,EAAAnB,EAAU,MAAM;AACd,IAAKN,MAGLoB,EAAc,EAAK,GACnBG,EAAe,EAAK,GACpBQ,EAAkBC,EAAe,KAAK,GACtCE,EAAqB,IAAI,GACzBT,EAAmB,IAAI,GACvBgB,EAAA;AAAA,EACF,GAAG;AAAA,IACDA;AAAA,IACAzC;AAAA,IACAoB;AAAA,IACAG;AAAA,IACAE;AAAA,IACAM;AAAA,IACAG;AAAA,EAAA,CACD;AAED,QAAMY,IAA0BJ;AAAA,IAC9B,CAACK,MAAiB;AAChB,UAAItD,MAAa,eAAsB,CAACsD;AACtC;AAGF,YAAMC,IAAQC,GAAqBF,CAAI;AACvC,UAAI,CAACC,EAAM;AACT;AAGF,YAAM9B,IAAgB,IAAI;AAAA,QACxBU,EAAgB,IAAI,CAACb,MAAaA,EAAS,KAAK,aAAa;AAAA,MAAA;AAG/D,MAAAY,EAAa,CAACuB,MAAS;AACrB,cAAMC,IAAgB,IAAI;AAAA,UACxBD,EAAK,IAAI,CAACnC,MAAaA,EAAS,KAAK,aAAa;AAAA,QAAA,GAE9CqC,wBAAiB,IAAA,GACjBC,IAA2B,CAAA;AAgBjC,eAdAL,EAAM,QAAQ,CAACM,MAAY;AACzB,gBAAMtC,IAAasC,EAAQ,YAAA;AAC3B,UACE,CAACA,KACDpC,EAAc,IAAIF,CAAU,KAC5BmC,EAAc,IAAInC,CAAU,KAC5BoC,EAAW,IAAIpC,CAAU,MAI3BqC,EAAa,KAAK,EAAE,MAAMC,EAAA,CAAS,GACnCF,EAAW,IAAIpC,CAAU;AAAA,QAC3B,CAAC,GAEIqC,EAAa,SAIX,CAAC,GAAGA,GAAc,GAAGH,CAAI,IAHvBA;AAAA,MAIX,CAAC;AAAA,IACH;AAAA,IACA,CAACzD,GAAUmC,CAAe;AAAA,EAAA;AAG5B,EAAAtB,EAAU,MAAM;AACd,IAAAwC,EAAwBjE,CAAO;AAAA,EACjC,GAAG,CAACA,GAASiE,CAAuB,CAAC;AA6CrC,QAAMS,IAAmBb;AAAA,IACvB,CAACc,MAA2B;AAC1B,UAAI,CAAAxD;AA0BJ,YAvBAyC,EAAA,GAqBAV,EAAkByB,CAAM,GAEpBA,MAAWxB,EAAe,UAAU;AACtC,cAAIG,EAAc,SAAS;AACzB,kBAAM,EAAE,OAAAsB,MAAUtB,EAAc,SAC1BuB,IAAMD,EAAM,UAAU,KAAK,MAC3BE,IAASxB,EAAc,QAAQ,YAAYuB,CAAG;AACpD,YAAIC,KACFlC,EAAmB;AAAA,cACjB,GAAGkC,EAAO;AAAA,cACV,GAAGA,EAAO;AAAA,YAAA,CACX;AAAA,UAEL;AACA,UAAApC,EAAe,EAAI;AAAA,QACrB;AACE,UAAAH,EAAc,EAAI;AAAA,IAEtB;AAAA,IACA,CAACqB,GAAqBzC,CAAQ;AAAA,EAAA,GAG1B4D,IAAalB;AAAA,IACjB,CAACK,MAAiB;AAChB,UAAI/C,KAAY,CAACmC,EAAc,QAAS;AAExC,YAAM,EAAE,OAAAsB,GAAO,UAAAI,EAAA,IAAa1B,EAAc,SACpC2B,IAAOL,EAAM,UAAU,KAAK;AAElC,MAAAI,EAAS;AAAA,QACP,SAAS,EAAE,MAAAC,GAAM,QAAQf,EAAA;AAAA,QACzB,WAAW,EAAE,QAAQe,IAAOf,EAAK,OAAA;AAAA,MAAO,CACzC;AAAA,IACH;AAAA,IACA,CAACZ,GAAenC,CAAQ;AAAA,EAAA,GAGpB+D,KAAmBrB;AAAA,IACvB,CAACK,MAAiB;AAChB,UAAI/C,KAAY,CAACmC,EAAc;AAC7B;AAEF,YAAM,EAAE,OAAAsB,GAAO,UAAAI,EAAA,IAAa1B,EAAc,SACpC6B,IAAYP,EAAM,UAAU;AAClC,MAAAI,EAAS;AAAA,QACP,SAAS,EAAE,MAAMG,EAAU,MAAM,IAAIA,EAAU,IAAI,QAAQjB,EAAA;AAAA,QAC3D,WAAW,EAAE,QAAQiB,EAAU,OAAOjB,EAAK,OAAA;AAAA,MAAO,CACnD;AAAA,IACH;AAAA,IACA,CAAC/C,CAAQ;AAAA,EAAA,GAGLiE,KAAcvB,EAAY,MAAM;AACpC,IAAAP,EAAc,SAAS,MAAA;AAAA,EACzB,GAAG,CAAA,CAAE,GAEC+B,KAAaxB,EAAY,MACtBP,EAAc,SAAS,MAAM,IAAI,cAAc,IACrD,CAAA,CAAE,GAECgC,KAAazB;AAAA,IACjB,CAACK,MAAiB;AAChB,UAAI/C;AACF;AAEF,UAAI,CAACmC,EAAc,SAAS;AAC1B,QAAAvC,IAAWmD,CAAI;AACf;AAAA,MACF;AACA,YAAMqB,IAAOjC,EAAc,SACrB,EAAE,OAAAsB,GAAO,UAAAI,EAAA,IAAaO;AAC5B,MAAAP,EAAS;AAAA,QACP,SAAS,EAAE,MAAM,GAAG,IAAIJ,EAAM,IAAI,QAAQ,QAAQV,EAAA;AAAA,QAClD,WAAW,EAAE,QAAQA,EAAK,OAAA;AAAA,MAAO,CAClC;AAAA,IACH;AAAA,IACA,CAAC/C,GAAUJ,CAAQ;AAAA,EAAA,GAGfyE,IAAwB3B,EAAY,MAAM;AAI9C,QAHI1C,KAIF,CAACiC,KACD,CAACE,EAAc,WACfF,EAAkB,SAAS;AAE3B;AAEF,UAAM,EAAE,MAAA6B,GAAM,IAAAQ,EAAA,IAAOrC,GACf,EAAE,UAAA4B,MAAa1B,EAAc;AAEnC,IAAA0B,EAAS;AAAA,MACP,SAAS,EAAE,MAAAC,GAAM,IAAAQ,GAAI,QAAQ,GAAA;AAAA,IAAG,CACjC;AAAA,EACH,GAAG,CAACrC,GAAmBE,GAAenC,CAAQ,CAAC,GAEzCuE,IAAwB7B;AAAA,IAC5B,CACEnD,GACAiF,GACAC,IAAmB,OAChB;AACH,UAAIzE,KAAY,CAACmC,EAAc;AAC7B;AAEF,YAAMiC,IAAOjC,EAAc,SACrB,EAAE,OAAAsB,GAAO,UAAAI,EAAA,IAAaO,GACtBJ,IAAYQ,KAASf,EAAM,UAAU,MACrCiB,IAAWpF,GAAsBC,CAAY,GAC7CoF,IAAeF,IACjBC,EAAS,SACT,IAAInF,EAAa;AAErB,MAAAsE,EAAS;AAAA,QACP,SAAS;AAAA,UACP,MAAMG,EAAU;AAAA,UAChB,IAAIA,EAAU;AAAA,UACd,QAAQU;AAAA,QAAA;AAAA,QAEV,WAAW;AAAA,UACT,QAAQV,EAAU,OAAOW;AAAA,QAAA;AAAA,MAC3B,CACD,GACDP,EAAK,MAAA;AAAA,IACP;AAAA,IACA,CAACpE,CAAQ;AAAA,EAAA,GAGL4E,KAAyBlC,EAAY,MAAM;AAC/C,IAAI1C,MAGJyC,EAAA,GACA8B,EAAsB,EAAE;AAAA,EAC1B,GAAG,CAAC9B,GAAqBzC,GAAUuE,CAAqB,CAAC,GAEnDM,KAA4BnC,EAAY,MAAM;AAClD,QAAI1C,KAAY,CAACmC,EAAc;AAC7B;AAEF,UAAMiC,IAAOjC,EAAc,SACrB,EAAE,OAAAsB,GAAO,UAAAI,EAAA,IAAaO,GACtBJ,IAAYP,EAAM,UAAU;AAElC,IAAAI,EAAS;AAAA,MACP,SAAS;AAAA,QACP,MAAMG,EAAU;AAAA,QAChB,IAAIA,EAAU;AAAA,QACd,QALa;AAAA,MAKL;AAAA,MAEV,WAAW;AAAA,QACT,QAAQA,EAAU,OAAO;AAAA,MAAA;AAAA,IAC3B,CACD,GACDI,EAAK,MAAA;AAAA,EACP,GAAG,CAACpE,CAAQ,CAAC,GAEP8E,KAAqBpC,EAAY,MAAM;AAC3C,QAAI1C,KAAY,CAACmC,EAAc;AAC7B;AAEF,UAAMiC,IAAOjC,EAAc,SACrB,EAAE,OAAAsB,GAAO,UAAAI,EAAA,IAAaO,GACtBJ,IAAYP,EAAM,UAAU;AAElC,IAAAI,EAAS;AAAA,MACP,SAAS;AAAA,QACP,MAAMG,EAAU;AAAA,QAChB,IAAIA,EAAU;AAAA,QACd,QALa;AAAA,MAKL;AAAA,MAEV,WAAW;AAAA,QACT,QAAQA,EAAU,OAAO;AAAA,MAAA;AAAA,IAC3B,CACD,GACDI,EAAK,MAAA;AAAA,EACP,GAAG,CAACpE,CAAQ,CAAC,GAEP+E,KAAuBrC,EAAY,MAAM;AAC7C,QAAI1C,KAAY,CAACmC,EAAc;AAC7B;AAEF,UAAMiC,IAAOjC,EAAc,SACrB,EAAE,OAAAsB,GAAO,UAAAI,EAAA,IAAaO,GACtBJ,IAAYP,EAAM,UAAU;AAElC,IAAAI,EAAS;AAAA,MACP,SAAS;AAAA,QACP,MAAMG,EAAU;AAAA,QAChB,IAAIA,EAAU;AAAA,QACd,QALa;AAAA,MAKL;AAAA,MAEV,WAAW;AAAA,QACT,QAAQA,EAAU,OAAO;AAAA,MAAA;AAAA,IAC3B,CACD,GACDI,EAAK,MAAA;AAAA,EACP,GAAG,CAACpE,CAAQ,CAAC,GAEPgF,KAA6BtC,EAAY,MAAM;AACnD,QAAI1C,KAAY,CAACmC,EAAc;AAC7B;AAEF,UAAMiC,IAAOjC,EAAc,SACrB,EAAE,OAAAsB,GAAO,UAAAI,EAAA,IAAaO,GACtBJ,IAAYP,EAAM,UAAU,MAC5BwB,IAAexE,EAAc,qBAC7ByE,IAAezE,EAAc,qBAC7BiE,IAAW,WAAWO,CAAY,MAAMC,CAAY;AAC1D,IAAArB,EAAS;AAAA,MACP,SAAS;AAAA,QACP,MAAMG,EAAU;AAAA,QAChB,IAAIA,EAAU;AAAA,QACd,QAAQU;AAAA,MAAA;AAAA,MAEV,WAAW;AAAA,QACT,QAAQV,EAAU,OAAO;AAAA,MAAA;AAAA,IAC3B,CACD,GACDI,EAAK,MAAA;AAAA,EACP,GAAG;AAAA,IACDpE;AAAA,IACAS,EAAc;AAAA,IACdA,EAAc;AAAA,EAAA,CACf,GAEK0E,KAA4BzC,EAAY,MAAM;AAClD,QAAI1C,KAAY,CAACmC,EAAc;AAC7B;AAEF,UAAMiC,IAAOjC,EAAc,SACrB,EAAE,OAAAsB,GAAO,UAAAI,EAAA,IAAaO,GACtBJ,IAAYP,EAAM,UAAU,MAC5BwB,IAAexE,EAAc,qBAC7ByE,IAAezE,EAAc,qBAC7BiE,IAAW,WAAWO,CAAY,OAAOC,CAAY;AAC3D,IAAArB,EAAS;AAAA,MACP,SAAS;AAAA,QACP,MAAMG,EAAU;AAAA,QAChB,IAAIA,EAAU;AAAA,QACd,QAAQU;AAAA,MAAA;AAAA,MAEV,WAAW;AAAA,QACT,QAAQV,EAAU,OAAO;AAAA,MAAA;AAAA,IAC3B,CACD,GACDI,EAAK,MAAA;AAAA,EACP,GAAG;AAAA,IACDpE;AAAA,IACAS,EAAc;AAAA,IACdA,EAAc;AAAA,EAAA,CACf,GAEK2E,KAA2B1C,EAAY,MAAM;AACjD,QAAI1C,KAAY,CAACmC,EAAc;AAC7B;AAEF,UAAMiC,IAAOjC,EAAc,SACrB,EAAE,OAAAsB,GAAO,UAAAI,EAAA,IAAaO,GACtBJ,IAAYP,EAAM,UAAU,MAE5BiB,IAAW,aADGjE,EAAc,oBAAoB,KACb;AACzC,IAAAoD,EAAS;AAAA,MACP,SAAS;AAAA,QACP,MAAMG,EAAU;AAAA,QAChB,IAAIA,EAAU;AAAA,QACd,QAAQU;AAAA,MAAA;AAAA,MAEV,WAAW;AAAA,QACT,QAAQV,EAAU,OAAO;AAAA,MAAA;AAAA,IAC3B,CACD,GACDI,EAAK,MAAA;AAAA,EACP,GAAG,CAACpE,GAAUS,EAAc,gBAAgB,CAAC,GAEvC4E,KAAoB3C;AAAA,IACxB,CAAC;AAAA,MACC,aAAA4C;AAAA,MACA,eAAAC;AAAA,MACA,cAAAC;AAAA,IAAA,MAKI;AACJ,UAAI,CAACF,KAAetF,EAAU;AAC9B,YAAMyF,IAAeC,GAAwB;AAAA,QAC3C,aAAAJ;AAAA,QACA,eAAAC;AAAA,QACA,cAAAC;AAAA,MAAA,CACD;AACD,UAAIvD,GAAmB,SAASD,EAAe,OAAO;AAEpD,YADAqC,EAAA,GACI,CAAClC,EAAc,QAAS;AAC5B,cAAM,EAAE,UAAA0B,MAAa1B,EAAc;AACnC,QAAA0B,EAAS;AAAA,UACP,SAAS,EAAE,MAAM5B,EAAkB,MAAM,QAAQwD,EAAA;AAAA,QAAa,CAC/D;AAAA,MACH;AACE,QAAA7B,EAAW6B,CAAY;AAEzB,MAAArE,EAAc,EAAK;AAAA,IACrB;AAAA,IACA,CAACiD,GAAuBrE,GAAU4D,GAAY3B,CAAiB;AAAA,EAAA,GAG3D0D,KAAoBjD;AAAA,IACxB,CAAC;AAAA,MACC,aAAA4C;AAAA,MACA,eAAAC;AAAA,IAAA,MAII;AACJ,UAAIvF;AACF;AAEF,YAAMyF,IAAeG,GAAwBN,GAAaC,CAAa;AACvE,UAAItD,GAAmB,SAASD,EAAe,OAAO;AAEpD,YADAqC,EAAA,GACI,CAAClC,EAAc,QAAS;AAC5B,cAAM,EAAE,UAAA0B,MAAa1B,EAAc;AACnC,QAAA0B,EAAS;AAAA,UACP,SAAS,EAAE,MAAM5B,EAAkB,MAAM,QAAQwD,EAAA;AAAA,QAAa,CAC/D;AAAA,MACH;AACE,QAAA7B,EAAW6B,CAAY;AAEzB,MAAArE,EAAc,EAAK;AAAA,IACrB;AAAA,IACA,CAACiD,GAAuBrE,GAAU4D,GAAY3B,CAAiB;AAAA,EAAA,GAG3D4D,KAAuBnD;AAAA,IAC3B,CAAC3B,MAAuB;AACtB,UAAIf;AACF;AAEF,YAAM8F,IACJ7D,GAAmB,SAASD,EAAe,WACvC,EAAE,MAAMC,EAAkB,MAAM,IAAIA,EAAkB,GAAA,IACtD;AACN,MAAAsC,EAAsBxD,EAAS,MAAM+E,GAAgB,EAAI,GACzDvE,EAAe,EAAK,GACpBkB,EAAA;AAAA,IACF;AAAA,IACA,CAACzC,GAAUuE,GAAuBtC,GAAmBQ,CAAmB;AAAA,EAAA,GAGpEsD,KAAyBrD,EAAY,MAClCsD,GAAe;AAAA,IACpB,UAAU;AAAA,MACRC,GAAoB1C,GAAkB;AAAA;AAAA;AAAA,QAGpC,OAAO/C,EAAe;AAAA,QACtB,OAAOA,EAAe;AAAA,QACtB,UAAUA,EAAe;AAAA,MAAA,CAC1B;AAAA,IAAA;AAAA,EACH,CACD,GACA;AAAA;AAAA;AAAA,IAGDA,EAAe;AAAA,IACfA,EAAe;AAAA,IACfA,EAAe;AAAA,IACf+C;AAAA,EAAA,CACD,GAiBK2C,KAAqBxD;AAAA,IACzB,CAACyD,MAAuB;AAEtB,UADAhE,EAAc,UAAUgE,EAAO,MAE7B1G,MAAa,eACb4C,EAA0B,WAC1B8D,EAAO,cACP;AACA,cAAMrH,IAAiBqH,EAAO,MAAM,UAAU,KAAK,MAC7CC,IAAUD,EAAO,MAAM,IAAI,SAAA;AAKjC,QAJoBvH;AAAA,UAClBwH;AAAA,UACAtH;AAAA,QAAA,MAGAgE,EAAwBsD,CAAO,GAC/B/D,EAA0B,UAAU;AAAA,MAExC;AAAA,IACF;AAAA,IACA,CAACS,GAAyBrD,CAAQ;AAAA,EAAA,GAG9B4G,KAAiB3D;AAAA,IACrB,CAAC4D,MAAe;AAEd,UADAA,EAAM,gBAAA,GACFtG;AACF;AAEF,YAAM,EAAE,MAAAuG,GAAM,MAAAzC,GAAM,IAAAQ,GAAI,SAAAkC,GAAS,QAAAC,EAAA,IAAWH,EAAM,QAC5CI,IAAQC,GAAiBJ,GAAMC,CAAO;AAS5C,UARAtE,EAAqB;AAAA,QACnB,MAAAqE;AAAA,QACA,OAAAG;AAAA,QACA,MAAA5C;AAAA,QACA,IAAAQ;AAAA,MAAA,CACD,GACDvC,EAAkBwE,CAAI,GAElBA,MAASvE,EAAe,UAAU;AACpC,YAAIyE,GAAQ;AACV,gBAAMG,IAAOH,EAAO,sBAAA;AACpB,UAAAhF,EAAmB;AAAA,YACjB,GAAGmF,EAAK;AAAA,YACR,GAAGA,EAAK;AAAA,UAAA,CACT;AAAA,QACH;AACA,QAAArF,EAAe,EAAI;AAAA,MACrB;AACE,QAAAH,EAAc,EAAI;AAAA,IAEtB;AAAA,IACA,CAACpB,CAAQ;AAAA,EAAA;AAGX,EAAAM,EAAU,MAAM;AACd,IAAKa,MACHY,EAAkBC,EAAe,KAAK,GACtCE,EAAqB,IAAI;AAAA,EAE7B,GAAG,CAACf,CAAU,CAAC,GAEfb,EAAU,MAAM;AACd,IAAI,CAACgB,KAAeQ,MAAmBE,EAAe,aACpDD,EAAkBC,EAAe,KAAK,GACtCE,EAAqB,IAAI;AAAA,EAE7B,GAAG,CAACZ,GAAaQ,CAAc,CAAC,GAEhCxB,EAAU,MAAM;AACd,UAAMuG,IAAa,CAACC,MAAW;AAC7B,MAAIA,EAAE,OAAO,SAAS3E,EAAc,WAClCkE,GAAeS,CAAC;AAAA,IAEpB;AACA,kBAAO,iBAAiB,kBAAkBD,CAAU,GAC7C,MAAM;AACX,aAAO,oBAAoB,kBAAkBA,CAAU;AAAA,IACzD;AAAA,EACF,GAAG,CAACR,EAAc,CAAC;AAEnB,QAAMU,KAAmBrG,EAAQ,MAAM;AACrC,UAAMsG,IAAa;AAAA,MACjBC,GAAW;AAAA,MACXC,GAAA;AAAA,MACAC,GAAmBC,EAAqB;AAAA,MACxCC;AAAA,IAAA;AAGF,WAAKrH,KACHgH,EAAW,KAAKjB,IAAwB,GAGtCtG,MAAa,eACfuH,EAAW;AAAA,MACTM;AAAA,MACAC;AAAA,MACAC;AAAA;AAAA;AAAA,IAAA,GAMJR,EAAW;AAAA,MACTC,GAAW,eAAe,GAAG,CAACd,MAAW;AACvC,QAAAD,GAAmBC,CAAM;AAAA,MAC3B,CAAC;AAAA,IAAA,GAGIa;AAAA,EACT,GAAG,CAAChH,GAAUP,GAAUsG,IAAwBG,EAAkB,CAAC,GAE7DuB,KAAsB/E;AAAA,IAC1B,CAACgE,MAAkB;AACjB,UAAI1G;AACF;AAEF,YAAMlB,IACJqD,EAAc,SAAS,MAAM,UAAU,KAAK,QAAQ;AAKtD,MAJqBvD;AAAA,QACnB8H;AAAA,QACA5H;AAAA,MAAA,IAGAuD,EAA0B,UAAUqE,KAEpCrE,EAA0B,UAAU,MACpCS,EAAwB4D,CAAK,IAE/B9G,IAAW8G,CAAK;AAAA,IAClB;AAAA,IACA,CAAC5D,GAAyBlD,GAAUI,CAAQ;AAAA,EAAA,GAGxC0H,KAAuB,CAAC1H,KAAYuC,GACpCoF,IAAYjH;AAAA,IAChB,OAAO;AAAA,MACL,oBAAoBkD;AAAA,MACpB,kBAAAG;AAAA,MACA,OAAOE;AAAA,MACP,YAAAC;AAAA,MACA,YAAAC;AAAA,IAAA;AAAA,IAEF,CAACF,IAAaC,IAAYN,GAAYG,IAAkBI,EAAU;AAAA,EAAA,GAG9DyD,KAA2BlF;AAAA,IAC/B,CAACmF,MAAyB;AACxB,MAAI7H,KAAY,YAAY6H,KAG5BA,EAAO,UAAUF,CAAS;AAAA,IAC5B;AAAA,IACA,CAAC3H,GAAU2H,CAAS;AAAA,EAAA,GAGhBG,KAAmBpH,EAAQ,MAC1BT,GAAqB,+BAIvB,OAAA,EAAI,WAAU,sCACZ,UAAAA,EAAoB,IAAI,CAAC4H,MAAW;AACnC,QAAI,YAAYA;AACd,aACEE,gBAAAA,EAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAU;AAAA,UAGT,UAAAF,EAAO,OAAOF,CAAS;AAAA,QAAA;AAAA,QAFnBE,EAAO;AAAA,MAAA;AAMlB,UAAMG,IAAYH,EAAO,SAASA,EAAO,WAAW,QAC9CjF,IACJqF,gBAAAA,EAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QAEL,UAAUjI,KAAY6H,EAAO;AAAA,QAC7B,SAAS,MAAMD,GAAyBC,CAAM;AAAA,QAC9C,WAAU;AAAA,QACV,cAAYG;AAAA,QACZ,OAAOH,EAAO,SAASA,EAAO;AAAA,QAE7B,UAAA;AAAA,UAAAA,EAAO,OACNE,gBAAAA,MAAC,QAAA,EAAK,WAAU,sBAAsB,UAAAF,EAAO,MAAK,IAChD;AAAA,UACHA,EAAO,QACNE,gBAAAA,MAAC,QAAA,EAAK,WAAU,uBAAuB,UAAAF,EAAO,OAAM,IAClD;AAAA,QAAA;AAAA,MAAA;AAAA,MAZCA,EAAO;AAAA,IAAA,GAeVK,IAAUL,EAAO,UACrBI,gBAAAA,EAAAA,KAACE,IAAA,EACC,UAAA;AAAA,MAAAJ,gBAAAA,EAAAA,IAACK,IAAA,EAAe,SAAO,IAAE,UAAAxF,GAAO;AAAA,MAChCmF,gBAAAA,EAAAA,IAACM,IAAA,EAAe,MAAK,OAAO,YAAO,QAAA,CAAQ;AAAA,IAAA,EAAA,CAC7C,IAEAzF;AAEF,WACEmF,gBAAAA,EAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAU;AAAA,QAGT,UAAAG;AAAA,MAAA;AAAA,MAFIL,EAAO;AAAA,IAAA;AAAA,EAKlB,CAAC,EAAA,CACH,IAnDO,MAqDR,CAAC7H,GAAU2H,GAAWC,IAA0B3H,CAAmB,CAAC;AAEvE,SAAAK,EAAU,MAAM;AACd,IAAAJ,KAAUyH,CAAS;AAAA,EACrB,GAAG,CAACA,CAAS,CAAC,GAGZM,gBAAAA,EAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAU;AAAA,MACV,iBAAejI,IAAW,SAAS;AAAA,MACnC,iBAAeA;AAAA,MAEf,UAAA;AAAA,QAAA+H,gBAAAA,EAAAA;AAAAA,UAACO;AAAA,UAAA;AAAA,YACC,UAAAtI;AAAA,YACA,QAAQS;AAAA,YACR,UAAU8C;AAAA,YACV,6BAA6BqB;AAAA,YAC7B,wBAAwBjC;AAAA,YACxB,uBAAuBF;AAAA,YACvB,uBAAuBoC;AAAA,YACvB,cAAcC;AAAA,YACd,gBAAgBC;AAAA,YAChB,sBAAsBC;AAAA,YACtB,qBAAqBG;AAAA,YACrB,oBAAoBC;AAAA,YACpB,sBAAsBsC;AAAA,YACtB,WAAWI;AAAA,UAAA;AAAA,QAAA;AAAA,QAEbC,gBAAAA,EAAAA;AAAAA,UAACQ;AAAA,UAAA;AAAA,YACC,MAAMb;AAAA,YACN,eAAepF,EAAwB;AAAA,YACvC,SAASG;AAAA,YACT,UAAUoD;AAAA,YACV,WAAAnE;AAAA,YACA,iBAAAE;AAAA,YACA,QAAQjB;AAAA,UAAA;AAAA,QAAA;AAAA,QAEVoH,gBAAAA,EAAAA,IAAC,SAAI,WAAU,oDACb,iCAACS,GAAc,UAAd,EAAuB,OAAO3F,IAC7B,UAAA;AAAA,UAAAkF,gBAAAA,EAAAA;AAAAA,YAACU;AAAAA,YAAA;AAAA,cACC,YAAY1B;AAAA,cACZ,YAAY;AAAA,gBACV,aAAa;AAAA,gBACb,oBAAoB;AAAA,gBACpB,qBAAqB;AAAA,gBACrB,2BAA2B;AAAA,gBAC3B,YAAY;AAAA,cAAA;AAAA,cAEd,WAAU;AAAA,cACV,aAAanG;AAAA,cACb,OAAO/B;AAAA,cACP,OAAM;AAAA,cACN,WAAU;AAAA,cACV,UAAU,CAACmB;AAAA,cACX,UAAUyH;AAAA,cACV,QAAA5H;AAAA,YAAA;AAAA,UAAA;AAAA,UAED,CAACG,KACAiI,gBAAAA,EAAAA;AAAAA,YAACS;AAAA,YAAA;AAAA,cACC,QAAQ;AAAA,gBACN,OACE5G,MAAmBE,EAAe,QAC9B7B,EAAE,kBAAkB,IACpB2B,MAAmBE,EAAe,QAChC7B,EAAE,kBAAkB,IACpB2B,MAAmBE,EAAe,WAChC7B,EAAE,qBAAqB,IACvBA,EAAE,aAAa;AAAA,cAAA;AAAA,cAG1B,UAAA;AAAA,gBAAA2B,MAAmBE,EAAe,SACjC+F,gBAAAA,EAAAA;AAAAA,kBAACY;AAAA,kBAAA;AAAA,oBACC,OAAO1G,GAAmB;AAAA,oBAC1B,UAAUoD;AAAA,oBACV,aAAAtF;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAGH+B,MAAmBE,EAAe,SACjC+F,gBAAAA,EAAAA;AAAAA,kBAACa;AAAA,kBAAA;AAAA,oBACC,OAAO3G,GAAmB;AAAA,oBAC1B,UAAU0D;AAAA,kBAAA;AAAA,gBAAA;AAAA,cACZ;AAAA,YAAA;AAAA,UAAA;AAAA,UAKL,CAAC3F,KACA+H,gBAAAA,EAAAA,IAACc,IAAA,EACC,UAAAd,gBAAAA,EAAAA;AAAAA,YAACe;AAAA,YAAA;AAAA,cACC,WAAApH;AAAA,cACA,iBAAAE;AAAA,cACA,cAAcK,GAAmB,OAAO;AAAA,cACxC,UAAU4D;AAAA,cACV,eAAe,CAAC9E,MAAa;AAC3B,gBAAAY,EAAa,CAACuB,MAAS;AACrB,wBAAMlC,IAAaD,EAAS,KAAK,YAAA;AAIjC,yBAHemC,EAAK;AAAA,oBAClB,CAAC6F,MAASA,EAAK,KAAK,kBAAkB/H;AAAA,kBAAA,IAG/BkC,IAEF,CAACnC,GAAU,GAAGmC,CAAI;AAAA,gBAC3B,CAAC;AAAA,cACH;AAAA,YAAA;AAAA,UAAA,EACF,CACF;AAAA,QAAA,EAAA,CAEJ,EAAA,CACF;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGN;"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const o=require("../../../markdown-flow-ui/node_modules/.pnpm/@codemirror_view@6.38.6/node_modules/@codemirror/view/dist/index.cjs.js"),g=require("../types.cjs.js"),m=require("./PlaceholderWidget.cjs.js"),p=/!\[([^\]]*)\]\(([^)]+)\)|<img\b[^>]*>/gi,a=(e,t)=>{const r=new RegExp(`${t}\\s*=\\s*("(.*?)"|'(.*?)'|([^\\s"'<>]+))`,"i"),c=e.match(r);if(c)return c[2]??c[3]??c[4]},h=e=>Math.max(1,Math.min(1e3,Math.round(e))),f=e=>{const t=e?.[0]??"";if(/^<img\b/i.test(t)){const d=a(t,"src")??"",i=a(t,"alt")??a(t,"title")??"",n=a(t,"width");let s;if(n){const l=Number.parseFloat(n);Number.isFinite(l)&&(s=h(l))}return{text:i||"Image",url:d,title:i,scalePercent:s}}const r=e?.[1]??"",c=e?.[2]??"";return{text:r,url:c,title:r,scalePercent:void 0}},u=new o.MatchDecorator({regexp:p,decoration:(e,t)=>{const r=f(e);return o.Decoration.replace({widget:new m.default(r.text,{tag:"image",url:r.url,title:r.title,scalePercent:r.scalePercent},"tag-image",g.SelectedOption.Image,t)})}}),x=o.ViewPlugin.fromClass(class{constructor(e){this.placeholders=u.createDeco(e)}update(e){this.placeholders=u.updateDeco(e,this.placeholders)}},{decorations:e=>e.placeholders,provide:e=>o.EditorView.atomicRanges.of(t=>t.plugin(e)?.placeholders||o.Decoration.none)});exports.default=x;
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const o=require("../../../markdown-flow-ui/node_modules/.pnpm/@codemirror_view@6.38.6/node_modules/@codemirror/view/dist/index.cjs.js"),h=require("../types.cjs.js"),x=require("../utils.cjs.js"),f=require("./PlaceholderWidget.cjs.js"),w=/!\[([^\]]*)\]\(([^)]+)\)|<img\b[^>]*>/i,M=/===\s*(?:!\[[^\]]*\]\([^)]+\)|<img\b[^>]*>)\s*===|!\[[^\]]*\]\([^)]+\)|<img\b[^>]*>/gi,i=(e,r)=>{const t=new RegExp(`${r}\\s*=\\s*("(.*?)"|'(.*?)'|([^\\s"'<>]+))`,"i"),c=e.match(t);if(c)return c[2]??c[3]??c[4]},b=e=>Math.max(1,Math.min(1e3,Math.round(e))),P=e=>{const r=e?.[0]??"",t=x.unwrapFixedOutput(r),c=/^\s*===/.test(r);if(/^<img\b/i.test(t)){const p=i(t,"src")??"",n=i(t,"alt")??i(t,"title")??"",l=i(t,"width");let u;if(l){const d=Number.parseFloat(l);Number.isFinite(d)&&(u=b(d))}return{text:n||"Image",url:p,title:n,scalePercent:u,fixedOutput:c}}const a=t.match(w),s=a?.[1]??"",m=a?.[2]??"";return{text:s,url:m,title:s,scalePercent:void 0,fixedOutput:c}},g=new o.MatchDecorator({regexp:M,decoration:(e,r)=>{const t=P(e);return o.Decoration.replace({widget:new f.default(t.text,{tag:"image",url:t.url,title:t.title,scalePercent:t.scalePercent,fixedOutput:t.fixedOutput},"tag-image",h.SelectedOption.Image,r)})}}),I=o.ViewPlugin.fromClass(class{constructor(e){this.placeholders=g.createDeco(e)}update(e){this.placeholders=g.updateDeco(e,this.placeholders)}},{decorations:e=>e.placeholders,provide:e=>o.EditorView.atomicRanges.of(r=>r.plugin(e)?.placeholders||o.Decoration.none)});exports.default=I;
2
2
  //# sourceMappingURL=ImgPlaceholder.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ImgPlaceholder.cjs.js","sources":["../../../../src/components/MarkdownFlowEditor/plugins/ImgPlaceholder.ts"],"sourcesContent":["import {\n EditorView,\n Decoration,\n DecorationSet,\n ViewPlugin,\n ViewUpdate,\n MatchDecorator,\n} from \"@codemirror/view\";\nimport { SelectedOption } from \"../types\";\nimport PlaceholderWidget from \"./PlaceholderWidget\";\n\nconst agiImgContextRegexp = /!\\[([^\\]]*)\\]\\(([^)]+)\\)|<img\\b[^>]*>/gi;\n\nconst extractAttributeValue = (tag: string, attribute: string) => {\n const regexp = new RegExp(\n `${attribute}\\\\s*=\\\\s*(\"(.*?)\"|'(.*?)'|([^\\\\s\"'<>]+))`,\n \"i\"\n );\n const match = tag.match(regexp);\n if (!match) return undefined;\n return match[2] ?? match[3] ?? match[4];\n};\n\nconst clampScalePercent = (value: number) =>\n Math.max(1, Math.min(1000, Math.round(value)));\n\nconst getImageMatchInfo = (match: RegExpMatchArray) => {\n const raw = match?.[0] ?? \"\";\n if (/^<img\\b/i.test(raw)) {\n const src = extractAttributeValue(raw, \"src\") ?? \"\";\n const alt =\n extractAttributeValue(raw, \"alt\") ??\n extractAttributeValue(raw, \"title\") ??\n \"\";\n const widthAttr = extractAttributeValue(raw, \"width\");\n let scalePercent: number | undefined;\n if (widthAttr) {\n const numeric = Number.parseFloat(widthAttr);\n if (Number.isFinite(numeric)) {\n scalePercent = clampScalePercent(numeric);\n }\n }\n return {\n text: alt || \"Image\",\n url: src,\n title: alt,\n scalePercent,\n };\n }\n const title = match?.[1] ?? \"\";\n const url = match?.[2] ?? \"\";\n return {\n text: title,\n url,\n title,\n scalePercent: undefined,\n };\n};\n\nconst imageUrlMatcher = new MatchDecorator({\n regexp: agiImgContextRegexp,\n decoration: (match, view) => {\n const info = getImageMatchInfo(match);\n return Decoration.replace({\n widget: new PlaceholderWidget(\n info.text,\n {\n tag: \"image\",\n url: info.url,\n title: info.title,\n scalePercent: info.scalePercent,\n },\n \"tag-image\",\n SelectedOption.Image,\n view\n ),\n });\n },\n});\n\nconst ImgPlaceholder = ViewPlugin.fromClass(\n class {\n placeholders: DecorationSet;\n constructor(view: EditorView) {\n this.placeholders = imageUrlMatcher.createDeco(view);\n }\n update(update: ViewUpdate) {\n this.placeholders = imageUrlMatcher.updateDeco(update, this.placeholders);\n }\n },\n {\n decorations: (instance) => instance.placeholders,\n provide: (plugin) =>\n EditorView.atomicRanges.of((view) => {\n return view.plugin(plugin)?.placeholders || Decoration.none;\n }),\n }\n);\n\nexport default ImgPlaceholder;\n"],"names":["agiImgContextRegexp","extractAttributeValue","tag","attribute","regexp","match","clampScalePercent","value","getImageMatchInfo","raw","src","alt","widthAttr","scalePercent","numeric","title","url","imageUrlMatcher","MatchDecorator","view","info","Decoration","PlaceholderWidget","SelectedOption","ImgPlaceholder","ViewPlugin","update","instance","plugin","EditorView"],"mappings":"yTAWMA,EAAsB,0CAEtBC,EAAwB,CAACC,EAAaC,IAAsB,CAChE,MAAMC,EAAS,IAAI,OACjB,GAAGD,CAAS,2CACZ,GAAA,EAEIE,EAAQH,EAAI,MAAME,CAAM,EAC9B,GAAKC,EACL,OAAOA,EAAM,CAAC,GAAKA,EAAM,CAAC,GAAKA,EAAM,CAAC,CACxC,EAEMC,EAAqBC,GACzB,KAAK,IAAI,EAAG,KAAK,IAAI,IAAM,KAAK,MAAMA,CAAK,CAAC,CAAC,EAEzCC,EAAqBH,GAA4B,CACrD,MAAMI,EAAMJ,IAAQ,CAAC,GAAK,GAC1B,GAAI,WAAW,KAAKI,CAAG,EAAG,CACxB,MAAMC,EAAMT,EAAsBQ,EAAK,KAAK,GAAK,GAC3CE,EACJV,EAAsBQ,EAAK,KAAK,GAChCR,EAAsBQ,EAAK,OAAO,GAClC,GACIG,EAAYX,EAAsBQ,EAAK,OAAO,EACpD,IAAII,EACJ,GAAID,EAAW,CACb,MAAME,EAAU,OAAO,WAAWF,CAAS,EACvC,OAAO,SAASE,CAAO,IACzBD,EAAeP,EAAkBQ,CAAO,EAE5C,CACA,MAAO,CACL,KAAMH,GAAO,QACb,IAAKD,EACL,MAAOC,EACP,aAAAE,CAAA,CAEJ,CACA,MAAME,EAAQV,IAAQ,CAAC,GAAK,GACtBW,EAAMX,IAAQ,CAAC,GAAK,GAC1B,MAAO,CACL,KAAMU,EACN,IAAAC,EACA,MAAAD,EACA,aAAc,MAAA,CAElB,EAEME,EAAkB,IAAIC,EAAAA,eAAe,CACzC,OAAQlB,EACR,WAAY,CAACK,EAAOc,IAAS,CAC3B,MAAMC,EAAOZ,EAAkBH,CAAK,EACpC,OAAOgB,EAAAA,WAAW,QAAQ,CACxB,OAAQ,IAAIC,EAAAA,QACVF,EAAK,KACL,CACE,IAAK,QACL,IAAKA,EAAK,IACV,MAAOA,EAAK,MACZ,aAAcA,EAAK,YAAA,EAErB,YACAG,EAAAA,eAAe,MACfJ,CAAA,CACF,CACD,CACH,CACF,CAAC,EAEKK,EAAiBC,EAAAA,WAAW,UAChC,KAAM,CAEJ,YAAYN,EAAkB,CAC5B,KAAK,aAAeF,EAAgB,WAAWE,CAAI,CACrD,CACA,OAAOO,EAAoB,CACzB,KAAK,aAAeT,EAAgB,WAAWS,EAAQ,KAAK,YAAY,CAC1E,CAAA,EAEF,CACE,YAAcC,GAAaA,EAAS,aACpC,QAAUC,GACRC,EAAAA,WAAW,aAAa,GAAIV,GACnBA,EAAK,OAAOS,CAAM,GAAG,cAAgBP,EAAAA,WAAW,IACxD,CAAA,CAEP"}
1
+ {"version":3,"file":"ImgPlaceholder.cjs.js","sources":["../../../../src/components/MarkdownFlowEditor/plugins/ImgPlaceholder.ts"],"sourcesContent":["import {\n EditorView,\n Decoration,\n DecorationSet,\n ViewPlugin,\n ViewUpdate,\n MatchDecorator,\n} from \"@codemirror/view\";\nimport { SelectedOption } from \"../types\";\nimport { unwrapFixedOutput } from \"../utils\";\nimport PlaceholderWidget from \"./PlaceholderWidget\";\n\nconst imageMarkupRegexp = /!\\[([^\\]]*)\\]\\(([^)]+)\\)|<img\\b[^>]*>/i;\nconst agiImgContextRegexp =\n /===\\s*(?:!\\[[^\\]]*\\]\\([^)]+\\)|<img\\b[^>]*>)\\s*===|!\\[[^\\]]*\\]\\([^)]+\\)|<img\\b[^>]*>/gi;\n\nconst extractAttributeValue = (tag: string, attribute: string) => {\n const regexp = new RegExp(\n `${attribute}\\\\s*=\\\\s*(\"(.*?)\"|'(.*?)'|([^\\\\s\"'<>]+))`,\n \"i\"\n );\n const match = tag.match(regexp);\n if (!match) return undefined;\n return match[2] ?? match[3] ?? match[4];\n};\n\nconst clampScalePercent = (value: number) =>\n Math.max(1, Math.min(1000, Math.round(value)));\n\nconst getImageMatchInfo = (match: RegExpMatchArray) => {\n const source = match?.[0] ?? \"\";\n const raw = unwrapFixedOutput(source);\n const fixedOutput = /^\\s*===/.test(source);\n if (/^<img\\b/i.test(raw)) {\n const src = extractAttributeValue(raw, \"src\") ?? \"\";\n const alt =\n extractAttributeValue(raw, \"alt\") ??\n extractAttributeValue(raw, \"title\") ??\n \"\";\n const widthAttr = extractAttributeValue(raw, \"width\");\n let scalePercent: number | undefined;\n if (widthAttr) {\n const numeric = Number.parseFloat(widthAttr);\n if (Number.isFinite(numeric)) {\n scalePercent = clampScalePercent(numeric);\n }\n }\n return {\n text: alt || \"Image\",\n url: src,\n title: alt,\n scalePercent,\n fixedOutput,\n };\n }\n const markdownMatch = raw.match(imageMarkupRegexp);\n const title = markdownMatch?.[1] ?? \"\";\n const url = markdownMatch?.[2] ?? \"\";\n return {\n text: title,\n url,\n title,\n scalePercent: undefined,\n fixedOutput,\n };\n};\n\nconst imageUrlMatcher = new MatchDecorator({\n regexp: agiImgContextRegexp,\n decoration: (match, view) => {\n const info = getImageMatchInfo(match);\n return Decoration.replace({\n widget: new PlaceholderWidget(\n info.text,\n {\n tag: \"image\",\n url: info.url,\n title: info.title,\n scalePercent: info.scalePercent,\n fixedOutput: info.fixedOutput,\n },\n \"tag-image\",\n SelectedOption.Image,\n view\n ),\n });\n },\n});\n\nconst ImgPlaceholder = ViewPlugin.fromClass(\n class {\n placeholders: DecorationSet;\n constructor(view: EditorView) {\n this.placeholders = imageUrlMatcher.createDeco(view);\n }\n update(update: ViewUpdate) {\n this.placeholders = imageUrlMatcher.updateDeco(update, this.placeholders);\n }\n },\n {\n decorations: (instance) => instance.placeholders,\n provide: (plugin) =>\n EditorView.atomicRanges.of((view) => {\n return view.plugin(plugin)?.placeholders || Decoration.none;\n }),\n }\n);\n\nexport default ImgPlaceholder;\n"],"names":["imageMarkupRegexp","agiImgContextRegexp","extractAttributeValue","tag","attribute","regexp","match","clampScalePercent","value","getImageMatchInfo","source","raw","unwrapFixedOutput","fixedOutput","src","alt","widthAttr","scalePercent","numeric","markdownMatch","title","url","imageUrlMatcher","MatchDecorator","view","info","Decoration","PlaceholderWidget","SelectedOption","ImgPlaceholder","ViewPlugin","update","instance","plugin","EditorView"],"mappings":"sVAYMA,EAAoB,yCACpBC,EACJ,wFAEIC,EAAwB,CAACC,EAAaC,IAAsB,CAChE,MAAMC,EAAS,IAAI,OACjB,GAAGD,CAAS,2CACZ,GAAA,EAEIE,EAAQH,EAAI,MAAME,CAAM,EAC9B,GAAKC,EACL,OAAOA,EAAM,CAAC,GAAKA,EAAM,CAAC,GAAKA,EAAM,CAAC,CACxC,EAEMC,EAAqBC,GACzB,KAAK,IAAI,EAAG,KAAK,IAAI,IAAM,KAAK,MAAMA,CAAK,CAAC,CAAC,EAEzCC,EAAqBH,GAA4B,CACrD,MAAMI,EAASJ,IAAQ,CAAC,GAAK,GACvBK,EAAMC,EAAAA,kBAAkBF,CAAM,EAC9BG,EAAc,UAAU,KAAKH,CAAM,EACzC,GAAI,WAAW,KAAKC,CAAG,EAAG,CACxB,MAAMG,EAAMZ,EAAsBS,EAAK,KAAK,GAAK,GAC3CI,EACJb,EAAsBS,EAAK,KAAK,GAChCT,EAAsBS,EAAK,OAAO,GAClC,GACIK,EAAYd,EAAsBS,EAAK,OAAO,EACpD,IAAIM,EACJ,GAAID,EAAW,CACb,MAAME,EAAU,OAAO,WAAWF,CAAS,EACvC,OAAO,SAASE,CAAO,IACzBD,EAAeV,EAAkBW,CAAO,EAE5C,CACA,MAAO,CACL,KAAMH,GAAO,QACb,IAAKD,EACL,MAAOC,EACP,aAAAE,EACA,YAAAJ,CAAA,CAEJ,CACA,MAAMM,EAAgBR,EAAI,MAAMX,CAAiB,EAC3CoB,EAAQD,IAAgB,CAAC,GAAK,GAC9BE,EAAMF,IAAgB,CAAC,GAAK,GAClC,MAAO,CACL,KAAMC,EACN,IAAAC,EACA,MAAAD,EACA,aAAc,OACd,YAAAP,CAAA,CAEJ,EAEMS,EAAkB,IAAIC,EAAAA,eAAe,CACzC,OAAQtB,EACR,WAAY,CAACK,EAAOkB,IAAS,CAC3B,MAAMC,EAAOhB,EAAkBH,CAAK,EACpC,OAAOoB,EAAAA,WAAW,QAAQ,CACxB,OAAQ,IAAIC,EAAAA,QACVF,EAAK,KACL,CACE,IAAK,QACL,IAAKA,EAAK,IACV,MAAOA,EAAK,MACZ,aAAcA,EAAK,aACnB,YAAaA,EAAK,WAAA,EAEpB,YACAG,EAAAA,eAAe,MACfJ,CAAA,CACF,CACD,CACH,CACF,CAAC,EAEKK,EAAiBC,EAAAA,WAAW,UAChC,KAAM,CAEJ,YAAYN,EAAkB,CAC5B,KAAK,aAAeF,EAAgB,WAAWE,CAAI,CACrD,CACA,OAAOO,EAAoB,CACzB,KAAK,aAAeT,EAAgB,WAAWS,EAAQ,KAAK,YAAY,CAC1E,CAAA,EAEF,CACE,YAAcC,GAAaA,EAAS,aACpC,QAAUC,GACRC,EAAAA,WAAW,aAAa,GAAIV,GACnBA,EAAK,OAAOS,CAAM,GAAG,cAAgBP,EAAAA,WAAW,IACxD,CAAA,CAEP"}
@@ -1,70 +1,74 @@
1
- import { MatchDecorator as d, Decoration as g, ViewPlugin as u, EditorView as p } from "../../../markdown-flow-ui/node_modules/.pnpm/@codemirror_view@6.38.6/node_modules/@codemirror/view/dist/index.es.js";
2
- import { SelectedOption as h } from "../types.es.js";
3
- import f from "./PlaceholderWidget.es.js";
4
- const x = /!\[([^\]]*)\]\(([^)]+)\)|<img\b[^>]*>/gi, c = (e, t) => {
5
- const r = new RegExp(
6
- `${t}\\s*=\\s*("(.*?)"|'(.*?)'|([^\\s"'<>]+))`,
1
+ import { MatchDecorator as h, Decoration as p, ViewPlugin as f, EditorView as x } from "../../../markdown-flow-ui/node_modules/.pnpm/@codemirror_view@6.38.6/node_modules/@codemirror/view/dist/index.es.js";
2
+ import { SelectedOption as w } from "../types.es.js";
3
+ import { unwrapFixedOutput as M } from "../utils.es.js";
4
+ import P from "./PlaceholderWidget.es.js";
5
+ const b = /!\[([^\]]*)\]\(([^)]+)\)|<img\b[^>]*>/i, I = /===\s*(?:!\[[^\]]*\]\([^)]+\)|<img\b[^>]*>)\s*===|!\[[^\]]*\]\([^)]+\)|<img\b[^>]*>/gi, c = (t, r) => {
6
+ const e = new RegExp(
7
+ `${r}\\s*=\\s*("(.*?)"|'(.*?)'|([^\\s"'<>]+))`,
7
8
  "i"
8
- ), o = e.match(r);
9
+ ), o = t.match(e);
9
10
  if (o)
10
11
  return o[2] ?? o[3] ?? o[4];
11
- }, w = (e) => Math.max(1, Math.min(1e3, Math.round(e))), P = (e) => {
12
- const t = e?.[0] ?? "";
13
- if (/^<img\b/i.test(t)) {
14
- const m = c(t, "src") ?? "", a = c(t, "alt") ?? c(t, "title") ?? "", i = c(t, "width");
15
- let n;
16
- if (i) {
17
- const s = Number.parseFloat(i);
18
- Number.isFinite(s) && (n = w(s));
12
+ }, O = (t) => Math.max(1, Math.min(1e3, Math.round(t))), D = (t) => {
13
+ const r = t?.[0] ?? "", e = M(r), o = /^\s*===/.test(r);
14
+ if (/^<img\b/i.test(e)) {
15
+ const d = c(e, "src") ?? "", n = c(e, "alt") ?? c(e, "title") ?? "", s = c(e, "width");
16
+ let l;
17
+ if (s) {
18
+ const m = Number.parseFloat(s);
19
+ Number.isFinite(m) && (l = O(m));
19
20
  }
20
21
  return {
21
- text: a || "Image",
22
- url: m,
23
- title: a,
24
- scalePercent: n
22
+ text: n || "Image",
23
+ url: d,
24
+ title: n,
25
+ scalePercent: l,
26
+ fixedOutput: o
25
27
  };
26
28
  }
27
- const r = e?.[1] ?? "", o = e?.[2] ?? "";
29
+ const a = e.match(b), i = a?.[1] ?? "", g = a?.[2] ?? "";
28
30
  return {
29
- text: r,
30
- url: o,
31
- title: r,
32
- scalePercent: void 0
31
+ text: i,
32
+ url: g,
33
+ title: i,
34
+ scalePercent: void 0,
35
+ fixedOutput: o
33
36
  };
34
- }, l = new d({
35
- regexp: x,
36
- decoration: (e, t) => {
37
- const r = P(e);
38
- return g.replace({
39
- widget: new f(
40
- r.text,
37
+ }, u = new h({
38
+ regexp: I,
39
+ decoration: (t, r) => {
40
+ const e = D(t);
41
+ return p.replace({
42
+ widget: new P(
43
+ e.text,
41
44
  {
42
45
  tag: "image",
43
- url: r.url,
44
- title: r.title,
45
- scalePercent: r.scalePercent
46
+ url: e.url,
47
+ title: e.title,
48
+ scalePercent: e.scalePercent,
49
+ fixedOutput: e.fixedOutput
46
50
  },
47
51
  "tag-image",
48
- h.Image,
49
- t
52
+ w.Image,
53
+ r
50
54
  )
51
55
  });
52
56
  }
53
- }), D = u.fromClass(
57
+ }), k = f.fromClass(
54
58
  class {
55
- constructor(e) {
56
- this.placeholders = l.createDeco(e);
59
+ constructor(t) {
60
+ this.placeholders = u.createDeco(t);
57
61
  }
58
- update(e) {
59
- this.placeholders = l.updateDeco(e, this.placeholders);
62
+ update(t) {
63
+ this.placeholders = u.updateDeco(t, this.placeholders);
60
64
  }
61
65
  },
62
66
  {
63
- decorations: (e) => e.placeholders,
64
- provide: (e) => p.atomicRanges.of((t) => t.plugin(e)?.placeholders || g.none)
67
+ decorations: (t) => t.placeholders,
68
+ provide: (t) => x.atomicRanges.of((r) => r.plugin(t)?.placeholders || p.none)
65
69
  }
66
70
  );
67
71
  export {
68
- D as default
72
+ k as default
69
73
  };
70
74
  //# sourceMappingURL=ImgPlaceholder.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ImgPlaceholder.es.js","sources":["../../../../src/components/MarkdownFlowEditor/plugins/ImgPlaceholder.ts"],"sourcesContent":["import {\n EditorView,\n Decoration,\n DecorationSet,\n ViewPlugin,\n ViewUpdate,\n MatchDecorator,\n} from \"@codemirror/view\";\nimport { SelectedOption } from \"../types\";\nimport PlaceholderWidget from \"./PlaceholderWidget\";\n\nconst agiImgContextRegexp = /!\\[([^\\]]*)\\]\\(([^)]+)\\)|<img\\b[^>]*>/gi;\n\nconst extractAttributeValue = (tag: string, attribute: string) => {\n const regexp = new RegExp(\n `${attribute}\\\\s*=\\\\s*(\"(.*?)\"|'(.*?)'|([^\\\\s\"'<>]+))`,\n \"i\"\n );\n const match = tag.match(regexp);\n if (!match) return undefined;\n return match[2] ?? match[3] ?? match[4];\n};\n\nconst clampScalePercent = (value: number) =>\n Math.max(1, Math.min(1000, Math.round(value)));\n\nconst getImageMatchInfo = (match: RegExpMatchArray) => {\n const raw = match?.[0] ?? \"\";\n if (/^<img\\b/i.test(raw)) {\n const src = extractAttributeValue(raw, \"src\") ?? \"\";\n const alt =\n extractAttributeValue(raw, \"alt\") ??\n extractAttributeValue(raw, \"title\") ??\n \"\";\n const widthAttr = extractAttributeValue(raw, \"width\");\n let scalePercent: number | undefined;\n if (widthAttr) {\n const numeric = Number.parseFloat(widthAttr);\n if (Number.isFinite(numeric)) {\n scalePercent = clampScalePercent(numeric);\n }\n }\n return {\n text: alt || \"Image\",\n url: src,\n title: alt,\n scalePercent,\n };\n }\n const title = match?.[1] ?? \"\";\n const url = match?.[2] ?? \"\";\n return {\n text: title,\n url,\n title,\n scalePercent: undefined,\n };\n};\n\nconst imageUrlMatcher = new MatchDecorator({\n regexp: agiImgContextRegexp,\n decoration: (match, view) => {\n const info = getImageMatchInfo(match);\n return Decoration.replace({\n widget: new PlaceholderWidget(\n info.text,\n {\n tag: \"image\",\n url: info.url,\n title: info.title,\n scalePercent: info.scalePercent,\n },\n \"tag-image\",\n SelectedOption.Image,\n view\n ),\n });\n },\n});\n\nconst ImgPlaceholder = ViewPlugin.fromClass(\n class {\n placeholders: DecorationSet;\n constructor(view: EditorView) {\n this.placeholders = imageUrlMatcher.createDeco(view);\n }\n update(update: ViewUpdate) {\n this.placeholders = imageUrlMatcher.updateDeco(update, this.placeholders);\n }\n },\n {\n decorations: (instance) => instance.placeholders,\n provide: (plugin) =>\n EditorView.atomicRanges.of((view) => {\n return view.plugin(plugin)?.placeholders || Decoration.none;\n }),\n }\n);\n\nexport default ImgPlaceholder;\n"],"names":["agiImgContextRegexp","extractAttributeValue","tag","attribute","regexp","match","clampScalePercent","value","getImageMatchInfo","raw","src","alt","widthAttr","scalePercent","numeric","title","url","imageUrlMatcher","MatchDecorator","view","info","Decoration","PlaceholderWidget","SelectedOption","ImgPlaceholder","ViewPlugin","update","instance","plugin","EditorView"],"mappings":";;;AAWA,MAAMA,IAAsB,2CAEtBC,IAAwB,CAACC,GAAaC,MAAsB;AAChE,QAAMC,IAAS,IAAI;AAAA,IACjB,GAAGD,CAAS;AAAA,IACZ;AAAA,EAAA,GAEIE,IAAQH,EAAI,MAAME,CAAM;AAC9B,MAAKC;AACL,WAAOA,EAAM,CAAC,KAAKA,EAAM,CAAC,KAAKA,EAAM,CAAC;AACxC,GAEMC,IAAoB,CAACC,MACzB,KAAK,IAAI,GAAG,KAAK,IAAI,KAAM,KAAK,MAAMA,CAAK,CAAC,CAAC,GAEzCC,IAAoB,CAACH,MAA4B;AACrD,QAAMI,IAAMJ,IAAQ,CAAC,KAAK;AAC1B,MAAI,WAAW,KAAKI,CAAG,GAAG;AACxB,UAAMC,IAAMT,EAAsBQ,GAAK,KAAK,KAAK,IAC3CE,IACJV,EAAsBQ,GAAK,KAAK,KAChCR,EAAsBQ,GAAK,OAAO,KAClC,IACIG,IAAYX,EAAsBQ,GAAK,OAAO;AACpD,QAAII;AACJ,QAAID,GAAW;AACb,YAAME,IAAU,OAAO,WAAWF,CAAS;AAC3C,MAAI,OAAO,SAASE,CAAO,MACzBD,IAAeP,EAAkBQ,CAAO;AAAA,IAE5C;AACA,WAAO;AAAA,MACL,MAAMH,KAAO;AAAA,MACb,KAAKD;AAAA,MACL,OAAOC;AAAA,MACP,cAAAE;AAAA,IAAA;AAAA,EAEJ;AACA,QAAME,IAAQV,IAAQ,CAAC,KAAK,IACtBW,IAAMX,IAAQ,CAAC,KAAK;AAC1B,SAAO;AAAA,IACL,MAAMU;AAAA,IACN,KAAAC;AAAA,IACA,OAAAD;AAAA,IACA,cAAc;AAAA,EAAA;AAElB,GAEME,IAAkB,IAAIC,EAAe;AAAA,EACzC,QAAQlB;AAAA,EACR,YAAY,CAACK,GAAOc,MAAS;AAC3B,UAAMC,IAAOZ,EAAkBH,CAAK;AACpC,WAAOgB,EAAW,QAAQ;AAAA,MACxB,QAAQ,IAAIC;AAAA,QACVF,EAAK;AAAA,QACL;AAAA,UACE,KAAK;AAAA,UACL,KAAKA,EAAK;AAAA,UACV,OAAOA,EAAK;AAAA,UACZ,cAAcA,EAAK;AAAA,QAAA;AAAA,QAErB;AAAA,QACAG,EAAe;AAAA,QACfJ;AAAA,MAAA;AAAA,IACF,CACD;AAAA,EACH;AACF,CAAC,GAEKK,IAAiBC,EAAW;AAAA,EAChC,MAAM;AAAA,IAEJ,YAAYN,GAAkB;AAC5B,WAAK,eAAeF,EAAgB,WAAWE,CAAI;AAAA,IACrD;AAAA,IACA,OAAOO,GAAoB;AACzB,WAAK,eAAeT,EAAgB,WAAWS,GAAQ,KAAK,YAAY;AAAA,IAC1E;AAAA,EAAA;AAAA,EAEF;AAAA,IACE,aAAa,CAACC,MAAaA,EAAS;AAAA,IACpC,SAAS,CAACC,MACRC,EAAW,aAAa,GAAG,CAACV,MACnBA,EAAK,OAAOS,CAAM,GAAG,gBAAgBP,EAAW,IACxD;AAAA,EAAA;AAEP;"}
1
+ {"version":3,"file":"ImgPlaceholder.es.js","sources":["../../../../src/components/MarkdownFlowEditor/plugins/ImgPlaceholder.ts"],"sourcesContent":["import {\n EditorView,\n Decoration,\n DecorationSet,\n ViewPlugin,\n ViewUpdate,\n MatchDecorator,\n} from \"@codemirror/view\";\nimport { SelectedOption } from \"../types\";\nimport { unwrapFixedOutput } from \"../utils\";\nimport PlaceholderWidget from \"./PlaceholderWidget\";\n\nconst imageMarkupRegexp = /!\\[([^\\]]*)\\]\\(([^)]+)\\)|<img\\b[^>]*>/i;\nconst agiImgContextRegexp =\n /===\\s*(?:!\\[[^\\]]*\\]\\([^)]+\\)|<img\\b[^>]*>)\\s*===|!\\[[^\\]]*\\]\\([^)]+\\)|<img\\b[^>]*>/gi;\n\nconst extractAttributeValue = (tag: string, attribute: string) => {\n const regexp = new RegExp(\n `${attribute}\\\\s*=\\\\s*(\"(.*?)\"|'(.*?)'|([^\\\\s\"'<>]+))`,\n \"i\"\n );\n const match = tag.match(regexp);\n if (!match) return undefined;\n return match[2] ?? match[3] ?? match[4];\n};\n\nconst clampScalePercent = (value: number) =>\n Math.max(1, Math.min(1000, Math.round(value)));\n\nconst getImageMatchInfo = (match: RegExpMatchArray) => {\n const source = match?.[0] ?? \"\";\n const raw = unwrapFixedOutput(source);\n const fixedOutput = /^\\s*===/.test(source);\n if (/^<img\\b/i.test(raw)) {\n const src = extractAttributeValue(raw, \"src\") ?? \"\";\n const alt =\n extractAttributeValue(raw, \"alt\") ??\n extractAttributeValue(raw, \"title\") ??\n \"\";\n const widthAttr = extractAttributeValue(raw, \"width\");\n let scalePercent: number | undefined;\n if (widthAttr) {\n const numeric = Number.parseFloat(widthAttr);\n if (Number.isFinite(numeric)) {\n scalePercent = clampScalePercent(numeric);\n }\n }\n return {\n text: alt || \"Image\",\n url: src,\n title: alt,\n scalePercent,\n fixedOutput,\n };\n }\n const markdownMatch = raw.match(imageMarkupRegexp);\n const title = markdownMatch?.[1] ?? \"\";\n const url = markdownMatch?.[2] ?? \"\";\n return {\n text: title,\n url,\n title,\n scalePercent: undefined,\n fixedOutput,\n };\n};\n\nconst imageUrlMatcher = new MatchDecorator({\n regexp: agiImgContextRegexp,\n decoration: (match, view) => {\n const info = getImageMatchInfo(match);\n return Decoration.replace({\n widget: new PlaceholderWidget(\n info.text,\n {\n tag: \"image\",\n url: info.url,\n title: info.title,\n scalePercent: info.scalePercent,\n fixedOutput: info.fixedOutput,\n },\n \"tag-image\",\n SelectedOption.Image,\n view\n ),\n });\n },\n});\n\nconst ImgPlaceholder = ViewPlugin.fromClass(\n class {\n placeholders: DecorationSet;\n constructor(view: EditorView) {\n this.placeholders = imageUrlMatcher.createDeco(view);\n }\n update(update: ViewUpdate) {\n this.placeholders = imageUrlMatcher.updateDeco(update, this.placeholders);\n }\n },\n {\n decorations: (instance) => instance.placeholders,\n provide: (plugin) =>\n EditorView.atomicRanges.of((view) => {\n return view.plugin(plugin)?.placeholders || Decoration.none;\n }),\n }\n);\n\nexport default ImgPlaceholder;\n"],"names":["imageMarkupRegexp","agiImgContextRegexp","extractAttributeValue","tag","attribute","regexp","match","clampScalePercent","value","getImageMatchInfo","source","raw","unwrapFixedOutput","fixedOutput","src","alt","widthAttr","scalePercent","numeric","markdownMatch","title","url","imageUrlMatcher","MatchDecorator","view","info","Decoration","PlaceholderWidget","SelectedOption","ImgPlaceholder","ViewPlugin","update","instance","plugin","EditorView"],"mappings":";;;;AAYA,MAAMA,IAAoB,0CACpBC,IACJ,yFAEIC,IAAwB,CAACC,GAAaC,MAAsB;AAChE,QAAMC,IAAS,IAAI;AAAA,IACjB,GAAGD,CAAS;AAAA,IACZ;AAAA,EAAA,GAEIE,IAAQH,EAAI,MAAME,CAAM;AAC9B,MAAKC;AACL,WAAOA,EAAM,CAAC,KAAKA,EAAM,CAAC,KAAKA,EAAM,CAAC;AACxC,GAEMC,IAAoB,CAACC,MACzB,KAAK,IAAI,GAAG,KAAK,IAAI,KAAM,KAAK,MAAMA,CAAK,CAAC,CAAC,GAEzCC,IAAoB,CAACH,MAA4B;AACrD,QAAMI,IAASJ,IAAQ,CAAC,KAAK,IACvBK,IAAMC,EAAkBF,CAAM,GAC9BG,IAAc,UAAU,KAAKH,CAAM;AACzC,MAAI,WAAW,KAAKC,CAAG,GAAG;AACxB,UAAMG,IAAMZ,EAAsBS,GAAK,KAAK,KAAK,IAC3CI,IACJb,EAAsBS,GAAK,KAAK,KAChCT,EAAsBS,GAAK,OAAO,KAClC,IACIK,IAAYd,EAAsBS,GAAK,OAAO;AACpD,QAAIM;AACJ,QAAID,GAAW;AACb,YAAME,IAAU,OAAO,WAAWF,CAAS;AAC3C,MAAI,OAAO,SAASE,CAAO,MACzBD,IAAeV,EAAkBW,CAAO;AAAA,IAE5C;AACA,WAAO;AAAA,MACL,MAAMH,KAAO;AAAA,MACb,KAAKD;AAAA,MACL,OAAOC;AAAA,MACP,cAAAE;AAAA,MACA,aAAAJ;AAAA,IAAA;AAAA,EAEJ;AACA,QAAMM,IAAgBR,EAAI,MAAMX,CAAiB,GAC3CoB,IAAQD,IAAgB,CAAC,KAAK,IAC9BE,IAAMF,IAAgB,CAAC,KAAK;AAClC,SAAO;AAAA,IACL,MAAMC;AAAA,IACN,KAAAC;AAAA,IACA,OAAAD;AAAA,IACA,cAAc;AAAA,IACd,aAAAP;AAAA,EAAA;AAEJ,GAEMS,IAAkB,IAAIC,EAAe;AAAA,EACzC,QAAQtB;AAAA,EACR,YAAY,CAACK,GAAOkB,MAAS;AAC3B,UAAMC,IAAOhB,EAAkBH,CAAK;AACpC,WAAOoB,EAAW,QAAQ;AAAA,MACxB,QAAQ,IAAIC;AAAA,QACVF,EAAK;AAAA,QACL;AAAA,UACE,KAAK;AAAA,UACL,KAAKA,EAAK;AAAA,UACV,OAAOA,EAAK;AAAA,UACZ,cAAcA,EAAK;AAAA,UACnB,aAAaA,EAAK;AAAA,QAAA;AAAA,QAEpB;AAAA,QACAG,EAAe;AAAA,QACfJ;AAAA,MAAA;AAAA,IACF,CACD;AAAA,EACH;AACF,CAAC,GAEKK,IAAiBC,EAAW;AAAA,EAChC,MAAM;AAAA,IAEJ,YAAYN,GAAkB;AAC5B,WAAK,eAAeF,EAAgB,WAAWE,CAAI;AAAA,IACrD;AAAA,IACA,OAAOO,GAAoB;AACzB,WAAK,eAAeT,EAAgB,WAAWS,GAAQ,KAAK,YAAY;AAAA,IAC1E;AAAA,EAAA;AAAA,EAEF;AAAA,IACE,aAAa,CAACC,MAAaA,EAAS;AAAA,IACpC,SAAS,CAACC,MACRC,EAAW,aAAa,GAAG,CAACV,MACnBA,EAAK,OAAOS,CAAM,GAAG,gBAAgBP,EAAW,IACxD;AAAA,EAAA;AAEP;"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const c=require("../../../markdown-flow-ui/node_modules/.pnpm/@codemirror_view@6.38.6/node_modules/@codemirror/view/dist/index.cjs.js"),l="http://www.w3.org/2000/svg",n=e=>document.createElementNS(l,e),h=()=>{const e=n("svg");e.setAttribute("viewBox","0 0 24 24"),e.setAttribute("width","14"),e.setAttribute("height","14"),e.setAttribute("fill","none"),e.setAttribute("stroke","currentColor"),e.setAttribute("stroke-width","1.5"),e.setAttribute("stroke-linecap","round"),e.setAttribute("stroke-linejoin","round");const t=n("rect");t.setAttribute("width","18"),t.setAttribute("height","18"),t.setAttribute("x","3"),t.setAttribute("y","3"),t.setAttribute("rx","2"),t.setAttribute("ry","2");const s=n("circle");s.setAttribute("cx","9"),s.setAttribute("cy","9"),s.setAttribute("r","2");const i=n("path");return i.setAttribute("d","m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21"),e.append(t,s,i),e},b=()=>{const e=n("svg");e.setAttribute("viewBox","0 0 24 24"),e.setAttribute("width","14"),e.setAttribute("height","14"),e.setAttribute("fill","none"),e.setAttribute("stroke","currentColor"),e.setAttribute("stroke-width","1.5"),e.setAttribute("stroke-linecap","round"),e.setAttribute("stroke-linejoin","round");const t=n("rect");t.setAttribute("width","18"),t.setAttribute("height","18"),t.setAttribute("x","3"),t.setAttribute("y","3"),t.setAttribute("rx","2");const s=n("path");return s.setAttribute("d","m9 8 6 4-6 4Z"),e.append(t,s),e};class g extends c.WidgetType{constructor(t,s,i,r,o){super(),this.text=t,this.dataset=s,this.styleClass=i,this.type=r,this.view=o}getPosition(){let t=-1,s=-1;const i=this.view.state.facet(c.EditorView.decorations);for(const r of i)if((typeof r=="function"?r(this.view):r).between(0,this.view.state.doc.length,(a,u,d)=>{if(d.spec.widget===this)return t=a,s=u,!1}),t!==-1)break;if(t!==-1&&s!==-1)return[t,s]}toDOM(){const t=document.createElement("span");t.className=this.styleClass;const s=document.createElement("span");if(s.textContent=this.text,s.dataset.tag=this.dataset.tag||"",s.dataset.url=this.dataset.url||"",s.dataset.title=this.dataset.title||"",s.addEventListener("click",i=>{const[r,o]=this.getPosition()??[-1,-1],a=new CustomEvent("globalTagClick",{detail:{view:this.view,type:this.type,dataset:this.dataset,content:s.textContent,from:r,to:o,target:i.currentTarget}});window.dispatchEvent(a)}),this.dataset.tag==="image"||this.dataset.tag==="video"){const i=document.createElement("span");i.className="tag-placeholder-icon";const r=this.dataset.tag==="image"?h():b();i.appendChild(r),t.appendChild(i)}return t.appendChild(s),t}ignoreEvent(){return!1}}exports.default=g;
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const d=require("../../../markdown-flow-ui/node_modules/.pnpm/@codemirror_view@6.38.6/node_modules/@codemirror/view/dist/index.cjs.js"),l="http://www.w3.org/2000/svg",r=e=>document.createElementNS(l,e),h=()=>{const e=r("svg");e.setAttribute("viewBox","0 0 24 24"),e.setAttribute("width","14"),e.setAttribute("height","14"),e.setAttribute("fill","none"),e.setAttribute("stroke","currentColor"),e.setAttribute("stroke-width","1.5"),e.setAttribute("stroke-linecap","round"),e.setAttribute("stroke-linejoin","round");const t=r("rect");t.setAttribute("width","18"),t.setAttribute("height","18"),t.setAttribute("x","3"),t.setAttribute("y","3"),t.setAttribute("rx","2"),t.setAttribute("ry","2");const s=r("circle");s.setAttribute("cx","9"),s.setAttribute("cy","9"),s.setAttribute("r","2");const n=r("path");return n.setAttribute("d","m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21"),e.append(t,s,n),e},p=()=>{const e=r("svg");e.setAttribute("viewBox","0 0 24 24"),e.setAttribute("width","14"),e.setAttribute("height","14"),e.setAttribute("fill","none"),e.setAttribute("stroke","currentColor"),e.setAttribute("stroke-width","1.5"),e.setAttribute("stroke-linecap","round"),e.setAttribute("stroke-linejoin","round");const t=r("rect");t.setAttribute("width","18"),t.setAttribute("height","18"),t.setAttribute("x","3"),t.setAttribute("y","3"),t.setAttribute("rx","2");const s=r("path");return s.setAttribute("d","m9 8 6 4-6 4Z"),e.append(t,s),e};class b extends d.WidgetType{constructor(t,s,n,i,a){super(),this.text=t,this.dataset=s,this.styleClass=n,this.type=i,this.view=a}getPosition(){let t=-1,s=-1;const n=this.view.state.facet(d.EditorView.decorations);for(const i of n)if((typeof i=="function"?i(this.view):i).between(0,this.view.state.doc.length,(o,c,u)=>{if(u.spec.widget===this)return t=o,s=c,!1}),t!==-1)break;if(t!==-1&&s!==-1)return[t,s]}toDOM(){const t=document.createElement("span");t.className=this.styleClass;const s=document.createElement("span");s.className="tag-placeholder-content";const n=document.createElement("span");if(n.className="tag-placeholder-label",n.textContent=this.text,n.dataset.tag=this.dataset.tag||"",n.dataset.url=this.dataset.url||"",n.dataset.title=this.dataset.title||"",s.addEventListener("click",i=>{const[a,o]=this.getPosition()??[-1,-1],c=new CustomEvent("globalTagClick",{detail:{view:this.view,type:this.type,dataset:this.dataset,content:n.textContent,from:a,to:o,target:i.currentTarget}});window.dispatchEvent(c)}),this.dataset.fixedOutput){const i=document.createElement("span");i.className="tag-fixed-output-marker",i.textContent="===",t.appendChild(i)}if(this.dataset.tag==="image"||this.dataset.tag==="video"){const i=document.createElement("span");i.className="tag-placeholder-icon";const a=this.dataset.tag==="image"?h():p();i.appendChild(a),s.appendChild(i)}if(s.appendChild(n),t.appendChild(s),this.dataset.fixedOutput){const i=document.createElement("span");i.className="tag-fixed-output-marker",i.textContent="===",t.appendChild(i)}return t}ignoreEvent(){return!1}}exports.default=b;
2
2
  //# sourceMappingURL=PlaceholderWidget.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PlaceholderWidget.cjs.js","sources":["../../../../src/components/MarkdownFlowEditor/plugins/PlaceholderWidget.ts"],"sourcesContent":["import { EditorView, Decoration, WidgetType } from \"@codemirror/view\";\nimport { SelectedOption } from \"../types\";\n\nconst SVG_NS = \"http://www.w3.org/2000/svg\";\n\nconst createSvgElement = (tag: string) => document.createElementNS(SVG_NS, tag);\n// TODO: if use renderToStaticMarkup & createElement, it will cause react & react-dom version mismatch\n// so we use lucide-react to build the icon\n// lucide-react image icon\nconst buildImageIcon = () => {\n const svg = createSvgElement(\"svg\");\n svg.setAttribute(\"viewBox\", \"0 0 24 24\");\n svg.setAttribute(\"width\", \"14\");\n svg.setAttribute(\"height\", \"14\");\n svg.setAttribute(\"fill\", \"none\");\n svg.setAttribute(\"stroke\", \"currentColor\");\n svg.setAttribute(\"stroke-width\", \"1.5\");\n svg.setAttribute(\"stroke-linecap\", \"round\");\n svg.setAttribute(\"stroke-linejoin\", \"round\");\n\n const rect = createSvgElement(\"rect\");\n rect.setAttribute(\"width\", \"18\");\n rect.setAttribute(\"height\", \"18\");\n rect.setAttribute(\"x\", \"3\");\n rect.setAttribute(\"y\", \"3\");\n rect.setAttribute(\"rx\", \"2\");\n rect.setAttribute(\"ry\", \"2\");\n\n const circle = createSvgElement(\"circle\");\n circle.setAttribute(\"cx\", \"9\");\n circle.setAttribute(\"cy\", \"9\");\n circle.setAttribute(\"r\", \"2\");\n\n const path = createSvgElement(\"path\");\n path.setAttribute(\"d\", \"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21\");\n\n svg.append(rect, circle, path);\n return svg;\n};\n\n// lucide-react image icon\nconst buildVideoIcon = () => {\n const svg = createSvgElement(\"svg\");\n svg.setAttribute(\"viewBox\", \"0 0 24 24\");\n svg.setAttribute(\"width\", \"14\");\n svg.setAttribute(\"height\", \"14\");\n svg.setAttribute(\"fill\", \"none\");\n svg.setAttribute(\"stroke\", \"currentColor\");\n svg.setAttribute(\"stroke-width\", \"1.5\");\n svg.setAttribute(\"stroke-linecap\", \"round\");\n svg.setAttribute(\"stroke-linejoin\", \"round\");\n\n const rect = createSvgElement(\"rect\");\n rect.setAttribute(\"width\", \"18\");\n rect.setAttribute(\"height\", \"18\");\n rect.setAttribute(\"x\", \"3\");\n rect.setAttribute(\"y\", \"3\");\n rect.setAttribute(\"rx\", \"2\");\n\n const path = createSvgElement(\"path\");\n path.setAttribute(\"d\", \"m9 8 6 4-6 4Z\");\n\n svg.append(rect, path);\n return svg;\n};\n\nclass PlaceholderWidget extends WidgetType {\n constructor(\n private text: string,\n private dataset: {\n tag: \"image\" | \"video\" | \"variable\";\n title?: string;\n url?: string;\n scalePercent?: number;\n },\n private styleClass: string,\n private type: SelectedOption,\n private view: EditorView\n ) {\n super();\n }\n\n getPosition() {\n let from = -1;\n let to = -1;\n const decorations = this.view.state.facet(EditorView.decorations);\n for (const deco of decorations) {\n const decoSet = typeof deco === \"function\" ? deco(this.view) : deco;\n decoSet.between(\n 0,\n this.view.state.doc.length,\n (start: number, end: number, decoration: Decoration) => {\n if (decoration.spec.widget === this) {\n from = start;\n to = end;\n return false;\n }\n }\n );\n if (from !== -1) break;\n }\n if (from !== -1 && to !== -1) {\n return [from, to];\n }\n }\n\n toDOM() {\n const container = document.createElement(\"span\");\n container.className = this.styleClass;\n const span = document.createElement(\"span\");\n span.textContent = this.text;\n span.dataset[\"tag\"] = this.dataset.tag || \"\";\n span.dataset[\"url\"] = this.dataset.url || \"\";\n span.dataset[\"title\"] = this.dataset.title || \"\";\n // const icon = document.createElement(\"span\");\n // icon.className = \"tag-icon\";\n // icon.innerHTML = \"✕\";\n // icon.addEventListener(\"click\", (e) => {\n // e.stopPropagation();\n // const [from, to] = this.getPosition() ?? [-1, -1];\n // if (from !== -1 && to !== -1) {\n // this.view.dispatch({\n // changes: { from, to, insert: \"\" },\n // });\n // }\n // });\n span.addEventListener(\"click\", (e) => {\n const [from, to] = this.getPosition() ?? [-1, -1];\n const event = new CustomEvent(\"globalTagClick\", {\n detail: {\n view: this.view,\n type: this.type,\n dataset: this.dataset,\n content: span.textContent,\n from,\n to,\n target: e.currentTarget,\n },\n });\n window.dispatchEvent(event);\n });\n if (this.dataset.tag === \"image\" || this.dataset.tag === \"video\") {\n const iconWrapper = document.createElement(\"span\");\n iconWrapper.className = \"tag-placeholder-icon\";\n\n const icon =\n this.dataset.tag === \"image\" ? buildImageIcon() : buildVideoIcon();\n iconWrapper.appendChild(icon);\n container.appendChild(iconWrapper);\n }\n container.appendChild(span);\n // container.appendChild(icon);\n return container;\n }\n\n ignoreEvent() {\n return false;\n }\n}\n\nexport default PlaceholderWidget;\n"],"names":["SVG_NS","createSvgElement","tag","buildImageIcon","svg","rect","circle","path","buildVideoIcon","PlaceholderWidget","WidgetType","text","dataset","styleClass","type","view","from","to","decorations","EditorView","deco","start","end","decoration","container","span","e","event","iconWrapper","icon"],"mappings":"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"}
1
+ {"version":3,"file":"PlaceholderWidget.cjs.js","sources":["../../../../src/components/MarkdownFlowEditor/plugins/PlaceholderWidget.ts"],"sourcesContent":["import { EditorView, Decoration, WidgetType } from \"@codemirror/view\";\nimport { SelectedOption } from \"../types\";\n\nconst SVG_NS = \"http://www.w3.org/2000/svg\";\n\nconst createSvgElement = (tag: string) => document.createElementNS(SVG_NS, tag);\n// TODO: if use renderToStaticMarkup & createElement, it will cause react & react-dom version mismatch\n// so we use lucide-react to build the icon\n// lucide-react image icon\nconst buildImageIcon = () => {\n const svg = createSvgElement(\"svg\");\n svg.setAttribute(\"viewBox\", \"0 0 24 24\");\n svg.setAttribute(\"width\", \"14\");\n svg.setAttribute(\"height\", \"14\");\n svg.setAttribute(\"fill\", \"none\");\n svg.setAttribute(\"stroke\", \"currentColor\");\n svg.setAttribute(\"stroke-width\", \"1.5\");\n svg.setAttribute(\"stroke-linecap\", \"round\");\n svg.setAttribute(\"stroke-linejoin\", \"round\");\n\n const rect = createSvgElement(\"rect\");\n rect.setAttribute(\"width\", \"18\");\n rect.setAttribute(\"height\", \"18\");\n rect.setAttribute(\"x\", \"3\");\n rect.setAttribute(\"y\", \"3\");\n rect.setAttribute(\"rx\", \"2\");\n rect.setAttribute(\"ry\", \"2\");\n\n const circle = createSvgElement(\"circle\");\n circle.setAttribute(\"cx\", \"9\");\n circle.setAttribute(\"cy\", \"9\");\n circle.setAttribute(\"r\", \"2\");\n\n const path = createSvgElement(\"path\");\n path.setAttribute(\"d\", \"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21\");\n\n svg.append(rect, circle, path);\n return svg;\n};\n\n// lucide-react image icon\nconst buildVideoIcon = () => {\n const svg = createSvgElement(\"svg\");\n svg.setAttribute(\"viewBox\", \"0 0 24 24\");\n svg.setAttribute(\"width\", \"14\");\n svg.setAttribute(\"height\", \"14\");\n svg.setAttribute(\"fill\", \"none\");\n svg.setAttribute(\"stroke\", \"currentColor\");\n svg.setAttribute(\"stroke-width\", \"1.5\");\n svg.setAttribute(\"stroke-linecap\", \"round\");\n svg.setAttribute(\"stroke-linejoin\", \"round\");\n\n const rect = createSvgElement(\"rect\");\n rect.setAttribute(\"width\", \"18\");\n rect.setAttribute(\"height\", \"18\");\n rect.setAttribute(\"x\", \"3\");\n rect.setAttribute(\"y\", \"3\");\n rect.setAttribute(\"rx\", \"2\");\n\n const path = createSvgElement(\"path\");\n path.setAttribute(\"d\", \"m9 8 6 4-6 4Z\");\n\n svg.append(rect, path);\n return svg;\n};\n\nclass PlaceholderWidget extends WidgetType {\n constructor(\n private text: string,\n private dataset: {\n tag: \"image\" | \"video\" | \"variable\";\n title?: string;\n url?: string;\n scalePercent?: number;\n fixedOutput?: boolean;\n },\n private styleClass: string,\n private type: SelectedOption,\n private view: EditorView\n ) {\n super();\n }\n\n getPosition() {\n let from = -1;\n let to = -1;\n const decorations = this.view.state.facet(EditorView.decorations);\n for (const deco of decorations) {\n const decoSet = typeof deco === \"function\" ? deco(this.view) : deco;\n decoSet.between(\n 0,\n this.view.state.doc.length,\n (start: number, end: number, decoration: Decoration) => {\n if (decoration.spec.widget === this) {\n from = start;\n to = end;\n return false;\n }\n }\n );\n if (from !== -1) break;\n }\n if (from !== -1 && to !== -1) {\n return [from, to];\n }\n }\n\n toDOM() {\n const container = document.createElement(\"span\");\n container.className = this.styleClass;\n const content = document.createElement(\"span\");\n content.className = \"tag-placeholder-content\";\n const span = document.createElement(\"span\");\n span.className = \"tag-placeholder-label\";\n span.textContent = this.text;\n span.dataset[\"tag\"] = this.dataset.tag || \"\";\n span.dataset[\"url\"] = this.dataset.url || \"\";\n span.dataset[\"title\"] = this.dataset.title || \"\";\n // const icon = document.createElement(\"span\");\n // icon.className = \"tag-icon\";\n // icon.innerHTML = \"✕\";\n // icon.addEventListener(\"click\", (e) => {\n // e.stopPropagation();\n // const [from, to] = this.getPosition() ?? [-1, -1];\n // if (from !== -1 && to !== -1) {\n // this.view.dispatch({\n // changes: { from, to, insert: \"\" },\n // });\n // }\n // });\n content.addEventListener(\"click\", (e) => {\n const [from, to] = this.getPosition() ?? [-1, -1];\n const event = new CustomEvent(\"globalTagClick\", {\n detail: {\n view: this.view,\n type: this.type,\n dataset: this.dataset,\n content: span.textContent,\n from,\n to,\n target: e.currentTarget,\n },\n });\n window.dispatchEvent(event);\n });\n\n if (this.dataset.fixedOutput) {\n const prefix = document.createElement(\"span\");\n prefix.className = \"tag-fixed-output-marker\";\n prefix.textContent = \"===\";\n container.appendChild(prefix);\n }\n\n if (this.dataset.tag === \"image\" || this.dataset.tag === \"video\") {\n const iconWrapper = document.createElement(\"span\");\n iconWrapper.className = \"tag-placeholder-icon\";\n\n const icon =\n this.dataset.tag === \"image\" ? buildImageIcon() : buildVideoIcon();\n iconWrapper.appendChild(icon);\n content.appendChild(iconWrapper);\n }\n content.appendChild(span);\n container.appendChild(content);\n\n if (this.dataset.fixedOutput) {\n const suffix = document.createElement(\"span\");\n suffix.className = \"tag-fixed-output-marker\";\n suffix.textContent = \"===\";\n container.appendChild(suffix);\n }\n\n // container.appendChild(icon);\n return container;\n }\n\n ignoreEvent() {\n return false;\n }\n}\n\nexport default PlaceholderWidget;\n"],"names":["SVG_NS","createSvgElement","tag","buildImageIcon","svg","rect","circle","path","buildVideoIcon","PlaceholderWidget","WidgetType","text","dataset","styleClass","type","view","from","to","decorations","EditorView","deco","start","end","decoration","container","content","span","e","event","prefix","iconWrapper","icon","suffix"],"mappings":"oPAGMA,EAAS,6BAETC,EAAoBC,GAAgB,SAAS,gBAAgBF,EAAQE,CAAG,EAIxEC,EAAiB,IAAM,CAC3B,MAAMC,EAAMH,EAAiB,KAAK,EAClCG,EAAI,aAAa,UAAW,WAAW,EACvCA,EAAI,aAAa,QAAS,IAAI,EAC9BA,EAAI,aAAa,SAAU,IAAI,EAC/BA,EAAI,aAAa,OAAQ,MAAM,EAC/BA,EAAI,aAAa,SAAU,cAAc,EACzCA,EAAI,aAAa,eAAgB,KAAK,EACtCA,EAAI,aAAa,iBAAkB,OAAO,EAC1CA,EAAI,aAAa,kBAAmB,OAAO,EAE3C,MAAMC,EAAOJ,EAAiB,MAAM,EACpCI,EAAK,aAAa,QAAS,IAAI,EAC/BA,EAAK,aAAa,SAAU,IAAI,EAChCA,EAAK,aAAa,IAAK,GAAG,EAC1BA,EAAK,aAAa,IAAK,GAAG,EAC1BA,EAAK,aAAa,KAAM,GAAG,EAC3BA,EAAK,aAAa,KAAM,GAAG,EAE3B,MAAMC,EAASL,EAAiB,QAAQ,EACxCK,EAAO,aAAa,KAAM,GAAG,EAC7BA,EAAO,aAAa,KAAM,GAAG,EAC7BA,EAAO,aAAa,IAAK,GAAG,EAE5B,MAAMC,EAAON,EAAiB,MAAM,EACpC,OAAAM,EAAK,aAAa,IAAK,2CAA2C,EAElEH,EAAI,OAAOC,EAAMC,EAAQC,CAAI,EACtBH,CACT,EAGMI,EAAiB,IAAM,CAC3B,MAAMJ,EAAMH,EAAiB,KAAK,EAClCG,EAAI,aAAa,UAAW,WAAW,EACvCA,EAAI,aAAa,QAAS,IAAI,EAC9BA,EAAI,aAAa,SAAU,IAAI,EAC/BA,EAAI,aAAa,OAAQ,MAAM,EAC/BA,EAAI,aAAa,SAAU,cAAc,EACzCA,EAAI,aAAa,eAAgB,KAAK,EACtCA,EAAI,aAAa,iBAAkB,OAAO,EAC1CA,EAAI,aAAa,kBAAmB,OAAO,EAE3C,MAAMC,EAAOJ,EAAiB,MAAM,EACpCI,EAAK,aAAa,QAAS,IAAI,EAC/BA,EAAK,aAAa,SAAU,IAAI,EAChCA,EAAK,aAAa,IAAK,GAAG,EAC1BA,EAAK,aAAa,IAAK,GAAG,EAC1BA,EAAK,aAAa,KAAM,GAAG,EAE3B,MAAME,EAAON,EAAiB,MAAM,EACpC,OAAAM,EAAK,aAAa,IAAK,eAAe,EAEtCH,EAAI,OAAOC,EAAME,CAAI,EACdH,CACT,EAEA,MAAMK,UAA0BC,EAAAA,UAAW,CACzC,YACUC,EACAC,EAOAC,EACAC,EACAC,EACR,CACA,MAAA,EAZQ,KAAA,KAAAJ,EACA,KAAA,QAAAC,EAOA,KAAA,WAAAC,EACA,KAAA,KAAAC,EACA,KAAA,KAAAC,CAGV,CAEA,aAAc,CACZ,IAAIC,EAAO,GACPC,EAAK,GACT,MAAMC,EAAc,KAAK,KAAK,MAAM,MAAMC,EAAAA,WAAW,WAAW,EAChE,UAAWC,KAAQF,EAajB,IAZgB,OAAOE,GAAS,WAAaA,EAAK,KAAK,IAAI,EAAIA,GACvD,QACN,EACA,KAAK,KAAK,MAAM,IAAI,OACpB,CAACC,EAAeC,EAAaC,IAA2B,CACtD,GAAIA,EAAW,KAAK,SAAW,KAC7B,OAAAP,EAAOK,EACPJ,EAAKK,EACE,EAEX,CAAA,EAEEN,IAAS,GAAI,MAEnB,GAAIA,IAAS,IAAMC,IAAO,GACxB,MAAO,CAACD,EAAMC,CAAE,CAEpB,CAEA,OAAQ,CACN,MAAMO,EAAY,SAAS,cAAc,MAAM,EAC/CA,EAAU,UAAY,KAAK,WAC3B,MAAMC,EAAU,SAAS,cAAc,MAAM,EAC7CA,EAAQ,UAAY,0BACpB,MAAMC,EAAO,SAAS,cAAc,MAAM,EAkC1C,GAjCAA,EAAK,UAAY,wBACjBA,EAAK,YAAc,KAAK,KACxBA,EAAK,QAAQ,IAAS,KAAK,QAAQ,KAAO,GAC1CA,EAAK,QAAQ,IAAS,KAAK,QAAQ,KAAO,GAC1CA,EAAK,QAAQ,MAAW,KAAK,QAAQ,OAAS,GAa9CD,EAAQ,iBAAiB,QAAUE,GAAM,CACvC,KAAM,CAACX,EAAMC,CAAE,EAAI,KAAK,eAAiB,CAAC,GAAI,EAAE,EAC1CW,EAAQ,IAAI,YAAY,iBAAkB,CAC9C,OAAQ,CACN,KAAM,KAAK,KACX,KAAM,KAAK,KACX,QAAS,KAAK,QACd,QAASF,EAAK,YACd,KAAAV,EACA,GAAAC,EACA,OAAQU,EAAE,aAAA,CACZ,CACD,EACD,OAAO,cAAcC,CAAK,CAC5B,CAAC,EAEG,KAAK,QAAQ,YAAa,CAC5B,MAAMC,EAAS,SAAS,cAAc,MAAM,EAC5CA,EAAO,UAAY,0BACnBA,EAAO,YAAc,MACrBL,EAAU,YAAYK,CAAM,CAC9B,CAEA,GAAI,KAAK,QAAQ,MAAQ,SAAW,KAAK,QAAQ,MAAQ,QAAS,CAChE,MAAMC,EAAc,SAAS,cAAc,MAAM,EACjDA,EAAY,UAAY,uBAExB,MAAMC,EACJ,KAAK,QAAQ,MAAQ,QAAU5B,EAAA,EAAmBK,EAAA,EACpDsB,EAAY,YAAYC,CAAI,EAC5BN,EAAQ,YAAYK,CAAW,CACjC,CAIA,GAHAL,EAAQ,YAAYC,CAAI,EACxBF,EAAU,YAAYC,CAAO,EAEzB,KAAK,QAAQ,YAAa,CAC5B,MAAMO,EAAS,SAAS,cAAc,MAAM,EAC5CA,EAAO,UAAY,0BACnBA,EAAO,YAAc,MACrBR,EAAU,YAAYQ,CAAM,CAC9B,CAGA,OAAOR,CACT,CAEA,aAAc,CACZ,MAAO,EACT,CACF"}
@@ -11,6 +11,7 @@ declare class PlaceholderWidget extends WidgetType {
11
11
  title?: string;
12
12
  url?: string;
13
13
  scalePercent?: number;
14
+ fixedOutput?: boolean;
14
15
  }, styleClass: string, type: SelectedOption, view: EditorView);
15
16
  getPosition(): number[] | undefined;
16
17
  toDOM(): HTMLSpanElement;