@ticatec/uniface-element 0.2.4 → 0.3.0

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 (176) hide show
  1. package/dist/accordion/README.md +169 -0
  2. package/dist/accordion/README_CN.md +176 -0
  3. package/dist/action-bar/README.md +275 -0
  4. package/dist/action-bar/README_CN.md +285 -0
  5. package/dist/app-layout/README.md +374 -0
  6. package/dist/app-layout/README_CN.md +381 -0
  7. package/dist/app-top-bar/README.md +357 -0
  8. package/dist/app-top-bar/README_CN.md +365 -0
  9. package/dist/attachment-files/AttachmentFilesField.svelte +67 -1
  10. package/dist/attachment-files/AttachmentFilesField.svelte.d.ts +8 -1
  11. package/dist/base-calendar/CalendarBase.svelte +0 -3
  12. package/dist/box/README.md +385 -0
  13. package/dist/box/README_CN.md +393 -0
  14. package/dist/breadcrumbs/README.md +442 -0
  15. package/dist/breadcrumbs/README_CN.md +442 -0
  16. package/dist/button/Button.svelte +27 -7
  17. package/dist/button/Button.svelte.d.ts +3 -1
  18. package/dist/button/IconButton.svelte +26 -6
  19. package/dist/button/IconButton.svelte.d.ts +3 -1
  20. package/dist/button/IconButton_README.md +513 -0
  21. package/dist/button/IconButton_README_CN.md +513 -0
  22. package/dist/button/README.md +428 -0
  23. package/dist/button/README_CN.md +428 -0
  24. package/dist/button/TextButton.svelte +26 -6
  25. package/dist/button/TextButton.svelte.d.ts +3 -1
  26. package/dist/button/TextButton_README.md +571 -0
  27. package/dist/button/TextButton_README_CN.md +571 -0
  28. package/dist/card/README.md +666 -0
  29. package/dist/card/README_CN.md +666 -0
  30. package/dist/cascade-options-select/CascadeOptionSelect.svelte +43 -7
  31. package/dist/cascade-options-select/CascadeOptionSelect.svelte.d.ts +3 -4
  32. package/dist/cascade-options-select/README.md +663 -2
  33. package/dist/cascade-options-select/README_CN.md +664 -0
  34. package/dist/checkbox/CheckBox.svelte +20 -6
  35. package/dist/checkbox/CheckBox.svelte.d.ts +4 -2
  36. package/dist/checkbox/README.md +562 -0
  37. package/dist/checkbox/README_CN.md +727 -0
  38. package/dist/common-editor/NumberInput.svelte +39 -26
  39. package/dist/common-editor/NumberInput.svelte.d.ts +5 -1
  40. package/dist/concise-data-table/ConciseListTable.svelte +133 -36
  41. package/dist/concise-data-table/ConciseListTable.svelte.d.ts +8 -1
  42. package/dist/concise-data-table/DataCell.svelte +5 -6
  43. package/dist/concise-data-table/DataRow.svelte +22 -2
  44. package/dist/concise-data-table/DataRow.svelte.d.ts +1 -0
  45. package/dist/concise-data-table/README.md +606 -0
  46. package/dist/concise-data-table/README_CN.md +611 -0
  47. package/dist/context-menu/ContextMenu.svelte +138 -21
  48. package/dist/context-menu/ContextMenu.svelte.d.ts +5 -0
  49. package/dist/context-menu/ContextMenuItem.d.ts +20 -4
  50. package/dist/context-menu/README.md +551 -0
  51. package/dist/context-menu/README_CN.md +551 -0
  52. package/dist/criteria-field/CriteriaField.svelte +3 -5
  53. package/dist/criteria-field/README.md +532 -0
  54. package/dist/criteria-field/README_CN.md +532 -0
  55. package/dist/data-table/README.md +712 -0
  56. package/dist/data-table/README_CN.md +712 -0
  57. package/dist/date-picker/DatePicker.svelte +44 -7
  58. package/dist/date-picker/DatePicker.svelte.d.ts +3 -4
  59. package/dist/date-picker/DateTimePicker.svelte +32 -8
  60. package/dist/date-picker/DateTimePicker.svelte.d.ts +3 -4
  61. package/dist/date-picker/README.md +326 -0
  62. package/dist/date-picker/README_CN.md +316 -0
  63. package/dist/date-picker/ScrollBar.svelte +18 -8
  64. package/dist/date-picker/ScrollBar.svelte.d.ts +1 -1
  65. package/dist/date-picker/TimePanel.svelte +5 -5
  66. package/dist/date-picker/TimePanel.svelte.d.ts +1 -1
  67. package/dist/date-range/README.md +374 -0
  68. package/dist/date-range/README_CN.md +374 -0
  69. package/dist/dialog/README.md +596 -0
  70. package/dist/dialog/README_CN.md +596 -0
  71. package/dist/drawer/README.md +679 -1
  72. package/dist/drawer/README_CN.md +679 -0
  73. package/dist/group-box/group-check-box/GroupCheckBox.svelte +62 -5
  74. package/dist/group-box/group-check-box/GroupCheckBox.svelte.d.ts +7 -2
  75. package/dist/group-box/group-check-box/README.md +749 -0
  76. package/dist/group-box/group-check-box/README_CN.md +750 -0
  77. package/dist/group-box/group-radio-box/GroupRadioBox.svelte +69 -4
  78. package/dist/group-box/group-radio-box/GroupRadioBox.svelte.d.ts +8 -2
  79. package/dist/group-box/group-radio-box/README.md +920 -0
  80. package/dist/group-box/group-radio-box/README_CN.md +920 -0
  81. package/dist/image-files/README.md +1346 -0
  82. package/dist/image-files/README_CN.md +1346 -0
  83. package/dist/input-options-select/InputOptionsSelect.svelte +161 -65
  84. package/dist/input-options-select/InputOptionsSelect.svelte.d.ts +4 -1
  85. package/dist/lib/forwardAllEvents.d.ts +3 -0
  86. package/dist/lib/forwardAllEvents.js +24 -0
  87. package/dist/list-box/README.md +579 -0
  88. package/dist/list-box/README_CN.md +682 -0
  89. package/dist/lookup-editor/LookupEditor.svelte +15 -3
  90. package/dist/lookup-editor/LookupEditor.svelte.d.ts +3 -4
  91. package/dist/lookup-editor/README.md +684 -0
  92. package/dist/lookup-editor/README_CN.md +684 -0
  93. package/dist/memo-editor/MemoEditor.svelte +77 -27
  94. package/dist/memo-editor/MemoEditor.svelte.d.ts +6 -3
  95. package/dist/memo-editor/README.md +819 -0
  96. package/dist/memo-editor/README_CN.md +819 -0
  97. package/dist/message-box/README.md +398 -0
  98. package/dist/message-box/README_CN.md +398 -0
  99. package/dist/number-editor/NumberEditor.svelte +2 -2
  100. package/dist/number-editor/NumberEditor.svelte.d.ts +1 -1
  101. package/dist/number-editor/README.md +353 -22
  102. package/dist/number-editor/README_CN.md +357 -0
  103. package/dist/number-range/README.md +443 -0
  104. package/dist/number-range/README_CN.md +443 -0
  105. package/dist/options-multi-select/OptionsMultiSelect.svelte +87 -12
  106. package/dist/options-multi-select/OptionsMultiSelect.svelte.d.ts +3 -1
  107. package/dist/options-multi-select/README.md +480 -0
  108. package/dist/options-multi-select/README_CN.md +480 -0
  109. package/dist/options-select/OptionsSelect.svelte +36 -5
  110. package/dist/options-select/OptionsSelect.svelte.d.ts +3 -4
  111. package/dist/options-select/README.md +632 -0
  112. package/dist/options-select/README_CN.md +632 -0
  113. package/dist/page/README.md +605 -0
  114. package/dist/page/README_CN.md +605 -0
  115. package/dist/pagination/README.md +946 -0
  116. package/dist/pagination/README_CN.md +946 -0
  117. package/dist/pagination-panel/README.md +1075 -0
  118. package/dist/pagination-panel/README_CN.md +1075 -0
  119. package/dist/popup-hint/README.md +841 -0
  120. package/dist/popup-hint/README_CN.md +840 -0
  121. package/dist/progress-bar/README.md +242 -0
  122. package/dist/progress-bar/README_CN.md +242 -0
  123. package/dist/progress-step-bar/README.md +316 -0
  124. package/dist/progress-step-bar/README_CN.md +316 -0
  125. package/dist/prompts-text-editor/PromptsTextEditor.svelte +6 -3
  126. package/dist/prompts-text-editor/PromptsTextEditor.svelte.d.ts +3 -1
  127. package/dist/prompts-text-editor/README.md +329 -0
  128. package/dist/prompts-text-editor/README_CN.md +329 -0
  129. package/dist/property-editor/README.md +969 -0
  130. package/dist/property-editor/README_CN.md +969 -0
  131. package/dist/radio-button/README.md +372 -0
  132. package/dist/radio-button/README_CN.md +372 -0
  133. package/dist/radio-button/RadioButton.svelte +32 -3
  134. package/dist/radio-button/RadioButton.svelte.d.ts +12 -1
  135. package/dist/search-box/README.md +425 -0
  136. package/dist/search-box/README_CN.md +424 -0
  137. package/dist/search-box/SearchBox.svelte +22 -6
  138. package/dist/search-box/SearchBox.svelte.d.ts +4 -1
  139. package/dist/tabs/README.md +919 -0
  140. package/dist/tabs/README_CN.md +920 -0
  141. package/dist/tag/README.md +922 -0
  142. package/dist/tag/README_CN.md +922 -0
  143. package/dist/text-editor/PasswordEditor.svelte +17 -2
  144. package/dist/text-editor/PasswordEditor.svelte.d.ts +3 -3
  145. package/dist/text-editor/PasswordEditor_README.md +551 -0
  146. package/dist/text-editor/PasswordEditor_README_CN.md +551 -0
  147. package/dist/text-editor/README.md +466 -0
  148. package/dist/text-editor/README_CN.md +466 -0
  149. package/dist/text-editor/TextEditor.svelte +51 -19
  150. package/dist/text-editor/TextEditor.svelte.d.ts +0 -1
  151. package/dist/time-editor/README.md +498 -24
  152. package/dist/time-editor/README_CN.md +498 -0
  153. package/dist/time-editor/TimeEditor.svelte +7 -3
  154. package/dist/time-editor/TimeEditor.svelte.d.ts +3 -1
  155. package/dist/toast/README.md +667 -0
  156. package/dist/toast/README_CN.md +667 -0
  157. package/dist/transfer/README.md +795 -0
  158. package/dist/transfer/Transfer.svelte +6 -4
  159. package/dist/transfer/Transfer.svelte.d.ts +3 -1
  160. package/dist/tree-view/README.md +761 -0
  161. package/dist/tree-view/README_CN.md +761 -0
  162. package/dist/tree-view/TreeView.svelte +5 -3
  163. package/dist/tree-view/TreeView.svelte.d.ts +3 -1
  164. package/dist/unit-number-editor/README.md +546 -20
  165. package/dist/unit-number-editor/README_CN.md +525 -0
  166. package/dist/unit-number-editor/UnitNumberEditor.svelte +62 -8
  167. package/dist/unit-number-editor/UnitNumberEditor.svelte.d.ts +5 -1
  168. package/docs/form-field/cn/README_CN.md +364 -0
  169. package/docs/form-field/en/README.md +364 -0
  170. package/docs/form-panel/flex-form/cn/README_CN.md +586 -0
  171. package/docs/form-panel/flex-form/en/README.md +586 -0
  172. package/docs/form-panel/flex-row-form/cn/README_CN.md +787 -0
  173. package/docs/form-panel/flex-row-form/en/README.md +787 -0
  174. package/docs/form-panel/grid-form/en/README.md +744 -0
  175. package/package.json +1 -1
  176. package/dist/drawer/README-CN.md +0 -1
