@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
@@ -4,10 +4,14 @@ import 'class-variance-authority/types';
4
4
  import 'class-variance-authority';
5
5
 
6
6
  /**
7
- * Pagination — primitive tĩnh (không "use client", dùng được trong RSC).
8
- * Đây là bộ khung thẻ `<a>`; bản "biết đếm trang" là composite `TablePagination`.
7
+ * Pagination — bộ khung thẻ `<a>`; bản "biết đếm trang" là composite `TablePagination`.
9
8
  *
10
- * Chuỗi hiển thị mặc định tiếng Việt, override qua prop `label` / `srLabel`.
9
+ * Chuỗi hiển thị theo `ComitorLocaleProvider` (namespace `pagination`, mặc định tiếng Anh);
10
+ * override từng chỗ qua prop `label` / `srLabel` / `aria-label`.
11
+ *
12
+ * `"use client"` từ `3.0.0`: chữ và tên cho trình đọc màn hình đọc từ provider, mà context chỉ
13
+ * đọc được ở client. Trước đó file này tĩnh và ghim cứng tiếng Việt. Không prop nào là
14
+ * hàm/component nên Server Component vẫn render được nó.
11
15
  * Muốn dùng `next/link`: `<PaginationLink asChild>` chưa có ở primitive này —
12
16
  * truyền `href` trực tiếp hoặc bọc bằng composite ở tầng app.
13
17
  */
@@ -18,23 +22,23 @@ type PaginationLinkProps = {
18
22
  isActive?: boolean;
19
23
  } & Pick<ButtonProps, "size"> & React.ComponentProps<"a">;
20
24
  type PaginationPreviousProps = PaginationLinkProps & {
21
- /** Nhãn hiển thị (ẩn ở màn hình nhỏ). Mặc định "Trước". */
25
+ /** Nhãn hiển thị (ẩn ở màn hình nhỏ). Mặc định: khoá `previousLabel` của namespace `pagination`. */
22
26
  label?: React.ReactNode;
23
27
  };
24
28
  type PaginationNextProps = PaginationLinkProps & {
25
- /** Nhãn hiển thị (ẩn ở màn hình nhỏ). Mặc định "Sau". */
29
+ /** Nhãn hiển thị (ẩn ở màn hình nhỏ). Mặc định: khoá `nextLabel` của namespace `pagination`. */
26
30
  label?: React.ReactNode;
27
31
  };
28
32
  type PaginationEllipsisProps = React.ComponentProps<"span"> & {
29
- /** Nhãn chỉ dành cho trình đọc màn hình. */
33
+ /** Nhãn chỉ dành cho trình đọc màn hình. Mặc định: khoá `ellipsisLabel` của namespace `pagination`. */
30
34
  srLabel?: string;
31
35
  };
32
36
  declare function Pagination({ className, ...props }: PaginationProps): React.JSX.Element;
33
37
  declare function PaginationContent({ className, ...props }: PaginationContentProps): React.JSX.Element;
34
38
  declare function PaginationItem({ ...props }: PaginationItemProps): React.JSX.Element;
35
39
  declare function PaginationLink({ className, isActive, size, ...props }: PaginationLinkProps): React.JSX.Element;
36
- declare function PaginationPrevious({ className, label, ...props }: PaginationPreviousProps): React.JSX.Element;
37
- declare function PaginationNext({ className, label, ...props }: PaginationNextProps): React.JSX.Element;
38
- declare function PaginationEllipsis({ className, srLabel, ...props }: PaginationEllipsisProps): React.JSX.Element;
40
+ declare function PaginationPrevious({ className, label: labelProp, ...props }: PaginationPreviousProps): React.JSX.Element;
41
+ declare function PaginationNext({ className, label: labelProp, ...props }: PaginationNextProps): React.JSX.Element;
42
+ declare function PaginationEllipsis({ className, srLabel: srLabelProp, ...props }: PaginationEllipsisProps): React.JSX.Element;
39
43
 
40
44
  export { Pagination, PaginationContent, type PaginationContentProps, PaginationEllipsis, type PaginationEllipsisProps, PaginationItem, type PaginationItemProps, PaginationLink, type PaginationLinkProps, PaginationNext, type PaginationNextProps, PaginationPrevious, type PaginationPreviousProps, type PaginationProps };
@@ -1,14 +1,17 @@
1
+ "use client";
1
2
  import { jsx, jsxs } from "react/jsx-runtime";
2
3
  import { ChevronLeftIcon, ChevronRightIcon, MoreHorizontalIcon } from "lucide-react";
4
+ import { useComitorMessages } from "../../i18n/locale-provider.js";
3
5
  import { cn } from "../../lib/cn.js";
4
6
  import { buttonVariants } from "./button.js";
