@godxjp/ui 20.0.0 → 20.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (250) hide show
  1. package/README.md +8 -2
  2. package/dist/app/theme-axes.d.ts +2 -0
  3. package/dist/app/theme-axes.js +45 -0
  4. package/dist/components/charts/chart-cartesian.d.ts +2 -1
  5. package/dist/components/charts/chart-cartesian.js +52 -3
  6. package/dist/components/charts/chart-category-axis.d.ts +55 -0
  7. package/dist/components/charts/chart-category-axis.js +93 -0
  8. package/dist/components/charts/chart-frame.d.ts +10 -1
  9. package/dist/components/charts/chart-frame.js +19 -3
  10. package/dist/components/charts/compact-bar-trend.d.ts +1 -1
  11. package/dist/components/charts/compact-bar-trend.js +2 -0
  12. package/dist/components/charts/pie-chart.d.ts +1 -1
  13. package/dist/components/charts/pie-chart.js +12 -1
  14. package/dist/components/charts/recharts-peer.d.ts +49 -0
  15. package/dist/components/charts/recharts-peer.js +45 -0
  16. package/dist/components/data-display/card.d.ts +12 -1
  17. package/dist/components/data-display/card.js +22 -4
  18. package/dist/components/data-display/code-block.js +6 -2
  19. package/dist/components/data-display/data-table.d.ts +39 -4
  20. package/dist/components/data-display/data-table.js +802 -270
  21. package/dist/components/data-display/descriptions.d.ts +27 -6
  22. package/dist/components/data-display/descriptions.js +58 -17
  23. package/dist/components/data-display/index.d.ts +2 -0
  24. package/dist/components/data-display/index.js +2 -0
  25. package/dist/components/data-display/list-row.d.ts +10 -1
  26. package/dist/components/data-display/list-row.js +7 -1
  27. package/dist/components/data-display/popover.d.ts +2 -2
  28. package/dist/components/data-display/popover.js +61 -11
  29. package/dist/components/data-display/range-timeline.d.ts +38 -0
  30. package/dist/components/data-display/range-timeline.js +161 -0
  31. package/dist/components/data-display/scroll-area.js +13 -2
  32. package/dist/components/data-display/service-launcher-card.js +10 -10
  33. package/dist/components/data-display/table.d.ts +11 -3
  34. package/dist/components/data-display/table.js +48 -18
  35. package/dist/components/data-display/tree-list.js +4 -9
  36. package/dist/components/data-entry/calendar.d.ts +2 -2
  37. package/dist/components/data-entry/calendar.js +12 -1
  38. package/dist/components/data-entry/cascader.d.ts +1 -1
  39. package/dist/components/data-entry/cascader.js +188 -24
  40. package/dist/components/data-entry/color-picker.d.ts +1 -1
  41. package/dist/components/data-entry/color-picker.js +17 -5
  42. package/dist/components/data-entry/control-appearance.d.ts +64 -0
  43. package/dist/components/data-entry/control-appearance.js +39 -0
  44. package/dist/components/data-entry/control-surface.d.ts +61 -0
  45. package/dist/components/data-entry/control-surface.js +39 -0
  46. package/dist/components/data-entry/date-picker.d.ts +1 -1
  47. package/dist/components/data-entry/date-picker.js +344 -113
  48. package/dist/components/data-entry/date-range-picker.d.ts +1 -1
  49. package/dist/components/data-entry/date-range-picker.js +278 -140
  50. package/dist/components/data-entry/form-field.d.ts +1 -1
  51. package/dist/components/data-entry/form-field.js +39 -4
  52. package/dist/components/data-entry/form.d.ts +4 -0
  53. package/dist/components/data-entry/form.js +4 -2
  54. package/dist/components/data-entry/index.d.ts +7 -3
  55. package/dist/components/data-entry/index.js +10 -1
  56. package/dist/components/data-entry/input-otp.d.ts +1 -1
  57. package/dist/components/data-entry/input.d.ts +12 -34
  58. package/dist/components/data-entry/input.js +92 -24
  59. package/dist/components/data-entry/month-picker.d.ts +1 -1
  60. package/dist/components/data-entry/month-picker.js +47 -10
  61. package/dist/components/data-entry/month-range-picker.d.ts +1 -1
  62. package/dist/components/data-entry/month-range-picker.js +51 -11
  63. package/dist/components/data-entry/number-input.d.ts +7 -0
  64. package/dist/components/data-entry/number-input.js +147 -98
  65. package/dist/components/data-entry/password-input.d.ts +1 -1
  66. package/dist/components/data-entry/radio.d.ts +1 -1
  67. package/dist/components/data-entry/radio.js +61 -13
  68. package/dist/components/data-entry/search-input.d.ts +1 -1
  69. package/dist/components/data-entry/search-input.js +16 -2
  70. package/dist/components/data-entry/search-select.d.ts +2 -2
  71. package/dist/components/data-entry/search-select.js +209 -78
  72. package/dist/components/data-entry/select.d.ts +22 -4
  73. package/dist/components/data-entry/select.js +215 -163
  74. package/dist/components/data-entry/slider.d.ts +9 -1
  75. package/dist/components/data-entry/slider.js +87 -9
  76. package/dist/components/data-entry/switch.d.ts +3 -0
  77. package/dist/components/data-entry/switch.js +29 -3
  78. package/dist/components/data-entry/textarea.d.ts +14 -56
  79. package/dist/components/data-entry/textarea.js +80 -33
  80. package/dist/components/data-entry/time-picker.d.ts +2 -2
  81. package/dist/components/data-entry/time-picker.js +333 -109
  82. package/dist/components/data-entry/time-range-picker.d.ts +5 -0
  83. package/dist/components/data-entry/time-range-picker.js +89 -0
  84. package/dist/components/data-entry/transfer.d.ts +1 -1
  85. package/dist/components/data-entry/transfer.js +86 -28
  86. package/dist/components/data-entry/tree-select.d.ts +1 -1
  87. package/dist/components/data-entry/tree-select.js +201 -113
  88. package/dist/components/data-entry/tree-utils.js +7 -14
  89. package/dist/components/data-entry/upload-files.d.ts +2 -0
  90. package/dist/components/data-entry/upload-files.js +31 -0
  91. package/dist/components/data-entry/upload-request.d.ts +4 -0
  92. package/dist/components/data-entry/upload-request.js +53 -0
  93. package/dist/components/data-entry/upload-types.d.ts +28 -0
  94. package/dist/components/data-entry/upload-types.js +2 -0
  95. package/dist/components/data-entry/upload.d.ts +2 -2
  96. package/dist/components/data-entry/upload.js +475 -115
  97. package/dist/components/feedback/dialog.js +16 -19
  98. package/dist/components/general/button.d.ts +1 -1
  99. package/dist/components/general/button.js +5 -1
  100. package/dist/components/general/index.d.ts +1 -0
  101. package/dist/components/general/index.js +2 -0
  102. package/dist/components/general/typography.d.ts +3 -0
  103. package/dist/components/general/typography.js +15 -1
  104. package/dist/components/general/visually-hidden.d.ts +3 -0
  105. package/dist/components/general/visually-hidden.js +9 -0
  106. package/dist/components/layout/app-launcher.d.ts +34 -0
  107. package/dist/components/layout/app-launcher.js +228 -0
  108. package/dist/components/layout/app-shell.d.ts +2 -0
  109. package/dist/components/layout/app-shell.js +20 -7
  110. package/dist/components/layout/breadcrumb.d.ts +14 -2
  111. package/dist/components/layout/breadcrumb.js +46 -4
  112. package/dist/components/layout/flex.d.ts +1 -1
  113. package/dist/components/layout/flex.js +23 -2
  114. package/dist/components/layout/index.d.ts +3 -0
  115. package/dist/components/layout/index.js +5 -1
  116. package/dist/components/layout/org-switcher.js +20 -1
  117. package/dist/components/layout/page-container.d.ts +1 -1
  118. package/dist/components/layout/page-container.js +5 -3
  119. package/dist/components/layout/responsive-grid.d.ts +16 -2
  120. package/dist/components/layout/responsive-grid.js +29 -2
  121. package/dist/components/layout/topbar-item.d.ts +3 -0
  122. package/dist/components/layout/topbar-item.js +18 -3
  123. package/dist/components/layout/topbar.d.ts +1 -1
  124. package/dist/components/layout/topbar.js +27 -6
  125. package/dist/components/navigation/dropdown-menu.d.ts +30 -2
  126. package/dist/components/navigation/dropdown-menu.js +68 -11
  127. package/dist/components/navigation/pagination.d.ts +2 -2
  128. package/dist/components/navigation/pagination.js +155 -83
  129. package/dist/components/navigation/steps.d.ts +2 -2
  130. package/dist/components/navigation/steps.js +29 -4
  131. package/dist/components/navigation/tabs.d.ts +5 -33
  132. package/dist/components/navigation/tabs.js +232 -64
  133. package/dist/components/ui/input-otp.d.ts +26 -28
  134. package/dist/components/ui/input-otp.js +50 -7
  135. package/dist/components/ui/password-input.d.ts +36 -2
  136. package/dist/components/ui/password-input.js +27 -7
  137. package/dist/components/ui/rating.d.ts +25 -0
  138. package/dist/components/ui/rating.js +67 -27
  139. package/dist/components/ui/segmented.d.ts +9 -0
  140. package/dist/components/ui/segmented.js +17 -2
  141. package/dist/components/ui/separator.d.ts +4 -0
  142. package/dist/components/ui/separator.js +13 -0
  143. package/dist/components/ui/tag-input.d.ts +45 -0
  144. package/dist/components/ui/tag-input.js +109 -27
  145. package/dist/form/form-context.d.ts +29 -0
  146. package/dist/form/form-context.js +44 -4
  147. package/dist/form/form-field-array.d.ts +22 -0
  148. package/dist/form/form-field-array.js +50 -0
  149. package/dist/form/form-field-control.d.ts +2 -1
  150. package/dist/form/form-field-control.js +116 -40
  151. package/dist/form/form-root.d.ts +2 -1
  152. package/dist/form/form-root.js +142 -23
  153. package/dist/form/index.d.ts +3 -1
  154. package/dist/form/index.js +12 -1
  155. package/dist/i18n/messages/en.json +56 -5
  156. package/dist/i18n/messages/ja.json +56 -5
  157. package/dist/i18n/messages/vi.json +56 -5
  158. package/dist/inertia/index.d.ts +20 -0
  159. package/dist/inertia/index.js +60 -1
  160. package/dist/lib/control-styles.d.ts +25 -3
  161. package/dist/lib/control-styles.js +9 -3
  162. package/dist/lib/datetime/picker-format.d.ts +8 -0
  163. package/dist/lib/datetime/picker-format.js +54 -0
  164. package/dist/props/components/charts.prop.d.ts +21 -0
  165. package/dist/props/components/data-display.prop.d.ts +55 -4
  166. package/dist/props/components/data-entry.prop.d.ts +687 -43
  167. package/dist/props/components/form.prop.d.ts +142 -4
  168. package/dist/props/components/general.prop.d.ts +17 -1
  169. package/dist/props/components/index.d.ts +2 -2
  170. package/dist/props/components/layout.prop.d.ts +163 -6
  171. package/dist/props/components/navigation.prop.d.ts +113 -3
  172. package/dist/props/registry.d.ts +376 -10
  173. package/dist/props/registry.js +493 -9
  174. package/dist/props/vocabulary/data.prop.d.ts +179 -1
  175. package/dist/props/vocabulary/index.d.ts +4 -4
  176. package/dist/props/vocabulary/interaction.prop.d.ts +51 -2
  177. package/dist/props/vocabulary/navigation.prop.d.ts +40 -0
  178. package/dist/props/vocabulary/shared.prop.d.ts +33 -0
  179. package/dist/styles/badge-layout.css +2 -1
  180. package/dist/styles/card-layout.css +26 -4
  181. package/dist/styles/chart-layout.css +15 -0
  182. package/dist/styles/control.css +515 -14
  183. package/dist/styles/data-display-layout.css +241 -6
  184. package/dist/styles/data-entry-layout.css +13 -0
  185. package/dist/styles/layout.css +221 -4
  186. package/dist/styles/navigation-layout.css +227 -0
  187. package/dist/styles/shell-layout.css +229 -5
  188. package/dist/styles/table-layout.css +95 -6
  189. package/dist/styles/text-layout.css +5 -0
  190. package/dist/tokens/base.css +1 -0
  191. package/dist/tokens/components/badge.css +1 -0
  192. package/dist/tokens/components/chart.css +6 -0
  193. package/dist/tokens/components/control.css +79 -2
  194. package/dist/tokens/components/data-display.css +9 -0
  195. package/dist/tokens/components/descriptions.css +11 -0
  196. package/dist/tokens/components/flex.css +8 -0
  197. package/dist/tokens/components/navigation.css +55 -0
  198. package/dist/tokens/components/shell.css +50 -2
  199. package/dist/tokens/components/table.css +14 -0
  200. package/dist/tokens/semantic/layout.css +9 -0
  201. package/docs/CONSUMER-RULES.md +13 -0
  202. package/docs/DESIGN-AUTHORITY.md +43 -6
  203. package/docs/DEVELOPMENT.md +4 -3
  204. package/docs/FORMS.md +151 -6
  205. package/docs/FRAME-COVERAGE-REPORT.md +29 -16
  206. package/docs/README.md +1 -1
  207. package/docs/STANDARDS-vocabulary-tokens.md +1 -1
  208. package/docs/TESTING.md +15 -6
  209. package/docs/charts/cjk-category-axis.tsx +81 -0
  210. package/docs/data-display/card/index.tsx +22 -0
  211. package/docs/data-display/data-table/examples/antd-parity.tsx +257 -0
  212. package/docs/data-display/data-table/index.tsx +23 -0
  213. package/docs/data-display/descriptions.tsx +41 -0
  214. package/docs/data-display/scroll-area.tsx +31 -25
  215. package/docs/data-display/table.tsx +104 -45
  216. package/docs/data-display/timeline.tsx +41 -0
  217. package/docs/data-entry/date-picker.tsx +85 -0
  218. package/docs/data-entry/date-range-picker.tsx +26 -0
  219. package/docs/data-entry/form-dynamic-fields.tsx +199 -0
  220. package/docs/data-entry/form.tsx +74 -4
  221. package/docs/data-entry/input-otp.tsx +24 -0
  222. package/docs/data-entry/input.tsx +46 -1
  223. package/docs/data-entry/month-range-picker.tsx +1 -1
  224. package/docs/data-entry/select.tsx +27 -0
  225. package/docs/data-entry/switch.tsx +41 -0
  226. package/docs/data-entry/textarea.tsx +38 -0
  227. package/docs/data-entry/time-picker.tsx +85 -1
  228. package/docs/data-entry/time-range-picker.tsx +55 -0
  229. package/docs/data-entry/transfer.tsx +17 -0
  230. package/docs/data-entry/upload.tsx +56 -12
  231. package/docs/feedback/tooltip.tsx +1 -1
  232. package/docs/general/activity.tsx +2 -2
  233. package/docs/general/button/index.tsx +14 -1
  234. package/docs/general/typography.tsx +14 -1
  235. package/docs/layout/app-launcher.tsx +151 -0
  236. package/docs/layout/app-shell.tsx +11 -0
  237. package/docs/layout/flex.tsx +50 -0
  238. package/docs/layout/responsive-grid.tsx +21 -1
  239. package/docs/layout/topbar.tsx +5 -9
  240. package/docs/navigation/app-setting-picker.tsx +11 -0
  241. package/docs/navigation/breadcrumb.tsx +48 -0
  242. package/docs/navigation/dropdown-menu.tsx +21 -0
  243. package/docs/navigation/pagination.tsx +52 -0
  244. package/docs/navigation/steps.tsx +37 -0
  245. package/docs/navigation/tabs.tsx +97 -1
  246. package/docs/query/button-refetch.tsx +1 -0
  247. package/package.json +19 -2
  248. package/scripts/_agent-setup.mjs +19 -2
  249. package/scripts/init-guinea-pig.mjs +26 -4
  250. package/scripts/ui-audit.mjs +243 -30
