Commit 8212fa5
authored
fix: handle IME composition correctly across input components (#2665)
* fix: handle IME composition correctly across input components
CJK users experienced broken input in PinInput, DateField, TagsInput,
Combobox, and filter components because intermediate IME composition
events were processed as final input. This caused premature focus shifts,
corrupted segments, and bypassed validation.
Introduces a shared `useComposing` composable and adds `isComposing`
guards to all affected components so that only the committed value
from `compositionend` is processed.
* fix: tighten test assertions and handle multi-char PinInput composition
- Combobox test: replace vacuous conditional assertion with deterministic check
- DropdownMenuFilter test: use exact baseline count instead of toBeGreaterThan(0)
- PinInput: route multi-char composition commits through handleMultipleCharacter
so characters distribute across slots like normal multi-char input does
- Add tests for multi-char and multi-digit composition commits in PinInput
* fix: address maintainer review on IME composition
- ComboboxInput/AutocompleteInput: drop `.prevent` modifier and call
`preventDefault()` inside the handler only when not composing, so IME
candidate navigation with arrow keys isn't swallowed mid-composition
- ListboxFilter: defer modelValue update to compositionend so consumer-side
filtering no longer reacts to intermediate text (matches Combobox/DropdownMenu)
- useDateField: dispatch replayed composition digits to the focused element
so multi-digit commits follow focus across segments (e.g. "45" -> 4 in month,
5 in day) instead of all landing in the original segment
- fix `iME` -> `IME` typo in test describe blocks
- add multi-digit cross-segment DateField composition test
* test: reword composition describe titles so IME keeps casing
The `prefer-lowercase-title` lint rule lowercases the first character of
each describe title, turning `IME` into `iME`. Reword to `handle IME
composition` so the acronym sits mid-title and keeps its casing.
* fix: harden IME composition handling across input components
Guard segment navigation and direct typing in Date/Time fields while a
CJK IME is active: block raw text insertion via beforeinput, restore
Vue's original contenteditable nodes on compositionend, and stop root
arrow navigation during composition.
Route NumberField, ColorField and TagsInput keydown through useComposing
so the composing flag stays true through the commit keydown (which can
report event.isComposing === false), preventing the commit keypress from
also stepping/applying the field or navigating tags.1 parent eeac4e6 commit 8212fa5
28 files changed
Lines changed: 828 additions & 58 deletions
File tree
- packages/core/src
- Autocomplete
- ColorField
- Combobox
- DateField
- DateRangeField
- DropdownMenu
- Listbox
- NumberField
- PinInput
- TagsInput
- TimeField
- TimeRangeField
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
133 | 133 | | |
134 | 134 | | |
135 | 135 | | |
136 | | - | |
| 136 | + | |
137 | 137 | | |
138 | 138 | | |
139 | 139 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
7 | 7 | | |
8 | 8 | | |
9 | 9 | | |
10 | | - | |
| 10 | + | |
11 | 11 | | |
12 | 12 | | |
13 | 13 | | |
14 | 14 | | |
| 15 | + | |
15 | 16 | | |
16 | 17 | | |
17 | 18 | | |
| |||
37 | 38 | | |
38 | 39 | | |
39 | 40 | | |
40 | | - | |
41 | | - | |
42 | | - | |
43 | | - | |
44 | | - | |
45 | | - | |
46 | | - | |
47 | | - | |
48 | | - | |
49 | | - | |
50 | | - | |
51 | | - | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
52 | 46 | | |
53 | | - | |
| 47 | + | |
| 48 | + | |
54 | 49 | | |
55 | 50 | | |
| 51 | + | |
56 | 52 | | |
57 | 53 | | |
58 | 54 | | |
| |||
124 | 120 | | |
125 | 121 | | |
126 | 122 | | |
127 | | - | |
| 123 | + | |
128 | 124 | | |
129 | | - | |
130 | | - | |
| 125 | + | |
| 126 | + | |
131 | 127 | | |
132 | 128 | | |
133 | 129 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
338 | 338 | | |
339 | 339 | | |
340 | 340 | | |
| 341 | + | |
| 342 | + | |
| 343 | + | |
| 344 | + | |
| 345 | + | |
| 346 | + | |
| 347 | + | |
| 348 | + | |
| 349 | + | |
| 350 | + | |
| 351 | + | |
| 352 | + | |
| 353 | + | |
| 354 | + | |
| 355 | + | |
| 356 | + | |
| 357 | + | |
| 358 | + | |
| 359 | + | |
| 360 | + | |
| 361 | + | |
| 362 | + | |
| 363 | + | |
| 364 | + | |
| 365 | + | |
| 366 | + | |
| 367 | + | |
| 368 | + | |
| 369 | + | |
| 370 | + | |
| 371 | + | |
| 372 | + | |
| 373 | + | |
| 374 | + | |
| 375 | + | |
| 376 | + | |
| 377 | + | |
| 378 | + | |
| 379 | + | |
341 | 380 | | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
9 | 9 | | |
10 | 10 | | |
11 | 11 | | |
| 12 | + | |
12 | 13 | | |
13 | 14 | | |
14 | 15 | | |
| |||
18 | 19 | | |
19 | 20 | | |
20 | 21 | | |
| 22 | + | |
21 | 23 | | |
22 | 24 | | |
23 | 25 | | |
| |||
48 | 50 | | |
49 | 51 | | |
50 | 52 | | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
51 | 58 | | |
52 | 59 | | |
53 | 60 | | |
| |||
82 | 89 | | |
83 | 90 | | |
84 | 91 | | |
| 92 | + | |
| 93 | + | |
85 | 94 | | |
86 | 95 | | |
87 | 96 | | |
| |||
129 | 138 | | |
130 | 139 | | |
131 | 140 | | |
| 141 | + | |
| 142 | + | |
132 | 143 | | |
133 | 144 | | |
134 | 145 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
480 | 480 | | |
481 | 481 | | |
482 | 482 | | |
| 483 | + | |
| 484 | + | |
| 485 | + | |
| 486 | + | |
| 487 | + | |
| 488 | + | |
| 489 | + | |
| 490 | + | |
| 491 | + | |
| 492 | + | |
| 493 | + | |
| 494 | + | |
| 495 | + | |
| 496 | + | |
| 497 | + | |
| 498 | + | |
| 499 | + | |
| 500 | + | |
| 501 | + | |
| 502 | + | |
| 503 | + | |
| 504 | + | |
| 505 | + | |
| 506 | + | |
| 507 | + | |
| 508 | + | |
| 509 | + | |
| 510 | + | |
| 511 | + | |
| 512 | + | |
| 513 | + | |
| 514 | + | |
| 515 | + | |
| 516 | + | |
| 517 | + | |
| 518 | + | |
| 519 | + | |
| 520 | + | |
| 521 | + | |
| 522 | + | |
| 523 | + | |
| 524 | + | |
| 525 | + | |
| 526 | + | |
| 527 | + | |
| 528 | + | |
| 529 | + | |
| 530 | + | |
483 | 531 | | |
484 | 532 | | |
485 | 533 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
3 | 3 | | |
4 | 4 | | |
5 | 5 | | |
| 6 | + | |
6 | 7 | | |
7 | 8 | | |
8 | 9 | | |
| |||
34 | 35 | | |
35 | 36 | | |
36 | 37 | | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
37 | 44 | | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
38 | 49 | | |
39 | 50 | | |
40 | 51 | | |
41 | 52 | | |
42 | | - | |
43 | | - | |
| 53 | + | |
44 | 54 | | |
45 | 55 | | |
46 | 56 | | |
47 | | - | |
48 | | - | |
| 57 | + | |
| 58 | + | |
49 | 59 | | |
50 | 60 | | |
51 | 61 | | |
52 | 62 | | |
53 | 63 | | |
54 | | - | |
| 64 | + | |
55 | 65 | | |
56 | 66 | | |
57 | 67 | | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
58 | 74 | | |
59 | 75 | | |
60 | 76 | | |
| |||
150 | 166 | | |
151 | 167 | | |
152 | 168 | | |
153 | | - | |
| 169 | + | |
154 | 170 | | |
155 | 171 | | |
| 172 | + | |
| 173 | + | |
156 | 174 | | |
157 | 175 | | |
158 | 176 | | |
| |||
0 commit comments