markdown-flow-ui 0.3.1 → 0.3.2-dev.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -0
- package/dist/_virtual/index.es3.js +4 -5
- package/dist/_virtual/index.es3.js.map +1 -1
- package/dist/_virtual/index.es4.js +5 -4
- package/dist/_virtual/index.es4.js.map +1 -1
- package/dist/_virtual/index3.cjs +1 -1
- package/dist/_virtual/index4.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/MarkdownFlowEditor.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/MarkdownFlowEditor.cjs.map +1 -1
- package/dist/components/MarkdownFlowEditor/MarkdownFlowEditor.d.ts +2 -0
- package/dist/components/MarkdownFlowEditor/MarkdownFlowEditor.es.js +444 -415
- package/dist/components/MarkdownFlowEditor/MarkdownFlowEditor.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/components/EditorToolbar.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/components/EditorToolbar.cjs.map +1 -1
- package/dist/components/MarkdownFlowEditor/components/EditorToolbar.d.ts +1 -0
- package/dist/components/MarkdownFlowEditor/components/EditorToolbar.es.js +71 -68
- package/dist/components/MarkdownFlowEditor/components/EditorToolbar.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/editorI18n.d.ts +22 -0
- package/dist/components/MarkdownFlowEditor/locales/ar-SA.json.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/locales/ar-SA.json.d.ts +2 -1
- package/dist/components/MarkdownFlowEditor/locales/ar-SA.json.es.js +16 -14
- package/dist/components/MarkdownFlowEditor/locales/ar-SA.json.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/locales/de-DE.json.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/locales/de-DE.json.d.ts +2 -1
- package/dist/components/MarkdownFlowEditor/locales/de-DE.json.es.js +19 -17
- package/dist/components/MarkdownFlowEditor/locales/de-DE.json.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/locales/en-US.json.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/locales/en-US.json.d.ts +2 -1
- package/dist/components/MarkdownFlowEditor/locales/en-US.json.es.js +15 -13
- package/dist/components/MarkdownFlowEditor/locales/en-US.json.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/locales/es-ES.json.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/locales/es-ES.json.d.ts +2 -1
- package/dist/components/MarkdownFlowEditor/locales/es-ES.json.es.js +21 -19
- package/dist/components/MarkdownFlowEditor/locales/es-ES.json.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/locales/fil-PH.json.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/locales/fil-PH.json.d.ts +2 -1
- package/dist/components/MarkdownFlowEditor/locales/fil-PH.json.es.js +27 -25
- package/dist/components/MarkdownFlowEditor/locales/fil-PH.json.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/locales/fr-FR.json.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/locales/fr-FR.json.d.ts +2 -1
- package/dist/components/MarkdownFlowEditor/locales/fr-FR.json.es.js +21 -19
- package/dist/components/MarkdownFlowEditor/locales/fr-FR.json.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/locales/ja-JP.json.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/locales/ja-JP.json.d.ts +2 -1
- package/dist/components/MarkdownFlowEditor/locales/ja-JP.json.es.js +19 -17
- package/dist/components/MarkdownFlowEditor/locales/ja-JP.json.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/locales/th-TH.json.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/locales/th-TH.json.d.ts +2 -1
- package/dist/components/MarkdownFlowEditor/locales/th-TH.json.es.js +18 -16
- package/dist/components/MarkdownFlowEditor/locales/th-TH.json.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/locales/ur-PK.json.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/locales/ur-PK.json.d.ts +2 -1
- package/dist/components/MarkdownFlowEditor/locales/ur-PK.json.es.js +17 -15
- package/dist/components/MarkdownFlowEditor/locales/ur-PK.json.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/locales/vi-VN.json.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/locales/vi-VN.json.d.ts +2 -1
- package/dist/components/MarkdownFlowEditor/locales/vi-VN.json.es.js +25 -23
- package/dist/components/MarkdownFlowEditor/locales/vi-VN.json.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/locales/zh-CN.json.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/locales/zh-CN.json.d.ts +2 -1
- package/dist/components/MarkdownFlowEditor/locales/zh-CN.json.es.js +28 -26
- package/dist/components/MarkdownFlowEditor/locales/zh-CN.json.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/plugins/SyntaxHighlighter.cjs +3 -3
- package/dist/components/MarkdownFlowEditor/plugins/SyntaxHighlighter.cjs.map +1 -1
- package/dist/components/MarkdownFlowEditor/plugins/SyntaxHighlighter.d.ts +5 -1
- package/dist/components/MarkdownFlowEditor/plugins/SyntaxHighlighter.es.js +154 -149
- package/dist/components/MarkdownFlowEditor/plugins/SyntaxHighlighter.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/utils.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/utils.cjs.map +1 -1
- package/dist/components/MarkdownFlowEditor/utils.d.ts +2 -0
- package/dist/components/MarkdownFlowEditor/utils.es.js +54 -52
- package/dist/components/MarkdownFlowEditor/utils.es.js.map +1 -1
- package/dist/components/ui/inputGroup/textarea.cjs +1 -1
- package/dist/components/ui/inputGroup/textarea.es.js +1 -1
- package/dist/node_modules/rc-input/es/BaseInput.cjs +1 -1
- package/dist/node_modules/rc-input/es/BaseInput.es.js +1 -1
- package/dist/node_modules/rc-textarea/es/ResizableTextArea.cjs +1 -1
- package/dist/node_modules/rc-textarea/es/ResizableTextArea.es.js +1 -1
- package/dist/node_modules/rc-textarea/es/TextArea.cjs +1 -1
- package/dist/node_modules/rc-textarea/es/TextArea.es.js +1 -1
- package/dist/node_modules/rc-textarea/es/index.cjs +1 -1
- package/dist/node_modules/rc-textarea/es/index.es.js +1 -1
- package/dist/node_modules/remark-flow/dist/interaction-plugin-core.cjs +1 -1
- package/dist/node_modules/remark-flow/dist/interaction-plugin-core.es.js +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -202,3 +202,16 @@ MIT License - see [LICENSE](LICENSE) file for details.
|
|
|
202
202
|
- 📖 [Documentation](https://github.com/ai-shifu/markdown-flow-ui#readme)
|
|
203
203
|
- 🐛 [Issue Tracker](https://github.com/ai-shifu/markdown-flow-ui/issues)
|
|
204
204
|
- 💬 [Discussions](https://github.com/ai-shifu/markdown-flow-ui/discussions)
|
|
205
|
+
|
|
206
|
+
### Question and memory authoring
|
|
207
|
+
|
|
208
|
+
Use `<MarkdownFlowEditor questionMode />` to author question-based scripts.
|
|
209
|
+
In `?[%{{ What would you like to learn? }} Practice | Theory]`, the marker
|
|
210
|
+
contains the question and identifies the memory key for its answer. The editor
|
|
211
|
+
keeps standalone `{{...}}` as ordinary source text and removes variable insertion,
|
|
212
|
+
search, slash commands and quick-edit placeholders. Choice and input buttons
|
|
213
|
+
insert a localized question hint in the marker for the author to replace.
|
|
214
|
+
|
|
215
|
+
`questionMode` defaults to `false` so existing integrations retain their authoring
|
|
216
|
+
controls until they adopt the question and memory contract. The editor never
|
|
217
|
+
writes learner memory; the host runtime owns answer persistence.
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import
|
|
3
|
-
|
|
4
|
-
const t = /* @__PURE__ */ r(e);
|
|
1
|
+
import { getAugmentedNamespace as e } from "./_commonjsHelpers.es.js";
|
|
2
|
+
import * as r from "../node_modules/unist-util-visit/index.es.js";
|
|
3
|
+
const m = /* @__PURE__ */ e(r);
|
|
5
4
|
export {
|
|
6
|
-
|
|
5
|
+
m as default
|
|
7
6
|
};
|
|
8
7
|
//# sourceMappingURL=index.es3.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.es3.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.es3.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import
|
|
3
|
-
|
|
1
|
+
import { getDefaultExportFromCjs as r } from "./_commonjsHelpers.es.js";
|
|
2
|
+
import { __require as s } from "../node_modules/classnames/index.es.js";
|
|
3
|
+
var e = s();
|
|
4
|
+
const t = /* @__PURE__ */ r(e);
|
|
4
5
|
export {
|
|
5
|
-
|
|
6
|
+
t as default
|
|
6
7
|
};
|
|
7
8
|
//# sourceMappingURL=index.es4.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.es4.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.es4.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
|
package/dist/_virtual/index3.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("./_commonjsHelpers.cjs"),
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("./_commonjsHelpers.cjs"),t=require("../node_modules/unist-util-visit/index.cjs"),r=e.getAugmentedNamespace(t);exports.default=r;
|
|
2
2
|
//# sourceMappingURL=index3.cjs.map
|
package/dist/_virtual/index4.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("./_commonjsHelpers.cjs"),
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("./_commonjsHelpers.cjs"),r=require("../node_modules/classnames/index.cjs");var s=r.__require();const t=e.getDefaultExportFromCjs(s);exports.default=t;
|
|
2
2
|
//# sourceMappingURL=index4.cjs.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const i=require("react/jsx-runtime"),o=require("react"),Ke=require("../../node_modules/@uiw/react-codemirror/esm/index.cjs"),Qe=require("../../node_modules/@codemirror/autocomplete/dist/index.cjs"),ke=require("../../node_modules/@codemirror/view/dist/index.cjs"),Ye=require("../../node_modules/@codemirror/lang-markdown/dist/index.cjs"),Ie=require("../../node_modules/@codemirror/language/dist/index.cjs"),ee=require("../ui/tooltip.cjs"),Je=require("./components/CustomDialog.cjs"),Xe=require("./components/CustomPopover.cjs"),Ze=require("./components/EditorToolbar.cjs"),et=require("./components/VariableSearchDropdown.cjs"),tt=require("./editor-context.cjs"),nt=require("./components/ImageInject.cjs"),ot=require("./components/VideoInject.cjs"),rt=require("./components/VariableSelect.cjs"),m=require("./types.cjs");;/* empty css */const H=require("./utils.cjs"),st=require("./plugins/ImgPlaceholder.cjs"),at=require("./plugins/VideoPlaceholder.cjs"),lt=require("./plugins/mediaPlaceholderLabels.cjs"),it=require("./plugins/VariablePlaceholder.cjs"),ct=require("./plugins/SyntaxHighlighter.cjs"),te=require("../../node_modules/i18next/dist/esm/i18next.cjs"),T=require("./editorI18n.cjs"),ne=require("../../lib/locale.cjs"),ut=require("../../lib/useDetachedLanguage.cjs"),ft=require("../../lib/useResolvedDirection.cjs"),mt=require("../../node_modules/react-i18next/dist/es/initReactI18next.cjs"),dt=require("../../node_modules/react-i18next/dist/es/useTranslation.cjs"),q=require("../../_virtual/index.cjs");te.default.isInitialized?Object.entries(T.editorLocaleResources).forEach(([b,d])=>{te.default.addResourceBundle(b,"translation",d.translation,!0,!0)}):te.default.use(mt.initReactI18next).init({resources:T.editorLocaleResources,lng:T.DEFAULT_EDITOR_LOCALE,fallbackLng:T.DEFAULT_EDITOR_LOCALE,interpolation:{escapeValue:!1}});const xe=[],ve=(b,d)=>{if(!b||d<0)return!1;for(const x of q.distExports.findDocumentVariableMarkers(b))if(x.name!==null&&d>=x.start+2&&d<=x.end-2)return!0;return!1},ht=(b="")=>b?q.distExports.formatVariableReference(b):"{{ }}",pt=({content:b="",editMode:d="codeEdit",variables:x,systemVariables:oe,onChange:N,onBlur:Ee,locale:U,lang:Oe,uploadProps:we,disabled:r=!1,toolbarActionsRight:G,onReady:Le})=>{const{t:l,i18n:W}=dt.useTranslation(),A=ne.normalizeMarkdownFlowLocale(U??T.DEFAULT_EDITOR_LOCALE),re=ne.getMarkdownFlowDirection(U),se=Oe??ne.getMarkdownFlowLanguage(U);o.useEffect(()=>{W.language!==A&&W.changeLanguage(A)},[W,A]);const v=T.getEditorLocaleMessages(A),C=o.useMemo(()=>({image:l("toolbarInsertImage",{defaultValue:"Insert image"}),video:l("toolbarInsertVideo",{defaultValue:"Insert video"}),variable:l("slashVariable",{defaultValue:"Variable"}),addVariable:l("toolbarInsertNewVariable",{defaultValue:"Insert new variable"}),search:l("toolbarInsertExistingVariable",{defaultValue:"Insert existing variable"}),confirmOutput:l("toolbarConfirmOutput",{defaultValue:"Confirm output"}),insertLink:l("toolbarInsertLink",{defaultValue:"Insert link"}),insertButton:l("toolbarInsertButton",{defaultValue:"Insert button"}),insertSingleChoice:l("toolbarInsertSingleChoice",{defaultValue:"Insert single choice"}),insertMultiChoice:l("toolbarInsertMultiChoice",{defaultValue:"Insert multi choice"}),insertInput:l("toolbarInsertInput",{defaultValue:"Insert input"}),singleChoiceOption1:l("toolbarChoiceOption1",{defaultValue:"Option 1"}),singleChoiceOption2:l("toolbarChoiceOption2",{defaultValue:"Option 2"}),inputPlaceholder:l("toolbarInputPlaceholder",{defaultValue:"Please enter"})}),[l]),Te=o.useMemo(()=>({searchPlaceholder:l("variableSearchPlaceholder",{defaultValue:"Search variable"}),systemLabel:l("variableSectionSystem","System Variables"),customLabel:l("variableSectionCustom","Custom Variables"),emptyLabel:l("variableNotFound","No variables found")}),[l]),qe=d==="quickEdit"?l("placeholderQuickEdit",{defaultValue:l("placeholderCodeEdit",{defaultValue:l("placeholder")})}):l("placeholderCodeEdit",{defaultValue:l("placeholder")}),y=o.useMemo(()=>{const e=new Set;return(oe??xe).flatMap(n=>{const s=typeof n?.name=="string"?q.distExports.normalizeVariableName(n.name):null;return s===null||e.has(s)?[]:(e.add(s),[{...n,name:s}])})},[oe]),K=o.useMemo(()=>{const e=new Set(y.map(s=>s.name)),n=new Set;return(x??xe).flatMap(s=>{const t=typeof s?.name=="string"?q.distExports.normalizeVariableName(s.name):null;return t===null||e.has(t)||n.has(t)?[]:(n.add(t),[{...s,name:t}])})},[x,y]),[Q,k]=o.useState(!1),[Y,E]=o.useState(!1),M=o.useRef(null),P=ut.useDetachedLanguage(M,se),{resolvedDirection:j}=ft.useResolvedDirection(M,re),[ye,R]=o.useState(null),[ae,J]=o.useState(K),[F,Pe]=o.useState(y);o.useEffect(()=>{J(K)},[K]),o.useEffect(()=>{Pe(y)},[y]);const[S,I]=o.useState(m.SelectedOption.Empty),[c,D]=o.useState(),a=o.useRef(null),z=o.useRef(null),_=o.useRef(null),[X,le]=o.useState(!1),g=o.useCallback(()=>{le(!1),_.current=null},[]),je=o.useCallback(e=>{if(!r){if(X&&_.current===e){g();return}_.current=e,le(!0)}},[g,r,X]),Re={selectedOption:S,setSelectedOption:I,dialogOpen:Q,setDialogOpen:k,popoverOpen:Y,setPopoverOpen:E,popoverPosition:ye,setPopoverPosition:R};o.useEffect(()=>{r&&(k(!1),E(!1),I(m.SelectedOption.Empty),D(null),R(null),g())},[g,r,k,E,R,I,D]);const O=o.useCallback(e=>{if(d!=="quickEdit"||!e)return;const n=q.distExports.extractVariableNames(e);if(!n.length)return;const s=new Set(F.map(t=>t.name));J(t=>{const u=new Set(t.map(p=>p.name)),f=new Set,h=[];return n.forEach(p=>{const V=p;!p||s.has(V)||u.has(V)||f.has(V)||(h.push({name:p}),f.add(V))}),h.length?[...h,...t]:t})},[d,F]);o.useEffect(()=>{O(b)},[b,O]);const Z=o.useCallback(e=>{if(!r)if(g(),I(e),e===m.SelectedOption.Variable){if(a.current){const{state:n}=a.current,s=n.selection.main.from,t=a.current.coordsAtPos(s);t&&R({x:t.left,y:t.bottom})}E(!0)}else k(!0)},[g,r]),w=o.useCallback(e=>{if(r||!a.current)return;const{state:n,dispatch:s}=a.current,t=n.selection.main.from;s({changes:{from:t,insert:e},selection:{anchor:t+e.length}})},[a,r]),ie=o.useCallback(e=>{if(r||!a.current)return;const{state:n,dispatch:s}=a.current,t=n.selection.main;s({changes:{from:t.from,to:t.to,insert:e},selection:{anchor:t.from+e.length}})},[r]),ce=o.useCallback(()=>{a.current?.focus()},[]),ue=o.useCallback(()=>a.current?.state.doc.toString()??"",[]),fe=o.useCallback(e=>{if(r)return;if(!a.current){N?.(e);return}const n=a.current,{state:s,dispatch:t}=n;t({changes:{from:0,to:s.doc.length,insert:e},selection:{anchor:e.length}})},[r,N]),B=o.useCallback(()=>{if(r||!c||!a.current||c.from===-1)return;const{from:e,to:n}=c,{dispatch:s}=a.current;s({changes:{from:e,to:n,insert:""}})},[c,a,r]),$=o.useCallback((e,n,s=!1)=>{if(r||!a.current)return;const t=a.current,{state:u,dispatch:f}=t,h=n??u.selection.main,p=ht(e);if(!p)return;const V=q.distExports.normalizeVariableName(e)??"",We=s?p.length:3+V.length;f({changes:{from:h.from,to:h.to,insert:p},selection:{anchor:h.from+We}}),t.focus()},[r]),De=o.useCallback(()=>{r||(g(),$(""))},[g,r,$]),Ne=o.useCallback(()=>{if(r||!a.current)return;const e=a.current,{state:n,dispatch:s}=e,t=n.selection.main;s({changes:{from:t.from,to:t.to,insert:"======"},selection:{anchor:t.from+3}}),e.focus()},[r]),Ae=o.useCallback(()=>{if(r||!a.current)return;const e=a.current,{state:n,dispatch:s}=e,t=n.selection.main;s({changes:{from:t.from,to:t.to,insert:"[]()"},selection:{anchor:t.from+1}}),e.focus()},[r]),Me=o.useCallback(()=>{if(r||!a.current)return;const e=a.current,{state:n,dispatch:s}=e,t=n.selection.main;s({changes:{from:t.from,to:t.to,insert:"?[]"},selection:{anchor:t.from+2}}),e.focus()},[r]),Fe=o.useCallback(()=>{if(r||!a.current)return;const e=a.current,{state:n,dispatch:s}=e,t=n.selection.main,u=C.singleChoiceOption1,f=C.singleChoiceOption2,h=`?[%{{ }} ${u} | ${f}]`;s({changes:{from:t.from,to:t.to,insert:h},selection:{anchor:t.from+6}}),e.focus()},[r,C.singleChoiceOption1,C.singleChoiceOption2]),ze=o.useCallback(()=>{if(r||!a.current)return;const e=a.current,{state:n,dispatch:s}=e,t=n.selection.main,u=C.singleChoiceOption1,f=C.singleChoiceOption2,h=`?[%{{ }} ${u} || ${f}]`;s({changes:{from:t.from,to:t.to,insert:h},selection:{anchor:t.from+6}}),e.focus()},[r,C.singleChoiceOption1,C.singleChoiceOption2]),_e=o.useCallback(()=>{if(r||!a.current)return;const e=a.current,{state:n,dispatch:s}=e,t=n.selection.main,f=`?[%{{ }}...${C.inputPlaceholder??"请输入"}]`;s({changes:{from:t.from,to:t.to,insert:f},selection:{anchor:t.from+6}}),e.focus()},[r,C.inputPlaceholder]),Be=o.useCallback(({resourceUrl:e,resourceTitle:n,scalePercent:s})=>{if(!e||r)return;const t=H.getImageContentToInsert({resourceUrl:e,resourceTitle:n,scalePercent:s});if(c?.type===m.SelectedOption.Image){if(B(),!a.current)return;const{dispatch:u}=a.current;u({changes:{from:c.from,insert:t}})}else w(t);k(!1)},[B,r,w,c]),$e=o.useCallback(({resourceUrl:e,resourceTitle:n})=>{if(r)return;const s=H.getVideoContentToInsert(e,n);if(c?.type===m.SelectedOption.Video){if(B(),!a.current)return;const{dispatch:t}=a.current;t({changes:{from:c.from,insert:s}})}else w(s);k(!1)},[B,r,w,c]),me=o.useCallback(e=>{if(r)return;const n=c?.type===m.SelectedOption.Variable?{from:c.from,to:c.to}:void 0;$(e.name,n,!0),E(!1),g()},[r,$,c,g]),de=o.useCallback(()=>Qe.autocompletion({override:[H.createSlashCommands(Z,{image:v.slashImage,video:v.slashVideo,variable:v.slashVariable})]}),[v.slashImage,v.slashVideo,v.slashVariable,Z]),he=o.useCallback(e=>{if(a.current=e.view,d==="quickEdit"&&z.current&&e.selectionSet){const n=e.state.selection.main.head,s=e.state.doc.toString();ve(s,n)||(O(s),z.current=null)}},[O,d]),pe=o.useCallback(e=>{if(e.stopPropagation(),r)return;const{type:n,from:s,to:t,dataset:u,target:f}=e.detail,h=H.parseContentInfo(n,u);if(D({type:n,value:h,from:s,to:t}),I(n),n===m.SelectedOption.Variable){if(f){const p=f.getBoundingClientRect(),V=f.ownerDocument.defaultView?.getComputedStyle(M.current??f).direction;R({x:V==="rtl"?p.right:p.left,y:p.bottom})}E(!0)}else k(!0)},[r]);o.useEffect(()=>{Q||(I(m.SelectedOption.Empty),D(null))},[Q]),o.useEffect(()=>{!Y&&S===m.SelectedOption.Variable&&(I(m.SelectedOption.Empty),D(null))},[Y,S]),o.useEffect(()=>{const e=n=>{n.detail.view===a.current&&pe(n)};return window.addEventListener("globalTagClick",e),()=>{window.removeEventListener("globalTagClick",e)}},[pe]);const ge=l("imageDefaultTitle"),be=l("videoDefaultTitle"),Ce=o.useMemo(()=>lt.mediaPlaceholderLabels.of({image:ge,video:be}),[ge,be]),He=o.useMemo(()=>{const e=[ke.EditorView.lineWrapping,Ye.markdown(),Ie.syntaxHighlighting(Ie.defaultHighlightStyle),ct.default];return r||e.push(de()),d==="quickEdit"&&e.push(Ce,st.default,at.default,it.default),e.push(ke.EditorView.updateListener.of(n=>{he(n)})),e},[r,d,de,he,Ce]),Ue=o.useCallback(e=>{if(r)return;const n=a.current?.state.selection.main.head??-1;ve(e,n)?z.current=e:(z.current=null,O(e)),N?.(e)},[O,N,r]),Se=!r&&X,L=o.useMemo(()=>({insertTextAtCursor:w,replaceSelection:ie,focus:ce,getContent:ue,setContent:fe}),[ce,ue,w,ie,fe]),Ve=o.useCallback(e=>{r||"render"in e||e.onClick?.(L)},[r,L]),Ge=o.useMemo(()=>G?.length?i.jsx("div",{className:"markdown-flow-editor-toolbar-right",children:G.map(e=>{if("render"in e)return i.jsx("div",{className:"markdown-flow-editor-toolbar-right-item",children:e.render(L)},e.key);const n=e.label||e.tooltip||void 0,s=i.jsxs("button",{type:"button",disabled:r||e.disabled,onClick:()=>Ve(e),className:"markdown-flow-editor-toolbar-right-button","aria-label":n,title:e.label||e.tooltip,children:[e.icon?i.jsx("span",{className:"toolbar-right-icon",children:e.icon}):null,e.label?i.jsx("span",{className:"toolbar-right-label",children:e.label}):null]},e.key),t=e.tooltip?i.jsxs(ee.Tooltip,{children:[i.jsx(ee.TooltipTrigger,{asChild:!0,children:s}),i.jsx(ee.TooltipContent,{side:"top",dir:j,lang:P,children:e.tooltip})]}):s;return i.jsx("div",{className:"markdown-flow-editor-toolbar-right-item",children:t},e.key)})}):null,[r,L,Ve,j,P,G]);return o.useEffect(()=>{Le?.(L)},[L]),i.jsxs("div",{className:"markdown-flow-editor",ref:M,dir:re,lang:se,"data-disabled":r?"true":void 0,"aria-disabled":r,children:[i.jsx(Ze.default,{disabled:r,labels:C,tooltipDirection:j,tooltipLanguage:P,onSelect:Z,onInsertVariablePlaceholder:De,onVariableSearchToggle:je,onVariableSearchClose:g,onInsertConfirmOutput:Ne,onInsertLink:Ae,onInsertButton:Me,onInsertSingleChoice:Fe,onInsertMultiChoice:ze,onInsertInputField:_e,variableSearchActive:Se,rightSlot:Ge}),i.jsx(et.default,{open:Se,anchorElement:_.current,onClose:g,onSelect:me,variables:ae,systemVariables:F,labels:Te}),i.jsx("div",{className:"markdown-flow-editor-body relative overflow-auto",children:i.jsxs(tt.default.Provider,{value:Re,children:[i.jsx(Ke.default,{extensions:He,basicSetup:{lineNumbers:!1,searchKeymap:!1,syntaxHighlighting:!0,highlightActiveLine:!0,highlightActiveLineGutter:!0,foldGutter:!1},className:"rounded-md",placeholder:qe,value:b,theme:"light",minHeight:"2rem",editable:!r,onChange:Ue,onBlur:Ee}),!r&&i.jsxs(Je.default,{dir:j,lang:P,labels:{closeButtonLabel:l("dialogCloseLabel"),title:S===m.SelectedOption.Image?l("dialogTitleImage"):S===m.SelectedOption.Video?l("dialogTitleVideo"):S===m.SelectedOption.Variable?l("dialogTitleVariable"):l("dialogTitle")},children:[S===m.SelectedOption.Image&&i.jsx(nt.default,{value:c?.value,onSelect:Be,uploadProps:we}),S===m.SelectedOption.Video&&i.jsx(ot.default,{value:c?.value,onSelect:$e})]}),!r&&i.jsx(Xe.default,{dir:j,lang:P,children:i.jsx(rt.default,{variables:ae,systemVariables:F,selectedName:c?.value?.variableName,onSelect:me,onAddVariable:e=>{J(n=>{const s=e.name;return n.some(u=>u.name===s)?n:[e,...n]})}})})]})})]})};exports.default=pt;
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const c=require("react/jsx-runtime"),r=require("react"),Je=require("../../node_modules/@uiw/react-codemirror/esm/index.cjs"),Xe=require("../../node_modules/@codemirror/autocomplete/dist/index.cjs"),Ie=require("../../node_modules/@codemirror/view/dist/index.cjs"),Ze=require("../../node_modules/@codemirror/lang-markdown/dist/index.cjs"),xe=require("../../node_modules/@codemirror/language/dist/index.cjs"),ee=require("../ui/tooltip.cjs"),Me=require("./components/CustomDialog.cjs"),et=require("./components/CustomPopover.cjs"),tt=require("./components/EditorToolbar.cjs"),nt=require("./components/VariableSearchDropdown.cjs"),rt=require("./editor-context.cjs"),ot=require("./components/ImageInject.cjs"),lt=require("./components/VideoInject.cjs"),at=require("./components/VariableSelect.cjs"),h=require("./types.cjs");;/* empty css */const U=require("./utils.cjs"),st=require("./plugins/ImgPlaceholder.cjs"),it=require("./plugins/VideoPlaceholder.cjs"),ct=require("./plugins/mediaPlaceholderLabels.cjs"),ut=require("./plugins/VariablePlaceholder.cjs"),Ee=require("./plugins/SyntaxHighlighter.cjs"),te=require("../../node_modules/i18next/dist/esm/i18next.cjs"),T=require("./editorI18n.cjs"),ne=require("../../lib/locale.cjs"),ft=require("../../lib/useDetachedLanguage.cjs"),ht=require("../../lib/useResolvedDirection.cjs"),mt=require("../../node_modules/react-i18next/dist/es/initReactI18next.cjs"),dt=require("../../node_modules/react-i18next/dist/es/useTranslation.cjs"),y=require("../../_virtual/index.cjs");te.default.isInitialized?Object.entries(T.editorLocaleResources).forEach(([S,g])=>{te.default.addResourceBundle(S,"translation",g.translation,!0,!0)}):te.default.use(mt.initReactI18next).init({resources:T.editorLocaleResources,lng:T.DEFAULT_EDITOR_LOCALE,fallbackLng:T.DEFAULT_EDITOR_LOCALE,interpolation:{escapeValue:!1}});const ve=[],Oe=(S,g)=>{if(!S||g<0)return!1;for(const s of y.distExports.findDocumentVariableMarkers(S))if(s.name!==null&&g>=s.start+2&&g<=s.end-2)return!0;return!1},pt=(S="")=>S?y.distExports.formatVariableReference(S):"{{ }}",gt=({content:S="",editMode:g="codeEdit",questionMode:s=!1,variables:re,systemVariables:oe,onChange:P,onBlur:we,locale:G,lang:Le,uploadProps:Te,disabled:o=!1,toolbarActionsRight:Q,onReady:ye})=>{const{t:i,i18n:W}=dt.useTranslation(),q=ne.normalizeMarkdownFlowLocale(G??T.DEFAULT_EDITOR_LOCALE),le=ne.getMarkdownFlowDirection(G),ae=Le??ne.getMarkdownFlowLanguage(G);r.useEffect(()=>{W.language!==q&&W.changeLanguage(q)},[W,q]);const m=T.getEditorLocaleMessages(q),V=r.useMemo(()=>({image:i("toolbarInsertImage",{defaultValue:"Insert image"}),video:i("toolbarInsertVideo",{defaultValue:"Insert video"}),variable:i("slashVariable",{defaultValue:"Variable"}),addVariable:i("toolbarInsertNewVariable",{defaultValue:"Insert new variable"}),search:i("toolbarInsertExistingVariable",{defaultValue:"Insert existing variable"}),confirmOutput:i("toolbarConfirmOutput",{defaultValue:"Confirm output"}),insertLink:i("toolbarInsertLink",{defaultValue:"Insert link"}),insertButton:i("toolbarInsertButton",{defaultValue:"Insert button"}),insertSingleChoice:i("toolbarInsertSingleChoice",{defaultValue:"Insert single choice"}),insertMultiChoice:i("toolbarInsertMultiChoice",{defaultValue:"Insert multi choice"}),insertInput:i("toolbarInsertInput",{defaultValue:"Insert input"}),singleChoiceOption1:i("toolbarChoiceOption1",{defaultValue:"Option 1"}),singleChoiceOption2:i("toolbarChoiceOption2",{defaultValue:"Option 2"}),inputPlaceholder:i("toolbarInputPlaceholder",{defaultValue:"Please enter"})}),[i]),Pe=r.useMemo(()=>({searchPlaceholder:i("variableSearchPlaceholder",{defaultValue:"Search variable"}),systemLabel:i("variableSectionSystem","System Variables"),customLabel:i("variableSectionCustom","Custom Variables"),emptyLabel:i("variableNotFound","No variables found")}),[i]),je=g==="quickEdit"?i("placeholderQuickEdit",{defaultValue:i("placeholderCodeEdit",{defaultValue:i("placeholder")})}):i("placeholderCodeEdit",{defaultValue:i("placeholder")}),j=r.useMemo(()=>{const e=new Set;return(oe??ve).flatMap(n=>{const l=typeof n?.name=="string"?y.distExports.normalizeVariableName(n.name):null;return l===null||e.has(l)?[]:(e.add(l),[{...n,name:l}])})},[oe]),K=r.useMemo(()=>{const e=new Set(j.map(l=>l.name)),n=new Set;return(re??ve).flatMap(l=>{const t=typeof l?.name=="string"?y.distExports.normalizeVariableName(l.name):null;return t===null||e.has(t)||n.has(t)?[]:(n.add(t),[{...l,name:t}])})},[re,j]),[Y,x]=r.useState(!1),[J,v]=r.useState(!1),$=r.useRef(null),R=ft.useDetachedLanguage($,ae),{resolvedDirection:D}=ht.useResolvedDirection($,le),[Re,N]=r.useState(null),[se,X]=r.useState(K),[F,De]=r.useState(j);r.useEffect(()=>{X(K)},[K]),r.useEffect(()=>{De(j)},[j]);const[k,E]=r.useState(h.SelectedOption.Empty),[f,A]=r.useState(),a=r.useRef(null),z=r.useRef(null),_=r.useRef(null),[Z,ie]=r.useState(!1),p=r.useCallback(()=>{ie(!1),_.current=null},[]);r.useEffect(()=>{s&&p()},[p,s]);const Ne=r.useCallback(e=>{if(!o){if(Z&&_.current===e){p();return}_.current=e,ie(!0)}},[p,o,Z]),Ae={selectedOption:k,setSelectedOption:E,dialogOpen:Y,setDialogOpen:x,popoverOpen:J,setPopoverOpen:v,popoverPosition:Re,setPopoverPosition:N};r.useEffect(()=>{o&&(x(!1),v(!1),E(h.SelectedOption.Empty),A(null),N(null),p())},[p,o,x,v,N,E,A]);const O=r.useCallback(e=>{if(s||g!=="quickEdit"||!e)return;const n=y.distExports.extractVariableNames(e);if(!n.length)return;const l=new Set(F.map(t=>t.name));X(t=>{const u=new Set(t.map(C=>C.name)),d=new Set,b=[];return n.forEach(C=>{const I=C;!C||l.has(I)||u.has(I)||d.has(I)||(b.push({name:C}),d.add(I))}),b.length?[...b,...t]:t})},[g,s,F]);r.useEffect(()=>{O(S)},[S,O]);const M=r.useCallback(e=>{if(!(o||s&&e===h.SelectedOption.Variable))if(p(),E(e),e===h.SelectedOption.Variable){if(a.current){const{state:n}=a.current,l=n.selection.main.from,t=a.current.coordsAtPos(l);t&&N({x:t.left,y:t.bottom})}v(!0)}else x(!0)},[p,o,s]),w=r.useCallback(e=>{if(o||!a.current)return;const{state:n,dispatch:l}=a.current,t=n.selection.main.from;l({changes:{from:t,insert:e},selection:{anchor:t+e.length}})},[a,o]),ce=r.useCallback(e=>{if(o||!a.current)return;const{state:n,dispatch:l}=a.current,t=n.selection.main;l({changes:{from:t.from,to:t.to,insert:e},selection:{anchor:t.from+e.length}})},[o]),ue=r.useCallback(()=>{a.current?.focus()},[]),fe=r.useCallback(()=>a.current?.state.doc.toString()??"",[]),he=r.useCallback(e=>{if(o)return;if(!a.current){P?.(e);return}const n=a.current,{state:l,dispatch:t}=n;t({changes:{from:0,to:l.doc.length,insert:e},selection:{anchor:e.length}})},[o,P]),B=r.useCallback(()=>{if(o||!f||!a.current||f.from===-1)return;const{from:e,to:n}=f,{dispatch:l}=a.current;l({changes:{from:e,to:n,insert:""}})},[f,a,o]),H=r.useCallback((e,n,l=!1)=>{if(o||!a.current)return;const t=a.current,{state:u,dispatch:d}=t,b=n??u.selection.main,C=pt(e);if(!C)return;const I=y.distExports.normalizeVariableName(e)??"",Ye=l?C.length:3+I.length;d({changes:{from:b.from,to:b.to,insert:C},selection:{anchor:b.from+Ye}}),t.focus()},[o]),qe=r.useCallback(()=>{o||(p(),H(""))},[p,o,H]),$e=r.useCallback(()=>{if(o||!a.current)return;const e=a.current,{state:n,dispatch:l}=e,t=n.selection.main;l({changes:{from:t.from,to:t.to,insert:"======"},selection:{anchor:t.from+3}}),e.focus()},[o]),Fe=r.useCallback(()=>{if(o||!a.current)return;const e=a.current,{state:n,dispatch:l}=e,t=n.selection.main;l({changes:{from:t.from,to:t.to,insert:"[]()"},selection:{anchor:t.from+1}}),e.focus()},[o]),ze=r.useCallback(()=>{if(o||!a.current)return;const e=a.current,{state:n,dispatch:l}=e,t=n.selection.main;l({changes:{from:t.from,to:t.to,insert:"?[]"},selection:{anchor:t.from+2}}),e.focus()},[o]),_e=r.useCallback(()=>{if(o||!a.current)return;const e=a.current,{state:n,dispatch:l}=e,t=n.selection.main,u=V.singleChoiceOption1,d=V.singleChoiceOption2,b=`?[%{{ ${s?m.questionPlaceholder:""} }} ${u} | ${d}]`;l({changes:{from:t.from,to:t.to,insert:b},selection:{anchor:t.from+6,head:t.from+6+(s?m.questionPlaceholder.length:0)}}),e.focus()},[o,V.singleChoiceOption1,V.singleChoiceOption2,s,m.questionPlaceholder]),Be=r.useCallback(()=>{if(o||!a.current)return;const e=a.current,{state:n,dispatch:l}=e,t=n.selection.main,u=V.singleChoiceOption1,d=V.singleChoiceOption2,b=`?[%{{ ${s?m.questionPlaceholder:""} }} ${u} || ${d}]`;l({changes:{from:t.from,to:t.to,insert:b},selection:{anchor:t.from+6,head:t.from+6+(s?m.questionPlaceholder.length:0)}}),e.focus()},[o,V.singleChoiceOption1,V.singleChoiceOption2,s,m.questionPlaceholder]),He=r.useCallback(()=>{if(o||!a.current)return;const e=a.current,{state:n,dispatch:l}=e,t=n.selection.main,u=V.inputPlaceholder??"请输入",d=`?[%{{ ${s?m.questionPlaceholder:""} }}...${u}]`;l({changes:{from:t.from,to:t.to,insert:d},selection:{anchor:t.from+6,head:t.from+6+(s?m.questionPlaceholder.length:0)}}),e.focus()},[o,V.inputPlaceholder,s,m.questionPlaceholder]),Ue=r.useCallback(({resourceUrl:e,resourceTitle:n,scalePercent:l})=>{if(!e||o)return;const t=U.getImageContentToInsert({resourceUrl:e,resourceTitle:n,scalePercent:l});if(f?.type===h.SelectedOption.Image){if(B(),!a.current)return;const{dispatch:u}=a.current;u({changes:{from:f.from,insert:t}})}else w(t);x(!1)},[B,o,w,f]),Ge=r.useCallback(({resourceUrl:e,resourceTitle:n})=>{if(o)return;const l=U.getVideoContentToInsert(e,n);if(f?.type===h.SelectedOption.Video){if(B(),!a.current)return;const{dispatch:t}=a.current;t({changes:{from:f.from,insert:l}})}else w(l);x(!1)},[B,o,w,f]),me=r.useCallback(e=>{if(o)return;const n=f?.type===h.SelectedOption.Variable?{from:f.from,to:f.to}:void 0;H(e.name,n,!0),v(!1),p()},[o,H,f,p]),de=r.useCallback(()=>Xe.autocompletion({override:[U.createSlashCommands(M,{image:m.slashImage,video:m.slashVideo,variable:m.slashVariable},{enableVariables:!s})]}),[m.slashImage,m.slashVideo,m.slashVariable,M,s]),pe=r.useCallback(e=>{if(a.current=e.view,!s&&g==="quickEdit"&&z.current&&e.selectionSet){const n=e.state.selection.main.head,l=e.state.doc.toString();Oe(l,n)||(O(l),z.current=null)}},[O,g,s]),ge=r.useCallback(e=>{if(e.stopPropagation(),o)return;const{type:n,from:l,to:t,dataset:u,target:d}=e.detail;if(s&&n===h.SelectedOption.Variable)return;const b=U.parseContentInfo(n,u);if(A({type:n,value:b,from:l,to:t}),E(n),n===h.SelectedOption.Variable){if(d){const C=d.getBoundingClientRect(),I=d.ownerDocument.defaultView?.getComputedStyle($.current??d).direction;N({x:I==="rtl"?C.right:C.left,y:C.bottom})}v(!0)}else x(!0)},[o,s]);r.useEffect(()=>{Y||(E(h.SelectedOption.Empty),A(null))},[Y]),r.useEffect(()=>{!J&&k===h.SelectedOption.Variable&&(E(h.SelectedOption.Empty),A(null))},[J,k]),r.useEffect(()=>{const e=n=>{n.detail.view===a.current&&ge(n)};return window.addEventListener("globalTagClick",e),()=>{window.removeEventListener("globalTagClick",e)}},[ge]);const be=i("imageDefaultTitle"),Ce=i("videoDefaultTitle"),Se=r.useMemo(()=>ct.mediaPlaceholderLabels.of({image:be,video:Ce}),[be,Ce]),Qe=r.useMemo(()=>{const e=[Ie.EditorView.lineWrapping,Ze.markdown(),xe.syntaxHighlighting(xe.defaultHighlightStyle),s?Ee.QuestionSyntaxHighlighter:Ee.default];return o||e.push(de()),g==="quickEdit"&&(e.push(Se,st.default,it.default),s||e.push(ut.default)),e.push(Ie.EditorView.updateListener.of(n=>{pe(n)})),e},[o,g,de,pe,Se,s]),We=r.useCallback(e=>{if(o)return;if(s){P?.(e);return}const n=a.current?.state.selection.main.head??-1;Oe(e,n)?z.current=e:(z.current=null,O(e)),P?.(e)},[O,P,o,s]),Ve=!s&&!o&&Z,L=r.useMemo(()=>({insertTextAtCursor:w,replaceSelection:ce,focus:ue,getContent:fe,setContent:he}),[ue,fe,w,ce,he]),ke=r.useCallback(e=>{o||"render"in e||e.onClick?.(L)},[o,L]),Ke=r.useMemo(()=>Q?.length?c.jsx("div",{className:"markdown-flow-editor-toolbar-right",children:Q.map(e=>{if("render"in e)return c.jsx("div",{className:"markdown-flow-editor-toolbar-right-item",children:e.render(L)},e.key);const n=e.label||e.tooltip||void 0,l=c.jsxs("button",{type:"button",disabled:o||e.disabled,onClick:()=>ke(e),className:"markdown-flow-editor-toolbar-right-button","aria-label":n,title:e.label||e.tooltip,children:[e.icon?c.jsx("span",{className:"toolbar-right-icon",children:e.icon}):null,e.label?c.jsx("span",{className:"toolbar-right-label",children:e.label}):null]},e.key),t=e.tooltip?c.jsxs(ee.Tooltip,{children:[c.jsx(ee.TooltipTrigger,{asChild:!0,children:l}),c.jsx(ee.TooltipContent,{side:"top",dir:D,lang:R,children:e.tooltip})]}):l;return c.jsx("div",{className:"markdown-flow-editor-toolbar-right-item",children:t},e.key)})}):null,[o,L,ke,D,R,Q]);return r.useEffect(()=>{ye?.(L)},[L]),c.jsxs("div",{className:"markdown-flow-editor",ref:$,dir:le,lang:ae,"data-disabled":o?"true":void 0,"aria-disabled":o,children:[c.jsx(tt.default,{disabled:o,enableVariables:!s,labels:V,tooltipDirection:D,tooltipLanguage:R,onSelect:M,onInsertVariablePlaceholder:qe,onVariableSearchToggle:Ne,onVariableSearchClose:p,onInsertConfirmOutput:$e,onInsertLink:Fe,onInsertButton:ze,onInsertSingleChoice:_e,onInsertMultiChoice:Be,onInsertInputField:He,variableSearchActive:Ve,rightSlot:Ke}),!s&&c.jsx(nt.default,{open:Ve,anchorElement:_.current,onClose:p,onSelect:me,variables:se,systemVariables:F,labels:Pe}),c.jsx("div",{className:"markdown-flow-editor-body relative overflow-auto",children:c.jsxs(rt.default.Provider,{value:Ae,children:[c.jsx(Je.default,{extensions:Qe,basicSetup:{lineNumbers:!1,searchKeymap:!1,syntaxHighlighting:!0,highlightActiveLine:!0,highlightActiveLineGutter:!0,foldGutter:!1},className:"rounded-md",placeholder:je,value:S,theme:"light",minHeight:"2rem",editable:!o,onChange:We,onBlur:we}),!o&&c.jsxs(Me.default,{dir:D,lang:R,labels:{closeButtonLabel:i("dialogCloseLabel"),title:k===h.SelectedOption.Image?i("dialogTitleImage"):k===h.SelectedOption.Video?i("dialogTitleVideo"):k===h.SelectedOption.Variable?i("dialogTitleVariable"):i("dialogTitle")},children:[k===h.SelectedOption.Image&&c.jsx(ot.default,{value:f?.value,onSelect:Ue,uploadProps:Te}),k===h.SelectedOption.Video&&c.jsx(lt.default,{value:f?.value,onSelect:Ge})]}),!o&&!s&&c.jsx(et.default,{dir:D,lang:R,children:c.jsx(at.default,{variables:se,systemVariables:F,selectedName:f?.value?.variableName,onSelect:me,onAddVariable:e=>{X(n=>{const l=e.name;return n.some(u=>u.name===l)?n:[e,...n]})}})})]})})]})};exports.default=gt;
|
|
2
2
|
//# sourceMappingURL=MarkdownFlowEditor.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MarkdownFlowEditor.cjs","sources":["../../../src/components/MarkdownFlowEditor/MarkdownFlowEditor.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState, useCallback, useRef, useEffect, useMemo } from \"react\";\nimport CodeMirror from \"@uiw/react-codemirror\";\nimport { autocompletion } from \"@codemirror/autocomplete\";\nimport { EditorView, ViewUpdate } from \"@codemirror/view\";\nimport { markdown } from \"@codemirror/lang-markdown\";\nimport {\n syntaxHighlighting,\n defaultHighlightStyle,\n} from \"@codemirror/language\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"../ui/tooltip\";\nimport CustomDialog from \"./components/CustomDialog\";\nimport CustomPopover from \"./components/CustomPopover\";\nimport EditorToolbar from \"./components/EditorToolbar\";\nimport VariableSearchDropdown from \"./components/VariableSearchDropdown\";\nimport EditorContext from \"./editor-context\";\nimport ImageInject from \"./components/ImageInject\";\nimport VideoInject from \"./components/VideoInject\";\nimport VariableSelect from \"./components/VariableSelect\";\nimport {\n SelectedOption,\n IEditorContext,\n Variable,\n SelectContentInfo,\n PopoverPosition,\n EditorAction,\n EditorApi,\n} from \"./types\";\nimport \"./markdownFlowEditor.css\";\n\nimport {\n createSlashCommands,\n parseContentInfo,\n getImageContentToInsert,\n getVideoContentToInsert,\n extractVariableNames,\n findDocumentVariableMarkers,\n formatVariableReference,\n normalizeVariableName,\n} from \"./utils\";\nimport ImgPlaceholder from \"./plugins/ImgPlaceholder\";\nimport VideoPlaceholder from \"./plugins/VideoPlaceholder\";\nimport { mediaPlaceholderLabels } from \"./plugins/mediaPlaceholderLabels\";\nimport VariablePlaceholder from \"./plugins/VariablePlaceholder\";\nimport SyntaxHighlighter from \"./plugins/SyntaxHighlighter\";\n// import createFixedTextPlaceholder from \"./plugins/FixedTextPlaceholder\";\n// import DividerPlaceholder from \"./plugins/DividerPlaceholder\";\nimport { initReactI18next, useTranslation } from \"react-i18next\";\nimport i18next from \"i18next\";\nimport { UploadProps } from \"./uploadTypes\";\nimport {\n DEFAULT_EDITOR_LOCALE,\n editorLocaleResources,\n getEditorLocaleMessages,\n} from \"./editorI18n\";\nimport {\n getMarkdownFlowDirection,\n getMarkdownFlowLanguage,\n normalizeMarkdownFlowLocale,\n type MarkdownFlowLocale,\n} from \"../../lib/locale\";\nimport { useDetachedLanguage } from \"../../lib/useDetachedLanguage\";\nimport { useResolvedDirection } from \"../../lib/useResolvedDirection\";\n\nif (!i18next.isInitialized) {\n i18next.use(initReactI18next).init({\n resources: editorLocaleResources,\n lng: DEFAULT_EDITOR_LOCALE,\n fallbackLng: DEFAULT_EDITOR_LOCALE,\n interpolation: { escapeValue: false },\n });\n} else {\n Object.entries(editorLocaleResources).forEach(([lng, resource]) => {\n i18next.addResourceBundle(\n lng,\n \"translation\",\n resource.translation,\n true,\n true\n );\n });\n}\n\nexport enum EditMode {\n CodeEdit = \"codeEdit\",\n QuickEdit = \"quickEdit\",\n}\n\ntype EditorProps = {\n content?: string;\n editMode?: EditMode;\n variables?: Variable[];\n systemVariables?: Variable[];\n onChange?: (value: string) => void;\n onBlur?: () => void;\n locale?: MarkdownFlowLocale;\n /** Overrides the locale-derived language. */\n lang?: string;\n uploadProps?: UploadProps;\n disabled?: boolean;\n toolbarActionsRight?: EditorAction[];\n onReady?: (api: EditorApi) => void;\n};\n\nconst EMPTY_VARIABLES: Variable[] = [];\n\n// Detect whether cursor is still inside a {{variable}} expression\nconst isCursorInsideVariableExpression = (\n content: string,\n cursorPosition: number\n) => {\n if (!content || cursorPosition < 0) {\n return false;\n }\n for (const marker of findDocumentVariableMarkers(content)) {\n if (\n marker.name !== null &&\n cursorPosition >= marker.start + 2 &&\n cursorPosition <= marker.end - 2\n ) {\n return true;\n }\n }\n\n return false;\n};\n\nconst buildVariableTemplate = (variableName = \"\") =>\n variableName ? formatVariableReference(variableName) : \"{{ }}\";\n\nconst Editor: React.FC<EditorProps> = ({\n content = \"\",\n editMode = EditMode.CodeEdit,\n variables: initialVariables,\n systemVariables: initialSystemVariables,\n onChange,\n onBlur,\n locale,\n lang,\n uploadProps,\n disabled = false,\n toolbarActionsRight,\n onReady,\n}) => {\n const { t, i18n } = useTranslation();\n const resolvedLocale = normalizeMarkdownFlowLocale(\n locale ?? DEFAULT_EDITOR_LOCALE\n );\n const direction = getMarkdownFlowDirection(locale);\n const language = lang ?? getMarkdownFlowLanguage(locale);\n\n useEffect(() => {\n if (i18n.language !== resolvedLocale) {\n i18n.changeLanguage(resolvedLocale);\n }\n }, [i18n, resolvedLocale]);\n\n const currentStrings = getEditorLocaleMessages(resolvedLocale);\n const toolbarLabels = useMemo(\n () => ({\n image: t(\"toolbarInsertImage\", {\n defaultValue: \"Insert image\",\n }),\n video: t(\"toolbarInsertVideo\", {\n defaultValue: \"Insert video\",\n }),\n variable: t(\"slashVariable\", {\n defaultValue: \"Variable\",\n }),\n addVariable: t(\"toolbarInsertNewVariable\", {\n defaultValue: \"Insert new variable\",\n }),\n search: t(\"toolbarInsertExistingVariable\", {\n defaultValue: \"Insert existing variable\",\n }),\n confirmOutput: t(\"toolbarConfirmOutput\", {\n defaultValue: \"Confirm output\",\n }),\n insertLink: t(\"toolbarInsertLink\", {\n defaultValue: \"Insert link\",\n }),\n insertButton: t(\"toolbarInsertButton\", {\n defaultValue: \"Insert button\",\n }),\n insertSingleChoice: t(\"toolbarInsertSingleChoice\", {\n defaultValue: \"Insert single choice\",\n }),\n insertMultiChoice: t(\"toolbarInsertMultiChoice\", {\n defaultValue: \"Insert multi choice\",\n }),\n insertInput: t(\"toolbarInsertInput\", {\n defaultValue: \"Insert input\",\n }),\n singleChoiceOption1: t(\"toolbarChoiceOption1\", {\n defaultValue: \"Option 1\",\n }),\n singleChoiceOption2: t(\"toolbarChoiceOption2\", {\n defaultValue: \"Option 2\",\n }),\n inputPlaceholder: t(\"toolbarInputPlaceholder\", {\n defaultValue: \"Please enter\",\n }),\n }),\n [t]\n );\n const variableSearchLabels = useMemo(\n () => ({\n searchPlaceholder: t(\"variableSearchPlaceholder\", {\n defaultValue: \"Search variable\",\n }),\n systemLabel: t(\"variableSectionSystem\", \"System Variables\"),\n customLabel: t(\"variableSectionCustom\", \"Custom Variables\"),\n emptyLabel: t(\"variableNotFound\", \"No variables found\"),\n }),\n [t]\n );\n const placeholderText =\n editMode === EditMode.QuickEdit\n ? t(\"placeholderQuickEdit\", {\n defaultValue: t(\"placeholderCodeEdit\", {\n defaultValue: t(\"placeholder\"),\n }),\n })\n : t(\"placeholderCodeEdit\", { defaultValue: t(\"placeholder\") });\n // Only boundary whitespace is normalized; key identity remains case-sensitive.\n const normalizedSystemVariables = useMemo(() => {\n const seen = new Set<string>();\n return (initialSystemVariables ?? EMPTY_VARIABLES).flatMap((variable) => {\n const name =\n typeof variable?.name === \"string\"\n ? normalizeVariableName(variable.name)\n : null;\n if (name === null || seen.has(name)) return [];\n seen.add(name);\n return [{ ...variable, name }];\n });\n }, [initialSystemVariables]);\n\n const normalizedCustomVariables = useMemo(() => {\n const systemNameSet = new Set(\n normalizedSystemVariables.map((variable) => variable.name)\n );\n const seen = new Set<string>();\n return (initialVariables ?? EMPTY_VARIABLES).flatMap((variable) => {\n const name =\n typeof variable?.name === \"string\"\n ? normalizeVariableName(variable.name)\n : null;\n if (name === null || systemNameSet.has(name) || seen.has(name)) return [];\n seen.add(name);\n return [{ ...variable, name }];\n });\n }, [initialVariables, normalizedSystemVariables]);\n\n const [dialogOpen, setDialogOpen] = useState(false);\n const [popoverOpen, setPopoverOpen] = useState(false);\n const editorRootRef = useRef<HTMLDivElement>(null);\n const portalLanguage = useDetachedLanguage(editorRootRef, language);\n const { resolvedDirection: portalDirection } = useResolvedDirection(\n editorRootRef,\n direction\n );\n const [popoverPosition, setPopoverPosition] =\n useState<PopoverPosition | null>(null);\n const [variables, setVariables] = useState<Variable[]>(\n normalizedCustomVariables\n );\n const [systemVariables, setSystemVariables] = useState<Variable[]>(\n normalizedSystemVariables\n );\n\n useEffect(() => {\n setVariables(normalizedCustomVariables);\n }, [normalizedCustomVariables]);\n\n useEffect(() => {\n setSystemVariables(normalizedSystemVariables);\n }, [normalizedSystemVariables]);\n\n const [selectedOption, setSelectedOption] = useState<SelectedOption>(\n SelectedOption.Empty\n );\n const [selectContentInfo, setSelectContentInfo] =\n useState<SelectContentInfo | null>();\n const editorViewRef = useRef<EditorView | null>(null);\n const pendingVariableContentRef = useRef<string | null>(null);\n const variableSearchAnchorRef = useRef<HTMLButtonElement | null>(null);\n const [variableSearchOpen, setVariableSearchOpen] = useState(false);\n const closeVariableSearch = useCallback(() => {\n setVariableSearchOpen(false);\n variableSearchAnchorRef.current = null;\n }, []);\n 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)\n );\n\n setVariables((prev) => {\n const existingNames = new Set(prev.map((variable) => variable.name));\n const addedNames = new Set<string>();\n const newVariables: Variable[] = [];\n\n names.forEach((rawName) => {\n const normalized = rawName;\n if (\n !rawName ||\n systemNameSet.has(normalized) ||\n existingNames.has(normalized) ||\n addedNames.has(normalized)\n ) {\n return;\n }\n newVariables.push({ name: rawName });\n addedNames.add(normalized);\n });\n\n if (!newVariables.length) {\n return prev;\n }\n\n return [...newVariables, ...prev];\n });\n },\n [editMode, 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 if (!template) return;\n const name = normalizeVariableName(variableName) ?? \"\";\n const cursorOffset = placeCursorAtEnd ? template.length : 3 + name.length; // Opening braces and one padding space\n\n dispatch({\n changes: {\n from: selection.from,\n to: selection.to,\n insert: template,\n },\n selection: {\n anchor: selection.from + cursorOffset,\n },\n });\n view.focus();\n },\n [disabled]\n );\n\n const insertVariableTemplate = useCallback(() => {\n if (disabled) {\n return;\n }\n closeVariableSearch();\n insertVariableContent(\"\");\n }, [closeVariableSearch, disabled, insertVariableContent]);\n\n const insertConfirmOutputMarker = useCallback(() => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n const selection = state.selection.main;\n const template = \"======\";\n dispatch({\n changes: {\n from: selection.from,\n to: selection.to,\n insert: template,\n },\n selection: {\n anchor: selection.from + 3,\n },\n });\n view.focus();\n }, [disabled]);\n\n const insertLinkTemplate = useCallback(() => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n const selection = state.selection.main;\n const template = \"[]()\";\n dispatch({\n changes: {\n from: selection.from,\n to: selection.to,\n insert: template,\n },\n selection: {\n anchor: selection.from + 1,\n },\n });\n view.focus();\n }, [disabled]);\n\n const insertButtonTemplate = useCallback(() => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n const selection = state.selection.main;\n const template = \"?[]\";\n dispatch({\n changes: {\n from: selection.from,\n to: selection.to,\n insert: template,\n },\n selection: {\n anchor: selection.from + 2,\n },\n });\n view.focus();\n }, [disabled]);\n\n const insertSingleChoiceTemplate = useCallback(() => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n const selection = state.selection.main;\n const optionLabel1 = toolbarLabels.singleChoiceOption1;\n const optionLabel2 = toolbarLabels.singleChoiceOption2;\n const template = `?[%{{ }} ${optionLabel1} | ${optionLabel2}]`;\n dispatch({\n changes: {\n from: selection.from,\n to: selection.to,\n insert: template,\n },\n selection: {\n anchor: selection.from + 6,\n },\n });\n view.focus();\n }, [\n disabled,\n toolbarLabels.singleChoiceOption1,\n toolbarLabels.singleChoiceOption2,\n ]);\n\n const insertMultiChoiceTemplate = useCallback(() => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n const selection = state.selection.main;\n const optionLabel1 = toolbarLabels.singleChoiceOption1;\n const optionLabel2 = toolbarLabels.singleChoiceOption2;\n const template = `?[%{{ }} ${optionLabel1} || ${optionLabel2}]`;\n dispatch({\n changes: {\n from: selection.from,\n to: selection.to,\n insert: template,\n },\n selection: {\n anchor: selection.from + 6,\n },\n });\n view.focus();\n }, [\n disabled,\n toolbarLabels.singleChoiceOption1,\n toolbarLabels.singleChoiceOption2,\n ]);\n\n const insertInputFieldTemplate = useCallback(() => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n const selection = state.selection.main;\n const placeholder = toolbarLabels.inputPlaceholder ?? \"请输入\";\n const template = `?[%{{ }}...${placeholder}]`;\n dispatch({\n changes: {\n from: selection.from,\n to: selection.to,\n insert: template,\n },\n selection: {\n anchor: selection.from + 6,\n },\n });\n view.focus();\n }, [disabled, toolbarLabels.inputPlaceholder]);\n\n const handleSelectImage = useCallback(\n ({\n resourceUrl,\n resourceTitle,\n scalePercent,\n }: {\n resourceUrl?: string;\n resourceTitle?: string;\n scalePercent?: number;\n }) => {\n if (!resourceUrl || disabled) return;\n const textToInsert = getImageContentToInsert({\n resourceUrl,\n resourceTitle,\n scalePercent,\n });\n if (selectContentInfo?.type === SelectedOption.Image) {\n deleteSelectedContent();\n if (!editorViewRef.current) return;\n const { dispatch } = editorViewRef.current;\n dispatch({\n changes: { from: selectContentInfo.from, insert: textToInsert },\n });\n } else {\n insertText(textToInsert);\n }\n setDialogOpen(false);\n },\n [deleteSelectedContent, disabled, insertText, selectContentInfo]\n );\n\n const handleSelectVideo = useCallback(\n ({\n resourceUrl,\n resourceTitle,\n }: {\n resourceUrl: string;\n resourceTitle: string;\n }) => {\n if (disabled) {\n return;\n }\n const textToInsert = getVideoContentToInsert(resourceUrl, resourceTitle);\n if (selectContentInfo?.type === SelectedOption.Video) {\n deleteSelectedContent();\n if (!editorViewRef.current) return;\n const { dispatch } = editorViewRef.current;\n dispatch({\n changes: { from: selectContentInfo.from, insert: textToInsert },\n });\n } else {\n insertText(textToInsert);\n }\n setDialogOpen(false);\n },\n [deleteSelectedContent, disabled, insertText, selectContentInfo]\n );\n\n const 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 const anchorDirection =\n target.ownerDocument.defaultView?.getComputedStyle(\n editorRootRef.current ?? target\n ).direction;\n setPopoverPosition({\n x: anchorDirection === \"rtl\" ? rect.right : rect.left,\n y: rect.bottom,\n });\n }\n setPopoverOpen(true);\n } else {\n setDialogOpen(true);\n }\n },\n [disabled]\n );\n\n useEffect(() => {\n if (!dialogOpen) {\n setSelectedOption(SelectedOption.Empty);\n setSelectContentInfo(null);\n }\n }, [dialogOpen]);\n\n useEffect(() => {\n if (!popoverOpen && selectedOption === SelectedOption.Variable) {\n setSelectedOption(SelectedOption.Empty);\n setSelectContentInfo(null);\n }\n }, [popoverOpen, selectedOption]);\n\n useEffect(() => {\n const handleWrap = (e: any) => {\n if (e.detail.view === editorViewRef.current) {\n handleTagClick(e);\n }\n };\n window.addEventListener(\"globalTagClick\", handleWrap);\n return () => {\n window.removeEventListener(\"globalTagClick\", handleWrap);\n };\n }, [handleTagClick]);\n\n const imagePlaceholderTitle = t(\"imageDefaultTitle\");\n const videoPlaceholderTitle = t(\"videoDefaultTitle\");\n const mediaPlaceholderLabelsExtension = useMemo(\n () =>\n mediaPlaceholderLabels.of({\n image: imagePlaceholderTitle,\n video: videoPlaceholderTitle,\n }),\n [imagePlaceholderTitle, videoPlaceholderTitle]\n );\n\n const editorExtensions = useMemo(() => {\n const extensions = [\n EditorView.lineWrapping,\n markdown(),\n syntaxHighlighting(defaultHighlightStyle),\n SyntaxHighlighter,\n ];\n\n if (!disabled) {\n extensions.push(slashCommandsExtension());\n }\n\n if (editMode === EditMode.QuickEdit) {\n extensions.push(\n mediaPlaceholderLabelsExtension,\n ImgPlaceholder,\n VideoPlaceholder,\n 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 }, [\n disabled,\n editMode,\n slashCommandsExtension,\n handleEditorUpdate,\n mediaPlaceholderLabelsExtension,\n ]);\n\n const handleContentChange = useCallback(\n (value: string) => {\n if (disabled) {\n return;\n }\n 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\n side=\"top\"\n dir={portalDirection}\n lang={portalLanguage}\n >\n {action.tooltip}\n </TooltipContent>\n </Tooltip>\n ) : (\n button\n );\n return (\n <div\n className=\"markdown-flow-editor-toolbar-right-item\"\n key={action.key}\n >\n {wrapped}\n </div>\n );\n })}\n </div>\n );\n }, [\n disabled,\n editorApi,\n handleToolbarActionClick,\n portalDirection,\n portalLanguage,\n toolbarActionsRight,\n ]);\n\n useEffect(() => {\n onReady?.(editorApi);\n }, [editorApi]);\n\n return (\n <div\n className=\"markdown-flow-editor\"\n ref={editorRootRef}\n dir={direction}\n lang={language}\n data-disabled={disabled ? \"true\" : undefined}\n aria-disabled={disabled}\n >\n <EditorToolbar\n disabled={disabled}\n labels={toolbarLabels}\n tooltipDirection={portalDirection}\n tooltipLanguage={portalLanguage}\n onSelect={onSelectedOption}\n 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 searchKeymap: false,\n syntaxHighlighting: true,\n highlightActiveLine: true,\n highlightActiveLineGutter: true,\n foldGutter: false,\n }}\n className=\"rounded-md\"\n placeholder={placeholderText}\n value={content}\n theme=\"light\"\n minHeight=\"2rem\"\n editable={!disabled}\n onChange={handleContentChange}\n onBlur={onBlur}\n />\n {!disabled && (\n <CustomDialog\n dir={portalDirection}\n lang={portalLanguage}\n labels={{\n closeButtonLabel: t(\"dialogCloseLabel\"),\n title:\n selectedOption === SelectedOption.Image\n ? t(\"dialogTitleImage\")\n : selectedOption === SelectedOption.Video\n ? t(\"dialogTitleVideo\")\n : selectedOption === SelectedOption.Variable\n ? t(\"dialogTitleVariable\")\n : t(\"dialogTitle\"),\n }}\n >\n {selectedOption === SelectedOption.Image && (\n <ImageInject\n value={selectContentInfo?.value}\n onSelect={handleSelectImage}\n uploadProps={uploadProps}\n />\n )}\n {selectedOption === SelectedOption.Video && (\n <VideoInject\n value={selectContentInfo?.value}\n onSelect={handleSelectVideo}\n />\n )}\n </CustomDialog>\n )}\n\n {!disabled && (\n <CustomPopover dir={portalDirection} lang={portalLanguage}>\n <VariableSelect\n variables={variables}\n systemVariables={systemVariables}\n selectedName={selectContentInfo?.value?.variableName}\n onSelect={handleSelectVariable}\n onAddVariable={(variable) => {\n setVariables((prev) => {\n const normalized = variable.name;\n const exists = prev.some(\n (item) => item.name === normalized\n );\n if (exists) {\n return prev;\n }\n return [variable, ...prev];\n });\n }}\n />\n </CustomPopover>\n )}\n </EditorContext.Provider>\n </div>\n </div>\n );\n};\n\nexport default Editor;\n"],"names":["i18next","editorLocaleResources","lng","resource","initReactI18next","DEFAULT_EDITOR_LOCALE","EMPTY_VARIABLES","isCursorInsideVariableExpression","content","cursorPosition","marker","findDocumentVariableMarkers","buildVariableTemplate","variableName","formatVariableReference","Editor","editMode","initialVariables","initialSystemVariables","onChange","onBlur","locale","lang","uploadProps","disabled","toolbarActionsRight","onReady","t","i18n","useTranslation","resolvedLocale","normalizeMarkdownFlowLocale","direction","getMarkdownFlowDirection","language","getMarkdownFlowLanguage","useEffect","currentStrings","getEditorLocaleMessages","toolbarLabels","useMemo","variableSearchLabels","placeholderText","normalizedSystemVariables","seen","variable","name","normalizeVariableName","normalizedCustomVariables","systemNameSet","dialogOpen","setDialogOpen","useState","popoverOpen","setPopoverOpen","editorRootRef","useRef","portalLanguage","useDetachedLanguage","portalDirection","useResolvedDirection","popoverPosition","setPopoverPosition","variables","setVariables","systemVariables","setSystemVariables","selectedOption","setSelectedOption","SelectedOption","selectContentInfo","setSelectContentInfo","editorViewRef","pendingVariableContentRef","variableSearchAnchorRef","variableSearchOpen","setVariableSearchOpen","closeVariableSearch","useCallback","handleVariableSearchToggle","button","editorContextValue","addVariablesFromContent","text","names","extractVariableNames","prev","existingNames","addedNames","newVariables","rawName","normalized","onSelectedOption","option","state","pos","coords","insertText","dispatch","from","replaceSelection","selection","focusEditor","getContent","setContent","view","deleteSelectedContent","to","insertVariableContent","range","placeCursorAtEnd","template","cursorOffset","insertVariableTemplate","insertConfirmOutputMarker","insertLinkTemplate","insertButtonTemplate","insertSingleChoiceTemplate","optionLabel1","optionLabel2","insertMultiChoiceTemplate","insertInputFieldTemplate","handleSelectImage","resourceUrl","resourceTitle","scalePercent","textToInsert","getImageContentToInsert","handleSelectVideo","getVideoContentToInsert","handleSelectVariable","selectionRange","slashCommandsExtension","autocompletion","createSlashCommands","handleEditorUpdate","update","docText","handleTagClick","event","type","dataset","target","value","parseContentInfo","rect","anchorDirection","handleWrap","e","imagePlaceholderTitle","videoPlaceholderTitle","mediaPlaceholderLabelsExtension","mediaPlaceholderLabels","editorExtensions","extensions","EditorView","markdown","syntaxHighlighting","defaultHighlightStyle","SyntaxHighlighter","ImgPlaceholder","VideoPlaceholder","VariablePlaceholder","handleContentChange","isVariableSearchOpen","editorApi","handleToolbarActionClick","action","toolbarRightSlot","jsx","ariaLabel","jsxs","wrapped","Tooltip","TooltipTrigger","TooltipContent","EditorToolbar","VariableSearchDropdown","EditorContext","CodeMirror","CustomDialog","ImageInject","VideoInject","CustomPopover","VariableSelect","item"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"MarkdownFlowEditor.cjs","sources":["../../../src/components/MarkdownFlowEditor/MarkdownFlowEditor.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState, useCallback, useRef, useEffect, useMemo } from \"react\";\nimport CodeMirror from \"@uiw/react-codemirror\";\nimport { autocompletion } from \"@codemirror/autocomplete\";\nimport { EditorView, ViewUpdate } from \"@codemirror/view\";\nimport { markdown } from \"@codemirror/lang-markdown\";\nimport {\n syntaxHighlighting,\n defaultHighlightStyle,\n} from \"@codemirror/language\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"../ui/tooltip\";\nimport CustomDialog from \"./components/CustomDialog\";\nimport CustomPopover from \"./components/CustomPopover\";\nimport EditorToolbar from \"./components/EditorToolbar\";\nimport VariableSearchDropdown from \"./components/VariableSearchDropdown\";\nimport EditorContext from \"./editor-context\";\nimport ImageInject from \"./components/ImageInject\";\nimport VideoInject from \"./components/VideoInject\";\nimport VariableSelect from \"./components/VariableSelect\";\nimport {\n SelectedOption,\n IEditorContext,\n Variable,\n SelectContentInfo,\n PopoverPosition,\n EditorAction,\n EditorApi,\n} from \"./types\";\nimport \"./markdownFlowEditor.css\";\n\nimport {\n createSlashCommands,\n parseContentInfo,\n getImageContentToInsert,\n getVideoContentToInsert,\n extractVariableNames,\n findDocumentVariableMarkers,\n formatVariableReference,\n normalizeVariableName,\n} from \"./utils\";\nimport ImgPlaceholder from \"./plugins/ImgPlaceholder\";\nimport VideoPlaceholder from \"./plugins/VideoPlaceholder\";\nimport { mediaPlaceholderLabels } from \"./plugins/mediaPlaceholderLabels\";\nimport VariablePlaceholder from \"./plugins/VariablePlaceholder\";\nimport SyntaxHighlighter, {\n QuestionSyntaxHighlighter,\n} from \"./plugins/SyntaxHighlighter\";\n// import createFixedTextPlaceholder from \"./plugins/FixedTextPlaceholder\";\n// import DividerPlaceholder from \"./plugins/DividerPlaceholder\";\nimport { initReactI18next, useTranslation } from \"react-i18next\";\nimport i18next from \"i18next\";\nimport { UploadProps } from \"./uploadTypes\";\nimport {\n DEFAULT_EDITOR_LOCALE,\n editorLocaleResources,\n getEditorLocaleMessages,\n} from \"./editorI18n\";\nimport {\n getMarkdownFlowDirection,\n getMarkdownFlowLanguage,\n normalizeMarkdownFlowLocale,\n type MarkdownFlowLocale,\n} from \"../../lib/locale\";\nimport { useDetachedLanguage } from \"../../lib/useDetachedLanguage\";\nimport { useResolvedDirection } from \"../../lib/useResolvedDirection\";\n\nif (!i18next.isInitialized) {\n i18next.use(initReactI18next).init({\n resources: editorLocaleResources,\n lng: DEFAULT_EDITOR_LOCALE,\n fallbackLng: DEFAULT_EDITOR_LOCALE,\n interpolation: { escapeValue: false },\n });\n} else {\n Object.entries(editorLocaleResources).forEach(([lng, resource]) => {\n i18next.addResourceBundle(\n lng,\n \"translation\",\n resource.translation,\n true,\n true\n );\n });\n}\n\nexport enum EditMode {\n CodeEdit = \"codeEdit\",\n QuickEdit = \"quickEdit\",\n}\n\ntype EditorProps = {\n content?: string;\n editMode?: EditMode;\n /** Author questions and memory answers without variable authoring controls. */\n questionMode?: boolean;\n variables?: Variable[];\n systemVariables?: Variable[];\n onChange?: (value: string) => void;\n onBlur?: () => void;\n locale?: MarkdownFlowLocale;\n /** Overrides the locale-derived language. */\n lang?: string;\n uploadProps?: UploadProps;\n disabled?: boolean;\n toolbarActionsRight?: EditorAction[];\n onReady?: (api: EditorApi) => void;\n};\n\nconst EMPTY_VARIABLES: Variable[] = [];\n\n// Detect whether cursor is still inside a {{variable}} expression\nconst isCursorInsideVariableExpression = (\n content: string,\n cursorPosition: number\n) => {\n if (!content || cursorPosition < 0) {\n return false;\n }\n for (const marker of findDocumentVariableMarkers(content)) {\n if (\n marker.name !== null &&\n cursorPosition >= marker.start + 2 &&\n cursorPosition <= marker.end - 2\n ) {\n return true;\n }\n }\n\n return false;\n};\n\nconst buildVariableTemplate = (variableName = \"\") =>\n variableName ? formatVariableReference(variableName) : \"{{ }}\";\n\nconst Editor: React.FC<EditorProps> = ({\n content = \"\",\n editMode = EditMode.CodeEdit,\n questionMode = false,\n variables: initialVariables,\n systemVariables: initialSystemVariables,\n onChange,\n onBlur,\n locale,\n lang,\n uploadProps,\n disabled = false,\n toolbarActionsRight,\n onReady,\n}) => {\n const { t, i18n } = useTranslation();\n const resolvedLocale = normalizeMarkdownFlowLocale(\n locale ?? DEFAULT_EDITOR_LOCALE\n );\n const direction = getMarkdownFlowDirection(locale);\n const language = lang ?? getMarkdownFlowLanguage(locale);\n\n useEffect(() => {\n if (i18n.language !== resolvedLocale) {\n i18n.changeLanguage(resolvedLocale);\n }\n }, [i18n, resolvedLocale]);\n\n const currentStrings = getEditorLocaleMessages(resolvedLocale);\n const toolbarLabels = useMemo(\n () => ({\n image: t(\"toolbarInsertImage\", {\n defaultValue: \"Insert image\",\n }),\n video: t(\"toolbarInsertVideo\", {\n defaultValue: \"Insert video\",\n }),\n variable: t(\"slashVariable\", {\n defaultValue: \"Variable\",\n }),\n addVariable: t(\"toolbarInsertNewVariable\", {\n defaultValue: \"Insert new variable\",\n }),\n search: t(\"toolbarInsertExistingVariable\", {\n defaultValue: \"Insert existing variable\",\n }),\n confirmOutput: t(\"toolbarConfirmOutput\", {\n defaultValue: \"Confirm output\",\n }),\n insertLink: t(\"toolbarInsertLink\", {\n defaultValue: \"Insert link\",\n }),\n insertButton: t(\"toolbarInsertButton\", {\n defaultValue: \"Insert button\",\n }),\n insertSingleChoice: t(\"toolbarInsertSingleChoice\", {\n defaultValue: \"Insert single choice\",\n }),\n insertMultiChoice: t(\"toolbarInsertMultiChoice\", {\n defaultValue: \"Insert multi choice\",\n }),\n insertInput: t(\"toolbarInsertInput\", {\n defaultValue: \"Insert input\",\n }),\n singleChoiceOption1: t(\"toolbarChoiceOption1\", {\n defaultValue: \"Option 1\",\n }),\n singleChoiceOption2: t(\"toolbarChoiceOption2\", {\n defaultValue: \"Option 2\",\n }),\n inputPlaceholder: t(\"toolbarInputPlaceholder\", {\n defaultValue: \"Please enter\",\n }),\n }),\n [t]\n );\n const variableSearchLabels = useMemo(\n () => ({\n searchPlaceholder: t(\"variableSearchPlaceholder\", {\n defaultValue: \"Search variable\",\n }),\n systemLabel: t(\"variableSectionSystem\", \"System Variables\"),\n customLabel: t(\"variableSectionCustom\", \"Custom Variables\"),\n emptyLabel: t(\"variableNotFound\", \"No variables found\"),\n }),\n [t]\n );\n const placeholderText =\n editMode === EditMode.QuickEdit\n ? t(\"placeholderQuickEdit\", {\n defaultValue: t(\"placeholderCodeEdit\", {\n defaultValue: t(\"placeholder\"),\n }),\n })\n : t(\"placeholderCodeEdit\", { defaultValue: t(\"placeholder\") });\n // Only boundary whitespace is normalized; key identity remains case-sensitive.\n const normalizedSystemVariables = useMemo(() => {\n const seen = new Set<string>();\n return (initialSystemVariables ?? EMPTY_VARIABLES).flatMap((variable) => {\n const name =\n typeof variable?.name === \"string\"\n ? normalizeVariableName(variable.name)\n : null;\n if (name === null || seen.has(name)) return [];\n seen.add(name);\n return [{ ...variable, name }];\n });\n }, [initialSystemVariables]);\n\n const normalizedCustomVariables = useMemo(() => {\n const systemNameSet = new Set(\n normalizedSystemVariables.map((variable) => variable.name)\n );\n const seen = new Set<string>();\n return (initialVariables ?? EMPTY_VARIABLES).flatMap((variable) => {\n const name =\n typeof variable?.name === \"string\"\n ? normalizeVariableName(variable.name)\n : null;\n if (name === null || systemNameSet.has(name) || seen.has(name)) return [];\n seen.add(name);\n return [{ ...variable, name }];\n });\n }, [initialVariables, normalizedSystemVariables]);\n\n const [dialogOpen, setDialogOpen] = useState(false);\n const [popoverOpen, setPopoverOpen] = useState(false);\n const editorRootRef = useRef<HTMLDivElement>(null);\n const portalLanguage = useDetachedLanguage(editorRootRef, language);\n const { resolvedDirection: portalDirection } = useResolvedDirection(\n editorRootRef,\n direction\n );\n const [popoverPosition, setPopoverPosition] =\n useState<PopoverPosition | null>(null);\n const [variables, setVariables] = useState<Variable[]>(\n normalizedCustomVariables\n );\n const [systemVariables, setSystemVariables] = useState<Variable[]>(\n normalizedSystemVariables\n );\n\n useEffect(() => {\n setVariables(normalizedCustomVariables);\n }, [normalizedCustomVariables]);\n\n useEffect(() => {\n setSystemVariables(normalizedSystemVariables);\n }, [normalizedSystemVariables]);\n\n const [selectedOption, setSelectedOption] = useState<SelectedOption>(\n SelectedOption.Empty\n );\n const [selectContentInfo, setSelectContentInfo] =\n useState<SelectContentInfo | null>();\n const editorViewRef = useRef<EditorView | null>(null);\n const pendingVariableContentRef = useRef<string | null>(null);\n const variableSearchAnchorRef = useRef<HTMLButtonElement | null>(null);\n const [variableSearchOpen, setVariableSearchOpen] = useState(false);\n const closeVariableSearch = useCallback(() => {\n setVariableSearchOpen(false);\n variableSearchAnchorRef.current = null;\n }, []);\n\n useEffect(() => {\n if (questionMode) {\n closeVariableSearch();\n }\n }, [closeVariableSearch, questionMode]);\n const handleVariableSearchToggle = useCallback(\n (button: HTMLButtonElement) => {\n if (disabled) {\n return;\n }\n if (variableSearchOpen && variableSearchAnchorRef.current === button) {\n closeVariableSearch();\n return;\n }\n variableSearchAnchorRef.current = button;\n setVariableSearchOpen(true);\n },\n [closeVariableSearch, disabled, variableSearchOpen]\n );\n\n const editorContextValue: IEditorContext = {\n selectedOption,\n setSelectedOption,\n dialogOpen,\n setDialogOpen,\n popoverOpen,\n setPopoverOpen,\n popoverPosition,\n setPopoverPosition,\n };\n\n useEffect(() => {\n if (!disabled) {\n return;\n }\n setDialogOpen(false);\n setPopoverOpen(false);\n setSelectedOption(SelectedOption.Empty);\n setSelectContentInfo(null);\n setPopoverPosition(null);\n closeVariableSearch();\n }, [\n closeVariableSearch,\n disabled,\n setDialogOpen,\n setPopoverOpen,\n setPopoverPosition,\n setSelectedOption,\n setSelectContentInfo,\n ]);\n\n const addVariablesFromContent = useCallback(\n (text: string) => {\n if (questionMode || editMode !== EditMode.QuickEdit || !text) {\n return;\n }\n\n const names = extractVariableNames(text);\n if (!names.length) {\n return;\n }\n\n const systemNameSet = new Set(\n systemVariables.map((variable) => variable.name)\n );\n\n setVariables((prev) => {\n const existingNames = new Set(prev.map((variable) => variable.name));\n const addedNames = new Set<string>();\n const newVariables: Variable[] = [];\n\n names.forEach((rawName) => {\n const normalized = rawName;\n if (\n !rawName ||\n systemNameSet.has(normalized) ||\n existingNames.has(normalized) ||\n addedNames.has(normalized)\n ) {\n return;\n }\n newVariables.push({ name: rawName });\n addedNames.add(normalized);\n });\n\n if (!newVariables.length) {\n return prev;\n }\n\n return [...newVariables, ...prev];\n });\n },\n [editMode, questionMode, systemVariables]\n );\n\n useEffect(() => {\n addVariablesFromContent(content);\n }, [content, addVariablesFromContent]);\n\n // const insertFixedText = useCallback(() => {\n // if (!editorViewRef.current) return;\n // const view = editorViewRef.current;\n // const { state, dispatch } = view;\n // const selection = state.selection.main;\n // const selectedText = state.sliceDoc(selection.from, selection.to);\n // const startTag = \"===\";\n // const endTag = \"===\";\n // const insertContent = `${startTag}${selectedText ?? \"\"}${endTag}`;\n\n // dispatch({\n // changes: {\n // from: selection.from,\n // to: selection.to,\n // insert: insertContent,\n // },\n // selection: {\n // anchor: selection.from + startTag.length + (selectedText?.length ?? 0),\n // },\n // });\n // view.focus();\n // }, []);\n\n // const insertDivider = useCallback(() => {\n // if (!editorViewRef.current) return;\n // const view = editorViewRef.current;\n // const { state, dispatch } = view;\n // const selection = state.selection.main;\n // const insertContent = `\\n\\n---\\n\\n`;\n\n // dispatch({\n // changes: {\n // from: selection.from,\n // to: selection.to,\n // insert: insertContent,\n // },\n // selection: {\n // anchor: selection.from + insertContent.length,\n // },\n // });\n // view.focus();\n // }, []);\n\n const onSelectedOption = useCallback(\n (option: SelectedOption) => {\n if (disabled || (questionMode && option === SelectedOption.Variable)) {\n return;\n }\n closeVariableSearch();\n // if (option === SelectedOption.FixedText) {\n // insertFixedText();\n // setSelectedOption(SelectedOption.Empty);\n // setDialogOpen(false);\n // setPopoverOpen(false);\n // setSelectContentInfo(null);\n // setPopoverPosition(null);\n // return;\n // }\n\n // if (option === SelectedOption.Divider) {\n // insertDivider();\n // setSelectedOption(SelectedOption.Empty);\n // setDialogOpen(false);\n // setPopoverOpen(false);\n // setSelectContentInfo(null);\n // setPopoverPosition(null);\n // return;\n // }\n\n setSelectedOption(option);\n\n if (option === SelectedOption.Variable) {\n if (editorViewRef.current) {\n const { state } = editorViewRef.current;\n const pos = state.selection.main.from;\n const coords = editorViewRef.current.coordsAtPos(pos);\n if (coords) {\n setPopoverPosition({\n x: coords.left,\n y: coords.bottom,\n });\n }\n }\n setPopoverOpen(true);\n } else {\n setDialogOpen(true);\n }\n },\n [closeVariableSearch, disabled, questionMode]\n );\n\n const insertText = useCallback(\n (text: string) => {\n if (disabled || !editorViewRef.current) return;\n\n const { state, dispatch } = editorViewRef.current;\n const from = state.selection.main.from;\n\n dispatch({\n changes: { from, insert: text },\n selection: { anchor: from + text.length },\n });\n },\n [editorViewRef, disabled]\n );\n\n const replaceSelection = useCallback(\n (text: string) => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const { state, dispatch } = editorViewRef.current;\n const selection = state.selection.main;\n dispatch({\n changes: { from: selection.from, to: selection.to, insert: text },\n selection: { anchor: selection.from + text.length },\n });\n },\n [disabled]\n );\n\n const focusEditor = useCallback(() => {\n editorViewRef.current?.focus();\n }, []);\n\n const getContent = useCallback(() => {\n return editorViewRef.current?.state.doc.toString() ?? \"\";\n }, []);\n\n const setContent = useCallback(\n (text: string) => {\n if (disabled) {\n return;\n }\n if (!editorViewRef.current) {\n onChange?.(text);\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n dispatch({\n changes: { from: 0, to: state.doc.length, insert: text },\n selection: { anchor: text.length },\n });\n },\n [disabled, onChange]\n );\n\n const deleteSelectedContent = useCallback(() => {\n if (disabled) {\n return;\n }\n if (\n !selectContentInfo ||\n !editorViewRef.current ||\n selectContentInfo.from === -1\n )\n return;\n\n const { from, to } = selectContentInfo;\n const { dispatch } = editorViewRef.current;\n\n dispatch({\n changes: { from, to, insert: \"\" },\n });\n }, [selectContentInfo, editorViewRef, disabled]);\n\n const insertVariableContent = useCallback(\n (\n variableName: string,\n range?: { from: number; to: number },\n placeCursorAtEnd = false\n ) => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n const selection = range ?? state.selection.main;\n const template = buildVariableTemplate(variableName);\n if (!template) return;\n const name = normalizeVariableName(variableName) ?? \"\";\n const cursorOffset = placeCursorAtEnd ? template.length : 3 + name.length; // Opening braces and one padding space\n\n dispatch({\n changes: {\n from: selection.from,\n to: selection.to,\n insert: template,\n },\n selection: {\n anchor: selection.from + cursorOffset,\n },\n });\n view.focus();\n },\n [disabled]\n );\n\n const insertVariableTemplate = useCallback(() => {\n if (disabled) {\n return;\n }\n closeVariableSearch();\n insertVariableContent(\"\");\n }, [closeVariableSearch, disabled, insertVariableContent]);\n\n const insertConfirmOutputMarker = useCallback(() => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n const selection = state.selection.main;\n const template = \"======\";\n dispatch({\n changes: {\n from: selection.from,\n to: selection.to,\n insert: template,\n },\n selection: {\n anchor: selection.from + 3,\n },\n });\n view.focus();\n }, [disabled]);\n\n const insertLinkTemplate = useCallback(() => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n const selection = state.selection.main;\n const template = \"[]()\";\n dispatch({\n changes: {\n from: selection.from,\n to: selection.to,\n insert: template,\n },\n selection: {\n anchor: selection.from + 1,\n },\n });\n view.focus();\n }, [disabled]);\n\n const insertButtonTemplate = useCallback(() => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n const selection = state.selection.main;\n const template = \"?[]\";\n dispatch({\n changes: {\n from: selection.from,\n to: selection.to,\n insert: template,\n },\n selection: {\n anchor: selection.from + 2,\n },\n });\n view.focus();\n }, [disabled]);\n\n const insertSingleChoiceTemplate = useCallback(() => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n const selection = state.selection.main;\n const optionLabel1 = toolbarLabels.singleChoiceOption1;\n const optionLabel2 = toolbarLabels.singleChoiceOption2;\n const template = `?[%{{ ${questionMode ? currentStrings.questionPlaceholder : \"\"} }} ${optionLabel1} | ${optionLabel2}]`;\n dispatch({\n changes: {\n from: selection.from,\n to: selection.to,\n insert: template,\n },\n selection: {\n anchor: selection.from + 6,\n head:\n selection.from +\n 6 +\n (questionMode ? currentStrings.questionPlaceholder.length : 0),\n },\n });\n view.focus();\n }, [\n disabled,\n toolbarLabels.singleChoiceOption1,\n toolbarLabels.singleChoiceOption2,\n questionMode,\n currentStrings.questionPlaceholder,\n ]);\n\n const insertMultiChoiceTemplate = useCallback(() => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n const selection = state.selection.main;\n const optionLabel1 = toolbarLabels.singleChoiceOption1;\n const optionLabel2 = toolbarLabels.singleChoiceOption2;\n const template = `?[%{{ ${questionMode ? currentStrings.questionPlaceholder : \"\"} }} ${optionLabel1} || ${optionLabel2}]`;\n dispatch({\n changes: {\n from: selection.from,\n to: selection.to,\n insert: template,\n },\n selection: {\n anchor: selection.from + 6,\n head:\n selection.from +\n 6 +\n (questionMode ? currentStrings.questionPlaceholder.length : 0),\n },\n });\n view.focus();\n }, [\n disabled,\n toolbarLabels.singleChoiceOption1,\n toolbarLabels.singleChoiceOption2,\n questionMode,\n currentStrings.questionPlaceholder,\n ]);\n\n const insertInputFieldTemplate = useCallback(() => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n const selection = state.selection.main;\n const placeholder = toolbarLabels.inputPlaceholder ?? \"请输入\";\n const template = `?[%{{ ${questionMode ? currentStrings.questionPlaceholder : \"\"} }}...${placeholder}]`;\n dispatch({\n changes: {\n from: selection.from,\n to: selection.to,\n insert: template,\n },\n selection: {\n anchor: selection.from + 6,\n head:\n selection.from +\n 6 +\n (questionMode ? currentStrings.questionPlaceholder.length : 0),\n },\n });\n view.focus();\n }, [\n disabled,\n toolbarLabels.inputPlaceholder,\n questionMode,\n currentStrings.questionPlaceholder,\n ]);\n\n const handleSelectImage = useCallback(\n ({\n resourceUrl,\n resourceTitle,\n scalePercent,\n }: {\n resourceUrl?: string;\n resourceTitle?: string;\n scalePercent?: number;\n }) => {\n if (!resourceUrl || disabled) return;\n const textToInsert = getImageContentToInsert({\n resourceUrl,\n resourceTitle,\n scalePercent,\n });\n if (selectContentInfo?.type === SelectedOption.Image) {\n deleteSelectedContent();\n if (!editorViewRef.current) return;\n const { dispatch } = editorViewRef.current;\n dispatch({\n changes: { from: selectContentInfo.from, insert: textToInsert },\n });\n } else {\n insertText(textToInsert);\n }\n setDialogOpen(false);\n },\n [deleteSelectedContent, disabled, insertText, selectContentInfo]\n );\n\n const handleSelectVideo = useCallback(\n ({\n resourceUrl,\n resourceTitle,\n }: {\n resourceUrl: string;\n resourceTitle: string;\n }) => {\n if (disabled) {\n return;\n }\n const textToInsert = getVideoContentToInsert(resourceUrl, resourceTitle);\n if (selectContentInfo?.type === SelectedOption.Video) {\n deleteSelectedContent();\n if (!editorViewRef.current) return;\n const { dispatch } = editorViewRef.current;\n dispatch({\n changes: { from: selectContentInfo.from, insert: textToInsert },\n });\n } else {\n insertText(textToInsert);\n }\n setDialogOpen(false);\n },\n [deleteSelectedContent, disabled, insertText, selectContentInfo]\n );\n\n const handleSelectVariable = useCallback(\n (variable: Variable) => {\n if (disabled) {\n return;\n }\n const selectionRange =\n selectContentInfo?.type === SelectedOption.Variable\n ? { from: selectContentInfo.from, to: selectContentInfo.to }\n : undefined;\n insertVariableContent(variable.name, selectionRange, true);\n setPopoverOpen(false);\n closeVariableSearch();\n },\n [disabled, insertVariableContent, selectContentInfo, closeVariableSearch]\n );\n\n const slashCommandsExtension = useCallback(() => {\n return autocompletion({\n override: [\n createSlashCommands(\n onSelectedOption,\n {\n // divider: currentStrings.slashDivider,\n // fixedText: currentStrings.slashFixedText,\n image: currentStrings.slashImage,\n video: currentStrings.slashVideo,\n variable: currentStrings.slashVariable,\n },\n { enableVariables: !questionMode }\n ),\n ],\n });\n }, [\n // currentStrings.slashDivider,\n // currentStrings.slashFixedText,\n currentStrings.slashImage,\n currentStrings.slashVideo,\n currentStrings.slashVariable,\n onSelectedOption,\n questionMode,\n ]);\n\n // const fixedTextPlaceholderExtension = useMemo(\n // () =>\n // createFixedTextPlaceholder(\n // currentStrings.fixedTextPlaceholder ?? \"添加固定文本\",\n // currentStrings.fixedTextTooltip ??\n // currentStrings.slashFixedText ??\n // \"固定文本\"\n // ),\n // [\n // currentStrings.fixedTextPlaceholder,\n // currentStrings.fixedTextTooltip,\n // currentStrings.slashFixedText,\n // ]\n // );\n\n const handleEditorUpdate = useCallback(\n (update: ViewUpdate) => {\n editorViewRef.current = update.view;\n if (\n !questionMode &&\n editMode === EditMode.QuickEdit &&\n pendingVariableContentRef.current &&\n update.selectionSet\n ) {\n const cursorPosition = update.state.selection.main.head;\n const docText = update.state.doc.toString();\n const stillInside = isCursorInsideVariableExpression(\n docText,\n cursorPosition\n );\n if (!stillInside) {\n addVariablesFromContent(docText);\n pendingVariableContentRef.current = null;\n }\n }\n },\n [addVariablesFromContent, editMode, questionMode]\n );\n\n const handleTagClick = useCallback(\n (event: any) => {\n event.stopPropagation();\n if (disabled) {\n return;\n }\n const { type, from, to, dataset, target } = event.detail;\n if (questionMode && type === SelectedOption.Variable) return;\n const value = parseContentInfo(type, dataset);\n setSelectContentInfo({\n type,\n value,\n from,\n to,\n });\n setSelectedOption(type);\n\n if (type === SelectedOption.Variable) {\n if (target) {\n const rect = target.getBoundingClientRect();\n const anchorDirection =\n target.ownerDocument.defaultView?.getComputedStyle(\n editorRootRef.current ?? target\n ).direction;\n setPopoverPosition({\n x: anchorDirection === \"rtl\" ? rect.right : rect.left,\n y: rect.bottom,\n });\n }\n setPopoverOpen(true);\n } else {\n setDialogOpen(true);\n }\n },\n [disabled, questionMode]\n );\n\n useEffect(() => {\n if (!dialogOpen) {\n setSelectedOption(SelectedOption.Empty);\n setSelectContentInfo(null);\n }\n }, [dialogOpen]);\n\n useEffect(() => {\n if (!popoverOpen && selectedOption === SelectedOption.Variable) {\n setSelectedOption(SelectedOption.Empty);\n setSelectContentInfo(null);\n }\n }, [popoverOpen, selectedOption]);\n\n useEffect(() => {\n const handleWrap = (e: any) => {\n if (e.detail.view === editorViewRef.current) {\n handleTagClick(e);\n }\n };\n window.addEventListener(\"globalTagClick\", handleWrap);\n return () => {\n window.removeEventListener(\"globalTagClick\", handleWrap);\n };\n }, [handleTagClick]);\n\n const imagePlaceholderTitle = t(\"imageDefaultTitle\");\n const videoPlaceholderTitle = t(\"videoDefaultTitle\");\n const mediaPlaceholderLabelsExtension = useMemo(\n () =>\n mediaPlaceholderLabels.of({\n image: imagePlaceholderTitle,\n video: videoPlaceholderTitle,\n }),\n [imagePlaceholderTitle, videoPlaceholderTitle]\n );\n\n const editorExtensions = useMemo(() => {\n const extensions = [\n EditorView.lineWrapping,\n markdown(),\n syntaxHighlighting(defaultHighlightStyle),\n questionMode ? QuestionSyntaxHighlighter : SyntaxHighlighter,\n ];\n\n if (!disabled) {\n extensions.push(slashCommandsExtension());\n }\n\n if (editMode === EditMode.QuickEdit) {\n extensions.push(\n mediaPlaceholderLabelsExtension,\n ImgPlaceholder,\n VideoPlaceholder\n // fixedTextPlaceholderExtension,\n // DividerPlaceholder,\n );\n if (!questionMode) extensions.push(VariablePlaceholder);\n }\n\n extensions.push(\n EditorView.updateListener.of((update) => {\n handleEditorUpdate(update);\n })\n );\n\n return extensions;\n }, [\n disabled,\n editMode,\n slashCommandsExtension,\n handleEditorUpdate,\n mediaPlaceholderLabelsExtension,\n questionMode,\n ]);\n\n const handleContentChange = useCallback(\n (value: string) => {\n if (disabled) {\n return;\n }\n if (questionMode) {\n onChange?.(value);\n return;\n }\n const cursorPosition =\n editorViewRef.current?.state.selection.main.head ?? -1;\n const skipAddition = isCursorInsideVariableExpression(\n value,\n cursorPosition\n );\n if (skipAddition) {\n pendingVariableContentRef.current = value;\n } else {\n pendingVariableContentRef.current = null;\n addVariablesFromContent(value);\n }\n onChange?.(value);\n },\n [addVariablesFromContent, onChange, disabled, questionMode]\n );\n\n const isVariableSearchOpen = !questionMode && !disabled && variableSearchOpen;\n const editorApi = useMemo(\n () => ({\n insertTextAtCursor: insertText,\n replaceSelection,\n focus: focusEditor,\n getContent,\n setContent,\n }),\n [focusEditor, getContent, insertText, replaceSelection, setContent]\n );\n\n const handleToolbarActionClick = useCallback(\n (action: EditorAction) => {\n if (disabled || \"render\" in action) {\n return;\n }\n action.onClick?.(editorApi);\n },\n [disabled, editorApi]\n );\n\n const toolbarRightSlot = useMemo(() => {\n if (!toolbarActionsRight?.length) {\n return null;\n }\n return (\n <div className=\"markdown-flow-editor-toolbar-right\">\n {toolbarActionsRight.map((action) => {\n if (\"render\" in action) {\n return (\n <div\n className=\"markdown-flow-editor-toolbar-right-item\"\n key={action.key}\n >\n {action.render(editorApi)}\n </div>\n );\n }\n const ariaLabel = action.label || action.tooltip || undefined;\n const button = (\n <button\n type=\"button\"\n key={action.key}\n disabled={disabled || action.disabled}\n onClick={() => handleToolbarActionClick(action)}\n className=\"markdown-flow-editor-toolbar-right-button\"\n aria-label={ariaLabel}\n title={action.label || action.tooltip}\n >\n {action.icon ? (\n <span className=\"toolbar-right-icon\">{action.icon}</span>\n ) : null}\n {action.label ? (\n <span className=\"toolbar-right-label\">{action.label}</span>\n ) : null}\n </button>\n );\n const wrapped = action.tooltip ? (\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent\n side=\"top\"\n dir={portalDirection}\n lang={portalLanguage}\n >\n {action.tooltip}\n </TooltipContent>\n </Tooltip>\n ) : (\n button\n );\n return (\n <div\n className=\"markdown-flow-editor-toolbar-right-item\"\n key={action.key}\n >\n {wrapped}\n </div>\n );\n })}\n </div>\n );\n }, [\n disabled,\n editorApi,\n handleToolbarActionClick,\n portalDirection,\n portalLanguage,\n toolbarActionsRight,\n ]);\n\n useEffect(() => {\n onReady?.(editorApi);\n }, [editorApi]);\n\n return (\n <div\n className=\"markdown-flow-editor\"\n ref={editorRootRef}\n dir={direction}\n lang={language}\n data-disabled={disabled ? \"true\" : undefined}\n aria-disabled={disabled}\n >\n <EditorToolbar\n disabled={disabled}\n enableVariables={!questionMode}\n labels={toolbarLabels}\n tooltipDirection={portalDirection}\n tooltipLanguage={portalLanguage}\n onSelect={onSelectedOption}\n onInsertVariablePlaceholder={insertVariableTemplate}\n onVariableSearchToggle={handleVariableSearchToggle}\n onVariableSearchClose={closeVariableSearch}\n onInsertConfirmOutput={insertConfirmOutputMarker}\n onInsertLink={insertLinkTemplate}\n onInsertButton={insertButtonTemplate}\n onInsertSingleChoice={insertSingleChoiceTemplate}\n onInsertMultiChoice={insertMultiChoiceTemplate}\n onInsertInputField={insertInputFieldTemplate}\n variableSearchActive={isVariableSearchOpen}\n rightSlot={toolbarRightSlot}\n />\n {!questionMode && (\n <VariableSearchDropdown\n open={isVariableSearchOpen}\n anchorElement={variableSearchAnchorRef.current}\n onClose={closeVariableSearch}\n onSelect={handleSelectVariable}\n variables={variables}\n systemVariables={systemVariables}\n labels={variableSearchLabels}\n />\n )}\n <div className=\"markdown-flow-editor-body relative overflow-auto\">\n <EditorContext.Provider value={editorContextValue}>\n <CodeMirror\n extensions={editorExtensions}\n basicSetup={{\n lineNumbers: false,\n searchKeymap: false,\n syntaxHighlighting: true,\n highlightActiveLine: true,\n highlightActiveLineGutter: true,\n foldGutter: false,\n }}\n className=\"rounded-md\"\n placeholder={placeholderText}\n value={content}\n theme=\"light\"\n minHeight=\"2rem\"\n editable={!disabled}\n onChange={handleContentChange}\n onBlur={onBlur}\n />\n {!disabled && (\n <CustomDialog\n dir={portalDirection}\n lang={portalLanguage}\n labels={{\n closeButtonLabel: t(\"dialogCloseLabel\"),\n title:\n selectedOption === SelectedOption.Image\n ? t(\"dialogTitleImage\")\n : selectedOption === SelectedOption.Video\n ? t(\"dialogTitleVideo\")\n : selectedOption === SelectedOption.Variable\n ? t(\"dialogTitleVariable\")\n : t(\"dialogTitle\"),\n }}\n >\n {selectedOption === SelectedOption.Image && (\n <ImageInject\n value={selectContentInfo?.value}\n onSelect={handleSelectImage}\n uploadProps={uploadProps}\n />\n )}\n {selectedOption === SelectedOption.Video && (\n <VideoInject\n value={selectContentInfo?.value}\n onSelect={handleSelectVideo}\n />\n )}\n </CustomDialog>\n )}\n\n {!disabled && !questionMode && (\n <CustomPopover dir={portalDirection} lang={portalLanguage}>\n <VariableSelect\n variables={variables}\n systemVariables={systemVariables}\n selectedName={selectContentInfo?.value?.variableName}\n onSelect={handleSelectVariable}\n onAddVariable={(variable) => {\n setVariables((prev) => {\n const normalized = variable.name;\n const exists = prev.some(\n (item) => item.name === normalized\n );\n if (exists) {\n return prev;\n }\n return [variable, ...prev];\n });\n }}\n />\n </CustomPopover>\n )}\n </EditorContext.Provider>\n </div>\n </div>\n );\n};\n\nexport default Editor;\n"],"names":["i18next","editorLocaleResources","lng","resource","initReactI18next","DEFAULT_EDITOR_LOCALE","EMPTY_VARIABLES","isCursorInsideVariableExpression","content","cursorPosition","marker","findDocumentVariableMarkers","buildVariableTemplate","variableName","formatVariableReference","Editor","editMode","questionMode","initialVariables","initialSystemVariables","onChange","onBlur","locale","lang","uploadProps","disabled","toolbarActionsRight","onReady","t","i18n","useTranslation","resolvedLocale","normalizeMarkdownFlowLocale","direction","getMarkdownFlowDirection","language","getMarkdownFlowLanguage","useEffect","currentStrings","getEditorLocaleMessages","toolbarLabels","useMemo","variableSearchLabels","placeholderText","normalizedSystemVariables","seen","variable","name","normalizeVariableName","normalizedCustomVariables","systemNameSet","dialogOpen","setDialogOpen","useState","popoverOpen","setPopoverOpen","editorRootRef","useRef","portalLanguage","useDetachedLanguage","portalDirection","useResolvedDirection","popoverPosition","setPopoverPosition","variables","setVariables","systemVariables","setSystemVariables","selectedOption","setSelectedOption","SelectedOption","selectContentInfo","setSelectContentInfo","editorViewRef","pendingVariableContentRef","variableSearchAnchorRef","variableSearchOpen","setVariableSearchOpen","closeVariableSearch","useCallback","handleVariableSearchToggle","button","editorContextValue","addVariablesFromContent","text","names","extractVariableNames","prev","existingNames","addedNames","newVariables","rawName","normalized","onSelectedOption","option","state","pos","coords","insertText","dispatch","from","replaceSelection","selection","focusEditor","getContent","setContent","view","deleteSelectedContent","to","insertVariableContent","range","placeCursorAtEnd","template","cursorOffset","insertVariableTemplate","insertConfirmOutputMarker","insertLinkTemplate","insertButtonTemplate","insertSingleChoiceTemplate","optionLabel1","optionLabel2","insertMultiChoiceTemplate","insertInputFieldTemplate","placeholder","handleSelectImage","resourceUrl","resourceTitle","scalePercent","textToInsert","getImageContentToInsert","handleSelectVideo","getVideoContentToInsert","handleSelectVariable","selectionRange","slashCommandsExtension","autocompletion","createSlashCommands","handleEditorUpdate","update","docText","handleTagClick","event","type","dataset","target","value","parseContentInfo","rect","anchorDirection","handleWrap","e","imagePlaceholderTitle","videoPlaceholderTitle","mediaPlaceholderLabelsExtension","mediaPlaceholderLabels","editorExtensions","extensions","EditorView","markdown","syntaxHighlighting","defaultHighlightStyle","QuestionSyntaxHighlighter","SyntaxHighlighter","ImgPlaceholder","VideoPlaceholder","VariablePlaceholder","handleContentChange","isVariableSearchOpen","editorApi","handleToolbarActionClick","action","toolbarRightSlot","jsx","ariaLabel","jsxs","wrapped","Tooltip","TooltipTrigger","TooltipContent","EditorToolbar","VariableSearchDropdown","EditorContext","CodeMirror","CustomDialog","ImageInject","VideoInject","CustomPopover","VariableSelect","item"],"mappings":"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"}
|
|
@@ -8,6 +8,8 @@ export declare enum EditMode {
|
|
|
8
8
|
type EditorProps = {
|
|
9
9
|
content?: string;
|
|
10
10
|
editMode?: EditMode;
|
|
11
|
+
/** Author questions and memory answers without variable authoring controls. */
|
|
12
|
+
questionMode?: boolean;
|
|
11
13
|
variables?: Variable[];
|
|
12
14
|
systemVariables?: Variable[];
|
|
13
15
|
onChange?: (value: string) => void;
|