@@ -23,7 +23,8 @@
23
23
  },
24
24
  "datePicker": {
25
25
  "placeholder": "日付を選択",
26
- "openCalendar": "カレンダーを開く"
26
+ "openCalendar": "カレンダーを開く",
27
+ "quarter": "第{quarter}四半期"
27
28
  },
28
29
  "dateRangePicker": {
29
30
  "placeholder": "期間を選択",
@@ -39,7 +40,10 @@
39
40
  "openPicker": "時刻を選択",
40
41
  "meridiem": "午前/午後",
41
42
  "am": "午前",
42
- "pm": "午後"
43
+ "pm": "午後",
44
+ "now": "現在時刻",
45
+ "confirm": "確定",
46
+ "second": "秒"
43
47
  },
44
48
  "searchInput": {
45
49
  "placeholder": "検索…"
@@ -55,7 +59,7 @@
55
59
  "upload": {
56
60
  "dropzoneLabel": "ファイルをアップロード",
57
61
  "dropzoneHint": "ここにドラッグ&ドロップ、またはクリックして選択",
58
- "dropzoneMeta": "一時ストレージに保存 — フォーム保存時に promote",
62
+ "dropzoneMeta": "選択したファイルはここに表示されます。",
59
63
  "buttonLabel": "ファイルを選択",
60
64
  "addImage": "画像を追加",
61
65
  "uploading": "アップロード中…",
@@ -75,7 +79,17 @@
75
79
  "statusFailed": "{count} 件のアップロードに失敗",
76
80
  "removeImage": "画像を削除",
77
81
  "removeFile": "{name} を削除",
78
- "cropDescription": "ズームスライダーを調整し、保存すると写真を正方形に切り抜きます。"
82
+ "cropDescription": "ズームスライダーを調整し、保存すると写真を正方形に切り抜きます。",
83
+ "preview": "プレビュー",
84
+ "download": "ダウンロード",
85
+ "retry": "再試行",
86
+ "start": "アップロード",
87
+ "cancel": "キャンセル",
88
+ "rejectAccept": "{name}: 許可されていない形式です。",
89
+ "rejectSize": "{name}: ファイルが大きすぎます。",
90
+ "rejectCount": "{name}: ファイル数の上限です。",
91
+ "rejectBeforeUpload": "{name}: ファイルの検証に失敗しました。",
92
+ "readFailed": "選択したフォルダーを読み取れませんでした。"
79
93
  },
80
94
  "cascader": {
81
95
  "placeholder": "選択…",
@@ -109,6 +123,9 @@
109
123
  "empty": "該当なし",
110
124
  "error": "選択肢を読み込めませんでした"
111
125
  },
126
+ "selection": {
127
+ "overflow": "他{count}件"
128
+ },
112
129
  "monthPicker": {
113
130
  "openGrid": "月選択を開く",
114
131
  "previousYear": "前年へ",
@@ -132,6 +149,14 @@
132
149
  },
133
150
  "formErrors": {
134
151
  "title": "入力内容にエラーがあります"
152
+ },
153
+ "form": {
154
+ "optional": "(任意)",
155
+ "success": "確認済み",
156
+ "warning": "確認してください",
157
+ "error": "入力エラー",
158
+ "validating": "確認中",
159
+ "submitFailed": "フォームを送信できませんでした。再試行してください。"
135
160
  }
136
161
  },
