|
50 | 50 | <script setup lang="ts"> |
51 | 51 | import { ref, onMounted, onBeforeUnmount, watch, computed } from 'vue' |
52 | 52 |
|
53 | | -import { EditorView, highlightSpecialChars, drawSelection, dropCursor, rectangularSelection, crosshairCursor, keymap } from "@codemirror/view"; |
| 53 | +import { EditorView, highlightSpecialChars, drawSelection, dropCursor, rectangularSelection, crosshairCursor, keymap, placeholder as cmPlaceholder } from "@codemirror/view"; |
54 | 54 | import { EditorState, Compartment } from "@codemirror/state"; |
55 | 55 | import { history, historyKeymap, defaultKeymap, indentWithTab } from "@codemirror/commands"; |
56 | 56 | import { foldGutter, foldKeymap, indentOnInput, bracketMatching, defaultHighlightStyle, syntaxHighlighting } from "@codemirror/language"; |
@@ -356,7 +356,11 @@ const handleAddMissingVariable = (varName: string) => { |
356 | 356 | const editorHeight = computed(() => { |
357 | 357 | const autosize = props.autosize; |
358 | 358 | if (typeof autosize === "boolean") { |
359 | | - return autosize ? "auto" : "200px"; |
| 359 | + // autosize === true 时,完全自适应容器高度(100%) |
| 360 | + // autosize === false 时,使用固定高度 |
| 361 | + return autosize |
| 362 | + ? { min: '100%', max: 'none' } |
| 363 | + : { min: '200px', max: '200px' }; |
360 | 364 | } |
361 | 365 | const minRows = autosize.minRows || 4; |
362 | 366 | const maxRows = autosize.maxRows || 12; |
@@ -601,11 +605,9 @@ onMounted(() => { |
601 | 605 | checkSelection(); |
602 | 606 | } |
603 | 607 | }), |
604 | | - // 占位符 |
| 608 | + // 占位符(使用官方 placeholder 扩展) |
605 | 609 | placeholderCompartment.of( |
606 | | - EditorView.contentAttributes.of({ |
607 | | - "aria-placeholder": props.placeholder, |
608 | | - }), |
| 610 | + props.placeholder ? cmPlaceholder(props.placeholder) : [] |
609 | 611 | ), |
610 | 612 | ], |
611 | 613 | }); |
@@ -700,9 +702,7 @@ watch( |
700 | 702 | editorView.dispatch({ |
701 | 703 | effects: [ |
702 | 704 | placeholderCompartment.reconfigure( |
703 | | - EditorView.contentAttributes.of({ |
704 | | - "aria-placeholder": placeholder, |
705 | | - }), |
| 705 | + placeholder ? cmPlaceholder(placeholder) : [] |
706 | 706 | ), |
707 | 707 | ], |
708 | 708 | }); |
@@ -824,13 +824,18 @@ defineExpose({ |
824 | 824 | .variable-aware-input-wrapper { |
825 | 825 | position: relative; |
826 | 826 | width: 100%; |
| 827 | + height: 100%; |
| 828 | + display: flex; |
| 829 | + flex-direction: column; |
827 | 830 | } |
828 | 831 |
|
829 | 832 | .codemirror-container { |
830 | 833 | border: 1px solid var(--n-border-color); |
831 | 834 | border-radius: var(--n-border-radius); |
832 | 835 | overflow: hidden; |
833 | 836 | transition: border-color 0.3s var(--n-bezier); |
| 837 | + flex: 1; |
| 838 | + min-height: 0; |
834 | 839 | } |
835 | 840 |
|
836 | 841 | .codemirror-container:hover { |
@@ -867,12 +872,11 @@ defineExpose({ |
867 | 872 | word-break: break-word; |
868 | 873 | } |
869 | 874 |
|
870 | | -/* 占位符样式 */ |
871 | | -.codemirror-container :deep(.cm-content[aria-placeholder]:empty::before) { |
872 | | - content: attr(aria-placeholder); |
| 875 | +/* 占位符样式(使用 CodeMirror 官方 placeholder 扩展) */ |
| 876 | +.codemirror-container :deep(.cm-placeholder) { |
873 | 877 | color: var(--n-placeholder-color); |
874 | 878 | pointer-events: none; |
875 | | - position: absolute; |
| 879 | + font-style: italic; |
876 | 880 | } |
877 | 881 |
|
878 | 882 | /* 自动完成面板样式 */ |
|
0 commit comments