@godxjp/ui 19.6.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 (326) 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 +14 -3
  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/collapsible.d.ts +23 -4
  20. package/dist/components/data-display/collapsible.js +119 -4
  21. package/dist/components/data-display/data-table.d.ts +39 -4
  22. package/dist/components/data-display/data-table.js +802 -270
  23. package/dist/components/data-display/descriptions.d.ts +27 -6
  24. package/dist/components/data-display/descriptions.js +58 -17
  25. package/dist/components/data-display/index.d.ts +5 -1
  26. package/dist/components/data-display/index.js +4 -0
  27. package/dist/components/data-display/legend.d.ts +15 -0
  28. package/dist/components/data-display/legend.js +11 -0
  29. package/dist/components/data-display/list-row.d.ts +10 -1
  30. package/dist/components/data-display/list-row.js +8 -2
  31. package/dist/components/data-display/popover.d.ts +60 -7
  32. package/dist/components/data-display/popover.js +268 -39
  33. package/dist/components/data-display/progress.d.ts +50 -2
  34. package/dist/components/data-display/progress.js +57 -9
  35. package/dist/components/data-display/range-timeline.d.ts +38 -0
  36. package/dist/components/data-display/range-timeline.js +161 -0
  37. package/dist/components/data-display/scroll-area.js +13 -2
  38. package/dist/components/data-display/service-launcher-card.js +10 -10
  39. package/dist/components/data-display/table.d.ts +11 -3
  40. package/dist/components/data-display/table.js +48 -18
  41. package/dist/components/data-display/tree-list.js +4 -9
  42. package/dist/components/data-entry/calendar.d.ts +2 -2
  43. package/dist/components/data-entry/calendar.js +79 -33
  44. package/dist/components/data-entry/cascader.d.ts +1 -1
  45. package/dist/components/data-entry/cascader.js +188 -24
  46. package/dist/components/data-entry/checkbox.d.ts +19 -6
  47. package/dist/components/data-entry/checkbox.js +55 -16
  48. package/dist/components/data-entry/choice-option.d.ts +1 -1
  49. package/dist/components/data-entry/color-picker.d.ts +1 -1
  50. package/dist/components/data-entry/color-picker.js +17 -5
  51. package/dist/components/data-entry/control-appearance.d.ts +64 -0
  52. package/dist/components/data-entry/control-appearance.js +39 -0
  53. package/dist/components/data-entry/control-surface.d.ts +61 -0
  54. package/dist/components/data-entry/control-surface.js +39 -0
  55. package/dist/components/data-entry/date-picker.d.ts +1 -1
  56. package/dist/components/data-entry/date-picker.js +344 -113
  57. package/dist/components/data-entry/date-range-picker.d.ts +2 -2
  58. package/dist/components/data-entry/date-range-picker.js +278 -140
  59. package/dist/components/data-entry/field.js +0 -1
  60. package/dist/components/data-entry/form-field.d.ts +1 -1
  61. package/dist/components/data-entry/form-field.js +39 -4
  62. package/dist/components/data-entry/form.d.ts +4 -0
  63. package/dist/components/data-entry/form.js +5 -3
  64. package/dist/components/data-entry/index.d.ts +7 -3
  65. package/dist/components/data-entry/index.js +10 -1
  66. package/dist/components/data-entry/input-otp.d.ts +1 -1
  67. package/dist/components/data-entry/input.d.ts +12 -34
  68. package/dist/components/data-entry/input.js +92 -24
  69. package/dist/components/data-entry/label.d.ts +3 -2
  70. package/dist/components/data-entry/label.js +23 -10
  71. package/dist/components/data-entry/month-picker.d.ts +2 -2
  72. package/dist/components/data-entry/month-picker.js +47 -10
  73. package/dist/components/data-entry/month-range-picker.d.ts +2 -2
  74. package/dist/components/data-entry/month-range-picker.js +51 -11
  75. package/dist/components/data-entry/number-input.d.ts +7 -0
  76. package/dist/components/data-entry/number-input.js +147 -98
  77. package/dist/components/data-entry/password-input.d.ts +1 -1
  78. package/dist/components/data-entry/radio.d.ts +1 -1
  79. package/dist/components/data-entry/radio.js +61 -13
  80. package/dist/components/data-entry/search-input.d.ts +1 -1
  81. package/dist/components/data-entry/search-input.js +16 -2
  82. package/dist/components/data-entry/search-select.d.ts +2 -2
  83. package/dist/components/data-entry/search-select.js +209 -78
  84. package/dist/components/data-entry/select.d.ts +22 -4
  85. package/dist/components/data-entry/select.js +215 -163
  86. package/dist/components/data-entry/slider.d.ts +9 -1
  87. package/dist/components/data-entry/slider.js +87 -9
  88. package/dist/components/data-entry/switch.d.ts +3 -0
  89. package/dist/components/data-entry/switch.js +29 -3
  90. package/dist/components/data-entry/textarea.d.ts +14 -56
  91. package/dist/components/data-entry/textarea.js +80 -33
  92. package/dist/components/data-entry/time-picker.d.ts +2 -2
  93. package/dist/components/data-entry/time-picker.js +333 -109
  94. package/dist/components/data-entry/time-range-picker.d.ts +5 -0
  95. package/dist/components/data-entry/time-range-picker.js +89 -0
  96. package/dist/components/data-entry/transfer.d.ts +1 -1
  97. package/dist/components/data-entry/transfer.js +99 -31
  98. package/dist/components/data-entry/tree-select-strategy.d.ts +1 -1
  99. package/dist/components/data-entry/tree-select.d.ts +1 -1
  100. package/dist/components/data-entry/tree-select.js +197 -92
  101. package/dist/components/data-entry/tree-utils.d.ts +1 -1
  102. package/dist/components/data-entry/tree-utils.js +7 -14
  103. package/dist/components/data-entry/upload-files.d.ts +2 -0
  104. package/dist/components/data-entry/upload-files.js +31 -0
  105. package/dist/components/data-entry/upload-request.d.ts +4 -0
  106. package/dist/components/data-entry/upload-request.js +53 -0
  107. package/dist/components/data-entry/upload-types.d.ts +28 -0
  108. package/dist/components/data-entry/upload-types.js +2 -0
  109. package/dist/components/data-entry/upload.d.ts +2 -2
  110. package/dist/components/data-entry/upload.js +482 -117
  111. package/dist/components/feedback/dialog.d.ts +105 -38
  112. package/dist/components/feedback/dialog.js +268 -193
  113. package/dist/components/feedback/overlay-close-focus.d.ts +31 -0
  114. package/dist/components/feedback/overlay-close-focus.js +31 -0
  115. package/dist/components/feedback/overlay-header-tone.d.ts +1 -1
  116. package/dist/components/feedback/sheet.d.ts +53 -11
  117. package/dist/components/feedback/sheet.js +150 -81
  118. package/dist/components/feedback/tooltip.d.ts +51 -7
  119. package/dist/components/feedback/tooltip.js +107 -25
  120. package/dist/components/general/button.d.ts +1 -1
  121. package/dist/components/general/button.js +7 -3
  122. package/dist/components/general/index.d.ts +1 -0
  123. package/dist/components/general/index.js +2 -0
  124. package/dist/components/general/logo.d.ts +17 -0
  125. package/dist/components/general/logo.js +22 -16
  126. package/dist/components/general/typography.d.ts +3 -0
  127. package/dist/components/general/typography.js +15 -1
  128. package/dist/components/general/visually-hidden.d.ts +3 -0
  129. package/dist/components/general/visually-hidden.js +9 -0
  130. package/dist/components/layout/app-launcher.d.ts +34 -0
  131. package/dist/components/layout/app-launcher.js +228 -0
  132. package/dist/components/layout/app-shell.d.ts +3 -1
  133. package/dist/components/layout/app-shell.js +69 -12
  134. package/dist/components/layout/aspect-ratio.js +0 -1
  135. package/dist/components/layout/auth-divider.js +0 -1
  136. package/dist/components/layout/breadcrumb.d.ts +14 -2
  137. package/dist/components/layout/breadcrumb.js +46 -4
  138. package/dist/components/layout/flex.d.ts +1 -1
  139. package/dist/components/layout/flex.js +41 -3
  140. package/dist/components/layout/index.d.ts +3 -0
  141. package/dist/components/layout/index.js +5 -1
  142. package/dist/components/layout/nav-surface.d.ts +26 -0
  143. package/dist/components/layout/nav-surface.js +17 -0
  144. package/dist/components/layout/org-switcher.d.ts +5 -1
  145. package/dist/components/layout/org-switcher.js +25 -4
  146. package/dist/components/layout/page-container.d.ts +1 -1
  147. package/dist/components/layout/page-container.js +5 -3
  148. package/dist/components/layout/responsive-grid.d.ts +16 -2
  149. package/dist/components/layout/responsive-grid.js +29 -2
  150. package/dist/components/layout/separator.js +0 -1
  151. package/dist/components/layout/sidebar.js +4 -1
  152. package/dist/components/layout/split-pane.d.ts +14 -1
  153. package/dist/components/layout/split-pane.js +26 -13
  154. package/dist/components/layout/topbar-item.d.ts +3 -0
  155. package/dist/components/layout/topbar-item.js +19 -5
  156. package/dist/components/layout/topbar.d.ts +1 -1
  157. package/dist/components/layout/topbar.js +27 -6
  158. package/dist/components/navigation/app-setting-picker.js +21 -2
  159. package/dist/components/navigation/app-setting-toggle.d.ts +16 -0
  160. package/dist/components/navigation/app-setting-toggle.js +96 -0
  161. package/dist/components/navigation/dropdown-menu.d.ts +227 -18
  162. package/dist/components/navigation/dropdown-menu.js +402 -118
  163. package/dist/components/navigation/index.d.ts +2 -0
  164. package/dist/components/navigation/index.js +2 -0
  165. package/dist/components/navigation/pagination-utils.d.ts +2 -1
  166. package/dist/components/navigation/pagination.d.ts +2 -2
  167. package/dist/components/navigation/pagination.js +155 -83
  168. package/dist/components/navigation/steps.d.ts +2 -2
  169. package/dist/components/navigation/steps.js +29 -4
  170. package/dist/components/navigation/tabs.d.ts +29 -16
  171. package/dist/components/navigation/tabs.js +374 -144
  172. package/dist/components/ui/accordion.d.ts +50 -5
  173. package/dist/components/ui/accordion.js +239 -33
  174. package/dist/components/ui/aspect-ratio.d.ts +23 -2
  175. package/dist/components/ui/aspect-ratio.js +15 -13
  176. package/dist/components/ui/avatar.d.ts +29 -4
  177. package/dist/components/ui/avatar.js +111 -25
  178. package/dist/components/ui/hover-card.d.ts +42 -4
  179. package/dist/components/ui/hover-card.js +183 -27
  180. package/dist/components/ui/input-otp.d.ts +26 -28
  181. package/dist/components/ui/input-otp.js +50 -7
  182. package/dist/components/ui/label.js +0 -1
  183. package/dist/components/ui/password-input.d.ts +36 -2
  184. package/dist/components/ui/password-input.js +27 -7
  185. package/dist/components/ui/rating.d.ts +25 -0
  186. package/dist/components/ui/rating.js +67 -27
  187. package/dist/components/ui/segmented.d.ts +12 -3
  188. package/dist/components/ui/segmented.js +17 -2
  189. package/dist/components/ui/separator.d.ts +12 -2
  190. package/dist/components/ui/separator.js +30 -9
  191. package/dist/components/ui/tag-input.d.ts +45 -0
  192. package/dist/components/ui/tag-input.js +109 -27
  193. package/dist/components/ui/toggle-group.d.ts +50 -5
  194. package/dist/components/ui/toggle-group.js +79 -20
  195. package/dist/components/ui/toggle.d.ts +31 -5
  196. package/dist/components/ui/toggle.js +42 -3
  197. package/dist/form/form-context.d.ts +29 -0
  198. package/dist/form/form-context.js +44 -4
  199. package/dist/form/form-field-array.d.ts +22 -0
  200. package/dist/form/form-field-array.js +50 -0
  201. package/dist/form/form-field-control.d.ts +2 -1
  202. package/dist/form/form-field-control.js +116 -40
  203. package/dist/form/form-root.d.ts +2 -1
  204. package/dist/form/form-root.js +142 -23
  205. package/dist/form/index.d.ts +3 -1
  206. package/dist/form/index.js +12 -1
  207. package/dist/i18n/messages/en.json +64 -5
  208. package/dist/i18n/messages/ja.json +64 -5
  209. package/dist/i18n/messages/vi.json +64 -5
  210. package/dist/inertia/index.d.ts +20 -0
  211. package/dist/inertia/index.js +60 -1
  212. package/dist/lib/control-styles.d.ts +25 -3
  213. package/dist/lib/control-styles.js +9 -3
  214. package/dist/lib/datetime/picker-format.d.ts +8 -0
  215. package/dist/lib/datetime/picker-format.js +54 -0
  216. package/dist/lib/slot.d.ts +32 -0
  217. package/dist/lib/slot.js +22 -0
  218. package/dist/lib/variants.d.ts +22 -3
  219. package/dist/lib/variants.js +56 -1
  220. package/dist/props/components/app.prop.d.ts +25 -1
  221. package/dist/props/components/charts.prop.d.ts +21 -0
  222. package/dist/props/components/data-display.prop.d.ts +72 -4
  223. package/dist/props/components/data-entry.prop.d.ts +718 -46
  224. package/dist/props/components/form.prop.d.ts +142 -4
  225. package/dist/props/components/general.prop.d.ts +17 -1
  226. package/dist/props/components/index.d.ts +3 -3
  227. package/dist/props/components/layout.prop.d.ts +281 -11
  228. package/dist/props/components/navigation.prop.d.ts +114 -4
  229. package/dist/props/registry.d.ts +397 -11
  230. package/dist/props/registry.js +526 -11
  231. package/dist/props/vocabulary/content.prop.d.ts +1 -1
  232. package/dist/props/vocabulary/data.prop.d.ts +179 -1
  233. package/dist/props/vocabulary/index.d.ts +5 -5
  234. package/dist/props/vocabulary/interaction.prop.d.ts +68 -3
  235. package/dist/props/vocabulary/layout.prop.d.ts +57 -1
  236. package/dist/props/vocabulary/navigation.prop.d.ts +40 -0
  237. package/dist/props/vocabulary/shared.prop.d.ts +33 -0
  238. package/dist/styles/badge-layout.css +2 -1
  239. package/dist/styles/card-layout.css +26 -4
  240. package/dist/styles/chart-layout.css +15 -0
  241. package/dist/styles/control.css +657 -15
  242. package/dist/styles/core.css +5 -2
  243. package/dist/styles/data-display-layout.css +313 -6
  244. package/dist/styles/data-entry-layout.css +13 -0
  245. package/dist/styles/focus-ring.css +4 -0
  246. package/dist/styles/index.css +5 -2
  247. package/dist/styles/layout.css +327 -4
  248. package/dist/styles/navigation-layout.css +227 -0
  249. package/dist/styles/shell-layout.css +369 -13
  250. package/dist/styles/table-layout.css +95 -6
  251. package/dist/styles/text-layout.css +10 -4
  252. package/dist/tokens/base.css +2 -1
  253. package/dist/tokens/components/badge.css +1 -0
  254. package/dist/tokens/components/chart.css +6 -0
  255. package/dist/tokens/components/control.css +79 -2
  256. package/dist/tokens/components/data-display.css +20 -0
  257. package/dist/tokens/components/descriptions.css +11 -0
  258. package/dist/tokens/components/flex.css +8 -0
  259. package/dist/tokens/components/navigation.css +55 -0
  260. package/dist/tokens/components/shell.css +53 -3
  261. package/dist/tokens/components/table.css +14 -0
  262. package/dist/tokens/foundation.css +2 -0
  263. package/dist/tokens/semantic/layout.css +9 -0
  264. package/docs/COMPONENTS.md +9 -3
  265. package/docs/CONSUMER-RULES.md +13 -0
  266. package/docs/DESIGN-AUTHORITY.md +145 -83
  267. package/docs/DEVELOPMENT.md +4 -3
  268. package/docs/FORMS.md +151 -6
  269. package/docs/FRAME-COVERAGE-REPORT.md +32 -17
  270. package/docs/README.md +15 -15
  271. package/docs/STANDARDS-vocabulary-tokens.md +1 -1
  272. package/docs/TESTING.md +15 -6
  273. package/docs/WHAT-BELONGS-HERE.md +179 -0
  274. package/docs/charts/cjk-category-axis.tsx +81 -0
  275. package/docs/data-display/card/index.tsx +22 -0
  276. package/docs/data-display/data-table/examples/antd-parity.tsx +257 -0
  277. package/docs/data-display/data-table/index.tsx +23 -0
  278. package/docs/data-display/descriptions.tsx +41 -0
  279. package/docs/data-display/legend.tsx +145 -0
  280. package/docs/data-display/progress.tsx +32 -0
  281. package/docs/data-display/scroll-area.tsx +31 -25
  282. package/docs/data-display/table.tsx +104 -45
  283. package/docs/data-display/timeline.tsx +41 -0
  284. package/docs/data-entry/date-picker.tsx +85 -0
  285. package/docs/data-entry/date-range-picker.tsx +26 -0
  286. package/docs/data-entry/form-dynamic-fields.tsx +199 -0
  287. package/docs/data-entry/form.tsx +74 -4
  288. package/docs/data-entry/input-otp.tsx +24 -0
  289. package/docs/data-entry/input.tsx +46 -1
  290. package/docs/data-entry/month-range-picker.tsx +1 -1
  291. package/docs/data-entry/segmented.tsx +1 -1
  292. package/docs/data-entry/select.tsx +29 -2
  293. package/docs/data-entry/switch.tsx +41 -0
  294. package/docs/data-entry/textarea.tsx +38 -0
  295. package/docs/data-entry/time-picker.tsx +85 -1
  296. package/docs/data-entry/time-range-picker.tsx +55 -0
  297. package/docs/data-entry/transfer.tsx +17 -0
  298. package/docs/data-entry/upload.tsx +56 -12
  299. package/docs/feedback/sheet.tsx +1 -1
  300. package/docs/feedback/tooltip.tsx +1 -1
  301. package/docs/general/activity.tsx +2 -2
  302. package/docs/general/button/index.tsx +14 -1
  303. package/docs/general/typography.tsx +14 -1
  304. package/docs/layout/app-launcher.tsx +151 -0
  305. package/docs/layout/app-shell-arrangements.tsx +225 -0
  306. package/docs/layout/app-shell.tsx +11 -0
  307. package/docs/layout/aspect-ratio.tsx +1 -1
  308. package/docs/layout/flex.tsx +50 -0
  309. package/docs/layout/responsive-grid.tsx +21 -1
  310. package/docs/layout/topbar.tsx +5 -9
  311. package/docs/navigation/app-setting-picker.tsx +37 -1
  312. package/docs/navigation/app-setting-toggle.tsx +111 -0
  313. package/docs/navigation/breadcrumb.tsx +48 -0
  314. package/docs/navigation/dropdown-menu.tsx +21 -0
  315. package/docs/navigation/pagination.tsx +52 -0
  316. package/docs/navigation/steps.tsx +37 -0
  317. package/docs/navigation/tabs.tsx +97 -1
  318. package/docs/query/button-refetch.tsx +1 -0
  319. package/package.json +28 -8
  320. package/scripts/_agent-setup.mjs +182 -3
  321. package/scripts/consumer-rule.md +98 -0
  322. package/scripts/guinea-pig-skill.md +322 -0
  323. package/scripts/init-guinea-pig.mjs +84 -0
  324. package/scripts/postinstall.mjs +13 -2
  325. package/scripts/ui-audit.mjs +351 -37
  326. /package/dist/tokens/{antd.generated.css → derived.css} +0 -0
