entasis 0.11.0 → 0.12.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 (839) hide show
  1. package/README.md +1 -1
  2. package/dist/attachments/disclosurePanel.svelte.d.ts +84 -0
  3. package/dist/attachments/disclosurePanel.svelte.js +277 -0
  4. package/dist/attachments/portal.d.ts +17 -1
  5. package/dist/attachments/portal.js +39 -2
  6. package/dist/attachments/spinnerOverlay.svelte.js +12 -0
  7. package/dist/attachments/transitionSize.d.ts +6 -0
  8. package/dist/attachments/transitionSize.js +30 -0
  9. package/dist/components/AIAskUserQuestion/AIAskUserQuestion.svelte +131 -17
  10. package/dist/components/AIAskUserQuestion/AIAskUserQuestionFileStep.svelte +26 -6
  11. package/dist/components/AIAskUserQuestion/AIAskUserQuestionFileStep.svelte.d.ts +6 -0
  12. package/dist/components/AIAskUserQuestion/AIAskUserQuestionFooter.svelte +27 -53
  13. package/dist/components/AIAskUserQuestion/AIAskUserQuestionFooter.svelte.d.ts +3 -4
  14. package/dist/components/AIAskUserQuestion/AIAskUserQuestionHeader.svelte +19 -16
  15. package/dist/components/AIAskUserQuestion/AIAskUserQuestionStep.svelte +180 -21
  16. package/dist/components/AIAskUserQuestion/AIAskUserQuestionStep.svelte.d.ts +9 -1
  17. package/dist/components/AIAskUserQuestion/AIAskUserQuestionSummary.svelte +56 -0
  18. package/dist/components/AIAskUserQuestion/AIAskUserQuestionSummary.svelte.d.ts +4 -0
  19. package/dist/components/AIAskUserQuestion/aiAskUserQuestion.mcp.d.ts +1 -1
  20. package/dist/components/AIAskUserQuestion/aiAskUserQuestion.mcp.js +26 -8
  21. package/dist/components/AIAskUserQuestion/aiAskUserQuestion.props.d.ts +62 -5
  22. package/dist/components/AIAskUserQuestion/aiAskUserQuestion.theme.d.ts +42 -0
  23. package/dist/components/AIAskUserQuestion/aiAskUserQuestion.theme.js +53 -12
  24. package/dist/components/AIAskUserQuestion/aiAskUserQuestionAnswers.d.ts +17 -1
  25. package/dist/components/AIAskUserQuestion/aiAskUserQuestionAnswers.js +56 -8
  26. package/dist/components/AIAskUserQuestion/index.d.ts +3 -1
  27. package/dist/components/AIAskUserQuestion/index.js +2 -0
  28. package/dist/components/AIAskUserQuestion/schemas.d.ts +44 -0
  29. package/dist/components/AIAskUserQuestion/schemas.js +10 -3
  30. package/dist/components/AIChat/AIChat.svelte +10 -0
  31. package/dist/components/AIChat/AIChat.svelte.d.ts +2 -2
  32. package/dist/components/AIChat/AIChatComposerSurface.svelte +23 -5
  33. package/dist/components/AIChat/AIChatComposerSurface.svelte.d.ts +5 -0
  34. package/dist/components/AIChat/AIChatSkeleton.svelte +29 -37
  35. package/dist/components/AIChat/AIChatSurface.svelte +30 -2
  36. package/dist/components/AIChat/AIChatSurface.svelte.d.ts +1 -1
  37. package/dist/components/AIChat/AIChatThreadSurface.svelte +11 -1
  38. package/dist/components/AIChat/AIChatThreadSurface.svelte.d.ts +3 -1
  39. package/dist/components/AIChat/aiChat.mcp.d.ts +1 -1
  40. package/dist/components/AIChat/aiChat.mcp.js +31 -15
  41. package/dist/components/AIChat/aiChat.props.d.ts +36 -10
  42. package/dist/components/AIChat/aiChat.theme.d.ts +9 -0
  43. package/dist/components/AIChat/aiChat.theme.js +21 -4
  44. package/dist/components/AIChat/aiChatSkeleton.props.d.ts +5 -0
  45. package/dist/components/AIChat/index.d.ts +1 -1
  46. package/dist/components/AIComposer/AIComposer.svelte +102 -5
  47. package/dist/components/AIComposer/AIComposer.svelte.d.ts +1 -0
  48. package/dist/components/AIComposer/AIComposerFooter.svelte +54 -12
  49. package/dist/components/AIComposer/AIComposerFooter.svelte.d.ts +2 -0
  50. package/dist/components/AIComposer/AIComposerQueue.svelte +8 -3
  51. package/dist/components/AIComposer/aiComposer.editor.theme.js +13 -2
  52. package/dist/components/AIComposer/aiComposer.mcp.d.ts +1 -1
  53. package/dist/components/AIComposer/aiComposer.mcp.js +15 -7
  54. package/dist/components/AIComposer/aiComposer.props.d.ts +27 -7
  55. package/dist/components/AIComposer/aiComposer.theme.d.ts +42 -3
  56. package/dist/components/AIComposer/aiComposer.theme.js +37 -5
  57. package/dist/components/AIComposer/aiComposerFileController.svelte.d.ts +20 -0
  58. package/dist/components/AIComposer/aiComposerFileController.svelte.js +75 -9
  59. package/dist/components/AIComposer/aiComposerSourceAdapter.js +22 -4
  60. package/dist/components/AIComposer/aiComposerSubmitController.svelte.d.ts +12 -0
  61. package/dist/components/AIComposer/aiComposerSubmitController.svelte.js +16 -6
  62. package/dist/components/AIContext/AIContext.svelte +7 -3
  63. package/dist/components/AIContext/aiContext.mcp.d.ts +1 -1
  64. package/dist/components/AIContext/aiContext.mcp.js +1 -1
  65. package/dist/components/AIContext/aiContext.props.d.ts +4 -1
  66. package/dist/components/AIContext/aiContext.theme.d.ts +3 -0
  67. package/dist/components/AIContext/aiContext.theme.js +7 -2
  68. package/dist/components/AIConversation/AIConversation.svelte.d.ts +2 -2
  69. package/dist/components/AIFilePreview/aiFilePreview.theme.js +1 -1
  70. package/dist/components/AIMarker/AIMarker.svelte +2 -0
  71. package/dist/components/AIMarker/aiMarker.mcp.d.ts +1 -1
  72. package/dist/components/AIMarker/aiMarker.mcp.js +2 -0
  73. package/dist/components/AIMarker/aiMarker.props.d.ts +3 -0
  74. package/dist/components/AIMarker/aiMarker.theme.js +2 -2
  75. package/dist/components/AIMessage/AIMessage.svelte +38 -16
  76. package/dist/components/AIMessage/aiMessage.mcp.d.ts +1 -1
  77. package/dist/components/AIMessage/aiMessage.mcp.js +20 -6
  78. package/dist/components/AIMessage/aiMessage.props.d.ts +18 -2
  79. package/dist/components/AIMessage/aiMessage.theme.d.ts +51 -6
  80. package/dist/components/AIMessage/aiMessage.theme.js +91 -32
  81. package/dist/components/AIMessageActions/AIMessageActions.svelte +19 -9
  82. package/dist/components/AIMessageActions/aiMessageActions.mcp.d.ts +1 -1
  83. package/dist/components/AIMessageActions/aiMessageActions.mcp.js +11 -3
  84. package/dist/components/AIMessageActions/aiMessageActions.theme.js +36 -9
  85. package/dist/components/AIModelSelector/AIModelSelector.svelte +25 -10
  86. package/dist/components/AIModelSelector/aiModelSelector.mcp.d.ts +1 -1
  87. package/dist/components/AIModelSelector/aiModelSelector.mcp.js +1 -1
  88. package/dist/components/AIModelSelector/aiModelSelector.theme.d.ts +3 -0
  89. package/dist/components/AIModelSelector/aiModelSelector.theme.js +7 -3
  90. package/dist/components/AIReasoning/AIReasoning.svelte +135 -38
  91. package/dist/components/AIReasoning/aiReasoning.mcp.d.ts +1 -1
  92. package/dist/components/AIReasoning/aiReasoning.mcp.js +11 -5
  93. package/dist/components/AIReasoning/aiReasoning.props.d.ts +15 -4
  94. package/dist/components/AIReasoning/aiReasoning.theme.d.ts +45 -0
  95. package/dist/components/AIReasoning/aiReasoning.theme.js +47 -7
  96. package/dist/components/AISuggestion/AISuggestion.svelte +2 -1
  97. package/dist/components/AISuggestion/AISuggestions.svelte +2 -1
  98. package/dist/components/AISuggestion/aiSuggestion.mcp.d.ts +1 -1
  99. package/dist/components/AISuggestion/aiSuggestion.mcp.js +8 -1
  100. package/dist/components/AISuggestion/aiSuggestion.props.d.ts +4 -1
  101. package/dist/components/AISuggestion/aiSuggestion.theme.js +1 -1
  102. package/dist/components/AISuggestion/aiSuggestions.props.d.ts +7 -0
  103. package/dist/components/AIThread/AIThread.svelte +378 -95
  104. package/dist/components/AIThread/AIThreadAskUserQuestion.svelte +1 -0
  105. package/dist/components/AIThread/AIThreadItems.svelte +266 -64
  106. package/dist/components/AIThread/AIThreadItems.svelte.d.ts +7 -3
  107. package/dist/components/AIThread/AIThreadMarker.svelte +8 -1
  108. package/dist/components/AIThread/AIThreadMarker.svelte.d.ts +1 -0
  109. package/dist/components/AIThread/aiThread.mcp.d.ts +1 -1
  110. package/dist/components/AIThread/aiThread.mcp.js +34 -20
  111. package/dist/components/AIThread/aiThread.props.d.ts +73 -8
  112. package/dist/components/AIThread/aiThread.theme.d.ts +78 -0
  113. package/dist/components/AIThread/aiThread.theme.js +108 -9
  114. package/dist/components/AIThread/index.d.ts +1 -1
  115. package/dist/components/AIThread/threadAskUserQuestion.d.ts +4 -1
  116. package/dist/components/AIThread/threadAskUserQuestion.js +8 -4
  117. package/dist/components/AIThread/threadRenderItems.d.ts +74 -3
  118. package/dist/components/AIThread/threadRenderItems.js +265 -77
  119. package/dist/components/AIThread/threadScrollController.d.ts +0 -8
  120. package/dist/components/AIThread/threadScrollController.js +2 -39
  121. package/dist/components/AIThread/threadTools.d.ts +11 -0
  122. package/dist/components/AIThread/threadTools.js +79 -0
  123. package/dist/components/AIThreadToc/AIThreadToc.svelte +188 -18
  124. package/dist/components/AIThreadToc/AIThreadTocPreview.svelte +25 -2
  125. package/dist/components/AIThreadToc/AIThreadTocPreview.svelte.d.ts +3 -0
  126. package/dist/components/AIThreadToc/aiThreadToc.d.ts +4 -2
  127. package/dist/components/AIThreadToc/aiThreadToc.js +17 -5
  128. package/dist/components/AIThreadToc/aiThreadToc.mcp.d.ts +1 -1
  129. package/dist/components/AIThreadToc/aiThreadToc.mcp.js +13 -3
  130. package/dist/components/AIThreadToc/aiThreadToc.props.d.ts +11 -0
  131. package/dist/components/AIThreadToc/aiThreadToc.theme.d.ts +3 -0
  132. package/dist/components/AIThreadToc/aiThreadToc.theme.js +15 -6
  133. package/dist/components/AITool/AITool.svelte +56 -21
  134. package/dist/components/AITool/AIToolCallList.svelte +79 -29
  135. package/dist/components/AITool/AIToolCallList.svelte.d.ts +6 -2
  136. package/dist/components/AITool/AIToolStatusMark.svelte +52 -0
  137. package/dist/components/AITool/AIToolStatusMark.svelte.d.ts +14 -0
  138. package/dist/components/AITool/AIToolValueSection.svelte +126 -28
  139. package/dist/components/AITool/AIToolValueSection.svelte.d.ts +6 -2
  140. package/dist/components/AITool/AIToolValueTree.svelte +11 -16
  141. package/dist/components/AITool/AIToolValueTree.svelte.d.ts +2 -3
  142. package/dist/components/AITool/aiTool.mcp.d.ts +1 -1
  143. package/dist/components/AITool/aiTool.mcp.js +36 -8
  144. package/dist/components/AITool/aiTool.props.d.ts +52 -6
  145. package/dist/components/AITool/aiTool.theme.d.ts +117 -39
  146. package/dist/components/AITool/aiTool.theme.js +144 -140
  147. package/dist/components/AITool/aiToolClock.svelte.d.ts +18 -0
  148. package/dist/components/AITool/aiToolClock.svelte.js +62 -0
  149. package/dist/components/AITool/aiToolPrimitiveThemes.d.ts +0 -2
  150. package/dist/components/AITool/aiToolPrimitiveThemes.js +0 -10
  151. package/dist/components/AITool/index.d.ts +2 -1
  152. package/dist/components/AITool/index.js +1 -0
  153. package/dist/components/AITool/toolRendering.d.ts +33 -1
  154. package/dist/components/AITool/toolRendering.js +179 -15
  155. package/dist/components/AITool/toolValueTree.d.ts +14 -1
  156. package/dist/components/AITool/toolValueTree.js +126 -27
  157. package/dist/components/Accordion/Accordion.svelte +109 -109
  158. package/dist/components/Accordion/Accordion.svelte.d.ts +0 -1
  159. package/dist/components/Accordion/AccordionPanel.svelte +64 -0
  160. package/dist/components/Accordion/AccordionPanel.svelte.d.ts +20 -0
  161. package/dist/components/Accordion/accordion.attributes.d.ts +24 -0
  162. package/dist/components/Accordion/accordion.attributes.js +20 -0
  163. package/dist/components/Accordion/accordion.mcp.d.ts +1 -1
  164. package/dist/components/Accordion/accordion.mcp.js +78 -22
  165. package/dist/components/Accordion/accordion.props.d.ts +54 -10
  166. package/dist/components/Accordion/accordion.theme.d.ts +3 -0
  167. package/dist/components/Accordion/accordion.theme.js +4 -0
  168. package/dist/components/Accordion/index.d.ts +1 -0
  169. package/dist/components/Accordion/index.js +1 -0
  170. package/dist/components/AudioPlayer/audioPlayerVolumeControl.slider.theme.d.ts +31 -1
  171. package/dist/components/Avatar/Avatar.svelte +60 -10
  172. package/dist/components/Avatar/AvatarGroup.svelte +9 -0
  173. package/dist/components/Avatar/avatar.mcp.d.ts +1 -1
  174. package/dist/components/Avatar/avatar.mcp.js +13 -5
  175. package/dist/components/Avatar/avatar.props.d.ts +28 -1
  176. package/dist/components/Avatar/avatar.theme.js +3 -3
  177. package/dist/components/Avatar/index.d.ts +1 -1
  178. package/dist/components/Breadcrumbs/breadcrumbs.mcp.d.ts +1 -1
  179. package/dist/components/Breadcrumbs/breadcrumbs.mcp.js +1 -1
  180. package/dist/components/Button/Button.svelte +35 -15
  181. package/dist/components/Button/button.mcp.d.ts +1 -1
  182. package/dist/components/Button/button.mcp.js +8 -4
  183. package/dist/components/Button/button.props.d.ts +23 -8
  184. package/dist/components/Button/button.theme.d.ts +12 -0
  185. package/dist/components/Button/button.theme.js +17 -4
  186. package/dist/components/ButtonGroup/buttonGroup.mcp.d.ts +1 -1
  187. package/dist/components/ButtonGroup/buttonGroup.mcp.js +1 -1
  188. package/dist/components/ButtonGroup/buttonGroup.props.d.ts +4 -1
  189. package/dist/components/Collapsible/Collapsible.svelte +125 -19
  190. package/dist/components/Collapsible/collapsible.attributes.d.ts +21 -0
  191. package/dist/components/Collapsible/collapsible.attributes.js +17 -0
  192. package/dist/components/Collapsible/collapsible.mcp.d.ts +1 -1
  193. package/dist/components/Collapsible/collapsible.mcp.js +62 -12
  194. package/dist/components/Collapsible/collapsible.props.d.ts +39 -8
  195. package/dist/components/Collapsible/collapsible.theme.js +3 -1
  196. package/dist/components/Collapsible/index.d.ts +1 -0
  197. package/dist/components/Collapsible/index.js +1 -0
  198. package/dist/components/Command/Command.svelte +56 -14
  199. package/dist/components/Command/command.mcp.d.ts +1 -1
  200. package/dist/components/Command/command.mcp.js +12 -6
  201. package/dist/components/Command/command.props.d.ts +39 -6
  202. package/dist/components/Command/command.state.svelte.d.ts +40 -11
  203. package/dist/components/Command/command.state.svelte.js +75 -28
  204. package/dist/components/Command/command.theme.js +4 -3
  205. package/dist/components/Confirmation/Confirmation.svelte +72 -31
  206. package/dist/components/Confirmation/confirmation.mcp.d.ts +1 -1
  207. package/dist/components/Confirmation/confirmation.mcp.js +5 -4
  208. package/dist/components/ContextMenu/ContextMenu.svelte +126 -16
  209. package/dist/components/ContextMenu/contextMenu.mcp.d.ts +1 -1
  210. package/dist/components/ContextMenu/contextMenu.mcp.js +10 -7
  211. package/dist/components/ContextMenu/contextMenu.props.d.ts +13 -4
  212. package/dist/components/ContextMenu/contextMenu.theme.d.ts +3 -3
  213. package/dist/components/ContextMenu/contextMenu.theme.js +3 -2
  214. package/dist/components/DataTable/DataTable.svelte +4 -9
  215. package/dist/components/DataTable/DataTableEditor.svelte +5 -0
  216. package/dist/components/DataTable/DataTableFilter.svelte +1 -0
  217. package/dist/components/DataTable/DataTableToolbar.svelte +1 -0
  218. package/dist/components/DataTable/dataTable.mcp.d.ts +1 -1
  219. package/dist/components/DataTable/dataTable.mcp.js +4 -2
  220. package/dist/components/DataTable/dataTable.theme.d.ts +0 -3
  221. package/dist/components/DataTable/dataTable.theme.js +9 -6
  222. package/dist/components/Dialog/Dialog.svelte +120 -35
  223. package/dist/components/Dialog/Dialog.svelte.d.ts +1 -1
  224. package/dist/components/Dialog/DialogBackdrop.svelte +21 -1
  225. package/dist/components/Dialog/dialog.api.d.ts +65 -0
  226. package/dist/components/Dialog/dialog.api.js +1 -0
  227. package/dist/components/Dialog/dialog.attributes.d.ts +23 -0
  228. package/dist/components/Dialog/dialog.attributes.js +19 -0
  229. package/dist/components/Dialog/dialog.indent.d.ts +6 -0
  230. package/dist/components/Dialog/dialog.indent.js +16 -0
  231. package/dist/components/Dialog/dialog.mcp.d.ts +1 -1
  232. package/dist/components/Dialog/dialog.mcp.js +195 -22
  233. package/dist/components/Dialog/dialog.props.d.ts +102 -19
  234. package/dist/components/Dialog/dialog.snap.d.ts +40 -0
  235. package/dist/components/Dialog/dialog.snap.js +78 -0
  236. package/dist/components/Dialog/dialog.state.svelte.d.ts +122 -10
  237. package/dist/components/Dialog/dialog.state.svelte.js +525 -66
  238. package/dist/components/Dialog/dialog.theme.d.ts +48 -0
  239. package/dist/components/Dialog/dialog.theme.js +32 -9
  240. package/dist/components/Dialog/index.d.ts +4 -1
  241. package/dist/components/Dialog/index.js +1 -0
  242. package/dist/components/DocumentViewer/DocumentSearchControl.svelte +5 -3
  243. package/dist/components/DocumentViewer/documentOutput.js +2 -1
  244. package/dist/components/FloatingWindow/FloatingWindow.svelte +20 -32
  245. package/dist/components/FloatingWindow/FloatingWindow.svelte.d.ts +1 -1
  246. package/dist/components/FloatingWindow/floatingWindow.mcp.d.ts +1 -1
  247. package/dist/components/FloatingWindow/floatingWindow.mcp.js +3 -3
  248. package/dist/components/FloatingWindow/floatingWindow.props.d.ts +9 -4
  249. package/dist/components/FloatingWindow/floatingWindow.state.svelte.d.ts +8 -2
  250. package/dist/components/FloatingWindow/floatingWindow.state.svelte.js +18 -7
  251. package/dist/components/Form/Ask/Ask.svelte +9 -13
  252. package/dist/components/Form/Ask/ask.mcp.d.ts +1 -1
  253. package/dist/components/Form/Ask/ask.mcp.js +1 -1
  254. package/dist/components/Form/Ask/ask.props.d.ts +1 -1
  255. package/dist/components/Form/Autocomplete/Autocomplete.svelte +418 -0
  256. package/dist/components/Form/Autocomplete/Autocomplete.svelte.d.ts +4 -0
  257. package/dist/components/Form/Autocomplete/autocomplete.items.d.ts +30 -0
  258. package/dist/components/Form/Autocomplete/autocomplete.items.js +64 -0
  259. package/dist/components/Form/Autocomplete/autocomplete.mcp.d.ts +1 -0
  260. package/dist/components/Form/Autocomplete/autocomplete.mcp.js +134 -0
  261. package/dist/components/Form/Autocomplete/autocomplete.props.d.ts +146 -0
  262. package/dist/components/Form/Autocomplete/autocomplete.props.js +1 -0
  263. package/dist/components/Form/Autocomplete/autocomplete.theme.d.ts +213 -0
  264. package/dist/components/Form/Autocomplete/autocomplete.theme.js +119 -0
  265. package/dist/components/Form/Autocomplete/index.d.ts +3 -0
  266. package/dist/components/Form/Autocomplete/index.js +2 -0
  267. package/dist/components/Form/Calendar/CalendarInput.svelte +9 -0
  268. package/dist/components/Form/Calendar/CalendarMonthYearPicker.svelte +3 -0
  269. package/dist/components/Form/Calendar/CalendarPrimitive.svelte +5 -0
  270. package/dist/components/Form/Calendar/calendar.mcp.d.ts +1 -1
  271. package/dist/components/Form/Calendar/calendar.mcp.js +2 -1
  272. package/dist/components/Form/Calendar/calendarInput.props.d.ts +2 -0
  273. package/dist/components/Form/Calendar/useCalendar.svelte.d.ts +3 -0
  274. package/dist/components/Form/Calendar/useCalendar.svelte.js +3 -0
  275. package/dist/components/Form/Checkbox/Checkbox.svelte +17 -2
  276. package/dist/components/Form/Checkbox/checkbox.mcp.d.ts +1 -1
  277. package/dist/components/Form/Checkbox/checkbox.mcp.js +11 -1
  278. package/dist/components/Form/Checkbox/checkbox.props.d.ts +12 -1
  279. package/dist/components/Form/CheckboxesInput/CheckboxLine.svelte +69 -32
  280. package/dist/components/Form/CheckboxesInput/CheckboxLine.svelte.d.ts +10 -2
  281. package/dist/components/Form/CheckboxesInput/CheckboxesInput.svelte +123 -74
  282. package/dist/components/Form/CheckboxesInput/CheckboxesInput.svelte.d.ts +12 -12
  283. package/dist/components/Form/CheckboxesInput/checkboxesInput.mcp.d.ts +1 -1
  284. package/dist/components/Form/CheckboxesInput/checkboxesInput.mcp.js +11 -7
  285. package/dist/components/Form/CheckboxesInput/checkboxesInput.props.d.ts +25 -9
  286. package/dist/components/Form/CheckboxesInput/checkboxesInput.theme.d.ts +12 -0
  287. package/dist/components/Form/CheckboxesInput/checkboxesInput.theme.js +9 -4
  288. package/dist/components/Form/CheckboxesInput/choiceEnter.d.ts +11 -0
  289. package/dist/components/Form/CheckboxesInput/choiceEnter.js +27 -0
  290. package/dist/components/Form/ColorInput/ColorInput.svelte +12 -3
  291. package/dist/components/Form/ColorInput/colorInput.mcp.d.ts +1 -1
  292. package/dist/components/Form/ColorInput/colorInput.mcp.js +1 -0
  293. package/dist/components/Form/ColorPicker/ColorPicker.svelte +11 -2
  294. package/dist/components/Form/ColorPicker/ColorPickerInput.svelte +9 -0
  295. package/dist/components/Form/ColorPicker/colorPicker.mcp.d.ts +1 -1
  296. package/dist/components/Form/ColorPicker/colorPicker.mcp.js +1 -0
  297. package/dist/components/Form/ColorPicker/colorPicker.props.d.ts +2 -0
  298. package/dist/components/Form/ColorPicker/colorPicker.state.svelte.d.ts +4 -0
  299. package/dist/components/Form/ColorPicker/colorPicker.state.svelte.js +12 -8
  300. package/dist/components/Form/Combobox/Combobox.svelte +145 -185
  301. package/dist/components/Form/Combobox/Combobox.svelte.d.ts +1 -1
  302. package/dist/components/Form/Combobox/ComboboxPopup.svelte +128 -0
  303. package/dist/components/Form/Combobox/ComboboxPopup.svelte.d.ts +28 -0
  304. package/dist/components/Form/Combobox/combobox.attributes.d.ts +34 -0
  305. package/dist/components/Form/Combobox/combobox.attributes.js +25 -0
  306. package/dist/components/Form/Combobox/combobox.items.d.ts +28 -0
  307. package/dist/components/Form/Combobox/combobox.items.js +68 -0
  308. package/dist/components/Form/Combobox/combobox.mcp.d.ts +1 -1
  309. package/dist/components/Form/Combobox/combobox.mcp.js +104 -13
  310. package/dist/components/Form/Combobox/combobox.props.d.ts +113 -19
  311. package/dist/components/Form/Combobox/combobox.state.svelte.d.ts +137 -0
  312. package/dist/components/Form/Combobox/combobox.state.svelte.js +375 -0
  313. package/dist/components/Form/Combobox/combobox.theme.d.ts +63 -0
  314. package/dist/components/Form/Combobox/combobox.theme.js +37 -1
  315. package/dist/components/Form/Combobox/index.d.ts +2 -1
  316. package/dist/components/Form/Combobox/index.js +1 -0
  317. package/dist/components/Form/DateInput/DateInput.svelte +11 -3
  318. package/dist/components/Form/DateInput/dateInput.mcp.d.ts +1 -1
  319. package/dist/components/Form/DateInput/dateInput.mcp.js +5 -0
  320. package/dist/components/Form/DateSelector/DateSelector.svelte +5 -2
  321. package/dist/components/Form/DateSelector/DateSelectorInput.svelte +9 -0
  322. package/dist/components/Form/DateSelector/dateSelector.mcp.d.ts +1 -1
  323. package/dist/components/Form/DateSelector/dateSelector.mcp.js +2 -2
  324. package/dist/components/Form/DateSelector/dateSelector.props.d.ts +2 -0
  325. package/dist/components/Form/Field/Field.svelte +256 -30
  326. package/dist/components/Form/Field/Field.svelte.d.ts +9 -0
  327. package/dist/components/Form/Field/FieldGroup.svelte +29 -0
  328. package/dist/components/Form/Field/FieldGroup.svelte.d.ts +11 -0
  329. package/dist/components/Form/Field/FieldHiddenInputs.svelte +187 -0
  330. package/dist/components/Form/Field/FieldHiddenInputs.svelte.d.ts +26 -0
  331. package/dist/components/Form/Field/field.d.ts +64 -8
  332. package/dist/components/Form/Field/field.mcp.d.ts +1 -1
  333. package/dist/components/Form/Field/field.mcp.js +158 -18
  334. package/dist/components/Form/Field/field.messages.d.ts +47 -0
  335. package/dist/components/Form/Field/field.messages.js +64 -0
  336. package/dist/components/Form/Field/field.state.svelte.d.ts +109 -3
  337. package/dist/components/Form/Field/field.state.svelte.js +508 -16
  338. package/dist/components/Form/Field/field.theme.d.ts +46 -0
  339. package/dist/components/Form/Field/field.theme.js +33 -0
  340. package/dist/components/Form/Field/fieldHiddenInputs.props.d.ts +61 -0
  341. package/dist/components/Form/Field/fieldHiddenInputs.props.js +1 -0
  342. package/dist/components/Form/Field/fieldNativeForm.svelte.d.ts +14 -0
  343. package/dist/components/Form/Field/fieldNativeForm.svelte.js +113 -0
  344. package/dist/components/Form/Field/index.d.ts +5 -2
  345. package/dist/components/Form/Field/index.js +1 -0
  346. package/dist/components/Form/Field/schemas.js +7 -2
  347. package/dist/components/Form/File/FileInput.svelte +24 -3
  348. package/dist/components/Form/File/fileInput.mcp.d.ts +1 -1
  349. package/dist/components/Form/File/fileInput.mcp.js +1 -0
  350. package/dist/components/Form/Form/Form.svelte +47 -14
  351. package/dist/components/Form/Form/FormActions.svelte +3 -1
  352. package/dist/components/Form/Form/FormActions.svelte.d.ts +42 -2
  353. package/dist/components/Form/Form/FormFieldRenderer.svelte +40 -2
  354. package/dist/components/Form/Form/FormInputRenderer.svelte +7 -0
  355. package/dist/components/Form/Form/form.d.ts +35 -6
  356. package/dist/components/Form/Form/form.mcp.d.ts +1 -1
  357. package/dist/components/Form/Form/form.mcp.js +113 -13
  358. package/dist/components/Form/Form/form.props.d.ts +32 -1
  359. package/dist/components/Form/Form/form.registry.d.ts +2 -2
  360. package/dist/components/Form/Form/form.registry.js +1 -4
  361. package/dist/components/Form/Form/form.state.svelte.d.ts +1138 -413
  362. package/dist/components/Form/Form/form.state.svelte.js +319 -26
  363. package/dist/components/Form/Form/index.d.ts +3 -1
  364. package/dist/components/Form/Form/visibility.d.ts +3096 -1831
  365. package/dist/components/Form/KeyValueInput/KeyValueInput.svelte +22 -10
  366. package/dist/components/Form/KeyValueInput/keyValueInput.mcp.d.ts +1 -1
  367. package/dist/components/Form/KeyValueInput/keyValueInput.mcp.js +1 -0
  368. package/dist/components/Form/MultiStepForm/MultiStepForm.svelte +12 -5
  369. package/dist/components/Form/MultiStepForm/multiStepForm.mcp.d.ts +1 -1
  370. package/dist/components/Form/MultiStepForm/multiStepForm.mcp.js +5 -3
  371. package/dist/components/Form/MultiStepForm/multiStepForm.props.d.ts +5 -0
  372. package/dist/components/Form/MultiStepForm/multiStepForm.state.svelte.d.ts +1022 -408
  373. package/dist/components/Form/MultiStepForm/multiStepForm.state.svelte.js +48 -24
  374. package/dist/components/Form/NumberInput/NumberInput.svelte +365 -46
  375. package/dist/components/Form/NumberInput/index.d.ts +1 -1
  376. package/dist/components/Form/NumberInput/numberInput.mcp.d.ts +1 -1
  377. package/dist/components/Form/NumberInput/numberInput.mcp.js +55 -30
  378. package/dist/components/Form/NumberInput/numberInput.props.d.ts +64 -4
  379. package/dist/components/Form/PasswordInput/Password.svelte +28 -1
  380. package/dist/components/Form/PasswordInput/index.d.ts +1 -1
  381. package/dist/components/Form/PasswordInput/passwordInput.mcp.d.ts +1 -1
  382. package/dist/components/Form/PasswordInput/passwordInput.mcp.js +20 -2
  383. package/dist/components/Form/PasswordInput/passwordInput.props.d.ts +23 -0
  384. package/dist/components/Form/PhoneInput/PhoneInput.svelte +11 -4
  385. package/dist/components/Form/PhoneInput/PhoneInputCountryPicker.svelte +47 -21
  386. package/dist/components/Form/PhoneInput/phoneInput-cdn.js +2 -1
  387. package/dist/components/Form/PhoneInput/phoneInput.mcp.d.ts +1 -1
  388. package/dist/components/Form/PhoneInput/phoneInput.mcp.js +6 -2
  389. package/dist/components/Form/PhoneInput/phoneInputCountry.d.ts +9 -3
  390. package/dist/components/Form/PhoneInput/phoneInputCountry.js +34 -24
  391. package/dist/components/Form/PinInput/PinInput.svelte +44 -9
  392. package/dist/components/Form/PinInput/PinInputCells.svelte +22 -1
  393. package/dist/components/Form/PinInput/PinInputCells.svelte.d.ts +1 -0
  394. package/dist/components/Form/PinInput/index.d.ts +1 -1
  395. package/dist/components/Form/PinInput/pinInput.mcp.d.ts +1 -1
  396. package/dist/components/Form/PinInput/pinInput.mcp.js +29 -6
  397. package/dist/components/Form/PinInput/pinInput.props.d.ts +38 -4
  398. package/dist/components/Form/PinInput/pinInput.state.svelte.d.ts +41 -0
  399. package/dist/components/Form/PinInput/pinInput.state.svelte.js +227 -24
  400. package/dist/components/Form/PinInput/pinInput.theme.d.ts +39 -3
  401. package/dist/components/Form/PinInput/pinInput.theme.js +27 -1
  402. package/dist/components/Form/RadioInput/RadioInput.svelte +94 -32
  403. package/dist/components/Form/RadioInput/RadioInput.svelte.d.ts +12 -12
  404. package/dist/components/Form/RadioInput/radioInput.mcp.d.ts +1 -1
  405. package/dist/components/Form/RadioInput/radioInput.mcp.js +12 -9
  406. package/dist/components/Form/RadioInput/radioInput.props.d.ts +22 -6
  407. package/dist/components/Form/RadioInput/radioInput.theme.d.ts +12 -0
  408. package/dist/components/Form/RadioInput/radioInput.theme.js +10 -5
  409. package/dist/components/Form/RatingInput/RatingInput.svelte +13 -4
  410. package/dist/components/Form/RatingInput/ratingInput.mcp.d.ts +1 -1
  411. package/dist/components/Form/RatingInput/ratingInput.mcp.js +3 -3
  412. package/dist/components/Form/RatingInput/ratingInput.props.d.ts +1 -1
  413. package/dist/components/Form/Select/Select.svelte +186 -48
  414. package/dist/components/Form/Select/Select.svelte.d.ts +23 -2
  415. package/dist/components/Form/Select/SelectOptionRow.svelte +69 -0
  416. package/dist/components/Form/Select/SelectOptionRow.svelte.d.ts +18 -0
  417. package/dist/components/Form/Select/index.d.ts +2 -1
  418. package/dist/components/Form/Select/index.js +1 -0
  419. package/dist/components/Form/Select/select.align.d.ts +5 -0
  420. package/dist/components/Form/Select/select.align.js +19 -5
  421. package/dist/components/Form/Select/select.attributes.d.ts +36 -0
  422. package/dist/components/Form/Select/select.attributes.js +27 -0
  423. package/dist/components/Form/Select/select.mcp.d.ts +1 -1
  424. package/dist/components/Form/Select/select.mcp.js +103 -18
  425. package/dist/components/Form/Select/select.props.d.ts +87 -10
  426. package/dist/components/Form/Select/select.state.svelte.d.ts +108 -17
  427. package/dist/components/Form/Select/select.state.svelte.js +354 -59
  428. package/dist/components/Form/Select/select.theme.d.ts +21 -0
  429. package/dist/components/Form/Select/select.theme.js +22 -0
  430. package/dist/components/Form/Slider/Slider.svelte +54 -14
  431. package/dist/components/Form/Slider/SliderMarks.svelte +1 -1
  432. package/dist/components/Form/Slider/SliderThumb.svelte +49 -19
  433. package/dist/components/Form/Slider/SliderThumb.svelte.d.ts +8 -2
  434. package/dist/components/Form/Slider/SliderTrack.svelte +33 -12
  435. package/dist/components/Form/Slider/SliderTrack.svelte.d.ts +6 -2
  436. package/dist/components/Form/Slider/index.d.ts +1 -1
  437. package/dist/components/Form/Slider/slider.mcp.d.ts +1 -1
  438. package/dist/components/Form/Slider/slider.mcp.js +55 -11
  439. package/dist/components/Form/Slider/slider.props.d.ts +35 -2
  440. package/dist/components/Form/Slider/slider.state.svelte.d.ts +66 -5
  441. package/dist/components/Form/Slider/slider.state.svelte.js +273 -49
  442. package/dist/components/Form/Slider/slider.theme.d.ts +36 -0
  443. package/dist/components/Form/Slider/slider.theme.js +35 -17
  444. package/dist/components/Form/Switch/Switch.svelte +61 -38
  445. package/dist/components/Form/Switch/switch.mcp.d.ts +1 -1
  446. package/dist/components/Form/Switch/switch.mcp.js +25 -5
  447. package/dist/components/Form/Switch/switch.props.d.ts +14 -1
  448. package/dist/components/Form/Switch/switch.theme.d.ts +12 -0
  449. package/dist/components/Form/Switch/switch.theme.js +8 -3
  450. package/dist/components/Form/TagGroup/TagGroup.svelte +8 -0
  451. package/dist/components/Form/TagGroup/tagGroup.mcp.d.ts +1 -1
  452. package/dist/components/Form/TagGroup/tagGroup.mcp.js +1 -0
  453. package/dist/components/Form/TagsInput/TagsInput.svelte +277 -275
  454. package/dist/components/Form/TagsInput/TagsInput.svelte.d.ts +1 -1
  455. package/dist/components/Form/TagsInput/tagsInput.mcp.d.ts +1 -1
  456. package/dist/components/Form/TagsInput/tagsInput.mcp.js +31 -11
  457. package/dist/components/Form/TagsInput/tagsInput.props.d.ts +6 -26
  458. package/dist/components/Form/TagsInput/tagsInput.theme.d.ts +63 -0
  459. package/dist/components/Form/TagsInput/tagsInput.theme.js +37 -1
  460. package/dist/components/Form/TextArea/TextArea.svelte +8 -0
  461. package/dist/components/Form/TextArea/textArea.mcp.d.ts +1 -1
  462. package/dist/components/Form/TextArea/textArea.mcp.js +1 -0
  463. package/dist/components/Form/TextInput/TextInput.svelte +8 -1
  464. package/dist/components/Form/TextInput/textInput.mcp.d.ts +1 -1
  465. package/dist/components/Form/TextInput/textInput.mcp.js +5 -0
  466. package/dist/components/Form/TimeInput/TimeInput.svelte +9 -1
  467. package/dist/components/Form/TimeInput/timeInput.mcp.d.ts +1 -1
  468. package/dist/components/Form/TimeInput/timeInput.mcp.js +31 -0
  469. package/dist/components/Form/VoiceInput/VoiceInput.svelte +10 -2
  470. package/dist/components/Form/VoiceInput/voiceInput.mcp.d.ts +1 -1
  471. package/dist/components/Form/VoiceInput/voiceInput.mcp.js +1 -0
  472. package/dist/components/GanttChart/GanttDependencyControl.svelte +4 -4
  473. package/dist/components/HoverCard/HoverCard.svelte +100 -10
  474. package/dist/components/HoverCard/hoverCard.attributes.d.ts +33 -0
  475. package/dist/components/HoverCard/hoverCard.attributes.js +24 -0
  476. package/dist/components/HoverCard/hoverCard.mcp.d.ts +1 -1
  477. package/dist/components/HoverCard/hoverCard.mcp.js +61 -2
  478. package/dist/components/HoverCard/hoverCard.props.d.ts +19 -0
  479. package/dist/components/HoverCard/hoverCard.theme.d.ts +12 -0
  480. package/dist/components/HoverCard/hoverCard.theme.js +9 -2
  481. package/dist/components/HoverCard/index.d.ts +1 -0
  482. package/dist/components/HoverCard/index.js +1 -0
  483. package/dist/components/ImageGallery/imageGallery.state.svelte.d.ts +1 -1
  484. package/dist/components/ImageZoom/imageZoom.lightbox.js +40 -6
  485. package/dist/components/ImageZoom/imageZoom.mcp.d.ts +1 -1
  486. package/dist/components/ImageZoom/imageZoom.mcp.js +3 -3
  487. package/dist/components/ImageZoom/imageZoom.props.d.ts +10 -4
  488. package/dist/components/ImageZoom/imageZoom.state.svelte.d.ts +16 -4
  489. package/dist/components/ImageZoom/imageZoom.state.svelte.js +38 -9
  490. package/dist/components/Kanban/kanban.theme.js +7 -3
  491. package/dist/components/Layout/layoutSpacing.d.ts +2 -2
  492. package/dist/components/LinkPreview/LinkPreview.svelte +7 -1
  493. package/dist/components/LinkPreview/linkPreview.mcp.d.ts +1 -1
  494. package/dist/components/LinkPreview/linkPreview.mcp.js +4 -1
  495. package/dist/components/LinkPreview/linkPreview.props.d.ts +15 -0
  496. package/dist/components/LinkPreview/linkPreview.theme.d.ts +12 -0
  497. package/dist/components/LinkPreview/linkPreview.theme.js +9 -2
  498. package/dist/components/Map/maplibre-cdn.js +3 -2
  499. package/dist/components/Markdown/markdown.mcp.d.ts +1 -1
  500. package/dist/components/Markdown/markdown.mcp.js +2 -1
  501. package/dist/components/Markdown/markdown.theme.js +18 -9
  502. package/dist/components/MediaVolume/MediaVolumeControl.svelte +4 -3
  503. package/dist/components/Menu/Menu.svelte +3 -3
  504. package/dist/components/Menu/Menu.svelte.d.ts +1 -1
  505. package/dist/components/Menu/MenuCheckboxItem.svelte +87 -0
  506. package/dist/components/Menu/MenuCheckboxItem.svelte.d.ts +16 -0
  507. package/dist/components/Menu/MenuFloating.svelte +421 -74
  508. package/dist/components/Menu/MenuFloating.svelte.d.ts +1 -1
  509. package/dist/components/Menu/MenuMirroredIcon.svelte +9 -0
  510. package/dist/components/Menu/MenuMirroredIcon.svelte.d.ts +7 -0
  511. package/dist/components/Menu/MenuRadioGroup.svelte +102 -0
  512. package/dist/components/Menu/MenuRadioGroup.svelte.d.ts +18 -0
  513. package/dist/components/Menu/MenuSearchField.svelte +54 -0
  514. package/dist/components/Menu/MenuSearchField.svelte.d.ts +20 -0
  515. package/dist/components/Menu/MenuStacked.svelte +404 -158
  516. package/dist/components/Menu/MenuStacked.svelte.d.ts +1 -1
  517. package/dist/components/Menu/MenuStackedBackHeader.svelte +6 -1
  518. package/dist/components/Menu/index.d.ts +2 -1
  519. package/dist/components/Menu/index.js +1 -0
  520. package/dist/components/Menu/menu.attributes.d.ts +37 -0
  521. package/dist/components/Menu/menu.attributes.js +28 -0
  522. package/dist/components/Menu/menu.filter.svelte.d.ts +52 -0
  523. package/dist/components/Menu/menu.filter.svelte.js +143 -0
  524. package/dist/components/Menu/menu.mcp.d.ts +1 -1
  525. package/dist/components/Menu/menu.mcp.js +227 -17
  526. package/dist/components/Menu/menu.platform.d.ts +5 -0
  527. package/dist/components/Menu/menu.platform.js +11 -0
  528. package/dist/components/Menu/menu.props.d.ts +172 -9
  529. package/dist/components/Menu/menu.theme.d.ts +147 -0
  530. package/dist/components/Menu/menu.theme.js +101 -0
  531. package/dist/components/Menu/menuTree.d.ts +35 -1
  532. package/dist/components/Menu/menuTree.js +158 -1
  533. package/dist/components/MenuBar/menuBar.mcp.d.ts +1 -1
  534. package/dist/components/MenuBar/menuBar.mcp.js +4 -2
  535. package/dist/components/MenuBar/menuBar.state.svelte.js +28 -10
  536. package/dist/components/MenuOption/MenuOption.svelte +5 -1
  537. package/dist/components/MenuOption/menuOption.mcp.d.ts +1 -1
  538. package/dist/components/MenuOption/menuOption.mcp.js +8 -0
  539. package/dist/components/MenuOption/menuOption.props.d.ts +12 -0
  540. package/dist/components/MenuOption/menuOption.theme.d.ts +18 -0
  541. package/dist/components/MenuOption/menuOption.theme.js +24 -4
  542. package/dist/components/Mermaid/mermaid.mcp.d.ts +1 -1
  543. package/dist/components/Mermaid/mermaid.mcp.js +8 -8
  544. package/dist/components/Mermaid/mermaid.props.d.ts +3 -4
  545. package/dist/components/Mermaid/mermaid.state.svelte.d.ts +20 -19
  546. package/dist/components/Mermaid/mermaid.state.svelte.js +80 -243
  547. package/dist/components/Mermaid/mermaid.theme.js +26 -1
  548. package/dist/components/MetadataList/MetadataList.svelte.d.ts +1 -1
  549. package/dist/components/Meter/Meter.svelte +110 -24
  550. package/dist/components/Meter/Meter.svelte.d.ts +12 -12
  551. package/dist/components/Meter/meter.mcp.d.ts +1 -1
  552. package/dist/components/Meter/meter.mcp.js +23 -37
  553. package/dist/components/Meter/meter.props.d.ts +36 -44
  554. package/dist/components/NavigationMenu/NavigationMenu.svelte +181 -0
  555. package/dist/components/NavigationMenu/NavigationMenu.svelte.d.ts +25 -0
  556. package/dist/components/NavigationMenu/NavigationMenuContent.svelte +141 -0
  557. package/dist/components/NavigationMenu/NavigationMenuContent.svelte.d.ts +13 -0
  558. package/dist/components/NavigationMenu/NavigationMenuTrigger.svelte +75 -0
  559. package/dist/components/NavigationMenu/NavigationMenuTrigger.svelte.d.ts +13 -0
  560. package/dist/components/NavigationMenu/index.d.ts +4 -0
  561. package/dist/components/NavigationMenu/index.js +3 -0
  562. package/dist/components/NavigationMenu/navigationMenu.attributes.d.ts +24 -0
  563. package/dist/components/NavigationMenu/navigationMenu.attributes.js +21 -0
  564. package/dist/components/NavigationMenu/navigationMenu.mcp.d.ts +1 -0
  565. package/dist/components/NavigationMenu/navigationMenu.mcp.js +138 -0
  566. package/dist/components/NavigationMenu/navigationMenu.props.d.ts +129 -0
  567. package/dist/components/NavigationMenu/navigationMenu.props.js +1 -0
  568. package/dist/components/NavigationMenu/navigationMenu.state.svelte.d.ts +163 -0
  569. package/dist/components/NavigationMenu/navigationMenu.state.svelte.js +721 -0
  570. package/dist/components/NavigationMenu/navigationMenu.theme.d.ts +326 -0
  571. package/dist/components/NavigationMenu/navigationMenu.theme.js +239 -0
  572. package/dist/components/Overlay/Overlay.svelte +19 -30
  573. package/dist/components/Overlay/index.d.ts +1 -0
  574. package/dist/components/Overlay/index.js +1 -0
  575. package/dist/components/Overlay/overlay.attributes.d.ts +16 -0
  576. package/dist/components/Overlay/overlay.attributes.js +14 -0
  577. package/dist/components/Overlay/overlay.mcp.d.ts +1 -1
  578. package/dist/components/Overlay/overlay.mcp.js +21 -3
  579. package/dist/components/Overlay/overlay.props.d.ts +8 -4
  580. package/dist/components/Popover/Popover.svelte +163 -52
  581. package/dist/components/Popover/Popover.svelte.d.ts +23 -2
  582. package/dist/components/Popover/PopoverSession.svelte +12 -0
  583. package/dist/components/Popover/PopoverSession.svelte.d.ts +7 -0
  584. package/dist/components/Popover/index.d.ts +10 -2
  585. package/dist/components/Popover/index.js +4 -1
  586. package/dist/components/Popover/popover.api.d.ts +83 -0
  587. package/dist/components/Popover/popover.api.js +1 -0
  588. package/dist/components/Popover/popover.attributes.d.ts +32 -0
  589. package/dist/components/Popover/popover.attributes.js +28 -0
  590. package/dist/components/Popover/popover.claims.d.ts +19 -0
  591. package/dist/components/Popover/popover.claims.js +45 -0
  592. package/dist/components/Popover/popover.mcp.d.ts +1 -1
  593. package/dist/components/Popover/popover.mcp.js +163 -31
  594. package/dist/components/Popover/popover.position.d.ts +226 -0
  595. package/dist/components/Popover/popover.position.js +402 -0
  596. package/dist/components/Popover/popover.props.d.ts +179 -24
  597. package/dist/components/Popover/popover.state.svelte.d.ts +169 -37
  598. package/dist/components/Popover/popover.state.svelte.js +1034 -194
  599. package/dist/components/Popover/popover.theme.d.ts +15 -0
  600. package/dist/components/Popover/popover.theme.js +27 -2
  601. package/dist/components/PopupMenu/PopupMenu.svelte +193 -22
  602. package/dist/components/PopupMenu/PopupMenu.svelte.d.ts +2 -2
  603. package/dist/components/PopupMenu/popupMenu.context.d.ts +42 -0
  604. package/dist/components/PopupMenu/popupMenu.context.js +52 -0
  605. package/dist/components/PopupMenu/popupMenu.mcp.d.ts +1 -1
  606. package/dist/components/PopupMenu/popupMenu.mcp.js +46 -6
  607. package/dist/components/PopupMenu/popupMenu.props.d.ts +29 -2
  608. package/dist/components/Progress/Progress.svelte +160 -0
  609. package/dist/components/Progress/Progress.svelte.d.ts +4 -0
  610. package/dist/components/Progress/index.d.ts +3 -0
  611. package/dist/components/Progress/index.js +2 -0
  612. package/dist/components/Progress/progress.mcp.d.ts +1 -0
  613. package/dist/components/Progress/progress.mcp.js +101 -0
  614. package/dist/components/Progress/progress.props.d.ts +79 -0
  615. package/dist/components/Progress/progress.props.js +1 -0
  616. package/dist/components/Progress/progress.theme.d.ts +129 -0
  617. package/dist/components/Progress/progress.theme.js +83 -0
  618. package/dist/components/ProgressCircle/ProgressCircle.svelte +51 -6
  619. package/dist/components/ProgressCircle/progressCircle.mcp.d.ts +1 -1
  620. package/dist/components/ProgressCircle/progressCircle.mcp.js +18 -4
  621. package/dist/components/ProgressCircle/progressCircle.props.d.ts +32 -2
  622. package/dist/components/ProgressCircle/progressCircle.theme.d.ts +15 -3
  623. package/dist/components/ProgressCircle/progressCircle.theme.js +7 -2
  624. package/dist/components/RichTextInput/RichTextInput.svelte +19 -1
  625. package/dist/components/RichTextInput/RichTextInputChrome.svelte +5 -1
  626. package/dist/components/RichTextInput/RichTextInputChrome.svelte.d.ts +2 -0
  627. package/dist/components/RichTextInput/RichTextInputViewport.svelte +3 -1
  628. package/dist/components/RichTextInput/RichTextInputViewport.svelte.d.ts +1 -0
  629. package/dist/components/RichTextInput/richTextInput.mcp.d.ts +1 -1
  630. package/dist/components/RichTextInput/richTextInput.mcp.js +1 -0
  631. package/dist/components/RichTextInput/suggestions.js +2 -0
  632. package/dist/components/ScrollArea/ScrollArea.svelte +166 -27
  633. package/dist/components/ScrollArea/index.d.ts +2 -1
  634. package/dist/components/ScrollArea/index.js +1 -0
  635. package/dist/components/ScrollArea/scrollArea.attributes.d.ts +25 -0
  636. package/dist/components/ScrollArea/scrollArea.attributes.js +21 -0
  637. package/dist/components/ScrollArea/scrollArea.mcp.d.ts +1 -1
  638. package/dist/components/ScrollArea/scrollArea.mcp.js +47 -3
  639. package/dist/components/ScrollArea/scrollArea.props.d.ts +33 -6
  640. package/dist/components/ScrollArea/scrollArea.svelte.d.ts +56 -12
  641. package/dist/components/ScrollArea/scrollArea.svelte.js +281 -71
  642. package/dist/components/ScrollArea/scrollArea.theme.js +5 -2
  643. package/dist/components/SegmentedControl/SegmentedControl.svelte +4 -3
  644. package/dist/components/SegmentedControl/segmentedControl.mcp.d.ts +1 -1
  645. package/dist/components/SegmentedControl/segmentedControl.mcp.js +3 -2
  646. package/dist/components/SelectionMenu/SelectionMenu.svelte +4 -2
  647. package/dist/components/Sidebar/SidebarAction.svelte +13 -3
  648. package/dist/components/Sidebar/SidebarAction.svelte.d.ts +2 -1
  649. package/dist/components/Sidebar/SidebarActivityBar.svelte +14 -7
  650. package/dist/components/Sidebar/SidebarFlyout.svelte +97 -0
  651. package/dist/components/Sidebar/SidebarFlyout.svelte.d.ts +32 -0
  652. package/dist/components/Sidebar/SidebarGroup.svelte +39 -15
  653. package/dist/components/Sidebar/SidebarMenuButton.svelte +6 -3
  654. package/dist/components/Sidebar/SidebarMenuItem.svelte +134 -31
  655. package/dist/components/Sidebar/SidebarMenuSubItem.svelte +30 -14
  656. package/dist/components/Sidebar/SidebarTreeNode.svelte +41 -61
  657. package/dist/components/Sidebar/index.d.ts +1 -0
  658. package/dist/components/Sidebar/index.js +1 -0
  659. package/dist/components/Sidebar/sidebar-position.d.ts +37 -2
  660. package/dist/components/Sidebar/sidebar-position.js +31 -2
  661. package/dist/components/Sidebar/sidebar.attributes.d.ts +33 -0
  662. package/dist/components/Sidebar/sidebar.attributes.js +29 -0
  663. package/dist/components/Sidebar/sidebar.mcp.d.ts +1 -1
  664. package/dist/components/Sidebar/sidebar.mcp.js +45 -10
  665. package/dist/components/Sidebar/sidebar.props.d.ts +28 -7
  666. package/dist/components/Sidebar/sidebar.theme.d.ts +51 -21
  667. package/dist/components/Sidebar/sidebar.theme.js +113 -62
  668. package/dist/components/Sidebar/sidebar.views.svelte.js +11 -18
  669. package/dist/components/Stepper/Stepper.svelte +2 -0
  670. package/dist/components/Stepper/stepper.mcp.d.ts +1 -1
  671. package/dist/components/Stepper/stepper.mcp.js +1 -0
  672. package/dist/components/Stepper/stepper.props.d.ts +5 -0
  673. package/dist/components/Stepper/stepper.state.svelte.d.ts +2 -0
  674. package/dist/components/Stepper/stepper.state.svelte.js +31 -12
  675. package/dist/components/Tabbar/Tabbar.svelte +55 -16
  676. package/dist/components/Tabbar/index.d.ts +1 -1
  677. package/dist/components/Tabbar/tabbar.mcp.d.ts +1 -1
  678. package/dist/components/Tabbar/tabbar.mcp.js +26 -9
  679. package/dist/components/Tabbar/tabbar.props.d.ts +34 -5
  680. package/dist/components/Tabbar/tabbar.selection.svelte.d.ts +79 -0
  681. package/dist/components/Tabbar/tabbar.selection.svelte.js +99 -0
  682. package/dist/components/TableOfContents/tableOfContents.state.svelte.js +9 -7
  683. package/dist/components/Tabs/Tabs.svelte +73 -16
  684. package/dist/components/Tabs/index.d.ts +2 -1
  685. package/dist/components/Tabs/tabs.direction.svelte.d.ts +25 -0
  686. package/dist/components/Tabs/tabs.direction.svelte.js +40 -0
  687. package/dist/components/Tabs/tabs.mcp.d.ts +1 -1
  688. package/dist/components/Tabs/tabs.mcp.js +22 -4
  689. package/dist/components/Tabs/tabs.props.d.ts +39 -12
  690. package/dist/components/Tabs/tabs.theme.js +3 -1
  691. package/dist/components/Theme/Theme.svelte +44 -27
  692. package/dist/components/Theme/helper.d.ts +16 -2
  693. package/dist/components/Theme/helper.js +46 -4
  694. package/dist/components/Theme/theme.mcp.d.ts +1 -1
  695. package/dist/components/Theme/theme.mcp.js +103 -0
  696. package/dist/components/Theme/theme.props.d.ts +16 -0
  697. package/dist/components/Theme/theme.state.svelte.d.ts +14 -1
  698. package/dist/components/Theme/theme.state.svelte.js +18 -1
  699. package/dist/components/Toast/Toast.svelte +184 -39
  700. package/dist/components/Toast/Toaster.svelte +14 -10
  701. package/dist/components/Toast/index.d.ts +1 -0
  702. package/dist/components/Toast/toast.mcp.d.ts +1 -1
  703. package/dist/components/Toast/toast.mcp.js +47 -6
  704. package/dist/components/Toast/toast.state.svelte.d.ts +172 -6
  705. package/dist/components/Toast/toast.state.svelte.js +513 -68
  706. package/dist/components/Toast/toast.theme.js +1 -1
  707. package/dist/components/ToggleButton/ToggleButton.svelte +23 -1
  708. package/dist/components/ToggleButton/toggleButton.mcp.d.ts +1 -1
  709. package/dist/components/ToggleButton/toggleButton.mcp.js +3 -1
  710. package/dist/components/ToggleButton/toggleButton.props.d.ts +13 -1
  711. package/dist/components/ToggleButton/toggleButton.theme.d.ts +12 -0
  712. package/dist/components/ToggleButton/toggleButton.theme.js +15 -3
  713. package/dist/components/ToggleButtonGroup/ToggleButtonGroup.svelte +29 -9
  714. package/dist/components/ToggleButtonGroup/index.d.ts +1 -1
  715. package/dist/components/ToggleButtonGroup/toggleButtonGroup.mcp.d.ts +1 -1
  716. package/dist/components/ToggleButtonGroup/toggleButtonGroup.mcp.js +5 -2
  717. package/dist/components/ToggleButtonGroup/toggleButtonGroup.props.d.ts +19 -1
  718. package/dist/components/ToggleButtonGroup/toggleButtonGroup.theme.d.ts +12 -0
  719. package/dist/components/ToggleButtonGroup/toggleButtonGroup.theme.js +21 -2
  720. package/dist/components/ToggleMenu/ToggleMenu.svelte +57 -43
  721. package/dist/components/ToggleMenu/ToggleMenuGroup.svelte +1 -0
  722. package/dist/components/ToggleMenu/ToggleMenuMenu.svelte +9 -3
  723. package/dist/components/ToggleMenu/ToggleMenuRadioGroup.svelte +7 -2
  724. package/dist/components/ToggleMenu/toggleMenu.mcp.d.ts +1 -1
  725. package/dist/components/ToggleMenu/toggleMenu.mcp.js +3 -2
  726. package/dist/components/ToggleMenu/toggleMenu.props.d.ts +4 -1
  727. package/dist/components/Tooltip/Tooltip.svelte +4 -12
  728. package/dist/components/Tooltip/TooltipHost.svelte +136 -15
  729. package/dist/components/Tooltip/index.d.ts +1 -0
  730. package/dist/components/Tooltip/index.js +1 -0
  731. package/dist/components/Tooltip/tooltip.attachment.svelte.d.ts +5 -0
  732. package/dist/components/Tooltip/tooltip.attachment.svelte.js +215 -33
  733. package/dist/components/Tooltip/tooltip.attributes.d.ts +32 -0
  734. package/dist/components/Tooltip/tooltip.attributes.js +28 -0
  735. package/dist/components/Tooltip/tooltip.mcp.d.ts +1 -1
  736. package/dist/components/Tooltip/tooltip.mcp.js +111 -10
  737. package/dist/components/Tooltip/tooltip.props.d.ts +33 -2
  738. package/dist/components/Tooltip/tooltip.surface.d.ts +24 -0
  739. package/dist/components/Tooltip/tooltip.surface.js +42 -0
  740. package/dist/components/Tree/TreeContextMenuSurface.svelte +16 -3
  741. package/dist/components/Utils/BeforeHydratation.svelte +14 -3
  742. package/dist/components/Utils/BeforeHydratation.svelte.d.ts +2 -0
  743. package/dist/components/VideoPlayer/VideoPlayer.svelte.d.ts +1 -1
  744. package/dist/components/VideoPlayer/VideoPlayerSettings.svelte +2 -0
  745. package/dist/generated/componentAliases.d.ts +3 -0
  746. package/dist/generated/componentAliases.js +3 -0
  747. package/dist/generated/componentContract.d.ts +79 -34
  748. package/dist/generated/componentContract.js +225 -6
  749. package/dist/generated/componentMcpRegistry.js +6 -0
  750. package/dist/i18n/ar.js +107 -3
  751. package/dist/i18n/context.svelte.d.ts +6 -0
  752. package/dist/i18n/context.svelte.js +12 -0
  753. package/dist/i18n/de.js +101 -3
  754. package/dist/i18n/en.d.ts +91 -2
  755. package/dist/i18n/en.js +101 -3
  756. package/dist/i18n/es.js +101 -3
  757. package/dist/i18n/fr.js +101 -3
  758. package/dist/i18n/ja.js +101 -3
  759. package/dist/i18n/pt.js +101 -3
  760. package/dist/i18n/zh.js +101 -3
  761. package/dist/tailwind/geometry.js +7 -0
  762. package/dist/tailwind/global.js +31 -0
  763. package/dist/types/index.d.ts +1 -0
  764. package/dist/types/types.mcp.d.ts +1 -1
  765. package/dist/types/types.mcp.js +23 -0
  766. package/dist/utils/cspNonce.d.ts +16 -0
  767. package/dist/utils/cspNonce.js +39 -0
  768. package/dist/utils/cva/merge.d.ts +5 -1
  769. package/dist/utils/cva/merge.js +6 -4
  770. package/dist/utils/focus.d.ts +34 -0
  771. package/dist/utils/focus.js +93 -0
  772. package/dist/utils/focusHistory.d.ts +21 -0
  773. package/dist/utils/focusHistory.js +99 -0
  774. package/dist/utils/handlers.d.ts +7 -0
  775. package/dist/utils/handlers.js +14 -0
  776. package/dist/utils/hoverIntent.d.ts +42 -0
  777. package/dist/utils/hoverIntent.js +57 -0
  778. package/dist/utils/id.d.ts +7 -0
  779. package/dist/utils/id.js +15 -0
  780. package/dist/utils/layers.svelte.d.ts +32 -4
  781. package/dist/utils/layers.svelte.js +214 -21
  782. package/dist/utils/listFilter.d.ts +44 -0
  783. package/dist/utils/listFilter.js +130 -0
  784. package/dist/utils/match.d.ts +35 -0
  785. package/dist/utils/match.js +36 -0
  786. package/dist/utils/number.d.ts +126 -0
  787. package/dist/utils/number.js +401 -0
  788. package/dist/utils/openChange.d.ts +88 -0
  789. package/dist/utils/openChange.js +71 -0
  790. package/dist/utils/openLifecycle.svelte.d.ts +41 -0
  791. package/dist/utils/openLifecycle.svelte.js +134 -0
  792. package/dist/utils/pointerDrag.d.ts +10 -0
  793. package/dist/utils/pointerDrag.js +37 -2
  794. package/dist/utils/pragmaticDragAndDrop.d.ts +2 -1
  795. package/dist/utils/pragmaticDragAndDrop.js +8 -3
  796. package/dist/utils/range.d.ts +62 -0
  797. package/dist/utils/range.js +70 -0
  798. package/dist/utils/requestNativeSubmit.d.ts +17 -0
  799. package/dist/utils/requestNativeSubmit.js +47 -0
  800. package/dist/utils/safeArea.svelte.d.ts +10 -1
  801. package/dist/utils/safeArea.svelte.js +19 -11
  802. package/dist/utils/stateAttributes.d.ts +108 -0
  803. package/dist/utils/stateAttributes.js +78 -0
  804. package/dist/utils/swipeVelocity.d.ts +32 -0
  805. package/dist/utils/swipeVelocity.js +59 -0
  806. package/dist/utils/timer.svelte.d.ts +65 -2
  807. package/dist/utils/timer.svelte.js +159 -25
  808. package/dist/utils/trigger.d.ts +41 -0
  809. package/dist/utils/trigger.js +103 -0
  810. package/dist/utils/typeahead.d.ts +9 -0
  811. package/dist/utils/typeahead.js +21 -9
  812. package/dist/utils/useDndList.svelte.d.ts +1 -1
  813. package/dist/utils/useDndList.svelte.js +6 -23
  814. package/dist/utils/useFocusScope.svelte.d.ts +29 -0
  815. package/dist/utils/useFocusScope.svelte.js +189 -27
  816. package/dist/utils/useHoverAction.svelte.d.ts +44 -4
  817. package/dist/utils/useHoverAction.svelte.js +161 -51
  818. package/dist/utils/useKeyDown.svelte.d.ts +19 -2
  819. package/dist/utils/useKeyDown.svelte.js +19 -12
  820. package/dist/utils/useListNavigation.svelte.d.ts +94 -13
  821. package/dist/utils/useListNavigation.svelte.js +261 -35
  822. package/dist/utils/useLiveAnnouncer.svelte.d.ts +77 -2
  823. package/dist/utils/useLiveAnnouncer.svelte.js +119 -2
  824. package/dist/utils/useNavigation.svelte.d.ts +36 -3
  825. package/dist/utils/useNavigation.svelte.js +699 -332
  826. package/dist/utils/usePressAndHold.svelte.d.ts +38 -0
  827. package/dist/utils/usePressAndHold.svelte.js +191 -0
  828. package/dist/utils/useScrollLock.svelte.d.ts +20 -1
  829. package/dist/utils/useScrollLock.svelte.js +54 -13
  830. package/dist/utils/useSlidingIndicator.svelte.d.ts +2 -0
  831. package/dist/utils/useSlidingIndicator.svelte.js +27 -5
  832. package/dist/utils/useTabBridge.svelte.d.ts +20 -0
  833. package/dist/utils/useTabBridge.svelte.js +109 -0
  834. package/dist/utils/values.d.ts +15 -0
  835. package/dist/utils/values.js +49 -0
  836. package/package.json +31 -2
  837. package/dist/generated/componentMcpRegistry.d.ts +0 -142
  838. package/dist/utils/useDrag.svelte.d.ts +0 -11
  839. package/dist/utils/useDrag.svelte.js +0 -55
