@comitor/ui 2.1.0 → 3.0.1

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 (405) hide show
  1. package/README.md +63 -24
  2. package/dist/chart/chart.d.ts +6 -1
  3. package/dist/chart/chart.js +3 -1
  4. package/dist/chart/chart.js.map +1 -1
  5. package/dist/chart/comitor-chart.d.ts +4 -1
  6. package/dist/chart/comitor-chart.js +3 -1
  7. package/dist/chart/comitor-chart.js.map +1 -1
  8. package/dist/components/composite/avatar-group.d.ts +9 -6
  9. package/dist/components/composite/avatar-group.js +6 -2
  10. package/dist/components/composite/avatar-group.js.map +1 -1
  11. package/dist/components/composite/combobox.d.ts +11 -11
  12. package/dist/components/composite/combobox.js +25 -11
  13. package/dist/components/composite/combobox.js.map +1 -1
  14. package/dist/components/composite/command-palette-constants.d.ts +15 -5
  15. package/dist/components/composite/command-palette-constants.js +3 -2
  16. package/dist/components/composite/command-palette-constants.js.map +1 -1
  17. package/dist/components/composite/command-palette.d.ts +2 -2
  18. package/dist/components/composite/command-palette.js +8 -5
  19. package/dist/components/composite/command-palette.js.map +1 -1
  20. package/dist/components/composite/confirm-dialog.d.ts +8 -8
  21. package/dist/components/composite/confirm-dialog.js +8 -3
  22. package/dist/components/composite/confirm-dialog.js.map +1 -1
  23. package/dist/components/composite/copy-button.d.ts +7 -3
  24. package/dist/components/composite/copy-button.js +7 -3
  25. package/dist/components/composite/copy-button.js.map +1 -1
  26. package/dist/components/composite/data-table-constants.d.ts +7 -3
  27. package/dist/components/composite/data-table-constants.js +2 -9
  28. package/dist/components/composite/data-table-constants.js.map +1 -1
  29. package/dist/components/composite/data-table.js +3 -3
  30. package/dist/components/composite/data-table.js.map +1 -1
  31. package/dist/components/composite/date-picker-constants.d.ts +32 -9
  32. package/dist/components/composite/date-picker-constants.js +16 -11
  33. package/dist/components/composite/date-picker-constants.js.map +1 -1
  34. package/dist/components/composite/date-picker.d.ts +19 -10
  35. package/dist/components/composite/date-picker.js +33 -9
  36. package/dist/components/composite/date-picker.js.map +1 -1
  37. package/dist/components/composite/filter-chips.d.ts +4 -3
  38. package/dist/components/composite/filter-chips.js +6 -2
  39. package/dist/components/composite/filter-chips.js.map +1 -1
  40. package/dist/components/composite/inline-edit.d.ts +14 -3
  41. package/dist/components/composite/inline-edit.js +8 -4
  42. package/dist/components/composite/inline-edit.js.map +1 -1
  43. package/dist/components/composite/relative-time.d.ts +4 -4
  44. package/dist/components/composite/relative-time.js +4 -2
  45. package/dist/components/composite/relative-time.js.map +1 -1
  46. package/dist/components/composite/route-tabs-nav.d.ts +9 -0
  47. package/dist/components/composite/route-tabs-nav.js +11 -0
  48. package/dist/components/composite/route-tabs-nav.js.map +1 -0
  49. package/dist/components/composite/route-tabs.d.ts +4 -1
  50. package/dist/components/composite/route-tabs.js +3 -2
  51. package/dist/components/composite/route-tabs.js.map +1 -1
  52. package/dist/components/composite/search-filter-bar-constants.d.ts +18 -8
  53. package/dist/components/composite/search-filter-bar-constants.js +2 -14
  54. package/dist/components/composite/search-filter-bar-constants.js.map +1 -1
  55. package/dist/components/composite/search-filter-bar.d.ts +5 -2
  56. package/dist/components/composite/search-filter-bar.js +2 -2
  57. package/dist/components/composite/search-filter-bar.js.map +1 -1
  58. package/dist/components/composite/stat-card.d.ts +1 -1
  59. package/dist/components/composite/table-pagination-constants.d.ts +16 -11
  60. package/dist/components/composite/table-pagination-constants.js +2 -12
  61. package/dist/components/composite/table-pagination-constants.js.map +1 -1
  62. package/dist/components/composite/table-pagination.d.ts +6 -3
  63. package/dist/components/composite/table-pagination.js +3 -5
  64. package/dist/components/composite/table-pagination.js.map +1 -1
  65. package/dist/components/composite/toast.d.ts +5 -2
  66. package/dist/components/composite/toast.js +3 -1
  67. package/dist/components/composite/toast.js.map +1 -1
  68. package/dist/components/ui/action-bar-constants.d.ts +8 -4
  69. package/dist/components/ui/action-bar-constants.js +2 -5
  70. package/dist/components/ui/action-bar-constants.js.map +1 -1
  71. package/dist/components/ui/action-bar.d.ts +5 -4
  72. package/dist/components/ui/action-bar.js +47 -3
  73. package/dist/components/ui/action-bar.js.map +1 -1
  74. package/dist/components/ui/alert.d.ts +1 -1
  75. package/dist/components/ui/badge-overflow.d.ts +2 -2
  76. package/dist/components/ui/badge-overflow.js +4 -2
  77. package/dist/components/ui/badge-overflow.js.map +1 -1
  78. package/dist/components/ui/badge.d.ts +1 -1
  79. package/dist/components/ui/banner.d.ts +6 -5
  80. package/dist/components/ui/banner.js +3 -1
  81. package/dist/components/ui/banner.js.map +1 -1
  82. package/dist/components/ui/breadcrumb.d.ts +11 -4
  83. package/dist/components/ui/breadcrumb.js +7 -2
  84. package/dist/components/ui/breadcrumb.js.map +1 -1
  85. package/dist/components/ui/button.d.ts +2 -2
  86. package/dist/components/ui/calendar.d.ts +12 -5
  87. package/dist/components/ui/calendar.js +38 -3
  88. package/dist/components/ui/calendar.js.map +1 -1
  89. package/dist/components/ui/carousel.d.ts +4 -3
  90. package/dist/components/ui/carousel.js +11 -4
  91. package/dist/components/ui/carousel.js.map +1 -1
  92. package/dist/components/ui/circular-progress.js +10 -2
  93. package/dist/components/ui/circular-progress.js.map +1 -1
  94. package/dist/components/ui/command.d.ts +5 -4
  95. package/dist/components/ui/command.js +6 -2
  96. package/dist/components/ui/command.js.map +1 -1
  97. package/dist/components/ui/cropper-constants.d.ts +8 -3
  98. package/dist/components/ui/cropper-constants.js +2 -6
  99. package/dist/components/ui/cropper-constants.js.map +1 -1
  100. package/dist/components/ui/cropper.d.ts +2 -1
  101. package/dist/components/ui/cropper.js +2 -2
  102. package/dist/components/ui/cropper.js.map +1 -1
  103. package/dist/components/ui/dialog.d.ts +2 -2
  104. package/dist/components/ui/dialog.js +4 -1
  105. package/dist/components/ui/dialog.js.map +1 -1
  106. package/dist/components/ui/item.d.ts +2 -2
  107. package/dist/components/ui/kanban-constants.d.ts +7 -1
  108. package/dist/components/ui/kanban-constants.js +2 -17
  109. package/dist/components/ui/kanban-constants.js.map +1 -1
  110. package/dist/components/ui/kanban.d.ts +2 -2
  111. package/dist/components/ui/kanban.js +11 -5
  112. package/dist/components/ui/kanban.js.map +1 -1
  113. package/dist/components/ui/key-value-constants.d.ts +7 -3
  114. package/dist/components/ui/key-value-constants.js +2 -7
  115. package/dist/components/ui/key-value-constants.js.map +1 -1
  116. package/dist/components/ui/key-value.d.ts +5 -5
  117. package/dist/components/ui/key-value.js +72 -78
  118. package/dist/components/ui/key-value.js.map +1 -1
  119. package/dist/components/ui/mask-input-constants.d.ts +2 -3
  120. package/dist/components/ui/mask-input-constants.js +36 -77
  121. package/dist/components/ui/mask-input-constants.js.map +1 -1
  122. package/dist/components/ui/mask-input.d.ts +7 -4
  123. package/dist/components/ui/mask-input.js +22 -22
  124. package/dist/components/ui/mask-input.js.map +1 -1
  125. package/dist/components/ui/mention.d.ts +3 -2
  126. package/dist/components/ui/mention.js +4 -6
  127. package/dist/components/ui/mention.js.map +1 -1
  128. package/dist/components/ui/pagination.d.ts +13 -9
  129. package/dist/components/ui/pagination.js +15 -6
  130. package/dist/components/ui/pagination.js.map +1 -1
  131. package/dist/components/ui/phone-input-constants.d.ts +17 -6
  132. package/dist/components/ui/phone-input-constants.js +2 -5
  133. package/dist/components/ui/phone-input-constants.js.map +1 -1
  134. package/dist/components/ui/phone-input.d.ts +18 -11
  135. package/dist/components/ui/phone-input.js +14 -12
  136. package/dist/components/ui/phone-input.js.map +1 -1
  137. package/dist/components/ui/progress.d.ts +2 -2
  138. package/dist/components/ui/rating.d.ts +2 -1
  139. package/dist/components/ui/rating.js +8 -4
  140. package/dist/components/ui/rating.js.map +1 -1
  141. package/dist/components/ui/scroll-spy.js +3 -1
  142. package/dist/components/ui/scroll-spy.js.map +1 -1
  143. package/dist/components/ui/sheet.d.ts +2 -2
  144. package/dist/components/ui/sheet.js +10 -1
  145. package/dist/components/ui/sheet.js.map +1 -1
  146. package/dist/components/ui/slider.d.ts +1 -1
  147. package/dist/components/ui/slider.js +15 -1
  148. package/dist/components/ui/slider.js.map +1 -1
  149. package/dist/components/ui/sonner.js +2 -0
  150. package/dist/components/ui/sonner.js.map +1 -1
  151. package/dist/components/ui/spinner.js +4 -1
  152. package/dist/components/ui/spinner.js.map +1 -1
  153. package/dist/components/ui/stepper-constants.d.ts +7 -2
  154. package/dist/components/ui/stepper-constants.js +2 -5
  155. package/dist/components/ui/stepper-constants.js.map +1 -1
  156. package/dist/components/ui/stepper.d.ts +2 -1
  157. package/dist/components/ui/stepper.js +2 -2
  158. package/dist/components/ui/stepper.js.map +1 -1
  159. package/dist/components/ui/tags-input.d.ts +3 -2
  160. package/dist/components/ui/tags-input.js +4 -2
  161. package/dist/components/ui/tags-input.js.map +1 -1
  162. package/dist/components/ui/time-picker-constants.d.ts +12 -9
  163. package/dist/components/ui/time-picker-constants.js +2 -10
  164. package/dist/components/ui/time-picker-constants.js.map +1 -1
  165. package/dist/components/ui/time-picker.d.ts +11 -6
  166. package/dist/components/ui/time-picker.js +5 -7
  167. package/dist/components/ui/time-picker.js.map +1 -1
  168. package/dist/components/ui/toggle-group.js +12 -1
  169. package/dist/components/ui/toggle-group.js.map +1 -1
  170. package/dist/components/ui/toggle.d.ts +1 -1
  171. package/dist/components/ui/tour-constants.d.ts +7 -2
  172. package/dist/components/ui/tour-constants.js +2 -8
  173. package/dist/components/ui/tour-constants.js.map +1 -1
  174. package/dist/components/ui/tour.d.ts +3 -2
  175. package/dist/components/ui/tour.js +5 -4
  176. package/dist/components/ui/tour.js.map +1 -1
  177. package/dist/data-grid/data-grid-cell-variants.js +4 -4
  178. package/dist/data-grid/data-grid-cell-variants.js.map +1 -1
  179. package/dist/data-grid/data-grid-column-header.js +1 -1
  180. package/dist/data-grid/data-grid-column-header.js.map +1 -1
  181. package/dist/data-grid/data-grid-filter-menu.d.ts +5 -4
  182. package/dist/data-grid/data-grid-filter-menu.js +13 -8
  183. package/dist/data-grid/data-grid-filter-menu.js.map +1 -1
  184. package/dist/data-grid/data-grid-keyboard-shortcuts.d.ts +4 -4
  185. package/dist/data-grid/data-grid-keyboard-shortcuts.js.map +1 -1
  186. package/dist/data-grid/data-grid-locale.d.ts +58 -6
  187. package/dist/data-grid/data-grid-locale.js +41 -9
  188. package/dist/data-grid/data-grid-locale.js.map +1 -1
  189. package/dist/data-grid/data-grid-row-height-menu.d.ts +4 -3
  190. package/dist/data-grid/data-grid-row-height-menu.js.map +1 -1
  191. package/dist/data-grid/data-grid-sort-menu.d.ts +4 -4
  192. package/dist/data-grid/data-grid-sort-menu.js +1 -1
  193. package/dist/data-grid/data-grid-sort-menu.js.map +1 -1
  194. package/dist/data-grid/data-grid-view-menu.d.ts +4 -4
  195. package/dist/data-grid/data-grid-view-menu.js.map +1 -1
  196. package/dist/data-grid/data-grid.d.ts +4 -3
  197. package/dist/data-grid/data-grid.js +2 -3
  198. package/dist/data-grid/data-grid.js.map +1 -1
  199. package/dist/data-grid/index.d.ts +1 -0
  200. package/dist/data-grid/index.js.map +1 -1
  201. package/dist/data-grid/messages-en.d.ts +23 -4
  202. package/dist/data-grid/messages-en.js +20 -0
  203. package/dist/data-grid/messages-en.js.map +1 -1
  204. package/dist/data-grid/messages-vi.d.ts +3 -1
  205. package/dist/data-grid/messages-vi.js +14 -0
  206. package/dist/data-grid/messages-vi.js.map +1 -1
  207. package/dist/data-grid/messages.d.ts +29 -3
  208. package/dist/data-grid/messages.js.map +1 -1
  209. package/dist/data-grid/sortable.js +16 -19
  210. package/dist/data-grid/sortable.js.map +1 -1
  211. package/dist/data-grid/types.d.ts +1 -1
  212. package/dist/data-grid/use-data-grid-undo-redo.d.ts +5 -4
  213. package/dist/data-grid/use-data-grid-undo-redo.js +2 -2
  214. package/dist/data-grid/use-data-grid-undo-redo.js.map +1 -1
  215. package/dist/data-grid/use-data-grid.d.ts +23 -8
  216. package/dist/data-grid/use-data-grid.js +8 -6
  217. package/dist/data-grid/use-data-grid.js.map +1 -1
  218. package/dist/data-grid/utils.d.ts +24 -4
  219. package/dist/data-grid/utils.js +15 -5
  220. package/dist/data-grid/utils.js.map +1 -1
  221. package/dist/i18n/locale-provider.d.ts +127 -0
  222. package/dist/i18n/locale-provider.js +47 -0
  223. package/dist/i18n/locale-provider.js.map +1 -0
  224. package/dist/i18n/locale.d.ts +27 -0
  225. package/dist/i18n/locale.js +10 -0
  226. package/dist/i18n/locale.js.map +1 -0
  227. package/dist/i18n/messages.d.ts +116 -0
  228. package/dist/i18n/messages.js +149 -0
  229. package/dist/i18n/messages.js.map +1 -0
  230. package/dist/i18n/namespaces/action-bar.d.ts +7 -0
  231. package/dist/i18n/namespaces/action-bar.js +15 -0
  232. package/dist/i18n/namespaces/action-bar.js.map +1 -0
  233. package/dist/i18n/namespaces/avatar-group.d.ts +14 -0
  234. package/dist/i18n/namespaces/avatar-group.js +13 -0
  235. package/dist/i18n/namespaces/avatar-group.js.map +1 -0
  236. package/dist/i18n/namespaces/badge-overflow.d.ts +12 -0
  237. package/dist/i18n/namespaces/badge-overflow.js +11 -0
  238. package/dist/i18n/namespaces/badge-overflow.js.map +1 -0
  239. package/dist/i18n/namespaces/banner.d.ts +9 -0
  240. package/dist/i18n/namespaces/banner.js +7 -0
  241. package/dist/i18n/namespaces/banner.js.map +1 -0
  242. package/dist/i18n/namespaces/breadcrumb.d.ts +11 -0
  243. package/dist/i18n/namespaces/breadcrumb.js +13 -0
  244. package/dist/i18n/namespaces/breadcrumb.js.map +1 -0
  245. package/dist/i18n/namespaces/calendar.d.ts +40 -0
  246. package/dist/i18n/namespaces/calendar.js +25 -0
  247. package/dist/i18n/namespaces/calendar.js.map +1 -0
  248. package/dist/i18n/namespaces/carousel.d.ts +15 -0
  249. package/dist/i18n/namespaces/carousel.js +17 -0
  250. package/dist/i18n/namespaces/carousel.js.map +1 -0
  251. package/dist/i18n/namespaces/combobox.d.ts +21 -0
  252. package/dist/i18n/namespaces/combobox.js +23 -0
  253. package/dist/i18n/namespaces/combobox.js.map +1 -0
  254. package/dist/i18n/namespaces/command-palette.d.ts +20 -0
  255. package/dist/i18n/namespaces/command-palette.js +19 -0
  256. package/dist/i18n/namespaces/command-palette.js.map +1 -0
  257. package/dist/i18n/namespaces/command.d.ts +11 -0
  258. package/dist/i18n/namespaces/command.js +13 -0
  259. package/dist/i18n/namespaces/command.js.map +1 -0
  260. package/dist/i18n/namespaces/confirm-dialog.d.ts +13 -0
  261. package/dist/i18n/namespaces/confirm-dialog.js +15 -0
  262. package/dist/i18n/namespaces/confirm-dialog.js.map +1 -0
  263. package/dist/i18n/namespaces/contrast.d.ts +7 -0
  264. package/dist/i18n/namespaces/contrast.js +13 -0
  265. package/dist/i18n/namespaces/contrast.js.map +1 -0
  266. package/dist/i18n/namespaces/copy-button.d.ts +11 -0
  267. package/dist/i18n/namespaces/copy-button.js +13 -0
  268. package/dist/i18n/namespaces/copy-button.js.map +1 -0
  269. package/dist/i18n/namespaces/cropper.d.ts +7 -0
  270. package/dist/i18n/namespaces/cropper.js +17 -0
  271. package/dist/i18n/namespaces/cropper.js.map +1 -0
  272. package/dist/i18n/namespaces/data-table.d.ts +7 -0
  273. package/dist/i18n/namespaces/data-table.js +23 -0
  274. package/dist/i18n/namespaces/data-table.js.map +1 -0
  275. package/dist/i18n/namespaces/date-picker.d.ts +42 -0
  276. package/dist/i18n/namespaces/date-picker.js +35 -0
  277. package/dist/i18n/namespaces/date-picker.js.map +1 -0
  278. package/dist/i18n/namespaces/dialog.d.ts +9 -0
  279. package/dist/i18n/namespaces/dialog.js +7 -0
  280. package/dist/i18n/namespaces/dialog.js.map +1 -0
  281. package/dist/i18n/namespaces/display-axis.d.ts +25 -0
  282. package/dist/i18n/namespaces/display-axis.js +21 -0
  283. package/dist/i18n/namespaces/display-axis.js.map +1 -0
  284. package/dist/i18n/namespaces/file-upload.d.ts +11 -0
  285. package/dist/i18n/namespaces/file-upload.js +19 -0
  286. package/dist/i18n/namespaces/file-upload.js.map +1 -0
  287. package/dist/i18n/namespaces/filter-chips.d.ts +11 -0
  288. package/dist/i18n/namespaces/filter-chips.js +13 -0
  289. package/dist/i18n/namespaces/filter-chips.js.map +1 -0
  290. package/dist/i18n/namespaces/image-upload-field.d.ts +12 -0
  291. package/dist/i18n/namespaces/image-upload-field.js +23 -0
  292. package/dist/i18n/namespaces/image-upload-field.js.map +1 -0
  293. package/dist/i18n/namespaces/inline-edit.d.ts +15 -0
  294. package/dist/i18n/namespaces/inline-edit.js +17 -0
  295. package/dist/i18n/namespaces/inline-edit.js.map +1 -0
  296. package/dist/i18n/namespaces/kanban.d.ts +11 -0
  297. package/dist/i18n/namespaces/kanban.js +39 -0
  298. package/dist/i18n/namespaces/kanban.js.map +1 -0
  299. package/dist/i18n/namespaces/key-value.d.ts +10 -0
  300. package/dist/i18n/namespaces/key-value.js +19 -0
  301. package/dist/i18n/namespaces/key-value.js.map +1 -0
  302. package/dist/i18n/namespaces/mention.d.ts +9 -0
  303. package/dist/i18n/namespaces/mention.js +7 -0
  304. package/dist/i18n/namespaces/mention.js.map +1 -0
  305. package/dist/i18n/namespaces/pagination.d.ts +19 -0
  306. package/dist/i18n/namespaces/pagination.js +21 -0
  307. package/dist/i18n/namespaces/pagination.js.map +1 -0
  308. package/dist/i18n/namespaces/phone-input.d.ts +10 -0
  309. package/dist/i18n/namespaces/phone-input.js +17 -0
  310. package/dist/i18n/namespaces/phone-input.js.map +1 -0
  311. package/dist/i18n/namespaces/rating.d.ts +12 -0
  312. package/dist/i18n/namespaces/rating.js +12 -0
  313. package/dist/i18n/namespaces/rating.js.map +1 -0
  314. package/dist/i18n/namespaces/route-tabs.d.ts +9 -0
  315. package/dist/i18n/namespaces/route-tabs.js +7 -0
  316. package/dist/i18n/namespaces/route-tabs.js.map +1 -0
  317. package/dist/i18n/namespaces/scroll-spy.d.ts +9 -0
  318. package/dist/i18n/namespaces/scroll-spy.js +7 -0
  319. package/dist/i18n/namespaces/scroll-spy.js.map +1 -0
  320. package/dist/i18n/namespaces/search-filter-bar.d.ts +15 -0
  321. package/dist/i18n/namespaces/search-filter-bar.js +32 -0
  322. package/dist/i18n/namespaces/search-filter-bar.js.map +1 -0
  323. package/dist/i18n/namespaces/sheet.d.ts +9 -0
  324. package/dist/i18n/namespaces/sheet.js +7 -0
  325. package/dist/i18n/namespaces/sheet.js.map +1 -0
  326. package/dist/i18n/namespaces/shell.d.ts +21 -0
  327. package/dist/i18n/namespaces/shell.js +75 -0
  328. package/dist/i18n/namespaces/shell.js.map +1 -0
  329. package/dist/i18n/namespaces/spinner.d.ts +9 -0
  330. package/dist/i18n/namespaces/spinner.js +7 -0
  331. package/dist/i18n/namespaces/spinner.js.map +1 -0
  332. package/dist/i18n/namespaces/stepper.d.ts +7 -0
  333. package/dist/i18n/namespaces/stepper.js +15 -0
  334. package/dist/i18n/namespaces/stepper.js.map +1 -0
  335. package/dist/i18n/namespaces/table-pagination.d.ts +7 -0
  336. package/dist/i18n/namespaces/table-pagination.js +29 -0
  337. package/dist/i18n/namespaces/table-pagination.js.map +1 -0
  338. package/dist/i18n/namespaces/tags-input.d.ts +12 -0
  339. package/dist/i18n/namespaces/tags-input.js +11 -0
  340. package/dist/i18n/namespaces/tags-input.js.map +1 -0
  341. package/dist/i18n/namespaces/time-picker.d.ts +15 -0
  342. package/dist/i18n/namespaces/time-picker.js +25 -0
  343. package/dist/i18n/namespaces/time-picker.js.map +1 -0
  344. package/dist/i18n/namespaces/toast.d.ts +16 -0
  345. package/dist/i18n/namespaces/toast.js +7 -0
  346. package/dist/i18n/namespaces/toast.js.map +1 -0
  347. package/dist/i18n/namespaces/tour.d.ts +7 -0
  348. package/dist/i18n/namespaces/tour.js +21 -0
  349. package/dist/i18n/namespaces/tour.js.map +1 -0
  350. package/dist/index.d.ts +32 -0
  351. package/dist/index.js +24 -1
  352. package/dist/index.js.map +1 -1
  353. package/dist/lib/toast-language.d.ts +8 -0
  354. package/dist/lib/toast-language.js +19 -0
  355. package/dist/lib/toast-language.js.map +1 -0
  356. package/dist/shell/app-header.js.map +1 -1
  357. package/dist/shell/app-shell.d.ts +20 -2
  358. package/dist/shell/app-shell.js +4 -1
  359. package/dist/shell/app-shell.js.map +1 -1
  360. package/dist/shell/contrast-constants.d.ts +9 -1
  361. package/dist/shell/contrast-constants.js +2 -4
  362. package/dist/shell/contrast-constants.js.map +1 -1
  363. package/dist/shell/contrast-toggle.d.ts +4 -1
  364. package/dist/shell/contrast-toggle.js +2 -2
  365. package/dist/shell/contrast-toggle.js.map +1 -1
  366. package/dist/shell/display-axis-constants.d.ts +2 -1
  367. package/dist/shell/display-axis-constants.js.map +1 -1
  368. package/dist/shell/display-axis-controls.d.ts +15 -6
  369. package/dist/shell/display-axis-controls.js +11 -9
  370. package/dist/shell/display-axis-controls.js.map +1 -1
  371. package/dist/shell/display-axis-provider.d.ts +1 -1
  372. package/dist/shell/mobile-menu.js.map +1 -1
  373. package/dist/shell/notifications-button.d.ts +1 -1
  374. package/dist/shell/notifications-button.js +3 -2
  375. package/dist/shell/notifications-button.js.map +1 -1
  376. package/dist/shell/shell-context.d.ts +4 -1
  377. package/dist/shell/shell-context.js +2 -4
  378. package/dist/shell/shell-context.js.map +1 -1
  379. package/dist/shell/sidebar.d.ts +1 -1
  380. package/dist/shell/sidebar.js.map +1 -1
  381. package/dist/shell/theme-toggle.d.ts +6 -3
  382. package/dist/shell/theme-toggle.js +2 -2
  383. package/dist/shell/theme-toggle.js.map +1 -1
  384. package/dist/shell/types.d.ts +14 -8
  385. package/dist/shell/types.js +2 -35
  386. package/dist/shell/types.js.map +1 -1
  387. package/dist/shell/user-menu.d.ts +6 -6
  388. package/dist/shell/user-menu.js.map +1 -1
  389. package/dist/shell/utils.d.ts +1 -1
  390. package/dist/shell/utils.js.map +1 -1
  391. package/dist/shell/workspace-switcher.js +1 -1
  392. package/dist/shell/workspace-switcher.js.map +1 -1
  393. package/dist/uploader/file-upload-constants.d.ts +13 -0
  394. package/dist/uploader/file-upload-constants.js +4 -16
  395. package/dist/uploader/file-upload-constants.js.map +1 -1
  396. package/dist/uploader/file-upload.d.ts +4 -1
  397. package/dist/uploader/file-upload.js +2 -2
  398. package/dist/uploader/file-upload.js.map +1 -1
  399. package/dist/uploader/image-upload-field.d.ts +5 -1
  400. package/dist/uploader/image-upload-field.js +2 -2
  401. package/dist/uploader/image-upload-field.js.map +1 -1
  402. package/dist/uploader/use-file-upload.d.ts +4 -0
  403. package/dist/uploader/use-file-upload.js +6 -2
  404. package/dist/uploader/use-file-upload.js.map +1 -1
  405. package/package.json +4 -3
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/ui/phone-input.tsx"],"sourcesContent":["\"use client\";\n\n/*\n * Port từ Dice UI (https://diceui.com/docs/components/phone-input) — MIT, © 2024 Sadman Sakib.\n * Giữ nguyên cấu trúc thượng nguồn để còn đối chiếu ngược được; mọi chỗ đổi đều có chú thích.\n */\n\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { defaultFilter } from \"cmdk\";\nimport { Check, ChevronDown, Globe } from \"lucide-react\";\nimport * as React from \"react\";\nimport { cn } from \"../../lib/cn.js\";\nimport { useComposedRefs } from \"../../lib/compose-refs.js\";\nimport { useAsRef } from \"../../lib/use-as-ref.js\";\nimport { useIsomorphicLayoutEffect } from \"../../lib/use-isomorphic-layout-effect.js\";\nimport { useLazyRef } from \"../../lib/use-lazy-ref.js\";\nimport { VisuallyHiddenInput } from \"../../lib/visually-hidden-input.js\";\nimport { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList } from \"./command.js\";\nimport { Input } from \"./input.js\";\nimport {\n type PhoneInputCountry as Country,\n DEFAULT_PHONE_INPUT_LABELS,\n type PhoneInputLabels\n} from \"./phone-input-constants.js\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"./popover.js\";\n\nconst ROOT_NAME = \"PhoneInput\";\nconst COUNTRY_SELECT_NAME = \"PhoneInputCountrySelect\";\nconst FIELD_NAME = \"PhoneInputField\";\n\n/*\n * ⚠ Khác thượng nguồn: thượng nguồn KHÔNG có quốc gia mặc định (ô cờ để trống, một ô xám) và gọi\n * tên quốc gia bằng tiếng Anh. Comitor mặc định Việt Nam, tên quốc gia tiếng Việt — cả hai đổi\n * được qua prop `defaultCountry` / `locale`.\n */\nconst DEFAULT_COUNTRY = \"VN\";\nconst DEFAULT_DISPLAY_LOCALE = \"vi\";\n\n/**\n * Bảng mã quay số theo quốc gia (≈250 nước), dạng `[iso2, mã quay số]`.\n * @see https://github.com/mukeshsoni/country-telephone-data/blob/master/country_telephone_data.js\n * @format [iso2, dialCode]\n */\nconst COUNTRY_DATA: [string, string][] = [\n [\"af\", \"93\"],\n [\"ax\", \"358\"],\n [\"al\", \"355\"],\n [\"dz\", \"213\"],\n [\"as\", \"1684\"],\n [\"ad\", \"376\"],\n [\"ao\", \"244\"],\n [\"ai\", \"1264\"],\n [\"ag\", \"1268\"],\n [\"ar\", \"54\"],\n [\"am\", \"374\"],\n [\"aw\", \"297\"],\n [\"au\", \"61\"],\n [\"at\", \"43\"],\n [\"az\", \"994\"],\n [\"bs\", \"1242\"],\n [\"bh\", \"973\"],\n [\"bd\", \"880\"],\n [\"bb\", \"1246\"],\n [\"by\", \"375\"],\n [\"be\", \"32\"],\n [\"bz\", \"501\"],\n [\"bj\", \"229\"],\n [\"bm\", \"1441\"],\n [\"bt\", \"975\"],\n [\"bo\", \"591\"],\n [\"ba\", \"387\"],\n [\"bw\", \"267\"],\n [\"br\", \"55\"],\n [\"io\", \"246\"],\n [\"vg\", \"1284\"],\n [\"bn\", \"673\"],\n [\"bg\", \"359\"],\n [\"bf\", \"226\"],\n [\"bi\", \"257\"],\n [\"kh\", \"855\"],\n [\"cm\", \"237\"],\n [\"ca\", \"1\"],\n [\"cv\", \"238\"],\n [\"bq\", \"599\"],\n [\"ky\", \"1345\"],\n [\"cf\", \"236\"],\n [\"td\", \"235\"],\n [\"cl\", \"56\"],\n [\"cn\", \"86\"],\n [\"co\", \"57\"],\n [\"km\", \"269\"],\n [\"cd\", \"243\"],\n [\"cg\", \"242\"],\n [\"ck\", \"682\"],\n [\"cr\", \"506\"],\n [\"ci\", \"225\"],\n [\"hr\", \"385\"],\n [\"cu\", \"53\"],\n [\"cw\", \"599\"],\n [\"cy\", \"357\"],\n [\"cz\", \"420\"],\n [\"dk\", \"45\"],\n [\"dj\", \"253\"],\n [\"dm\", \"1767\"],\n [\"do\", \"1\"],\n [\"ec\", \"593\"],\n [\"eg\", \"20\"],\n [\"sv\", \"503\"],\n [\"gq\", \"240\"],\n [\"er\", \"291\"],\n [\"ee\", \"372\"],\n [\"et\", \"251\"],\n [\"fk\", \"500\"],\n [\"fo\", \"298\"],\n [\"fj\", \"679\"],\n [\"fi\", \"358\"],\n [\"fr\", \"33\"],\n [\"gf\", \"594\"],\n [\"pf\", \"689\"],\n [\"ga\", \"241\"],\n [\"gm\", \"220\"],\n [\"ge\", \"995\"],\n [\"de\", \"49\"],\n [\"gh\", \"233\"],\n [\"gi\", \"350\"],\n [\"gr\", \"30\"],\n [\"gl\", \"299\"],\n [\"gd\", \"1473\"],\n [\"gp\", \"590\"],\n [\"gu\", \"1671\"],\n [\"gt\", \"502\"],\n [\"gg\", \"44\"],\n [\"gn\", \"224\"],\n [\"gw\", \"245\"],\n [\"gy\", \"592\"],\n [\"ht\", \"509\"],\n [\"hn\", \"504\"],\n [\"hk\", \"852\"],\n [\"hu\", \"36\"],\n [\"is\", \"354\"],\n [\"in\", \"91\"],\n [\"id\", \"62\"],\n [\"ir\", \"98\"],\n [\"iq\", \"964\"],\n [\"ie\", \"353\"],\n [\"im\", \"44\"],\n [\"il\", \"972\"],\n [\"it\", \"39\"],\n [\"jm\", \"1876\"],\n [\"jp\", \"81\"],\n [\"je\", \"44\"],\n [\"jo\", \"962\"],\n [\"kz\", \"7\"],\n [\"ke\", \"254\"],\n [\"ki\", \"686\"],\n [\"xk\", \"383\"],\n [\"kw\", \"965\"],\n [\"kg\", \"996\"],\n [\"la\", \"856\"],\n [\"lv\", \"371\"],\n [\"lb\", \"961\"],\n [\"ls\", \"266\"],\n [\"lr\", \"231\"],\n [\"ly\", \"218\"],\n [\"li\", \"423\"],\n [\"lt\", \"370\"],\n [\"lu\", \"352\"],\n [\"mo\", \"853\"],\n [\"mk\", \"389\"],\n [\"mg\", \"261\"],\n [\"mw\", \"265\"],\n [\"my\", \"60\"],\n [\"mv\", \"960\"],\n [\"ml\", \"223\"],\n [\"mt\", \"356\"],\n [\"mh\", \"692\"],\n [\"mq\", \"596\"],\n [\"mr\", \"222\"],\n [\"mu\", \"230\"],\n [\"mx\", \"52\"],\n [\"fm\", \"691\"],\n [\"md\", \"373\"],\n [\"mc\", \"377\"],\n [\"mn\", \"976\"],\n [\"me\", \"382\"],\n [\"ms\", \"1664\"],\n [\"ma\", \"212\"],\n [\"mz\", \"258\"],\n [\"mm\", \"95\"],\n [\"na\", \"264\"],\n [\"nr\", \"674\"],\n [\"np\", \"977\"],\n [\"nl\", \"31\"],\n [\"nc\", \"687\"],\n [\"nz\", \"64\"],\n [\"ni\", \"505\"],\n [\"ne\", \"227\"],\n [\"ng\", \"234\"],\n [\"nu\", \"683\"],\n [\"nf\", \"672\"],\n [\"kp\", \"850\"],\n [\"mp\", \"1670\"],\n [\"no\", \"47\"],\n [\"om\", \"968\"],\n [\"pk\", \"92\"],\n [\"pw\", \"680\"],\n [\"ps\", \"970\"],\n [\"pa\", \"507\"],\n [\"pg\", \"675\"],\n [\"py\", \"595\"],\n [\"pe\", \"51\"],\n [\"ph\", \"63\"],\n [\"pl\", \"48\"],\n [\"pt\", \"351\"],\n [\"pr\", \"1\"],\n [\"qa\", \"974\"],\n [\"re\", \"262\"],\n [\"ro\", \"40\"],\n [\"ru\", \"7\"],\n [\"rw\", \"250\"],\n [\"bl\", \"590\"],\n [\"sh\", \"290\"],\n [\"kn\", \"1869\"],\n [\"lc\", \"1758\"],\n [\"mf\", \"590\"],\n [\"pm\", \"508\"],\n [\"vc\", \"1784\"],\n [\"ws\", \"685\"],\n [\"sm\", \"378\"],\n [\"st\", \"239\"],\n [\"sa\", \"966\"],\n [\"sn\", \"221\"],\n [\"rs\", \"381\"],\n [\"sc\", \"248\"],\n [\"sl\", \"232\"],\n [\"sg\", \"65\"],\n [\"sx\", \"1721\"],\n [\"sk\", \"421\"],\n [\"si\", \"386\"],\n [\"sb\", \"677\"],\n [\"so\", \"252\"],\n [\"za\", \"27\"],\n [\"kr\", \"82\"],\n [\"ss\", \"211\"],\n [\"es\", \"34\"],\n [\"lk\", \"94\"],\n [\"sd\", \"249\"],\n [\"sr\", \"597\"],\n [\"sz\", \"268\"],\n [\"se\", \"46\"],\n [\"ch\", \"41\"],\n [\"sy\", \"963\"],\n [\"tw\", \"886\"],\n [\"tj\", \"992\"],\n [\"tz\", \"255\"],\n [\"th\", \"66\"],\n [\"tl\", \"670\"],\n [\"tg\", \"228\"],\n [\"tk\", \"690\"],\n [\"to\", \"676\"],\n [\"tt\", \"1868\"],\n [\"tn\", \"216\"],\n [\"tr\", \"90\"],\n [\"tm\", \"993\"],\n [\"tc\", \"1649\"],\n [\"tv\", \"688\"],\n [\"vi\", \"1340\"],\n [\"ug\", \"256\"],\n [\"ua\", \"380\"],\n [\"ae\", \"971\"],\n [\"gb\", \"44\"],\n [\"us\", \"1\"],\n [\"uy\", \"598\"],\n [\"uz\", \"998\"],\n [\"vu\", \"678\"],\n [\"va\", \"39\"],\n [\"ve\", \"58\"],\n [\"vn\", \"84\"],\n [\"wf\", \"681\"],\n [\"eh\", \"212\"],\n [\"ye\", \"967\"],\n [\"zm\", \"260\"],\n [\"zw\", \"263\"]\n];\n\nfunction getCountryName(countryCode: string, regionNames: Intl.DisplayNames | undefined): string {\n try {\n return regionNames?.of(countryCode) ?? countryCode;\n } catch {\n return countryCode;\n }\n}\n\nfunction getFlagEmoji(countryCode: string): string {\n const codePoints = countryCode\n .toUpperCase()\n .split(\"\")\n .map((char) => 127397 + char.charCodeAt(0));\n return String.fromCodePoint(...codePoints);\n}\n\n/*\n * ⚠ Khác thượng nguồn, ba chỗ:\n * 1. Tên theo `locale` (mặc định \"vi\") thay vì ghim \"en\".\n * 2. `Intl.DisplayNames` + `Intl.Collator` dựng MỘT lần cho cả danh sách. Thượng nguồn dựng\n * `DisplayNames` cho từng nước (≈250 lần) và gọi hàm này làm giá trị mặc định của prop, tức\n * MỖI LƯỢT RENDER — mỗi phím gõ vào ô số là dựng lại cả danh sách.\n * 3. Sắp xếp bằng collator của đúng `locale` đó (\"Đan Mạch\" sau \"Dominica\" như từ điển tiếng\n * Việt), không theo locale mặc định của máy chạy — server và trình duyệt mới ra cùng thứ tự.\n */\nfunction getCountries(locale: string = DEFAULT_DISPLAY_LOCALE): Country[] {\n let regionNames: Intl.DisplayNames | undefined;\n let collator: Intl.Collator | undefined;\n try {\n regionNames = new Intl.DisplayNames([locale], { type: \"region\" });\n collator = new Intl.Collator(locale);\n } catch {\n // `locale` không hợp lệ → tên rơi về mã nước, thứ tự theo `localeCompare` mặc định.\n }\n\n return COUNTRY_DATA.map(([iso2, dialCode]): Country => {\n const code = iso2.toUpperCase();\n return {\n code,\n name: getCountryName(code, regionNames),\n dialCode: `+${dialCode}`,\n flag: getFlagEmoji(code)\n };\n }).sort((a, b) => (collator ? collator.compare(a.name, b.name) : a.name.localeCompare(b.name)));\n}\n\n/*\n * ⚠ Khác thượng nguồn: tìm quốc gia KHÔNG DẤU — gõ \"viet nam\" ra \"Việt Nam\", \"duc\" ra \"Đức\".\n * Vẫn dùng `defaultFilter` của cmdk (giữ cách chấm điểm/xếp hạng của thượng nguồn), chỉ bỏ dấu\n * hai vế trước khi so. Chuẩn hoá viết tại chỗ vì hàm bỏ dấu của gói (`removeVietnameseTones`) nằm\n * ở tầng composite, mà tầng primitive không được nhập ngược lên.\n */\nfunction removeDiacritics(text: string): string {\n return text\n .normalize(\"NFD\")\n .replace(/\\p{Diacritic}/gu, \"\")\n .replace(/đ/g, \"d\")\n .replace(/Đ/g, \"D\");\n}\n\nfunction filterCountries(value: string, search: string, keywords?: string[]): number {\n return defaultFilter(removeDiacritics(value), removeDiacritics(search), keywords?.map(removeDiacritics));\n}\n\n/*\n * ⚠ Khác thượng nguồn: 8 mã quay số trong `COUNTRY_DATA` là của CHUNG nhiều nước. Thượng nguồn chỉ\n * xử lý riêng +1 → US; mã còn lại rơi vào nước đứng TRƯỚC theo thứ tự chữ cái của TÊN, tức phụ\n * thuộc ngôn ngữ hiển thị. Đo được (ICU của Node 24): tên tiếng Anh cho +7 → Kazakhstan, +44 →\n * Guernsey, +358 → Quần đảo Åland, +599 → Ca-ri-bê Hà Lan; tên tiếng Việt cho +7 → Kazakhstan,\n * +44 → Đảo Man, +599 → Ca-ri-bê Hà Lan. Bảng này ghim nước chính của từng mã, bất kể ngôn ngữ.\n */\nconst PRIMARY_COUNTRY_BY_DIAL_CODE: Record<string, string> = {\n \"+1\": \"US\",\n \"+7\": \"RU\",\n \"+39\": \"IT\",\n \"+44\": \"GB\",\n \"+212\": \"MA\",\n \"+358\": \"FI\",\n \"+590\": \"GP\",\n \"+599\": \"CW\"\n};\n\nfunction detectCountryFromNumber(value: string, countries: Country[], currentCode?: string): Country | undefined {\n if (!value?.startsWith(\"+\")) return undefined;\n\n const digits = value.slice(1).replace(/\\D/g, \"\");\n if (!digits) return undefined;\n\n const sorted = [...countries].sort((a, b) => b.dialCode.length - a.dialCode.length);\n\n const matches: Country[] = [];\n for (const country of sorted) {\n const dialCode = country.dialCode.slice(1);\n if (digits.startsWith(dialCode)) {\n matches.push(country);\n }\n }\n\n const best = matches[0];\n if (!best) return undefined;\n\n /*\n * ⚠ Khác thượng nguồn: nhiều nước cùng khớp mã DÀI NHẤT → ưu tiên nước ĐANG CHỌN nếu nó nằm trong\n * số đó, rồi mới tới nước chính của mã. Thượng nguồn luôn trả US cho +1, nên người dùng chọn\n * \"Canada\" rồi gõ \"+1 604…\" bị lật cờ sang Hoa Kỳ ngay phím đầu tiên.\n */\n const tied = matches.filter((c) => c.dialCode === best.dialCode);\n if (tied.length > 1) {\n const current = tied.find((c) => c.code === currentCode);\n if (current) return current;\n const primary = tied.find((c) => c.code === PRIMARY_COUNTRY_BY_DIAL_CODE[best.dialCode]);\n if (primary) return primary;\n }\n\n return best;\n}\n\nfunction formatPhoneNumber(value: string, countries: Country[]): string {\n if (!value) return \"\";\n\n const normalized = value.startsWith(\"+\") ? value : `+${value}`;\n\n const digits = normalized.slice(1).replace(/\\D/g, \"\");\n if (!digits) return \"+\";\n\n const detected = detectCountryFromNumber(`+${digits}`, countries);\n const dialCodeLength = detected ? detected.dialCode.slice(1).length : Math.min(digits.length, 3);\n\n const countryCode = digits.slice(0, dialCodeLength);\n const rest = digits.slice(dialCodeLength);\n\n let formatted = `+${countryCode}`;\n\n if (rest) {\n formatted += \" \";\n for (let i = 0; i < rest.length; i++) {\n if (i > 0 && i % 3 === 0) {\n formatted += \" \";\n }\n formatted += rest[i];\n }\n }\n\n return formatted;\n}\n\n/*\n * ⚠ Khác thượng nguồn — SỐ NỘI ĐỊA. CRM/HR phải lưu số dạng E.164 (`+84912345678`), mà người Việt\n * gõ số của mình kèm số 0 đầu (`0912 345 678`). Thượng nguồn coi chữ số đầu tiên luôn là mã quốc\n * gia nên lưu ra `+0912345678` — một số không tồn tại. Luật ở đây: chuỗi gõ vào KHÔNG bắt đầu bằng\n * `+` và đang có quốc gia được chọn → đó là số NỘI ĐỊA của nước ấy: bỏ MỘT số 0 đầu (tiền tố trung\n * kế) rồi ghép mã quay số của nước đang chọn. Bắt đầu bằng `+` → như thượng nguồn (nước suy từ mã).\n * Không có quốc gia nào được chọn → như thượng nguồn.\n *\n * `COUNTRY_DATA` không có thông tin tiền tố trung kế, nên số 0 đầu mặc định được coi là tiền tố —\n * TRỪ các nước trong bảng dưới: không có tiền tố trung kế mà số thật lại bắt đầu bằng 0 (máy bàn Ý\n * `06 …` → `+39 06 …`, cả San Marino và Vatican dùng chung luật đánh số đó). Nước có tiền tố trung\n * kế KHÁC 0 (Nga/Kazakhstan `8`, Bắc Mỹ `1`) chưa được xử lý: gõ kèm tiền tố ấy thì nó lọt vào số.\n */\nconst NO_TRUNK_PREFIX_COUNTRIES = new Set([\"IT\", \"SM\", \"VA\"]);\n\n/** Ký tự bị gạt khỏi ô khi gõ số nội địa — giữ chữ số và các dấu ngăn cách quen tay. */\nconst NATIONAL_INPUT_DISALLOWED = /[^\\d\\s().-]/g;\n\nfunction nationalToE164(nationalInput: string, country: Country): string {\n let digits = nationalInput.replace(/\\D/g, \"\");\n if (digits.startsWith(\"0\") && !NO_TRUNK_PREFIX_COUNTRIES.has(country.code)) {\n digits = digits.slice(1);\n }\n return digits ? `${country.dialCode}${digits}` : \"\";\n}\n\n/**\n * Chuỗi nội địa người dùng đang gõ — CHỈ khi nó còn khớp giá trị hiện tại. App đặt lại `value` từ\n * ngoài (reset form, nạp bản ghi khác) thì chuỗi cũ hết đúng, ô quay về dạng quốc tế đã tách nhóm.\n */\nfunction getNationalInput(state: StoreState, countries: Country[]): string | null {\n const { nationalInput, country, value } = state;\n if (nationalInput === null) return null;\n const selected = countries.find((c) => c.code === country);\n if (!selected || nationalToE164(nationalInput, selected) !== value) return null;\n return nationalInput;\n}\n\ntype RootElement = React.ComponentRef<typeof PhoneInput>;\n\ninterface StoreState {\n value: string;\n country: string;\n open: boolean;\n startsWithPlus: boolean;\n /**\n * ⚠ Thêm so với thượng nguồn: chữ người dùng gõ ở chế độ số nội địa, đúng như gõ (đã gạt ký tự\n * lạ), để ô hiện lại nguyên văn thay vì dạng `+84 …`. `null` = chế độ quốc tế của thượng nguồn.\n */\n nationalInput: string | null;\n}\n\ninterface Store {\n subscribe: (callback: () => void) => () => void;\n getState: () => StoreState;\n setState: <K extends keyof StoreState>(key: K, value: StoreState[K]) => void;\n notify: () => void;\n}\n\nconst StoreContext = React.createContext<Store | null>(null);\n\nfunction useStoreContext(consumerName: string) {\n const context = React.useContext(StoreContext);\n if (!context) {\n throw new Error(`\\`${consumerName}\\` phải nằm bên trong \\`${ROOT_NAME}\\``);\n }\n return context;\n}\n\nfunction useStore<T>(selector: (state: StoreState) => T, ogStore?: Store | null): T {\n const contextStore = React.useContext(StoreContext);\n\n const store = ogStore ?? contextStore;\n\n if (!store) {\n throw new Error(`\\`usePhoneInput\\` phải được gọi bên trong \\`${ROOT_NAME}\\``);\n }\n\n const getSnapshot = React.useCallback(() => selector(store.getState()), [store, selector]);\n\n return React.useSyncExternalStore(store.subscribe, getSnapshot, getSnapshot);\n}\n\ninterface PhoneInputContextValue {\n rootId: string;\n countries: Country[];\n placeholder: string;\n labels: PhoneInputLabels;\n disabled?: boolean;\n readOnly?: boolean;\n required?: boolean;\n invalid?: boolean;\n showFlag: boolean;\n inputRef: React.RefObject<HTMLInputElement | null>;\n}\n\nconst PhoneInputContext = React.createContext<PhoneInputContextValue | null>(null);\n\nfunction usePhoneInputContext(consumerName: string) {\n const context = React.useContext(PhoneInputContext);\n if (!context) {\n throw new Error(`\\`${consumerName}\\` phải nằm bên trong \\`${ROOT_NAME}\\``);\n }\n return context;\n}\n\n/**\n * Ô nhập số điện thoại quốc tế: nút chọn quốc gia (`PhoneInputCountrySelect`) + ô số\n * (`PhoneInputField`). Giá trị (`value` / `onValueChange` / input ẩn khi submit form) luôn là E.164\n * chỉ gồm chữ số: `\"+84912345678\"`. Người dùng gõ được theo HAI cách:\n *\n * - **Số nội địa** — chuỗi KHÔNG bắt đầu bằng `+`, và đang có quốc gia được chọn (mặc định Việt\n * Nam): bỏ một số 0 đầu rồi ghép mã quay số của nước đang chọn. Ô hiện NGUYÊN VĂN chữ đã gõ\n * (chỉ gạt ký tự không phải số hay `space ( ) . -`), con trỏ không nhảy; đổi quốc gia thì giá trị\n * ghép lại theo mã mới, còn chữ trên ô giữ nguyên.\n * Gõ `0912 345 678` → ô hiện `0912 345 678`, `onValueChange(\"+84912345678\")`.\n * ⚠ Khác thượng nguồn — bản gốc ra `+0912345678`. Ý, San Marino, Vatican giữ số 0 đầu (máy bàn\n * `06 …` → `+39 06 …`).\n * - **Số quốc tế** — chuỗi bắt đầu bằng `+` (như thượng nguồn): ô hiện tách nhóm\n * (`+84 912 345 678`), quốc gia tự nhận theo mã quay số.\n * Gõ `+84 912 345 678` → `onValueChange(\"+84912345678\")`, cờ chuyển sang Việt Nam.\n *\n * Giá trị nạp từ ngoài (`value`/`defaultValue`) luôn hiện ở dạng quốc tế. Không có quốc gia nào\n * được chọn (`defaultCountry=\"\"`) thì mọi chữ số đầu bị coi là mã quốc gia, như thượng nguồn.\n *\n * Gốc là `role=\"group\"` chưa có tên: đặt `aria-label` (vd \"Số điện thoại\") hoặc `aria-labelledby`\n * cho chính `PhoneInput`.\n */\ninterface PhoneInputProps extends React.ComponentProps<\"div\"> {\n defaultValue?: string;\n value?: string;\n onValueChange?: (value: string) => void;\n /**\n * Quốc gia ban đầu (mã ISO alpha-2, viết HOA). Mặc định `\"VN\"`.\n *\n * ⚠ Khác thượng nguồn: thượng nguồn để trống. Truyền `\"\"` để quay về hành vi đó.\n */\n defaultCountry?: string;\n country?: string;\n onCountryChange?: (country: string) => void;\n countries?: Country[];\n name?: string;\n /** Placeholder ô nhập số. Mặc định \"Nhập số điện thoại\". */\n placeholder?: string;\n /**\n * Locale BCP 47 để gọi tên quốc gia (`Intl.DisplayNames`) và sắp xếp danh sách. Mặc định `\"vi\"`.\n * Bỏ qua khi app truyền `countries` riêng (tên lấy nguyên từ đó).\n *\n * ⚠ Thêm so với thượng nguồn — bản gốc ghim tên tiếng Anh.\n */\n locale?: string;\n /** Chuỗi hiển thị/đọc màn hình của phần chọn quốc gia — override từng khoá. */\n labels?: Partial<PhoneInputLabels>;\n asChild?: boolean;\n disabled?: boolean;\n readOnly?: boolean;\n required?: boolean;\n invalid?: boolean;\n showFlag?: boolean;\n}\n\nfunction PhoneInput(props: PhoneInputProps) {\n const {\n value: valueProp,\n defaultValue,\n defaultCountry = DEFAULT_COUNTRY,\n country: countryProp,\n onValueChange,\n onCountryChange,\n countries: countriesProp,\n name,\n placeholder = \"Nhập số điện thoại\",\n locale = DEFAULT_DISPLAY_LOCALE,\n labels: labelsProp,\n asChild,\n disabled,\n required,\n readOnly,\n invalid,\n showFlag = true,\n className,\n id,\n ref,\n ...rootProps\n } = props;\n\n const instanceId = React.useId();\n const rootId = id ?? instanceId;\n\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n // ⚠ Khác thượng nguồn: ghi nhớ danh sách (thượng nguồn dựng lại mỗi lượt render — xem `getCountries`).\n const countries = React.useMemo(() => countriesProp ?? getCountries(locale), [countriesProp, locale]);\n const labels = React.useMemo(() => ({ ...DEFAULT_PHONE_INPUT_LABELS, ...labelsProp }), [labelsProp]);\n\n const [formTrigger, setFormTrigger] = React.useState<RootElement | null>(null);\n const composedRef = useComposedRefs(ref, (node) => setFormTrigger(node));\n const isFormControl = formTrigger ? !!formTrigger.closest(\"form\") : true;\n\n const listenersRef = useLazyRef(() => new Set<() => void>());\n const stateRef = useLazyRef<StoreState>(() => {\n const initialValue = valueProp ?? defaultValue ?? \"\";\n const initialCountry = countryProp ?? defaultCountry ?? \"\";\n\n return {\n value: initialValue,\n country: initialCountry,\n open: false,\n startsWithPlus: initialValue.startsWith(\"+\"),\n nationalInput: null\n };\n });\n\n const propsRef = useAsRef({\n onValueChange,\n onCountryChange,\n countries\n });\n\n const store = React.useMemo<Store>(() => {\n return {\n subscribe: (cb) => {\n listenersRef.current.add(cb);\n return () => listenersRef.current.delete(cb);\n },\n getState: () => stateRef.current,\n setState: (key, value) => {\n if (Object.is(stateRef.current[key], value)) return;\n\n if (key === \"value\" && typeof value === \"string\") {\n stateRef.current.value = value;\n propsRef.current.onValueChange?.(value);\n } else if (key === \"country\" && typeof value === \"string\") {\n // Đọc TRƯỚC khi đổi nước: chuỗi nội địa chỉ còn hiệu lực nếu khớp giá trị theo nước CŨ.\n const nationalInput = getNationalInput(stateRef.current, propsRef.current.countries);\n stateRef.current.country = value;\n propsRef.current.onCountryChange?.(value);\n\n /*\n * ⚠ Khác thượng nguồn: đang gõ số nội địa mà đổi quốc gia → chữ trên ô giờ là số nội địa\n * của nước MỚI, giá trị ghép lại mã quay số mới (ô giữ nguyên chữ). Nước mới không có\n * trong danh sách (bỏ chọn) → thôi chế độ nội địa, giữ nguyên giá trị E.164 đang có.\n */\n if (nationalInput !== null) {\n const selected = propsRef.current.countries.find((c) => c.code === value);\n if (selected) {\n const nextValue = nationalToE164(nationalInput, selected);\n if (nextValue !== stateRef.current.value) {\n stateRef.current.value = nextValue;\n propsRef.current.onValueChange?.(nextValue);\n }\n } else {\n stateRef.current.nationalInput = null;\n }\n }\n } else {\n stateRef.current[key] = value;\n }\n\n store.notify();\n },\n notify: () => {\n for (const cb of listenersRef.current) {\n cb();\n }\n }\n };\n }, [listenersRef, stateRef, propsRef]);\n\n const value = useStore((state) => state.value, store);\n const country = useStore((state) => state.country, store);\n\n useIsomorphicLayoutEffect(() => {\n if (valueProp !== undefined) {\n store.setState(\"value\", valueProp);\n }\n }, [valueProp]);\n\n useIsomorphicLayoutEffect(() => {\n if (countryProp !== undefined) {\n store.setState(\"country\", countryProp);\n }\n }, [countryProp]);\n\n const startsWithPlus = useStore((state) => state.startsWithPlus, store);\n const nationalInput = useStore((state) => getNationalInput(state, countries), store);\n\n React.useEffect(() => {\n /*\n * ⚠ Khác thượng nguồn: đang gõ số nội địa thì quốc gia ĐANG CHỌN là nguồn sự thật — dò lại theo\n * mã quay số lúc này chỉ có thể sai: Hoa Kỳ + `340 555 1234` → `+13405551234` → dò ra Quần đảo\n * Virgin (+1340), rồi giá trị bị ghép lại theo mã mới thành số rác.\n */\n if (!value || nationalInput !== null) return;\n\n const digits = value.slice(1).replace(/\\D/g, \"\");\n const shouldDetect = startsWithPlus || digits.length >= 10;\n\n if (!shouldDetect) return;\n\n const detected = detectCountryFromNumber(value, countries, country);\n if (detected && detected.code !== country) {\n store.setState(\"country\", detected.code);\n }\n }, [value, countries, country, store, startsWithPlus, nationalInput]);\n\n const contextValue = React.useMemo<PhoneInputContextValue>(\n () => ({\n rootId,\n countries,\n placeholder,\n labels,\n disabled,\n readOnly,\n required,\n invalid,\n showFlag,\n inputRef\n }),\n [rootId, countries, placeholder, labels, disabled, required, readOnly, invalid, showFlag]\n );\n\n const RootPrimitive = asChild ? Slot : \"div\";\n\n return (\n <StoreContext.Provider value={store}>\n <PhoneInputContext.Provider value={contextValue}>\n <RootPrimitive\n role=\"group\"\n data-slot=\"phone-input\"\n data-disabled={disabled ? \"\" : undefined}\n data-invalid={invalid ? \"\" : undefined}\n data-readonly={readOnly ? \"\" : undefined}\n id={rootId}\n {...rootProps}\n ref={composedRef}\n className={cn(\n /*\n * ⚠ Khác thượng nguồn: khung mượn đúng vai trò màu của `Input` Comitor để đứng cạnh ô\n * nhập thường trong một form không lệch (cao `h-9` thay vì `h-10`, nền `bg-background`\n * thay vì `dark:bg-input/30` — viết thẳng thang màu thì bảng tương phản cao không đổi\n * được). Số đo từng vai trò: chú thích đầu `input.tsx`.\n *\n * Focus: thượng nguồn soi `[data-slot=input-group-control]` — slot KHÔNG tồn tại trong\n * component này, nên khung không bao giờ sáng. Ở đây soi đúng slot của ô số.\n *\n * Lỗi: HAI đường như `InputGroup` — `aria-invalid` trên ô số (prop `invalid`), hoặc\n * trên CHÍNH gốc khi `<FormControl>` của `@comitor/ui/form` dán nó vào con trực tiếp.\n * Viền lỗi là `--destructive-ink` (không phải `--destructive` — token TÔ NỀN).\n *\n * Vô hiệu: thượng nguồn làm mờ CẢ gốc (`data-disabled:opacity-50`) trong khi nút và ô\n * số bên trong cũng tự mờ theo `:disabled` → nội dung còn 25%. Ở đây gốc KHÔNG mờ (như\n * `InputGroup`); hai con tự mờ bằng `:disabled` gốc của HTML, gốc chỉ đổi nền theo ô số.\n * `data-disabled` còn không được cổng tương phản coi là trạng thái vô hiệu — nó không\n * chứng minh phần tử đã inert — còn `:disabled` thì có.\n */\n \"relative flex h-9 w-full items-center rounded-md border border-input bg-background transition-colors duration-150 ease-out hover:border-control-edge-strong\",\n \"has-[[data-slot=phone-input-field]:focus-visible]:border-primary-ink has-[[data-slot=phone-input-field]:focus-visible]:ring-2 has-[[data-slot=phone-input-field]:focus-visible]:ring-ring/50\",\n \"has-[[data-slot][aria-invalid=true]]:border-destructive-ink has-[[data-slot][aria-invalid=true]]:ring-destructive/30\",\n \"aria-invalid:border-destructive-ink aria-invalid:hover:border-destructive-ink aria-invalid:ring-destructive/30\",\n \"data-disabled:cursor-not-allowed has-[[data-slot=phone-input-field]:disabled]:bg-muted\",\n className\n )}\n />\n {isFormControl && (\n <VisuallyHiddenInput\n type=\"hidden\"\n control={formTrigger}\n name={name}\n value={value}\n disabled={disabled}\n readOnly={readOnly}\n required={required}\n />\n )}\n </PhoneInputContext.Provider>\n </StoreContext.Provider>\n );\n}\n\ninterface PhoneInputCountrySelectProps\n extends React.ComponentProps<typeof Popover>,\n Pick<React.ComponentProps<typeof PopoverTrigger>, \"disabled\" | \"className\"> {}\n\nfunction PhoneInputCountrySelect(props: PhoneInputCountrySelectProps) {\n const { disabled: disabledProp, className, children, onOpenChange: onOpenChangeProp, ...popoverProps } = props;\n\n const { countries, inputRef, disabled, showFlag, labels } = usePhoneInputContext(COUNTRY_SELECT_NAME);\n const store = useStoreContext(COUNTRY_SELECT_NAME);\n const country = useStore((state) => state.country);\n const open = useStore((state) => state.open);\n const onOpenChangeRef = useAsRef(onOpenChangeProp);\n\n const isDisabled = disabledProp || disabled;\n\n const countryContext = countries.find((c) => c.code === country);\n\n const onOpenChange = React.useCallback(\n (open: boolean) => {\n store.setState(\"open\", open);\n onOpenChangeRef.current?.(open);\n },\n [store, onOpenChangeRef]\n );\n\n return (\n <Popover open={open} onOpenChange={onOpenChange} {...popoverProps}>\n <PopoverTrigger\n data-slot=\"phone-input-country-select\"\n // ⚠ Khác thượng nguồn: bản gốc là một nút KHÔNG TÊN (chỉ có lá cờ emoji + mũi tên, hoặc\n // ô xám trống khi chưa chọn). Tên nói luôn giá trị hiện tại — xem `PhoneInputLabels`.\n aria-label={labels.countrySelect(countryContext)}\n disabled={isDisabled}\n className={cn(\n /*\n * Hover `bg-muted` như nút `ghost` của gói. Viền focus cùng khuôn `Button`\n * (`outline-ring`), nhưng THỤT VÀO trong (`-outline-offset-2`) vì nút nằm lọt trong khung\n * của ô — viền đẩy ra ngoài sẽ đè lên khung và lên ô số bên cạnh.\n */\n \"flex h-full shrink-0 items-center gap-2 rounded-l-md border-r border-input bg-transparent px-3 text-sm transition-colors duration-150 ease-out hover:bg-muted focus-visible:outline-2 focus-visible:outline-ring focus-visible:-outline-offset-2 disabled:pointer-events-none disabled:opacity-50\",\n className\n )}\n >\n {/* `span` thay cho `div` của thượng nguồn: `<button>` chỉ nhận nội dung phrasing. */}\n {!countryContext ? (\n /*\n * ⚠ Khác thượng nguồn: bản gốc vẽ một ô `bg-muted/50` trống — 1,00:1 trên nền hover\n * `--muted`, tức biến mất đúng lúc người dùng rê chuột vào (cổng tương phản chặn). Quả\n * địa cầu nói được \"chưa chọn quốc gia\"; giữ bề rộng `w-6` của lá cờ để chọn xong không\n * xô lệch.\n */\n <span aria-hidden=\"true\" className=\"flex w-6 justify-center\">\n <Globe className=\"size-4 text-muted-foreground\" />\n </span>\n ) : (\n showFlag &&\n countryContext.flag && (\n <span aria-hidden=\"true\" className=\"w-6 text-lg leading-none\">\n {countryContext.flag}\n </span>\n )\n )}\n {/* Mũi tên chỉ trạng thái → ngưỡng 3:1; `text-muted-foreground` như chevron của `SelectTrigger`. */}\n <ChevronDown aria-hidden=\"true\" className=\"size-4 text-muted-foreground\" />\n </PopoverTrigger>\n <PopoverContent className=\"w-[300px] p-0\" align=\"start\">\n <Command filter={filterCountries}>\n <CommandInput placeholder={labels.searchPlaceholder} />\n <CommandList>\n <CommandEmpty>{labels.empty}</CommandEmpty>\n <CommandGroup>\n {countries.map((c) => (\n <CommandItem\n key={c.code}\n value={`${c.name} ${c.dialCode} ${c.code}`}\n onSelect={() => {\n store.setState(\"country\", c.code);\n store.setState(\"open\", false);\n requestAnimationFrame(() => {\n inputRef.current?.focus();\n });\n }}\n >\n {/* Cờ là trang trí — tên nước ngay bên cạnh đã nói đủ; không ẩn thì bị đọc hai lần. */}\n {showFlag && c.flag && (\n <span aria-hidden=\"true\" className=\"text-lg\">\n {c.flag}\n </span>\n )}\n <span className=\"flex-1\">{c.name}</span>\n <span className=\"text-muted-foreground\">{c.dialCode}</span>\n <Check\n aria-hidden=\"true\"\n className={cn(\"size-4\", country === c.code ? \"opacity-100\" : \"opacity-0\")}\n />\n </CommandItem>\n ))}\n </CommandGroup>\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n );\n}\n\ntype PhoneInputFieldProps = React.ComponentProps<\"input\">;\n\nfunction PhoneInputField(props: PhoneInputFieldProps) {\n const {\n onChange: onChangeProp,\n className,\n disabled: disabledProp,\n readOnly: readOnlyProp,\n required: requiredProp,\n placeholder: placeholderProp,\n ref,\n ...inputProps\n } = props;\n\n const { inputRef, disabled, invalid, readOnly, required, placeholder, countries } = usePhoneInputContext(FIELD_NAME);\n const store = useStoreContext(FIELD_NAME);\n const value = useStore((state) => state.value);\n const nationalInput = useStore((state) => getNationalInput(state, countries));\n\n const composedRef = useComposedRefs(ref, inputRef);\n\n const onChangeRef = useAsRef(onChangeProp);\n\n const isDisabled = disabledProp || disabled;\n const isReadOnly = readOnlyProp || readOnly;\n const isRequired = requiredProp || required;\n\n const onChange = React.useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n if (isDisabled || isReadOnly) return;\n\n onChangeRef.current?.(event);\n if (event.defaultPrevented) return;\n\n const inputValue = event.target.value;\n\n // ⚠ Khác thượng nguồn: bỏ khoảng trắng đầu trước khi xét dấu `+` — chuỗi dán vào hay kèm nó.\n const startsWithPlus = inputValue.trimStart().startsWith(\"+\");\n\n // ⚠ Khác thượng nguồn — số NỘI ĐỊA (luật và lý do: chú thích trên `nationalToE164`).\n const selectedCountry = startsWithPlus ? undefined : countries.find((c) => c.code === store.getState().country);\n\n if (selectedCountry) {\n const nextNationalInput = inputValue.replace(NATIONAL_INPUT_DISALLOWED, \"\");\n\n if (nextNationalInput !== inputValue) {\n // Gạt ký tự lạ NGAY trên DOM và đặt lại con trỏ tại chỗ: nhờ vậy lúc render React thấy\n // DOM đã đúng giá trị, không ghi đè — ghi đè là con trỏ nhảy về cuối ô.\n const target = event.target;\n const caret = target.selectionStart ?? inputValue.length;\n const nextCaret = inputValue.slice(0, caret).replace(NATIONAL_INPUT_DISALLOWED, \"\").length;\n target.value = nextNationalInput;\n target.setSelectionRange(nextCaret, nextCaret);\n }\n\n store.setState(\"startsWithPlus\", false);\n store.setState(\"nationalInput\", nextNationalInput);\n store.setState(\"value\", nationalToE164(nextNationalInput, selectedCountry));\n return;\n }\n\n const digits = inputValue.replace(/\\D/g, \"\");\n const newValue = digits ? `+${digits}` : startsWithPlus ? \"+\" : \"\";\n store.setState(\"startsWithPlus\", startsWithPlus);\n store.setState(\"nationalInput\", null);\n store.setState(\"value\", newValue);\n },\n [store, countries, onChangeRef, isDisabled, isReadOnly]\n );\n\n // Số nội địa hiện NGUYÊN VĂN chữ đã gõ (con trỏ không nhảy); số quốc tế tách nhóm như thượng nguồn.\n const displayValue = React.useMemo(() => {\n return nationalInput ?? formatPhoneNumber(value, countries);\n }, [nationalInput, value, countries]);\n\n return (\n <Input\n type=\"tel\"\n inputMode=\"tel\"\n aria-required={isRequired}\n aria-invalid={invalid}\n data-slot=\"phone-input-field\"\n disabled={isDisabled}\n readOnly={isReadOnly}\n required={isRequired}\n {...inputProps}\n ref={composedRef}\n className={cn(\n // Viền, quầng focus và nền (kể cả nền `--muted` lúc vô hiệu) đều do khung gốc vẽ; ô số\n // trong suốt và phẳng. `focus:ring-0` chứ không `focus-visible:` — `Input` vẽ quầng bằng `focus:`.\n \"h-full flex-1 rounded-l-none rounded-r-md border-0 bg-transparent focus:ring-0 disabled:bg-transparent\",\n className\n )}\n // ⚠ Khác thượng nguồn: bản gốc đặt placeholder của gốc SAU `{...inputProps}`, nên\n // `<PhoneInputField placeholder=\"…\" />` (chính demo của thượng nguồn) bị lờ đi.\n placeholder={placeholderProp ?? placeholder}\n value={displayValue}\n onChange={onChange}\n />\n );\n}\n\nexport {\n PhoneInput,\n PhoneInputCountrySelect,\n type PhoneInputCountrySelectProps,\n PhoneInputField,\n type PhoneInputFieldProps,\n type PhoneInputProps,\n useStore as usePhoneInput\n};\n"],"mappings":"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ACV,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,MAAM;AAAA,EACb,CAAC,MAAM,MAAM;AAAA,EACb,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,MAAM;AAAA,EACb,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,MAAM;AAAA,EACb,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,MAAM;AAAA,EACb,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,MAAM;AAAA,EACb,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,MAAM;AAAA,E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","names":["value","nationalInput","open"]}
1
+ {"version":3,"sources":["../../../src/components/ui/phone-input.tsx"],"sourcesContent":["\"use client\";\n\n/*\n * Port từ Dice UI (https://diceui.com/docs/components/phone-input) — MIT, © 2024 Sadman Sakib.\n * Giữ nguyên cấu trúc thượng nguồn để còn đối chiếu ngược được; mọi chỗ đổi đều có chú thích.\n */\n\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { defaultFilter } from \"cmdk\";\nimport { Check, ChevronDown, Globe } from \"lucide-react\";\nimport * as React from \"react\";\nimport { useComitorLabels, useComitorLocale } from \"../../i18n/locale-provider.js\";\nimport { cn } from \"../../lib/cn.js\";\nimport { useComposedRefs } from \"../../lib/compose-refs.js\";\nimport { useAsRef } from \"../../lib/use-as-ref.js\";\nimport { useIsomorphicLayoutEffect } from \"../../lib/use-isomorphic-layout-effect.js\";\nimport { useLazyRef } from \"../../lib/use-lazy-ref.js\";\nimport { VisuallyHiddenInput } from \"../../lib/visually-hidden-input.js\";\nimport { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList } from \"./command.js\";\nimport { Input } from \"./input.js\";\nimport type { PhoneInputCountry as Country, PhoneInputLabels } from \"./phone-input-constants.js\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"./popover.js\";\n\nconst ROOT_NAME = \"PhoneInput\";\nconst COUNTRY_SELECT_NAME = \"PhoneInputCountrySelect\";\nconst FIELD_NAME = \"PhoneInputField\";\n\n/*\n * Quốc gia mặc định: KHÔNG CÓ — như thượng nguồn (nút chọn hiện quả địa cầu, chưa chọn gì). Nước\n * là thiết lập của VÙNG, không phải của ngôn ngữ (xem `src/i18n/locale.ts`): app Comitor truyền\n * `defaultCountry` / `country` từ cài đặt workspace. Trước `3.0.0` mặc định cứng là `\"VN\"`.\n *\n * ⚠ Khác thượng nguồn: tên quốc gia theo `locale` của `ComitorLocaleProvider` (prop `locale` đè)\n * thay vì ghim tiếng Anh. Trước `3.0.0` mặc định cứng là `\"vi\"`.\n */\n\n/**\n * Bảng mã quay số theo quốc gia (≈250 nước), dạng `[iso2, mã quay số]`.\n * @see https://github.com/mukeshsoni/country-telephone-data/blob/master/country_telephone_data.js\n * @format [iso2, dialCode]\n */\nconst COUNTRY_DATA: [string, string][] = [\n [\"af\", \"93\"],\n [\"ax\", \"358\"],\n [\"al\", \"355\"],\n [\"dz\", \"213\"],\n [\"as\", \"1684\"],\n [\"ad\", \"376\"],\n [\"ao\", \"244\"],\n [\"ai\", \"1264\"],\n [\"ag\", \"1268\"],\n [\"ar\", \"54\"],\n [\"am\", \"374\"],\n [\"aw\", \"297\"],\n [\"au\", \"61\"],\n [\"at\", \"43\"],\n [\"az\", \"994\"],\n [\"bs\", \"1242\"],\n [\"bh\", \"973\"],\n [\"bd\", \"880\"],\n [\"bb\", \"1246\"],\n [\"by\", \"375\"],\n [\"be\", \"32\"],\n [\"bz\", \"501\"],\n [\"bj\", \"229\"],\n [\"bm\", \"1441\"],\n [\"bt\", \"975\"],\n [\"bo\", \"591\"],\n [\"ba\", \"387\"],\n [\"bw\", \"267\"],\n [\"br\", \"55\"],\n [\"io\", \"246\"],\n [\"vg\", \"1284\"],\n [\"bn\", \"673\"],\n [\"bg\", \"359\"],\n [\"bf\", \"226\"],\n [\"bi\", \"257\"],\n [\"kh\", \"855\"],\n [\"cm\", \"237\"],\n [\"ca\", \"1\"],\n [\"cv\", \"238\"],\n [\"bq\", \"599\"],\n [\"ky\", \"1345\"],\n [\"cf\", \"236\"],\n [\"td\", \"235\"],\n [\"cl\", \"56\"],\n [\"cn\", \"86\"],\n [\"co\", \"57\"],\n [\"km\", \"269\"],\n [\"cd\", \"243\"],\n [\"cg\", \"242\"],\n [\"ck\", \"682\"],\n [\"cr\", \"506\"],\n [\"ci\", \"225\"],\n [\"hr\", \"385\"],\n [\"cu\", \"53\"],\n [\"cw\", \"599\"],\n [\"cy\", \"357\"],\n [\"cz\", \"420\"],\n [\"dk\", \"45\"],\n [\"dj\", \"253\"],\n [\"dm\", \"1767\"],\n [\"do\", \"1\"],\n [\"ec\", \"593\"],\n [\"eg\", \"20\"],\n [\"sv\", \"503\"],\n [\"gq\", \"240\"],\n [\"er\", \"291\"],\n [\"ee\", \"372\"],\n [\"et\", \"251\"],\n [\"fk\", \"500\"],\n [\"fo\", \"298\"],\n [\"fj\", \"679\"],\n [\"fi\", \"358\"],\n [\"fr\", \"33\"],\n [\"gf\", \"594\"],\n [\"pf\", \"689\"],\n [\"ga\", \"241\"],\n [\"gm\", \"220\"],\n [\"ge\", \"995\"],\n [\"de\", \"49\"],\n [\"gh\", \"233\"],\n [\"gi\", \"350\"],\n [\"gr\", \"30\"],\n [\"gl\", \"299\"],\n [\"gd\", \"1473\"],\n [\"gp\", \"590\"],\n [\"gu\", \"1671\"],\n [\"gt\", \"502\"],\n [\"gg\", \"44\"],\n [\"gn\", \"224\"],\n [\"gw\", \"245\"],\n [\"gy\", \"592\"],\n [\"ht\", \"509\"],\n [\"hn\", \"504\"],\n [\"hk\", \"852\"],\n [\"hu\", \"36\"],\n [\"is\", \"354\"],\n [\"in\", \"91\"],\n [\"id\", \"62\"],\n [\"ir\", \"98\"],\n [\"iq\", \"964\"],\n [\"ie\", \"353\"],\n [\"im\", \"44\"],\n [\"il\", \"972\"],\n [\"it\", \"39\"],\n [\"jm\", \"1876\"],\n [\"jp\", \"81\"],\n [\"je\", \"44\"],\n [\"jo\", \"962\"],\n [\"kz\", \"7\"],\n [\"ke\", \"254\"],\n [\"ki\", \"686\"],\n [\"xk\", \"383\"],\n [\"kw\", \"965\"],\n [\"kg\", \"996\"],\n [\"la\", \"856\"],\n [\"lv\", \"371\"],\n [\"lb\", \"961\"],\n [\"ls\", \"266\"],\n [\"lr\", \"231\"],\n [\"ly\", \"218\"],\n [\"li\", \"423\"],\n [\"lt\", \"370\"],\n [\"lu\", \"352\"],\n [\"mo\", \"853\"],\n [\"mk\", \"389\"],\n [\"mg\", \"261\"],\n [\"mw\", \"265\"],\n [\"my\", \"60\"],\n [\"mv\", \"960\"],\n [\"ml\", \"223\"],\n [\"mt\", \"356\"],\n [\"mh\", \"692\"],\n [\"mq\", \"596\"],\n [\"mr\", \"222\"],\n [\"mu\", \"230\"],\n [\"mx\", \"52\"],\n [\"fm\", \"691\"],\n [\"md\", \"373\"],\n [\"mc\", \"377\"],\n [\"mn\", \"976\"],\n [\"me\", \"382\"],\n [\"ms\", \"1664\"],\n [\"ma\", \"212\"],\n [\"mz\", \"258\"],\n [\"mm\", \"95\"],\n [\"na\", \"264\"],\n [\"nr\", \"674\"],\n [\"np\", \"977\"],\n [\"nl\", \"31\"],\n [\"nc\", \"687\"],\n [\"nz\", \"64\"],\n [\"ni\", \"505\"],\n [\"ne\", \"227\"],\n [\"ng\", \"234\"],\n [\"nu\", \"683\"],\n [\"nf\", \"672\"],\n [\"kp\", \"850\"],\n [\"mp\", \"1670\"],\n [\"no\", \"47\"],\n [\"om\", \"968\"],\n [\"pk\", \"92\"],\n [\"pw\", \"680\"],\n [\"ps\", \"970\"],\n [\"pa\", \"507\"],\n [\"pg\", \"675\"],\n [\"py\", \"595\"],\n [\"pe\", \"51\"],\n [\"ph\", \"63\"],\n [\"pl\", \"48\"],\n [\"pt\", \"351\"],\n [\"pr\", \"1\"],\n [\"qa\", \"974\"],\n [\"re\", \"262\"],\n [\"ro\", \"40\"],\n [\"ru\", \"7\"],\n [\"rw\", \"250\"],\n [\"bl\", \"590\"],\n [\"sh\", \"290\"],\n [\"kn\", \"1869\"],\n [\"lc\", \"1758\"],\n [\"mf\", \"590\"],\n [\"pm\", \"508\"],\n [\"vc\", \"1784\"],\n [\"ws\", \"685\"],\n [\"sm\", \"378\"],\n [\"st\", \"239\"],\n [\"sa\", \"966\"],\n [\"sn\", \"221\"],\n [\"rs\", \"381\"],\n [\"sc\", \"248\"],\n [\"sl\", \"232\"],\n [\"sg\", \"65\"],\n [\"sx\", \"1721\"],\n [\"sk\", \"421\"],\n [\"si\", \"386\"],\n [\"sb\", \"677\"],\n [\"so\", \"252\"],\n [\"za\", \"27\"],\n [\"kr\", \"82\"],\n [\"ss\", \"211\"],\n [\"es\", \"34\"],\n [\"lk\", \"94\"],\n [\"sd\", \"249\"],\n [\"sr\", \"597\"],\n [\"sz\", \"268\"],\n [\"se\", \"46\"],\n [\"ch\", \"41\"],\n [\"sy\", \"963\"],\n [\"tw\", \"886\"],\n [\"tj\", \"992\"],\n [\"tz\", \"255\"],\n [\"th\", \"66\"],\n [\"tl\", \"670\"],\n [\"tg\", \"228\"],\n [\"tk\", \"690\"],\n [\"to\", \"676\"],\n [\"tt\", \"1868\"],\n [\"tn\", \"216\"],\n [\"tr\", \"90\"],\n [\"tm\", \"993\"],\n [\"tc\", \"1649\"],\n [\"tv\", \"688\"],\n [\"vi\", \"1340\"],\n [\"ug\", \"256\"],\n [\"ua\", \"380\"],\n [\"ae\", \"971\"],\n [\"gb\", \"44\"],\n [\"us\", \"1\"],\n [\"uy\", \"598\"],\n [\"uz\", \"998\"],\n [\"vu\", \"678\"],\n [\"va\", \"39\"],\n [\"ve\", \"58\"],\n [\"vn\", \"84\"],\n [\"wf\", \"681\"],\n [\"eh\", \"212\"],\n [\"ye\", \"967\"],\n [\"zm\", \"260\"],\n [\"zw\", \"263\"]\n];\n\nfunction getCountryName(countryCode: string, regionNames: Intl.DisplayNames | undefined): string {\n try {\n return regionNames?.of(countryCode) ?? countryCode;\n } catch {\n return countryCode;\n }\n}\n\nfunction getFlagEmoji(countryCode: string): string {\n const codePoints = countryCode\n .toUpperCase()\n .split(\"\")\n .map((char) => 127397 + char.charCodeAt(0));\n return String.fromCodePoint(...codePoints);\n}\n\n/*\n * ⚠ Khác thượng nguồn, ba chỗ:\n * 1. Tên theo `locale` (mặc định: `locale` của `ComitorLocaleProvider`) thay vì ghim \"en\".\n * 2. `Intl.DisplayNames` + `Intl.Collator` dựng MỘT lần cho cả danh sách. Thượng nguồn dựng\n * `DisplayNames` cho từng nước (≈250 lần) và gọi hàm này làm giá trị mặc định của prop, tức\n * MỖI LƯỢT RENDER — mỗi phím gõ vào ô số là dựng lại cả danh sách.\n * 3. Sắp xếp bằng collator của đúng `locale` đó (\"Đan Mạch\" sau \"Dominica\" như từ điển tiếng\n * Việt), không theo locale mặc định của máy chạy — server và trình duyệt mới ra cùng thứ tự.\n */\nfunction getCountries(locale: string): Country[] {\n let regionNames: Intl.DisplayNames | undefined;\n let collator: Intl.Collator | undefined;\n try {\n regionNames = new Intl.DisplayNames([locale], { type: \"region\" });\n collator = new Intl.Collator(locale);\n } catch {\n // `locale` không hợp lệ → tên rơi về mã nước, thứ tự theo `localeCompare` mặc định.\n }\n\n return COUNTRY_DATA.map(([iso2, dialCode]): Country => {\n const code = iso2.toUpperCase();\n return {\n code,\n name: getCountryName(code, regionNames),\n dialCode: `+${dialCode}`,\n flag: getFlagEmoji(code)\n };\n }).sort((a, b) => (collator ? collator.compare(a.name, b.name) : a.name.localeCompare(b.name)));\n}\n\n/*\n * ⚠ Khác thượng nguồn: tìm quốc gia KHÔNG DẤU — gõ \"viet nam\" ra \"Việt Nam\", \"duc\" ra \"Đức\".\n * Vẫn dùng `defaultFilter` của cmdk (giữ cách chấm điểm/xếp hạng của thượng nguồn), chỉ bỏ dấu\n * hai vế trước khi so. Chuẩn hoá viết tại chỗ vì hàm bỏ dấu của gói (`removeVietnameseTones`) nằm\n * ở tầng composite, mà tầng primitive không được nhập ngược lên.\n */\nfunction removeDiacritics(text: string): string {\n return text\n .normalize(\"NFD\")\n .replace(/\\p{Diacritic}/gu, \"\")\n .replace(/đ/g, \"d\")\n .replace(/Đ/g, \"D\");\n}\n\nfunction filterCountries(value: string, search: string, keywords?: string[]): number {\n return defaultFilter(removeDiacritics(value), removeDiacritics(search), keywords?.map(removeDiacritics));\n}\n\n/*\n * ⚠ Khác thượng nguồn: 8 mã quay số trong `COUNTRY_DATA` là của CHUNG nhiều nước. Thượng nguồn chỉ\n * xử lý riêng +1 → US; mã còn lại rơi vào nước đứng TRƯỚC theo thứ tự chữ cái của TÊN, tức phụ\n * thuộc ngôn ngữ hiển thị. Đo được (ICU của Node 24): tên tiếng Anh cho +7 → Kazakhstan, +44 →\n * Guernsey, +358 → Quần đảo Åland, +599 → Ca-ri-bê Hà Lan; tên tiếng Việt cho +7 → Kazakhstan,\n * +44 → Đảo Man, +599 → Ca-ri-bê Hà Lan. Bảng này ghim nước chính của từng mã, bất kể ngôn ngữ.\n */\nconst PRIMARY_COUNTRY_BY_DIAL_CODE: Record<string, string> = {\n \"+1\": \"US\",\n \"+7\": \"RU\",\n \"+39\": \"IT\",\n \"+44\": \"GB\",\n \"+212\": \"MA\",\n \"+358\": \"FI\",\n \"+590\": \"GP\",\n \"+599\": \"CW\"\n};\n\nfunction detectCountryFromNumber(value: string, countries: Country[], currentCode?: string): Country | undefined {\n if (!value?.startsWith(\"+\")) return undefined;\n\n const digits = value.slice(1).replace(/\\D/g, \"\");\n if (!digits) return undefined;\n\n const sorted = [...countries].sort((a, b) => b.dialCode.length - a.dialCode.length);\n\n const matches: Country[] = [];\n for (const country of sorted) {\n const dialCode = country.dialCode.slice(1);\n if (digits.startsWith(dialCode)) {\n matches.push(country);\n }\n }\n\n const best = matches[0];\n if (!best) return undefined;\n\n /*\n * ⚠ Khác thượng nguồn: nhiều nước cùng khớp mã DÀI NHẤT → ưu tiên nước ĐANG CHỌN nếu nó nằm trong\n * số đó, rồi mới tới nước chính của mã. Thượng nguồn luôn trả US cho +1, nên người dùng chọn\n * \"Canada\" rồi gõ \"+1 604…\" bị lật cờ sang Hoa Kỳ ngay phím đầu tiên.\n */\n const tied = matches.filter((c) => c.dialCode === best.dialCode);\n if (tied.length > 1) {\n const current = tied.find((c) => c.code === currentCode);\n if (current) return current;\n const primary = tied.find((c) => c.code === PRIMARY_COUNTRY_BY_DIAL_CODE[best.dialCode]);\n if (primary) return primary;\n }\n\n return best;\n}\n\nfunction formatPhoneNumber(value: string, countries: Country[]): string {\n if (!value) return \"\";\n\n const normalized = value.startsWith(\"+\") ? value : `+${value}`;\n\n const digits = normalized.slice(1).replace(/\\D/g, \"\");\n if (!digits) return \"+\";\n\n const detected = detectCountryFromNumber(`+${digits}`, countries);\n const dialCodeLength = detected ? detected.dialCode.slice(1).length : Math.min(digits.length, 3);\n\n const countryCode = digits.slice(0, dialCodeLength);\n const rest = digits.slice(dialCodeLength);\n\n let formatted = `+${countryCode}`;\n\n if (rest) {\n formatted += \" \";\n for (let i = 0; i < rest.length; i++) {\n if (i > 0 && i % 3 === 0) {\n formatted += \" \";\n }\n formatted += rest[i];\n }\n }\n\n return formatted;\n}\n\n/*\n * ⚠ Khác thượng nguồn — SỐ NỘI ĐỊA. CRM/HR phải lưu số dạng E.164 (`+84912345678`), mà người Việt\n * gõ số của mình kèm số 0 đầu (`0912 345 678`). Thượng nguồn coi chữ số đầu tiên luôn là mã quốc\n * gia nên lưu ra `+0912345678` — một số không tồn tại. Luật ở đây: chuỗi gõ vào KHÔNG bắt đầu bằng\n * `+` và đang có quốc gia được chọn → đó là số NỘI ĐỊA của nước ấy: bỏ MỘT số 0 đầu (tiền tố trung\n * kế) rồi ghép mã quay số của nước đang chọn. Bắt đầu bằng `+` → như thượng nguồn (nước suy từ mã).\n * Không có quốc gia nào được chọn → như thượng nguồn. Từ `3.0.0` đó là trạng thái MẶC ĐỊNH (không\n * còn `\"VN\"` ngầm định): luật nội địa chỉ chạy khi app truyền `defaultCountry`/`country` hoặc\n * người dùng chọn nước trước khi gõ.\n *\n * `COUNTRY_DATA` không có thông tin tiền tố trung kế, nên số 0 đầu mặc định được coi là tiền tố —\n * TRỪ các nước trong bảng dưới: không có tiền tố trung kế mà số thật lại bắt đầu bằng 0 (máy bàn Ý\n * `06 …` → `+39 06 …`, cả San Marino và Vatican dùng chung luật đánh số đó). Nước có tiền tố trung\n * kế KHÁC 0 (Nga/Kazakhstan `8`, Bắc Mỹ `1`) chưa được xử lý: gõ kèm tiền tố ấy thì nó lọt vào số.\n */\nconst NO_TRUNK_PREFIX_COUNTRIES = new Set([\"IT\", \"SM\", \"VA\"]);\n\n/** Ký tự bị gạt khỏi ô khi gõ số nội địa — giữ chữ số và các dấu ngăn cách quen tay. */\nconst NATIONAL_INPUT_DISALLOWED = /[^\\d\\s().-]/g;\n\nfunction nationalToE164(nationalInput: string, country: Country): string {\n let digits = nationalInput.replace(/\\D/g, \"\");\n if (digits.startsWith(\"0\") && !NO_TRUNK_PREFIX_COUNTRIES.has(country.code)) {\n digits = digits.slice(1);\n }\n return digits ? `${country.dialCode}${digits}` : \"\";\n}\n\n/**\n * Chuỗi nội địa người dùng đang gõ — CHỈ khi nó còn khớp giá trị hiện tại. App đặt lại `value` từ\n * ngoài (reset form, nạp bản ghi khác) thì chuỗi cũ hết đúng, ô quay về dạng quốc tế đã tách nhóm.\n */\nfunction getNationalInput(state: StoreState, countries: Country[]): string | null {\n const { nationalInput, country, value } = state;\n if (nationalInput === null) return null;\n const selected = countries.find((c) => c.code === country);\n if (!selected || nationalToE164(nationalInput, selected) !== value) return null;\n return nationalInput;\n}\n\ntype RootElement = React.ComponentRef<typeof PhoneInput>;\n\ninterface StoreState {\n value: string;\n country: string;\n open: boolean;\n startsWithPlus: boolean;\n /**\n * ⚠ Thêm so với thượng nguồn: chữ người dùng gõ ở chế độ số nội địa, đúng như gõ (đã gạt ký tự\n * lạ), để ô hiện lại nguyên văn thay vì dạng `+84 …`. `null` = chế độ quốc tế của thượng nguồn.\n */\n nationalInput: string | null;\n}\n\ninterface Store {\n subscribe: (callback: () => void) => () => void;\n getState: () => StoreState;\n setState: <K extends keyof StoreState>(key: K, value: StoreState[K]) => void;\n notify: () => void;\n}\n\nconst StoreContext = React.createContext<Store | null>(null);\n\nfunction useStoreContext(consumerName: string) {\n const context = React.useContext(StoreContext);\n if (!context) {\n throw new Error(`\\`${consumerName}\\` phải nằm bên trong \\`${ROOT_NAME}\\``);\n }\n return context;\n}\n\nfunction useStore<T>(selector: (state: StoreState) => T, ogStore?: Store | null): T {\n const contextStore = React.useContext(StoreContext);\n\n const store = ogStore ?? contextStore;\n\n if (!store) {\n throw new Error(`\\`usePhoneInput\\` phải được gọi bên trong \\`${ROOT_NAME}\\``);\n }\n\n const getSnapshot = React.useCallback(() => selector(store.getState()), [store, selector]);\n\n return React.useSyncExternalStore(store.subscribe, getSnapshot, getSnapshot);\n}\n\ninterface PhoneInputContextValue {\n rootId: string;\n countries: Country[];\n placeholder: string;\n labels: PhoneInputLabels;\n disabled?: boolean;\n readOnly?: boolean;\n required?: boolean;\n invalid?: boolean;\n showFlag: boolean;\n inputRef: React.RefObject<HTMLInputElement | null>;\n}\n\nconst PhoneInputContext = React.createContext<PhoneInputContextValue | null>(null);\n\nfunction usePhoneInputContext(consumerName: string) {\n const context = React.useContext(PhoneInputContext);\n if (!context) {\n throw new Error(`\\`${consumerName}\\` phải nằm bên trong \\`${ROOT_NAME}\\``);\n }\n return context;\n}\n\n/**\n * Ô nhập số điện thoại quốc tế: nút chọn quốc gia (`PhoneInputCountrySelect`) + ô số\n * (`PhoneInputField`). Giá trị (`value` / `onValueChange` / input ẩn khi submit form) luôn là E.164\n * chỉ gồm chữ số: `\"+84912345678\"`. Người dùng gõ được theo HAI cách:\n *\n * - **Số nội địa** — chuỗi KHÔNG bắt đầu bằng `+`, và đang có quốc gia được chọn (`defaultCountry`\n * / `country`, hoặc người dùng chọn): bỏ một số 0 đầu rồi ghép mã quay số của nước đang chọn. Ô hiện NGUYÊN VĂN chữ đã gõ\n * (chỉ gạt ký tự không phải số hay `space ( ) . -`), con trỏ không nhảy; đổi quốc gia thì giá trị\n * ghép lại theo mã mới, còn chữ trên ô giữ nguyên.\n * Nước là Việt Nam, gõ `0912 345 678` → ô hiện `0912 345 678`, `onValueChange(\"+84912345678\")`.\n * ⚠ Khác thượng nguồn — bản gốc ra `+0912345678`. Ý, San Marino, Vatican giữ số 0 đầu (máy bàn\n * `06 …` → `+39 06 …`).\n * - **Số quốc tế** — chuỗi bắt đầu bằng `+` (như thượng nguồn): ô hiện tách nhóm\n * (`+84 912 345 678`), quốc gia tự nhận theo mã quay số.\n * Gõ `+84 912 345 678` → `onValueChange(\"+84912345678\")`, cờ chuyển sang Việt Nam.\n *\n * Giá trị nạp từ ngoài (`value`/`defaultValue`) luôn hiện ở dạng quốc tế. Không có quốc gia nào\n * được chọn — MẶC ĐỊNH từ `3.0.0` — thì mọi chữ số đầu bị coi là mã quốc gia, như thượng nguồn:\n * gõ `0912 345 678` ra `+0912345678`, gõ `84 912 345 678` ra `+84912345678` và cờ tự nhận Việt Nam.\n *\n * Gốc là `role=\"group\"` chưa có tên: đặt `aria-label` (vd \"Phone number\") hoặc `aria-labelledby`\n * cho chính `PhoneInput`.\n */\ninterface PhoneInputProps extends React.ComponentProps<\"div\"> {\n defaultValue?: string;\n value?: string;\n onValueChange?: (value: string) => void;\n /**\n * Quốc gia ban đầu (mã ISO alpha-2, viết HOA). Mặc định: KHÔNG CÓ, như thượng nguồn — nước là\n * thiết lập VÙNG, không suy từ ngôn ngữ; app Comitor truyền từ cài đặt workspace.\n *\n * ⚠ Không có quốc gia thì chế độ số NỘI ĐỊA tắt (xem JSDoc của `PhoneInput`). Trước `3.0.0`\n * mặc định cứng là `\"VN\"`.\n */\n defaultCountry?: string;\n country?: string;\n onCountryChange?: (country: string) => void;\n countries?: Country[];\n name?: string;\n /** Placeholder ô nhập số — thắng khoá `labels.placeholder` (namespace `phoneInput`). */\n placeholder?: string;\n /**\n * Locale BCP 47 để gọi tên quốc gia (`Intl.DisplayNames`) và sắp xếp danh sách. Không truyền thì\n * theo `locale` của `ComitorLocaleProvider` (không có provider → `\"en\"`; trước `3.0.0` mặc định\n * cứng là `\"vi\"`). Bỏ qua khi app truyền `countries` riêng (tên lấy nguyên từ đó).\n *\n * ⚠ Thêm so với thượng nguồn — bản gốc ghim tên tiếng Anh.\n */\n locale?: string;\n /**\n * Chuỗi hiển thị/đọc màn hình (phần chọn quốc gia + placeholder ô số) — override từng khoá. Không\n * truyền thì theo namespace `phoneInput` của `ComitorLocaleProvider` (mặc định tiếng Anh).\n */\n labels?: Partial<PhoneInputLabels>;\n asChild?: boolean;\n disabled?: boolean;\n readOnly?: boolean;\n required?: boolean;\n invalid?: boolean;\n showFlag?: boolean;\n}\n\nfunction PhoneInput(props: PhoneInputProps) {\n const {\n value: valueProp,\n defaultValue,\n defaultCountry,\n country: countryProp,\n onValueChange,\n onCountryChange,\n countries: countriesProp,\n name,\n placeholder: placeholderProp,\n locale: localeProp,\n labels: labelsProp,\n asChild,\n disabled,\n required,\n readOnly,\n invalid,\n showFlag = true,\n className,\n id,\n ref,\n ...rootProps\n } = props;\n\n const { locale: providerLocale } = useComitorLocale();\n const locale = localeProp ?? providerLocale;\n const labels = useComitorLabels(\"phoneInput\", labelsProp);\n const placeholder = placeholderProp ?? labels.placeholder;\n\n const instanceId = React.useId();\n const rootId = id ?? instanceId;\n\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n // ⚠ Khác thượng nguồn: ghi nhớ danh sách (thượng nguồn dựng lại mỗi lượt render — xem `getCountries`).\n const countries = React.useMemo(() => countriesProp ?? getCountries(locale), [countriesProp, locale]);\n\n const [formTrigger, setFormTrigger] = React.useState<RootElement | null>(null);\n const composedRef = useComposedRefs(ref, (node) => setFormTrigger(node));\n const isFormControl = formTrigger ? !!formTrigger.closest(\"form\") : true;\n\n const listenersRef = useLazyRef(() => new Set<() => void>());\n const stateRef = useLazyRef<StoreState>(() => {\n const initialValue = valueProp ?? defaultValue ?? \"\";\n const initialCountry = countryProp ?? defaultCountry ?? \"\";\n\n return {\n value: initialValue,\n country: initialCountry,\n open: false,\n startsWithPlus: initialValue.startsWith(\"+\"),\n nationalInput: null\n };\n });\n\n const propsRef = useAsRef({\n onValueChange,\n onCountryChange,\n countries\n });\n\n const store = React.useMemo<Store>(() => {\n return {\n subscribe: (cb) => {\n listenersRef.current.add(cb);\n return () => listenersRef.current.delete(cb);\n },\n getState: () => stateRef.current,\n setState: (key, value) => {\n if (Object.is(stateRef.current[key], value)) return;\n\n if (key === \"value\" && typeof value === \"string\") {\n stateRef.current.value = value;\n propsRef.current.onValueChange?.(value);\n } else if (key === \"country\" && typeof value === \"string\") {\n // Đọc TRƯỚC khi đổi nước: chuỗi nội địa chỉ còn hiệu lực nếu khớp giá trị theo nước CŨ.\n const nationalInput = getNationalInput(stateRef.current, propsRef.current.countries);\n stateRef.current.country = value;\n propsRef.current.onCountryChange?.(value);\n\n /*\n * ⚠ Khác thượng nguồn: đang gõ số nội địa mà đổi quốc gia → chữ trên ô giờ là số nội địa\n * của nước MỚI, giá trị ghép lại mã quay số mới (ô giữ nguyên chữ). Nước mới không có\n * trong danh sách (bỏ chọn) → thôi chế độ nội địa, giữ nguyên giá trị E.164 đang có.\n */\n if (nationalInput !== null) {\n const selected = propsRef.current.countries.find((c) => c.code === value);\n if (selected) {\n const nextValue = nationalToE164(nationalInput, selected);\n if (nextValue !== stateRef.current.value) {\n stateRef.current.value = nextValue;\n propsRef.current.onValueChange?.(nextValue);\n }\n } else {\n stateRef.current.nationalInput = null;\n }\n }\n } else {\n stateRef.current[key] = value;\n }\n\n store.notify();\n },\n notify: () => {\n for (const cb of listenersRef.current) {\n cb();\n }\n }\n };\n }, [listenersRef, stateRef, propsRef]);\n\n const value = useStore((state) => state.value, store);\n const country = useStore((state) => state.country, store);\n\n useIsomorphicLayoutEffect(() => {\n if (valueProp !== undefined) {\n store.setState(\"value\", valueProp);\n }\n }, [valueProp]);\n\n useIsomorphicLayoutEffect(() => {\n if (countryProp !== undefined) {\n store.setState(\"country\", countryProp);\n }\n }, [countryProp]);\n\n const startsWithPlus = useStore((state) => state.startsWithPlus, store);\n const nationalInput = useStore((state) => getNationalInput(state, countries), store);\n\n React.useEffect(() => {\n /*\n * ⚠ Khác thượng nguồn: đang gõ số nội địa thì quốc gia ĐANG CHỌN là nguồn sự thật — dò lại theo\n * mã quay số lúc này chỉ có thể sai: Hoa Kỳ + `340 555 1234` → `+13405551234` → dò ra Quần đảo\n * Virgin (+1340), rồi giá trị bị ghép lại theo mã mới thành số rác.\n */\n if (!value || nationalInput !== null) return;\n\n const digits = value.slice(1).replace(/\\D/g, \"\");\n const shouldDetect = startsWithPlus || digits.length >= 10;\n\n if (!shouldDetect) return;\n\n const detected = detectCountryFromNumber(value, countries, country);\n if (detected && detected.code !== country) {\n store.setState(\"country\", detected.code);\n }\n }, [value, countries, country, store, startsWithPlus, nationalInput]);\n\n const contextValue = React.useMemo<PhoneInputContextValue>(\n () => ({\n rootId,\n countries,\n placeholder,\n labels,\n disabled,\n readOnly,\n required,\n invalid,\n showFlag,\n inputRef\n }),\n [rootId, countries, placeholder, labels, disabled, required, readOnly, invalid, showFlag]\n );\n\n const RootPrimitive = asChild ? Slot : \"div\";\n\n return (\n <StoreContext.Provider value={store}>\n <PhoneInputContext.Provider value={contextValue}>\n <RootPrimitive\n role=\"group\"\n data-slot=\"phone-input\"\n data-disabled={disabled ? \"\" : undefined}\n data-invalid={invalid ? \"\" : undefined}\n data-readonly={readOnly ? \"\" : undefined}\n id={rootId}\n {...rootProps}\n ref={composedRef}\n className={cn(\n /*\n * ⚠ Khác thượng nguồn: khung mượn đúng vai trò màu của `Input` Comitor để đứng cạnh ô\n * nhập thường trong một form không lệch (cao `h-9` thay vì `h-10`, nền `bg-background`\n * thay vì `dark:bg-input/30` — viết thẳng thang màu thì bảng tương phản cao không đổi\n * được). Số đo từng vai trò: chú thích đầu `input.tsx`.\n *\n * Focus: thượng nguồn soi `[data-slot=input-group-control]` — slot KHÔNG tồn tại trong\n * component này, nên khung không bao giờ sáng. Ở đây soi đúng slot của ô số.\n *\n * Lỗi: HAI đường như `InputGroup` — `aria-invalid` trên ô số (prop `invalid`), hoặc\n * trên CHÍNH gốc khi `<FormControl>` của `@comitor/ui/form` dán nó vào con trực tiếp.\n * Viền lỗi là `--destructive-ink` (không phải `--destructive` — token TÔ NỀN).\n *\n * Vô hiệu: thượng nguồn làm mờ CẢ gốc (`data-disabled:opacity-50`) trong khi nút và ô\n * số bên trong cũng tự mờ theo `:disabled` → nội dung còn 25%. Ở đây gốc KHÔNG mờ (như\n * `InputGroup`); hai con tự mờ bằng `:disabled` gốc của HTML, gốc chỉ đổi nền theo ô số.\n * `data-disabled` còn không được cổng tương phản coi là trạng thái vô hiệu — nó không\n * chứng minh phần tử đã inert — còn `:disabled` thì có.\n */\n \"relative flex h-9 w-full items-center rounded-md border border-input bg-background transition-colors duration-150 ease-out hover:border-control-edge-strong\",\n \"has-[[data-slot=phone-input-field]:focus-visible]:border-primary-ink has-[[data-slot=phone-input-field]:focus-visible]:ring-2 has-[[data-slot=phone-input-field]:focus-visible]:ring-ring/50\",\n \"has-[[data-slot][aria-invalid=true]]:border-destructive-ink has-[[data-slot][aria-invalid=true]]:ring-destructive/30\",\n \"aria-invalid:border-destructive-ink aria-invalid:hover:border-destructive-ink aria-invalid:ring-destructive/30\",\n \"data-disabled:cursor-not-allowed has-[[data-slot=phone-input-field]:disabled]:bg-muted\",\n className\n )}\n />\n {isFormControl && (\n <VisuallyHiddenInput\n type=\"hidden\"\n control={formTrigger}\n name={name}\n value={value}\n disabled={disabled}\n readOnly={readOnly}\n required={required}\n />\n )}\n </PhoneInputContext.Provider>\n </StoreContext.Provider>\n );\n}\n\ninterface PhoneInputCountrySelectProps\n extends React.ComponentProps<typeof Popover>,\n Pick<React.ComponentProps<typeof PopoverTrigger>, \"disabled\" | \"className\"> {}\n\nfunction PhoneInputCountrySelect(props: PhoneInputCountrySelectProps) {\n const { disabled: disabledProp, className, children, onOpenChange: onOpenChangeProp, ...popoverProps } = props;\n\n const { countries, inputRef, disabled, readOnly, showFlag, labels } = usePhoneInputContext(COUNTRY_SELECT_NAME);\n const store = useStoreContext(COUNTRY_SELECT_NAME);\n const country = useStore((state) => state.country);\n const open = useStore((state) => state.open);\n const onOpenChangeRef = useAsRef(onOpenChangeProp);\n\n const isDisabled = disabledProp || disabled;\n\n const countryContext = countries.find((c) => c.code === country);\n\n /*\n * ⚠ Khác thượng nguồn (3.0.1): `readOnly` khoá cả nút chọn nước. Trước đó chỉ ô số bị khoá, nút cờ\n * vẫn mở danh sách và đổi được nước — tức đổi được mã vùng, tức đổi được GIÁ TRỊ của một ô chỉ\n * đọc. Nút vẫn nhận focus (như ô `readOnly` bên cạnh) và vẫn đọc tên nước hiện tại, nhưng không\n * mở; `aria-disabled` nói với trình đọc màn hình rằng nó không thao tác được.\n */\n const onOpenChange = React.useCallback(\n (open: boolean) => {\n if (open && readOnly) return;\n store.setState(\"open\", open);\n onOpenChangeRef.current?.(open);\n },\n [store, onOpenChangeRef, readOnly]\n );\n\n return (\n <Popover open={open} onOpenChange={onOpenChange} {...popoverProps}>\n <PopoverTrigger\n data-slot=\"phone-input-country-select\"\n // ⚠ Khác thượng nguồn: bản gốc là một nút KHÔNG TÊN (chỉ có lá cờ emoji + mũi tên, hoặc\n // ô xám trống khi chưa chọn). Tên nói luôn giá trị hiện tại — xem `PhoneInputLabels`.\n aria-label={labels.countrySelect(countryContext)}\n aria-disabled={readOnly && !isDisabled ? true : undefined}\n data-readonly={readOnly ? \"\" : undefined}\n disabled={isDisabled}\n className={cn(\n /*\n * Hover `bg-muted` như nút `ghost` của gói. Viền focus cùng khuôn `Button`\n * (`outline-ring`), nhưng THỤT VÀO trong (`-outline-offset-2`) vì nút nằm lọt trong khung\n * của ô — viền đẩy ra ngoài sẽ đè lên khung và lên ô số bên cạnh.\n */\n \"flex h-full shrink-0 items-center gap-2 rounded-l-md border-r border-input bg-transparent px-3 text-sm transition-colors duration-150 ease-out hover:bg-muted focus-visible:outline-2 focus-visible:outline-ring focus-visible:-outline-offset-2 disabled:pointer-events-none disabled:opacity-50\",\n className\n )}\n >\n {/* `span` thay cho `div` của thượng nguồn: `<button>` chỉ nhận nội dung phrasing. */}\n {!countryContext ? (\n /*\n * ⚠ Khác thượng nguồn: bản gốc vẽ một ô `bg-muted/50` trống — 1,00:1 trên nền hover\n * `--muted`, tức biến mất đúng lúc người dùng rê chuột vào (cổng tương phản chặn). Quả\n * địa cầu nói được \"chưa chọn quốc gia\"; giữ bề rộng `w-6` của lá cờ để chọn xong không\n * xô lệch.\n */\n <span aria-hidden=\"true\" className=\"flex w-6 justify-center\">\n <Globe className=\"size-4 text-muted-foreground\" />\n </span>\n ) : (\n showFlag &&\n countryContext.flag && (\n <span aria-hidden=\"true\" className=\"w-6 text-lg leading-none\">\n {countryContext.flag}\n </span>\n )\n )}\n {/* Mũi tên chỉ trạng thái → ngưỡng 3:1; `text-muted-foreground` như chevron của `SelectTrigger`. */}\n <ChevronDown aria-hidden=\"true\" className=\"size-4 text-muted-foreground\" />\n </PopoverTrigger>\n <PopoverContent className=\"w-[300px] p-0\" align=\"start\">\n <Command filter={filterCountries}>\n <CommandInput placeholder={labels.searchPlaceholder} />\n <CommandList>\n <CommandEmpty>{labels.empty}</CommandEmpty>\n <CommandGroup>\n {countries.map((c) => (\n <CommandItem\n key={c.code}\n value={`${c.name} ${c.dialCode} ${c.code}`}\n onSelect={() => {\n store.setState(\"country\", c.code);\n store.setState(\"open\", false);\n requestAnimationFrame(() => {\n inputRef.current?.focus();\n });\n }}\n >\n {/* Cờ là trang trí — tên nước ngay bên cạnh đã nói đủ; không ẩn thì bị đọc hai lần. */}\n {showFlag && c.flag && (\n <span aria-hidden=\"true\" className=\"text-lg\">\n {c.flag}\n </span>\n )}\n <span className=\"flex-1\">{c.name}</span>\n <span className=\"text-muted-foreground\">{c.dialCode}</span>\n <Check\n aria-hidden=\"true\"\n className={cn(\"size-4\", country === c.code ? \"opacity-100\" : \"opacity-0\")}\n />\n </CommandItem>\n ))}\n </CommandGroup>\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n );\n}\n\ntype PhoneInputFieldProps = React.ComponentProps<\"input\">;\n\nfunction PhoneInputField(props: PhoneInputFieldProps) {\n const {\n onChange: onChangeProp,\n className,\n disabled: disabledProp,\n readOnly: readOnlyProp,\n required: requiredProp,\n placeholder: placeholderProp,\n ref,\n ...inputProps\n } = props;\n\n const { inputRef, disabled, invalid, readOnly, required, placeholder, countries } = usePhoneInputContext(FIELD_NAME);\n const store = useStoreContext(FIELD_NAME);\n const value = useStore((state) => state.value);\n const nationalInput = useStore((state) => getNationalInput(state, countries));\n\n const composedRef = useComposedRefs(ref, inputRef);\n\n const onChangeRef = useAsRef(onChangeProp);\n\n const isDisabled = disabledProp || disabled;\n const isReadOnly = readOnlyProp || readOnly;\n const isRequired = requiredProp || required;\n\n const onChange = React.useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n if (isDisabled || isReadOnly) return;\n\n onChangeRef.current?.(event);\n if (event.defaultPrevented) return;\n\n const inputValue = event.target.value;\n\n // ⚠ Khác thượng nguồn: bỏ khoảng trắng đầu trước khi xét dấu `+` — chuỗi dán vào hay kèm nó.\n const startsWithPlus = inputValue.trimStart().startsWith(\"+\");\n\n // ⚠ Khác thượng nguồn — số NỘI ĐỊA (luật và lý do: chú thích trên `nationalToE164`).\n const selectedCountry = startsWithPlus ? undefined : countries.find((c) => c.code === store.getState().country);\n\n if (selectedCountry) {\n const nextNationalInput = inputValue.replace(NATIONAL_INPUT_DISALLOWED, \"\");\n\n if (nextNationalInput !== inputValue) {\n // Gạt ký tự lạ NGAY trên DOM và đặt lại con trỏ tại chỗ: nhờ vậy lúc render React thấy\n // DOM đã đúng giá trị, không ghi đè — ghi đè là con trỏ nhảy về cuối ô.\n const target = event.target;\n const caret = target.selectionStart ?? inputValue.length;\n const nextCaret = inputValue.slice(0, caret).replace(NATIONAL_INPUT_DISALLOWED, \"\").length;\n target.value = nextNationalInput;\n target.setSelectionRange(nextCaret, nextCaret);\n }\n\n store.setState(\"startsWithPlus\", false);\n store.setState(\"nationalInput\", nextNationalInput);\n store.setState(\"value\", nationalToE164(nextNationalInput, selectedCountry));\n return;\n }\n\n const digits = inputValue.replace(/\\D/g, \"\");\n const newValue = digits ? `+${digits}` : startsWithPlus ? \"+\" : \"\";\n store.setState(\"startsWithPlus\", startsWithPlus);\n store.setState(\"nationalInput\", null);\n store.setState(\"value\", newValue);\n },\n [store, countries, onChangeRef, isDisabled, isReadOnly]\n );\n\n // Số nội địa hiện NGUYÊN VĂN chữ đã gõ (con trỏ không nhảy); số quốc tế tách nhóm như thượng nguồn.\n const displayValue = React.useMemo(() => {\n return nationalInput ?? formatPhoneNumber(value, countries);\n }, [nationalInput, value, countries]);\n\n return (\n <Input\n type=\"tel\"\n inputMode=\"tel\"\n aria-required={isRequired}\n aria-invalid={invalid}\n data-slot=\"phone-input-field\"\n disabled={isDisabled}\n readOnly={isReadOnly}\n required={isRequired}\n {...inputProps}\n ref={composedRef}\n className={cn(\n // Viền, quầng focus và nền (kể cả nền `--muted` lúc vô hiệu) đều do khung gốc vẽ; ô số\n // trong suốt và phẳng. `focus:ring-0` chứ không `focus-visible:` — `Input` vẽ quầng bằng `focus:`.\n \"h-full flex-1 rounded-l-none rounded-r-md border-0 bg-transparent focus:ring-0 disabled:bg-transparent\",\n className\n )}\n // ⚠ Khác thượng nguồn: bản gốc đặt placeholder của gốc SAU `{...inputProps}`, nên\n // `<PhoneInputField placeholder=\"…\" />` (chính demo của thượng nguồn) bị lờ đi.\n placeholder={placeholderProp ?? placeholder}\n value={displayValue}\n onChange={onChange}\n />\n );\n}\n\nexport {\n PhoneInput,\n PhoneInputCountrySelect,\n type PhoneInputCountrySelectProps,\n PhoneInputField,\n type PhoneInputFieldProps,\n type PhoneInputProps,\n useStore as usePhoneInput\n};\n"],"mappings":";AAgwBM,SACE,KADF;AAzvBN,SAAS,YAAY;AACrB,SAAS,qBAAqB;AAC9B,SAAS,OAAO,aAAa,aAAa;AAC1C,YAAY,WAAW;AACvB,SAAS,kBAAkB,wBAAwB;AACnD,SAAS,UAAU;AACnB,SAAS,uBAAuB;AAChC,SAAS,gBAAgB;AACzB,SAAS,iCAAiC;AAC1C,SAAS,kBAAkB;AAC3B,SAAS,2BAA2B;AACpC,SAAS,SAAS,cAAc,cAAc,cAAc,aAAa,mBAAmB;AAC5F,SAAS,aAAa;AAEtB,SAAS,SAAS,gBAAgB,sBAAsB;AAExD,MAAM,YAAY;AAClB,MAAM,sBAAsB;AAC5B,MAAM,aAAa;AAgBnB,MAAM,eAAmC;AAAA,EACvC,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,MAAM;AAAA,EACb,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,MAAM;AAAA,EACb,CAAC,MAAM,MAAM;AAAA,EACb,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,MAAM;AAAA,EACb,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,MAAM;AAAA,EACb,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,MAAM;AAAA,EACb,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,MAAM;AAAA,EACb,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,GAAG;AAAA,EACV,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,MAAM;AAAA,EACb,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,MAAM;AAAA,EACb,CAAC,MAAM,GAAG;AAAA,EACV,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,MAAM;AAAA,EACb,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,MAAM;AAAA,EACb,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,MAAM;AAAA,EACb,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,GAAG;AAAA,EACV,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,MAAM;AAAA,EACb,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,MAAM;AAAA,EACb,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,GAAG;AAAA,EACV,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,GAAG;AAAA,EACV,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,MAAM;AAAA,EACb,CAAC,MAAM,MAAM;AAAA,EACb,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,MAAM;AAAA,EACb,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,MAAM;AAAA,EACb,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,MAAM;AAAA,EACb,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,MAAM;AAAA,EACb,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,MAAM;AAAA,EACb,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,M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","names":["value","nationalInput","open"]}
@@ -78,10 +78,10 @@ import * as React from 'react';
78
78
  * một dòng `text-warning-ink` cạnh thanh.