137
162
  "feedback": {
@@ -284,8 +309,13 @@
284
309
  }
285
310
  },
286
311
  "navigation": {
312
+ "tabs": {
313
+ "addTab": "タブを追加",
314
+ "removeTab": "タブを閉じる"
315
+ },
287
316
  "steps": {
288
317
  "ariaLabel": "進行状況",
318
+ "percentLabel": "現在のステップの進捗",
289
319
  "status": {
290
320
  "wait": "未完了",
291
321
  "process": "現在のステップ",
@@ -323,6 +353,7 @@
323
353
  "page": "ページ {page}",
324
354
  "pageSize": "ページサイズ",
325
355
  "pageSizeTrigger": "{size}件",
356
+ "jumpTo": "ページへ移動",
326
357
  "pageSizeOption": "{size} 件/ページ",
327
358
  "total": "全 {total} 件"
328
359
  },
@@ -398,7 +429,19 @@
398
429
  "error": "一覧を取得できませんでした",
399
430
  "errorDescription": "データを取得できませんでした。時間をおいて再試行してください。",
400
431
  "denied": "この一覧を表示する権限がありません",
401
- "deniedDescription": "閲覧するには管理者に権限の付与を依頼してください。"
432
+ "deniedDescription": "閲覧するには管理者に権限の付与を依頼してください。",
433
+ "selectInvert": "選択を反転",
434
+ "selectNone": "選択を解除",
435
+ "selectionMenu": "選択オプション",
436
+ "filterColumn": "絞り込み",
437
+ "filterReset": "絞り込みを解除",
438
+ "expandColumn": "展開",
439
+ "expandRow": "行を展開",
440
+ "collapseRow": "行を折りたたむ",
441
+ "sortAscending": "昇順に並べ替え",
442
+ "sortDescending": "降順に並べ替え",
443
+ "sortCancel": "並べ替えを解除",
444
+ "selectColumn": "選択"
402
445
  },
403
446
  "dataGrid": {
404
447
  "search": "検索",
@@ -466,5 +509,13 @@
466
509
  "summaryPie": "{slices}区分の円グラフ",
467
510
  "summaryTrend": "{points}データ点の推移棒グラフ",
468
511
  "trendCurrent": "現在"
512
+ },
513
+ "rangeTimeline": {
514
+ "outsideRange": "表示範囲外",
515
+ "schedule": "スケジュール"
516
+ },
517
+ "textExamples": {
518
+ "preservedText": "プレーンテキスト",
519
+ "sampleText": "最初の行\n 字下げした行\n\n最後の行"
469
520
  }
470
521
  }