@@ -9,6 +9,8 @@
9
9
  import TextInput from '../TextInput/TextInput.svelte';
10
10
  import type { Sizes } from '../../../types/theme.js';
11
11
  import { useListNavigation } from '../../../utils/useListNavigation.svelte.js';
12
+ import { useLiveAnnouncer } from '../../../utils/useLiveAnnouncer.svelte.js';
13
+ import { untrack } from 'svelte';
12
14
  import type { PhoneInputThemeProps } from './phoneInput.theme.js';
13
15
  import { usePhoneInputTheme } from './phoneInput.theme.js';
14
16
  import { filterPhoneCountryOptions, type PhoneCountryOption } from './phoneInputCountry.js';
@@ -44,7 +46,7 @@
44
46
  const listboxId = $derived(`${id}-listbox`);
45
47
  const classes = $derived(usePhoneInputTheme(theme));
46
48
  const t = $derived(useI18n());
47
- const filteredCountries = $derived(filterPhoneCountryOptions(countries, searchQuery));
49
+ const filteredCountries = $derived(filterPhoneCountryOptions(countries, searchQuery, t.locale));
48
50
  const optionId = (iso2: string) => `${id}-option-${iso2}`;
49
51
 
50
52
  const selectCountry = (iso2: string) => {
@@ -52,21 +54,34 @@
52
54
  if (country) onSelectCountry(country);
53
55
  };