79
79
  */
80
80
  declare const progressTrackVariants: (props?: ({
81
- tone?: "default" | "success" | "warning" | "destructive" | null | undefined;
81
+ tone?: "default" | "destructive" | "warning" | "success" | null | undefined;
82
82
  } & class_variance_authority_types.ClassProp) | undefined) => string;
83
83
  declare const progressBarVariants: (props?: ({
84
- tone?: "default" | "success" | "warning" | "destructive" | null | undefined;
84
+ tone?: "default" | "destructive" | "warning" | "success" | null | undefined;
85
85
  } & class_variance_authority_types.ClassProp) | undefined) => string;
86
86
  /** Tông của thanh — xem chú thích ở trên về việc vì sao `warning` phải kèm vạch chéo. */
87
87
  type ProgressTone = NonNullable<VariantProps<typeof progressBarVariants>["tone"]>;
@@ -35,7 +35,8 @@ interface RatingProps extends React.ComponentProps<"div"> {
35
35
  required?: boolean;
36
36
  name?: string;
37
37
  /**
38
- * Tên của TỪNG ngôi sao cho trình đọc màn hình — mặc định `(value) => value + " sao"`.
38
+ * Tên của TỪNG ngôi sao cho trình đọc màn hình — mặc định khoá `itemLabel` của namespace
39
+ * `rating` (`ComitorLocaleProvider`).
39
40
  *
40
41
  * ⚠ Thêm so với thượng nguồn. Ở bản gốc mỗi `RatingItem` là một `role="radio"` chỉ chứa một
41
42
  * `<svg>`, tức một nút KHÔNG TÊN: trình đọc màn hình đọc "nút radio, 3 trên 5" mà không nói 3
@@ -4,6 +4,7 @@ import { useDirection } from "@radix-ui/react-direction";
4
4
  import { Slot } from "@radix-ui/react-slot";
5
5
  import { Star } from "lucide-react";
6
6
  import * as React from "react";
7
+ import { useComitorMessages } from "../../i18n/locale-provider.js";
7
8
  import { cn } from "../../lib/cn.js";
8
9
  import { useComposedRefs } from "../../lib/compose-refs.js";
9
10
  import { useAsRef } from "../../lib/use-as-ref.js";
@@ -81,7 +82,6 @@ function useFocusContext(consumerName) {
81
82
  }
82
83
  return context;
83
84
  }
84
- const defaultItemLabel = (value) => `${value} sao`;
85
85
  function Rating(props) {
86
86
  const {
87
87
  value: valueProp,
@@ -101,7 +101,7 @@ function Rating(props) {
101
101
  disabled = false,
102
102
  readOnly = false,
103
103
  required = false,
104
- itemLabel = defaultItemLabel,
104
+ itemLabel: itemLabelProp,
105
105
  className,
106
106
  children,
107
107
  id,
@@ -109,6 +109,8 @@ function Rating(props) {
109
109
  ref,
110
110
  ...rootProps
111
111
  } = props;
112
+ const t = useComitorMessages("rating");
113
+ const itemLabel = itemLabelProp ?? t.itemLabel;
112
114
  const dir = useDirection(dirProp);
113
115
  const instanceId = React.useId();
114
116
  const rootId = id ?? instanceId;
@@ -452,7 +454,9 @@ function RatingItem(props) {
452
454
  if (event.defaultPrevented) return;
453
455
  focusContext.onItemFocus(itemId);
454
456
  const isKeyboardFocus = !isMouseClickRef.current;
455
- if (!isDisabled && !isReadOnly && activationMode !== "manual" && isKeyboardFocus) {
457
+ const previous = event.relatedTarget;
458
+ const cameFromSibling = previous instanceof HTMLElement && previous !== event.currentTarget && previous.getAttribute("data-slot") === "rating-item" && previous.closest('[data-slot="rating"]') === event.currentTarget.closest('[data-slot="rating"]');
459
+ if (!isDisabled && !isReadOnly && activationMode !== "manual" && isKeyboardFocus && cameFromSibling) {
456
460
  const isHalfStepValue = step < 1 && value === itemValue - step;
457
461
  if (!isHalfStepValue) {
458
462
  const newValue = clearable && value === itemValue ? 0 : itemValue;
@@ -601,7 +605,7 @@ function RatingItem(props) {
601
605
  role: "radio",
602
606
  type: "button",
603
607
  id: itemId,
604
- "aria-label": context.itemLabel(itemValue, context.max),
608
+ "aria-label": context.itemLabel(isChecked && value !== itemValue ? value : itemValue, context.max),
605
609
  "aria-checked": isChecked,
606
610
  "aria-posinset": itemValue,
607
611
  "aria-setsize": context.max,