@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
@@ -1,21 +1,63 @@
1
1
  "use client";
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
- import { ChevronRight } from "lucide-react";
3
+ import { ChevronDown, ChevronRight } from "lucide-react";
4
4
  import { useTranslation } from "../../i18n/use-translation.js";
5
+ import {
6
+ DropdownMenu,
7
+ DropdownMenuContent,
8
+ DropdownMenuItem,
9
+ DropdownMenuTrigger
10
+ } from "../navigation/dropdown-menu.js";
5
11
  function Breadcrumb({
6
12
  items,
7
13
  linkComponent: LinkComponent = "a",
8
- ariaLabel
14
+ ariaLabel,
15
+ separator,
16
+ itemRender
9
17
  }) {
10
18
  const { t } = useTranslation();
19
+ const separatorNode = separator === void 0 ? /* @__PURE__ */ jsx(ChevronRight, { "aria-hidden": "true" }) : separator;
11
20
  return /* @__PURE__ */ jsx("nav", { "aria-label": ariaLabel ?? t("navigation.breadcrumb.ariaLabel"), className: "ui-breadcrumb", children: /* @__PURE__ */ jsx("ol", { className: "ui-breadcrumb-list", children: items.map((item, index) => {
12
21
  const isLast = index === items.length - 1;
13
22
  return /* @__PURE__ */ jsxs("li", { className: "ui-breadcrumb-item", children: [
14
- item.to && !isLast ? /* @__PURE__ */ jsx(LinkComponent, { href: item.to, to: item.to, className: "ui-breadcrumb-link", children: item.label }) : /* @__PURE__ */ jsx("span", { className: "ui-breadcrumb-current", "aria-current": isLast ? "page" : void 0, children: item.label }),
15
- !isLast ? /* @__PURE__ */ jsx(ChevronRight, { "aria-hidden": "true" }) : null
23
+ renderBreadcrumbSegment({ item, index, isLast, items, itemRender, LinkComponent }),
24
+ !isLast ? /* @__PURE__ */ jsx("span", { className: "ui-breadcrumb-separator", "aria-hidden": "true", children: separatorNode }) : null
16
25
  ] }, item.to ?? index);
17
26
  }) }) });
18
27
  }
28
+ function renderBreadcrumbSegment({
29
+ item,
30
+ index,
31
+ isLast,
32
+ items,
33
+ itemRender,
34
+ LinkComponent
35
+ }) {
36
+ if (itemRender) return itemRender(item, { index, isLast, items });
37
+ if (item.menu) {
38
+ const { items: menuItems, onSelect } = item.menu;
39
+ return /* @__PURE__ */ jsxs(DropdownMenu, { children: [
40
+ /* @__PURE__ */ jsxs(DropdownMenuTrigger, { className: "ui-breadcrumb-menu-trigger ui-focus-ring", children: [
41
+ item.label,
42
+ /* @__PURE__ */ jsx(ChevronDown, { className: "ui-breadcrumb-menu-icon", "aria-hidden": "true" })
43
+ ] }),
44
+ /* @__PURE__ */ jsx(DropdownMenuContent, { placement: "bottomStart", children: menuItems.map((entry) => /* @__PURE__ */ jsx(
45
+ DropdownMenuItem,
46
+ {
47
+ disabled: entry.disabled,
48
+ onSelect: onSelect ? () => onSelect(entry.value) : void 0,
49
+ asChild: entry.to !== void 0,
50
+ children: entry.to !== void 0 ? /* @__PURE__ */ jsx(LinkComponent, { href: entry.to, to: entry.to, children: entry.label }) : entry.label
51
+ },
52
+ entry.value
53
+ )) })
54
+ ] });
55
+ }
56
+ if (item.to && !isLast) {
57
+ return /* @__PURE__ */ jsx(LinkComponent, { href: item.to, to: item.to, className: "ui-breadcrumb-link", children: item.label });
58
+ }
59
+ return /* @__PURE__ */ jsx("span", { className: "ui-breadcrumb-current", "aria-current": isLast ? "page" : void 0, children: item.label });
60
+ }
19
61
  export {
20
62
  Breadcrumb
21
63
  };
@@ -1,3 +1,3 @@
1
1
  import type { FlexProp } from "../../props/components/layout.prop.js";
2
2
  export type { FlexAlignProp, FlexDirectionProp, FlexJustifyProp, FlexProp, FlexProp as FlexProps, } from "../../props/components/layout.prop.js";