54
56
 
57
+ // The selected country is highlighted when the picker opens and again when the search clears.
55
58
  const nav = useListNavigation({
56
59
  values: () => filteredCountries.map((country) => country.iso2),
57
60
  optionId,
61
+ query: () => searchQuery,
62
+ anchor: () => selectedCountry?.iso2,
58
63
  onSelect: selectCountry
59
64
  });
60
65
 
61
- const highlightSelectedCountry = () => {
62
- const selectedIso2 = selectedCountry?.iso2;
63
- if (selectedIso2 && filteredCountries.some((country) => country.iso2 === selectedIso2)) {
64
- nav.highlight(selectedIso2);
65
- return;
66
- }
67
-
68
- nav.first();
69
- };
66
+ // Result counts and the empty state reach screen readers through one persistent region,
67
+ // announced after typing settles (a region that mounts already filled is skipped).
68
+ const announcer = useLiveAnnouncer(generatedId, 'live');
69
+ $effect(() => {
70
+ const message =
71
+ filteredCountries.length === 0
72
+ ? t.noCountries
73
+ : searchQuery.trim()
74
+ ? t.resultsCount(filteredCountries.length)
75
+ : '';
76
+ return untrack(() => {
77
+ if (!message) {
78
+ announcer.reset();
79
+ return;
80
+ }
81
+ const timer = setTimeout(() => announcer.announce(message), 250);
82
+ return () => clearTimeout(timer);
83
+ });
84
+ });
70
85
 