@@ -23,7 +23,8 @@
23
23
  },
24
24
  "datePicker": {
25
25
  "placeholder": "Chọn ngày",
26
- "openCalendar": "Mở lịch"
26
+ "openCalendar": "Mở lịch",
27
+ "quarter": "Quý {quarter}"
27
28
  },
28
29
  "dateRangePicker": {
29
30
  "placeholder": "Chọn khoảng ngày",
@@ -39,7 +40,10 @@
39
40
  "openPicker": "Mở chọn giờ",
40
41
  "meridiem": "Buổi",
41
42
  "am": "SA",
42
- "pm": "CH"
43
+ "pm": "CH",
44
+ "now": "Bây giờ",
45
+ "confirm": "Chọn",
46
+ "second": "Giây"
43
47
  },
44
48
  "searchInput": {
45
49
  "placeholder": "Tìm kiếm…"
@@ -55,7 +59,7 @@
55
59
  "upload": {
56
60
  "dropzoneLabel": "Tải file lên",
57
61
  "dropzoneHint": "Kéo thả file vào đây, hoặc bấm để chọn",
58
- "dropzoneMeta": "Upload vào temp promote khi lưu form",
62
+ "dropzoneMeta": "Tệp đã chọn sẽ hiển thị tại đây.",
59
63
  "buttonLabel": "Chọn file",
60
64
  "addImage": "Thêm ảnh",
61
65
  "uploading": "Đang tải lên…",
@@ -75,7 +79,17 @@
75
79
  "statusFailed": "{count} tệp tải lên thất bại",
76
80
  "removeImage": "Xóa ảnh",
77
81
  "removeFile": "Xóa {name}",
78
- "cropDescription": "Kéo thanh thu phóng rồi lưu để cắt ảnh thành hình vuông."
82
+ "cropDescription": "Kéo thanh thu phóng rồi lưu để cắt ảnh thành hình vuông.",
83
+ "preview": "Xem trước",
84
+ "download": "Tải xuống",
85
+ "retry": "Thử lại",
86
+ "start": "Tải lên",
87
+ "cancel": "Huỷ",
88
+ "rejectAccept": "{name}: loại tệp không được phép.",
89
+ "rejectSize": "{name}: tệp quá lớn.",
90
+ "rejectCount": "{name}: đã đủ số lượng tệp.",
91
+ "rejectBeforeUpload": "{name}: kiểm tra tệp thất bại.",
92
+ "readFailed": "Không thể đọc thư mục đã chọn."
79
93
  },
80
94
  "cascader": {
81
95
  "placeholder": "Chọn…",
@@ -109,6 +123,9 @@
109
123
  "empty": "Không có kết quả",
110
124
  "error": "Không tải được lựa chọn"
111
125
  },
126
+ "selection": {
127
+ "overflow": "+{count}"
128
+ },
112
129
  "monthPicker": {
113
130
  "openGrid": "Mở chọn tháng",
114
131
  "previousYear": "Năm trước",
@@ -132,6 +149,14 @@
132
149
  },
133
150
  "formErrors": {
134
151
  "title": "Dữ liệu nhập có lỗi, vui lòng kiểm tra"
152
+ },
153
+ "form": {
154
+ "optional": "(không bắt buộc)",
155
+ "success": "Hợp lệ",
156
+ "warning": "Cần kiểm tra",
157
+ "error": "Không hợp lệ",
158
+ "validating": "Đang kiểm tra",
159
+ "submitFailed": "Không thể gửi biểu mẫu. Vui lòng thử lại."
135
160
  }
136
161
  },
137
162
  "feedback": {
@@ -284,8 +309,13 @@
284
309
  }
285
310
  },