3
- export declare function Flex({ as: Element, direction, gap, align, justify, wrap, hideBelow, hideFrom, className, children, ...props }: FlexProp): import("react").JSX.Element;
3
+ export declare function Flex({ as: Element, direction, grow, shrink, surface, bleed, reveal, gap, gapRaw, pad, padRaw, align, justify, wrap, hideBelow, hideFrom, fill, width, className, style, children, ...props }: FlexProp): import("react").JSX.Element;
@@ -2,17 +2,29 @@
2
2
  import { jsx } from "react/jsx-runtime";
3
3
  import { mergeAriaIds } from "../../lib/field-a11y.js";
4
4
  import { cn } from "../../lib/utils.js";
5
- import { flexGapClass } from "../../lib/variants.js";
5
+ import { flexGapClass, padStyle, padStepToken } from "../../lib/variants.js";
6
+ const toCssLength = (value) => typeof value === "number" ? `${value}px` : value;
6
7
  function Flex({
7
8
  as: Element = "div",
8
9
  direction = "row",
10
+ grow,
11
+ shrink,
12
+ surface,
13
+ bleed,
14
+ reveal,
9
15
  gap = "md",
16
+ gapRaw,
17
+ pad,
18
+ padRaw,
10
19
  align,
11
20
  justify,
12
21
  wrap = false,
13
22
  hideBelow,
14
23
  hideFrom,
24
+ fill = false,
25
+ width,
15
26
  className,
27
+ style,
16
28
  children,
17
29
  ...props
18
30
  }) {
@@ -30,16 +42,42 @@ function Flex({
30
42
  "aria-describedby": mergeAriaIds(props["aria-describedby"], ariaErrorMessage)
31
43
  };
32
44
  }
45
+ const responsive = typeof direction === "object";
46
+ const axes = responsive ? direction : { base: direction };
47
+ const cssDirection = (axis) => axis === "col" ? "column" : axis;
48
+ const directionVars = responsive ? Object.fromEntries(
49
+ Object.entries(axes).map(([step, axis]) => [
50
+ `--flex-direction-${step}`,
51
+ cssDirection(axis)
52
+ ])
53
+ ) : {};
33
54
  return /* @__PURE__ */ jsx(
34
55
  Element,
35
56
  {
36
- "data-direction": direction,
57
+ "data-direction": responsive ? "responsive" : direction,
58
+ "data-grow": grow ? "" : void 0,
59
+ "data-shrink": shrink === false ? "false" : void 0,
60
+ "data-surface": surface,
61
+ "data-reveal": reveal,
62
+ "data-list": Element === "ul" ? "disc" : Element === "ol" ? "decimal" : void 0,
37
63
  "data-align": align,
38
64
  "data-justify": justify,
39
65
  "data-wrap": wrap ? "true" : void 0,
40
66
  "data-hide-below": hideBelow,
41
67
  "data-hide-from": hideFrom,
42
- className: cn("ui-flex", flexGapClass[gap], className),
68
+ "data-fill": fill ? "" : void 0,
69
+ "data-width-raw": width === void 0 ? void 0 : "",
70
+ "data-gap-raw": gapRaw,
71
+ className: cn("ui-flex", gapRaw === void 0 ? flexGapClass[gap] : void 0, className),
72
+ "data-pad-raw": padRaw === void 0 ? void 0 : "",
73
+ style: {
74
+ ...style,
75
+ ...directionVars,
76
+ ...bleed === void 0 ? void 0 : { marginInline: `calc(-1 * ${padStepToken(bleed)})` },
77
+ ...gapRaw === void 0 ? void 0 : { gap: `${gapRaw}px` },
78
+ ...width === void 0 ? void 0 : { inlineSize: toCssLength(width) },
79
+ ...padStyle(pad, padRaw)
80
+ },
43
81
  ...domProps,
44
82
  children
45
83
  }
@@ -7,6 +7,8 @@ export { NavList } from "./nav-list.js";
7
7
  export type { NavListProp, NavListProps } from "./nav-list.js";
8
8
  export { AppShell } from "./app-shell.js";
9
9
  export type { AppShellProps } from "./app-shell.js";
10
+ export { AppLauncher } from "./app-launcher.js";
11
+ export type { AppLauncherApp, AppLauncherGroup, AppLauncherLabels, AppLauncherProp, AppLauncherProps, } from "./app-launcher.js";
10
12
  export { OrgSwitcher } from "./org-switcher.js";
11
13
  export type { OrgSwitcherLabels, OrgSwitcherOrganization, OrgSwitcherProp, OrgSwitcherProps, } from "./org-switcher.js";
12
14
  export { AuthShell } from "./auth-shell.js";
@@ -54,3 +56,4 @@ export { LegalDocumentShell } from "./legal-document-shell.js";
54
56
  export type { LegalDocumentSectionProp, LegalDocumentShellProp, LegalDocumentShellProps, } from "./legal-document-shell.js";
55
57
  export { ServiceRolePanel } from "./service-role-panel.js";
56
58
  export type { ServiceRoleItemProp, ServiceRolePanelProp, ServiceRolePanelProps, } from "./service-role-panel.js";
59
+ export { useAppShellNavigationMode } from "./app-shell.js";
@@ -3,6 +3,7 @@ import { Flex } from "./flex.js";
3
3
  import { ResizablePanel, ResizablePanelGroup, ResizableHandle } from "./resizable.js";
4
4
  import { NavList } from "./nav-list.js";
5
5
  import { AppShell } from "./app-shell.js";
6
+ import { AppLauncher } from "./app-launcher.js";
6
7
  import { OrgSwitcher } from "./org-switcher.js";
7
8
  import { AuthShell } from "./auth-shell.js";
8
9
  import { AuthDivider } from "./auth-divider.js";
@@ -25,8 +26,10 @@ import { Separator } from "./separator.js";
25
26
  import { AspectRatio } from "./aspect-ratio.js";
26
27
  import { LegalDocumentShell } from "./legal-document-shell.js";
27
28
  import { ServiceRolePanel } from "./service-role-panel.js";
29
+ import { useAppShellNavigationMode } from "./app-shell.js";
28
30
  export {
29
31
  AccountChip,
32
+ AppLauncher,
30
33
  AppShell,
31
34
  AspectRatio,
32
35
  AuthAccountSummary,
@@ -58,5 +61,6 @@ export {
58
61
  SplitPane,
59
62
  Topbar,
60
63
  TopbarItem,
61
- createSidebarLink
64
+ createSidebarLink,
65
+ useAppShellNavigationMode
62
66
  };
@@ -0,0 +1,26 @@
1
+ import * as React from "react";
2
+ /**
3
+ * WHICH SURFACE a navigation component is rendering into.
4
+ *
5
+ * `AppShell` reuses the very same `sidebar` / `navRail` nodes for the mobile drawer that it docks
6
+ * on desktop — that is the point of the default, since a consumer should not have to build its
7
+ * navigation twice. But those nodes carry `collapsed`, and collapse is a DESKTOP answer: it trades
8
+ * labels for horizontal room in a docked column. A drawer has no such pressure, and below the
9
+ * breakpoint it is the ONLY navigation there is.
10
+ *
11
+ * Shipping both together produced a drawer of anonymous icons: a consumer collapsed its sidebar at
12
+ * 1280px, resized to 393px, opened the drawer, and got the organization mark plus five unlabelled
13
+ * glyphs — captured in that repo's own browser test, which is named "desktop sidebar collapse
14
+ * stays independent from the mobile navigation drawer" and had been asserting exactly this.
15
+ *
16
+ * The node cannot be un-collapsed from the outside once it is built, so the surface announces
17
+ * itself instead and the navigation components read it. Not exported from the public barrel: this
18
+ * is a contract between `AppShell` and the navigation it hosts, not a consumer knob.
19
+ */
20
+ export type NavSurface = "docked" | "drawer";
21
+ export declare function NavSurfaceProvider({ surface, children, }: {
22
+ surface: NavSurface;
23
+ children: React.ReactNode;
24
+ }): React.JSX.Element;
25
+ /** `"docked"` outside an AppShell drawer — so a standalone `Sidebar` keeps its own `collapsed`. */
26
+ export declare function useNavSurface(): NavSurface;
@@ -0,0 +1,17 @@
1
+ "use client";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ const NavSurfaceContext = React.createContext("docked");
5
+ function NavSurfaceProvider({
6
+ surface,
7
+ children
8
+ }) {
9
+ return /* @__PURE__ */ jsx(NavSurfaceContext.Provider, { value: surface, children });
10
+ }
11
+ function useNavSurface() {
12
+ return React.useContext(NavSurfaceContext);
13
+ }
14
+ export {
15
+ NavSurfaceProvider,
16
+ useNavSurface
17
+ };
@@ -1,9 +1,13 @@
1
1
  import * as React from "react";
2
2
  import type { OrgSwitcherProp } from "../../props/components/layout.prop.js";
3
3
  export type { OrgSwitcherLabels, OrgSwitcherOrganization, OrgSwitcherProp, OrgSwitcherProp as OrgSwitcherProps, } from "../../props/components/layout.prop.js";
4
+ /** Arbitrary `data-*` hooks — the one escape hatch this closed component keeps open. */
5
+ type DataAttributes = {
6
+ [key: `data-${string}`]: string | number | boolean | undefined;
7
+ };
4
8
  /**
5
9
  * Organization switcher with one stable shell contract: canonical trigger geometry, an optional
6
10
  * status badge, a searchable desktop popover, a focus-trapped bottom Sheet at/below the shared
7
11
  * `--sheet-responsive-breakpoint-width`, and explicit loading/empty/error states.
8
12
  */
9
- export declare function OrgSwitcher({ organizations, value, onValueChange, collapsed, disabled, loading, error, onRetry, labels, responsive, open, onOpenChange, className, }: OrgSwitcherProp): React.JSX.Element;
13
+ export declare function OrgSwitcher({ organizations, value, onValueChange, collapsed, disabled, loading, error, onRetry, labels, responsive, open, onOpenChange, className, ...rest }: OrgSwitcherProp & Pick<React.ComponentPropsWithoutRef<"button">, "id"> & DataAttributes): React.JSX.Element;
@@ -3,6 +3,14 @@ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
3
  import * as React from "react";
4
4
  import { Check, ChevronsUpDown, Loader2, RotateCcw } from "lucide-react";
5
5
  import { cn } from "../../lib/utils.js";
6
+ import {
7
+ Dialog,
8
+ DialogBody,
9
+ DialogContent,
10
+ DialogHeader,
11
+ DialogTitle,
12
+ DialogTrigger
13
+ } from "../feedback/dialog.js";
6
14
  import { Popover, PopoverContent, PopoverTrigger } from "../data-display/popover.js";
7
15
  import {
8
16
  Command,
@@ -46,7 +54,7 @@ const OrgSwitcherTrigger = React.forwardRef(
46
54
  ref,
47
55
  type: "button",
48
56
  variant: "ghost",
49
- className: "ui-org-switcher-trigger",
57
+ className: cn("ui-org-switcher-trigger", "h-[length:var(--org-switcher-trigger-height)]"),
50
58
  "data-collapsed": collapsed ? "true" : void 0,
51
59
  disabled,
52
60
  "aria-label": label,
@@ -147,7 +155,8 @@ function OrgSwitcher({
147
155
  responsive = "auto",
148
156
  open,
149
157
  onOpenChange,
150
- className
158
+ className,
159
+ ...rest
151
160
  }) {
152
161
  const [uncontrolledOpen, setUncontrolledOpen] = React.useState(false);
153
162
  const controlled = open !== void 0;
@@ -162,7 +171,9 @@ function OrgSwitcher({
162
171
  [controlled, onOpenChange]
163
172
  );
164
173
  const compactViewport = useSheetResponsiveMode("auto") === "bottom";
165
- const sheet = responsive === "sheet" || responsive === "auto" && compactViewport;
174
+ const responsivePair = responsive === "auto" || responsive === "dialog";
175
+ const sheet = responsive === "sheet" || responsivePair && compactViewport;
176
+ const dialog = responsive === "dialog" && !sheet;
166
177
  const current = organizations.find((organization) => organization.id === value);
167
178
  const fallbackName = current?.name ?? labels.title;
168
179
  const triggerLabel = labels.trigger(fallbackName);
@@ -173,7 +184,8 @@ function OrgSwitcher({
173
184
  organization: current,
174
185
  collapsed,
175
186
  disabled: triggerDisabled,
176
- label: triggerLabel
187
+ label: triggerLabel,
188
+ ...rest
177
189
  }
178
190
  );
179
191
  const panel = /* @__PURE__ */ jsx(
@@ -208,6 +220,15 @@ function OrgSwitcher({
208
220
  )
209
221
  ] }) });
210
222
  }
223
+ if (dialog) {
224
+ return /* @__PURE__ */ jsx("div", { className: cn("ui-org-switcher", className), "data-collapsed": collapsed || void 0, children: /* @__PURE__ */ jsxs(Dialog, { open: resolvedOpen, onOpenChange: setOpen, children: [
225
+ /* @__PURE__ */ jsx(DialogTrigger, { asChild: true, children: trigger }),
226
+ /* @__PURE__ */ jsxs(DialogContent, { className: "ui-org-switcher-dialog", children: [
227
+ /* @__PURE__ */ jsx(DialogHeader, { children: /* @__PURE__ */ jsx(DialogTitle, { children: labels.title }) }),
228
+ /* @__PURE__ */ jsx(DialogBody, { children: panel })
229
+ ] })
230
+ ] }) });
231
+ }
211
232
  return /* @__PURE__ */ jsx("div", { className: cn("ui-org-switcher", className), "data-collapsed": collapsed || void 0, children: /* @__PURE__ */ jsxs(Popover, { open: resolvedOpen, onOpenChange: setOpen, children: [
212
233
  /* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: trigger }),
213
234
  /* @__PURE__ */ jsx(PopoverContent, { align: "start", className: "ui-org-switcher-popover", "aria-label": labels.title, children: panel })
@@ -2,7 +2,7 @@ import type { PageContainerProp, PageInsetProp } from "../../props/components/la
2
2
  export type { PageContainerProp, PageContainerProp as PageContainerProps, } from "../../props/components/layout.prop.js";
3
3
  export type { BreadcrumbItemProp, BreadcrumbItemProp as BreadcrumbItem, } from "../../props/vocabulary/navigation.prop.js";
4
4
  export declare function PageContainerInset({ className, children, ...props }: PageInsetProp): import("react").JSX.Element;
5
- declare function PageContainerRoot({ title, subtitle, status, extra, toolbar, footer, breadcrumb, breadcrumbLabel, breadcrumbAriaLabel, linkComponent: LinkComponent, headerLoading, density, variant, preset, headerLayout, headerScale, measure, stickyFooter, footerReveal, fill, children, className, }: PageContainerProp): import("react").JSX.Element;
5
+ declare function PageContainerRoot({ title, subtitle, status, extra, toolbar, footer, toolbarPad, footerPad, breadcrumb, breadcrumbLabel, breadcrumbAriaLabel, linkComponent: LinkComponent, headerLoading, density, variant, preset, headerLayout, headerScale, measure, stickyFooter, footerReveal, fill, children, className, }: PageContainerProp): import("react").JSX.Element;
6
6
  export declare const PageContainer: typeof PageContainerRoot & {
7
7
  Inset: typeof PageContainerInset;
8
8
  };
@@ -4,7 +4,7 @@ import { useEffect, useRef, useState } from "react";
4
4
  import { ChevronRight } from "lucide-react";
5
5
  import { useTranslation } from "../../i18n/use-translation.js";
6
6
  import { cn } from "../../lib/utils.js";
7
- import { densityClass, pageContainerVariantClass } from "../../lib/variants.js";
7
+ import { densityClass, pageContainerVariantClass, padStyle } from "../../lib/variants.js";
8
8
  function scrollParent(el) {
9
9
  let node = el?.parentElement ?? null;
10
10
  while (node) {
@@ -40,6 +40,8 @@ function PageContainerRoot({
40
40
  extra,
41
41
  toolbar,
42
42
  footer,
43
+ toolbarPad,
44
+ footerPad,
43
45
  breadcrumb,
44
46
  breadcrumbLabel,
45
47
  breadcrumbAriaLabel,
@@ -146,9 +148,9 @@ function PageContainerRoot({
146
148
  ]
147
149
  }
148
150
  ),
149
- toolbar != null && /* @__PURE__ */ jsx("div", { className: "ui-page-toolbar", children: toolbar }),
151
+ toolbar != null && /* @__PURE__ */ jsx("div", { className: "ui-page-toolbar", style: padStyle(toolbarPad, void 0), children: toolbar }),
150
152
  children != null && /* @__PURE__ */ jsx("div", { className: "ui-page-body", children }),
151
- footer && /* @__PURE__ */ jsx("footer", { className: "ui-page-footer", children: footer })
153
+ footer && /* @__PURE__ */ jsx("footer", { className: "ui-page-footer", style: padStyle(footerPad, void 0), children: footer })
152
154
  ]
153
155
  }
154
156
  );
@@ -1,12 +1,17 @@
1
1
  import type { ReactNode } from "react";
2
- import type { ResponsiveGridColumnsProp, ResponsiveGridPresetProp } from "../../props/components/layout.prop.js";
2
+ import type { ResponsiveGridColumnsProp, ResponsiveGridFlowProp, ResponsiveGridPresetProp } from "../../props/components/layout.prop.js";
3
+ import type { PadProp, PadRawProp } from "../../props/vocabulary/index.js";
3
4
  import type { GapProp } from "../../props/vocabulary/layout.prop.js";
4
5
  export type ResponsiveGridProps = {
6
+ pad?: PadProp;
7
+ padRaw?: PadRawProp;
5
8
  /** Gap between cells, the same steps as Flex. Default `md`. */
6
9
  gap?: GapProp;
7
10
  /** Optional structural class override. */
8
11
  className?: string;
9
12
  columns?: ResponsiveGridColumnsProp;
13
+ /** Keep collections in a horizontal sequence; pair with ScrollArea orientation="horizontal". */
14
+ flow?: ResponsiveGridFlowProp;
10
15
  /**
11
16
  * Named column geometry for a recognised collection shape — see `ResponsiveGridPresetProp`.
12
17
  * Wins over `columns` when both are set, so a caller migrating to a preset does not also need
@@ -15,4 +20,13 @@ export type ResponsiveGridProps = {
15
20
  preset?: ResponsiveGridPresetProp;
16
21
  children: ReactNode;
17
22
  };
18
- export declare function ResponsiveGrid({ columns, gap, preset, className, children, }: ResponsiveGridProps): import("react").JSX.Element;
23
+ export declare function ResponsiveGrid({ columns, flow, gap, pad, padRaw, preset, className, children, }: ResponsiveGridProps): import("react").JSX.Element;
24
+ export declare namespace ResponsiveGrid {
25
+ export { ResponsiveGridItem as Item };
26
+ }
27
+ /** A grid item owns its responsive span; no extra implicit columns on a narrow container. */
28
+ export declare function ResponsiveGridItem({ span, children, className, }: {
29
+ span?: ResponsiveGridColumnsProp;
30
+ children?: ReactNode;
31
+ className?: string;
32
+ }): import("react").JSX.Element;
@@ -1,4 +1,5 @@
1
1
  import { jsx } from "react/jsx-runtime";
2
+ import { padStyle } from "../../lib/variants.js";
2
3
  import { cn } from "../../lib/utils.js";
3
4
  const RESPONSIVE_GRID_PRESET_COLUMNS = {
4
5
  "pricing-plans": { base: 1, sm: 3, md: 3, lg: 3 }
@@ -29,14 +30,40 @@ function toStyle(resolved) {
29
30
  }
30
31
  function ResponsiveGrid({
31
32
  columns = 4,
33
+ flow = "rows",
32
34
  gap,
35
+ pad,
36
+ padRaw,
33
37
  preset,
34
38
  className,
35
39
  children
36
40
  }) {
37
41
  const resolved = preset ? RESPONSIVE_GRID_PRESET_COLUMNS[preset] : resolveColumns(columns);
38
- return /* @__PURE__ */ jsx("div", { className: "ui-responsive-grid-scope", children: /* @__PURE__ */ jsx("div", { className: cn("ui-responsive-grid", className), "data-gap": gap, style: toStyle(resolved), children }) });
42
+ return /* @__PURE__ */ jsx("div", { className: "ui-responsive-grid-scope", children: /* @__PURE__ */ jsx(
43
+ "div",
44
+ {
45
+ className: cn("ui-responsive-grid", className),
46
+ "data-gap": gap,
47
+ "data-flow": flow === "columns" ? "columns" : void 0,
48
+ style: { ...toStyle(resolved), ...padStyle(pad, padRaw) },
49
+ "data-pad-raw": padRaw === void 0 ? void 0 : "",
50
+ children
51
+ }
52
+ ) });
39
53
  }
54
+ function ResponsiveGridItem({
55
+ span = 1,
56
+ children,
57
+ className
58
+ }) {
59
+ const steps = typeof span === "number" ? { base: 1, sm: span, md: span, lg: span } : resolveColumns(span);
60
+ const style = Object.fromEntries(
61
+ Object.entries(steps).map(([step, value]) => [`--responsive-grid-item-${step}`, value])
62
+ );
63
+ return /* @__PURE__ */ jsx("div", { className: cn("ui-responsive-grid-item", className), style, children });
64
+ }
65
+ ResponsiveGrid.Item = ResponsiveGridItem;
40
66
  export {
41
- ResponsiveGrid
67
+ ResponsiveGrid,
68
+ ResponsiveGridItem
42
69
  };
@@ -1,4 +1,3 @@
1
- "use client";
2
1
  import { Separator } from "../ui/separator.js";
3
2
  export {
4
3
  Separator
@@ -1,11 +1,12 @@
1
1
  "use client";
2
2
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
3
  import * as React from "react";
4
- import { Slot } from "@radix-ui/react-slot";
4
+ import { Slot } from "../../lib/slot.js";
5
5
  import { ChevronDown } from "lucide-react";
6
6
  import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "../data-display/collapsible.js";
7
7
  import { Popover, PopoverContent, PopoverTrigger } from "../data-display/popover.js";
8
8
  import { Tooltip, TooltipContent, TooltipTrigger } from "../feedback/tooltip.js";
9
+ import { useNavSurface } from "./nav-surface.js";
9
10
  import { useTranslation } from "../../i18n/use-translation.js";
10
11
  import { cn } from "../../lib/utils.js";
11
12
  function SidebarHeader({ children, className, ...props }) {
@@ -301,6 +302,8 @@ function Sidebar({
301
302
  }) {
302
303
  const { t } = useTranslation();
303
304
  const resolvedSections = sections ?? [];
305
+ const surface = useNavSurface();
306
+ collapsed = surface === "drawer" ? false : collapsed;
304
307
  return /* @__PURE__ */ jsxs("div", { className: "sb-root", "data-collapsed": collapsed ? "true" : void 0, children: [
305
308
  brand !== void 0 ? /* @__PURE__ */ jsx(SidebarHeader, { children: brand }) : product ? (() => {
306
309
  const interactive = onProductClick != null;
@@ -15,5 +15,18 @@ export type SplitPaneProps = {
15
15
  asideWidth?: "sm" | "md" | "lg";
16
16
  /** Accessible complementary landmark name; required when multiple panes share a document. */
17
17
  asideLabel?: string;
18
+ /**
19
+ * Fill the remaining height of the parent instead of growing with the content.
20
+ *
21
+ * Default `false` keeps the pane content-height — the right answer for a pane that sits in a
22
+ * scrolling page. Set it for an app-shell surface whose columns own their own scrolling (a chat
23
+ * transcript with a pinned composer, a full-height table beside a detail rail): the pane and
24
+ * both columns get a DEFINITE height, so `overflow` inside a column scrolls that column rather
25
+ * than pushing the page taller.
26
+ *
27
+ * The parent still decides how much height there is to fill — `fill` claims 100% of it, it does
28
+ * not invent it. Inside a flex column give the wrapper `flex: 1; min-height: 0`.
29
+ */
30
+ fill?: boolean;
18
31
  };
19
- export declare function SplitPane({ children, aside, asideWidth, asideLabel }: SplitPaneProps): import("react").JSX.Element;
32
+ export declare function SplitPane({ children, aside, asideWidth, asideLabel, fill, }: SplitPaneProps): import("react").JSX.Element;
@@ -1,18 +1,31 @@
1
1
  import { jsx, jsxs } from "react/jsx-runtime";
2
- function SplitPane({ children, aside, asideWidth = "md", asideLabel }) {
2
+ function SplitPane({
3
+ children,
4
+ aside,
5
+ asideWidth = "md",
6
+ asideLabel,
7
+ fill = false
8
+ }) {
3
9
  const closed = aside === null || aside === void 0;
4
- return /* @__PURE__ */ jsx("div", { className: "ui-split-pane-scope", children: /* @__PURE__ */ jsxs(
5
- "div",
6
- {
7
- className: "ui-split-pane",
8
- "data-aside-width": asideWidth,
9
- "data-aside": closed ? "closed" : void 0,
10
- children: [
11
- /* @__PURE__ */ jsx("div", { className: "ui-split-pane-main", children }),
12
- closed ? null : /* @__PURE__ */ jsx("aside", { className: "ui-split-pane-aside", "aria-label": asideLabel, children: aside })
13
- ]
14
- }
15
- ) });
10
+ return (
11
+ // `data-fill` is published on BOTH wrappers, not just the grid: the scope element is the one
12
+ // the consumer's own box actually contains, so without it the height stops at the scope and
13
+ // the grid has nothing definite to fill. Two attributes here are what keeps the consumer from
14
+ // reaching past its own child with `[&>*>*]` to say the same thing.
15
+ /* @__PURE__ */ jsx("div", { className: "ui-split-pane-scope", "data-fill": fill ? "true" : void 0, children: /* @__PURE__ */ jsxs(
16
+ "div",
17
+ {
18
+ className: "ui-split-pane",
19
+ "data-aside-width": asideWidth,
20
+ "data-aside": closed ? "closed" : void 0,
21
+ "data-fill": fill ? "true" : void 0,
22
+ children: [
23
+ /* @__PURE__ */ jsx("div", { className: "ui-split-pane-main", children }),
24
+ closed ? null : /* @__PURE__ */ jsx("aside", { className: "ui-split-pane-aside", "aria-label": asideLabel, children: aside })
25
+ ]
26
+ }
27
+ ) })
28
+ );
16
29
  }
17
30
  export {
18
31
  SplitPane
@@ -11,6 +11,9 @@ export type { TopbarItemProp, TopbarItemProp as TopbarItemProps, } from "../../p
11
11
  * file resolves, including nothing at all while the `--focus-outline` switch ships off.
12
12
  */
13
13
  export declare const TopbarItem: React.ForwardRefExoticComponent<Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, "children"> & {
14
+ hideBelow?: import("../../props/index.js").BreakpointProp;
15
+ badge?: React.ReactNode;
16
+ badgeTone?: import("../../props/components/layout.prop.js").SidebarBadgeToneProp;
14
17
  asChild?: boolean;
15
18
  children?: React.ReactNode;
16
19
  className?: import("../../props/index.js").ClassNameProp;
@@ -1,18 +1,32 @@
1
- "use client";
2
- import { jsx } from "react/jsx-runtime";
1
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
2
  import * as React from "react";
4
- import { Slot } from "@radix-ui/react-slot";
3
+ import { Slot } from "../../lib/slot.js";
5
4
  import { cn } from "../../lib/utils.js";
6
- const TopbarItem = React.forwardRef(function TopbarItem2({ asChild = false, className, type, ...props }, ref) {
5
+ const TopbarItem = React.forwardRef(function TopbarItem2({ asChild = false, className, type, hideBelow, badge, badgeTone, children, ...props }, ref) {
7
6
  const Comp = asChild ? Slot : "button";
7
+ const showBadge = !asChild && badge !== void 0 && badge !== "";
8
+ const badgeNode = showBadge ? /* @__PURE__ */ jsx(
9
+ "span",
10
+ {
11
+ "data-slot": "topbar-item-badge",
12
+ className: "ui-topbar-item-badge",
13
+ "data-tone": badgeTone === "destructive" ? "destructive" : void 0,
14
+ children: badge
15
+ }
16
+ ) : null;
8
17
  return /* @__PURE__ */ jsx(
9
18
  Comp,
10
19
  {
11
20
  ref,
12
21
  "data-slot": "topbar-item",
22
+ "data-hide-below": hideBelow,
13
23
  className: cn("ui-topbar-item ui-focus-ring", className),
14
24
  type: asChild ? void 0 : type ?? "button",
15
- ...props
25
+ ...props,
26
+ children: asChild ? children : /* @__PURE__ */ jsxs(Fragment, { children: [
27
+ children,
28
+ badgeNode
29
+ ] })
16
30
  }
17
31
  );
18
32
  });
@@ -4,4 +4,4 @@ export type { TopbarProp, TopbarProp as TopbarProps } from "../../props/componen
4
4
  * Topbar — a PURE SLOT bar. It positions three clusters (`start` / `center` / `end`) and owns the
5
5
  * bar's flex layout; it does NOT bake any chrome.
6
6
  */
7
- export declare function Topbar({ start, center, end, className, children, ...props }: TopbarProp): import("react").JSX.Element;
7
+ export declare function Topbar({ start, center, end, className, children, height, pad, style, ...props }: TopbarProp): import("react").JSX.Element;
@@ -1,11 +1,32 @@
1
1
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
2
+ import { padStyle } from "../../lib/variants.js";
2
3
  import { cn } from "../../lib/utils.js";
3
- function Topbar({ start, center, end, className, children, ...props }) {
4
- return /* @__PURE__ */ jsx("div", { "data-slot": "topbar", className: cn("ui-topbar", className), ...props, children: children ?? /* @__PURE__ */ jsxs(Fragment, { children: [
5
- start != null ? /* @__PURE__ */ jsx("div", { "data-slot": "topbar-start", className: "ui-topbar-start", children: start }) : null,
6
- center != null ? /* @__PURE__ */ jsx("div", { "data-slot": "topbar-center", className: "ui-topbar-center", children: center }) : null,
7
- end != null ? /* @__PURE__ */ jsx("div", { "data-slot": "topbar-end", className: "ui-topbar-end", children: end }) : null
8
- ] }) });
4
+ function Topbar({
5
+ start,
6
+ center,
7
+ end,
8
+ className,
9
+ children,
10
+ height,
11
+ pad,
12
+ style,
13
+ ...props
14
+ }) {
15
+ return /* @__PURE__ */ jsx(
16
+ "div",
17
+ {
18
+ "data-height": height,
19
+ style: { ...style, ...padStyle(pad, void 0) },
20
+ "data-slot": "topbar",
21
+ className: cn("ui-topbar", className),
22
+ ...props,
23
+ children: children ?? /* @__PURE__ */ jsxs(Fragment, { children: [
24
+ start != null ? /* @__PURE__ */ jsx("div", { "data-slot": "topbar-start", className: "ui-topbar-start", children: start }) : null,
25
+ center != null ? /* @__PURE__ */ jsx("div", { "data-slot": "topbar-center", className: "ui-topbar-center", children: center }) : null,
26
+ end != null ? /* @__PURE__ */ jsx("div", { "data-slot": "topbar-end", className: "ui-topbar-end", children: end }) : null
27
+ ] })
28
+ }
29
+ );
9
30
  }
10
31
  export {
11
32
  Topbar