71
86
  const attachSearchInput: Attachment<HTMLElement> = (node) => {
72
87
  const input = node.querySelector<HTMLInputElement>('input');
@@ -75,17 +90,13 @@
75
90
  searchInput = input;
76
91
  input.setAttribute('role', 'combobox');
77
92
  input.setAttribute('aria-autocomplete', 'list');
78
- input.setAttribute('aria-expanded', 'true');
79
93
  input.setAttribute('aria-haspopup', 'listbox');
80
94
  input.setAttribute('autocomplete', 'off');
81
95
  input.setAttribute('autocorrect', 'off');
82
96
  input.setAttribute('autocapitalize', 'off');
83
97
  input.setAttribute('spellcheck', 'false');
84
98
 
85
- const focusTimeout = setTimeout(() => {
86
- input.focus();
87
- highlightSelectedCountry();
88
- }, 0);
99
+ const focusTimeout = setTimeout(() => input.focus(), 0);
89
100
  const removeKeydown = on(input, 'keydown', nav.onKeydown);
90
101
 
91
102
  return () => {
@@ -109,6 +120,8 @@
109
120
  if (!searchInput) return;
110
121
 
111
122
  searchInput.setAttribute('aria-controls', listboxId);
123
+ // The listbox is hidden while the search matches nothing, so the combobox is collapsed.
124
+ searchInput.setAttribute('aria-expanded', String(filteredCountries.length > 0));
112
125
  if (nav.activeDescendant) {
113
126
  searchInput.setAttribute('aria-activedescendant', nav.activeDescendant);
114
127
  } else {
@@ -121,6 +134,7 @@
121
134
  <TextInput
122
135
  {@attach attachSearchInput}
123
136
  bind:value={searchQuery}
137
+ inputAttrs={{ 'data-1p-ignore': true }}
124
138
  placeholder={searchPlaceholder}
125
139
  {size}
126
140
  class={classes.countrySearch({ class: theme?.countrySearch?.base })}
@@ -145,7 +159,23 @@
145
159
  type="auto"
146
160
  class={classes.countryList({ class: theme?.countryList?.base })}
147
161
  >
148
- <div id={listboxId} role="listbox" aria-label={t.countries} class={classes.countryListbox()}>
162
+ <!-- The empty message lives OUTSIDE the listbox: a listbox may only own options and groups
163
+ (aria-required-children). The persistent live region announces it and the result counts:
164
+ screen readers skip a live region that mounts already filled. -->
165
+ {#if filteredCountries.length === 0}
166
+ <div class={classes.countryEmpty({ size, class: theme?.countryEmpty?.base })}>
167
+ {t.noCountries}
168
+ </div>
169
+ {/if}
170
+ <span class="sr-only" {...announcer.regionAttrs}>{announcer.message}</span>
171
+ <!-- Kept mounted while empty (hidden) so the search input's aria-controls always resolves. -->
172
+ <div
173
+ id={listboxId}
174
+ role="listbox"
175
+ aria-label={t.countries}
176
+ hidden={filteredCountries.length === 0}
177
+ class={classes.countryListbox()}
178
+ >
149
179
  {#each filteredCountries as country (country.iso2)}
150
180
  {@const selected = country.iso2 === selectedCountry?.iso2}
151
181
  {@const highlighted = nav.highlighted === country.iso2}
@@ -166,7 +196,7 @@
166
196
  highlighted,
167
197
  class: theme?.countryOption?.base
168
198
  })}
169
- onpointermove={() => nav.setHighlighted(country.iso2)}
199
+ onpointermove={(event) => nav.pointerHighlight(country.iso2, event)}
170
200
  onclick={() => onSelectCountry(country)}
171
201
  >
172
202
  <span class={classes.countryFlag({ size, class: theme?.countryFlag?.base })}>
@@ -189,10 +219,6 @@
189
219
  })}
