@ibiz-template/vue3-components 0.7.41-alpha.38 → 0.7.41-alpha.39

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/dist/ibiz-markdown-editor-D4Og0fLv.js +1 -0
  2. package/dist/{index-Dp8ExwuL.js → index-BewO9StC.js} +1 -1
  3. package/dist/{index-C28lnh2e.js → index-ClxO69TM.js} +1 -1
  4. package/dist/index-DHKZJQyN.js +11 -0
  5. package/dist/index.min.css +1 -1
  6. package/dist/index.system.min.js +1 -1
  7. package/dist/{wang-editor-DDVqSnRX.js → wang-editor-BYeoazrn.js} +1 -1
  8. package/dist/{xlsx-util-BMANxyk-.js → xlsx-util-DpgMzatq.js} +1 -1
  9. package/es/control/form/form-detail/form-item/form-item-container/form-item-container.mjs +42 -8
  10. package/es/editor/code/code-editor.controller.mjs +72 -25
  11. package/es/editor/code/monaco-editor/monaco-editor.css +1 -1
  12. package/es/editor/code/monaco-editor/monaco-editor.mjs +20 -8
  13. package/es/editor/html/html-editor.controller.mjs +49 -4
  14. package/es/editor/html/wang-editor/wang-editor.mjs +7 -1
  15. package/es/editor/markdown/ibiz-markdown-editor/custom-menu.mjs +5 -7
  16. package/es/editor/markdown/ibiz-markdown-editor/ibiz-markdown-editor.css +1 -1
  17. package/es/editor/markdown/ibiz-markdown-editor/ibiz-markdown-editor.mjs +42 -4
  18. package/es/editor/markdown/markdown-editor.controller.mjs +111 -6
  19. package/es/locale/en/index.mjs +5 -2
  20. package/es/locale/zh-CN/index.mjs +5 -2
  21. package/es/util/inline-ai-util/inline-ai-textarea/inline-ai-textarea.css +1 -1
  22. package/es/util/inline-ai-util/inline-ai-textarea/inline-ai-textarea.hook.mjs +76 -21
  23. package/es/util/inline-ai-util/inline-ai-textarea/inline-ai-textarea.mjs +48 -33
  24. package/lib/control/form/form-detail/form-item/form-item-container/form-item-container.cjs +42 -8
  25. package/lib/editor/code/code-editor.controller.cjs +72 -25
  26. package/lib/editor/code/monaco-editor/monaco-editor.cjs +20 -8
  27. package/lib/editor/code/monaco-editor/monaco-editor.css +1 -1
  28. package/lib/editor/html/html-editor.controller.cjs +49 -4
  29. package/lib/editor/html/wang-editor/wang-editor.cjs +7 -1
  30. package/lib/editor/markdown/ibiz-markdown-editor/custom-menu.cjs +5 -7
  31. package/lib/editor/markdown/ibiz-markdown-editor/ibiz-markdown-editor.cjs +42 -4
  32. package/lib/editor/markdown/ibiz-markdown-editor/ibiz-markdown-editor.css +1 -1
  33. package/lib/editor/markdown/markdown-editor.controller.cjs +111 -6
  34. package/lib/locale/en/index.cjs +5 -2
  35. package/lib/locale/zh-CN/index.cjs +5 -2
  36. package/lib/util/inline-ai-util/inline-ai-textarea/inline-ai-textarea.cjs +48 -33
  37. package/lib/util/inline-ai-util/inline-ai-textarea/inline-ai-textarea.css +1 -1
  38. package/lib/util/inline-ai-util/inline-ai-textarea/inline-ai-textarea.hook.cjs +76 -21
  39. package/package.json +4 -4
  40. package/dist/ibiz-markdown-editor-qRaayafj.js +0 -1
  41. package/dist/index-BiYphJ2f.js +0 -11
@@ -43,6 +43,13 @@ class CodeEditorController extends runtime.EditorController {
43
43
  * @memberof CodeEditorController
44
44
  */
45
45
  __publicField(this, "currentSelection");
46
+ /**
47
+ * AI 聊天自填模式
48
+ *
49
+ * @type {boolean}
50
+ * @memberof CodeEditorController
51
+ */
52
+ __publicField(this, "chatCompletion", false);
46
53
  }
47
54
  /**
48
55
  * 语言类型
@@ -78,6 +85,11 @@ class CodeEditorController extends runtime.EditorController {
78
85
  appDataEntityId,
79
86
  this.context.srfappid
80
87
  );
88
+ if (this.deACMode) {
89
+ if (this.deACMode.actype === "CHATCOMPLETION") {
90
+ this.chatCompletion = true;
91
+ }
92
+ }
81
93
  }
82
94
  /**
83
95
  * editor 创建完成
@@ -107,33 +119,38 @@ class CodeEditorController extends runtime.EditorController {
107
119
  * @param {string} text 文本
108
120
  */