286
311
  "navigation": {
312
+ "tabs": {
313
+ "addTab": "Thêm tab",
314
+ "removeTab": "Đóng tab"
315
+ },
287
316
  "steps": {
288
317
  "ariaLabel": "Tiến trình",
318
+ "percentLabel": "Tiến độ bước hiện tại",
289
319
  "status": {
290
320
  "wait": "Đang chờ",
291
321
  "process": "Bước hiện tại",
@@ -323,6 +353,7 @@
323
353
  "page": "Trang {page}",
324
354
  "pageSize": "Số dòng mỗi trang",
325
355
  "pageSizeTrigger": "{size} / trang",
356
+ "jumpTo": "Tới trang",
326
357
  "pageSizeOption": "{size} / trang",
327
358
  "total": "Tổng {total} mục"
328
359
  },
@@ -398,7 +429,19 @@
398
429
  "error": "Không tải được danh sách này",
399
430
  "errorDescription": "Không lấy được dữ liệu. Vui lòng thử lại sau giây lát.",
400
431
  "denied": "Bạn không có quyền xem danh sách này",
401
- "deniedDescription": "Hãy đề nghị quản trị viên cấp quyền xem các bản ghi này."
432
+ "deniedDescription": "Hãy đề nghị quản trị viên cấp quyền xem các bản ghi này.",
433
+ "selectInvert": "Đảo lựa chọn",
434
+ "selectNone": "Bỏ chọn tất cả",
435
+ "selectionMenu": "Tuỳ chọn lựa chọn",
436
+ "filterColumn": "Lọc",
437
+ "filterReset": "Bỏ lọc",
438
+ "expandColumn": "Mở rộng",
439
+ "expandRow": "Mở rộng hàng",
440
+ "collapseRow": "Thu gọn hàng",
441
+ "sortAscending": "Sắp xếp tăng dần",
442
+ "sortDescending": "Sắp xếp giảm dần",
443
+ "sortCancel": "Bỏ sắp xếp",
444
+ "selectColumn": "Chọn"
402
445
  },
403
446
  "dataGrid": {
404
447
  "search": "Tìm kiếm",
@@ -466,5 +509,13 @@
466
509
  "summaryPie": "Biểu đồ tròn gồm {slices} phần",
467
510
  "summaryTrend": "Biểu đồ cột xu hướng gồm {points} điểm dữ liệu",
468
511
  "trendCurrent": "hiện tại"
512
+ },
513
+ "rangeTimeline": {
514
+ "outsideRange": "Ngoài khoảng đang xem",
515
+ "schedule": "Lịch công việc"
516
+ },
517
+ "textExamples": {
518
+ "preservedText": "Văn bản thuần",
519
+ "sampleText": "Dòng đầu\n Dòng thụt vào\n\nDòng cuối"
469
520
  }
470
521
  }
@@ -11,6 +11,7 @@ export interface InertiaFormLike<TData extends Record<string, unknown> = Record<
11
11
  errors: Partial<Record<string, string>>;
12
12
  /** True while a submit request is in flight. */
13
13
  processing: boolean;
14
+ reset?(): void;
14
15
  }
15
16
  /**
16
17
  * Wrap an Inertia `useForm()` object as a framework-agnostic {@link FormStateAdapter} so it drives
@@ -105,3 +106,22 @@ export interface InertiaLinkLike {
105
106
  * ```
106
107
  */
107
108
  export declare function inertiaSidebarLink<P extends InertiaLinkLike>(Link: ComponentType<P>): SidebarLinkComponentProp;
109
+ /** Visit callbacks needed to connect Upload to an Inertia multipart endpoint. */
110
+ export interface InertiaUploadCallbacks {
111
+ forceFormData: true;
112
+ async: true;
113
+ onProgress: (progress: {
114
+ percentage?: number;
115
+ } | undefined) => void;
116
+ onSuccess: () => void;
117
+ onError: (errors: Record<string, string>) => void;
118
+ onCancelToken: (token: {
119
+ cancel: () => void;
120
+ }) => void;
121
+ onCancel: () => void;
122
+ onNetworkError: (error: Error) => boolean;
123
+ onHttpException: () => boolean;
124
+ onFinish: () => void;
125
+ }
126
+ /** Bridge redirect-based Inertia uploads to Upload's progress/abort/retry lifecycle. */
127
+ export declare function inertiaUpload(send: (file: File, callbacks: InertiaUploadCallbacks) => void, errorMessage: string): NonNullable<import("../props/components/data-entry.prop.js").UploadProp["onUpload"]>;
@@ -6,7 +6,8 @@ function inertiaAdapter(form) {
6
6
  setValue: (name, value) => form.setData(name, value),
7
7
  getError: (name) => form.errors[name],
8
8
  isSubmitting: form.processing,
9
- getValues: () => form.data
9
+ getValues: () => form.data,
10
+ reset: form.reset ? () => form.reset?.() : void 0
10
11
  };
11
12
  }