5
7
  function Pagination({ className, ...props }) {
8
+ const t = useComitorMessages("pagination");
6
9
  return (
7
10
  // Thẻ <nav> đã ngầm mang role="navigation" — bản comitor-ds khai lại là thừa, bỏ đi.
8
11
  /* @__PURE__ */ jsx(
9
12
  "nav",
10
13
  {
11
- "aria-label": "Ph\xE2n trang",
14
+ "aria-label": t.navLabel,
12
15
  "data-slot": "pagination",
13
16
  className: cn("mx-auto flex w-full justify-center", className),
14
17
  ...props
@@ -38,11 +41,13 @@ function PaginationLink({ className, isActive, size = "icon", ...props }) {
38
41
  }
39
42
  );
40
43
  }
41
- function PaginationPrevious({ className, label = "Tr\u01B0\u1EDBc", ...props }) {
44
+ function PaginationPrevious({ className, label: labelProp, ...props }) {
45
+ const t = useComitorMessages("pagination");
46
+ const label = labelProp === void 0 ? t.previousLabel : labelProp;
42
47
  return /* @__PURE__ */ jsxs(
43
48
  PaginationLink,
44
49
  {
45
- "aria-label": "V\u1EC1 trang tr\u01B0\u1EDBc",
50
+ "aria-label": t.previousAriaLabel,
46
51
  size: "default",
47
52
  className: cn("gap-1 px-2.5 sm:pl-2.5", className),
48
53
  ...props,
@@ -53,11 +58,13 @@ function PaginationPrevious({ className, label = "Tr\u01B0\u1EDBc", ...props })
53
58
  }
54
59
  );
55
60
  }
56
- function PaginationNext({ className, label = "Sau", ...props }) {
61
+ function PaginationNext({ className, label: labelProp, ...props }) {
62
+ const t = useComitorMessages("pagination");
63
+ const label = labelProp === void 0 ? t.nextLabel : labelProp;
57
64
  return /* @__PURE__ */ jsxs(
58
65
  PaginationLink,
59
66
  {
60
- "aria-label": "T\u1EDBi trang sau",
67
+ "aria-label": t.nextAriaLabel,
61
68
  size: "default",
62
69
  className: cn("gap-1 px-2.5 sm:pr-2.5", className),
63
70
  ...props,
@@ -68,7 +75,9 @@ function PaginationNext({ className, label = "Sau", ...props }) {
68
75
  }
69
76
  );
70
77
  }
71
- function PaginationEllipsis({ className, srLabel = "Th\xEAm trang", ...props }) {
78
+ function PaginationEllipsis({ className, srLabel: srLabelProp, ...props }) {
79
+ const t = useComitorMessages("pagination");
80
+ const srLabel = srLabelProp ?? t.ellipsisLabel;
72
81
  return /* @__PURE__ */ jsxs(
73
82
  "span",
74
83
  {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/ui/pagination.tsx"],"sourcesContent":["import { ChevronLeftIcon, ChevronRightIcon, MoreHorizontalIcon } from \"lucide-react\";\nimport type * as React from \"react\";\nimport { cn } from \"../../lib/cn.js\";\nimport { type ButtonProps, buttonVariants } from \"./button.js\";\n\n/**\n * Pagination — primitive tĩnh (không \"use client\", dùng được trong RSC).\n * Đây là bộ khung thẻ `<a>`; bản \"biết đếm trang\" là composite `TablePagination`.\n *\n * Chuỗi hiển thị mặc định tiếng Việt, override qua prop `label` / `srLabel`.\n * Muốn dùng `next/link`: `<PaginationLink asChild>` chưa có ở primitive này —\n * truyền `href` trực tiếp hoặc bọc bằng composite ở tầng app.\n */\n\nexport type PaginationProps = React.ComponentProps<\"nav\">;\nexport type PaginationContentProps = React.ComponentProps<\"ul\">;\nexport type PaginationItemProps = React.ComponentProps<\"li\">;\nexport type PaginationLinkProps = {\n isActive?: boolean;\n} & Pick<ButtonProps, \"size\"> &\n React.ComponentProps<\"a\">;\nexport type PaginationPreviousProps = PaginationLinkProps & {\n /** Nhãn hiển thị (ẩn ở màn hình nhỏ). Mặc định \"Trước\". */\n label?: React.ReactNode;\n};\nexport type PaginationNextProps = PaginationLinkProps & {\n /** Nhãn hiển thị (ẩn ở màn hình nhỏ). Mặc định \"Sau\". */\n label?: React.ReactNode;\n};\nexport type PaginationEllipsisProps = React.ComponentProps<\"span\"> & {\n /** Nhãn chỉ dành cho trình đọc màn hình. */\n srLabel?: string;\n};\n\nfunction Pagination({ className, ...props }: PaginationProps) {\n return (\n // Thẻ <nav> đã ngầm mang role=\"navigation\" — bản comitor-ds khai lại là thừa, bỏ đi.\n <nav\n aria-label=\"Phân trang\"\n data-slot=\"pagination\"\n className={cn(\"mx-auto flex w-full justify-center\", className)}\n {...props}\n />\n );\n}\n\nfunction PaginationContent({ className, ...props }: PaginationContentProps) {\n return <ul data-slot=\"pagination-content\" className={cn(\"flex flex-row items-center gap-1\", className)} {...props} />;\n}\n\nfunction PaginationItem({ ...props }: PaginationItemProps) {\n return <li data-slot=\"pagination-item\" {...props} />;\n}\n\n/*\n * Trang ĐANG XEM: viền là `border-primary-ink`, không phải `border-gold-300`. Nền `bg-gold-50`\n * chỉ 1,09:1 so với nền trang, nên VIỀN mới là thứ mang tín hiệu \"đang ở trang này\" — ngưỡng\n * 3:1. gold-300 #E8B824 trên nền trắng chỉ **1,86:1** ✗ (dark 10,19:1 nên chỉ light hỏng).\n * `--primary-ink`: 6,51:1 với nền trang · 5,96:1 với chính nền `gold-50` (light); 12,67:1 ·\n * 11,91:1 (dark) ✓. `aria-current=\"page\"` vẫn giữ nguyên cho phần trợ năng phi thị giác.\n */\nfunction PaginationLink({ className, isActive, size = \"icon\", ...props }: PaginationLinkProps) {\n return (\n <a\n aria-current={isActive ? \"page\" : undefined}\n data-slot=\"pagination-link\"\n data-active={isActive}\n className={cn(\n buttonVariants({ variant: \"ghost\", size }),\n isActive &&\n \"border-primary-ink bg-gold-50 font-semibold text-foreground hover:bg-gold-50 dark:bg-gold-500/10 dark:hover:bg-gold-500/10\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction PaginationPrevious({ className, label = \"Trước\", ...props }: PaginationPreviousProps) {\n return (\n <PaginationLink\n aria-label=\"Về trang trước\"\n size=\"default\"\n className={cn(\"gap-1 px-2.5 sm:pl-2.5\", className)}\n {...props}\n >\n <ChevronLeftIcon />\n <span className=\"hidden sm:block\">{label}</span>\n </PaginationLink>\n );\n}\n\nfunction PaginationNext({ className, label = \"Sau\", ...props }: PaginationNextProps) {\n return (\n <PaginationLink\n aria-label=\"Tới trang sau\"\n size=\"default\"\n className={cn(\"gap-1 px-2.5 sm:pr-2.5\", className)}\n {...props}\n >\n <span className=\"hidden sm:block\">{label}</span>\n <ChevronRightIcon />\n </PaginationLink>\n );\n}\n\nfunction PaginationEllipsis({ className, srLabel = \"Thêm trang\", ...props }: PaginationEllipsisProps) {\n return (\n <span\n aria-hidden\n data-slot=\"pagination-ellipsis\"\n className={cn(\"flex size-9 items-center justify-center\", className)}\n {...props}\n >\n <MoreHorizontalIcon className=\"size-4\" />\n <span className=\"sr-only\">{srLabel}</span>\n </span>\n );\n}\n\nexport {\n Pagination,\n PaginationContent,\n PaginationEllipsis,\n PaginationItem,\n PaginationLink,\n PaginationNext,\n PaginationPrevious\n};\n"],"mappings":"AAqCI,cA2CA,YA3CA;AArCJ,SAAS,iBAAiB,kBAAkB,0BAA0B;AAEtE,SAAS,UAAU;AACnB,SAA2B,sBAAsB;AA+BjD,SAAS,WAAW,EAAE,WAAW,GAAG,MAAM,GAAoB;AAC5D;AAAA;AAAA,IAEE;AAAA,MAAC;AAAA;AAAA,QACC,cAAW;AAAA,QACX,aAAU;AAAA,QACV,WAAW,GAAG,sCAAsC,SAAS;AAAA,QAC5D,GAAG;AAAA;AAAA,IACN;AAAA;AAEJ;AAEA,SAAS,kBAAkB,EAAE,WAAW,GAAG,MAAM,GAA2B;AAC1E,SAAO,oBAAC,QAAG,aAAU,sBAAqB,WAAW,GAAG,oCAAoC,SAAS,GAAI,GAAG,OAAO;AACrH;AAEA,SAAS,eAAe,EAAE,GAAG,MAAM,GAAwB;AACzD,SAAO,oBAAC,QAAG,aAAU,mBAAmB,GAAG,OAAO;AACpD;AASA,SAAS,eAAe,EAAE,WAAW,UAAU,OAAO,QAAQ,GAAG,MAAM,GAAwB;AAC7F,SACE;AAAA,IAAC;AAAA;AAAA,MACC,gBAAc,WAAW,SAAS;AAAA,MAClC,aAAU;AAAA,MACV,eAAa;AAAA,MACb,WAAW;AAAA,QACT,eAAe,EAAE,SAAS,SAAS,KAAK,CAAC;AAAA,QACzC,YACE;AAAA,QACF;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,mBAAmB,EAAE,WAAW,QAAQ,mBAAS,GAAG,MAAM,GAA4B;AAC7F,SACE;AAAA,IAAC;AAAA;AAAA,MACC,cAAW;AAAA,MACX,MAAK;AAAA,MACL,WAAW,GAAG,0BAA0B,SAAS;AAAA,MAChD,GAAG;AAAA,MAEJ;AAAA,4BAAC,mBAAgB;AAAA,QACjB,oBAAC,UAAK,WAAU,mBAAmB,iBAAM;AAAA;AAAA;AAAA,EAC3C;AAEJ;AAEA,SAAS,eAAe,EAAE,WAAW,QAAQ,OAAO,GAAG,MAAM,GAAwB;AACnF,SACE;AAAA,IAAC;AAAA;AAAA,MACC,cAAW;AAAA,MACX,MAAK;AAAA,MACL,WAAW,GAAG,0BAA0B,SAAS;AAAA,MAChD,GAAG;AAAA,MAEJ;AAAA,4BAAC,UAAK,WAAU,mBAAmB,iBAAM;AAAA,QACzC,oBAAC,oBAAiB;AAAA;AAAA;AAAA,EACpB;AAEJ;AAEA,SAAS,mBAAmB,EAAE,WAAW,UAAU,iBAAc,GAAG,MAAM,GAA4B;AACpG,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAW;AAAA,MACX,aAAU;AAAA,MACV,WAAW,GAAG,2CAA2C,SAAS;AAAA,MACjE,GAAG;AAAA,MAEJ;AAAA,4BAAC,sBAAmB,WAAU,UAAS;AAAA,QACvC,oBAAC,UAAK,WAAU,WAAW,mBAAQ;AAAA;AAAA;AAAA,EACrC;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../src/components/ui/pagination.tsx"],"sourcesContent":["\"use client\";\n\nimport { ChevronLeftIcon, ChevronRightIcon, MoreHorizontalIcon } from \"lucide-react\";\nimport type * as React from \"react\";\nimport { useComitorMessages } from \"../../i18n/locale-provider.js\";\nimport { cn } from \"../../lib/cn.js\";\nimport { type ButtonProps, buttonVariants } from \"./button.js\";\n\n/**\n * Pagination — bộ khung thẻ `<a>`; bản \"biết đếm trang\" là composite `TablePagination`.\n *\n * Chuỗi hiển thị theo `ComitorLocaleProvider` (namespace `pagination`, mặc định tiếng Anh);\n * override từng chỗ qua prop `label` / `srLabel` / `aria-label`.\n *\n * `\"use client\"` từ `3.0.0`: chữ và tên cho trình đọc màn hình đọc từ provider, mà context chỉ\n * đọc được ở client. Trước đó file này tĩnh và ghim cứng tiếng Việt. Không prop nào là\n * hàm/component nên Server Component vẫn render được nó.\n * Muốn dùng `next/link`: `<PaginationLink asChild>` chưa có ở primitive này —\n * truyền `href` trực tiếp hoặc bọc bằng composite ở tầng app.\n */\n\nexport type PaginationProps = React.ComponentProps<\"nav\">;\nexport type PaginationContentProps = React.ComponentProps<\"ul\">;\nexport type PaginationItemProps = React.ComponentProps<\"li\">;\nexport type PaginationLinkProps = {\n isActive?: boolean;\n} & Pick<ButtonProps, \"size\"> &\n React.ComponentProps<\"a\">;\nexport type PaginationPreviousProps = PaginationLinkProps & {\n /** Nhãn hiển thị (ẩn ở màn hình nhỏ). Mặc định: khoá `previousLabel` của namespace `pagination`. */\n label?: React.ReactNode;\n};\nexport type PaginationNextProps = PaginationLinkProps & {\n /** Nhãn hiển thị (ẩn ở màn hình nhỏ). Mặc định: khoá `nextLabel` của namespace `pagination`. */\n label?: React.ReactNode;\n};\nexport type PaginationEllipsisProps = React.ComponentProps<\"span\"> & {\n /** Nhãn chỉ dành cho trình đọc màn hình. Mặc định: khoá `ellipsisLabel` của namespace `pagination`. */\n srLabel?: string;\n};\n\nfunction Pagination({ className, ...props }: PaginationProps) {\n const t = useComitorMessages(\"pagination\");\n return (\n // Thẻ <nav> đã ngầm mang role=\"navigation\" — bản comitor-ds khai lại là thừa, bỏ đi.\n <nav\n aria-label={t.navLabel}\n data-slot=\"pagination\"\n className={cn(\"mx-auto flex w-full justify-center\", className)}\n {...props}\n />\n );\n}\n\nfunction PaginationContent({ className, ...props }: PaginationContentProps) {\n return <ul data-slot=\"pagination-content\" className={cn(\"flex flex-row items-center gap-1\", className)} {...props} />;\n}\n\nfunction PaginationItem({ ...props }: PaginationItemProps) {\n return <li data-slot=\"pagination-item\" {...props} />;\n}\n\n/*\n * Trang ĐANG XEM: viền là `border-primary-ink`, không phải `border-gold-300`. Nền `bg-gold-50`\n * chỉ 1,09:1 so với nền trang, nên VIỀN mới là thứ mang tín hiệu \"đang ở trang này\" — ngưỡng\n * 3:1. gold-300 #E8B824 trên nền trắng chỉ **1,86:1** ✗ (dark 10,19:1 nên chỉ light hỏng).\n * `--primary-ink`: 6,51:1 với nền trang · 5,96:1 với chính nền `gold-50` (light); 12,67:1 ·\n * 11,91:1 (dark) ✓. `aria-current=\"page\"` vẫn giữ nguyên cho phần trợ năng phi thị giác.\n */\nfunction PaginationLink({ className, isActive, size = \"icon\", ...props }: PaginationLinkProps) {\n return (\n <a\n aria-current={isActive ? \"page\" : undefined}\n data-slot=\"pagination-link\"\n data-active={isActive}\n className={cn(\n buttonVariants({ variant: \"ghost\", size }),\n isActive &&\n \"border-primary-ink bg-gold-50 font-semibold text-foreground hover:bg-gold-50 dark:bg-gold-500/10 dark:hover:bg-gold-500/10\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction PaginationPrevious({ className, label: labelProp, ...props }: PaginationPreviousProps) {\n const t = useComitorMessages(\"pagination\");\n // `=== undefined` chứ không `??`: `label` là ReactNode, `null` vẫn nghĩa là \"không hiện chữ\".\n const label = labelProp === undefined ? t.previousLabel : labelProp;\n return (\n <PaginationLink\n aria-label={t.previousAriaLabel}\n size=\"default\"\n className={cn(\"gap-1 px-2.5 sm:pl-2.5\", className)}\n {...props}\n >\n <ChevronLeftIcon />\n <span className=\"hidden sm:block\">{label}</span>\n </PaginationLink>\n );\n}\n\nfunction PaginationNext({ className, label: labelProp, ...props }: PaginationNextProps) {\n const t = useComitorMessages(\"pagination\");\n const label = labelProp === undefined ? t.nextLabel : labelProp;\n return (\n <PaginationLink\n aria-label={t.nextAriaLabel}\n size=\"default\"\n className={cn(\"gap-1 px-2.5 sm:pr-2.5\", className)}\n {...props}\n >\n <span className=\"hidden sm:block\">{label}</span>\n <ChevronRightIcon />\n </PaginationLink>\n );\n}\n\nfunction PaginationEllipsis({ className, srLabel: srLabelProp, ...props }: PaginationEllipsisProps) {\n const t = useComitorMessages(\"pagination\");\n const srLabel = srLabelProp ?? t.ellipsisLabel;\n return (\n <span\n aria-hidden\n data-slot=\"pagination-ellipsis\"\n className={cn(\"flex size-9 items-center justify-center\", className)}\n {...props}\n >\n <MoreHorizontalIcon className=\"size-4\" />\n <span className=\"sr-only\">{srLabel}</span>\n </span>\n );\n}\n\nexport {\n Pagination,\n PaginationContent,\n PaginationEllipsis,\n PaginationItem,\n PaginationLink,\n PaginationNext,\n PaginationPrevious\n};\n"],"mappings":";AA6CI,cA8CA,YA9CA;AA3CJ,SAAS,iBAAiB,kBAAkB,0BAA0B;AAEtE,SAAS,0BAA0B;AACnC,SAAS,UAAU;AACnB,SAA2B,sBAAsB;AAmCjD,SAAS,WAAW,EAAE,WAAW,GAAG,MAAM,GAAoB;AAC5D,QAAM,IAAI,mBAAmB,YAAY;AACzC;AAAA;AAAA,IAEE;AAAA,MAAC;AAAA;AAAA,QACC,cAAY,EAAE;AAAA,QACd,aAAU;AAAA,QACV,WAAW,GAAG,sCAAsC,SAAS;AAAA,QAC5D,GAAG;AAAA;AAAA,IACN;AAAA;AAEJ;AAEA,SAAS,kBAAkB,EAAE,WAAW,GAAG,MAAM,GAA2B;AAC1E,SAAO,oBAAC,QAAG,aAAU,sBAAqB,WAAW,GAAG,oCAAoC,SAAS,GAAI,GAAG,OAAO;AACrH;AAEA,SAAS,eAAe,EAAE,GAAG,MAAM,GAAwB;AACzD,SAAO,oBAAC,QAAG,aAAU,mBAAmB,GAAG,OAAO;AACpD;AASA,SAAS,eAAe,EAAE,WAAW,UAAU,OAAO,QAAQ,GAAG,MAAM,GAAwB;AAC7F,SACE;AAAA,IAAC;AAAA;AAAA,MACC,gBAAc,WAAW,SAAS;AAAA,MAClC,aAAU;AAAA,MACV,eAAa;AAAA,MACb,WAAW;AAAA,QACT,eAAe,EAAE,SAAS,SAAS,KAAK,CAAC;AAAA,QACzC,YACE;AAAA,QACF;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,mBAAmB,EAAE,WAAW,OAAO,WAAW,GAAG,MAAM,GAA4B;AAC9F,QAAM,IAAI,mBAAmB,YAAY;AAEzC,QAAM,QAAQ,cAAc,SAAY,EAAE,gBAAgB;AAC1D,SACE;AAAA,IAAC;AAAA;AAAA,MACC,cAAY,EAAE;AAAA,MACd,MAAK;AAAA,MACL,WAAW,GAAG,0BAA0B,SAAS;AAAA,MAChD,GAAG;AAAA,MAEJ;AAAA,4BAAC,mBAAgB;AAAA,QACjB,oBAAC,UAAK,WAAU,mBAAmB,iBAAM;AAAA;AAAA;AAAA,EAC3C;AAEJ;AAEA,SAAS,eAAe,EAAE,WAAW,OAAO,WAAW,GAAG,MAAM,GAAwB;AACtF,QAAM,IAAI,mBAAmB,YAAY;AACzC,QAAM,QAAQ,cAAc,SAAY,EAAE,YAAY;AACtD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,cAAY,EAAE;AAAA,MACd,MAAK;AAAA,MACL,WAAW,GAAG,0BAA0B,SAAS;AAAA,MAChD,GAAG;AAAA,MAEJ;AAAA,4BAAC,UAAK,WAAU,mBAAmB,iBAAM;AAAA,QACzC,oBAAC,oBAAiB;AAAA;AAAA;AAAA,EACpB;AAEJ;AAEA,SAAS,mBAAmB,EAAE,WAAW,SAAS,aAAa,GAAG,MAAM,GAA4B;AAClG,QAAM,IAAI,mBAAmB,YAAY;AACzC,QAAM,UAAU,eAAe,EAAE;AACjC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAW;AAAA,MACX,aAAU;AAAA,MACV,WAAW,GAAG,2CAA2C,SAAS;AAAA,MACjE,GAAG;AAAA,MAEJ;AAAA,4BAAC,sBAAmB,WAAU,UAAS;AAAA,QACvC,oBAAC,UAAK,WAAU,WAAW,mBAAQ;AAAA;AAAA;AAAA,EACrC;AAEJ;","names":[]}
@@ -20,7 +20,7 @@
20
20
  interface PhoneInputCountry {
21
21
  /** Mã ISO 3166-1 alpha-2, viết HOA — `"VN"`. */
22
22
  code: string;
23
- /** Tên hiển thị trong danh sách và trong nhãn của nút chọn — `"Việt Nam"`. */
23
+ /** Tên hiển thị trong danh sách và trong nhãn của nút chọn — `"Vietnam"` (theo `locale`). */
24
24
  name: string;
25
25
  /** Mã quay số quốc tế, có dấu `+` — `"+84"`. */
26
26
  dialCode: string;
@@ -28,11 +28,12 @@ interface PhoneInputCountry {
28
28
  flag?: string;
29
29
  }
30
30
  /**
31
- * Chuỗi hiển thị của `PhoneInput` (kể cả chuỗi chỉ dành cho trình đọc màn hình) — override từng
32
- * khoá qua prop `labels`. Mặc định tiếng Việt.
31
+ * Chuỗi hiển thị của `PhoneInput` (kể cả chuỗi chỉ dành cho trình đọc màn hình). Theo
32
+ * `ComitorLocaleProvider` (mặc định tiếng Anh, bảng tiếng Việt dựng sẵn); override từng khoá qua
33
+ * prop `labels`.
33
34
  *
34
- * ⚠ Placeholder của ô nhập số KHÔNG nằm ở đây: nó vẫn là prop `placeholder` rời như thượng nguồn
35
- * (trên `PhoneInput`, hoặc trên chính `PhoneInputField`).
35
+ * Tên quốc gia KHÔNG nằm ở đây — `Intl.DisplayNames` gọi theo `locale` (prop `locale` của
36
+ * `PhoneInput`, không truyền thì `locale` của provider).
36
37
  */
37
38
  interface PhoneInputLabels {
38
39
  /**
@@ -47,8 +48,18 @@ interface PhoneInputLabels {
47
48
  searchPlaceholder: string;
48
49
  /** Dòng báo khi không quốc gia nào khớp từ khoá. */
49
50
  empty: string;
51
+ /**
52
+ * Placeholder của ô nhập số. Prop `placeholder` rời (tên của thượng nguồn — trên `PhoneInput`,
53
+ * hoặc trên chính `PhoneInputField`) thắng khoá này nếu có. Thêm ở `3.0.0`: trước đó placeholder
54
+ * chỉ là mặc định viết thẳng trong component.
55
+ */
56
+ placeholder: string;
50
57
  }
51
- /** Nhãn tiếng Việt mặc định — mọi khoá đều override được qua prop `labels`. */
58
+ /**
59
+ * Nhãn TIẾNG ANH mặc định (từ `3.0.0`; trước đó là tiếng Việt). Bảng tiếng Việt:
60
+ * `comitorMessagesVi.phoneInput`. Component không đọc thẳng hằng này — nó đọc bảng của
61
+ * `ComitorLocaleProvider`; hằng ở đây để app trải ra khi tự dựng nhãn.
62
+ */
52
63
  declare const DEFAULT_PHONE_INPUT_LABELS: PhoneInputLabels;
53
64
 
54
65
  export { DEFAULT_PHONE_INPUT_LABELS, type PhoneInputCountry, type PhoneInputLabels };
@@ -1,8 +1,5 @@
1
- const DEFAULT_PHONE_INPUT_LABELS = {
2
- countrySelect: (country) => country ? `Qu\u1ED1c gia: ${country.name} (${country.dialCode})` : "Ch\u1ECDn qu\u1ED1c gia",
3
- searchPlaceholder: "T\xECm qu\u1ED1c gia\u2026",
4
- empty: "Kh\xF4ng t\xECm th\u1EA5y qu\u1ED1c gia."
5
- };
1
+ import { phoneInputEn } from "../../i18n/namespaces/phone-input.js";
2
+ const DEFAULT_PHONE_INPUT_LABELS = { ...phoneInputEn };
6
3
  export {
7
4
  DEFAULT_PHONE_INPUT_LABELS
8
5
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/ui/phone-input-constants.ts"],"sourcesContent":["/**\n * Kiểu quốc gia và nhãn mặc định của `PhoneInput`.\n *\n * Module **CỐ Ý không có `\"use client\"`** — xem `src/chart/chart-colors.ts` để biết lý do đầy\n * đủ: mọi export của một file `\"use client\"` đến tay Server Component dưới dạng\n * client-reference proxy, đọc ra `undefined` mà KHÔNG throw, KHÔNG warning. Hằng dữ liệu thuần\n * (nhãn mặc định) phải sống ngoài ranh giới client để app spread/override được ở cả hai phía.\n *\n * ⚠ Barrel `src/index.ts` xuất module này TRỰC TIẾP. `phone-input.tsx` chỉ được `import`,\n * KHÔNG được `export` lại (re-export qua file client là vô hiệu, và đụng tên với `export *`).\n */\n\n/**\n * Một quốc gia trong danh sách chọn của `PhoneInput` — cũng là hình dạng của prop `countries`\n * khi app muốn tự giới hạn danh sách.\n *\n * ⚠ Khác thượng nguồn: thượng nguồn khai kiểu này dưới tên `Country` và KHÔNG export (app phải\n * viết `PhoneInputProps[\"countries\"]`). Ở đây export dưới tên có tiền tố — `Country` trần là tên\n * quá chung cho entry chính.\n */\nexport interface PhoneInputCountry {\n /** Mã ISO 3166-1 alpha-2, viết HOA — `\"VN\"`. */\n code: string;\n /** Tên hiển thị trong danh sách và trong nhãn của nút chọn — `\"Việt Nam\"`. */\n name: string;\n /** Mã quay số quốc tế, có dấu `+` — `\"+84\"`. */\n dialCode: string;\n /** Cờ emoji — `\"🇻🇳\"`. Bỏ trống thì không vẽ cờ. */\n flag?: string;\n}\n\n/**\n * Chuỗi hiển thị của `PhoneInput` (kể cả chuỗi chỉ dành cho trình đọc màn hình) — override từng\n * khoá qua prop `labels`. Mặc định tiếng Việt.\n *\n * ⚠ Placeholder của ô nhập số KHÔNG nằm ở đây: nó vẫn là prop `placeholder` rời như thượng nguồn\n * (trên `PhoneInput`, hoặc trên chính `PhoneInputField`).\n */\nexport interface PhoneInputLabels {\n /**\n * Tên cho trình đọc màn hình của nút chọn quốc gia. Nhận quốc gia đang chọn (`undefined` khi\n * chưa chọn) vì tên phải nói được GIÁ TRỊ hiện tại — nút chỉ chứa một lá cờ emoji.\n *\n * ⚠ Thêm so với thượng nguồn: ở bản gốc nút này KHÔNG có tên (lá cờ + mũi tên, hoặc một ô xám\n * trống khi chưa chọn). Là HÀM chứ không phải chuỗi mẫu vì có giá trị chèn vào giữa câu.\n */\n countrySelect: (country: PhoneInputCountry | undefined) => string;\n /** Placeholder ô tìm kiếm trong danh sách quốc gia. */\n searchPlaceholder: string;\n /** Dòng báo khi không quốc gia nào khớp từ khoá. */\n empty: string;\n}\n\n/** Nhãn tiếng Việt mặc định — mọi khoá đều override được qua prop `labels`. */\nexport const DEFAULT_PHONE_INPUT_LABELS: PhoneInputLabels = {\n countrySelect: (country) => (country ? `Quốc gia: ${country.name} (${country.dialCode})` : \"Chọn quốc gia\"),\n searchPlaceholder: \"Tìm quốc gia…\",\n empty: \"Không tìm thấy quốc gia.\"\n};\n"],"mappings":"AAsDO,MAAM,6BAA+C;AAAA,EAC1D,eAAe,CAAC,YAAa,UAAU,kBAAa,QAAQ,IAAI,KAAK,QAAQ,QAAQ,MAAM;AAAA,EAC3F,mBAAmB;AAAA,EACnB,OAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../../../src/components/ui/phone-input-constants.ts"],"sourcesContent":["/**\n * Kiểu quốc gia và nhãn mặc định của `PhoneInput`.\n *\n * Module **CỐ Ý không có `\"use client\"`** — xem `src/chart/chart-colors.ts` để biết lý do đầy\n * đủ: mọi export của một file `\"use client\"` đến tay Server Component dưới dạng\n * client-reference proxy, đọc ra `undefined` mà KHÔNG throw, KHÔNG warning. Hằng dữ liệu thuần\n * (nhãn mặc định) phải sống ngoài ranh giới client để app spread/override được ở cả hai phía.\n *\n * ⚠ Barrel `src/index.ts` xuất module này TRỰC TIẾP. `phone-input.tsx` chỉ được `import`,\n * KHÔNG được `export` lại (re-export qua file client là vô hiệu, và đụng tên với `export *`).\n */\n\nimport { phoneInputEn } from \"../../i18n/namespaces/phone-input.js\";\n\n/**\n * Một quốc gia trong danh sách chọn của `PhoneInput` — cũng là hình dạng của prop `countries`\n * khi app muốn tự giới hạn danh sách.\n *\n * ⚠ Khác thượng nguồn: thượng nguồn khai kiểu này dưới tên `Country` và KHÔNG export (app phải\n * viết `PhoneInputProps[\"countries\"]`). Ở đây export dưới tên có tiền tố — `Country` trần là tên\n * quá chung cho entry chính.\n */\nexport interface PhoneInputCountry {\n /** Mã ISO 3166-1 alpha-2, viết HOA — `\"VN\"`. */\n code: string;\n /** Tên hiển thị trong danh sách và trong nhãn của nút chọn — `\"Vietnam\"` (theo `locale`). */\n name: string;\n /** Mã quay số quốc tế, có dấu `+` — `\"+84\"`. */\n dialCode: string;\n /** Cờ emoji — `\"🇻🇳\"`. Bỏ trống thì không vẽ cờ. */\n flag?: string;\n}\n\n/**\n * Chuỗi hiển thị của `PhoneInput` (kể cả chuỗi chỉ dành cho trình đọc màn hình). Theo\n * `ComitorLocaleProvider` (mặc định tiếng Anh, bảng tiếng Việt dựng sẵn); override từng khoá qua\n * prop `labels`.\n *\n * Tên quốc gia KHÔNG nằm ở đây — `Intl.DisplayNames` gọi theo `locale` (prop `locale` của\n * `PhoneInput`, không truyền thì `locale` của provider).\n */\nexport interface PhoneInputLabels {\n /**\n * Tên cho trình đọc màn hình của nút chọn quốc gia. Nhận quốc gia đang chọn (`undefined` khi\n * chưa chọn) vì tên phải nói được GIÁ TRỊ hiện tại — nút chỉ chứa một lá cờ emoji.\n *\n * ⚠ Thêm so với thượng nguồn: ở bản gốc nút này KHÔNG có tên (lá cờ + mũi tên, hoặc một ô xám\n * trống khi chưa chọn). Là HÀM chứ không phải chuỗi mẫu vì có giá trị chèn vào giữa câu.\n */\n countrySelect: (country: PhoneInputCountry | undefined) => string;\n /** Placeholder ô tìm kiếm trong danh sách quốc gia. */\n searchPlaceholder: string;\n /** Dòng báo khi không quốc gia nào khớp từ khoá. */\n empty: string;\n /**\n * Placeholder của ô nhập số. Prop `placeholder` rời (tên của thượng nguồn — trên `PhoneInput`,\n * hoặc trên chính `PhoneInputField`) thắng khoá này nếu có. Thêm ở `3.0.0`: trước đó placeholder\n * chỉ là mặc định viết thẳng trong component.\n */\n placeholder: string;\n}\n\n/**\n * Nhãn TIẾNG ANH mặc định (từ `3.0.0`; trước đó là tiếng Việt). Bảng tiếng Việt:\n * `comitorMessagesVi.phoneInput`. Component không đọc thẳng hằng này — nó đọc bảng của\n * `ComitorLocaleProvider`; hằng ở đây để app trải ra khi tự dựng nhãn.\n */\nexport const DEFAULT_PHONE_INPUT_LABELS: PhoneInputLabels = { ...phoneInputEn };\n"],"mappings":"AAYA,SAAS,oBAAoB;AAuDtB,MAAM,6BAA+C,EAAE,GAAG,aAAa;","names":[]}
@@ -26,11 +26,11 @@ declare function useStore<T>(selector: (state: StoreState) => T, ogStore?: Store
26
26
  * (`PhoneInputField`). Giá trị (`value` / `onValueChange` / input ẩn khi submit form) luôn là E.164
27
27
  * chỉ gồm chữ số: `"+84912345678"`. Người dùng gõ được theo HAI cách:
28
28
  *
29
- * - **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
30
- * 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õ
29
+ * - **Số nội địa** — chuỗi KHÔNG bắt đầu bằng `+`, và đang có quốc gia được chọn (`defaultCountry`
30
+ * / `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õ
31
31
  * (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ị
32
32
  * ghép lại theo mã mới, còn chữ trên ô giữ nguyên.
33
- * Gõ `0912 345 678` → ô hiện `0912 345 678`, `onValueChange("+84912345678")`.
33
+ * Nước là Việt Nam, gõ `0912 345 678` → ô hiện `0912 345 678`, `onValueChange("+84912345678")`.
34
34
  * ⚠ Khác thượng nguồn — bản gốc ra `+0912345678`. Ý, San Marino, Vatican giữ số 0 đầu (máy bàn
35
35
  * `06 …` → `+39 06 …`).
36
36
  * - **Số quốc tế** — chuỗi bắt đầu bằng `+` (như thượng nguồn): ô hiện tách nhóm
@@ -38,9 +38,10 @@ declare function useStore<T>(selector: (state: StoreState) => T, ogStore?: Store
38
38
  * Gõ `+84 912 345 678` → `onValueChange("+84912345678")`, cờ chuyển sang Việt Nam.
39
39
  *
40
40
  * 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
41
- * được chọn (`defaultCountry=""`) thì mọi chữ số đầu bị coi là mã quốc gia, như thượng nguồn.
41
+ * đượ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:
42
+ * gõ `0912 345 678` ra `+0912345678`, gõ `84 912 345 678` ra `+84912345678` và cờ tự nhận Việt Nam.
42
43
  *
43
- * Gốc là `role="group"` chưa có tên: đặt `aria-label` (vd "Số điện thoại") hoặc `aria-labelledby`
44
+ * Gốc là `role="group"` chưa có tên: đặt `aria-label` (vd "Phone number") hoặc `aria-labelledby`
44
45
  * cho chính `PhoneInput`.
45
46
  */
46
47
  interface PhoneInputProps extends React.ComponentProps<"div"> {
@@ -48,25 +49,31 @@ interface PhoneInputProps extends React.ComponentProps<"div"> {
48
49
  value?: string;
49
50
  onValueChange?: (value: string) => void;
50
51
  /**
51
- * Quốc gia ban đầu (mã ISO alpha-2, viết HOA). Mặc định `"VN"`.
52
+ * 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à
53
+ * thiết lập VÙNG, không suy từ ngôn ngữ; app Comitor truyền từ cài đặt workspace.
52
54
  *
53
- * ⚠ Khác thượng nguồn: thượng nguồn để trống. Truyền `""` để quay về hành vi đó.
55
+ * ⚠ Không có quốc gia thì chế độ số NỘI ĐỊA tắt (xem JSDoc của `PhoneInput`). Trước `3.0.0`
56
+ * mặc định cứng là `"VN"`.
54
57
  */
55
58
  defaultCountry?: string;
56
59
  country?: string;
57
60
  onCountryChange?: (country: string) => void;
58
61
  countries?: PhoneInputCountry[];
59
62
  name?: string;
60
- /** Placeholder ô nhập số. Mặc định "Nhập số điện thoại". */
63
+ /** Placeholder ô nhập số — thắng khoá `labels.placeholder` (namespace `phoneInput`). */
61
64
  placeholder?: string;
62
65
  /**
63
- * Locale BCP 47 để gọi tên quốc gia (`Intl.DisplayNames`) và sắp xếp danh sách. Mặc định `"vi"`.
64
- * Bỏ qua khi app truyền `countries` riêng (tên lấy nguyên từ đó).
66
+ * 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ì
67
+ * theo `locale` của `ComitorLocaleProvider` (không có provider → `"en"`; trước `3.0.0` mặc định
68
+ * cứng là `"vi"`). Bỏ qua khi app truyền `countries` riêng (tên lấy nguyên từ đó).
65
69
  *
66
70
  * ⚠ Thêm so với thượng nguồn — bản gốc ghim tên tiếng Anh.
67
71
  */
68
72
  locale?: string;
69
- /** Chuỗi hiển thị/đọc màn hình của phần chọn quốc gia — override từng khoá. */
73
+ /**
74
+ * 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
75
+ * truyền thì theo namespace `phoneInput` của `ComitorLocaleProvider` (mặc định tiếng Anh).
76
+ */
70
77
  labels?: Partial<PhoneInputLabels>;
71
78
  asChild?: boolean;
72
79
  disabled?: boolean;
@@ -4,6 +4,7 @@ import { Slot } from "@radix-ui/react-slot";
4
4
  import { defaultFilter } from "cmdk";
5
5
  import { Check, ChevronDown, Globe } from "lucide-react";
6
6
  import * as React from "react";
7
+ import { useComitorLabels, useComitorLocale } 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";
@@ -12,15 +13,10 @@ import { useLazyRef } from "../../lib/use-lazy-ref.js";
12
13
  import { VisuallyHiddenInput } from "../../lib/visually-hidden-input.js";
13
14
  import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList } from "./command.js";
14
15
  import { Input } from "./input.js";
15
- import {
16
- DEFAULT_PHONE_INPUT_LABELS
17
- } from "./phone-input-constants.js";
18
16
  import { Popover, PopoverContent, PopoverTrigger } from "./popover.js";
19
17
  const ROOT_NAME = "PhoneInput";
20
18
  const COUNTRY_SELECT_NAME = "PhoneInputCountrySelect";
21
19
  const FIELD_NAME = "PhoneInputField";
22
- const DEFAULT_COUNTRY = "VN";
23
- const DEFAULT_DISPLAY_LOCALE = "vi";
24
20
  const COUNTRY_DATA = [
25
21
  ["af", "93"],
26
22
  ["ax", "358"],
@@ -273,7 +269,7 @@ function getFlagEmoji(countryCode) {
273
269
  const codePoints = countryCode.toUpperCase().split("").map((char) => 127397 + char.charCodeAt(0));
274
270
  return String.fromCodePoint(...codePoints);
275
271
  }
276
- function getCountries(locale = DEFAULT_DISPLAY_LOCALE) {
272
+ function getCountries(locale) {
277
273
  let regionNames;
278
274
  let collator;
279
275
  try {
@@ -396,14 +392,14 @@ function PhoneInput(props) {
396
392
  const {
397
393
  value: valueProp,
398
394
  defaultValue,
399
- defaultCountry = DEFAULT_COUNTRY,
395
+ defaultCountry,
400
396
  country: countryProp,
401
397
  onValueChange,
402
398
  onCountryChange,
403
399
  countries: countriesProp,
404
400
  name,
405
- placeholder = "Nh\u1EADp s\u1ED1 \u0111i\u1EC7n tho\u1EA1i",
406
- locale = DEFAULT_DISPLAY_LOCALE,
401
+ placeholder: placeholderProp,
402
+ locale: localeProp,
407
403
  labels: labelsProp,
408
404
  asChild,
409
405
  disabled,
@@ -416,11 +412,14 @@ function PhoneInput(props) {
416
412
  ref,
417
413
  ...rootProps
418
414
  } = props;
415
+ const { locale: providerLocale } = useComitorLocale();
416
+ const locale = localeProp ?? providerLocale;
417
+ const labels = useComitorLabels("phoneInput", labelsProp);
418
+ const placeholder = placeholderProp ?? labels.placeholder;
419
419
  const instanceId = React.useId();
420
420
  const rootId = id ?? instanceId;
421
421
  const inputRef = React.useRef(null);
422
422
  const countries = React.useMemo(() => countriesProp ?? getCountries(locale), [countriesProp, locale]);
423
- const labels = React.useMemo(() => ({ ...DEFAULT_PHONE_INPUT_LABELS, ...labelsProp }), [labelsProp]);
424
423
  const [formTrigger, setFormTrigger] = React.useState(null);
425
424
  const composedRef = useComposedRefs(ref, (node) => setFormTrigger(node));
426
425
  const isFormControl = formTrigger ? !!formTrigger.closest("form") : true;
@@ -578,7 +577,7 @@ function PhoneInput(props) {
578
577
  }
579
578
  function PhoneInputCountrySelect(props) {
580
579
  const { disabled: disabledProp, className, children, onOpenChange: onOpenChangeProp, ...popoverProps } = props;
581
- const { countries, inputRef, disabled, showFlag, labels } = usePhoneInputContext(COUNTRY_SELECT_NAME);
580
+ const { countries, inputRef, disabled, readOnly, showFlag, labels } = usePhoneInputContext(COUNTRY_SELECT_NAME);
582
581
  const store = useStoreContext(COUNTRY_SELECT_NAME);
583
582
  const country = useStore((state) => state.country);
584
583
  const open = useStore((state) => state.open);
@@ -587,10 +586,11 @@ function PhoneInputCountrySelect(props) {
587
586
  const countryContext = countries.find((c) => c.code === country);
588
587
  const onOpenChange = React.useCallback(
589
588
  (open2) => {
589
+ if (open2 && readOnly) return;
590
590
  store.setState("open", open2);
591
591
  onOpenChangeRef.current?.(open2);
592
592
  },
593
- [store, onOpenChangeRef]
593
+ [store, onOpenChangeRef, readOnly]
594
594
  );
595
595
  return /* @__PURE__ */ jsxs(Popover, { open, onOpenChange, ...popoverProps, children: [
596
596
  /* @__PURE__ */ jsxs(
@@ -598,6 +598,8 @@ function PhoneInputCountrySelect(props) {
598
598
  {
599
599
  "data-slot": "phone-input-country-select",
600
600
  "aria-label": labels.countrySelect(countryContext),
601
+ "aria-disabled": readOnly && !isDisabled ? true : void 0,
602
+ "data-readonly": readOnly ? "" : void 0,
601
603
  disabled: isDisabled,
602
604
  className: cn(
603
605
  /*