@v-c/textarea 0.0.6 → 0.0.8

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.
@@ -1,135 +1,227 @@
1
1
  import calculateAutoSizeStyle from "./calculateNodeHeight.js";
2
- import { computed, createVNode, defineComponent, mergeProps, onBeforeUnmount, ref, shallowRef, watch } from "vue";
2
+ import { computed, createVNode, defineComponent, mergeProps, nextTick, onUnmounted, ref, shallowRef, watch } from "vue";
3
3
  import ResizeObserver from "@v-c/resize-observer";
4
- import { classNames } from "@v-c/util";
4
+ import { clsx } from "@v-c/util";
5
5
  import omit from "@v-c/util/dist/omit";
6
+ import { getAttrStyleAndClass } from "@v-c/util/dist/props-util";
6
7
  import raf from "@v-c/util/dist/raf";
7
8
  var RESIZE_START = 0;
8
9
  var RESIZE_MEASURING = 1;
9
10
  var RESIZE_STABLE = 2;
10
- var ResizableTextArea_default = /* @__PURE__ */ defineComponent({
11
- name: "ResizableTextArea",
12
- props: {
13
- prefixCls: String,
14
- defaultValue: [String, Number],
15
- value: [String, Number],
16
- autoSize: [Boolean, Object],
17
- onResize: Function,
18
- disabled: Boolean,
19
- onChange: Function,
20
- onInternalAutoSize: Function,
21
- onKeydown: Function,
22
- onFocus: Function,
23
- onBlur: Function,
24
- onCompositionstart: Function,
25
- onCompositionend: Function,
26
- readOnly: Boolean,
27
- maxLength: Number
28
- },
29
- emits: [
30
- "change",
31
- "internalAutoSize",
32
- "resize"
33
- ],
34
- setup(props, { expose, attrs, emit }) {
35
- const mergedValue = shallowRef(props.value || props.defaultValue);
36
- watch(() => props.value, (val) => {
37
- mergedValue.value = val;
38
- });
39
- const onInternalChange = (event) => {
40
- mergedValue.value = event.target.value;
41
- emit("change", event);
42
- };
43
- const textareaRef = ref();
44
- expose({
45
- textArea: textareaRef,
46
- setValue: (val) => {
47
- mergedValue.value = val;
11
+ var ResizableTextArea_default = /* @__PURE__ */ defineComponent((props, { expose, attrs }) => {
12
+ const internalValue = ref(props?.value ?? props?.defaultValue ?? "");
13
+ watch(() => props.value, () => {
14
+ internalValue.value = props.value;
15
+ });
16
+ const mergedValue = computed(() => internalValue.value ?? "");
17
+ const onInternalChange = (e) => {
18
+ if (props.value === void 0) internalValue.value = e.target.value;
19
+ props?.onChange?.(e);
20
+ };
21
+ const textareaRef = shallowRef();
22
+ expose({ textArea: textareaRef });
23
+ const autoSizeData = computed(() => {
24
+ const autoSize = props.autoSize;
25
+ if (autoSize && typeof autoSize === "object") return [autoSize.minRows, autoSize.maxRows];
26
+ return [];
27
+ });
28
+ const minRows = computed(() => autoSizeData?.value?.[0]);
29
+ const maxRows = computed(() => autoSizeData?.value?.[1]);
30
+ const resizeState = ref(RESIZE_STABLE);
31
+ const autoSizeStyle = shallowRef({});
32
+ const startResize = () => {
33
+ resizeState.value = RESIZE_START;
34
+ };
35
+ const needAutoSize = computed(() => !!props.autoSize);
36
+ watch([
37
+ () => props.value,
38
+ minRows,
39
+ maxRows,
40
+ needAutoSize
41
+ ], async () => {
42
+ await nextTick();
43
+ if (needAutoSize.value) startResize();
44
+ }, { immediate: true });
45
+ watch(resizeState, () => {
46
+ if (!textareaRef.value) return;
47
+ if (resizeState.value === RESIZE_START) resizeState.value = RESIZE_MEASURING;
48
+ else if (resizeState.value === RESIZE_MEASURING) {
49
+ const textareaStyles = calculateAutoSizeStyle(textareaRef.value, false, minRows.value, maxRows.value);
50
+ resizeState.value = RESIZE_STABLE;
51
+ autoSizeStyle.value = textareaStyles;
52
+ }
53
+ });
54
+ const resizeRafRef = shallowRef();
55
+ const cleanRaf = () => {
56
+ raf.cancel(resizeRafRef.value);
57
+ };
58
+ const onInternalResize = (size) => {
59
+ if (resizeState.value === RESIZE_STABLE) {
60
+ props?.onResize?.(size);
61
+ if (props.autoSize) {
62
+ cleanRaf();
63
+ resizeRafRef.value = raf(() => {
64
+ startResize();
65
+ });
48
66
  }
49
- });
50
- const minRows = ref();
51
- const maxRows = ref();
52
- watch(() => props.autoSize, () => {
53
- const { autoSize } = props;
54
- if (autoSize && typeof autoSize === "object") {
55
- minRows.value = autoSize.minRows;
56
- maxRows.value = autoSize.maxRows;
57
- } else {
58
- minRows.value = void 0;
59
- maxRows.value = void 0;
60
- }
61
- }, { immediate: true });
62
- const needAutoSize = computed(() => !!props.autoSize);
63
- const fixFirefoxAutoScroll = () => {
64
- try {
65
- if (document.activeElement === textareaRef.value) {
66
- const { selectionStart, selectionEnd, scrollTop } = textareaRef.value;
67
- textareaRef.value.setSelectionRange(selectionStart, selectionEnd);
68
- textareaRef.value.scrollTop = scrollTop;
69
- }
70
- } catch (e) {}
71
- };
72
- const resizeState = ref(RESIZE_STABLE);
73
- const autoSizeStyle = ref();
74
- const startResize = () => {
75
- resizeState.value = RESIZE_START;
76
- if (process.env.NODE_ENV === "test") emit("internalAutoSize");
77
- };
78
- watch([
79
- () => props.value,
80
- minRows,
81
- maxRows,
82
- needAutoSize
83
- ], () => {
84
- if (needAutoSize.value) startResize();
85
- });
86
- watch(resizeState, () => {
87
- if (resizeState.value === RESIZE_START) resizeState.value = RESIZE_MEASURING;
88
- else if (resizeState.value === RESIZE_MEASURING) {
89
- const textareaStyles = calculateAutoSizeStyle(textareaRef.value, false, minRows.value, maxRows.value);
90
- resizeState.value = RESIZE_STABLE;
91
- autoSizeStyle.value = textareaStyles;
92
- } else fixFirefoxAutoScroll();
93
- });
94
- const resizeRafRef = ref();
95
- const cleanRaf = () => {
96
- raf.cancel(resizeRafRef.value);
67
+ }
68
+ };
69
+ onUnmounted(() => {
70
+ cleanRaf();
71
+ });
72
+ return () => {
73
+ const { autoSize, onResize, prefixCls, disabled } = props;
74
+ const { style, restAttrs, className } = getAttrStyleAndClass(attrs, { omits: ["onKeydown"] });
75
+ const mergedAutoSizeStyle = needAutoSize.value ? autoSizeStyle.value : null;
76
+ const mergedStyle = {
77
+ ...style,
78
+ ...mergedAutoSizeStyle
97
79
  };
98
- const onInternalResize = (size) => {
99
- if (resizeState.value === RESIZE_STABLE) {
100
- emit("resize", size);
101
- if (props.autoSize) {
102
- cleanRaf();
103
- resizeRafRef.value = raf(() => {
104
- startResize();
105
- });
106
- }
107
- }
108
- };
109
- onBeforeUnmount(() => cleanRaf());
110
- return () => {
111
- const { prefixCls, autoSize, onResize, disabled,...resetProps } = props;
112
- const mergedAutoSizeStyle = needAutoSize.value ? autoSizeStyle.value : null;
113
- const mergedStyle = {
114
- ...attrs.style,
115
- ...mergedAutoSizeStyle,
116
- overflowY: resizeState.value === RESIZE_START || resizeState.value === RESIZE_MEASURING ? "hidden" : void 0,
117
- overflowX: resizeState.value === RESIZE_START || resizeState.value === RESIZE_MEASURING ? "hidden" : void 0
118
- };
119
- const restAttrs = omit(attrs, ["class", "style"]);
120
- return createVNode(ResizeObserver, {
121
- "onResize": onInternalResize,
122
- "disabled": !(autoSize || onResize)
123
- }, { default: () => [createVNode("textarea", mergeProps(restAttrs, resetProps, {
124
- "ref": textareaRef,
125
- "style": mergedStyle,
126
- "class": classNames(prefixCls, [attrs.class], { [`${prefixCls}-disabled`]: disabled }),
127
- "disabled": disabled,
128
- "value": mergedValue.value,
129
- "onChange": onInternalChange,
130
- "onInput": onInternalChange
131
- }), null)] });
132
- };
133
- }
80
+ if (resizeState.value === RESIZE_START || resizeState.value === RESIZE_MEASURING) {
81
+ mergedStyle.overflowY = "hidden";
82
+ mergedStyle.overflowX = "hidden";
83
+ }
84
+ return createVNode(ResizeObserver, {
85
+ "onResize": onInternalResize,
86
+ "disabled": !(autoSize || onResize)
87
+ }, { default: () => [createVNode("textarea", mergeProps(restAttrs, omit(props, [
88
+ "suffix",
89
+ "classNames",
90
+ "styles",
91
+ "prefixCls",
92
+ "allowClear",
93
+ "autoSize",
94
+ "showCount",
95
+ "disabled",
96
+ "hidden",
97
+ "readOnly",
98
+ "onClear",
99
+ "maxLength",
100
+ "onResize",
101
+ "onChange"
102
+ ]), {
103
+ "ref": textareaRef,
104
+ "style": mergedStyle,
105
+ "class": clsx(prefixCls, className, { [`${prefixCls}-disabled`]: disabled }),
106
+ "disabled": disabled,
107
+ "value": mergedValue.value,
108
+ "onInput": onInternalChange
109
+ }), null)] });
110
+ };
111
+ }, {
112
+ props: {
113
+ value: {
114
+ type: null,
115
+ required: false,
116
+ default: void 0
117
+ },
118
+ defaultValue: {
119
+ type: null,
120
+ required: false,
121
+ default: void 0
122
+ },
123
+ prefixCls: {
124
+ type: String,
125
+ required: false,
126
+ default: void 0
127
+ },
128
+ disabled: {
129
+ type: Boolean,
130
+ required: false,
131
+ default: void 0
132
+ },
133
+ autoSize: {
134
+ type: [Boolean, Object],
135
+ required: false,
136
+ default: void 0
137
+ },
138
+ onPressEnter: {
139
+ type: Function,
140
+ required: false,
141
+ default: void 0
142
+ },
143
+ onResize: {
144
+ type: Function,
145
+ required: false,
146
+ default: void 0
147
+ },
148
+ classNames: {
149
+ type: Object,
150
+ required: false,
151
+ default: void 0
152
+ },
153
+ styles: {
154
+ type: Object,
155
+ required: false,
156
+ default: void 0
157
+ },
158
+ allowClear: {
159
+ type: [Boolean, Object],
160
+ required: false,
161
+ default: void 0
162
+ },
163
+ suffix: {
164
+ type: null,
165
+ required: false,
166
+ default: void 0
167
+ },
168
+ showCount: {
169
+ type: [Boolean, Object],
170
+ required: false,
171
+ default: void 0
172
+ },
173
+ count: {
174
+ type: null,
175
+ required: false,
176
+ default: void 0
177
+ },
178
+ onClear: {
179
+ type: Function,
180
+ required: false,
181
+ default: void 0
182
+ },
183
+ onChange: {
184
+ type: Function,
185
+ required: false,
186
+ default: void 0
187
+ },
188
+ maxLength: {
189
+ type: Number,
190
+ required: false,
191
+ default: void 0
192
+ },
193
+ minLength: {
194
+ type: Number,
195
+ required: false,
196
+ default: void 0
197
+ },
198
+ hidden: {
199
+ type: Boolean,
200
+ required: false,
201
+ default: void 0
202
+ },
203
+ readOnly: {
204
+ type: Boolean,
205
+ required: false,
206
+ default: void 0
207
+ },
208
+ placeholder: {
209
+ type: String,
210
+ required: false,
211
+ default: void 0
212
+ },
213
+ autoFocus: {
214
+ type: Boolean,
215
+ required: false,
216
+ default: void 0
217
+ },
218
+ onKeydown: {
219
+ type: Function,
220
+ required: false,
221
+ default: void 0
222
+ }
223
+ },
224
+ name: "ResizableTextArea",
225
+ inheritAttrs: false
134
226
  });
135
227
  export { ResizableTextArea_default as default };