@@ -0,0 +1,466 @@
1
+ # 文本编辑器组件
2
+
3
+ 一个功能强大的文本输入组件,提供全面的输入处理、事件转发和显示模式。基于 `CommonEditor` 基础组件构建,具备高级功能,如前缀/后缀支持、清除功能和灵活的样式设置。
4
+
5
+ ## 安装
6
+
7
+ ```bash
8
+ npm install @ticatec/uniface-element
9
+ ```
10
+
11
+ ## 导入
12
+
13
+ ```typescript
14
+ import TextEditor from "@ticatec/uniface-element/TextEditor";
15
+ ```
16
+
17
+ ## 基本用法
18
+
19
+ ```svelte
20
+ <script>
21
+ import TextEditor from "@ticatec/uniface-element/TextEditor";
22
+
23
+ let inputValue = '';
24
+ </script>
25
+
26
+ <TextEditor
27
+ bind:value={inputValue}
28
+ placeholder="输入文本..."
29
+ />
30
+ ```
31
+
32
+ ## 属性
33
+
34
+ | 属性 | 类型 | 默认值 | 描述 |
35
+ |------|------|---------|-------------|
36
+ | `value` | `string` | `""` | 当前输入值 |
37
+ | `disabled` | `boolean` | `false` | 输入框是否禁用 |
38
+ | `readonly` | `boolean` | `false` | 输入框是否只读 |
39
+ | `variant` | `"" \| "plain" \| "outlined" \| "filled"` | `""` | 输入框的视觉变体 |
40
+ | `compact` | `boolean` | `false` | 是否使用紧凑间距 |
41
+ | `style` | `string` | `""` | 附加 CSS 样式 |
42
+ | `prefix` | `string` | `""` | 显示的文本前缀 |
43
+ | `suffix` | `string` | `""` | 显示的文本后缀 |
44
+ | `removable` | `boolean` | `true` | 是否显示清除按钮 |
45
+ | `displayMode` | `DisplayMode` | `DisplayMode.Edit` | 显示模式(编辑/查看) |
46
+ | `class` | `string` | `""` | CSS 类名 |
47
+
48
+ ## 事件
49
+
50
+ 文本编辑器组件转发所有原生输入事件:
51
+
52
+ | 事件 | 描述 |
53
+ |-------|-------------|
54
+ | `input` | 每次输入更改时触发 |
55
+ | `change` | 输入框失去焦点或按下回车键时触发 |
56
+ | `focus` | 输入框获得焦点时触发 |
57
+ | `blur` | 输入框失去焦点时触发 |
58
+ | `keydown` | 按下键盘按键时触发 |
59
+ | `keyup` | 释放键盘按键时触发 |
60
+ | `keypress` | 按下键盘按键时触发 |
61
+ | `compositionstart` | IME 组合输入开始时触发 |
62
+ | `compositionend` | IME 组合输入结束时触发 |
63
+ | `compositionupdate` | IME 组合输入期间触发 |
64
+
65
+ ## 方法
66
+
67
+ | 方法 | 描述 |
68
+ |--------|-------------|
69
+ | `setFocus()` | 以编程方式使输入框获得焦点 |
70
+
71
+ ## 示例
72
+
73
+ ### 基本文本输入
74
+
75
+ ```svelte
76
+ <script>
77
+ import TextEditor from "@ticatec/uniface-element/TextEditor";
78
+
79
+ let userName = '';
80
+ let email = '';
81
+ </script>
82
+
83
+ <div class="form-group">
84
+ <label>用户名:</label>
85
+ <TextEditor bind:value={userName} placeholder="输入用户名" />
86
+ </div>
87
+
88
+ <div class="form-group">
89
+ <label>邮箱:</label>
90
+ <TextEditor bind:value={email} placeholder="输入邮箱地址" />
91
+ </div>
92
+
93
+ <style>
94
+ .form-group {
95
+ margin-bottom: 16px;
96
+ }
97
+
98
+ label {
99
+ display: block;
100
+ margin-bottom: 4px;
101
+ font-weight: 500;
102
+ }
103
+ </style>
104
+ ```
105
+
106
+ ### 带事件处理程序
107
+
108
+ ```svelte
109
+ <script>
110
+ import TextEditor from "@ticatec/uniface-element/TextEditor";
111
+
112
+ let inputValue = '';
113
+ let isFocused = false;
114
+
115
+ function handleInput(event) {
116
+ console.log('输入更改:', event.target.value);
117
+ }
118
+
119
+ function handleChange(event) {
120
+ console.log('更改确认:', event.target.value);
121
+ }
122
+
123
+ function handleFocus(event) {
124
+ console.log('输入框已聚焦');
125
+ isFocused = true;
126
+ }
127
+
128
+ function handleBlur(event) {
129
+ console.log('输入框已失焦');
130
+ isFocused = false;
131
+ }
132
+ </script>
133
+
134
+ <TextEditor
135
+ bind:value={inputValue}
136
+ placeholder="输入一些内容..."
137
+ on:input={handleInput}
138
+ on:change={handleChange}
139
+ on:focus={handleFocus}
140
+ on:blur={handleBlur}
141
+ />
142
+
143
+ {#if isFocused}
144
+ <p>输入框当前已聚焦</p>
145
+ {/if}
146
+ ```
147
+
148
+ ### 不同变体
149
+
150
+ ```svelte
151
+ <script>
152
+ import TextEditor from "@ticatec/uniface-element/TextEditor";
153
+
154
+ let value1 = '', value2 = '', value3 = '', value4 = '';
155
+ </script>
156
+
157
+ <!-- 默认变体 -->
158
+ <TextEditor bind:value={value1} placeholder="默认" />
159
+
160
+ <!-- 简单变体 -->
161
+ <TextEditor bind:value={value2} variant="plain" placeholder="简单" />
162
+
163
+ <!-- 轮廓变体 -->
164
+ <TextEditor bind:value={value3} variant="outlined" placeholder="轮廓" />
165
+
166
+ <!-- 填充变体 -->
167
+ <TextEditor bind:value={value4} variant="filled" placeholder="填充" />
168
+ ```
169
+
170
+ ### 带前缀和后缀
171
+
172
+ ```svelte
173
+ <script>
174
+ import TextEditor from "@ticatec/uniface-element/TextEditor";
175
+
176
+ let amount = '';
177
+ let website = '';
178
+ let username = '';
179
+ </script>
180
+
181
+ <!-- 带前缀的货币输入 -->
182
+ <TextEditor
183
+ bind:value={amount}
184
+ prefix="$"
185
+ placeholder="0.00"
186
+ />
187
+
188
+ <!-- 带前缀的网站 URL -->
189
+ <TextEditor
190
+ bind:value={website}
191
+ prefix="https://"
192
+ placeholder="example.com"
193
+ />
194
+
195
+ <!-- 带后缀的用户名 -->
196
+ <TextEditor
197
+ bind:value={username}
198
+ suffix="@company.com"
199
+ placeholder="用户名"
200
+ />
201
+ ```
202
+
203
+ ### 带图标
204
+
205
+ ```svelte
206
+ <script>
207
+ import TextEditor from "@ticatec/uniface-element/TextEditor";
208
+ import Icon from "@ticatec/uniface-element/Icon";
209
+
210
+ let searchTerm = '';
211
+ let email = '';
212
+ </script>
213
+
214
+ <!-- 带前导图标的搜索输入 -->
215
+ <TextEditor bind:value={searchTerm} placeholder="搜索...">
216
+ <svelte:fragment slot="leading-icon">
217
+ <Icon name="search" />
218
+ </svelte:fragment>
219
+ </TextEditor>
220
+
221
+ <!-- 带尾随图标的邮箱输入 -->
222
+ <TextEditor bind:value={email} placeholder="输入邮箱">
223
+ <svelte:fragment slot="trailing-icon">
224
+ <Icon name="email" />
225
+ </svelte:fragment>
226
+ </TextEditor>
227
+ ```
228
+
229
+ ### 禁用和只读状态
230
+
231
+ ```svelte
232
+ <script>
233
+ import TextEditor from "@ticatec/uniface-element/TextEditor";
234
+
235
+ let normalValue = '';
236
+ let readonlyValue = '这是只读的';
237
+ let disabledValue = '';
238
+ </script>
239
+
240
+ <!-- 正常输入 -->
241
+ <TextEditor bind:value={normalValue} placeholder="正常输入" />
242
+
243
+ <!-- 只读输入 -->
244
+ <TextEditor bind:value={readonlyValue} readonly />
245
+
246
+ <!-- 禁用输入 -->
247
+ <TextEditor bind:value={disabledValue} disabled placeholder="禁用输入" />
248
+ ```
249
+
250
+ ### 紧凑模式
251
+
252
+ ```svelte
253
+ <script>
254
+ import TextEditor from "@ticatec/uniface-element/TextEditor";
255
+
256
+ let compactValue = '';
257
+ </script>
258
+
259
+ <div class="toolbar">
260
+ <TextEditor
261
+ bind:value={compactValue}
262
+ compact
263
+ placeholder="紧凑输入"
264
+ />
265
+ </div>
266
+
267
+ <style>
268
+ .toolbar {
269
+ display: flex;
270
+ align-items: center;
271
+ padding: 8px;
272
+ background: #f8f9fa;
273
+ }
274
+ </style>
275
+ ```
276
+
277
+ ### 无清除按钮
278
+
279
+ ```svelte
280
+ <script>
281
+ import TextEditor from "@ticatec/uniface-element/TextEditor";
282
+
283
+ let value = '';
284
+ </script>
285
+
286
+ <TextEditor
287
+ bind:value
288
+ removable={false}
289
+ placeholder="无清除按钮"
290
+ />
291
+ ```
292
+
293
+ ### 表单集成
294
+
295
+ ```svelte
296
+ <script>
297
+ import TextEditor from "@ticatec/uniface-element/TextEditor";
298
+ import Button from "@ticatec/uniface-element/Button";
299
+
300
+ let formData = {
301
+ firstName: '',
302
+ lastName: '',
303
+ company: '',
304
+ title: ''
305
+ };
306
+
307
+ function handleSubmit() {
308
+ console.log('表单提交:', formData);
309
+ }
310
+
311
+ function resetForm() {
312
+ formData = {
313
+ firstName: '',
314
+ lastName: '',
315
+ company: '',
316
+ title: ''
317
+ };
318
+ }
319
+ </script>
320
+
321
+ <form on:submit|preventDefault={handleSubmit}>
322
+ <div class="form-row">
323
+ <div class="form-field">
324
+ <label>名字</label>
325
+ <TextEditor bind:value={formData.firstName} placeholder="张" />
326
+ </div>
327
+ <div class="form-field">
328
+ <label>姓氏</label>
329
+ <TextEditor bind:value={formData.lastName} placeholder="伟" />
330
+ </div>
331
+ </div>
332
+
333
+ <div class="form-field">
334
+ <label>公司</label>
335
+ <TextEditor bind:value={formData.company} placeholder="某某公司" />
336
+ </div>
337
+
338
+ <div class="form-field">
339
+ <label>职位</label>
340
+ <TextEditor bind:value={formData.title} placeholder="软件工程师" />
341
+ </div>
342
+
343
+ <div class="form-actions">
344
+ <Button type="secondary" label="重置" onClick={resetForm} />
345
+ <Button type="primary" label="提交" onClick={handleSubmit} />
346
+ </div>
347
+ </form>
348
+
349
+ <style>
350
+ .form-row {
351
+ display: grid;
352
+ grid-template-columns: 1fr 1fr;
353
+ gap: 16px;
354
+ margin-bottom: 16px;
355
+ }
356
+
357
+ .form-field {
358
+ margin-bottom: 16px;
359
+ }
360
+
361
+ label {
362
+ display: block;
363
+ margin-bottom: 4px;
364
+ font-weight: 500;
365
+ }
366
+
367
+ .form-actions {
368
+ display: flex;
369
+ gap: 12px;
370
+ justify-content: flex-end;
371
+ }
372
+ </style>
373
+ ```
374
+
375
+ ### 编程式焦点
376
+
377
+ ```svelte
378
+ <script>
379
+ import TextEditor from "@ticatec/uniface-element/TextEditor";
380
+ import Button from "@ticatec/uniface-element/Button";
381
+
382
+ let textEditor;
383
+ let inputValue = '';
384
+
385
+ function focusInput() {
386
+ textEditor.setFocus();
387
+ }
388
+ </script>
389
+
390
+ <Button label="聚焦输入框" onClick={focusInput} />
391
+
392
+ <TextEditor
393
+ bind:this={textEditor}
394
+ bind:value={inputValue}
395
+ placeholder="点击按钮聚焦我"
396
+ />
397
+ ```
398
+
399
+ ### 显示模式
400
+
401
+ ```svelte
402
+ <script>
403
+ import TextEditor from "@ticatec/uniface-element/TextEditor";
404
+ import { DisplayMode } from "@ticatec/uniface-element/common/DisplayMode";
405
+
406
+ let value = '示例文本';
407
+ let isEditing = false;
408
+ </script>
409
+
410
+ <button on:click={() => isEditing = !isEditing}>
411
+ {isEditing ? '切换到查看模式' : '切换到编辑模式'}
412
+ </button>
413
+
414
+ <TextEditor
415
+ bind:value
416
+ displayMode={isEditing ? DisplayMode.Edit : DisplayMode.View}
417
+ placeholder="输入文本..."
418
+ />
419
+ ```
420
+
421
+ ## 功能
422
+
423
+ - **全面事件处理**:自动转发所有原生输入事件
424
+ - **高级输入支持**:处理国际化文本输入的组合事件
425
+ - **灵活显示**:支持编辑和查看模式
426
+ - **清除功能**:可选的清除按钮,行为可自定义
427
+ - **图标支持**:支持前导和尾随图标插槽
428
+ - **前缀/后缀**:支持文本前缀和后缀
429
+ - **焦点管理**:支持编程式焦点控制
430
+ - **灵活样式**:支持多种视觉变体和自定义样式
431
+
432
+ ## 事件转发
433
+
434
+ 文本编辑器组件使用高级事件转发系统,自动转发所有原生输入事件,同时允许对特定事件(如 `input` 和 `change`)进行自定义处理。
435
+
436
+ ## 可访问性
437
+
438
+ - 适当的语义化 HTML 结构
439
+ - 支持键盘导航
440
+ - 屏幕阅读器兼容
441
+ - 焦点指示器和管理
442
+ - 适当的 ARIA 属性
443
+
444
+ ## 最佳实践
445
+
446
+ 1. **事件处理**:使用 `on:input` 进行实时反馈,使用 `on:change` 进行确认更改
447
+ 2. **验证**:在事件处理程序中实现验证逻辑
448
+ 3. **占位符文本**:提供有用的占位符文本以提升用户体验
449
+ 4. **标签**:始终将输入框与适当的标签关联
450
+ 5. **错误状态**:适当处理和显示验证错误
451
+ 6. **焦点管理**:使用编程式焦点提升可访问性
452
+
453
+ ## 浏览器支持
454
+
455
+ - 支持完整输入事件的现代浏览器
456
+ - 兼容 Svelte 5+
457
+ - 支持国际化输入法编辑器(IME)
458
+ - 触控友好界面
459
+
460
+ ## 相关组件
461
+
462
+ - `PasswordEditor` - 带可见性切换的专用密码输入
463
+ - `SearchBox` - 带内置搜索图标的搜索专用输入
464
+ - `NumberEditor` - 带验证的数字输入
465
+ - `MemoEditor` - 多行文本输入(textarea)
466
+ - `PromptsTextEditor` - 带自动建议的文本输入
@@ -1,11 +1,11 @@
1
1
  <script lang="ts">
