@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
@@ -110,7 +110,8 @@ const AppSettingPicker = React.forwardRef(
110
110
  }, [kind, ctx?.timezoneOptions, current, t, locale, fallbackLocale]);
111
111
  const unbound = current === void 0 || !handleChange;
112
112
  const Icon = ICON[kind];
113
- const iconOnly = resolvedAppearance === "icon";
113
+ const bar = resolvedAppearance === "bar";
114
+ const iconOnly = bar || resolvedAppearance === "icon";
114
115
  const inline = resolvedAppearance === "inline";
115
116
  const isCompact = compact && !inline;
116
117
  return /* @__PURE__ */ jsxs(
@@ -164,7 +165,24 @@ const AppSettingPicker = React.forwardRef(
164
165
  // thua lớp utilities mà SelectTrigger phát ra.
165
166
  cn(
166
167
  "ui-app-setting-picker-icon hover:bg-accent hover:text-accent-foreground",
167
- "w-[length:var(--control-height)] shrink-0 justify-center"
168
+ "w-[length:var(--control-height)] shrink-0 justify-center",
169
+ // `bar` — a CELL of the bar, not a control in it. Both overrides are UTILITIES
170
+ // for the reason the block above already records twice: SelectTrigger emits
171
+ // `rounded-[var(--control-radius)]` from controlTriggerClass and takes its
172
+ // height from `.ui-control`, and a rule in @layer components loses to both.
173
+ //
174
+ // HEIGHT IS `self-stretch` + `h-auto`, NOT A LENGTH. The bar's height comes
175
+ // from a grid row in AppShell, from --topbar-height standalone, or from the
176
+ // coarse-pointer override on touch — a cell that named any one of those would
177
+ // be wrong in the other two. `h-auto` is what releases `.ui-control`'s height
178
+ // so the stretch can take effect; without it the box stays 32px in a 48px bar
179
+ // and the hover paints a pill, which is the whole defect this value fixes.
180
+ // `min-h` keeps the touch target when the bar is SHORTER than --control-height.
181
+ // The radius reads --topbar-item-radius, the SAME knob `TopbarItem` uses, so a
182
+ // service that wants softer bar cells retunes one token and both follow. A
183
+ // `rounded-none` literal here would put the shape out of a theme's reach
184
+ // (rules #44/#45) and let the two bar cells drift apart.
185
+ bar && "h-auto min-h-[length:var(--control-height)] self-stretch rounded-[var(--topbar-item-radius)]"
168
186
  )
169
187
  ) : (
170
188
  // Labeled: sized to a per-kind width from `sm` up; below `sm` it hugs its content and
@@ -180,6 +198,7 @@ const AppSettingPicker = React.forwardRef(
180
198
  className
181
199
  ),
182
200
  "data-kind": kind,
201
+ "data-appearance": resolvedAppearance,
183
202
  "aria-label": t(ARIA_KEY[kind]),
184
203
  children: [
185
204
  inline ? null : /* @__PURE__ */ jsx(
@@ -0,0 +1,16 @@
1
+ import * as React from "react";
2
+ import type { AppSettingToggleProp } from "../../props/components/app.prop.js";
3
+ export type { AppSettingToggleKind, AppSettingToggleProp, AppSettingToggleProp as AppSettingToggleProps, } from "../../props/components/app.prop.js";
4
+ /**
5
+ * AppSettingToggle — ONE button that steps a single AppProvider setting to its next value.
6
+ *
7
+ * The no-menu counterpart to {@link AppSettingPicker}: same binding contract, same option order,
8
+ * one tap instead of open-then-choose. Reach for it when the value set is closed and short (theme,
9
+ * density, font size, clock format) and the control lives in a top bar, where a dropdown for three
10
+ * values is a menu nobody wanted to open.
11
+ *
12
+ * The accessible name carries BOTH the setting and its current value ("Theme: Dark"), because the
13
+ * glyph is the only visible state and a screen-reader user would otherwise be told only which
14
+ * setting they are standing on, never where it currently is.
15
+ */
16
+ export declare const AppSettingToggle: React.ForwardRefExoticComponent<AppSettingToggleProp & React.RefAttributes<HTMLButtonElement>>;
@@ -0,0 +1,96 @@
1
+ "use client";
2
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import {
5
+ AArrowDown,
6
+ AArrowUp,
7
+ ALargeSmall,
8
+ Clock,
9
+ Monitor,
10
+ Moon,
11
+ Rows2,
12
+ Rows3,
13
+ Rows4,
14
+ Sun
15
+ } from "lucide-react";
16
+ import { APP_TIME_FORMAT_OPTIONS, getTimeFormatLabel } from "../../app/time-format-labels.js";
17
+ import { APP_DENSITIES, APP_FONT_SIZES, APP_THEMES } from "../../app/theme-axes.js";
18
+ import { useOptionalAppContext } from "../../app/app-provider.js";
19
+ import { useTranslation } from "../../i18n/use-translation.js";
20
+ import { Button } from "../general/button.js";
21
+ import { TopbarItem } from "../layout/topbar-item.js";
22
+ const VALUES = {
23
+ theme: APP_THEMES,
24
+ density: APP_DENSITIES,
25
+ fontSize: APP_FONT_SIZES,
26
+ timeFormat: APP_TIME_FORMAT_OPTIONS.map((option) => option.value)
27
+ };
28
+ const VALUE_ICON = {
29
+ theme: { light: Sun, dark: Moon, system: Monitor },
30
+ density: { compact: Rows4, default: Rows3, comfortable: Rows2 },
31
+ fontSize: { sm: AArrowDown, default: ALargeSmall, lg: AArrowUp },
32
+ // 12h vs 24h is a NOTATION, not a picture: `Clock3`/`Clock12` differ only by hand position, which
33
+ // reads as a time of day. So this kind shows the kind glyph plus the value as text instead.
34
+ timeFormat: {}
35
+ };
36
+ const KIND_ICON = {
37
+ theme: Sun,
38
+ density: Rows3,
39
+ fontSize: ALargeSmall,
40
+ timeFormat: Clock
41
+ };
42
+ const ARIA_KEY = {
43
+ theme: "navigation.themePicker.ariaLabel",
44
+ density: "navigation.densityPicker.ariaLabel",
45
+ fontSize: "navigation.fontSizePicker.ariaLabel",
46
+ timeFormat: "navigation.timeFormatPicker.ariaLabel"
47
+ };
48
+ const AppSettingToggle = React.forwardRef(
49
+ function AppSettingToggle2({ kind, appearance = "bar", className, disabled, id, value, onValueChange }, ref) {
50
+ const ctx = useOptionalAppContext();
51
+ const { t, locale, fallbackLocale } = useTranslation();
52
+ const raw = value ?? ctx?.[kind];
53
+ const current = raw == null ? void 0 : String(raw);
54
+ const setter = ctx ? {
55
+ theme: ctx.setTheme,
56
+ density: ctx.setDensity,
57
+ fontSize: ctx.setFontSize,
58
+ timeFormat: ctx.setTimeFormat
59
+ }[kind] : void 0;
60
+ const handleChange = onValueChange ?? setter;
61
+ const unbound = current === void 0 || !handleChange;
62
+ const values = VALUES[kind];
63
+ const handleClick = () => {
64
+ if (current === void 0 || !handleChange) return;
65
+ handleChange(values[(values.indexOf(current) + 1) % values.length]);
66
+ };
67
+ const ValueIcon = current === void 0 ? void 0 : VALUE_ICON[kind][current];
68
+ const Icon = ValueIcon ?? KIND_ICON[kind];
69
+ const valueLabel = current === void 0 ? "" : kind === "timeFormat" ? getTimeFormatLabel(current, locale, fallbackLocale) : t(`navigation.${kind}Picker.${current}`);
70
+ const shared = {
71
+ ref,
72
+ id,
73
+ type: "button",
74
+ disabled: disabled || unbound,
75
+ onClick: handleClick,
76
+ "data-kind": kind,
77
+ // The button has no visible label, so this aria-label is its ONLY accessible name — and it
78
+ // must name the VALUE too, or a cycler announces the same string at every step.
79
+ "aria-label": t("navigation.settingToggle.label", {
80
+ setting: t(ARIA_KEY[kind]),
81
+ value: valueLabel
82
+ }),
83
+ children: /* @__PURE__ */ jsxs(Fragment, { children: [
84
+ /* @__PURE__ */ jsx(Icon, { "aria-hidden": "true" }),
85
+ ValueIcon ? null : /* @__PURE__ */ jsx("span", { children: current })
86
+ ] })
87
+ };
88
+ if (appearance === "bar") {
89
+ return /* @__PURE__ */ jsx(TopbarItem, { className, ...shared });
90
+ }
91
+ return /* @__PURE__ */ jsx(Button, { variant: "ghost", size: ValueIcon ? "icon" : "sm", className, ...shared });
92
+ }
93
+ );
94
+ export {
95
+ AppSettingToggle
96
+ };
@@ -1,24 +1,233 @@
1
1
  import * as React from "react";
2
- import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu";
3
- export declare function DropdownMenu(props: React.ComponentProps<typeof DropdownMenuPrimitive.Root>): React.JSX.Element;
4
- export declare function DropdownMenuTrigger(props: React.ComponentProps<typeof DropdownMenuPrimitive.Trigger>): React.JSX.Element;
5
- export declare function DropdownMenuPortal(props: React.ComponentProps<typeof DropdownMenuPrimitive.Portal>): React.JSX.Element;
6
- export declare function DropdownMenuGroup(props: React.ComponentProps<typeof DropdownMenuPrimitive.Group>): React.JSX.Element;
7
- export declare function DropdownMenuRadioGroup(props: React.ComponentProps<typeof DropdownMenuPrimitive.RadioGroup>): React.JSX.Element;
8
- export declare function DropdownMenuSub(props: React.ComponentProps<typeof DropdownMenuPrimitive.Sub>): React.JSX.Element;
9
- export declare const DropdownMenuContent: React.ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuContentProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
10
- export declare const DropdownMenuItem: React.ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuItemProps & React.RefAttributes<HTMLDivElement>, "ref"> & {
2
+ import { type MenuItemRenderProps, type PopoverProps, type PopoverRenderProps } from "react-aria-components";
3
+ import type { DropdownMenuPlacementProp } from "../../props/components/navigation.prop.js";
4
+ export type { DropdownMenuPlacementProp } from "../../props/components/navigation.prop.js";
5
+ /**
6
+ * Dịch trạng thái item của RAC sang bộ `data-*` mà Radix phát ra và CSS của kho đang bám.
7
+ *
8
+ * `data-highlighted` móc tô sáng bàn phím (`.ui-dropdown-menu-item[data-highlighted]`);
9
+ * `data-state` mang cả hai nghĩa của Radix — "open" cho sub-trigger, "checked" cho hàng có chọn.
10
+ */
11
+ export declare function radixItemState(state: MenuItemRenderProps): Record<string, string | undefined>;
12
+ /**
13
+ * Dịch trạng thái popover của RAC sang `data-state` / `data-side` của Radix.
14
+ *
15
+ * ĐI KÈM: hai chỗ gọi nó đều bỏ `role` khỏi DOM (`role={undefined}`). RAC tự gắn `role="dialog"`
16
+ * cho MỌI popover modal — "Automatically render Popover with role=dialog except when isNonModal is
17
+ * true" — kể cả khi ruột của nó là một `role="menu"`. Radix không làm thế, và hợp đồng của tệp này
18
+ * là giữ hình dạng Radix ở CẢ cây a11y chứ không chỉ ở tên prop.
19
+ *
20
+ * Cái giá, đo được ở consumer chuột bạch (godx-chat, 08/09/2026): mở một hộp thoại TỪ một mục menu
21
+ * để lại HAI phần tử `role="dialog"` trong DOM suốt ~300ms — popover của menu đang chạy animation
22
+ * thoát (`data-exiting`), cộng chính hộp thoại vừa mở. 12 phép kiểm Playwright đỏ bằng "strict mode
23
+ * violation" trên `getByRole('dialog')`, thứ Playwright KHÔNG thử lại. Và với trình đọc màn hình,
24
+ * một menu vẫn tự xưng là "dialog".
25
+ *
26
+ * Bỏ đúng THUỘC TÍNH, không đụng hành vi: state `isDialog` bên trong RAC không đổi, nên việc đưa
27
+ * tiêu điểm vào popover lúc mở vẫn chạy nguyên như cũ.
28
+ */
29
+ export declare function radixSurfaceState(state: PopoverRenderProps): Record<string, string | undefined>;
30
+ /** Radix `side` + `align` → `placement` của RAC. `align="center"` là placement trần. */
31
+ export declare function toPlacement(side?: "top" | "right" | "bottom" | "left", align?: "start" | "center" | "end"): PopoverProps["placement"];
32
+ /**
33
+ * Radix trao cho `onSelect` một `Event` huỷ được. RAC's `onAction` không có sự kiện nào, nên ta
34
+ * dựng một cái tương đương để consumer gọi `preventDefault()` không nổ — nhưng nó KHÔNG còn giữ
35
+ * menu mở được nữa (xem báo cáo di trú).
36
+ */
37
+ export declare function selectEvent(name: string): Event;
38
+ interface DropdownMenuPropsOwn {
39
+ /** Trạng thái mở có kiểm soát (Radix). Bên trong là `isOpen` của RAC. */
40
+ open?: boolean;
41
+ defaultOpen?: boolean;
42
+ onOpenChange?: (open: boolean) => void;
43
+ /** `modal={false}` → `isNonModal` của RAC: nền không bị khoá cuộn, không bị `inert`. */
44
+ modal?: boolean;
45
+ /**
46
+ * Radix đọc `dir` để đảo mũi tên trái/phải. RAC lấy hướng từ locale (`I18nProvider` /
47
+ * `useLocale`), nên prop này còn trong API vì hợp đồng, nhưng không tự đảo hướng.
48
+ */
49
+ dir?: "ltr" | "rtl";
50
+ }
51
+ type DropdownMenuProps = React.PropsWithChildren<DropdownMenuPropsOwn>;
52
+ export declare function DropdownMenu({ children, open, defaultOpen, onOpenChange, modal, dir, }: DropdownMenuProps): React.JSX.Element;
53
+ interface DropdownMenuTriggerProps extends React.ComponentPropsWithoutRef<"button"> {
54
+ /** Giao hành vi mở cho phần tử con thay vì `<button>` mặc định — như Radix. */
55
+ asChild?: boolean;
56
+ }
57
+ /**
58
+ * RAC không nhận một `<button>` trần làm trigger: hành vi nhấn đi qua `PressResponder`, và chỉ
59
+ * `Pressable` (hoặc một component gọi `usePress`) mới nhận được nó. `asChild` vì vậy trở thành
60
+ * "bọc con trong `Pressable`" thay vì "hợp nhất props vào con" — kết quả với consumer là như nhau:
61
+ * chính phần tử của họ mang `aria-haspopup` / `aria-expanded` và nhận cú nhấn.
62
+ */
63
+ export declare function DropdownMenuTrigger({ asChild, children, ...props }: DropdownMenuTriggerProps): React.JSX.Element;
64
+ interface DropdownMenuPortalPropsOwn {
65
+ /** Giữ tên vì hợp đồng: RAC `Popover` tự cổng ra `document.body`, không có bản dựng cưỡng bức. */
66
+ forceMount?: true;
67
+ }
68
+ type DropdownMenuPortalProps = React.PropsWithChildren<DropdownMenuPortalPropsOwn>;
69
+ /** RAC `Popover` đã tự cổng, nên Portal chỉ còn là chỗ giữ hình dạng cây của Radix. */
70
+ export declare function DropdownMenuPortal({ children }: DropdownMenuPortalProps): React.JSX.Element;
71
+ interface DropdownMenuGroupPropsOwn {
72
+ className?: string;
73
+ }
74
+ type DropdownMenuGroupProps = React.PropsWithChildren<DropdownMenuGroupPropsOwn>;
75
+ /** Radix dựng `<div role="group">`; RAC `MenuSection` dựng `<section role="group">`. */
76
+ export declare function DropdownMenuGroup({ children, className }: DropdownMenuGroupProps): React.JSX.Element;
77
+ interface DropdownMenuRadioGroupPropsOwn {
78
+ className?: string;
79
+ value?: string;
80
+ onValueChange?: (value: string) => void;
81
+ }
82
+ type DropdownMenuRadioGroupProps = React.PropsWithChildren<DropdownMenuRadioGroupPropsOwn>;
83
+ /**
84
+ * Radix giữ trạng thái chọn ở chính RadioGroup; RAC giữ ở collection, khoá theo `id` của item.
85
+ * Nên `value` của consumer trở thành `selectedKeys` và `value` của RadioItem trở thành khoá.
86
+ */
87
+ export declare function DropdownMenuRadioGroup({ children, className, value, onValueChange, }: DropdownMenuRadioGroupProps): React.JSX.Element;
88
+ interface DropdownMenuSubPropsOwn {
89
+ /**
90
+ * RAC `SubmenuTrigger` tự giữ trạng thái mở của submenu và không phơi ra chỗ nào để điều khiển
91
+ * nó. Ba prop này còn trong API vì hợp đồng, nhưng không còn tác dụng.
92
+ */
93
+ open?: boolean;
94
+ defaultOpen?: boolean;
95
+ onOpenChange?: (open: boolean) => void;
96
+ }
97
+ type DropdownMenuSubProps = React.PropsWithChildren<DropdownMenuSubPropsOwn>;
98
+ /**
99
+ * `SubmenuTrigger` đọc children THEO VỊ TRÍ — `children[0]` là item mở submenu, `children[1]` là
100
+ * popover — nên thứ tự `<SubTrigger/>` rồi `<SubContent/>` của Radix ánh xạ thẳng.
101
+ */
102
+ export declare function DropdownMenuSub({ children }: DropdownMenuSubProps): React.JSX.Element;
103
+ /**
104
+ * Width axis of the menu surface (gh#396) — the vocabulary `Select` already publishes, extended to
105
+ * the one member of the family that never got it. `"trigger"` matches the anchor, `"auto"` releases
106
+ * the floor and shrinks to the content, and `sm | md | lg` select the `--menu-content-width-*`
107
+ * ladder. Unset = today's `--dropdown-content-min-width`, so nothing moves.
108
+ */
109
+ type DropdownMenuContentWidth = "trigger" | "auto" | "sm" | "md" | "lg";
110
+ interface DropdownMenuContentPropsOwn {
111
+ placement?: DropdownMenuPlacementProp;
112
+ arrow?: boolean;
113
+ width?: DropdownMenuContentWidth;
114
+ className?: string;
115
+ side?: "top" | "right" | "bottom" | "left";
116
+ align?: "start" | "center" | "end";
117
+ sideOffset?: number;
118
+ alignOffset?: number;
119
+ avoidCollisions?: boolean;
120
+ collisionPadding?: number;
121
+ /** Radix `loop` cho điều hướng bàn phím → `shouldFocusWrap` của RAC. */
122
+ loop?: boolean;
123
+ /** Giữ tên vì hợp đồng; RAC không có bản dựng cưỡng bức và không tự tháo khi trigger rời màn. */
124
+ forceMount?: true;
125
+ hideWhenDetached?: boolean;
126
+ sticky?: "partial" | "always";
127
+ }
128
+ type DropdownMenuContentProps = React.PropsWithChildren<DropdownMenuContentPropsOwn>;
129
+ /**
130
+ * Một phần tử của Radix (`Content`) tách thành HAI ở RAC: `Popover` là hộp được định vị, `Menu` là
131
+ * phần tử mang `role="menu"`. `data-slot` và lớp `ui-dropdown-menu-content` ở lại trên HỘP, cùng
132
+ * chỗ với `data-state` / `data-side` mà các utility animate đang đọc.
133
+ *
134
+ * `useInertHiddenBackground` đã được gỡ ở đây: RAC gọi `ariaHideOutside(..., {shouldUseInert:
135
+ * true})` — nền thành `inert` thật chứ không chỉ `aria-hidden`, nên axe `aria-hidden-focus` không
136
+ * còn cửa để nổ. Và hiệu ứng đó khoá theo `state.isOpen`, không theo unmount, nên `inert` được nhả
137
+ * NGAY ở ý định đóng: đúng lớp lỗi gh#385, đã sửa ở thượng nguồn. Phép đo là
138
+ * `src/components/__tests__/overlay-inert-release-385.test.tsx`.
139
+ */
140
+ export declare function DropdownMenuContent({ children, className, side, align, sideOffset, placement, arrow, width, alignOffset, avoidCollisions, collisionPadding, loop, hideWhenDetached, sticky, forceMount, }: DropdownMenuContentProps): React.JSX.Element;
141
+ interface DropdownMenuItemPropsOwn {
142
+ className?: string;
11
143
  inset?: boolean;
12
144
  variant?: "default" | "destructive";
13
- } & React.RefAttributes<HTMLDivElement>>;
14
- export declare const DropdownMenuLabel: React.ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuLabelProps & React.RefAttributes<HTMLDivElement>, "ref"> & {
145
+ disabled?: boolean;
146
+ onSelect?: (event: Event) => void;
147
+ textValue?: string;
148
+ /** Mượn thẻ của con thay vì dựng `<div>` riêng — chỗ để nhét một `<Link>` vào một mục menu. */
149
+ asChild?: boolean;
150
+ }
151
+ type DropdownMenuItemProps = React.PropsWithChildren<DropdownMenuItemPropsOwn>;
152
+ export declare function DropdownMenuItem({ children, className, inset, variant, disabled, onSelect, textValue, asChild, }: DropdownMenuItemProps): React.JSX.Element;
153
+ interface DropdownMenuLabelPropsOwn {
154
+ className?: string;
15
155
  inset?: boolean;
16
- } & React.RefAttributes<HTMLDivElement>>;
17
- export declare const DropdownMenuSeparator: React.ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuSeparatorProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
18
- export declare const DropdownMenuCheckboxItem: React.ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuCheckboxItemProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
19
- export declare const DropdownMenuRadioItem: React.ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuRadioItemProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
20
- export declare const DropdownMenuSubTrigger: React.ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuSubTriggerProps & React.RefAttributes<HTMLDivElement>, "ref"> & {
156
+ /** Mượn thẻ của con thay vì dựng `<header>` riêng. */
157
+ asChild?: boolean;
158
+ }
159
+ type DropdownMenuLabelProps = React.PropsWithChildren<DropdownMenuLabelPropsOwn>;
160
+ /**
161
+ * Radix dựng `<div>`; nút nhãn của một collection RAC là `Header`, tức `<header>`.
162
+ *
163
+ * `Header` không đi qua `useRenderProps`, nên `props.children` trong `render` CHÍNH là children của
164
+ * consumer — không có `Provider` chen vào như ở `MenuItem`. `Slot` vì thế nhận thẳng gói props.
165
+ *
166
+ * NHƯNG PHẢI RENDER RA `<div>`, KHÔNG PHẢI `<header>`. `<header>` mang vai trò ngầm `banner`, và
167
+ * `banner` không nằm trong danh sách con hợp lệ của `role="menu"` (axe: aria-required-children,
168
+ * ARIA 1.2 — menu chỉ nhận menuitem / menuitemcheckbox / menuitemradio / group / separator). Radix
169
+ * dựng `<div>`, vai trò `generic`, nên nó không bao giờ vấp lỗi này.
170
+ *
171
+ * `Header` vẫn được dùng chứ không thay bằng `<div>` trần: bộ dựng collection của RAC chỉ nhận các
172
+ * nút nó biết, một phần tử lạ đặt thẳng trong `Menu` sẽ bị nó bỏ. Nên giữ nút, đổi thẻ.
173
+ *
174
+ * Lỗi này ẩn suốt vì helper a11y dùng chung soi container của lần render, còn menu thì portal ra
175
+ * `document.body` — phép kiểm mang tên "open, fully-composed menu" thực chất soi một hộp rỗng.
176
+ */
177
+ export declare function DropdownMenuLabel({ children, className, inset, asChild }: DropdownMenuLabelProps): React.JSX.Element;
178
+ interface DropdownMenuSeparatorProps {
179
+ className?: string;
180
+ }
181
+ export declare function DropdownMenuSeparator({ className }: DropdownMenuSeparatorProps): React.JSX.Element;
182
+ interface DropdownMenuCheckboxItemPropsOwn {
183
+ className?: string;
184
+ checked?: boolean;
185
+ onCheckedChange?: (checked: boolean) => void;
186
+ disabled?: boolean;
187
+ textValue?: string;
188
+ /** Mượn thẻ của con thay vì dựng `<div>` riêng; ô đánh dấu vẫn nằm bên trong thẻ mượn. */
189
+ asChild?: boolean;
190
+ }
191
+ type DropdownMenuCheckboxItemProps = React.PropsWithChildren<DropdownMenuCheckboxItemPropsOwn>;
192
+ /**
193
+ * Ở Radix mỗi CheckboxItem tự giữ `checked`. Ở RAC không có `isSelected` trên item: `aria-checked`
194
+ * và `role="menuitemcheckbox"` chỉ xuất hiện khi collection BAO QUANH khai báo `selectionMode`.
195
+ * Nên mỗi hàng độc lập được bọc trong một `MenuSection` một-phần-tử — đó là cái giá để giữ đúng
196
+ * vai trò ARIA mà consumer đang test.
197
+ */
198
+ export declare function DropdownMenuCheckboxItem({ children, className, checked, onCheckedChange, disabled, textValue, asChild, }: DropdownMenuCheckboxItemProps): React.JSX.Element;
199
+ interface DropdownMenuRadioItemPropsOwn {
200
+ className?: string;
201
+ value: string;
202
+ disabled?: boolean;
203
+ textValue?: string;
204
+ /** Mượn thẻ của con thay vì dựng `<div>` riêng. */
205
+ asChild?: boolean;
206
+ }
207
+ type DropdownMenuRadioItemProps = React.PropsWithChildren<DropdownMenuRadioItemPropsOwn>;
208
+ export declare function DropdownMenuRadioItem({ children, className, value, disabled, textValue, asChild, }: DropdownMenuRadioItemProps): React.JSX.Element;
209
+ interface DropdownMenuSubTriggerPropsOwn {
210
+ className?: string;
21
211
  inset?: boolean;
22
- } & React.RefAttributes<HTMLDivElement>>;
23
- export declare const DropdownMenuSubContent: React.ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuSubContentProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
212
+ disabled?: boolean;
213
+ textValue?: string;
214
+ /** Mượn thẻ của con thay vì dựng `<div>` riêng; mũi tên submenu vẫn nằm bên trong thẻ mượn. */
215
+ asChild?: boolean;
216
+ }
217
+ type DropdownMenuSubTriggerProps = React.PropsWithChildren<DropdownMenuSubTriggerPropsOwn>;
218
+ export declare function DropdownMenuSubTrigger({ children, className, inset, disabled, textValue, asChild, }: DropdownMenuSubTriggerProps): React.JSX.Element;
219
+ interface DropdownMenuSubContentPropsOwn {
220
+ className?: string;
221
+ align?: "start" | "center" | "end";
222
+ alignOffset?: number;
223
+ sideOffset?: number;
224
+ avoidCollisions?: boolean;
225
+ collisionPadding?: number;
226
+ loop?: boolean;
227
+ forceMount?: true;
228
+ hideWhenDetached?: boolean;
229
+ sticky?: "partial" | "always";
230
+ }
231
+ type DropdownMenuSubContentProps = React.PropsWithChildren<DropdownMenuSubContentPropsOwn>;
232
+ export declare function DropdownMenuSubContent({ children, className, align, alignOffset, sideOffset, avoidCollisions, collisionPadding, loop, forceMount, hideWhenDetached, sticky, }: DropdownMenuSubContentProps): React.JSX.Element;
24
233
  export declare const DropdownMenuShortcut: ({ className, ...props }: React.HTMLAttributes<HTMLSpanElement>) => React.JSX.Element;