109
121
  insertText(text) {
110
- var _a, _b, _c, _d, _e, _f;
111
- const model = (_a = this.editor) == null ? void 0 : _a.getModel();
112
- if (!model || !this.monaco)
122
+ var _a, _b, _c, _d;
123
+ if (!this.editor || !this.monaco) {
124
+ throw new core.RuntimeError(ibiz.i18n.t("editor.code.editorNotInit"));
125
+ }
126
+ const selections = this.editor.getSelections();
127
+ if (!selections || selections.length === 0)
113
128
  return;
114
- const lastLineNumber = model.getLineCount();
115
- const lastLineContent = model.getLineContent(lastLineNumber);
116
- const lastColumn = lastLineContent.length + 1;
117
- (_b = this.editor) == null ? void 0 : _b.executeEdits("", [
129
+ const activeSelection = selections[selections.length - 1];
130
+ const insertLine = activeSelection.positionLineNumber;
131
+ const insertColumn = activeSelection.positionColumn;
132
+ const formattedText = "\n".concat(text, "\n");
133
+ (_a = this.editor) == null ? void 0 : _a.executeEdits("", [
118
134
  {
119
135
  range: new this.monaco.Range(
120
- lastLineNumber,
121
- lastColumn,
122
- lastLineNumber,
123
- lastColumn
136
+ insertLine,
137
+ insertColumn,
138
+ insertLine,
139
+ insertColumn
140
+ // 光标位置纯插入,不替换任何内容
124
141
  ),
125
- text
142
+ text: formattedText
126
143
  }
127
144
  ]);
128
- const newLastLine = lastLineNumber + (text.includes("\n") ? 1 : 0);
129
- const newLastColumn = ((_c = text.split("\n").pop()) == null ? void 0 : _c.length) || 0;
130
- (_d = this.editor) == null ? void 0 : _d.setPosition(
131
- new this.monaco.Position(newLastLine, newLastColumn)
132
- );
133
- (_e = this.editor) == null ? void 0 : _e.revealPositionInCenter(
134
- new this.monaco.Position(newLastLine, newLastColumn)
135
- );
136
- (_f = this.editor) == null ? void 0 : _f.focus();
145
+ const linesInText = formattedText.split("\n");
146
+ const linesAdded = linesInText.length - 1;
147
+ const lastLineOfInsert = insertLine + linesAdded - 1;
148
+ const lastLineContent = linesInText[linesInText.length - 2] || "";
149
+ const newColumn = lastLineContent.length + 1;
150
+ const newPosition = new this.monaco.Position(lastLineOfInsert, newColumn);
151
+ (_b = this.editor) == null ? void 0 : _b.setPosition(newPosition);
152
+ (_c = this.editor) == null ? void 0 : _c.revealPositionInCenter(newPosition);
153
+ (_d = this.editor) == null ? void 0 : _d.focus();
137
154
  }
138
155
  /**
139
156
  * 替换选中文本
@@ -181,11 +198,37 @@ class CodeEditorController extends runtime.EditorController {
181
198
  var _a;
182
199
  (_a = this.editor) == null ? void 0 : _a.focus();
183
200
  }
201
+ /**
202
+ * 获取内联AI编辑器元素
203
+ */
204
+ getInLineAiEditorElement() {
205
+ if (!this.editor) {
206
+ throw new core.RuntimeError(ibiz.i18n.t("editor.code.editorNotInit"));
207
+ }
208
+ return this.editor.getDomNode();
209
+ }
210
+ /**
211
+ * 获取内联AI编辑器主题
212
+ */
213
+ getInLineAiEditorTheme() {
214
+ var _a, _b, _c;
215
+ const currentTheme = (_c = (_b = (_a = this.editor) == null ? void 0 : _a._themeService) == null ? void 0 : _b._theme) == null ? void 0 : _c.themeName;
216
+ switch (currentTheme) {
217
+ case "vs-dark":
218
+ return "dark";
219
+ case "vs":
220
+ default:
221
+ return "light";
222
+ }
223
+ }
184
224
  /**
185
225
  * 获取内联AI聊天参数
186
226
  */
187
227
  getInLineAiChatOptions() {
188
228
  var _a, _b, _c, _d, _e, _f;
229
+ if (!this.editor || !this.monaco) {
230
+ throw new core.RuntimeError(ibiz.i18n.t("editor.code.editorNotInit"));
231
+ }
189
232
  const contentArea = (_b = (_a = this.editor) == null ? void 0 : _a.getDomNode()) == null ? void 0 : _b.querySelector(".editor-scrollable");
190
233
  if (!contentArea) {
191
234
  throw new core.RuntimeError(ibiz.i18n.t("editor.code.noEditorArea"));
@@ -203,12 +246,16 @@ class CodeEditorController extends runtime.EditorController {
203
246
  throw new core.RuntimeError(ibiz.i18n.t("editor.code.noSelCoords"));
204
247
  }
205
248
  const rect = contentArea.getBoundingClientRect();
249
+ const layoutInfo = this.editor.getLayoutInfo();
206
250
  return {
251
+ // 编辑器编辑区左侧距离
207
252
  left: rect.left,
208
- top: editorRect.top + coordinates.top + 28,
209
- // 减去 20px 的行高度及 8px 向下偏移
210
- width: rect.width - 160
211
- // 减去 左侧占位 右侧代码预览 边距
253
+ // 编辑器上方距离 + 选区距离编辑器上方距离 + 行高度
254
+ top: editorRect.top + coordinates.top + coordinates.height,
255
+ // 编辑器编辑区宽度 - 代码预览区宽度 - 代码预览区标尺宽度
256
+ width: rect.width - layoutInfo.minimap.minimapWidth - layoutInfo.overviewRuler.width,
257
+ editorElement: this.getInLineAiEditorElement(),
258
+ editorTheme: this.getInLineAiEditorTheme()
212
259
  };
213
260
  }
214
261
  /**
@@ -41,6 +41,7 @@ const IBizCode = /* @__PURE__ */ vue.defineComponent({
41
41
  [ns.cssVarBlockName("text-editor-toolbar-z-index")]: zIndex.increment()
42
42
  });
43
43
  const textTBVisible = vue.ref(false);
44
+ const editorTheme = vue.ref("");
44
45
  const editorModel = c.model;
45
46
  if (editorModel.editorParams) {
46
47
  if (editorModel.editorParams.enableEdit) {
@@ -74,8 +75,9 @@ const IBizCode = /* @__PURE__ */ vue.defineComponent({
74
75
  let decorationsCollection;
75
76
  let chatInstance;
76
77
  const getMonacoTheme = (name) => {
77
- var _a;
78
- const customTheme = (_a = c == null ? void 0 : c.editorParams) == null ? void 0 : _a.customTheme;
78
+ var _a, _b;
79
+ editorTheme.value = ((_a = c == null ? void 0 : c.editorParams) == null ? void 0 : _a.customTheme) || ibiz.config.codeEditorTheme || name;
80
+ const customTheme = (_b = c == null ? void 0 : c.editorParams) == null ? void 0 : _b.customTheme;
79
81
  if (customTheme) {
80
82
  return customTheme === "dark" ? "vs-dark" : "vs";
81
83
  }
@@ -342,13 +344,15 @@ const IBizCode = /* @__PURE__ */ vue.defineComponent({
342
344
  return;
343
345
  textTBStyle.value = {
344
346
  ...textTBStyle.value,
347
+ // 编辑器左侧距离 + 选区距离编辑器左侧距离
345
348
  [ns.cssVarBlockName("text-editor-toolbar-left")]: "".concat(editorRect.left + coordinates.left, "px"),
346
- [ns.cssVarBlockName("text-editor-toolbar-top")]: "".concat(editorRect.top + coordinates.top + 28, "px")
349
+ // 编辑器上方距离 + 选区距离编辑器上方距离 + 行高度
350
+ [ns.cssVarBlockName("text-editor-toolbar-top")]: "".concat(editorRect.top + coordinates.top + coordinates.height, "px")
347
351
  };
348
352
  }
349
353
  };
350
354
  const setTextTBVisible = () => {
351
- if (props.readonly || !enableEdit.value || !c.deACMode)
355
+ if (props.readonly || !enableEdit.value || !c.deACMode || !c.chatCompletion)
352
356
  return;
353
357
  const selection = editor == null ? void 0 : editor.getSelection();
354
358
  textTBVisible.value = !!(selection && !selection.isEmpty());
@@ -367,14 +371,21 @@ const IBizCode = /* @__PURE__ */ vue.defineComponent({
367
371
  return;
368
372
  const coordinates = editor == null ? void 0 : editor.getScrolledVisiblePosition(position);
369
373
  const editorRect = (_b = editor == null ? void 0 : editor.getDomNode()) == null ? void 0 : _b.getBoundingClientRect();
370
- if (!coordinates || !editorRect)
374
+ const textTBHeight = textTBRef.value.offsetHeight;
375
+ if (!coordinates || !editorRect || !textTBHeight)
371
376
  return;
372
377
  const items = ibiz.inLineAIUtil.calcContextMenus(c.deACMode, (tag) => {
373
378
  c.doInLineAIUIAction(tag, c.model.appId);
374
379
  });
375
380
  if (items.length === 0)
376
381
  return;
377
- ibiz.inLineAIUtil.showContextMenus(editorRect.left + coordinates.left, editorRect.top + coordinates.top + 28 + 40, items);
382
+ ibiz.inLineAIUtil.showContextMenus(
383
+ // 编辑器左侧距离 + 选区距离编辑器左侧距离
384
+ editorRect.left + coordinates.left,
385
+ // 编辑器上方距离 + 选区距离编辑器上方距离 + 行高度 + 工具栏高度
386
+ editorRect.top + coordinates.top + coordinates.height + textTBHeight,
387
+ items
388
+ );
378
389
  };
379
390
  const handleEditorClick = (e) => {
380
391
  var _a;
@@ -651,6 +662,7 @@ const IBizCode = /* @__PURE__ */ vue.defineComponent({
651
662
  readonlyState,
652
663
  isLoading,
653
664
  textTBRef,
665
+ editorTheme,
654
666
  renderFooter,
655
667
  renderHeaderToolbar,
656
668
  renderTextEditorToolbar,
@@ -662,7 +674,7 @@ const IBizCode = /* @__PURE__ */ vue.defineComponent({
662
674
  var _a, _b;
663
675
  const isLoading = !((_b = (_a = this.controller.view) == null ? void 0 : _a.state) == null ? void 0 : _b.isLoading) && this.isLoading;
664
676
  return !this.isFullScreen ? vue.withDirectives(vue.createVNode("div", {
665
- "class": [this.ns.b(), {
677
+ "class": [this.ns.b(), this.ns.is(this.editorTheme, !!this.editorTheme), {
666
678
  [this.ns.b("editor-readonly")]: this.readonlyState
667
679
  }, {
668
680
  [this.ns.b("editor-enable")]: !this.readonlyState
@@ -674,7 +686,7 @@ const IBizCode = /* @__PURE__ */ vue.defineComponent({
674
686
  "onClose": () => this.changeFullScreenState()
675
687
  }, {
676
688
  default: () => [vue.withDirectives(vue.createVNode("div", {
677
- "class": [this.ns.b(), {
689
+ "class": [this.ns.b(), this.ns.is(this.editorTheme, !!this.editorTheme), {
678
690
  [this.ns.b("editor-readonly")]: this.readonlyState
679
691
  }, {
680
692
  [this.ns.b("editor-enable")]: !this.readonlyState
@@ -1 +1 @@
1
- .ibiz-code{display:flex;flex-direction:column;width:100%;height:100%}.ibiz-code__box{width:100%;height:100%;min-height:200px;overflow:hidden}.ibiz-code__first-prompt::before{padding-right:var(--ibiz-spacing-base);content:var(--ibiz-code-placeholder)}.ibiz-code-toolbar{position:absolute;top:4px;right:18px;z-index:10;display:flex;align-items:center;justify-content:end;width:auto;height:auto;padding-right:0;font-size:var(--ibiz-font-size-header-6)}.ibiz-code-toolbar>*+*{margin-left:var(--ibiz-spacing-base-loose)}.ibiz-code-toolbar__fullscreen{height:38px;padding:0 12px;font-size:var(--ibiz-font-size-regular);font-style:normal;line-height:2.8;cursor:pointer}.ibiz-code-toolbar__fullscreen:hover{background-color:var(--ibiz-color-bg-3)}.ibiz-code-footer{--ibiz-code-height-text-editor-toolbar:40px;--ibiz-code-footer-toolbar-height:36px;--ibiz-code-footer-button-height:36px;--ibiz-code-text-editor-toolbar-z-index:1;--ibiz-code-text-editor-toolbar-left:0;--ibiz-code-text-editor-toolbar-top:0;display:flex;align-items:center;justify-content:end;width:100%;min-height:var(--ibiz-code-footer-toolbar-height);margin-top:var(--ibiz-spacing-base-tight);margin-right:var(--ibiz-spacing-tight)}.ibiz-code-footer>*+*{margin-left:var(--ibiz-spacing-base)}.ibiz-code-footer__cancel{height:var(--ibiz-code-footer-button-height);line-height:var(--ibiz-code-footer-button-height);color:var(--ibiz-color-text-1);cursor:pointer;opacity:.7}.ibiz-code-footer__cancel:hover{color:var(--ibiz-color-primary);opacity:1}.ibiz-code-footer__save{width:96px;height:var(--ibiz-code-footer-button-height);line-height:var(--ibiz-code-footer-button-height);color:var(--ibiz-color-primary-active-text);text-align:center;cursor:pointer;background-color:var(--ibiz-color-primary);border-radius:var(--ibiz-border-radius-small)}.ibiz-code-footer__save:hover{box-shadow:0 2px 5px 1px var(--ibiz-color-primary)}.ibiz-code-message{width:500px;max-width:unset}.ibiz-code-message__message-content--message-tip{color:var(--ibiz-color-text-3)}.ibiz-code-message__message-cancel{color:var(--ibiz-color-text-1);background-color:transparent}.ibiz-code-message__message-cancel:hover{color:var(--ibiz-color-primary);background-color:transparent}.ibiz-code-message__message-comfire{background-color:var(--ibiz-color-danger)!important}.ibiz-code-message__message-comfire:hover{box-shadow:0 2px 5px 1px var(--ibiz-color-danger)}.ibiz-code-editor-enable{--ibiz-code-height-text-editor-toolbar:40px;--ibiz-code-footer-toolbar-height:36px;--ibiz-code-footer-button-height:36px;--ibiz-code-text-editor-toolbar-z-index:1;--ibiz-code-text-editor-toolbar-left:0;--ibiz-code-text-editor-toolbar-top:0}.ibiz-code-editor-enable .ibiz-code__box{height:100%}.ibiz-code-editor-enable:has(.ibiz-code-footer) .ibiz-code__box{height:calc(100% - var(--ibiz-code-footer-toolbar-height))}.ibiz-code-dialog-full-screen{width:100%!important;height:100%!important;margin:0!important}.ibiz-code-dialog-full-screen .ibiz-code-footer{--ibiz-code-footer-toolbar-height:68px}.ibiz-code-dialog-full-screen .ibiz-code{gap:0;padding:0 var(--ibiz-spacing-extra-loose);--w-e-toolbar-bg-color:var(--ibiz-color-bg-0)}.ibiz-code-dialog-full-screen .ibiz-code .ibiz-code-toolbar{right:calc(var(--ibiz-spacing-extra-loose) + 18px)}.ibiz-code-dialog-full-screen .el-dialog__header{display:none!important}.ibiz-code-dialog-full-screen .el-dialog__body{width:100%;height:100%;padding:0 0 var(--ibiz-spacing-base)}.ibiz-code-dialog-full-screen .el-dialog__body:has(.ibiz-code-footer){padding-bottom:0}.ibiz-code-footer-dialog{margin-top:0}.ibiz-code-text-editor-toolbar{--ibiz-code-height-text-editor-toolbar:40px;--ibiz-code-footer-toolbar-height:36px;--ibiz-code-footer-button-height:36px;--ibiz-code-text-editor-toolbar-z-index:1;--ibiz-code-text-editor-toolbar-left:0;--ibiz-code-text-editor-toolbar-top:0;position:fixed;top:var(--ibiz-code-text-editor-toolbar-top);left:var(--ibiz-code-text-editor-toolbar-left);z-index:var(--ibiz-code-text-editor-toolbar-z-index);display:flex;gap:var(--ibiz-spacing-tight);height:var(--ibiz-code-height-text-editor-toolbar);padding:var(--ibiz-spacing-extra-tight);font-size:var(--ibiz-font-size-regular);background-color:var(--ibiz-color-bg-2);border-radius:var(--ibiz-border-radius-extra-small);box-shadow:var(--ibiz-shadow-elevated)}.ibiz-code-text-editor-toolbar__item{display:flex;align-items:center;justify-content:center;padding:var(--ibiz-spacing-extra-tight) var(--ibiz-spacing-tight);cursor:pointer;border-radius:var(--ibiz-border-radius-extra-small)}.ibiz-code-text-editor-toolbar__item:hover{color:var(--ibiz-color-primary);background-color:var(--ibiz-color-primary-light-default)}
1
+ .ibiz-code{--ibiz-code-color-text-editor-toolbar-bg:var(--ibiz-color-bg-2);--ibiz-code-color-text-editor-toolbar-text:var(--ibiz-color-text-0);--ibiz-code-color-text-editor-toolbar-item-bg-hover:var(--ibiz-color-primary-light-default);--ibiz-code-color-text-editor-toolbar-item-text-hover:var(--ibiz-color-primary);--ibiz-code-height-text-editor-toolbar:40px;--ibiz-code-footer-toolbar-height:36px;--ibiz-code-footer-button-height:36px;--ibiz-code-spacing-code-text-editor-toolbar-padding:var(--ibiz-spacing-extra-tight);--ibiz-code-spacing-code-text-editor-toolbar-item-padding:var(--ibiz-spacing-extra-tight) var(--ibiz-spacing-tight);--ibiz-code-spacing-code-text-editor-toolbar-circle:var(--ibiz-border-radius-extra-small);--ibiz-code-spacing-code-text-editor-toolbar-item-circle:var(--ibiz-border-radius-extra-small);--ibiz-code-text-editor-toolbar-z-index:1;--ibiz-code-text-editor-toolbar-left:0;--ibiz-code-text-editor-toolbar-top:0;display:flex;flex-direction:column;width:100%;height:100%}.ibiz-code__box{width:100%;height:100%;min-height:200px;overflow:hidden}.ibiz-code__first-prompt::before{padding-right:var(--ibiz-spacing-base);content:var(--ibiz-code-placeholder)}.ibiz-code-toolbar{position:absolute;top:4px;right:18px;z-index:10;display:flex;align-items:center;justify-content:end;width:auto;height:auto;padding-right:0;font-size:var(--ibiz-font-size-header-6)}.ibiz-code-toolbar>*+*{margin-left:var(--ibiz-spacing-base-loose)}.ibiz-code-toolbar__fullscreen{height:38px;padding:0 12px;font-size:var(--ibiz-font-size-regular);font-style:normal;line-height:2.8;cursor:pointer}.ibiz-code-toolbar__fullscreen:hover{background-color:var(--ibiz-color-bg-3)}.ibiz-code-footer{display:flex;align-items:center;justify-content:end;width:100%;min-height:var(--ibiz-code-footer-toolbar-height);margin-top:var(--ibiz-spacing-base-tight);margin-right:var(--ibiz-spacing-tight)}.ibiz-code-footer>*+*{margin-left:var(--ibiz-spacing-base)}.ibiz-code-footer__cancel{height:var(--ibiz-code-footer-button-height);line-height:var(--ibiz-code-footer-button-height);color:var(--ibiz-color-text-1);cursor:pointer;opacity:.7}.ibiz-code-footer__cancel:hover{color:var(--ibiz-color-primary);opacity:1}.ibiz-code-footer__save{width:96px;height:var(--ibiz-code-footer-button-height);line-height:var(--ibiz-code-footer-button-height);color:var(--ibiz-color-primary-active-text);text-align:center;cursor:pointer;background-color:var(--ibiz-color-primary);border-radius:var(--ibiz-border-radius-small)}.ibiz-code-footer__save:hover{box-shadow:0 2px 5px 1px var(--ibiz-color-primary)}.ibiz-code-message{width:500px;max-width:unset}.ibiz-code-message__message-content--message-tip{color:var(--ibiz-color-text-3)}.ibiz-code-message__message-cancel{color:var(--ibiz-color-text-1);background-color:transparent}.ibiz-code-message__message-cancel:hover{color:var(--ibiz-color-primary);background-color:transparent}.ibiz-code-message__message-comfire{background-color:var(--ibiz-color-danger)!important}.ibiz-code-message__message-comfire:hover{box-shadow:0 2px 5px 1px var(--ibiz-color-danger)}.ibiz-code-editor-enable .ibiz-code__box{height:100%}.ibiz-code-editor-enable:has(.ibiz-code-footer) .ibiz-code__box{height:calc(100% - var(--ibiz-code-footer-toolbar-height))}.ibiz-code-dialog-full-screen{width:100%!important;height:100%!important;margin:0!important}.ibiz-code-dialog-full-screen .ibiz-code-footer{--ibiz-code-footer-toolbar-height:68px}.ibiz-code-dialog-full-screen .ibiz-code{gap:0;padding:0 var(--ibiz-spacing-extra-loose);--w-e-toolbar-bg-color:var(--ibiz-color-bg-0)}.ibiz-code-dialog-full-screen .ibiz-code .ibiz-code-toolbar{right:calc(var(--ibiz-spacing-extra-loose) + 18px)}.ibiz-code-dialog-full-screen .el-dialog__header{display:none!important}.ibiz-code-dialog-full-screen .el-dialog__body{width:100%;height:100%;padding:0 0 var(--ibiz-spacing-base)}.ibiz-code-dialog-full-screen .el-dialog__body:has(.ibiz-code-footer){padding-bottom:0}.ibiz-code-footer-dialog{margin-top:0}.ibiz-code-text-editor-toolbar{position:fixed;top:var(--ibiz-code-text-editor-toolbar-top);left:var(--ibiz-code-text-editor-toolbar-left);z-index:var(--ibiz-code-text-editor-toolbar-z-index);display:flex;gap:var(--ibiz-spacing-tight);height:var(--ibiz-code-height-text-editor-toolbar);padding:var(--ibiz-code-spacing-code-text-editor-toolbar-padding);font-size:var(--ibiz-font-size-regular);color:var(--ibiz-code-color-text-editor-toolbar-text);background-color:var(--ibiz-code-color-text-editor-toolbar-bg);border-radius:var(--ibiz-code-spacing-code-text-editor-toolbar-circle);box-shadow:var(--ibiz-shadow-elevated)}.ibiz-code-text-editor-toolbar__item{display:flex;align-items:center;justify-content:center;padding:var(--ibiz-code-spacing-code-text-editor-toolbar-item-padding);cursor:pointer;border-radius:var(--ibiz-code-spacing-code-text-editor-toolbar-item-circle)}.ibiz-code-text-editor-toolbar__item:hover{color:var(--ibiz-code-color-text-editor-toolbar-item-text-hover);background-color:var(--ibiz-code-color-text-editor-toolbar-item-bg-hover)}.ibiz-code.is-dark{--ibiz-code-color-text-editor-toolbar-bg:rgb(53, 54, 60);--ibiz-code-color-text-editor-toolbar-text:rgb(249, 249, 249);--ibiz-code-color-text-editor-toolbar-item-bg-hover:rgba(255, 255, 255, 0.12);--ibiz-code-color-text-editor-toolbar-item-text-hover:rgb(249, 249, 249)}
@@ -300,7 +300,24 @@ class HtmlEditorController extends runtime.EditorController {
300
300
  */
301
301
  insertText(text) {
302
302
  if (this.wangEditor) {
303
- this.wangEditor.insertText(text);
303
+ const newParagraph = {
304
+ type: "paragraph",
305
+ children: [{ text }]
306
+ };
307
+ const selection = this.wangEditor.selection;
308
+ if (selection) {
309
+ const collapsedSelection = {
310
+ anchor: selection.anchor,
311
+ focus: selection.anchor
312
+ };
313
+ if (selection.anchor.path !== selection.focus.path || selection.anchor.offset !== selection.focus.offset) {
314
+ collapsedSelection.anchor = selection.focus;
315
+ collapsedSelection.focus = selection.focus;
316
+ }
317
+ this.wangEditor.select(collapsedSelection);
318
+ }
319
+ this.wangEditor.insertNode(newParagraph);
320
+ this.wangEditor.move(1);
304
321
  }
305
322
  }
306
323
  /**
@@ -309,8 +326,12 @@ class HtmlEditorController extends runtime.EditorController {
309
326
  */
310
327
  replaceSelectionText(text) {
311
328
  if (this.wangEditor) {
312
- this.wangEditor.deleteFragment();
313
- this.wangEditor.insertText(text);
329
+ if (this.wangEditor.selection) {
330
+ this.wangEditor.deleteFragment();
331
+ this.wangEditor.insertText(text);
332
+ } else {
333
+ this.wangEditor.insertText(text);
334
+ }
314
335
  }
315
336
  }
316
337
  /**
@@ -321,6 +342,25 @@ class HtmlEditorController extends runtime.EditorController {
321
342
  this.wangEditor.restoreSelection();
322
343
  }
323
344
  }
345
+ /**
346
+ * 获取内联AI编辑器元素
347
+ */
348
+ getInLineAiEditorElement() {
349
+ if (!this.wangEditor) {
350
+ throw new core.RuntimeError("\u7F16\u8F91\u5668\u672A\u521D\u59CB\u5316");
351
+ }
352
+ return this.wangEditor.getEditableContainer();
353
+ }
354
+ /**
355
+ * 获取内联AI编辑器主题
356
+ */
357
+ getInLineAiEditorTheme() {
358
+ const appTheme = ibiz.util.theme.getTheme();
359
+ if (appTheme.indexOf("dark") !== -1) {
360
+ return "dark";
361
+ }
362
+ return "light";
363
+ }
324
364
  /**
325
365
  * 获取内联AI参数
326
366
  */
@@ -333,9 +373,14 @@ class HtmlEditorController extends runtime.EditorController {
333
373
  throw new core.RuntimeError("\u83B7\u53D6\u9009\u533A\u4F4D\u7F6E\u5931\u8D25");
334
374
  const editorBoundingClientRect = this.wangEditor.getEditableContainer().getBoundingClientRect();
335
375
  return {
376
+ // 编辑器的左侧距离 + 默认padding
336
377
  left: editorBoundingClientRect.x + 10,
378
+ // 编辑器的上方距离+选区距离编辑器上方距离
337
379
  top: editorBoundingClientRect.y + Number(selectionPosition.top.replace("px", "")),
338
- width: editorBoundingClientRect.width - 20
380
+ // 编辑器的宽度 - 左右padding
381
+ width: editorBoundingClientRect.width - 20,
382
+ editorElement: this.getInLineAiEditorElement(),
383
+ editorTheme: this.getInLineAiEditorTheme()
339
384
  };
340
385
  }
341
386
  /**
@@ -433,7 +433,13 @@ const IBizHtml = /* @__PURE__ */ vue.defineComponent({
433
433
  if (items.length === 0)
434
434
  return;
435
435
  const editorBoundingClientRect = editor.getEditableContainer().getBoundingClientRect();
436
- ibiz.inLineAIUtil.showContextMenus(editorBoundingClientRect.x + Number(selectionPosition.left.replace("px", "")), editorBoundingClientRect.y + Number(selectionPosition.top.replace("px", "")) + 60, items);
436
+ ibiz.inLineAIUtil.showContextMenus(
437
+ // 编辑器的左侧距离+选区距离编辑器左侧距离
438
+ editorBoundingClientRect.x + Number(selectionPosition.left.replace("px", "")),
439
+ // 编辑器的上方距离+选区距离编辑器上方距离+悬浮工具栏高度
440
+ editorBoundingClientRect.y + Number(selectionPosition.top.replace("px", "")) + 42,
441
+ items
442
+ );
437
443
  });
438
444
  };
439
445
  const handleChange = (editor) => {
@@ -11,15 +11,11 @@ function initCustomMenu(c) {
11
11
  content: "<svg\n viewBox='0 0 16 16'\n xmlns='http://www.w3.org/2000/svg'\n fill='currentColor'\n height='1em'\n width='1em'\n preserveAspectRatio='xMidYMid meet'\n focusable='false'\n >\n <g\n id='aae1.Base\u57FA\u7840/1.icon\u56FE\u6807/2.normal/ai-star'\n stroke-width='1'\n fill-rule='evenodd'\n >\n <path\n d='M5.817 1.53l3.158 8.797h.054v.152l1.443 4.021-1.402.001-1.041-2.982H2.495l-1.03 2.982L0 14.5 4.671 1.533l1.146-.003zm7.86 5.424V14.5h-1.213V6.954h1.212zM5.248 3.549l-2.342 6.778h4.706L5.249 3.55zM13.046 0c.075 0 .147.02.204.071a.318.318 0 01.094.181l.064.273c.097.417.17.727.255.968.084.24.177.4.31.523.134.124.318.218.599.306.281.088.65.166 1.15.265a.358.358 0 01.195.095c.056.057.083.13.083.213a.289.289 0 01-.083.21.362.362 0 01-.197.094c-.528.093-.918.167-1.214.255-.295.088-.485.187-.621.324-.137.138-.23.324-.31.606-.08.283-.145.651-.23 1.147a.329.329 0 01-.093.184.293.293 0 01-.206.075.308.308 0 01-.207-.072.322.322 0 01-.1-.188l-.006-.033c-.085-.486-.149-.845-.228-1.12-.079-.274-.17-.452-.305-.585-.135-.133-.323-.23-.618-.32s-.683-.168-1.21-.273a.353.353 0 01-.2-.096.29.29 0 01-.08-.208c0-.079.023-.153.079-.211a.35.35 0 01.2-.097c.5-.098.869-.176 1.15-.263.282-.087.465-.18.597-.302.132-.12.224-.278.306-.511.082-.236.151-.539.244-.947l.071-.312a.312.312 0 01.102-.183.311.311 0 01.205-.069z'\n id='aae\u5F62\u72B6\u7ED3\u5408'\n ></path>\n </g>\n </svg>\n "
12
12
  },
13
13
  onClick: (_selection, _menukey, event) => {
14
- var _a, _b;
15
- const startPos = (_a = c.mdeditor) == null ? void 0 : _a.editor.editor.getCursor("start");
16
- const endPos = (_b = c.mdeditor) == null ? void 0 : _b.editor.editor.getCursor("end");
17
- c.setCursorPos(startPos, endPos);
18
14
  event.stopPropagation();
19
15
  event.preventDefault();
20
16
  vue.nextTick(() => {
21
- var _a2;
22
- if ((_a2 = c.mdeditor) == null ? void 0 : _a2.bubble) {
17
+ var _a;
18
+ if ((_a = c.mdeditor) == null ? void 0 : _a.bubble) {
23
19
  c.mdeditor.bubble.visible = true;
24
20
  const selectionPosition = c.mdeditor.bubble.bubbleDom.getBoundingClientRect();
25
21
  if (!selectionPosition || !selectionPosition.left || !selectionPosition.top)
@@ -33,8 +29,10 @@ function initCustomMenu(c) {
33
29
  if (items.length === 0)
34
30
  return;
35
31
  ibiz.inLineAIUtil.showContextMenus(
32
+ // 浮动工具栏的左侧距离
36
33
  selectionPosition.left,
37
- selectionPosition.top + 60,
34
+ // 浮动工具栏的顶部距离 + 浮动工具栏的高度
35
+ selectionPosition.top + 43,
38
36
  items
39
37
  );
40
38
  }
@@ -215,12 +215,37 @@ const IBizMarkDown = /* @__PURE__ */ vue.defineComponent({
215
215
  const handleKeyDown = (_e) => {
216
216
  _e.stopPropagation();
217
217
  if (_e.key === "Escape") {
218
+ _e.preventDefault();
218
219
  if (isFullscreen()) {
219
220
  closeFullscreen();
220
221
  isFullScreen.value = false;
221
222
  }
222
223
  }
223
224
  };
225
+ const changeMainTheme = (_theme) => {
226
+ c == null ? void 0 : c.setCurrentEditorTheme(_theme);
227
+ };
228
+ const selectionChange = (event) => {
229
+ var _a2, _b2;
230
+ const {
231
+ info
232
+ } = event;
233
+ let isForwardSelection = true;
234
+ const firstRange = info.ranges && info.ranges[0];
235
+ if (!firstRange) {
236
+ isForwardSelection = true;
237
+ } else {
238
+ const {
239
+ anchor,
240
+ head
241
+ } = firstRange;
242
+ isForwardSelection = c.isPositionBefore(anchor, head);
243
+ }
244
+ const startPos = (_a2 = c.mdeditor) == null ? void 0 : _a2.editor.editor.getCursor("start");
245
+ const endPos = (_b2 = c.mdeditor) == null ? void 0 : _b2.editor.editor.getCursor("end");
246
+ c.setCursorPos(startPos, endPos);
247
+ c.setSelectionDirection(isForwardSelection);
248
+ };
224
249
  const editorInit = () => {
225
250
  if (props.disabled || props.readonly || showmode === "manual") {
226
251
  defaultModel.value = "previewOnly";
@@ -228,7 +253,7 @@ const IBizMarkDown = /* @__PURE__ */ vue.defineComponent({
228
253
  vue.nextTick(() => {
229
254
  var _a2;
230
255
  const bubble = ["bold", "italic", "underline", "strikethrough", "sub", "sup", "|", "size", "color"];
231
- if (c.editorParams.ac && c.deACMode) {
256
+ if (c && c.chatCompletion) {
232
257
  bubble.unshift("AI");
233
258
  }
234
259
  editor = new Cherry({
@@ -294,6 +319,10 @@ const IBizMarkDown = /* @__PURE__ */ vue.defineComponent({
294
319
  afterChange,
295
320
  beforeImageMounted
296
321
  },
322
+ event: {
323
+ changeMainTheme,
324
+ selectionChange
325
+ },
297
326
  engine: {
298
327
  syntax: {
299
328
  table: {
@@ -314,7 +343,7 @@ const IBizMarkDown = /* @__PURE__ */ vue.defineComponent({
314
343
  span.appendChild(createCherryIcon("fullscreen"));
315
344
  const parentElement = props.disabled ? editor.editor.options.editorDom.parentElement : (_a2 = editor.editor.options.editorDom.parentElement) == null ? void 0 : _a2.querySelector(".cherry-toolbar>.toolbar-right");
316
345
  parentElement == null ? void 0 : parentElement.appendChild(span);
317
- c.setMDEditor(editor);
346
+ c == null ? void 0 : c.setMDEditor(editor);
318
347
  });
319
348
  };
320
349
  vue.watch(() => UIStore.theme, (newVal) => {
@@ -370,9 +399,14 @@ const IBizMarkDown = /* @__PURE__ */ vue.defineComponent({
370
399
  isIgnoreChange = false;
371
400
  onResetEditState();
372
401
  };
402
+ const onFocusEditor = () => {
403
+ const target = document.getElementById(id);
404
+ target == null ? void 0 : target.focus();
405
+ };
373
406
  const renderHeader = () => {
374
407
  if (showmode === "manual" && !isEditing.value) {
375
408
  return vue.createVNode("div", {
409
+ "onClick": onFocusEditor,
376
410
  "class": [ns.e("header"), ns.is("fullscreen", isFullScreen.value)]
377
411
  }, [!props.disabled && !props.readonly && vue.createVNode("div", {
378
412
  "class": ns.em("header", "edit"),
@@ -398,6 +432,7 @@ const IBizMarkDown = /* @__PURE__ */ vue.defineComponent({
398
432
  const renderFooter = () => {
399
433
  if (showmode === "manual" && isEditing.value && !props.disabled && !props.readonly) {
400
434
  return vue.createVNode("div", {
435
+ "onClick": onFocusEditor,
401
436
  "class": [ns.e("footer"), ns.is("fullscreen", isFullScreen.value)]
402
437
  }, [vue.createVNode("div", {
403
438
  "class": ns.em("footer", "cancel"),
@@ -409,12 +444,14 @@ const IBizMarkDown = /* @__PURE__ */ vue.defineComponent({
409
444
  }
410
445
  };
411
446
  vue.onMounted(() => {
447
+ var _a2;
412
448
  editorInit();
413
449
  calcMarkDownStyle();
414
- document.addEventListener("keydown", handleKeyDown.bind(this));
450
+ (_a2 = markDownBox.value) == null ? void 0 : _a2.addEventListener("keydown", handleKeyDown.bind(this));
415
451
  });
416
452
  vue.onBeforeUnmount(() => {
417
- document.removeEventListener("keydown", handleKeyDown.bind(this));
453
+ var _a2;
454
+ (_a2 = markDownBox.value) == null ? void 0 : _a2.removeEventListener("keydown", handleKeyDown.bind(this));
418
455
  });
419
456
  vue.onUnmounted(() => {
420
457
  editor = null;
@@ -446,6 +483,7 @@ const IBizMarkDown = /* @__PURE__ */ vue.defineComponent({
446
483
  "ref": "markDownBox",
447
484
  "class": [this.ns.b(), this.ns.is("disabled", this.disabled), this.ns.is("manual", this.showmode === "manual"), this.ns.is("editing", this.isEditing)]
448
485
  }, [this.renderHeader(), this.renderFooter(), vue.createVNode("div", {
486
+ "tabindex": "-1",
449
487
  "id": this.id,
450
488
  "style": this.cssVars,
451
489
  "class": this.ns.b("cherry")
@@ -1 +1 @@
1
- .ibiz-markdown{--ibiz-markdown-width:100%;--ibiz-markdown-color-manual-toolbar-bg-save:var(--ibiz-color-primary);--ibiz-markdown-color-manual-toolbar-text-save:var(--ibiz-color-primary-active-text);--ibiz-markdown-color-manual-toolbar-text-cancel:var(--ibiz-color-text-1);--ibiz-markdown-color-manual-toolbar-text-cancel-hover:var(--ibiz-color-primary);--ibiz-markdown-spacing-manual-toolbar-height:32px;--ibiz-markdown-spacing-manual-toolbar-gap:var(--ibiz-spacing-base);--ibiz-markdown-spacing-manual-toolbar-item-padding:0 var(--ibiz-spacing-base);--ibiz-markdown-spacing-manual-toolbar-margin:var(--ibiz-spacing-base-tight) var(--ibiz-spacing-tight) 0 0;--ibiz-markdown-spacing-manual-toolbar-fullscreen-height:var(--ibiz-height-control-default);--ibiz-markdown-spacing-manual-toolbar-fullscreen-padding:0 var(--ibiz-spacing-extra-loose);--ibiz-markdown-spacing-manual-toolbar-fullscreen-height-header:var(--ibiz-spacing-super-loose);--ibiz-markdown-height-manual-toolbar-height:var(--ibiz-height-control-default);--ibiz-markdown-border-radius-manual-toolbar-item:var(--ibiz-border-radius-small);--ibiz-markdown-border-manual-toolbar-fullscreen-footer:1px solid var(--ibiz-color-border)}.ibiz-markdown__header{display:flex;flex-shrink:0;gap:var(--ibiz-markdown-spacing-manual-toolbar-gap);align-items:center;justify-content:end;height:var(--ibiz-markdown-spacing-manual-toolbar-height)}.ibiz-markdown__header--edit{cursor:pointer}.ibiz-markdown__header--full{cursor:pointer}.ibiz-markdown__header.is-fullscreen{position:fixed;top:0;right:0;left:0;z-index:999;width:100%;height:calc(var(--ibiz-markdown-spacing-manual-toolbar-fullscreen-height-header));padding:var(--ibiz-markdown-spacing-manual-toolbar-fullscreen-padding);margin-top:0;background-color:var(--ibiz-view-bg-color)}.ibiz-markdown__header.is-fullscreen+.ibiz-markdown-cherry .cherry.fullscreen{top:calc(var(--ibiz-markdown-spacing-manual-toolbar-fullscreen-height-header));height:calc(100% - var(--ibiz-markdown-spacing-manual-toolbar-fullscreen-height-header))}.ibiz-markdown__footer{display:flex;gap:var(--ibiz-markdown-spacing-manual-toolbar-gap);align-items:center;justify-content:end;height:var(--ibiz-markdown-spacing-manual-toolbar-height);margin:var(--ibiz-markdown-spacing-manual-toolbar-margin)}.ibiz-markdown__footer--save{height:var(--ibiz-markdown-height-manual-toolbar-height);padding:var(--ibiz-markdown-spacing-manual-toolbar-item-padding);line-height:var(--ibiz-markdown-height-manual-toolbar-height);color:var(--ibiz-markdown-color-manual-toolbar-text-save);text-align:center;cursor:pointer;background-color:var(--ibiz-markdown-color-manual-toolbar-bg-save);border-radius:var(--ibiz-markdown-border-radius-manual-toolbar-item)}.ibiz-markdown__footer--cancel{color:var(--ibiz-markdown-color-manual-toolbar-text-cancel);cursor:pointer}.ibiz-markdown__footer--cancel:hover{color:var(--ibiz-markdown-color-manual-toolbar-text-cancel-hover)}.ibiz-markdown__footer.is-fullscreen{position:fixed;right:0;bottom:0;left:0;z-index:999;width:100%;height:calc(var(--ibiz-markdown-spacing-manual-toolbar-fullscreen-height) * 2);padding:var(--ibiz-markdown-spacing-manual-toolbar-fullscreen-padding);margin-top:0;background-color:var(--ibiz-view-bg-color);border-top:var(--ibiz-markdown-border-manual-toolbar-fullscreen-footer)}.ibiz-markdown__footer.is-fullscreen+.ibiz-markdown-cherry .cherry.fullscreen{height:calc(100% - var(--ibiz-markdown-spacing-manual-toolbar-fullscreen-height) * 2)}.ibiz-markdown .ibiz-markdown-cherry{width:var(--ibiz-markdown-width)}.ibiz-markdown .ibiz-markdown-cherry .cherry{width:100%;border:1px solid var(--ibiz-color-border);box-shadow:none}.ibiz-markdown .ibiz-markdown-cherry .cherry .cherry-toolbar{background-color:var(--ibiz-color-bg-0);box-shadow:none}.ibiz-markdown .ibiz-markdown-cherry .cherry .cherry-editor{border-top:1px solid var(--ibiz-color-border)}.ibiz-markdown .ibiz-markdown-cherry .cherry .cherry-previewer{border-top:1px solid var(--ibiz-color-border)}.ibiz-markdown .ibiz-markdown-cherry .cherry .cherry-sidebar{border-left:1px solid var(--ibiz-color-border);box-shadow:none}.ibiz-markdown.is-disabled .cherry{min-height:auto}.ibiz-markdown.is-disabled .ibiz-markdown__fullscreen{position:absolute;top:8px;right:12px;z-index:98;font-size:var(--ibiz-font-size-regular);line-height:2.8}.ibiz-markdown.is-disabled .theme__dark .ibiz-markdown__fullscreen{color:var(--ibiz-color-text-0)}.ibiz-markdown.is-disabled .theme__dark .ibiz-markdown__fullscreen:hover{background-color:var(--ibiz-color-bg-3)}.ibiz-markdown.is-manual{display:flex;flex-direction:column}.ibiz-markdown.is-manual .ibiz-markdown-cherry{flex-grow:1;height:calc(100% - var(--ibiz-markdown-spacing-manual-toolbar-height))!important}.ibiz-markdown.is-manual.is-editing{flex-direction:column-reverse}.ibiz-markdown .cherry-preview--full{border-left:none}.ibiz-markdown .theme__dark,.ibiz-markdown .theme__light{color:var(--ibiz-form-item-text-color)}.ibiz-markdown .cherry-markdown h1 a::before,.ibiz-markdown .cherry-markdown h2 a::before,.ibiz-markdown .cherry-markdown h3 a::before,.ibiz-markdown .cherry-markdown h4 a::before,.ibiz-markdown .cherry-markdown h5 a::before,.ibiz-markdown .cherry-markdown h6 a::before{display:none}.ibiz-markdown .cherry.fullscreen{z-index:999}
1
+ .ibiz-markdown{--ibiz-markdown-width:100%;--ibiz-markdown-color-manual-toolbar-bg-save:var(--ibiz-color-primary);--ibiz-markdown-color-manual-toolbar-text-save:var(--ibiz-color-primary-active-text);--ibiz-markdown-color-manual-toolbar-text-cancel:var(--ibiz-color-text-1);--ibiz-markdown-color-manual-toolbar-text-cancel-hover:var(--ibiz-color-primary);--ibiz-markdown-spacing-manual-toolbar-height:32px;--ibiz-markdown-spacing-manual-toolbar-gap:var(--ibiz-spacing-base);--ibiz-markdown-spacing-manual-toolbar-item-padding:0 var(--ibiz-spacing-base);--ibiz-markdown-spacing-manual-toolbar-margin:var(--ibiz-spacing-base-tight) var(--ibiz-spacing-tight) 0 0;--ibiz-markdown-spacing-manual-toolbar-fullscreen-height:var(--ibiz-height-control-default);--ibiz-markdown-spacing-manual-toolbar-fullscreen-padding:0 var(--ibiz-spacing-extra-loose);--ibiz-markdown-spacing-manual-toolbar-fullscreen-height-header:var(--ibiz-spacing-super-loose);--ibiz-markdown-height-manual-toolbar-height:var(--ibiz-height-control-default);--ibiz-markdown-border-radius-manual-toolbar-item:var(--ibiz-border-radius-small);--ibiz-markdown-border-manual-toolbar-fullscreen-footer:1px solid var(--ibiz-color-border)}.ibiz-markdown__header{display:flex;flex-shrink:0;gap:var(--ibiz-markdown-spacing-manual-toolbar-gap);align-items:center;justify-content:end;height:var(--ibiz-markdown-spacing-manual-toolbar-height)}.ibiz-markdown__header--edit{cursor:pointer}.ibiz-markdown__header--full{cursor:pointer}.ibiz-markdown__header.is-fullscreen{position:fixed;top:0;right:0;left:0;z-index:999;width:100%;height:calc(var(--ibiz-markdown-spacing-manual-toolbar-fullscreen-height-header));padding:var(--ibiz-markdown-spacing-manual-toolbar-fullscreen-padding);margin-top:0;background-color:var(--ibiz-view-bg-color)}.ibiz-markdown__header.is-fullscreen+.ibiz-markdown-cherry .cherry.fullscreen{top:calc(var(--ibiz-markdown-spacing-manual-toolbar-fullscreen-height-header));height:calc(100% - var(--ibiz-markdown-spacing-manual-toolbar-fullscreen-height-header))}.ibiz-markdown__footer{display:flex;gap:var(--ibiz-markdown-spacing-manual-toolbar-gap);align-items:center;justify-content:end;height:var(--ibiz-markdown-spacing-manual-toolbar-height);margin:var(--ibiz-markdown-spacing-manual-toolbar-margin)}.ibiz-markdown__footer--save{height:var(--ibiz-markdown-height-manual-toolbar-height);padding:var(--ibiz-markdown-spacing-manual-toolbar-item-padding);line-height:var(--ibiz-markdown-height-manual-toolbar-height);color:var(--ibiz-markdown-color-manual-toolbar-text-save);text-align:center;cursor:pointer;background-color:var(--ibiz-markdown-color-manual-toolbar-bg-save);border-radius:var(--ibiz-markdown-border-radius-manual-toolbar-item)}.ibiz-markdown__footer--cancel{color:var(--ibiz-markdown-color-manual-toolbar-text-cancel);cursor:pointer}.ibiz-markdown__footer--cancel:hover{color:var(--ibiz-markdown-color-manual-toolbar-text-cancel-hover)}.ibiz-markdown__footer.is-fullscreen{position:fixed;right:0;bottom:0;left:0;z-index:999;width:100%;height:calc(var(--ibiz-markdown-spacing-manual-toolbar-fullscreen-height) * 2);padding:var(--ibiz-markdown-spacing-manual-toolbar-fullscreen-padding);margin-top:0;background-color:var(--ibiz-view-bg-color);border-top:var(--ibiz-markdown-border-manual-toolbar-fullscreen-footer)}.ibiz-markdown__footer.is-fullscreen+.ibiz-markdown-cherry .cherry.fullscreen{height:calc(100% - var(--ibiz-markdown-spacing-manual-toolbar-fullscreen-height) * 2)}.ibiz-markdown .ibiz-markdown-cherry{width:var(--ibiz-markdown-width);outline:0}.ibiz-markdown .ibiz-markdown-cherry .cherry{width:100%;border:1px solid var(--ibiz-color-border);box-shadow:none}.ibiz-markdown .ibiz-markdown-cherry .cherry .cherry-toolbar{background-color:var(--ibiz-color-bg-0);box-shadow:none}.ibiz-markdown .ibiz-markdown-cherry .cherry .cherry-editor{border-top:1px solid var(--ibiz-color-border)}.ibiz-markdown .ibiz-markdown-cherry .cherry .cherry-previewer{border-top:1px solid var(--ibiz-color-border)}.ibiz-markdown .ibiz-markdown-cherry .cherry .cherry-sidebar{border-left:1px solid var(--ibiz-color-border);box-shadow:none}.ibiz-markdown.is-disabled .cherry{min-height:auto}.ibiz-markdown.is-disabled .ibiz-markdown__fullscreen{position:absolute;top:8px;right:12px;z-index:98;font-size:var(--ibiz-font-size-regular);line-height:2.8}.ibiz-markdown.is-disabled .theme__dark .ibiz-markdown__fullscreen{color:var(--ibiz-color-text-0)}.ibiz-markdown.is-disabled .theme__dark .ibiz-markdown__fullscreen:hover{background-color:var(--ibiz-color-bg-3)}.ibiz-markdown.is-manual{display:flex;flex-direction:column}.ibiz-markdown.is-manual .ibiz-markdown-cherry{flex-grow:1;height:calc(100% - var(--ibiz-markdown-spacing-manual-toolbar-height))!important}.ibiz-markdown.is-manual.is-editing{flex-direction:column-reverse}.ibiz-markdown .cherry-preview--full{border-left:none}.ibiz-markdown .theme__dark,.ibiz-markdown .theme__light{color:var(--ibiz-form-item-text-color)}.ibiz-markdown .cherry-markdown h1 a::before,.ibiz-markdown .cherry-markdown h2 a::before,.ibiz-markdown .cherry-markdown h3 a::before,.ibiz-markdown .cherry-markdown h4 a::before,.ibiz-markdown .cherry-markdown h5 a::before,.ibiz-markdown .cherry-markdown h6 a::before{display:none}.ibiz-markdown .cherry.fullscreen{z-index:999}