2
-
3
2
  import {DisplayMode} from "../common/DisplayMode";
4
3
  import prefixFilter from "../utils/prefixFilter";
5
4
  import CommonEditor from "../common-editor/CommonEditor.svelte";
6
- import {tick} from "svelte";
5
+ import {forwardAllEvents} from "../lib/forwardAllEvents";
6
+ import {onMount} from "svelte";
7
7
 
8
- const excludeAttrs = ['type', 'readonly', 'disabled', 'required', "form", "wrap"]
8
+ const excludeAttrs = ['type', 'readonly', 'disabled', 'required', "form", "wrap"];
9
9
 
10
10
  export let disabled: boolean = false;
11
11
  export let readonly: boolean = false;
@@ -18,21 +18,18 @@
18
18
  export let prefix: string = '';
19
19
  export let removable: boolean = true;
20
20
  export let displayMode: DisplayMode = DisplayMode.Edit;
21
- export let onChange: ((value: string) => void) | undefined = undefined;
22
21
 
23
22
  export const setFocus = () => {
24
23
  setTimeout(()=> {
25
24
  editor && editor.focus();
26
25
  }, 50);
27
- }
28
-
26
+ };
29
27
 
30
28
  let className: string = '';
31
29
  let input$: any;
32
- let editor: any;
30
+ let editor: HTMLInputElement;
33
31
 