190
220
  {/if}
191
221
  </Button>
192
- {:else}
193
- <div class={classes.countryEmpty({ size, class: theme?.countryEmpty?.base })}>
194
- {t.noCountries}
195
- </div>
196
222
  {/each}
197
223
  </div>
198
224
  </ScrollArea>
@@ -1,3 +1,4 @@
1
+ import { applyCspNonce } from '../../../utils/cspNonce.js';
1
2
  const INTL_TEL_INPUT_CDN_VERSION = '29.1.1';
2
3
  const INTL_TEL_INPUT_SCRIPT_ID = 'entasis-intl-tel-input-script';
3
4
  const INTL_TEL_INPUT_SCRIPT_URL = `https://cdn.jsdelivr.net/npm/intl-tel-input@${INTL_TEL_INPUT_CDN_VERSION}/dist/js/intlTelInputWithUtils.min.js`;
@@ -50,7 +51,7 @@ function createIntlTelInputScriptPromise() {
50
51
  });
51
52
  }
52
53
  function createIntlTelInputScript() {
53
- const script = document.createElement('script');
54
+ const script = applyCspNonce(document.createElement('script'));
54
55
  script.id = INTL_TEL_INPUT_SCRIPT_ID;
55
56
  script.src = INTL_TEL_INPUT_SCRIPT_URL;
56
57
  script.async = true;
@@ -1 +1 @@
1
- export declare const phoneInputDescription = "\n# PhoneInput Component\n\nThe PhoneInput component provides a formatted input field for phone numbers with country code selection and automatic formatting. [intl-tel-input](https://intl-tel-input.com/) is loaded from a CDN at runtime and never bundled. A strict Content-Security-Policy must allow `cdn.jsdelivr.net` in `script-src`.\n\n## Basic Usage\n\n```svelte\n<script>\n\tlet phone = $state('');\n</script>\n\n<PhoneInput label=\"Phone Number\" bind:value={phone} />\n```\n\n## Props\n\nExtends all Field component props plus:\n\n### Core Props\n- **value**: string (bindable) - Phone number value\n- **country**: string (bindable, default: 'fr') - ISO country code selected in the country picker\n- **placeholder**: string - Placeholder text\n\n### Field Props (inherited)\n- **label**: string | Snippet - Field label\n- **description**: string | Snippet - Helper text\n- **error**: string - Error message\n- **required**: boolean - Mark as required\n- **disabled**: boolean - Disable input\n- **size**: 'small' | 'normal' | 'large'\n\n### Styling Props\n- **class**: string - Additional CSS classes\n- **theme**: ComponentTheme - Custom theme overrides\n\n## Structure\n\n```\n<Field>\n\t<Label />\n\t<Description />\n\t<InputContainer>\n\t\t<CountrySelector />\n\t\t<PhoneNumberInput />\n\t</InputContainer>\n\t<Error />\n</Field>\n```\n\n## Examples\n\n### Basic Phone Input\n```svelte\n<script>\n\tlet phone = $state('');\n</script>\n\n<PhoneInput \n\tlabel=\"Phone Number\"\n\tbind:value={phone}\n/>\n```\n\n### With Default Country\n```svelte\n<PhoneInput \n\tlabel=\"Phone Number\"\n\tbind:value={phone}\n\tcountry=\"gb\"\n/>\n```\n\n### Required Field\n```svelte\n<PhoneInput \n\tlabel=\"Contact Number\"\n\tbind:value={phone}\n\trequired\n/>\n```\n\n### With Description\n```svelte\n<PhoneInput \n\tlabel=\"Mobile Number\"\n\tdescription=\"We'll send verification code to this number\"\n\tbind:value={phone}\n/>\n```\n\n### Disabled State\n```svelte\n<PhoneInput \n\tlabel=\"Phone\"\n\tvalue=\"+1 234 567 8900\"\n\tdisabled\n/>\n```\n\n### Contact Form\n```svelte\n<script>\n\tlet contact = $state({\n\t\tname: '',\n\t\temail: '',\n\t\tphone: ''\n\t});\n</script>\n\n<form>\n\t<TextInput \n\t\tlabel=\"Name\"\n\t\tbind:value={contact.name}\n\t\trequired\n\t/>\n\t\n\t<TextInput \n\t\ttype=\"email\"\n\t\tlabel=\"Email\"\n\t\tbind:value={contact.email}\n\t\trequired\n\t/>\n\t\n\t<PhoneInput \n\t\tlabel=\"Phone\"\n\t\tbind:value={contact.phone}\n\t\trequired\n\t/>\n\t\n\t<Button type=\"submit\">Submit</Button>\n</form>\n```\n\n### Multiple Phone Numbers\n```svelte\n<script>\n\tlet phones = $state({\n\t\thome: '',\n\t\tmobile: '',\n\t\twork: ''\n\t});\n</script>\n\n<PhoneInput \n\tlabel=\"Home Phone\"\n\tbind:value={phones.home}\n/>\n\n<PhoneInput \n\tlabel=\"Mobile Phone\"\n\tbind:value={phones.mobile}\n\trequired\n/>\n\n<PhoneInput \n\tlabel=\"Work Phone\"\n\tbind:value={phones.work}\n/>\n```\n\n### With Validation\n```svelte\n<script>\n\tlet phone = $state('');\n\tlet error = $state('');\n\t\n\tfunction validatePhone(value) {\n\t\t// Simple validation - in production use a proper library\n\t\tif (!value) return '';\n\t\tif (value.length < 10) return 'Phone number is too short';\n\t\treturn '';\n\t}\n\t\n\t$effect(() => {\n\t\terror = validatePhone(phone);\n\t});\n</script>\n\n<PhoneInput \n\tlabel=\"Phone Number\"\n\tbind:value={phone}\n\terror={error}\n\trequired\n/>\n```\n\n### International Support\n```svelte\n<script>\n\tlet phoneNumbers = $state({\n\t\tus: '',\n\t\tuk: '',\n\t\tfr: ''\n\t});\n</script>\n\n<PhoneInput \n\tlabel=\"US Number\"\n\tbind:value={phoneNumbers.us}\n\tcountry=\"us\"\n/>\n\n<PhoneInput \n\tlabel=\"UK Number\"\n\tbind:value={phoneNumbers.uk}\n\tcountry=\"gb\"\n/>\n\n<PhoneInput \n\tlabel=\"France Number\"\n\tbind:value={phoneNumbers.fr}\n\tcountry=\"fr\"\n/>\n```\n\n### Delivery Information\n```svelte\n<script>\n\tlet delivery = $state({\n\t\taddress: '',\n\t\tphone: '',\n\t\tnotes: ''\n\t});\n</script>\n\n<form>\n\t<TextArea \n\t\tlabel=\"Delivery Address\"\n\t\tbind:value={delivery.address}\n\t\trequired\n\t/>\n\t\n\t<PhoneInput \n\t\tlabel=\"Contact Phone\"\n\t\tdescription=\"For delivery updates\"\n\t\tbind:value={delivery.phone}\n\t\trequired\n\t/>\n\t\n\t<TextArea \n\t\tlabel=\"Delivery Notes\"\n\t\tbind:value={delivery.notes}\n\t/>\n\t\n\t<Button type=\"submit\">Confirm Order</Button>\n</form>\n```\n\n## Formatting\n\nPhoneInput automatically formats numbers based on the selected country:\n- US: (123) 456-7890\n- UK: 07123 456789\n- International: +XX XXX XXX XXXX\n\n## Country Selection\n\n- Searchable dropdown of countries\n- Country flags displayed\n- International dialing codes shown\n- Detects country from phone number\n\n## Validation\n\nPhoneInput validates:\n- **required**: Non-empty phone number\n- **format**: Valid phone number format for selected country\n- **length**: Appropriate length for country\n\n## Accessibility\n\n- Proper label association\n- Country selector is keyboard accessible\n- ARIA attributes for required state\n- Error messages announced\n- Focus management between country and number\n\n## Notes\n\n- intl-tel-input loads from a CDN on first mount; nothing is bundled. A network connection is required for formatting and validation.\n- Automatically formats as user types\n- Supports international phone numbers\n- Country code is included in value\n- Validation depends on country format\n- Works with form libraries and validation schemas\n\n## Theme Customization\n\nThe PhoneInput component uses a theme object that can be customized using the `theme` prop or by setting a global theme. It shares the same theme structure as TextInput.\n\n### Theme Structure\n\nThe theme object contains the following parts:\n- **input**: Input element styles\n- **inputContainer**: Input container wrapper styles\n\n### Available Variants\n\n**input**:\n- base: Base classes applied to the input element\n- Variants:\n - size: 'small' | 'normal' | 'large' - Text size\n - disabled: boolean - Disabled state styling\n\n**inputContainer**:\n- base: Base classes for the input container (handles focus states, borders, padding)\n- Variants:\n - size: 'small' | 'normal' | 'large' - Size-based styling\n - disabled: boolean - Disabled state styling\n\n### Usage Examples\n\n**Basic Theme Override**:\n```svelte\n<PhoneInput \n label=\"Phone Number\"\n bind:value={phone}\n theme={{\n inputContainer: {\n base: 'border-2 rounded-lg',\n size: {\n normal: 'px-4 py-2'\n }\n },\n input: {\n size: {\n normal: 'text-base'\n }\n }\n }}\n/>\n```\n\n**Focus State Customization**:\n\nTo recolor every focus ring in the app at once, set `designTokens.focusColor` on `Theme`\ninstead of overriding per component. `ring-focus` is the focus state role and falls back to the\ncurrent role, so it never hard-pins a color.\n\n```svelte\n<PhoneInput \n label=\"Contact Phone\"\n bind:value={phone}\n theme={{\n inputContainer: {\n base: 'focus-within:ring-2 focus-within:ring-focus/50 focus-within:border-focus'\n }\n }}\n/>\n```\n\n**Global Theme Setting**:\n```svelte\n<script>\n import { setPhoneInputTheme } from './index.ts';\n \n setPhoneInputTheme({\n inputContainer: {\n base: 'rounded-lg border-2 transition-all',\n size: {\n normal: 'px-4 py-2'\n }\n },\n input: {\n base: 'placeholder:text-gray-400'\n }\n });\n</script>\n```\n\n## State contract\n\n- **value**: current bindable editable value.\n- **defaultValue**: initial value used only when `value` is omitted.\n- **onValueChange**: called with the new value when the component changes it.\n\n";
1
+ export declare const phoneInputDescription = "\n# PhoneInput Component\n\nThe PhoneInput component provides a formatted input field for phone numbers with country code selection and automatic formatting. [intl-tel-input](https://intl-tel-input.com/) is loaded from a CDN at runtime and never bundled. A strict Content-Security-Policy must allow `cdn.jsdelivr.net` in `script-src`.\n\n## Basic Usage\n\n```svelte\n<script>\n\tlet phone = $state('');\n</script>\n\n<PhoneInput label=\"Phone Number\" bind:value={phone} />\n```\n\n## Props\n\nExtends all Field component props plus:\n\n### Core Props\n- **value**: string (bindable) - Phone number value\n- **country**: string (bindable, default: 'fr') - ISO country code selected in the country picker\n- **placeholder**: string - Placeholder text\n\n### Field Props (inherited)\n- **label**: string | Snippet - Field label\n- **description**: string | Snippet - Helper text\n- **error**: string - Error message\n- **required**: boolean - Mark as required\n- **disabled**: boolean - Disable input\n- **readOnly**: boolean - Make the input read-only: stays focusable and announced as read-only, refuses edits, and still validates and submits. A read-only Form, FormGroup or fieldset Field makes it read-only too\n- **size**: 'small' | 'normal' | 'large'\n\n### Styling Props\n- **class**: string - Additional CSS classes\n- **theme**: ComponentTheme - Custom theme overrides\n\n## Structure\n\n```\n<Field>\n\t<Label />\n\t<Description />\n\t<InputContainer>\n\t\t<CountrySelector />\n\t\t<PhoneNumberInput />\n\t</InputContainer>\n\t<Error />\n</Field>\n```\n\n## Examples\n\n### Basic Phone Input\n```svelte\n<script>\n\tlet phone = $state('');\n</script>\n\n<PhoneInput \n\tlabel=\"Phone Number\"\n\tbind:value={phone}\n/>\n```\n\n### With Default Country\n```svelte\n<PhoneInput \n\tlabel=\"Phone Number\"\n\tbind:value={phone}\n\tcountry=\"gb\"\n/>\n```\n\n### Required Field\n```svelte\n<PhoneInput \n\tlabel=\"Contact Number\"\n\tbind:value={phone}\n\trequired\n/>\n```\n\n### With Description\n```svelte\n<PhoneInput \n\tlabel=\"Mobile Number\"\n\tdescription=\"We'll send verification code to this number\"\n\tbind:value={phone}\n/>\n```\n\n### Disabled State\n```svelte\n<PhoneInput \n\tlabel=\"Phone\"\n\tvalue=\"+1 234 567 8900\"\n\tdisabled\n/>\n```\n\n### Contact Form\n```svelte\n<script>\n\tlet contact = $state({\n\t\tname: '',\n\t\temail: '',\n\t\tphone: ''\n\t});\n</script>\n\n<form>\n\t<TextInput \n\t\tlabel=\"Name\"\n\t\tbind:value={contact.name}\n\t\trequired\n\t/>\n\t\n\t<TextInput \n\t\ttype=\"email\"\n\t\tlabel=\"Email\"\n\t\tbind:value={contact.email}\n\t\trequired\n\t/>\n\t\n\t<PhoneInput \n\t\tlabel=\"Phone\"\n\t\tbind:value={contact.phone}\n\t\trequired\n\t/>\n\t\n\t<Button type=\"submit\">Submit</Button>\n</form>\n```\n\n### Multiple Phone Numbers\n```svelte\n<script>\n\tlet phones = $state({\n\t\thome: '',\n\t\tmobile: '',\n\t\twork: ''\n\t});\n</script>\n\n<PhoneInput \n\tlabel=\"Home Phone\"\n\tbind:value={phones.home}\n/>\n\n<PhoneInput \n\tlabel=\"Mobile Phone\"\n\tbind:value={phones.mobile}\n\trequired\n/>\n\n<PhoneInput \n\tlabel=\"Work Phone\"\n\tbind:value={phones.work}\n/>\n```\n\n### With Validation\n```svelte\n<script>\n\tlet phone = $state('');\n\tlet error = $state('');\n\t\n\tfunction validatePhone(value) {\n\t\t// Simple validation - in production use a proper library\n\t\tif (!value) return '';\n\t\tif (value.length < 10) return 'Phone number is too short';\n\t\treturn '';\n\t}\n\t\n\t$effect(() => {\n\t\terror = validatePhone(phone);\n\t});\n</script>\n\n<PhoneInput \n\tlabel=\"Phone Number\"\n\tbind:value={phone}\n\terror={error}\n\trequired\n/>\n```\n\n### International Support\n```svelte\n<script>\n\tlet phoneNumbers = $state({\n\t\tus: '',\n\t\tuk: '',\n\t\tfr: ''\n\t});\n</script>\n\n<PhoneInput \n\tlabel=\"US Number\"\n\tbind:value={phoneNumbers.us}\n\tcountry=\"us\"\n/>\n\n<PhoneInput \n\tlabel=\"UK Number\"\n\tbind:value={phoneNumbers.uk}\n\tcountry=\"gb\"\n/>\n\n<PhoneInput \n\tlabel=\"France Number\"\n\tbind:value={phoneNumbers.fr}\n\tcountry=\"fr\"\n/>\n```\n\n### Delivery Information\n```svelte\n<script>\n\tlet delivery = $state({\n\t\taddress: '',\n\t\tphone: '',\n\t\tnotes: ''\n\t});\n</script>\n\n<form>\n\t<TextArea \n\t\tlabel=\"Delivery Address\"\n\t\tbind:value={delivery.address}\n\t\trequired\n\t/>\n\t\n\t<PhoneInput \n\t\tlabel=\"Contact Phone\"\n\t\tdescription=\"For delivery updates\"\n\t\tbind:value={delivery.phone}\n\t\trequired\n\t/>\n\t\n\t<TextArea \n\t\tlabel=\"Delivery Notes\"\n\t\tbind:value={delivery.notes}\n\t/>\n\t\n\t<Button type=\"submit\">Confirm Order</Button>\n</form>\n```\n\n## Formatting\n\nPhoneInput automatically formats numbers based on the selected country:\n- US: (123) 456-7890\n- UK: 07123 456789\n- International: +XX XXX XXX XXXX\n\n## Country Selection\n\n- Searchable dropdown of countries: names are written, sorted and searched in the active I18n locale (`Intl.DisplayNames`), ignoring case and accents (\"cote\" finds \"C\u00F4te d\u2019Ivoire\"); the dial code (`+33`) and ISO code match too\n- The selected country is highlighted when the picker opens and again when the search is cleared\n- Country flags displayed\n- International dialing codes shown\n- Detects country from phone number\n\n## Validation\n\nPhoneInput validates:\n- **required**: Non-empty phone number\n- **format**: Valid phone number format for selected country\n- **length**: Appropriate length for country\n\n## Accessibility\n\n- Proper label association\n- Country selector is keyboard accessible: the search input is a `role=\"combobox\"` that drives the country `role=\"listbox\"` through `aria-activedescendant`\n- A persistent visually hidden `role=\"status\"` region inside the picker announces result counts (\"3 results available\") and \"No countries found\" after typing settles; the visible empty message is plain text outside the listbox, the empty listbox is hidden and the search combobox reports `aria-expanded=\"false\"`\n- ARIA attributes for required state\n- Error messages announced\n- Focus management between country and number\n\n## Notes\n\n- intl-tel-input loads from a CDN on first mount; nothing is bundled. A network connection is required for formatting and validation.\n- Automatically formats as user types\n- Supports international phone numbers\n- Country code is included in value\n- Validation depends on country format\n- Works with form libraries and validation schemas\n- Password managers and browser autofill are not blocked on the number input\n\n## Theme Customization\n\nThe PhoneInput component uses a theme object that can be customized using the `theme` prop or by setting a global theme. It shares the same theme structure as TextInput.\n\n### Theme Structure\n\nThe theme object contains the following parts:\n- **input**: Input element styles\n- **inputContainer**: Input container wrapper styles\n\n### Available Variants\n\n**input**:\n- base: Base classes applied to the input element\n- Variants:\n - size: 'small' | 'normal' | 'large' - Text size\n - disabled: boolean - Disabled state styling\n\n**inputContainer**:\n- base: Base classes for the input container (handles focus states, borders, padding)\n- Variants:\n - size: 'small' | 'normal' | 'large' - Size-based styling\n - disabled: boolean - Disabled state styling\n\n### Usage Examples\n\n**Basic Theme Override**:\n```svelte\n<PhoneInput \n label=\"Phone Number\"\n bind:value={phone}\n theme={{\n inputContainer: {\n base: 'border-2 rounded-lg',\n size: {\n normal: 'px-4 py-2'\n }\n },\n input: {\n size: {\n normal: 'text-base'\n }\n }\n }}\n/>\n```\n\n**Focus State Customization**:\n\nTo recolor every focus ring in the app at once, set `designTokens.focusColor` on `Theme`\ninstead of overriding per component. `ring-focus` is the focus state role and falls back to the\ncurrent role, so it never hard-pins a color.\n\n```svelte\n<PhoneInput \n label=\"Contact Phone\"\n bind:value={phone}\n theme={{\n inputContainer: {\n base: 'focus-within:ring-2 focus-within:ring-focus/50 focus-within:border-focus'\n }\n }}\n/>\n```\n\n**Global Theme Setting**:\n```svelte\n<script>\n import { setPhoneInputTheme } from './index.ts';\n \n setPhoneInputTheme({\n inputContainer: {\n base: 'rounded-lg border-2 transition-all',\n size: {\n normal: 'px-4 py-2'\n }\n },\n input: {\n base: 'placeholder:text-gray-400'\n }\n });\n</script>\n```\n\n## State contract\n\n- **value**: current bindable editable value.\n- **defaultValue**: initial value used only when `value` is omitted.\n- **onValueChange**: called with the new value when the component changes it.\n\n";
@@ -28,6 +28,7 @@ Extends all Field component props plus:
28
28
  - **error**: string - Error message
29
29
  - **required**: boolean - Mark as required
30
30
  - **disabled**: boolean - Disable input
31
+ - **readOnly**: boolean - Make the input read-only: stays focusable and announced as read-only, refuses edits, and still validates and submits. A read-only Form, FormGroup or fieldset Field makes it read-only too
31
32
  - **size**: 'small' | 'normal' | 'large'
32
33
 
33
34
  ### Styling Props
@@ -256,7 +257,8 @@ PhoneInput automatically formats numbers based on the selected country:
256
257
 
257
258
  ## Country Selection
258
259
 
259
- - Searchable dropdown of countries
260
+ - Searchable dropdown of countries: names are written, sorted and searched in the active I18n locale (\`Intl.DisplayNames\`), ignoring case and accents ("cote" finds "Côte d’Ivoire"); the dial code (\`+33\`) and ISO code match too
261
+ - The selected country is highlighted when the picker opens and again when the search is cleared
260
262
  - Country flags displayed
261
263
  - International dialing codes shown
262
264
  - Detects country from phone number
@@ -271,7 +273,8 @@ PhoneInput validates:
271
273
  ## Accessibility
272
274
 
273
275
  - Proper label association
274
- - Country selector is keyboard accessible
276
+ - Country selector is keyboard accessible: the search input is a \`role="combobox"\` that drives the country \`role="listbox"\` through \`aria-activedescendant\`
277
+ - A persistent visually hidden \`role="status"\` region inside the picker announces result counts ("3 results available") and "No countries found" after typing settles; the visible empty message is plain text outside the listbox, the empty listbox is hidden and the search combobox reports \`aria-expanded="false"\`
275
278
  - ARIA attributes for required state
276
279
  - Error messages announced
277
280
  - Focus management between country and number
@@ -284,6 +287,7 @@ PhoneInput validates:
284
287
  - Country code is included in value
285
288
  - Validation depends on country format
286
289
  - Works with form libraries and validation schemas
290
+ - Password managers and browser autofill are not blocked on the number input
287
291
 
288
292
  ## Theme Customization
289
293
 
@@ -4,8 +4,14 @@ export type PhoneCountryOption = {
4
4
  name: string;
5
5
  dialCode: string;
6
6
  flag: string;
7
- searchText: string;
8
7
  };
9
- export declare const createPhoneCountryOptions: (countries: PhoneCountry[]) => PhoneCountryOption[];
10
- export declare const filterPhoneCountryOptions: (countries: PhoneCountryOption[], searchQuery: string) => PhoneCountryOption[];
8
+ /**
9
+ * The country list with names written in `locale` and sorted by that locale's alphabet.
10
+ */
11
+ export declare const createPhoneCountryOptions: (countries: PhoneCountry[], locale?: string) => PhoneCountryOption[];
12
+ /**
13
+ * The countries whose name, ISO code or dial code (`+33`) contains the search text, ignoring case
14
+ * and accents in `locale`.
15
+ */
16
+ export declare const filterPhoneCountryOptions: (countries: PhoneCountryOption[], searchQuery: string, locale?: string) => PhoneCountryOption[];
11
17
  export declare const getPhoneCountryOption: (countries: PhoneCountryOption[], iso2?: string | null) => PhoneCountryOption | null;
@@ -1,42 +1,52 @@
1
- const normalizeSearchText = (value) => value
2
- .normalize('NFD')
3
- .replace(/[\u0300-\u036f]/g, '')
4
- .toLowerCase();
5
- const getDisplayNames = () => {
1
+ import { createListFilter } from '../../../utils/listFilter.js';
2
+ const getDisplayNames = (locale) => {
6
3
  if (typeof Intl === 'undefined' || typeof Intl.DisplayNames !== 'function') {
7
4
  return null;
8
5
  }
9
6
  try {
10
- return new Intl.DisplayNames('en', { type: 'region' });
7
+ return new Intl.DisplayNames(locale, { type: 'region' });
11
8
  }
12
9
  catch {
13
10
  return null;
14
11
  }
15
12
  };
13
+ const getCollator = (locale) => {
14
+ try {
15
+ return new Intl.Collator(locale);
16
+ }
17
+ catch {
18
+ return new Intl.Collator();
19
+ }
20
+ };
16
21
  const getCountryName = (iso2, displayNames) => displayNames?.of(iso2.toUpperCase()) || iso2.toUpperCase();
17
22
  const getCountryFlag = (iso2) => iso2.toUpperCase().replace(/./g, (letter) => String.fromCodePoint(127397 + letter.charCodeAt(0)));
18
- export const createPhoneCountryOptions = (countries) => {
19
- const displayNames = getDisplayNames();
23
+ /**
24
+ * The country list with names written in `locale` and sorted by that locale's alphabet.
25
+ */
26
+ export const createPhoneCountryOptions = (countries, locale = 'en') => {
27
+ const displayNames = getDisplayNames(locale);
28
+ const collator = getCollator(locale);
20
29
  return countries
21
- .map((country) => {
22
- const name = getCountryName(country.iso2, displayNames);
23
- const dialCode = `+${country.dialCode}`;
24
- return {
25
- iso2: country.iso2,
26
- name,
27
- dialCode: country.dialCode,
28
- flag: getCountryFlag(country.iso2),
29
- searchText: normalizeSearchText(`${name} ${country.iso2} ${dialCode}`)
30
- };
31
- })
32
- .sort((firstCountry, secondCountry) => firstCountry.name.localeCompare(secondCountry.name));
30
+ .map((country) => ({
31
+ iso2: country.iso2,
32
+ name: getCountryName(country.iso2, displayNames),
33
+ dialCode: country.dialCode,
34
+ flag: getCountryFlag(country.iso2)
35
+ }))
36
+ .sort((firstCountry, secondCountry) => collator.compare(firstCountry.name, secondCountry.name));
33
37
  };
34
- export const filterPhoneCountryOptions = (countries, searchQuery) => {
35
- const normalizedQuery = normalizeSearchText(searchQuery.trim());
36
- if (!normalizedQuery) {
38
+ /**
39
+ * The countries whose name, ISO code or dial code (`+33`) contains the search text, ignoring case
40
+ * and accents in `locale`.
41
+ */
42
+ export const filterPhoneCountryOptions = (countries, searchQuery, locale = 'en') => {
43
+ const query = searchQuery.trim();
44
+ if (!query) {
37
45
  return countries;
38
46
  }
39
- return countries.filter((country) => country.searchText.includes(normalizedQuery));
47
+ return createListFilter({ locale }).filter(countries, query, {
48
+ text: (country) => [country.name, country.iso2, `+${country.dialCode}`]
49
+ });
40
50
  };
41
51
  export const getPhoneCountryOption = (countries, iso2) => {
42
52
  if (!iso2) {
@@ -1,10 +1,15 @@
1
1
  <script lang="ts">
2
2
  import { untrack } from 'svelte';
3
3
  import Field from '../Field/Field.svelte';
4
- import { createFieldState } from '../Field/field.state.svelte.js';
4
+ import { createFieldState, type FieldValidatorResult } from '../Field/field.state.svelte.js';
5
+ import { useI18n } from '../../../i18n/context.svelte.js';
5
6
  import PinInputCells from './PinInputCells.svelte';
6
7
  import type { PinInputProps } from './pinInput.props.js';
7
- import { PIN_INPUT_DIGITS_PATTERN, PinInputState } from './pinInput.state.svelte.js';
8
+ import {
9
+ PIN_INPUT_DIGITS_PATTERN,
10
+ PIN_INPUT_TEXT_MARGIN,
11
+ PinInputState
12
+ } from './pinInput.state.svelte.js';
8
13
  import { usePinInputTheme } from './pinInput.theme.js';
9
14
 
10
15
  let {
@@ -18,9 +23,15 @@
18
23
  inputMode = 'numeric',
19
24
  autocomplete = 'one-time-code',
20
25
  pasteTransformer,
26
+ normalizeValue,
27
+ onRejectInput,
28
+ submitOnComplete = false,
29
+ groups,
21
30
  mask = false,
22
31
  theme,
23
32
  disabled,
33
+ readOnly,
34
+ messages,
24
35
  name,
25
36
  onValidate,
26
37
  onValueChange,
@@ -30,6 +41,7 @@
30
41
  description,
31
42
  ...rest
32
43
  }: PinInputProps = $props();
44
+ const t = $derived(useI18n());
33
45
  if (value === undefined) value = untrack(() => defaultValue);
34
46
 
35
47
  const id = $props.id();
@@ -62,6 +74,12 @@
62
74
  set disabled(v: boolean | undefined) {
63
75
  disabled = v;
64
76
  },
77
+ get readOnly() {
78
+ return readOnly;
79
+ },
80
+ get messages() {
81
+ return messages;
82
+ },
65
83
  get required() {
66
84
  return required;
67
85
  },
@@ -71,9 +89,9 @@
71
89
  set name(v: string | undefined) {
72
90
  name = v;
73
91
  },
74
- onValidate: (currentValue) => {
92
+ onValidate: (currentValue): FieldValidatorResult => {
75
93
  if (required && typeof currentValue === 'string' && currentValue.length < resolvedLength()) {
76
- return true;
94
+ return field.messages.incomplete(resolvedLength());
77
95
  }
78
96
  return onValidate?.(currentValue) || false;
79
97
  },
@@ -94,8 +112,18 @@
94
112
  length: resolvedLength,
95
113
  pattern: () => pattern,
96
114
  pasteTransformer: () => pasteTransformer,
115
+ normalizeValue: () => normalizeValue,
116
+ onRejectInput: () => onRejectInput,
97
117
  onComplete: () => onComplete,
98
- disabled: () => field.disabled
118
+ // Inside a Form it validates first and keeps focus on an earlier invalid field; the code
119
+ // input never takes focus back. Outside one, the native form submits.
120
+ submit: () => () => {
121
+ if (field.form) void field.form.submit();
122
+ else (field.node as HTMLInputElement | null)?.form?.requestSubmit();
123
+ },
124
+ submitOnComplete: () => submitOnComplete,
125
+ disabled: () => field.disabled,
126
+ readOnly: () => field.readOnly
99
127
  });
100
128
 
101
129
  const classes = $derived(usePinInputTheme(theme));
@@ -118,10 +146,14 @@
118
146
  }}
119
147
  {...rest}
120
148
  >
149
+ <!-- Digits and codes read left to right in every document direction, so the cells and the
150
+ native caret over the transparent input agree. -->
121
151
  <div
152
+ dir="ltr"
122
153
  data-slot="pin-input"
123
154
  data-focused={state.isFocused}
124
155
  data-disabled={field.disabled}
156
+ data-readonly={field.readOnly || undefined}
125
157
  class={classes.root({ size: rest.size, disabled: field.disabled })}
126
158
  >
127
159
  <input
@@ -129,21 +161,24 @@
129
161
  {@attach state.inputAttachment}
130
162
  data-slot="pin-input-input"
131
163
  type="text"
164
+ dir="ltr"
132
165
  {id}
133
166
  name={field.name}
134
167
  value={state.value}
135
- maxlength={state.length}
168
+ maxlength={state.length + PIN_INPUT_TEXT_MARGIN}
136
169
  inputmode={inputMode}
137
170
  {autocomplete}
138
171
  disabled={field.disabled}
139
- aria-label={label ? undefined : 'One-time code'}
140
- class={classes.input()}
172
+ aria-label={label ? undefined : t.oneTimeCode}
173
+ class={classes.input({ composing: state.isComposing })}
141
174
  data-pin-input-input
142
175
  data-pin-input-input-mss={state.selectionStart}
143
176
  data-pin-input-input-mse={state.selectionEnd}
144
177
  onpointerdown={state.handlePointerDown}
145
178
  onkeydown={state.handleKeydown}
146
179
  oninput={state.handleInput}
180
+ oncompositionstart={state.handleCompositionStart}
181
+ oncompositionend={state.handleCompositionEnd}
147
182
  onpaste={state.handlePaste}
148
183
  onfocus={state.handleFocus}
149
184
  onblur={state.handleBlur}
@@ -151,6 +186,6 @@
151
186
  onkeyup={state.normalizeSelection}
152
187
  onclick={state.normalizeSelection}
153
188
  />
154
- <PinInputCells {state} {classes} size={rest.size} disabled={field.disabled} {mask} />
189
+ <PinInputCells {state} {classes} size={rest.size} disabled={field.disabled} {mask} {groups} />
155
190
  </div>
156
191
  </Field>
@@ -10,15 +10,29 @@
10
10
  classes,
11
11
  size,
12
12
  disabled,
13
- mask = false
13
+ mask = false,
14
+ groups
14
15
  }: {
15
16
  state: PinInputState;
16
17
  classes: PinInputClasses;
17
18
  size?: Sizes;
18
19
  disabled?: boolean;
19
20
  mask?: boolean;
21
+ groups?: number[];
20
22
  } = $props();
21
23
 
24
+ // Indexes of the cells a separator follows: the end of every group but the last cell's.
25
+ const separatorAfter = $derived.by(() => {
26
+ const after: number[] = [];
27
+ let end = 0;
28
+ for (const group of groups ?? []) {
29
+ if (!Number.isFinite(group) || group < 1) continue;
30
+ end += Math.floor(group);
31
+ if (end < state.length) after.push(end - 1);
32
+ }
33
+ return after;
34
+ });
35
+
22
36
  const displayValue = (char: string | null) => (mask && char ? '•' : char);
23
37
  </script>
24
38
 
@@ -42,4 +56,11 @@
42
56
  </span>
43
57
  {/if}
44
58
  </div>
59
+ {#if separatorAfter.includes(cell.index)}
60
+ <div
61
+ data-slot="pin-input-separator"
62
+ aria-hidden="true"
63
+ class={classes.separator({ size })}
64
+ ></div>
65
+ {/if}
45
66
  {/each}
@@ -8,6 +8,7 @@ type $$ComponentProps = {
8
8
  size?: Sizes;
9
9
  disabled?: boolean;
10
10
  mask?: boolean;
11
+ groups?: number[];
11
12
  };
12
13
  declare const PinInputCells: import("svelte").Component<$$ComponentProps, {}, "">;
13
14
  type PinInputCells = ReturnType<typeof PinInputCells>;
@@ -1,4 +1,4 @@
1
1
  export { default as PinInput } from './PinInput.svelte';
2
2
  export type { PinInputProps } from './pinInput.props.js';
3
- export { PIN_INPUT_ALPHANUMERIC_PATTERN, PIN_INPUT_CHARS_PATTERN, PIN_INPUT_DIGITS_PATTERN, type PinInputCell, type PinInputPattern } from './pinInput.state.svelte.js';
3
+ export { PIN_INPUT_ALPHANUMERIC_PATTERN, PIN_INPUT_CHARS_PATTERN, PIN_INPUT_DIGITS_PATTERN, type PinInputCell, type PinInputPattern, type PinInputRejectDetail } from './pinInput.state.svelte.js';
4
4
  export { pinInputTheme, setPinInputTheme, usePinInputTheme, type PinInputTheme, type PinInputThemeProps } from './pinInput.theme.js';
@@ -1 +1 @@
1
- export declare const pinInputDescription = "\n# PinInput Component\n\nPinInput is a one-time-code input built from one real text input plus visible cells. The real input owns focus, paste, autocomplete, form submission, and keyboard behavior; the cells are a derived display.\n\n## Basic Usage\n\n```svelte\n<script lang=\"ts\">\n\tlet code = $state('');\n</script>\n\n<PinInput label=\"Verification code\" bind:value={code} />\n```\n\n## Props\n\n### Core Props\n- **value**: string | null (bindable)\n - Current code value.\n - Clamped to the configured length.\n\n- **length**: number (default: 6)\n - Number of visible cells and maximum input length.\n\n- **pattern**: string | RegExp (default: PIN_INPUT_DIGITS_PATTERN)\n - Partial-value pattern used to accept typed and pasted values.\n - Defaults to digits only.\n - Exported constants: PIN_INPUT_DIGITS_PATTERN, PIN_INPUT_CHARS_PATTERN, PIN_INPUT_ALPHANUMERIC_PATTERN.\n\n- **pasteTransformer**: (text: string) => string\n - Cleans pasted text before insertion.\n - Use for values like \"123-456\" or \"123 456\".\n\n- **onComplete**: (value: string) => void\n - Called once when the value reaches the configured length.\n\n- **onValueChange**: (value: string) => void\n - Called when the value changes.\n\n### Input Props\n- **inputMode**: HTMLInputElement['inputMode'] (default: 'numeric')\n - Mobile keyboard hint.\n\n- **autocomplete**: string (default: 'one-time-code')\n - Enables OTP autofill where supported.\n\n- **mask**: boolean (default: false)\n - Renders filled cells as bullets while preserving the real input value.\n\n### Field Props\nPinInput extends the standard field props:\n- **label**, **description**, **helper**, **error**, **errors**\n- **name**, **required**, **disabled**, **visible**\n- **size**: 'small' | 'normal' | 'large'\n- **theme** for field and pin input parts\n\n## Examples\n\n### Digits Only\n```svelte\n<PinInput\n\tlabel=\"Security code\"\n\tlength={6}\n\tbind:value={code}\n\tpasteTransformer={(text) => text.replace(/\\D/g, '')}\n/>\n```\n\n### Alphanumeric\n```svelte\n<PinInput\n\tlabel=\"Invite code\"\n\tlength={8}\n\tinputMode=\"text\"\n\tpattern={PIN_INPUT_ALPHANUMERIC_PATTERN}\n/>\n```\n\n### Masked\n```svelte\n<PinInput label=\"Recovery code\" bind:value={code} mask />\n```\n\n## Structure\n\n```\n<Field>\n <InputContainer>\n <div data-slot=\"pin-input\">\n <input data-slot=\"pin-input-input\" />\n <div data-slot=\"pin-input-cell\">\n <span data-slot=\"pin-input-character\" />\n <span data-slot=\"pin-input-caret\" />\n </div>\n </div>\n </InputContainer>\n</Field>\n```\n\n## Accessibility\n\n- The label from Field is associated with the real input through `for/id`.\n- The visible cells are `aria-hidden`; assistive tech interacts with one text input.\n- The real input uses `autocomplete=\"one-time-code\"` by default.\n- Keyboard navigation, deletion, selection, and paste operate through the native input.\n\n## Notes\n\n- The pattern should accept partial values, not only the final full code. Use `^\\\\d+$`, not `^\\\\d{6}$`.\n- For pasted codes with spaces or hyphens, pass a `pasteTransformer`.\n\n## State contract\n\n- **value**: current bindable editable value.\n- **defaultValue**: initial value used only when `value` is omitted.\n- **onValueChange**: called with the new value when the component changes it.\n\n";
1
+ export declare const pinInputDescription = "\n# PinInput Component\n\nPinInput is a one-time-code input built from one real text input plus visible cells. The real input owns focus, paste, autocomplete, form submission, and keyboard behavior; the cells are a derived display.\n\n## Basic Usage\n\n```svelte\n<script lang=\"ts\">\n\tlet code = $state('');\n</script>\n\n<PinInput label=\"Verification code\" bind:value={code} />\n```\n\n## Props\n\n### Core Props\n- **value**: string | null (bindable)\n - Current code value.\n - Clamped to the configured length.\n\n- **length**: number (default: 6)\n - Number of visible cells and maximum input length.\n\n- **pattern**: string | RegExp (default: PIN_INPUT_DIGITS_PATTERN)\n - Partial-value pattern the code must match after normalization.\n - Defaults to digits only.\n - Text that fails it is refused whole (nothing changes) and reported to onRejectInput.\n - Exported constants: PIN_INPUT_DIGITS_PATTERN, PIN_INPUT_CHARS_PATTERN, PIN_INPUT_ALPHANUMERIC_PATTERN.\n\n- **normalizeValue**: (text: string) => string\n - Last step of the one normalization every typed, pasted, autofilled, composed and controlled code goes through. Before it: format controls and whitespace are removed, full-width characters and digits of other numeral systems (Arabic-Indic, Persian, Devanagari, Bengali, Thai, Han) become ASCII, and separators (dashes, dots, slashes, commas, colons) are removed unless the pattern accepts them. After it: the pattern check and the clamp to length.\n - So \"123-456\", \"123 456\" and \"\u0664\u0665\u0666\" fill the default digits code with no setup, and `normalizeValue={(text) => text.toUpperCase()}` accepts lowercase typing in an alphanumeric code.\n - Keep it idempotent: running it on its own output should change nothing.\n\n- **onRejectInput**: ({ text, source }) => void\n - Called when the pattern refuses text; text is as it arrived and source is 'paste' or 'input' (typed or autofilled).\n\n- **pasteTransformer**: (text: string) => string\n - A paste-only first step that runs before the shared normalization, for site-specific cleanup such as removing a prefix.\n - A cleaned paste at least `length` characters long replaces the whole value, wherever the caret is; a shorter one is inserted at the caret.\n\n- **onComplete**: (value: string) => void\n - Called when the value becomes complete, whether typed, pasted, autofilled, composed, or set by the parent.\n - A paste or autofill that leaves the code complete calls it again, even when the code was already complete or unchanged, so re-pasting a code retries verification.\n - Typing over one cell of a complete code does not call it.\n\n- **onValueChange**: (value: string) => void\n - Called when the value changes.\n\n- **submitOnComplete**: boolean (default: false)\n - Submits the owning form when the user types, pastes or autofills a complete code: through the surrounding Form (which validates first and focuses an earlier invalid field, so the code input does not take focus back), else the native form with requestSubmit(). A code set by the parent, a read-only input and a disabled input never submit.\n\n- **groups**: number[]\n - Splits the cells into groups with a decorative separator between them: [3, 3] shows 123-456. Sizes that overshoot the length are ignored. The separator is aria-hidden and styled with the `separator` theme part.\n\n### Input Props\n- **inputMode**: HTMLInputElement['inputMode'] (default: 'numeric')\n - Mobile keyboard hint.\n\n- **autocomplete**: string (default: 'one-time-code')\n - Enables OTP autofill where supported.\n\n- **mask**: boolean (default: false)\n - Renders filled cells as bullets while preserving the real input value.\n\n### Field Props\nPinInput extends the standard field props:\n- **label**, **description**, **helper**, **error**, **errors**\n- **name**, **required**, **disabled**, **visible**\n- **readOnly**: the code is focusable and announced as read-only; typing, paste, autofill and submitOnComplete are ignored, and the value still validates and submits\n- **size**: 'small' | 'normal' | 'large'\n- **theme** for field and pin input parts\n\n## Examples\n\n### Digits Only\n```svelte\n<PinInput\n\tlabel=\"Security code\"\n\tlength={6}\n\tbind:value={code}\n/>\n```\n\n### Alphanumeric\n```svelte\n<PinInput\n\tlabel=\"Invite code\"\n\tlength={8}\n\tinputMode=\"text\"\n\tpattern={PIN_INPUT_ALPHANUMERIC_PATTERN}\n/>\n```\n\n### Masked\n```svelte\n<PinInput label=\"Recovery code\" bind:value={code} mask />\n```\n\n## Structure\n\n```\n<Field>\n <InputContainer>\n <div data-slot=\"pin-input\">\n <input data-slot=\"pin-input-input\" />\n <div data-slot=\"pin-input-cell\">\n <span data-slot=\"pin-input-character\" />\n <span data-slot=\"pin-input-caret\" />\n </div>\n <div data-slot=\"pin-input-separator\" aria-hidden=\"true\" /> <!-- with groups -->\n </div>\n </InputContainer>\n</Field>\n```\n\n## Accessibility\n\n- The label from Field is associated with the real input through `for/id`.\n- The visible cells are `aria-hidden`; assistive tech interacts with one text input.\n- The real input uses `autocomplete=\"one-time-code\"` by default.\n- Without a label the input is named by the localized \"One-time code\" catalog message (`oneTimeCode`).\n- The cells and the input are `dir=\"ltr\"` in every document direction, so a code reads 123456 in right-to-left pages too and the caret agrees with the cells.\n- The component works inside a shadow root: focus and selection are read from the input's own root node.\n- Keyboard navigation, deletion, selection, and paste operate through the native input.\n- Input method (IME) composition, such as Japanese or Chinese input, is left to the input method: the cells show the in-progress text, and the text is checked and committed once when the composition ends. Full-width digits and letters (`\uFF11\uFF12\uFF13`) are committed as ASCII (`123`). While composing, the real input turns fully transparent (the `input` theme slot's `composing` variant, `opacity-0`), so the input method's underline or clause highlight does not cover the first cells.\n\n## Notes\n\n- The pattern should accept partial values, not only the final full code. Use `^\\\\d+$`, not `^\\\\d{6}$`.\n- Spaces, hyphens and other grouping separators in typed, pasted or autofilled codes are removed by the built-in normalization. Pass a `pasteTransformer` only for cleanup specific to your codes.\n- Composed text that the pattern rejects (for example hiragana in a digits-only field) is discarded, and the previous code and selection are restored.\n\n## State contract\n\n- **value**: current bindable editable value.\n- **defaultValue**: initial value used only when `value` is omitted.\n- **onValueChange**: called with the new value when the component changes it.\n\n";
@@ -24,20 +24,37 @@ PinInput is a one-time-code input built from one real text input plus visible ce
24
24
  - Number of visible cells and maximum input length.
25
25
 
26
26
  - **pattern**: string | RegExp (default: PIN_INPUT_DIGITS_PATTERN)
27
- - Partial-value pattern used to accept typed and pasted values.
27
+ - Partial-value pattern the code must match after normalization.
28
28
  - Defaults to digits only.
29
+ - Text that fails it is refused whole (nothing changes) and reported to onRejectInput.
29
30
  - Exported constants: PIN_INPUT_DIGITS_PATTERN, PIN_INPUT_CHARS_PATTERN, PIN_INPUT_ALPHANUMERIC_PATTERN.
30
31
 
32
+ - **normalizeValue**: (text: string) => string
33
+ - Last step of the one normalization every typed, pasted, autofilled, composed and controlled code goes through. Before it: format controls and whitespace are removed, full-width characters and digits of other numeral systems (Arabic-Indic, Persian, Devanagari, Bengali, Thai, Han) become ASCII, and separators (dashes, dots, slashes, commas, colons) are removed unless the pattern accepts them. After it: the pattern check and the clamp to length.
34
+ - So "123-456", "123 456" and "٤٥٦" fill the default digits code with no setup, and \`normalizeValue={(text) => text.toUpperCase()}\` accepts lowercase typing in an alphanumeric code.
35
+ - Keep it idempotent: running it on its own output should change nothing.
36
+
37
+ - **onRejectInput**: ({ text, source }) => void
38
+ - Called when the pattern refuses text; text is as it arrived and source is 'paste' or 'input' (typed or autofilled).
39
+
31
40
  - **pasteTransformer**: (text: string) => string
32
- - Cleans pasted text before insertion.
33
- - Use for values like "123-456" or "123 456".
41
+ - A paste-only first step that runs before the shared normalization, for site-specific cleanup such as removing a prefix.
42
+ - A cleaned paste at least \`length\` characters long replaces the whole value, wherever the caret is; a shorter one is inserted at the caret.
34
43
 
35
44
  - **onComplete**: (value: string) => void
36
- - Called once when the value reaches the configured length.
45
+ - Called when the value becomes complete, whether typed, pasted, autofilled, composed, or set by the parent.
46
+ - A paste or autofill that leaves the code complete calls it again, even when the code was already complete or unchanged, so re-pasting a code retries verification.
47
+ - Typing over one cell of a complete code does not call it.
37
48
 
38
49
  - **onValueChange**: (value: string) => void
39
50
  - Called when the value changes.
40
51
 
52
+ - **submitOnComplete**: boolean (default: false)
53
+ - Submits the owning form when the user types, pastes or autofills a complete code: through the surrounding Form (which validates first and focuses an earlier invalid field, so the code input does not take focus back), else the native form with requestSubmit(). A code set by the parent, a read-only input and a disabled input never submit.
54
+
55
+ - **groups**: number[]
56
+ - Splits the cells into groups with a decorative separator between them: [3, 3] shows 123-456. Sizes that overshoot the length are ignored. The separator is aria-hidden and styled with the \`separator\` theme part.
57
+
41
58
  ### Input Props
42
59
  - **inputMode**: HTMLInputElement['inputMode'] (default: 'numeric')
43
60
  - Mobile keyboard hint.
@@ -52,6 +69,7 @@ PinInput is a one-time-code input built from one real text input plus visible ce
52
69
  PinInput extends the standard field props:
53
70
  - **label**, **description**, **helper**, **error**, **errors**
54
71
  - **name**, **required**, **disabled**, **visible**
72
+ - **readOnly**: the code is focusable and announced as read-only; typing, paste, autofill and submitOnComplete are ignored, and the value still validates and submits
55
73
  - **size**: 'small' | 'normal' | 'large'
56
74
  - **theme** for field and pin input parts
57
75
 
@@ -63,7 +81,6 @@ PinInput extends the standard field props:
63
81
  label="Security code"
64
82
  length={6}
65
83
  bind:value={code}
66
- pasteTransformer={(text) => text.replace(/\\D/g, '')}
67
84
  />
68
85
  \`\`\`
69
86
 
@@ -93,6 +110,7 @@ PinInput extends the standard field props:
93
110
  <span data-slot="pin-input-character" />
94
111
  <span data-slot="pin-input-caret" />
95
112
  </div>
113
+ <div data-slot="pin-input-separator" aria-hidden="true" /> <!-- with groups -->
96
114
  </div>
97
115
  </InputContainer>
98
116
  </Field>
@@ -103,12 +121,17 @@ PinInput extends the standard field props:
103
121
  - The label from Field is associated with the real input through \`for/id\`.
104
122
  - The visible cells are \`aria-hidden\`; assistive tech interacts with one text input.
105
123
  - The real input uses \`autocomplete="one-time-code"\` by default.
124
+ - Without a label the input is named by the localized "One-time code" catalog message (\`oneTimeCode\`).
125
+ - The cells and the input are \`dir="ltr"\` in every document direction, so a code reads 123456 in right-to-left pages too and the caret agrees with the cells.
126
+ - The component works inside a shadow root: focus and selection are read from the input's own root node.
106
127
  - Keyboard navigation, deletion, selection, and paste operate through the native input.
128
+ - Input method (IME) composition, such as Japanese or Chinese input, is left to the input method: the cells show the in-progress text, and the text is checked and committed once when the composition ends. Full-width digits and letters (\`123\`) are committed as ASCII (\`123\`). While composing, the real input turns fully transparent (the \`input\` theme slot's \`composing\` variant, \`opacity-0\`), so the input method's underline or clause highlight does not cover the first cells.
107
129
 
108
130
  ## Notes
109
131
 
110
132
  - The pattern should accept partial values, not only the final full code. Use \`^\\\\d+$\`, not \`^\\\\d{6}$\`.
111
- - For pasted codes with spaces or hyphens, pass a \`pasteTransformer\`.
133
+ - Spaces, hyphens and other grouping separators in typed, pasted or autofilled codes are removed by the built-in normalization. Pass a \`pasteTransformer\` only for cleanup specific to your codes.
134
+ - Composed text that the pattern rejects (for example hiragana in a digits-only field) is discarded, and the previous code and selection are restored.
112
135
 
113
136
  ## State contract
114
137