@@ -3,9 +3,12 @@ import { jsx, jsxs } from "react/jsx-runtime";
3
3
  import * as React from "react";
4
4
  import { ChevronLeft, ChevronRight, MoreHorizontal } from "lucide-react";
5
5
  import { useTranslation } from "../../i18n/use-translation.js";
6
- import { useScrollableRegionTabIndex } from "../../lib/hooks.js";
6
+ import { useIsMobile, useScrollableRegionTabIndex } from "../../lib/hooks.js";
7
7
  import { cn } from "../../lib/utils.js";
8
8
  import { Button } from "../general/button.js";
9
+ import { Form } from "../data-entry/form.js";
10
+ import { FormField } from "../data-entry/form-field.js";
11
+ import { Input } from "../data-entry/input.js";
9
12
  import {
10
13
  Select,
11
14
  SelectContent,
@@ -110,19 +113,33 @@ function Pagination({
110
113
  showTotal,
111
114
  hideOnSinglePage = true,
112
115
  simple,
116
+ showQuickJumper,
117
+ size = "md",
118
+ align = "end",
119
+ responsive = true,
113
120
  disabled,
114
121
  className,
115
122
  onValueChange
116
123
  }) {
117
124
  const { t } = useTranslation();
125
+ const jumperId = React.useId();
126
+ const [jumperDraft, setJumperDraft] = React.useState("");
127
+ const isNarrowViewport = useIsMobile();
118
128
  const navLabel = ariaLabel ?? t("navigation.pagination.ariaLabel");
119
129
  const totalPages = Math.max(1, Math.ceil(total / pageSize));
120
130
  const safeCurrent = Math.min(Math.max(1, value), totalPages);
121
131
  const pages = buildPageRange(safeCurrent, totalPages);
122
- const go = (page, size = pageSize) => {
132
+ const compact = Boolean(simple) || responsive && isNarrowViewport;
133
+ const go = (page, size2 = pageSize) => {
123
134
  if (disabled) return;
124
- const nextPage = Math.min(Math.max(1, page), Math.max(1, Math.ceil(total / size)));
125
- onValueChange?.(nextPage, size);
135
+ const nextPage = Math.min(Math.max(1, page), Math.max(1, Math.ceil(total / size2)));
136
+ onValueChange?.(nextPage, size2);
137
+ };
138
+ const commitJump = () => {
139
+ const parsed = Number.parseInt(jumperDraft, 10);
140
+ setJumperDraft("");
141
+ if (!Number.isFinite(parsed)) return;
142
+ go(parsed);
126
143
  };
127
144
  const totalLabel = typeof showTotal === "function" ? showTotal(total, [
128
145
  total === 0 ? 0 : (safeCurrent - 1) * pageSize + 1,
@@ -130,96 +147,151 @@ function Pagination({
130
147
  ]) : showTotal ? t("navigation.pagination.total", { total }) : null;
131
148
  if (total <= 0) return null;
132
149
  if (hideOnSinglePage && totalPages <= 1) return null;
133
- if (simple) {
134
- return /* @__PURE__ */ jsxs("nav", { "aria-label": navLabel, "data-simple": "true", className: cn("ui-pagination", className), children: [
135
- totalLabel && /* @__PURE__ */ jsx("span", { className: "ui-pagination-total", children: totalLabel }),
136
- /* @__PURE__ */ jsx(
137
- Button,
138
- {
139
- type: "button",
140
- variant: "outline",
141
- size: "sm",
142
- disabled: Boolean(disabled) || safeCurrent <= 1,
143
- "aria-label": t("navigation.pagination.prev"),
144
- onClick: () => go(safeCurrent - 1),
145
- children: /* @__PURE__ */ jsx(ChevronLeft, { "aria-hidden": "true" })
146
- }
147
- ),
148
- /* @__PURE__ */ jsxs("span", { className: "ui-pagination-count", children: [
149
- safeCurrent,
150
- " / ",
151
- totalPages
152
- ] }),
153
- /* @__PURE__ */ jsx(
154
- Button,
155
- {
156
- type: "button",
157
- variant: "outline",
158
- size: "sm",
159
- disabled: Boolean(disabled) || safeCurrent >= totalPages,
160
- "aria-label": t("navigation.pagination.next"),
161
- onClick: () => go(safeCurrent + 1),
162
- children: /* @__PURE__ */ jsx(ChevronRight, { "aria-hidden": "true" })
163
- }
164
- )
165
- ] });
166
- }
167
- return /* @__PURE__ */ jsxs("nav", { "aria-label": navLabel, className: cn("ui-pagination", className), children: [
168
- totalLabel && /* @__PURE__ */ jsx("span", { className: "ui-pagination-total", children: totalLabel }),
169
- showSizeChanger && /* @__PURE__ */ jsxs(
170
- Select,
150
+ const goButton = showQuickJumper && typeof showQuickJumper === "object" ? showQuickJumper.goButton : void 0;
151
+ const quickJumper = showQuickJumper ? /* @__PURE__ */ jsxs("div", { className: "ui-pagination-jumper", "data-slot": "pagination-jumper", children: [
152
+ /* @__PURE__ */ jsx(Form, { asChild: true, layout: "horizontal", collapseBelow: false, children: /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx(
153
+ FormField,
154
+ {
155
+ id: jumperId,
156
+ label: t("navigation.pagination.jumpTo"),
157
+ layout: "horizontal",
158
+ labelWidth: "auto",
159
+ controlWidth: "auto",
160
+ children: /* @__PURE__ */ jsx(
161
+ Input,
162
+ {
163
+ id: jumperId,
164
+ size,
165
+ type: "number",
166
+ inputMode: "numeric",
167
+ min: 1,
168
+ max: totalPages,
169
+ disabled,
170
+ className: "ui-pagination-jumper-input w-[var(--pagination-jumper-width)]",
171
+ value: jumperDraft,
172
+ onChange: (event) => setJumperDraft(event.target.value),
173
+ onKeyDown: (event) => {
174
+ if (event.key !== "Enter") return;
175
+ event.preventDefault();
176
+ commitJump();
177
+ }
178
+ }
179
+ )
180
+ }
181
+ ) }) }),
182
+ goButton ? /* @__PURE__ */ jsx(Button, { type: "button", variant: "outline", size: "sm", disabled, onClick: commitJump, children: goButton }) : null
183
+ ] }) : null;
184
+ if (compact) {
185
+ return /* @__PURE__ */ jsxs(
186
+ "nav",
171
187
  {
172
- value: String(pageSize),
173
- onValueChange: (v) => go(1, Number(v)),
174
- disabled,
188
+ "aria-label": navLabel,
189
+ "data-simple": "true",
190
+ "data-size": size,
191
+ "data-align": align,
192
+ className: cn("ui-pagination", className),
175
193
  children: [
194
+ totalLabel && /* @__PURE__ */ jsx("span", { className: "ui-pagination-total", children: totalLabel }),
176
195
  /* @__PURE__ */ jsx(
177
- SelectTrigger,
196
+ Button,
178
197
  {
179
- className: "ui-pagination-size-trigger w-max min-w-[var(--pagination-size-width)]",
180
- "aria-label": t("navigation.pagination.pageSize"),
181
- children: /* @__PURE__ */ jsx(SelectValue, { children: t("navigation.pagination.pageSizeTrigger", { size: pageSize }) })
198
+ type: "button",
199
+ variant: "outline",
200
+ size: "sm",
201
+ disabled: Boolean(disabled) || safeCurrent <= 1,
202
+ "aria-label": t("navigation.pagination.prev"),
203
+ onClick: () => go(safeCurrent - 1),
204
+ children: /* @__PURE__ */ jsx(ChevronLeft, { "aria-hidden": "true" })
182
205
  }
183
206
  ),
184
- /* @__PURE__ */ jsx(SelectContent, { children: pageSizeOptions.map((size) => /* @__PURE__ */ jsx(SelectItem, { value: String(size), children: size }, size)) })
207
+ /* @__PURE__ */ jsxs("span", { className: "ui-pagination-count", children: [
208
+ safeCurrent,
209
+ " / ",
210
+ totalPages
211
+ ] }),
212
+ /* @__PURE__ */ jsx(
213
+ Button,
214
+ {
215
+ type: "button",
216
+ variant: "outline",
217
+ size: "sm",
218
+ disabled: Boolean(disabled) || safeCurrent >= totalPages,
219
+ "aria-label": t("navigation.pagination.next"),
220
+ onClick: () => go(safeCurrent + 1),
221
+ children: /* @__PURE__ */ jsx(ChevronRight, { "aria-hidden": "true" })
222
+ }
223
+ ),
224
+ quickJumper
185
225
  ]
186
226
  }
187
- ),
188
- /* @__PURE__ */ jsxs(PaginationContent, { children: [
189
- /* @__PURE__ */ jsx(PaginationItem, { children: /* @__PURE__ */ jsx(
190
- PaginationPrevious,
191
- {
192
- "aria-label": t("navigation.pagination.prev"),
193
- onClick: () => go(safeCurrent - 1),
194
- disabled: Boolean(disabled) || safeCurrent <= 1,
195
- children: /* @__PURE__ */ jsx(ChevronLeft, { "aria-hidden": "true" })
196
- }
197
- ) }),
198
- pages.map(
199
- (page, index) => page === "ellipsis" ? /* @__PURE__ */ jsx(PaginationItem, { children: /* @__PURE__ */ jsx(PaginationEllipsis, {}) }, `e-${index}`) : /* @__PURE__ */ jsx(PaginationItem, { children: /* @__PURE__ */ jsx(
200
- PaginationLink,
227
+ );
228
+ }
229
+ return /* @__PURE__ */ jsxs(
230
+ "nav",
231
+ {
232
+ "aria-label": navLabel,
233
+ "data-size": size,
234
+ "data-align": align,
235
+ className: cn("ui-pagination", className),
236
+ children: [
237
+ totalLabel && /* @__PURE__ */ jsx("span", { className: "ui-pagination-total", children: totalLabel }),
238
+ showSizeChanger && /* @__PURE__ */ jsxs(
239
+ Select,
201
240
  {
202
- isActive: page === safeCurrent,
203
- "aria-label": t("navigation.pagination.page", { page }),
204
- onClick: () => {
205
- if (!disabled) go(page);
206
- },
241
+ value: String(pageSize),
242
+ onValueChange: (v) => go(1, Number(v)),
207
243
  disabled,
208
- children: page
244
+ children: [
245
+ /* @__PURE__ */ jsx(
246
+ SelectTrigger,
247
+ {
248
+ className: "ui-pagination-size-trigger w-max min-w-[var(--pagination-size-width)]",
249
+ "aria-label": t("navigation.pagination.pageSize"),
250
+ children: /* @__PURE__ */ jsx(SelectValue, { children: t("navigation.pagination.pageSizeTrigger", { size: pageSize }) })
251
+ }
252
+ ),
253
+ /* @__PURE__ */ jsx(SelectContent, { children: pageSizeOptions.map((option) => /* @__PURE__ */ jsx(SelectItem, { value: String(option), children: option }, option)) })
254
+ ]
209
255
  }
210
- ) }, page)
211
- ),
212
- /* @__PURE__ */ jsx(PaginationItem, { children: /* @__PURE__ */ jsx(
213
- PaginationNext,
214
- {
215
- "aria-label": t("navigation.pagination.next"),
216
- onClick: () => go(safeCurrent + 1),
217
- disabled: Boolean(disabled) || safeCurrent >= totalPages,
218
- children: /* @__PURE__ */ jsx(ChevronRight, { "aria-hidden": "true" })
219
- }
220
- ) })
221
- ] })
222
- ] });
256
+ ),
257
+ /* @__PURE__ */ jsxs(PaginationContent, { children: [
258
+ /* @__PURE__ */ jsx(PaginationItem, { children: /* @__PURE__ */ jsx(
259
+ PaginationPrevious,
260
+ {
261
+ "aria-label": t("navigation.pagination.prev"),
262
+ onClick: () => go(safeCurrent - 1),
263
+ disabled: Boolean(disabled) || safeCurrent <= 1,
264
+ children: /* @__PURE__ */ jsx(ChevronLeft, { "aria-hidden": "true" })
265
+ }
266
+ ) }),
267
+ pages.map(
268
+ (page, index) => page === "ellipsis" ? /* @__PURE__ */ jsx(PaginationItem, { children: /* @__PURE__ */ jsx(PaginationEllipsis, {}) }, `e-${index}`) : /* @__PURE__ */ jsx(PaginationItem, { children: /* @__PURE__ */ jsx(
269
+ PaginationLink,
270
+ {
271
+ isActive: page === safeCurrent,
272
+ "aria-label": t("navigation.pagination.page", { page }),
273
+ onClick: () => {
274
+ if (!disabled) go(page);
275
+ },
276
+ disabled,
277
+ children: page
278
+ }
279
+ ) }, page)
280
+ ),
281
+ /* @__PURE__ */ jsx(PaginationItem, { children: /* @__PURE__ */ jsx(
282
+ PaginationNext,
283
+ {
284
+ "aria-label": t("navigation.pagination.next"),
285
+ onClick: () => go(safeCurrent + 1),
286
+ disabled: Boolean(disabled) || safeCurrent >= totalPages,
287
+ children: /* @__PURE__ */ jsx(ChevronRight, { "aria-hidden": "true" })
288
+ }
289
+ ) })
290
+ ] }),
291
+ quickJumper
292
+ ]
293
+ }
294
+ );
223
295
  }
224
296
  export {
225
297
  Pagination,
@@ -1,4 +1,4 @@
1
1
  import * as React from "react";
2
2
  import type { StepsProp } from "../../props/components/navigation.prop.js";
3
- export type { StepsProp, StepsProp as StepsProps, StepItemProp, StepStatusProp, StepsSeparatorProp, } from "../../props/components/navigation.prop.js";
4
- export declare function Steps({ items, value: current, defaultValue, status: currentStatus, orientation, type, size, titlePlacement, separator, onValueChange, className, }: StepsProp): React.JSX.Element;
3
+ export type { StepsProp, StepsProp as StepsProps, StepItemProp, StepStatusProp, StepsSeparatorProp, StepsTypeProp, } from "../../props/components/navigation.prop.js";
4
+ export declare function Steps({ items, value: current, defaultValue, status: currentStatus, orientation, type, size, titlePlacement, separator, percent, onValueChange, className, }: StepsProp): React.JSX.Element;
@@ -4,6 +4,10 @@ import { ArrowRight, Check, ChevronRight, Circle, Loader2, X } from "lucide-reac
4
4
  import { useTranslation } from "../../i18n/use-translation.js";
5
5
  import { cn } from "../../lib/utils.js";
6
6
  import { controlIconClass } from "../../lib/control-styles.js";
7
+ function boundStepPercent(percent) {
8
+ if (!Number.isFinite(percent)) return 0;
9
+ return Math.min(100, Math.max(0, percent));
10
+ }
7
11
  function resolveStepStatus(index, current, itemStatus, currentStatus) {
8
12
  if (itemStatus) return itemStatus;
9
13
  if (index < current) return "finish";
@@ -44,6 +48,7 @@ function Steps({
44
48
  size = "md",
45
49
  titlePlacement = "horizontal",
46
50
  separator = "chevron",
51
+ percent,
47
52
  onValueChange,
48
53
  className
49
54
  }) {
@@ -52,11 +57,16 @@ function Steps({
52
57
  const isVertical = orientation === "vertical";
53
58
  const compact = size === "sm";
54
59
  const inline = type === "inline";
60
+ const navigation = type === "navigation";
55
61
  const SeparatorIcon = separator === "arrow" ? ArrowRight : ChevronRight;
62
+ const showPercent = percent !== void 0 && !inline;
63
+ const boundedPercent = boundStepPercent(percent ?? 0);
64
+ const progressRatio = boundedPercent / 100;
56
65
  return /* @__PURE__ */ jsx(
57
66
  "ol",
58
67
  {
59
68
  "data-direction": inline ? void 0 : isVertical ? "vertical" : "horizontal",
69
+ "data-type": type,
60
70
  className: cn("flex w-full", inline ? "ui-steps-inline" : "ui-steps-list", className),
61
71
  "aria-label": t("navigation.steps.ariaLabel"),
62
72
  children: items.map((item, index) => {
@@ -80,7 +90,19 @@ function Steps({
80
90
  /* @__PURE__ */ jsx("span", { className: "ui-steps-inline-title", children: item.title }),
81
91
  /* @__PURE__ */ jsx("span", { className: "sr-only", children: statusLabel })
82
92
  ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
83
- /* @__PURE__ */ jsx(StepIcon, { status: stepStatus, icon: item.icon, type }),
93
+ showPercent && absoluteIndex === current ? /* @__PURE__ */ jsx(
94
+ "span",
95
+ {
96
+ className: "ui-steps-progress",
97
+ role: "progressbar",
98
+ "aria-valuenow": boundedPercent,
99
+ "aria-valuemin": 0,
100
+ "aria-valuemax": 100,
101
+ "aria-label": t("navigation.steps.percentLabel"),
102
+ style: { "--steps-progress-ratio": progressRatio },
103
+ children: /* @__PURE__ */ jsx(StepIcon, { status: stepStatus, icon: item.icon, type })
104
+ }
105
+ ) : /* @__PURE__ */ jsx(StepIcon, { status: stepStatus, icon: item.icon, type }),
84
106
  /* @__PURE__ */ jsxs("div", { className: "ui-steps-text", children: [
85
107
  /* @__PURE__ */ jsx(
86
108
  "div",
@@ -101,7 +123,7 @@ function Steps({
101
123
  "aria-current": isCurrent ? "step" : void 0,
102
124
  "data-direction": inline ? void 0 : isVertical ? "vertical" : "horizontal",
103
125
  "data-title-placement": titlePlacement,
104
- "data-connector": !isVertical && !inline && index < items.length - 1 ? "" : void 0,
126
+ "data-connector": !isVertical && !inline && !navigation && index < items.length - 1 ? "" : void 0,
105
127
  className: cn(!inline && "flex-1", inline ? "ui-steps-inline-item" : "ui-steps-item"),
106
128
  "data-status": stepStatus,
107
129
  children: [
@@ -116,10 +138,13 @@ function Steps({
116
138
  children: stepInner
117
139
  }
118
140
  ) : /* @__PURE__ */ jsx("span", { "data-direction": stepDirection, className: stepClassName, children: stepInner }),
119
- inline && index < items.length - 1 ? /* @__PURE__ */ jsx(
141
+ (inline || navigation && !isVertical) && index < items.length - 1 ? /* @__PURE__ */ jsx(
120
142
  SeparatorIcon,
121
143
  {
122
- className: "ui-steps-inline-separator rtl:rotate-180",
144
+ className: cn(
145
+ inline ? "ui-steps-inline-separator" : "ui-steps-nav-separator",
146
+ "rtl:rotate-180"
147
+ ),
123
148
  "aria-hidden": "true"
124
149
  }
125
150
  ) : null
@@ -1,20 +1,33 @@
1
1
  import * as React from "react";
2
- import * as TabsPrimitive from "@radix-ui/react-tabs";
3
- export type TabsItem = {
4
- value: string;
5
- label: React.ReactNode;
6
- content: React.ReactNode;
7
- disabled?: boolean;
2
+ import type { TabItemProp, TabsProp } from "../../props/components/navigation.prop.js";
3
+ export type { TabItemProp, TabsProp, TabsVariantProp, TabsPlacementProp, TabsExtraProp, } from "../../props/components/navigation.prop.js";
4
+ export type TabsOrientation = "vertical" | "horizontal";
5
+ export type TabsItem = TabItemProp;
6
+ export type TabsProps = Omit<React.ComponentPropsWithoutRef<"div">, "defaultValue" | "dir"> & TabsProp & {
7
+ orientation?: TabsOrientation;
8
+ dir?: "ltr" | "rtl";
9
+ activationMode?: "manual" | "automatic";
8
10
  };
9
- export type TabsProps = React.ComponentProps<typeof TabsPrimitive.Root> & {
10
- items?: TabsItem[];
11
- variant?: "default" | "line" | "card";
12
- listClassName?: string;
13
- contentClassName?: string;
14
- };
15
- export declare function Tabs({ className, orientation, items, value, defaultValue, variant, listClassName, contentClassName, ...props }: TabsProps): React.JSX.Element;
16
- export declare const TabsList: React.ForwardRefExoticComponent<Omit<TabsPrimitive.TabsListProps & React.RefAttributes<HTMLDivElement>, "ref"> & {
11
+ export declare function Tabs({ className, orientation, items, value, defaultValue, onValueChange, activationMode, dir, variant, tabPlacement, size, centered, extra, destroyOnHidden, onEdit, addIcon, hideAdd, listClassName, contentClassName, children, ...props }: TabsProps): React.JSX.Element;
12
+ export declare const TabsList: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & {
17
13
  variant?: "default" | "line";
14
+ /**
15
+ * ACCEPTED AND IGNORED. Radix's `RovingFocusGroup` took a `loop` switch; React Aria's tab list
16
+ * always wraps at the ends and exposes no equivalent knob. The prop stays so no consumer's build
17
+ * breaks. No test records this: the claim worth pinning would have been "both libraries wrap
18
+ * by default", and once Radix is gone there is no second library left to compare against.
19
+ */
20
+ loop?: boolean;
21
+ } & React.RefAttributes<HTMLDivElement>>;
22
+ export declare const TabsTrigger: React.ForwardRefExoticComponent<Omit<Omit<React.DetailedHTMLProps<React.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "ref">, "value"> & {
23
+ /** The tab's key — RAC `id` (its DOM `id` stays RAC-generated, exactly as Radix generated one). */
24
+ value: string;
25
+ /** RAC `isDisabled`; ALSO written to the button so `disabled:` utilities keep matching. */
26
+ disabled?: boolean;
27
+ } & React.RefAttributes<HTMLButtonElement>>;
28
+ export declare const TabsContent: React.ForwardRefExoticComponent<Omit<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref">, "value"> & {
29
+ /** The panel's key — must match a `TabsTrigger value`. RAC `id`. */
30
+ value: string;
31
+ /** Keep the panel mounted while another tab is selected — RAC `shouldForceMount`. */
32
+ forceMount?: true;
18
33
  } & React.RefAttributes<HTMLDivElement>>;
19
- export declare const TabsTrigger: React.ForwardRefExoticComponent<Omit<TabsPrimitive.TabsTriggerProps & React.RefAttributes<HTMLButtonElement>, "ref"> & React.RefAttributes<HTMLButtonElement>>;
20
- export declare const TabsContent: React.ForwardRefExoticComponent<Omit<TabsPrimitive.TabsContentProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;