34
32
  $: variant = variant ?? '';
35
-
36
33
  $: input$ = prefixFilter($$props, "input$", excludeAttrs);
37
34
 
38
35
  let oldValue = value;
@@ -40,27 +37,62 @@
40
37
  const clean = () => {
41
38
  value = '';
42
39
  editor.focus();
40
+ };
41
+
42
+ // 原生 input 行为:value 实时变化就触发 input
43
+ function handleInput(e: InputEvent) {
44
+ value = (e.target as HTMLInputElement).value;
43
45
  }
44
46
 
45
- $: if (oldValue != value) {
46
- onChange?.(value);
47
- oldValue = value;
47
+ // 原生 change 行为:用户确认输入后触发(blur 或回车)
48
+ function handleChange(e: Event) {
49
+ if (oldValue !== value) {
50
+ oldValue = value;
51
+ }
48
52
  }
49
53
 
54
+ onMount(() => {
55
+ if (editor) {
56
+ const forward = forwardAllEvents(editor, $$props, {
57
+ input: handleInput,
58
+ change: handleChange
59
+ });
50
60
 
61
+ return () => forward.destroy?.();
62
+ }
63
+ });
51
64
  </script>
52
- <CommonEditor {displayMode} {style} {value} {suffix} {prefix} {readonly} {disabled} {variant} {compact}
53
- hasLeadingIcon={$$slots['leading-icon']!=null} hasTrailingIcon={$$slots['trailing-icon']!=null}
54
- showActionIcon={!readonly && !disabled && removable && value?.length > 0} placeholder={input$['placeholder']}
55
- class={className} clean={clean}>
65
+
66
+ <CommonEditor
67
+ {displayMode} {style} {value} {suffix} {prefix} {readonly} {disabled} {variant} {compact}
68
+ hasLeadingIcon={$$slots['leading-icon']!=null} hasTrailingIcon={$$slots['trailing-icon']!=null}
69
+ showActionIcon={!readonly && !disabled && removable && value?.length > 0}
70
+ placeholder={input$['placeholder']}
71
+ class={className} clean={clean}>
72
+
56
73
  <svelte:fragment slot="leading-icon">
57
74
  {#if $$slots['leading-icon']}
58
75
  <slot name="leading-icon"/>
59
76
  {/if}
60
77
  </svelte:fragment>
61
- <input bind:this={editor} {...input$} type="text" style="flex: 1 1 auto" bind:value={value}
62
- on:blur on:focus on:keydown on:keyup on:keypress on:input on:compositionstart
63
- on:compositionend on:compositionupdate/>
78
+
79
+ <input
80
+ bind:this={editor}
81
+ {...input$}
82
+ type="text"
83
+ style="flex: 1 1 auto"
84
+ bind:value={value}
85
+ on:blur
86
+ on:focus
87
+ on:keydown
88
+ on:keyup
89
+ on:keypress
90
+ on:input
91
+ on:compositionstart
92
+ on:compositionend
93
+ on:compositionupdate
94
+ />
95
+
64
96
  <svelte:fragment slot="trailing-icon">
65
97
  {#if $$slots['trailing-icon']}
66
98
  <div class="editor-embed-icon">
@@ -68,4 +100,4 @@
68
100
  </div>
69
101
  {/if}
70
102
  </svelte:fragment>
71
- </CommonEditor>
103
+ </CommonEditor>
@@ -25,7 +25,6 @@ declare const TextEditor: $$__sveltets_2_IsomorphicComponent<{
25
25
  prefix?: string | undefined;
26
26
  removable?: boolean | undefined;
27
27
  displayMode?: DisplayMode | undefined;
28
- onChange?: ((value: string) => void) | undefined | undefined;
29
28
  setFocus?: (() => void) | undefined;
30
29
  }, {
31
30
  blur: FocusEvent;