12
13
  function useInertiaField(form, name) {
@@ -20,8 +21,66 @@ function useInertiaField(form, name) {
20
21
  function inertiaSidebarLink(Link) {
21
22
  return createSidebarLink(Link, "href");
22
23
  }
24
+ function inertiaUpload(send, errorMessage) {
25
+ return (file, _item, context) => new Promise((resolve, reject) => {
26
+ let cancel;
27
+ let settled = false;
28
+ const abort = () => {
29
+ cancel?.();
30
+ fail(new DOMException("Upload aborted", "AbortError"));
31
+ };
32
+ const cleanup = () => context.signal.removeEventListener("abort", abort);
33
+ const fail = (error) => {
34
+ if (settled) return;
35
+ settled = true;
36
+ cleanup();
37
+ reject(error);
38
+ };
39
+ if (context.signal.aborted) {
40
+ abort();
41
+ return;
42
+ }
43
+ context.signal.addEventListener("abort", abort, { once: true });
44
+ try {
45
+ send(file, {
46
+ forceFormData: true,
47
+ async: true,
48
+ onProgress: (progress) => {
49
+ if (!settled) context.onProgress(progress?.percentage ?? 0);
50
+ },
51
+ onSuccess: () => {
52
+ if (!settled) {
53
+ settled = true;
54
+ cleanup();
55
+ resolve({});
56
+ }
57
+ },
58
+ onError: (errors) => fail(new Error(Object.values(errors)[0] ?? errorMessage)),
59
+ onCancelToken: (token) => {
60
+ cancel = token.cancel;
61
+ if (context.signal.aborted) token.cancel();
62
+ },
63
+ onCancel: () => fail(new DOMException("Upload aborted", "AbortError")),
64
+ onNetworkError: () => {
65
+ fail(new Error(errorMessage));
66
+ return false;
67
+ },
68
+ onHttpException: () => {
69
+ fail(new Error(errorMessage));
70
+ return false;
71
+ },
72
+ onFinish: () => {
73
+ if (!settled) fail(new Error(errorMessage));
74
+ }
75
+ });
76
+ } catch (error) {
77
+ fail(error);
78
+ }
79
+ });
80
+ }
23
81
  export {
24
82
  inertiaAdapter,
25
83
  inertiaSidebarLink,
84
+ inertiaUpload,
26
85
  useInertiaField
27
86
  };
@@ -1,18 +1,40 @@
1
1
  /** Shared control sizing — reads `--control-height`, `--font-size-*` from density / theme. */
2
- export declare const controlMultilineClass = "ui-control-multiline aria-invalid:border-destructive w-full rounded-[var(--control-radius)] border-input bg-background ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none";
2
+ export declare const controlMultilineClass = "ui-control-multiline aria-invalid:border-destructive data-[status=error]:border-destructive data-[status=warning]:border-warning w-full rounded-[var(--control-radius)] border-input bg-background ring-offset-background placeholder:text-muted-foreground";
3
3
  /**
4
4
  * Multiline control with its own chrome removed, for a textarea EMBEDDED in a surface that already
5
5
  * draws the box — a chat composer inside a Card, an inline edit cell, a comment box in a panel.
6
6
  * Two nested rounded borders is the tell that this was missing.
7
7
  */
8
- export declare const controlMultilineGhostClass = "ui-control-multiline w-full min-h-0 border-0 bg-transparent shadow-none placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-0";
8
+ export declare const controlMultilineGhostClass = "ui-control-multiline data-[status=error]:border-destructive data-[status=warning]:border-warning w-full min-h-0 border-0 bg-transparent shadow-none placeholder:text-muted-foreground focus-visible:ring-0";
9
+ /**
10
+ * Multiline control drawn as antd's `filled` variant — a tinted surface instead of a boundary.
11
+ *
12
+ * It is a SEPARATE string rather than `controlMultilineClass` plus a modifier because
13
+ * `bg-background` lives in `@layer utilities`, which outranks every component-layer rule: a
14
+ * `.ui-control--filled` appended to the outlined list would be silently overpainted and no gate
15
+ * would catch it. The two lists differ only in which chrome utilities they carry.
16
+ */
17
+ export declare const controlMultilineFilledClass = "ui-control-multiline ui-control--filled aria-invalid:border-destructive data-[status=error]:border-destructive data-[status=warning]:border-warning w-full rounded-[var(--control-radius)] ring-offset-background placeholder:text-muted-foreground";
9
18
  /**
10
19
  * Open-state ring for popup-style triggers (Select / Cascader / TreeSelect / SearchSelect). Radix
11
20
  * moves focus INTO the popup on open, so the trigger loses `:focus-visible` and — without this —
12
21
  * an open popover shows only a border change (no ring), inconsistent with a focused Input.
13
22
  */
14
23
  export declare const controlOpenRingClass = "ui-control-trigger";
15
- export declare const controlTriggerClass = "ui-control ui-control-trigger flex items-center justify-between gap-2 whitespace-nowrap rounded-[var(--control-radius)] border-input bg-background transition-[color,box-shadow] focus-visible:outline-none [&>[data-slot=select-value]]:line-clamp-1";
24
+ /**
25
+ * The trigger WITHOUT a surface — no `border-input`, no `bg-background`.
26
+ *
27
+ * Those two are Tailwind utilities, and `@layer utilities` beats `@layer components`, so a
28
+ * `[data-variant]` / `[data-status]` rule in control.css can never recolour a trigger that carries
29
+ * them (the same trap that killed `.ui-app-setting-picker-icon` in gh#366 and
30
+ * `--control-bounded-width` in gh#375). A control that wants the antd `variant` × `status` matrix
31
+ * therefore composes THIS class plus `ui-control-surface`, which supplies the identical resting
32
+ * border and fill from `--control-surface-*`.
33
+ */
34
+ export declare const controlTriggerBaseClass = "ui-control ui-control-trigger flex items-center justify-between gap-2 whitespace-nowrap rounded-[var(--control-radius)] transition-[color,box-shadow] [&>[data-slot=select-value]]:line-clamp-1";
35
+ export declare const controlTriggerClass = "ui-control ui-control-trigger flex items-center justify-between gap-2 whitespace-nowrap rounded-[var(--control-radius)] transition-[color,box-shadow] [&>[data-slot=select-value]]:line-clamp-1 border-input bg-background";
36
+ /** `controlTriggerBaseClass` + the token-driven surface — the select-family trigger. */
37
+ export declare const controlSurfaceTriggerClass = "ui-control ui-control-trigger flex items-center justify-between gap-2 whitespace-nowrap rounded-[var(--control-radius)] transition-[color,box-shadow] [&>[data-slot=select-value]]:line-clamp-1 ui-control-surface";
16
38
  export declare const controlIconClass = "size-[length:var(--control-height)] shrink-0";
17
39
  export declare const controlIconSmClass = "size-[calc(var(--control-height)-0.5rem)] shrink-0";
18
40
  /** Leading/affix icon inside an input row (search, command) — sized to `--control-icon-size`. */
@@ -1,7 +1,10 @@
1
- const controlMultilineClass = "ui-control-multiline aria-invalid:border-destructive w-full rounded-[var(--control-radius)] border-input bg-background ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none";
2
- const controlMultilineGhostClass = "ui-control-multiline w-full min-h-0 border-0 bg-transparent shadow-none placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-0";
1
+ const controlMultilineClass = "ui-control-multiline aria-invalid:border-destructive data-[status=error]:border-destructive data-[status=warning]:border-warning w-full rounded-[var(--control-radius)] border-input bg-background ring-offset-background placeholder:text-muted-foreground";
2
+ const controlMultilineGhostClass = "ui-control-multiline data-[status=error]:border-destructive data-[status=warning]:border-warning w-full min-h-0 border-0 bg-transparent shadow-none placeholder:text-muted-foreground focus-visible:ring-0";
3
+ const controlMultilineFilledClass = "ui-control-multiline ui-control--filled aria-invalid:border-destructive data-[status=error]:border-destructive data-[status=warning]:border-warning w-full rounded-[var(--control-radius)] ring-offset-background placeholder:text-muted-foreground";
3
4
  const controlOpenRingClass = "ui-control-trigger";
4
- const controlTriggerClass = "ui-control ui-control-trigger flex items-center justify-between gap-2 whitespace-nowrap rounded-[var(--control-radius)] border-input bg-background transition-[color,box-shadow] focus-visible:outline-none [&>[data-slot=select-value]]:line-clamp-1";
5
+ const controlTriggerBaseClass = "ui-control ui-control-trigger flex items-center justify-between gap-2 whitespace-nowrap rounded-[var(--control-radius)] transition-[color,box-shadow] [&>[data-slot=select-value]]:line-clamp-1";
6
+ const controlTriggerClass = `${controlTriggerBaseClass} border-input bg-background`;
7
+ const controlSurfaceTriggerClass = `${controlTriggerBaseClass} ui-control-surface`;
5
8
  const controlIconClass = "size-[length:var(--control-height)] shrink-0";
6
9
  const controlIconSmClass = "size-[calc(var(--control-height)-0.5rem)] shrink-0";
7
10
  const controlIconLeadingClass = "size-[length:var(--control-icon-size)] shrink-0";
@@ -20,8 +23,11 @@ export {
20
23
  controlIconLeadingClass,
21
24
  controlIconSmClass,
22
25
  controlMultilineClass,
26
+ controlMultilineFilledClass,
23
27
  controlMultilineGhostClass,
24
28
  controlOpenRingClass,
29
+ controlSurfaceTriggerClass,
30
+ controlTriggerBaseClass,
25
31
  controlTriggerClass,
26
32
  tableCellPaddingClass,
27
33
  tableHeadHeightClass,
@@ -0,0 +1,8 @@
1
+ import { type Locale } from "date-fns";
2
+ import type { DatePickerBaseProp, PickerDateFormatProp } from "../../props/components/data-entry.prop.js";
3
+ /** Display is independent from the canonical value submitted by the field. */
4
+ export declare function formatPickerDate(date: Date | undefined, format: PickerDateFormatProp | undefined, locale: string, withTime?: boolean): string;
5
+ export declare function parsePickerDate(text: string, format: PickerDateFormatProp | undefined, parser?: (text: string) => Date | undefined, withTime?: boolean): Date | undefined;
6
+ export declare function pickerDateAllowed(date: Date, min: Date | undefined, max: Date | undefined, disabled?: (date: Date) => boolean): boolean;
7
+ /** Normalize a reporting period with the active calendar's week convention. */
8
+ export declare function pickerPeriodStart(date: Date, picker: DatePickerBaseProp["picker"], locale: Pick<Locale, "options">): Date;
@@ -0,0 +1,54 @@
1
+ import {
2
+ format as formatDate,
3
+ isValid,
4
+ parse,
5
+ startOfDay,
6
+ startOfWeek,
7
+ startOfMonth,
8
+ startOfQuarter,
9
+ startOfYear
10
+ } from "date-fns";
11
+ import { parseDateInput, toIsoDate } from "./parse.js";
12
+ function formatPickerDate(date, format, locale, withTime = false) {
13
+ if (!date || !isValid(date)) return "";
14
+ if (typeof format === "function") return format(date);
15
+ if (typeof format === "object") return new Intl.DateTimeFormat(locale, format).format(date);
16
+ if (typeof format === "string") return formatDate(date, format);
17
+ return withTime ? formatDate(date, "yyyy-MM-dd HH:mm") : toIsoDate(date);
18
+ }
19
+ function parsePickerDate(text, format, parser, withTime = false) {
20
+ const raw = text.trim();
21
+ if (!raw) return void 0;
22
+ const custom = parser?.(raw);
23
+ if (custom && isValid(custom)) return custom;
24
+ const pattern = typeof format === "string" ? format : withTime ? "yyyy-MM-dd HH:mm" : void 0;
25
+ if (pattern) {
26
+ const parsed = parse(raw, pattern, new Date(2e3, 0, 1));
27
+ if (isValid(parsed) && formatDate(parsed, pattern) === raw) return parsed;
28
+ }
29
+ if (withTime || !/^\d{4}-\d{2}-\d{2}$/.test(raw)) return void 0;
30
+ return parseDateInput(raw) ?? void 0;
31
+ }
32
+ function pickerDateAllowed(date, min, max, disabled) {
33
+ return isValid(date) && (!min || startOfDay(date) >= startOfDay(min)) && (!max || startOfDay(date) <= startOfDay(max)) && !disabled?.(date);
34
+ }
35
+ function pickerPeriodStart(date, picker, locale) {
36
+ switch (picker) {
37
+ case "week":
38
+ return startOfWeek(date, { locale });
39
+ case "month":
40
+ return startOfMonth(date);
41
+ case "quarter":
42
+ return startOfQuarter(date);
43
+ case "year":
44
+ return startOfYear(date);
45
+ default:
46
+ return date;
47
+ }
48
+ }
49
+ export {
50
+ formatPickerDate,
51
+ parsePickerDate,
52
+ pickerDateAllowed,
53
+ pickerPeriodStart
54
+ };
@@ -22,6 +22,13 @@ type ChartCartesianBase = {
22
22
  categoryKey: string;
23
23
  /** Accessible name + visible caption for the chart. REQUIRED (role="img" needs a name). */
24
24
  label: LabelProp;
25
+ /**
26
+ * Paint `label` as a visible caption above the plot. Set `false` when the chart already sits
27
+ * under a heading that says the same thing (a `CardTitle`, a section `<h2>`): the caption stays
28
+ * in the DOM as `sr-only`, so `role="img"` keeps its accessible name and only the duplicated
29
+ * visible title goes away.
30
+ */
31
+ showCaption?: boolean;
25
32
  /** Extra context appended to the screen-reader description. */
26
33
  description?: DescriptionProp;
27
34
  /** Canvas height preset — `xs|sm|md|lg`. Ignored when `height` is set. */
@@ -67,6 +74,13 @@ export type CompactBarTrendProp = {
67
74
  valueKey: string;
68
75
  /** Accessible name + visible caption for the chart. REQUIRED (role="img" needs a name). */
69
76
  label: LabelProp;
77
+ /**
78
+ * Paint `label` as a visible caption above the plot. Set `false` when the chart already sits
79
+ * under a heading that says the same thing (a `CardTitle`, a section `<h2>`): the caption stays
80
+ * in the DOM as `sr-only`, so `role="img"` keeps its accessible name and only the duplicated
81
+ * visible title goes away.
82
+ */
83
+ showCaption?: boolean;
70
84
  /** Extra context appended to the screen-reader description. */
71
85
  description?: DescriptionProp;
72
86
  /** Plot-height tier — `xs|sm|md|lg`. Defaults to `xs` (dashboard summary-card density). */
@@ -107,6 +121,13 @@ export type PieChartProp = {
107
121
  colors?: string[];
108
122
  /** Accessible name + visible caption for the chart. REQUIRED. */
109
123
  label: LabelProp;
124
+ /**
125
+ * Paint `label` as a visible caption above the plot. Set `false` when the chart already sits
126
+ * under a heading that says the same thing (a `CardTitle`, a section `<h2>`): the caption stays
127
+ * in the DOM as `sr-only`, so `role="img"` keeps its accessible name and only the duplicated
128
+ * visible title goes away.
129
+ */
130
+ showCaption?: boolean;
110
131
  /** Extra context appended to the screen-reader description. */
111
132
  description?: DescriptionProp;
112
133
  /** Canvas height preset — `xs|sm|md|lg`. Ignored when `height` is set. */
@@ -7,7 +7,9 @@ export type CodeBlockProp = {
7
7
  /** Soft-wrap long lines (default true). `false` scrolls horizontally instead. */
8
8
  wrap?: boolean;
9
9
  /** Scroll inside the block past this height. Default `none` (grows with the content). */
10
- maxHeight?: "sm" | "md" | "lg" | "none";
10
+ maxHeight?: "sm" | "md" | "lg" | "none" | {
11
+ value: string;
12
+ };
11
13
  /** Type size. Default `sm`. */
12
14
  size?: Extract<SizeProp, "xs" | "sm">;
13
15
  /** Cosmetic: lands on `data-language`; no highlighter is bundled. */
@@ -26,7 +28,7 @@ export type ProseProp = {
26
28
  className?: ClassNameProp;
27
29
  children?: ChildrenProp;
28
30
  };
29
- import type { ActionProp, ClassNameProp, DescriptionProp, IconProp, TitleProp, ColumnDefProp, GetRowIdProp, OnRowClickProp, OnSelectChangeProp, OnSortChangeProp, OnTableDensityChangeProp, SelectedIdsProp, SortStateProp, TableDensityProp, TablePresetProp, BreakpointProp, DensityProp, ChildrenProp, ToneProp, AvatarShapeProp, HeadingLevelProp, HandlerProp, SizeProp, LabelProp, IdProp, DescriptionsLayoutProp } from "../vocabulary/index.js";
31
+ import type { ActionProp, ClassNameProp, DescriptionProp, IconProp, TitleProp, ColumnDefProp, GetRowIdProp, OnRowClickProp, OnSelectChangeProp, OnSortChangeProp, OnTableDensityChangeProp, SelectedIdsProp, SortStateProp, TableDensityProp, TablePresetProp, BreakpointProp, DensityProp, ChildrenProp, ToneProp, AvatarShapeProp, HeadingLevelProp, HandlerProp, SizeProp, LabelProp, IdProp, DescriptionsLayoutProp, DescriptionsColumnProp, DescriptionsSpanProp, DescriptionsItemsProp, SortDirectionProp, OnColumnFilterChangeProp, OnRowProp, TableExpandableProp, TableRowSelectionProp, TableScrollProp, TableStickyProp, TableSummaryProp } from "../vocabulary/index.js";
30
32
  /**
31
33
  * One key in a `Legend`: a tone, and the words that tone stands for.
32
34
  *
@@ -77,18 +79,28 @@ export type EmptyStateProp = {
77
79
  */
78
80
  export type DescriptionsProp = {
79
81
  /** `Descriptions.Item` children — one label/value pair each. */
80
- children: React.ReactNode;
81
- columns?: 1 | 2 | 3;
82
+ children?: React.ReactNode;
83
+ /**
84
+ * Column count. `1 | 2 | 3` keeps this library's own mobile-first ladder; any other number, or
85
+ * antd's responsive `{ sm, md, lg, xl }` object, drives the token-published grid instead.
86
+ */
87
+ columns?: DescriptionsColumnProp;
82
88
  /** Label placement within each item. Default `vertical` (label over value). */
83
89
  layout?: DescriptionsLayoutProp;
84
90
  /** Label text alignment inside the label column. Applies only to `layout="horizontal"`. */
85
91
  labelAlign?: "start" | "end";
92
+ /** Draw the grid as a bordered table with shaded label cells (antd `bordered`). */
93
+ bordered?: boolean;
94
+ /** Declarative items (antd `items`) — the alternative to composing `Descriptions.Item`. */
95
+ items?: DescriptionsItemsProp;
86
96
  className?: ClassNameProp;
87
97
  };
88
98
  export type DescriptionsItemProp = {
89
99
  label: React.ReactNode;
90
100
  value: React.ReactNode;
91
101
  mono?: boolean;
102
+ /** Columns this item occupies — number | `"filled"` | responsive object (antd `span`). */
103
+ span?: DescriptionsSpanProp;
92
104
  };
93
105
  /**
94
106
  * @see Avatar
@@ -264,6 +276,26 @@ export type DataTableProp<T> = {
264
276
  * measures. Default `"sm"`.
265
277
  */
266
278
  collapseBelow?: BreakpointProp;
279
+ /** Full row-selection configuration (antd `rowSelection`). */
280
+ rowSelection?: TableRowSelectionProp<T>;
281
+ /** Expandable detail rows (antd `expandable`). */
282
+ expandable?: TableExpandableProp<T>;
283
+ /** Footer totals row, rendered in a real `<tfoot>` (antd `summary`). */
284
+ summary?: TableSummaryProp<T>;
285
+ /** Scroll envelope — `x` a minimum inline size, `y` a maximum body block size (antd `scroll`). */
286
+ scroll?: TableScrollProp;
287
+ /** Sticky header; the object form carries `offsetHeader` (antd `sticky`). */
288
+ sticky?: TableStickyProp;
289
+ /** Per-row DOM props merged onto the `<tr>` (antd `onRow`). */
290
+ onRow?: OnRowProp<T>;
291
+ /** Outer frame + vertical rules between columns (antd `bordered`). */
292
+ bordered?: boolean;
293
+ /** Explain the next sort step in a tooltip on sortable headers (antd `showSorterTooltip`). */
294
+ showSorterTooltip?: boolean;
295
+ /** Table-wide sort cycle; a column's own `sortDirections` wins (antd `sortDirections`). */
296
+ sortDirections?: SortDirectionProp[];
297
+ /** Column filters changed — pair with a column's `filteredValue` for server filtering. */
298
+ onFilterChange?: OnColumnFilterChangeProp;
267
299
  className?: ClassNameProp;
268
300
  children?: ChildrenProp;
269
301
  };
@@ -362,7 +394,26 @@ export type PermissionMatrixProp = {
362
394
  */
363
395
  export type ScrollAreaAnchorProp = "none" | "bottom";
364
396
  /** @see ScrollArea */
397
+ /**
398
+ * @see ScrollArea — which AXES scroll. This is not decoration: Radix sets the viewport's
399
+ * `overflowX`/`overflowY` inline from which scrollbars are mounted, so an axis with no `ScrollBar`
400
+ * is `overflow: hidden` and its content is CLIPPED, not merely un-barred.
401
+ *
402
+ * `both` is a third value rather than an array or a pair of booleans because the axes are one
403
+ * decision — a pane scrolls down, across, or freely — and a closed union is what `check:prop-vocabulary`
404
+ * and the MCP catalog can carry.
405
+ */
406
+ export type ScrollAreaOrientationProp = "vertical" | "horizontal" | "both";
365
407
  export type ScrollAreaProp = {
408
+ /**
409
+ * Axes that scroll, and therefore which scrollbars render. Default `vertical` — the previous
410
+ * behaviour, unchanged.
411
+ *
412
+ * Reach for `horizontal` for a strip of non-shrinking columns (a board, a lane of cards): the
413
+ * viewport keeps its tab stop, so the strip is scrollable from the keyboard, and the consumer
414
+ * writes no overflow styling of its own.
415
+ */
416
+ orientation?: ScrollAreaOrientationProp;
366
417
  /**
367
418
  * Ref to the element that actually SCROLLS — the Radix viewport — not the root. The root is
368
419
  * `overflow: hidden` and never scrolls, so the component's own `ref` cannot serve.