@godxjp/ui 19.0.0 → 19.2.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 (445) hide show
  1. package/README.md +25 -128
  2. package/dist/app/app-provider.d.ts +1 -1
  3. package/dist/app/app-provider.js +3 -0
  4. package/dist/app/theme-axes.d.ts +4 -15
  5. package/dist/app/timezones.d.ts +1 -4
  6. package/dist/components/charts/area-chart.d.ts +2 -3
  7. package/dist/components/charts/bar-chart.d.ts +2 -3
  8. package/dist/components/charts/chart-frame.d.ts +7 -16
  9. package/dist/components/charts/chart-summary.d.ts +2 -2
  10. package/dist/components/charts/compact-bar-trend.d.ts +9 -24
  11. package/dist/components/charts/index.d.ts +1 -6
  12. package/dist/components/data-display/badge.d.ts +2 -12
  13. package/dist/components/data-display/card.d.ts +21 -41
  14. package/dist/components/data-display/carousel.d.ts +1 -2
  15. package/dist/components/data-display/code-block.d.ts +4 -0
  16. package/dist/components/data-display/code-block.js +24 -0
  17. package/dist/components/data-display/data-table.d.ts +15 -37
  18. package/dist/components/data-display/data-table.js +1 -3
  19. package/dist/components/data-display/descriptions.d.ts +2 -6
  20. package/dist/components/data-display/descriptions.js +0 -2
  21. package/dist/components/data-display/index.d.ts +4 -0
  22. package/dist/components/data-display/index.js +4 -0
  23. package/dist/components/data-display/list-row.d.ts +3 -22
  24. package/dist/components/data-display/permission-matrix.d.ts +7 -20
  25. package/dist/components/data-display/progress.d.ts +1 -1
  26. package/dist/components/data-display/prose.d.ts +4 -0
  27. package/dist/components/data-display/prose.js +20 -0
  28. package/dist/components/data-display/service-launcher-card.d.ts +3 -10
  29. package/dist/components/data-display/table.d.ts +20 -80
  30. package/dist/components/data-display/table.js +0 -3
  31. package/dist/components/data-display/timeline.d.ts +3 -5
  32. package/dist/components/data-entry/branch-scope-picker.d.ts +2 -19
  33. package/dist/components/data-entry/branch-scope-picker.js +0 -1
  34. package/dist/components/data-entry/calendar.d.ts +3 -2
  35. package/dist/components/data-entry/calendar.js +58 -3
  36. package/dist/components/data-entry/cascader.js +3 -1
  37. package/dist/components/data-entry/checkbox-group.js +12 -5
  38. package/dist/components/data-entry/checkbox.js +30 -21
  39. package/dist/components/data-entry/command-palette.d.ts +8 -22
  40. package/dist/components/data-entry/date-picker.d.ts +4 -5
  41. package/dist/components/data-entry/date-picker.js +12 -3
  42. package/dist/components/data-entry/date-range-picker.d.ts +1 -1
  43. package/dist/components/data-entry/date-range-picker.js +17 -6
  44. package/dist/components/data-entry/form-errors.d.ts +7 -18
  45. package/dist/components/data-entry/form-field.d.ts +1 -1
  46. package/dist/components/data-entry/form-field.js +15 -6
  47. package/dist/components/data-entry/form.d.ts +1 -9
  48. package/dist/components/data-entry/input.d.ts +16 -14
  49. package/dist/components/data-entry/input.js +13 -3
  50. package/dist/components/data-entry/month-picker.js +6 -4
  51. package/dist/components/data-entry/month-range-picker.d.ts +4 -6
  52. package/dist/components/data-entry/month-range-picker.js +11 -5
  53. package/dist/components/data-entry/number-input.d.ts +1 -5
  54. package/dist/components/data-entry/number-input.js +1 -0
  55. package/dist/components/data-entry/radio.js +19 -6
  56. package/dist/components/data-entry/search-select.d.ts +3 -5
  57. package/dist/components/data-entry/search-select.js +8 -2
  58. package/dist/components/data-entry/select.d.ts +15 -2
  59. package/dist/components/data-entry/select.js +57 -10
  60. package/dist/components/data-entry/switch.js +9 -2
  61. package/dist/components/data-entry/textarea.d.ts +10 -16
  62. package/dist/components/data-entry/textarea.js +8 -1
  63. package/dist/components/data-entry/time-picker.d.ts +3 -5
  64. package/dist/components/data-entry/tree-select.js +3 -1
  65. package/dist/components/data-entry/upload-types.d.ts +1 -5
  66. package/dist/components/data-entry/use-upload-draft.d.ts +0 -4
  67. package/dist/components/feedback/dialog.d.ts +6 -15
  68. package/dist/components/feedback/overlay-header-tone.d.ts +1 -1
  69. package/dist/components/feedback/sheet.d.ts +3 -10
  70. package/dist/components/feedback/sheet.js +1 -1
  71. package/dist/components/feedback/sonner.js +2 -3
  72. package/dist/components/general/activity.d.ts +4 -30
  73. package/dist/components/general/button.js +1 -10
  74. package/dist/components/general/logo.d.ts +6 -28
  75. package/dist/components/general/reveal.d.ts +3 -9
  76. package/dist/components/general/typography.d.ts +1 -3
  77. package/dist/components/layout/account-chip.d.ts +8 -0
  78. package/dist/components/layout/account-chip.js +45 -0
  79. package/dist/components/layout/auth-divider.d.ts +2 -9
  80. package/dist/components/layout/auth-shell.d.ts +1 -14
  81. package/dist/components/layout/breadcrumb.d.ts +1 -5
  82. package/dist/components/layout/centered-shell.d.ts +4 -18
  83. package/dist/components/layout/error-surface.d.ts +11 -28
  84. package/dist/components/layout/error-surface.js +4 -1
  85. package/dist/components/layout/index.d.ts +2 -0
  86. package/dist/components/layout/index.js +2 -0
  87. package/dist/components/layout/legal-document-shell.d.ts +5 -28
  88. package/dist/components/layout/master-detail.d.ts +2 -18
  89. package/dist/components/layout/page-container.js +0 -1
  90. package/dist/components/layout/responsive-grid.d.ts +6 -1
  91. package/dist/components/layout/responsive-grid.js +9 -2
  92. package/dist/components/layout/service-role-panel.d.ts +7 -19
  93. package/dist/components/layout/sidebar.d.ts +5 -27
  94. package/dist/components/layout/sidebar.js +0 -1
  95. package/dist/components/layout/split-pane.d.ts +0 -7
  96. package/dist/components/layout/topbar.d.ts +1 -14
  97. package/dist/components/navigation/app-setting-picker.js +1 -3
  98. package/dist/components/navigation/filter-bar.d.ts +1 -6
  99. package/dist/components/navigation/pagination-utils.d.ts +2 -12
  100. package/dist/components/navigation/tabs-scroll.d.ts +2 -36
  101. package/dist/components/navigation/tabs.js +4 -8
  102. package/dist/components/query/data-state.d.ts +2 -2
  103. package/dist/components/ui/credential-reveal.d.ts +1 -4
  104. package/dist/components/ui/hover-card.d.ts +1 -2
  105. package/dist/components/ui/separator.d.ts +2 -15
  106. package/dist/components/ui/toggle-group.d.ts +1 -5
  107. package/dist/components/ui/toggle.d.ts +6 -31
  108. package/dist/email/brand-mark.d.ts +6 -34
  109. package/dist/email/color.d.ts +7 -17
  110. package/dist/email/geometry.d.ts +4 -8
  111. package/dist/email/index.d.ts +4 -48
  112. package/dist/email/inline-style.d.ts +3 -9
  113. package/dist/email/urgency.d.ts +2 -7
  114. package/dist/form/form-context.d.ts +2 -5
  115. package/dist/form/form-root.d.ts +1 -2
  116. package/dist/i18n/messages/en.json +4 -0
  117. package/dist/i18n/messages/ja.json +4 -0
  118. package/dist/i18n/messages/vi.json +4 -0
  119. package/dist/inertia/index.d.ts +2 -10
  120. package/dist/lib/control-styles.d.ts +10 -21
  121. package/dist/lib/control-styles.js +4 -6
  122. package/dist/lib/datetime/format-date.d.ts +1 -4
  123. package/dist/lib/field-a11y.d.ts +31 -36
  124. package/dist/lib/field-a11y.js +16 -2
  125. package/dist/lib/format.d.ts +4 -8
  126. package/dist/lib/hooks.d.ts +6 -12
  127. package/dist/lib/permission-grid.d.ts +3 -18
  128. package/dist/lib/query-error.d.ts +3 -3
  129. package/dist/props/components/app.prop.d.ts +19 -27
  130. package/dist/props/components/charts.prop.d.ts +2 -3
  131. package/dist/props/components/data-display.prop.d.ts +48 -72
  132. package/dist/props/components/data-entry.prop.d.ts +41 -30
  133. package/dist/props/components/form.prop.d.ts +2 -6
  134. package/dist/props/components/general.prop.d.ts +11 -27
  135. package/dist/props/components/layout.prop.d.ts +89 -260
  136. package/dist/props/components/navigation.prop.d.ts +27 -42
  137. package/dist/props/registry.d.ts +31 -0
  138. package/dist/props/registry.js +33 -0
  139. package/dist/props/vocabulary/data.prop.d.ts +18 -49
  140. package/dist/props/vocabulary/index.d.ts +1 -1
  141. package/dist/props/vocabulary/interaction.prop.d.ts +10 -12
  142. package/dist/props/vocabulary/layout.prop.d.ts +8 -30
  143. package/dist/props/vocabulary/shared.prop.d.ts +3 -2
  144. package/dist/styles/alert-layout.css +1 -32
  145. package/dist/styles/badge-layout.css +4 -18
  146. package/dist/styles/base.css +14 -113
  147. package/dist/styles/card-layout.css +6 -128
  148. package/dist/styles/chart-layout.css +2 -17
  149. package/dist/styles/control.css +380 -458
  150. package/dist/styles/core.css +21 -0
  151. package/dist/styles/data-display-layout.css +175 -94
  152. package/dist/styles/data-entry-layout.css +0 -45
  153. package/dist/styles/density.css +1 -30
  154. package/dist/styles/dialog-layout.css +5 -69
  155. package/dist/styles/focus-ring.css +13 -87
  156. package/dist/styles/fonts.css +1 -31
  157. package/dist/styles/form-layout.css +7 -91
  158. package/dist/styles/index.css +2 -20
  159. package/dist/styles/layout.css +38 -456
  160. package/dist/styles/logo-layout.css +1 -35
  161. package/dist/styles/motion.css +3 -42
  162. package/dist/styles/navigation-layout.css +3 -50
  163. package/dist/styles/shell-layout.css +37 -403
  164. package/dist/styles/table-layout.css +16 -274
  165. package/dist/styles/text-layout.css +7 -21
  166. package/dist/styles/toggle.css +1 -23
  167. package/dist/theme/dxs.canonical.css +1 -55
  168. package/dist/theme/example.service.css +1 -26
  169. package/dist/theme/famgia.service.css +5 -15
  170. package/dist/tokens/axes.css +3 -40
  171. package/dist/tokens/base.css +1 -4
  172. package/dist/tokens/components/activity.css +6 -42
  173. package/dist/tokens/components/badge.css +4 -13
  174. package/dist/tokens/components/banner.css +4 -9
  175. package/dist/tokens/components/card.css +32 -88
  176. package/dist/tokens/components/chart.css +9 -26
  177. package/dist/tokens/components/control.css +37 -222
  178. package/dist/tokens/components/data-display.css +28 -79
  179. package/dist/tokens/components/data-entry.css +5 -19
  180. package/dist/tokens/components/descriptions.css +7 -27
  181. package/dist/tokens/components/email.css +38 -84
  182. package/dist/tokens/components/error-surface.css +2 -18
  183. package/dist/tokens/components/feedback.css +27 -124
  184. package/dist/tokens/components/form.css +13 -45
  185. package/dist/tokens/components/legal-document.css +16 -41
  186. package/dist/tokens/components/list-row.css +11 -36
  187. package/dist/tokens/components/logo.css +2 -57
  188. package/dist/tokens/components/navigation.css +16 -94
  189. package/dist/tokens/components/scroll-area.css +2 -18
  190. package/dist/tokens/components/separator.css +8 -30
  191. package/dist/tokens/components/sheet.css +3 -14
  192. package/dist/tokens/components/shell.css +53 -307
  193. package/dist/tokens/components/sidebar.css +5 -22
  194. package/dist/tokens/components/table.css +19 -140
  195. package/dist/tokens/components/toggle.css +3 -65
  196. package/dist/tokens/components/upload.css +7 -43
  197. package/dist/tokens/foundation.css +108 -383
  198. package/dist/tokens/semantic/layout.css +33 -207
  199. package/docs/CANONICAL-CONTRACTS.md +206 -0
  200. package/docs/COMPONENTS.md +157 -0
  201. package/docs/COMPOSITION-VS-COMPONENT.md +105 -0
  202. package/docs/CONSUMER-RULES.md +14 -0
  203. package/docs/CUSTOMER-THEMING.md +162 -0
  204. package/docs/DATETIME.md +69 -0
  205. package/docs/DEVELOPMENT.md +173 -0
  206. package/docs/FORMS.md +143 -0
  207. package/docs/FRAME-A11Y-CI.md +267 -0
  208. package/docs/FRAME-COVERAGE-LEDGER.md +123 -0
  209. package/docs/FRAME-COVERAGE-REPORT.md +140 -0
  210. package/docs/FRAME-COVERAGE-STANDARD.md +65 -0
  211. package/docs/FRAME-COVERAGE.md +29 -0
  212. package/docs/PROPS-REGISTRY.md +61 -0
  213. package/docs/PROPS-VOCABULARY.md +100 -0
  214. package/docs/README.md +60 -0
  215. package/docs/REGISTRY.md +70 -0
  216. package/docs/SPACING.md +56 -0
  217. package/docs/STANDARDS-vocabulary-tokens.md +48 -0
  218. package/docs/TESTING.md +98 -0
  219. package/docs/TOKENS.md +347 -0
  220. package/docs/asset-modules.d.ts +46 -0
  221. package/docs/assets/cover-terrain.svg +6 -0
  222. package/docs/assets/portrait-amber.svg +5 -0
  223. package/docs/assets/portrait-clay.svg +5 -0
  224. package/docs/assets/portrait-indigo.svg +5 -0
  225. package/docs/assets/portrait-iris.svg +5 -0
  226. package/docs/assets/portrait-moss.svg +5 -0
  227. package/docs/assets/portrait-plum.svg +5 -0
  228. package/docs/assets/portrait-slate.svg +5 -0
  229. package/docs/charts/compact-bar-trend.tsx +328 -0
  230. package/docs/charts/size-tiers.tsx +192 -0
  231. package/docs/data-display/accordion.tsx +99 -0
  232. package/docs/data-display/avatar.tsx +355 -0
  233. package/docs/data-display/badge.tsx +247 -0
  234. package/docs/data-display/card/examples/detail-panel.tsx +106 -0
  235. package/docs/data-display/card/index.md +3 -0
  236. package/docs/data-display/card/index.tsx +285 -0
  237. package/docs/data-display/carousel.tsx +156 -0
  238. package/docs/data-display/charts.tsx +198 -0
  239. package/docs/data-display/code-block.tsx +90 -0
  240. package/docs/data-display/collapsible.tsx +162 -0
  241. package/docs/data-display/credential-reveal.tsx +145 -0
  242. package/docs/data-display/data-table/examples/approval-queue.tsx +212 -0
  243. package/docs/data-display/data-table/examples/grid-features.tsx +158 -0
  244. package/docs/data-display/data-table/examples/list-page.tsx +175 -0
  245. package/docs/data-display/data-table/index.md +5 -0
  246. package/docs/data-display/data-table/index.tsx +295 -0
  247. package/docs/data-display/descriptions.tsx +143 -0
  248. package/docs/data-display/empty-state.tsx +164 -0
  249. package/docs/data-display/hover-card.tsx +181 -0
  250. package/docs/data-display/list-row.tsx +420 -0
  251. package/docs/data-display/permission-matrix.tsx +184 -0
  252. package/docs/data-display/popover-touch.tsx +27 -0
  253. package/docs/data-display/popover.tsx +245 -0
  254. package/docs/data-display/progress.tsx +84 -0
  255. package/docs/data-display/prose.tsx +105 -0
  256. package/docs/data-display/qr-code.tsx +68 -0
  257. package/docs/data-display/scroll-area.tsx +271 -0
  258. package/docs/data-display/service-launcher-card.tsx +145 -0
  259. package/docs/data-display/stat-card.tsx +99 -0
  260. package/docs/data-display/table.tsx +251 -0
  261. package/docs/data-display/timeline.tsx +112 -0
  262. package/docs/data-display/touch-actions.tsx +36 -0
  263. package/docs/data-display/tree-list.tsx +107 -0
  264. package/docs/data-entry/branch-scope-picker.tsx +123 -0
  265. package/docs/data-entry/calendar.tsx +180 -0
  266. package/docs/data-entry/cascader.tsx +378 -0
  267. package/docs/data-entry/checkbox.tsx +256 -0
  268. package/docs/data-entry/color-picker.tsx +117 -0
  269. package/docs/data-entry/command-palette.tsx +179 -0
  270. package/docs/data-entry/command.tsx +262 -0
  271. package/docs/data-entry/country-picker-recipe.tsx +170 -0
  272. package/docs/data-entry/date-picker.tsx +191 -0
  273. package/docs/data-entry/date-range-picker.tsx +149 -0
  274. package/docs/data-entry/form/examples/employee-settings.tsx +267 -0
  275. package/docs/data-entry/form/examples/invoice-form.tsx +387 -0
  276. package/docs/data-entry/form-field/examples/a11y-contract.tsx +240 -0
  277. package/docs/data-entry/form-field/examples/create-form.tsx +105 -0
  278. package/docs/data-entry/form-field/index.md +8 -0
  279. package/docs/data-entry/form-field/index.tsx +326 -0
  280. package/docs/data-entry/form-inertia.tsx +80 -0
  281. package/docs/data-entry/form-root.tsx +102 -0
  282. package/docs/data-entry/form.tsx +724 -0
  283. package/docs/data-entry/input-otp.tsx +231 -0
  284. package/docs/data-entry/input.tsx +114 -0
  285. package/docs/data-entry/label.tsx +100 -0
  286. package/docs/data-entry/month-picker.tsx +101 -0
  287. package/docs/data-entry/month-range-picker.tsx +115 -0
  288. package/docs/data-entry/number-input.tsx +240 -0
  289. package/docs/data-entry/password-input.tsx +106 -0
  290. package/docs/data-entry/password-strength.tsx +97 -0
  291. package/docs/data-entry/radio-group.tsx +95 -0
  292. package/docs/data-entry/rating.tsx +87 -0
  293. package/docs/data-entry/search-input.tsx +120 -0
  294. package/docs/data-entry/select-async-contracts.tsx +108 -0
  295. package/docs/data-entry/select-matrix.tsx +204 -0
  296. package/docs/data-entry/select.tsx +369 -0
  297. package/docs/data-entry/slider.tsx +130 -0
  298. package/docs/data-entry/switch.tsx +67 -0
  299. package/docs/data-entry/tag-input.tsx +108 -0
  300. package/docs/data-entry/textarea.tsx +209 -0
  301. package/docs/data-entry/time-picker.tsx +99 -0
  302. package/docs/data-entry/toggle-count.tsx +293 -0
  303. package/docs/data-entry/toggle-group.tsx +225 -0
  304. package/docs/data-entry/toggle.tsx +127 -0
  305. package/docs/data-entry/transfer.tsx +97 -0
  306. package/docs/data-entry/tree-select.tsx +204 -0
  307. package/docs/data-entry/upload.tsx +184 -0
  308. package/docs/feedback/alert-dialog.tsx +270 -0
  309. package/docs/feedback/alert.tsx +248 -0
  310. package/docs/feedback/banner.tsx +183 -0
  311. package/docs/feedback/danger-confirm.tsx +88 -0
  312. package/docs/feedback/dialog-touch.tsx +24 -0
  313. package/docs/feedback/dialog.tsx +193 -0
  314. package/docs/feedback/sheet.tsx +410 -0
  315. package/docs/feedback/skeleton.tsx +111 -0
  316. package/docs/feedback/toast.tsx +135 -0
  317. package/docs/feedback/tooltip.tsx +171 -0
  318. package/docs/feedback/two-factor-setup.tsx +68 -0
  319. package/docs/foundation/_email-specimen.ts +274 -0
  320. package/docs/foundation/colors.tsx +202 -0
  321. package/docs/foundation/density.tsx +232 -0
  322. package/docs/foundation/email-tokens.tsx +306 -0
  323. package/docs/foundation/radius-shadow.tsx +152 -0
  324. package/docs/foundation/spacing.tsx +211 -0
  325. package/docs/foundation/typography.tsx +147 -0
  326. package/docs/general/activity.tsx +224 -0
  327. package/docs/general/button/examples/destructive-confirm.tsx +90 -0
  328. package/docs/general/button/examples/form-actions.tsx +85 -0
  329. package/docs/general/button/examples/toolbar.tsx +160 -0
  330. package/docs/general/button/index.md +12 -0
  331. package/docs/general/button/index.tsx +211 -0
  332. package/docs/general/logo.tsx +131 -0
  333. package/docs/general/reveal.tsx +41 -0
  334. package/docs/general/typography.tsx +152 -0
  335. package/docs/layout/account-chip.tsx +72 -0
  336. package/docs/layout/admin-collection.tsx +122 -0
  337. package/docs/layout/app-shell.tsx +374 -0
  338. package/docs/layout/aspect-ratio.tsx +119 -0
  339. package/docs/layout/auth-account-summary.tsx +103 -0
  340. package/docs/layout/auth-divider.tsx +28 -0
  341. package/docs/layout/auth-footer.tsx +37 -0
  342. package/docs/layout/auth-identity.tsx +36 -0
  343. package/docs/layout/auth-recovery/examples/mfa-challenge.md +41 -0
  344. package/docs/layout/auth-recovery/examples/mfa-challenge.tsx +254 -0
  345. package/docs/layout/auth-recovery/examples/mobile-390.md +25 -0
  346. package/docs/layout/auth-recovery/examples/mobile-390.tsx +82 -0
  347. package/docs/layout/auth-recovery/examples/password-recovery.md +24 -0
  348. package/docs/layout/auth-recovery/examples/password-recovery.tsx +197 -0
  349. package/docs/layout/auth-recovery/examples/wrapping-ja-en-vi.md +27 -0
  350. package/docs/layout/auth-recovery/examples/wrapping-ja-en-vi.tsx +156 -0
  351. package/docs/layout/auth-recovery/index.md +140 -0
  352. package/docs/layout/auth-recovery/index.tsx +96 -0
  353. package/docs/layout/auth-shell-context.tsx +103 -0
  354. package/docs/layout/auth-shell-device.tsx +112 -0
  355. package/docs/layout/auth-shell-registration.tsx +335 -0
  356. package/docs/layout/auth-shell-variants.tsx +139 -0
  357. package/docs/layout/auth-shell.tsx +59 -0
  358. package/docs/layout/auth-stack.tsx +40 -0
  359. package/docs/layout/centered-shell.tsx +102 -0
  360. package/docs/layout/error-surface/examples/application-403.tsx +84 -0
  361. package/docs/layout/error-surface/examples/application-404.tsx +77 -0
  362. package/docs/layout/error-surface/examples/system-500.tsx +47 -0
  363. package/docs/layout/error-surface/examples/system-503.tsx +48 -0
  364. package/docs/layout/error-surface/index.md +153 -0
  365. package/docs/layout/error-surface/index.tsx +239 -0
  366. package/docs/layout/flex.tsx +262 -0
  367. package/docs/layout/legal-document-shell/_data.ts +110 -0
  368. package/docs/layout/legal-document-shell/examples/desktop-1440.md +12 -0
  369. package/docs/layout/legal-document-shell/examples/desktop-1440.tsx +83 -0
  370. package/docs/layout/legal-document-shell/examples/mobile-390.md +22 -0
  371. package/docs/layout/legal-document-shell/examples/mobile-390.tsx +70 -0
  372. package/docs/layout/legal-document-shell/examples/tablet-1024.md +3 -0
  373. package/docs/layout/legal-document-shell/examples/tablet-1024.tsx +84 -0
  374. package/docs/layout/legal-document-shell/examples/wrapping-ja-en-vi.md +18 -0
  375. package/docs/layout/legal-document-shell/examples/wrapping-ja-en-vi.tsx +61 -0
  376. package/docs/layout/legal-document-shell/index.md +51 -0
  377. package/docs/layout/legal-document-shell/index.tsx +101 -0
  378. package/docs/layout/master-detail.tsx +387 -0
  379. package/docs/layout/org-switcher.tsx +131 -0
  380. package/docs/layout/page-container.tsx +946 -0
  381. package/docs/layout/resizable-panel.tsx +419 -0
  382. package/docs/layout/responsive-grid.tsx +235 -0
  383. package/docs/layout/separator.tsx +327 -0
  384. package/docs/layout/service-role-panel.tsx +144 -0
  385. package/docs/layout/sidebar.tsx +586 -0
  386. package/docs/layout/split-pane.tsx +451 -0
  387. package/docs/layout/topbar.tsx +347 -0
  388. package/docs/navigation/app-setting-picker.tsx +141 -0
  389. package/docs/navigation/breadcrumb.tsx +128 -0
  390. package/docs/navigation/context-menu.tsx +117 -0
  391. package/docs/navigation/dropdown-menu.tsx +213 -0
  392. package/docs/navigation/filter-bar.tsx +227 -0
  393. package/docs/navigation/menubar.tsx +141 -0
  394. package/docs/navigation/navigation-menu.tsx +165 -0
  395. package/docs/navigation/pagination.tsx +241 -0
  396. package/docs/navigation/steps.tsx +263 -0
  397. package/docs/navigation/tabs-rtl.tsx +28 -0
  398. package/docs/navigation/tabs.tsx +308 -0
  399. package/docs/navigation/toolbar.tsx +339 -0
  400. package/docs/providers/app-provider.tsx +191 -0
  401. package/docs/providers/format-date.tsx +230 -0
  402. package/docs/query/button-refetch.tsx +160 -0
  403. package/docs/query/data-state.tsx +192 -0
  404. package/docs/query/infinite-query-state.tsx +93 -0
  405. package/docs/query/mutation-feedback.tsx +70 -0
  406. package/docs/query/prefetch-link.tsx +262 -0
  407. package/docs/query/touch-actions.tsx +68 -0
  408. package/docs/showcase/acme-portal.tsx +441 -0
  409. package/docs/showcase/acme-website.tsx +455 -0
  410. package/docs/showcase/case1-warehouse-dashboard.tsx +343 -0
  411. package/docs/showcase/case2-employee-me.tsx +441 -0
  412. package/docs/showcase/case3-approval-workflow.tsx +527 -0
  413. package/docs/showcase/case4-login.tsx +307 -0
  414. package/docs/showcase/case5-shift-calendar.tsx +795 -0
  415. package/docs/showcase/case6-agency-handy.tsx +1072 -0
  416. package/docs/showcase/futurelastic-web.tsx +390 -0
  417. package/docs/showcase/org-switcher.tsx +313 -0
  418. package/docs/showcase/permission-matrix.tsx +343 -0
  419. package/docs/showcase/public-landing.tsx +210 -0
  420. package/docs/showcase/settings-account-sections.tsx +559 -0
  421. package/docs/showcase/settings-security-mfa.tsx +145 -0
  422. package/docs/showcase/table-approval-queue.tsx +199 -0
  423. package/docs/showcase/table-bulk-actions.tsx +460 -0
  424. package/docs/showcase/table-compact-kintone.tsx +438 -0
  425. package/docs/showcase/table-conditional-format.tsx +367 -0
  426. package/docs/showcase/table-crud-list.tsx +544 -0
  427. package/docs/showcase/table-density.tsx +340 -0
  428. package/docs/showcase/table-expandable-rows.tsx +471 -0
  429. package/docs/showcase/table-filter-chips.tsx +461 -0
  430. package/docs/showcase/table-footer-totals.tsx +311 -0
  431. package/docs/showcase/table-grouped-subtotals.tsx +388 -0
  432. package/docs/showcase/table-master-detail.tsx +479 -0
  433. package/docs/showcase/table-pagination.tsx +320 -0
  434. package/docs/showcase/table-states.tsx +363 -0
  435. package/docs/showcase/table-sticky-columns.tsx +373 -0
  436. package/docs/showcase/table-tree-rows.tsx +444 -0
  437. package/docs/showcase/table-view-tabs.tsx +488 -0
  438. package/package.json +10 -11
  439. package/scripts/_agent-setup.mjs +16 -2
  440. package/scripts/audit-hook.mjs +3 -13
  441. package/scripts/init-agent-kit.mjs +1 -14
  442. package/scripts/postinstall.mjs +12 -12
  443. package/scripts/ui-audit.mjs +93 -31
  444. package/scripts/visual-audit-rules.mjs +51 -7
  445. package/scripts/visual-audit.mjs +118 -47
@@ -2,10 +2,8 @@ import * as React from "react";
2
2
  import type { TimePickerProp } from "../../props/components/data-entry.prop.js";
3
3
  export type { TimePickerProp, TimePickerProp as TimePickerProps, } from "../../props/components/data-entry.prop.js";
4
4
  /**
5
- * TimePicker — WAI-ARIA time combobox. The value lives on a real, typeable `HH:mm` `<input>`
6
- * (24h canonical): form-submittable (give it a `name`), screen-reader friendly, and e2e-testable
7
- * by filling the input. The HH/mm column popover is the visual affordance and stays in sync.
8
- * The column display honours the active `timeFormat` (12h shows 1-12 + AM/PM) while the canonical
9
- * value remains 24h `HH:mm`.
5
+ * TimePicker — WAI-ARIA time combobox. The value lives on a real, typeable `HH:mm` `<input>` (24h
6
+ * canonical): form-submittable (give it a `name`), screen-reader friendly, and e2e-testable by
7
+ * filling the input.
10
8
  */
11
9
  export declare function TimePicker({ value: controlledValue, defaultValue, onValueChange, placeholder, disabled, className, id, name, minuteStep, allowClear, ...ariaProps }: TimePickerProp): React.JSX.Element;
@@ -4,7 +4,7 @@ import * as React from "react";
4
4
  import { ChevronDown, ChevronRight, ChevronsUpDown, X } from "lucide-react";
5
5
  import { useTranslation } from "../../i18n/use-translation.js";
6
6
  import { cn } from "../../lib/utils.js";
7
- import { pickFieldA11y } from "../../lib/field-a11y.js";
7
+ import { pickFieldA11y, useFieldIdentity } from "../../lib/field-a11y.js";
8
8
  import { controlOpenRingClass } from "../../lib/control-styles.js";
9
9
  import { Button } from "../general/button.js";
10
10
  import { Popover, PopoverContent, PopoverTrigger } from "../data-display/popover.js";
@@ -63,6 +63,7 @@ function TreeSelectRoot({
63
63
  }) {
64
64
  const { t } = useTranslation();
65
65
  const fieldA11y = pickFieldA11y(ariaProps);
66
+ const identity = useFieldIdentity({ id, "data-field": fieldA11y["data-field"] });
66
67
  const reactId = React.useId();
67
68
  const treeId = `${id ?? reactId}-tree`;
68
69
  const options = React.useMemo(
@@ -179,6 +180,7 @@ function TreeSelectRoot({
179
180
  Button,
180
181
  {
181
182
  id,
183
+ "data-field": fieldA11y["data-field"] ?? identity["data-field"],
182
184
  type: "button",
183
185
  variant: "outline",
184
186
  role: "combobox",
@@ -14,16 +14,12 @@ export type UploadFileItem = {
14
14
  error?: string;
15
15
  /** Local file before / during upload */
16
16
  file?: File;
17
- /**
18
- * Draft-only: marked for soft-delete on form commit.
19
- * Undo clears this before save — media-service has no restore API.
20
- */
17
+ /** Undo clears this before save — media-service has no restore API. */
21
18
  pendingDelete?: boolean;
22
19
  /**
23
20
  * Draft-only: replacement staged locally; baseline kept for undo.
24
21
  */
25
22
  pendingReplace?: boolean;
26
- /** mediaId to soft-delete on commit when `pendingReplace` */
27
23
  replacesMediaId?: string;
28
24
  };
29
25
  export type UploadVariant = "dropzone" | "button" | "picture-card" | "picture" | "avatar" | "avatar-crop";
@@ -11,10 +11,6 @@ export type UseUploadDraftOptions = {
11
11
  value?: UploadFileItem | null;
12
12
  onChange?: (item: UploadFileItem | null) => void;
13
13
  };
14
- /**
15
- * Single-value draft for avatar / picture — coordinates with media-service:
16
- * soft-delete only on form commit; undo before save (no restore API).
17
- */
18
14
  export declare function useUploadDraft({ value, onChange }: UseUploadDraftOptions): {
19
15
  state: UploadDraftState;
20
16
  markRemove: () => void;
@@ -37,15 +37,10 @@ declare const DialogTitle: React.ForwardRefExoticComponent<Omit<DialogPrimitive.
37
37
  declare const DialogDescription: React.ForwardRefExoticComponent<Omit<DialogPrimitive.DialogDescriptionProps & React.RefAttributes<HTMLParagraphElement>, "ref"> & React.RefAttributes<HTMLParagraphElement>>;
38
38
  type AlertDialogRootProps = React.ComponentProps<typeof AlertDialogPrimitive.Root> & {};
39
39
  /**
40
- * Compound alert-dialog Root — the `role="alertdialog"` mirror of {@link DialogRoot}.
41
- *
42
- * The flat {@link AlertDialog} preset owns the confirm / challenge / step-up recipe and cannot be
43
- * re-composed; this Root is what a consumer reaches for when the confirmation needs bespoke
44
- * content. It supplies the Radix AlertDialog context that `AlertDialogTitle`,
45
- * `AlertDialogDescription`, `AlertDialogAction` and `AlertDialogCancel` read, so the compound
46
- * parts are assemblable from the public API alone (no direct `@radix-ui/react-alert-dialog`
47
- * import). Focus trap, focus restoration and the modal `role="alertdialog"` semantics stay
48
- * Radix-owned.
40
+ * Compound alert-dialog Root — the `role="alertdialog"` mirror of {@link DialogRoot}. It supplies
41
+ * the Radix AlertDialog context that `AlertDialogTitle`, `AlertDialogDescription`,
42
+ * `AlertDialogAction` and `AlertDialogCancel` read, so the compound parts are assemblable from the
43
+ * public API alone (no direct `@radix-ui/react-alert-dialog` import).
49
44
  */
50
45
  declare function AlertDialogRoot(props: AlertDialogRootProps): React.JSX.Element;
51
46
  declare const AlertDialogTrigger: React.ForwardRefExoticComponent<AlertDialogPrimitive.AlertDialogTriggerProps & React.RefAttributes<HTMLButtonElement>>;
@@ -72,12 +67,8 @@ declare const DialogCancel: React.ForwardRefExoticComponent<Omit<AlertDialogPrim
72
67
  declare const AlertDialogAction: React.ForwardRefExoticComponent<Omit<AlertDialogPrimitive.AlertDialogActionProps & React.RefAttributes<HTMLButtonElement>, "ref"> & React.RefAttributes<HTMLButtonElement>>;
73
68
  declare const AlertDialogCancel: React.ForwardRefExoticComponent<Omit<AlertDialogPrimitive.AlertDialogCancelProps & React.RefAttributes<HTMLButtonElement>, "ref"> & React.RefAttributes<HTMLButtonElement>>;
74
69
  /**
75
- * Preset: confirm / destructive / typed-challenge / step-up without compound markup.
76
- *
77
- * High-stakes deletion recipe ("DangerConfirm", godxui#193): pass `challenge` (or `confirmPhrase`)
78
- * to gate the confirm button behind an exact typed match (org slug / resource name), and `stepUp`
79
- * for an async re-auth gate (passkey / 2FA) that must resolve truthy before `onConfirm` fires.
80
- * Both flows force the destructive tone (button + soft header band).
70
+ * Preset: confirm / destructive / typed-challenge / step-up without compound markup. Both flows
71
+ * force the destructive tone (button + soft header band).
81
72
  */
82
73
  declare function AlertDialog({ open, onOpenChange, title, description, confirmLabel, cancelLabel, variant, confirmPhrase, challenge, onConfirm, stepUp, keepOpenOnConfirm, pending, }: AlertDialogProp): React.JSX.Element;
83
74
  export declare const Dialog: typeof DialogRoot & {
@@ -2,6 +2,6 @@ import type { ToneProp } from "../../props/vocabulary/index.js";
2
2
  /**
3
3
  * Soft semantic background band for an overlay header (Sheet / Dialog / Drawer), Ant-Design style.
4
4
  * Tints ONLY the background — text stays `--foreground` (渋み: never invert the band into a loud
5
- * solid fill). `default` = no band. Shared so the three overlays stay consistent.
5
+ * solid fill).
6
6
  */
7
7
  export declare const overlayHeaderToneClass: Record<ToneProp, string>;
@@ -10,9 +10,6 @@ export type SheetPresentation = "side" | "bottom";
10
10
  * The canonical responsive-overlay decision, shared by `SheetContent` and by any composite that
11
11
  * swaps a desktop surface for a mobile sheet (see `OrgSwitcher`). Returns `"bottom"` when the
12
12
  * viewport is at or below `--sheet-responsive-breakpoint-width`.
13
- *
14
- * Public so a consumer NEVER hand-rolls `useMediaQuery("(max-width: 390px)")` in app code — the
15
- * breakpoint stays one themeable knob for the whole system.
16
13
  */
17
14
  export declare function useSheetResponsiveMode(responsive?: SheetResponsiveProp): SheetPresentation;
18
15
  export declare function Sheet(props: React.ComponentProps<typeof DialogPrimitive.Root>): React.JSX.Element;
@@ -28,17 +25,13 @@ export interface SheetContentProps extends React.ComponentPropsWithoutRef<typeof
28
25
  /** Optional semantic class for the owned backdrop (for a shell-specific overlay token). */
29
26
  overlayClassName?: string;
30
27
  /**
31
- * Desired panel size for side left/right (Ant Drawer `width`). Caps at the viewport — a small
32
- * screen still gets a full-width panel (`min(width, 100%)`), it is NOT a hard fixed width. Omit
33
- * to keep the canonical drawer default from `--sheet-width-default`.
28
+ * Desired panel size for side left/right (Ant Drawer `width`). Omit to keep the canonical drawer
29
+ * default from `--sheet-width-default`.
34
30
  */
35
31
  width?: WidthProp;
36
32
  /**
37
33
  * Responsive drawer / detail-panel contract. `"side"` (default) keeps today's behaviour: the
38
- * physical `side` the consumer named, at every viewport. `"auto"` renders the desktop side panel
39
- * above `--sheet-responsive-breakpoint-width` and the mobile bottom sheet at/below it (capped by
40
- * `--sheet-bottom-max-height`), so ONE `<Sheet>` covers both without a page-local media query.
41
- * `"bottom"` pins the bottom-sheet presentation.
34
+ * physical `side` the consumer named, at every viewport.
42
35
  */
43
36
  responsive?: SheetResponsiveProp;
44
37
  }
@@ -173,7 +173,7 @@ const SheetHeader = ({
173
173
  );
174
174
  };
175
175
  const SheetBody = ({ className, ...props }) => (
176
- // Scrollable region between a fixed header and a pinned footer (rule #41). Full-bleed horizontally
176
+ // Full-bleed horizontally
177
177
  // (`-mx-6 px-6`) so content aligns to the sheet edge while the 3px focus ring of a full-width
178
178
  // control keeps 24px of room and never clips against the scroll container's computed
179
179
  // `overflow-x`. `py-1`/`scroll-py-1` keep a focused control's ring visible at the scroll edges.
@@ -43,10 +43,9 @@ function Toaster({ style, ...props }) {
43
43
  "--normal-text": "hsl(var(--popover-foreground))",
44
44
  "--normal-border": "hsl(var(--border))",
45
45
  "--border-radius": "var(--radius)",
46
- // MERGED, never spread over. `style` used to arrive with the rest of `{...props}` AFTER
47
- // this object, so a consumer passing ANY style (a z-index, a width) replaced the whole
46
+ // MERGED, never spread over.
48
47
  // object and wiped all four vars — and an unset `--normal-bg` renders the toast
49
- // transparent. Merging keeps the surface intact and still lets a consumer override one
48
+ // transparent.
50
49
  // var by name.
51
50
  ...style
52
51
  },
@@ -2,36 +2,10 @@ import * as React from "react";
2
2
  import type { SizeProp } from "../../props/vocabulary/index.js";
3
3
  export type { ActivityProp, ActivityProp as ActivityProps, } from "../../props/components/general.prop.js";
4
4
  /**
5
- * Activity — the official AMBIENT-motion primitive: a continuous, unbounded "something is happening
6
- * right now, elsewhere". The LOOP counterpart to `Reveal`'s one-shot entrance, so a consumer never
7
- * hand-rolls a looping `@keyframes` + its own `prefers-reduced-motion` guard. Every interval,
8
- * stagger, offset, size and colour reads a DS token (`--activity-interval`,
9
- * `--activity-stagger-step`, `--activity-mark-offset`, `--activity-color`, …), so a service retunes
10
- * the whole ambient feel from its theme.
11
- *
12
- * NOT `Skeleton` (content is LOADING — it hard-codes `aria-busy` + an unconditional live region, so
13
- * reusing it for a typing indicator tells every screen reader the region is busy for as long as
14
- * anyone is typing). NOT `Button loading` (THIS ACTION is in flight, on a control).
15
- * `Activity` means: someone is typing, a sync is running, a response is streaming, a recording is
16
- * live — indefinitely, and not here.
17
- *
18
- * ACCESSIBILITY — the half consumers get wrong, owned here:
19
- * - The mark is decorative and always `aria-hidden`; the `label` (or `children`) carries the
20
- * meaning, so the indicator is never animation-only.
21
- * - `announce` defaults to `false` and then emits NO live region at all. An ambient indicator
22
- * flickers on and off with every socket event; a live region there re-announces continuously.
23
- * `announce="polite"` wraps ONLY the label in one `aria-live="polite" aria-atomic="true"` region.
24
- * - No `aria-busy`: activity elsewhere does not make THIS region busy, and `aria-busy` would
25
- * suppress the surrounding content's own updates.
26
- * - Not focusable, not a tab stop, no pointer affordance — it is a status mark, not a control.
27
- * - Under `prefers-reduced-motion: reduce` the loop is dropped and every mark falls back to a
28
- * DESIGNED resting state (three solid dots / a solid pulse mark / a bar segment parked at the
29
- * reading-start), never to nothing, with no layout shift (WCAG 2.2 SC 2.3.3 and SC 2.2.2).
30
- *
31
- * Copy is consumer-owned and localized — pass a `t()`-translated `label`, and derive
32
- * "N people are typing" from `Intl.PluralRules`. The library never invents the string.
33
- *
34
- * Pure/server-safe: no hooks, no effects, no timers — the loop is CSS.
5
+ * Activity — the official AMBIENT-motion primitive: a continuous, unbounded "something is
6
+ * happening right now, elsewhere". Every interval, stagger, offset, size and colour reads a DS
7
+ * token (`--activity-interval`, `--activity-stagger-step`, `--activity-mark-offset`,
8
+ * `--activity-color`, …), so a service retunes the whole ambient feel from its theme.
35
9
  */
36
10
  export declare const Activity: React.ForwardRefExoticComponent<Omit<React.HTMLAttributes<HTMLSpanElement>, "color"> & {
37
11
  variant?: import("../../props/index.js").ActivityVariantProp;
@@ -20,7 +20,6 @@ const buttonVariants = cva("ui-button", {
20
20
  size: {
21
21
  default: "ui-button--default-size",
22
22
  md: "ui-button--default-size",
23
- // The glyph rules stay UTILITIES, not a components-layer rule: Tailwind v4 orders
24
23
  // utilities after components, so only a utility can out-rank a child's own `size-*`.
25
24
  // They read the token, so the value is still themeable.
26
25
  xs: "ui-button--xs [&_svg:not([class*='size-'])]:size-[var(--button-xs-icon-size)]",
@@ -32,7 +31,6 @@ const buttonVariants = cva("ui-button", {
32
31
  "icon-lg": "ui-button--icon-lg"
33
32
  },
34
33
  // Single source of corner radius (deterministic — no competing rounded-* utility): default uses
35
- // the dedicated --button-radius token (themeable independently of --control-radius, issue #124),
36
34
  // pill is fully rounded, sharp is square.
37
35
  shape: {
38
36
  default: "rounded-[var(--button-radius)]",
@@ -69,14 +67,7 @@ const Button = React.forwardRef(
69
67
  ] }) : children;
70
68
  const showCount = !asChild && count != null && (count !== 0 || showZero);
71
69
  const countLabel = showCount && count != null && count > overflowCount ? `${new Intl.NumberFormat(locale).format(overflowCount)}+` : count != null ? new Intl.NumberFormat(locale).format(count) : "";
72
- const countNode = showCount ? /* @__PURE__ */ jsx(
73
- "span",
74
- {
75
- "data-slot": "button-count",
76
- className: "ui-button-count",
77
- children: countLabel
78
- }
79
- ) : null;
70
+ const countNode = showCount ? /* @__PURE__ */ jsx("span", { "data-slot": "button-count", className: "ui-button-count", children: countLabel }) : null;
80
71
  return /* @__PURE__ */ jsx(
81
72
  Comp,
82
73
  {
@@ -17,51 +17,29 @@ export interface LogoProps extends Omit<React.HTMLAttributes<HTMLSpanElement>, "
17
17
  * Box size tier (tokenised), applied to EVERY mark. The boxed glyph reads `--logo-size-*`
18
18
  * (default `md` = 1.75rem); `mark="godx"` reads its own `--logo-godx-size-*` scale (default `md`
19
19
  * = 2rem — the identity artwork is a capsule in a square viewBox and needs slightly more box to
20
- * read at the same optical weight). On a `wordmark` lockup the tier scales the mark and the
21
- * wordmark together. A theme pins the identity box at every tier with `--logo-godx-size`.
20
+ * read at the same optical weight).
22
21
  */
23
22
  size?: LogoSize;
24
23
  /**
25
24
  * Semantic fill role. `"success"` provides the canonical green identity mark without changing
26
- * the application's primary action colour. Default `"primary"` preserves existing behaviour.
25
+ * the application's primary action colour.
27
26
  */
28
27
  tone?: LogoTone;
29
28
  /**
30
29
  * Readable product name rendered BESIDE the mark as one lockup. Pass the localized product name
31
- * (a string, or a node when the name needs its own markup). When set, `Logo` renders
32
- * `mark + wordmark` in a single inline-flex lockup: the mark becomes decorative and the wordmark
33
- * carries the accessible name, so the pair is announced once. The wordmark reads
34
- * `--logo-wordmark-*` tokens — its colour defaults to the identity role for the GoDX/`success`
35
- * lockup and NEVER to `--primary`, so a re-themed action colour cannot recolour the brand.
36
- * Omit for the bare mark (today's behaviour, unchanged).
37
- *
38
- * NOTE: the library ships no wordmark ARTWORK — the wordmark is set in the design-system
39
- * typeface (`--logo-wordmark-font-family`, default `--font-family-display`). Pass an inline
40
- * `<svg>` here when a real logotype asset exists.
30
+ * (a string, or a node when the name needs its own markup).
41
31
  */
42
32
  wordmark?: React.ReactNode;
43
33
  /**
44
34
  * Accessible name for the mark. When set, the logo is exposed to assistive tech as an image with
45
35
  * this name; when omitted the mark is decorative (`aria-hidden`) — the correct default when a
46
- * readable wordmark sits beside it. With `wordmark` set, `label` overrides the lockup's
47
- * accessible name (the wordmark text is otherwise the name).
36
+ * readable wordmark sits beside it.
48
37
  */
49
38
  label?: string;
50
39
  }
51
40
  /**
52
41
  * Logo — the product brand-mark box: a glyph on the primary fill, or (with `wordmark`) the full
53
- * mark + wordmark LOCKUP. Use it INSTEAD of hand-rolling a bare span with a fixed square size, a
54
- * literal radius, and `bg-primary` + type utilities in shell headers, auth screens, and topbars —
55
- * that repeats literal size/radius and puts type utilities on a bare span (rules #45/#46). Size,
56
- * radius, per-tier font-size, the wordmark's face/weight/tracking/colour and the mark↔wordmark gap
57
- * are all tokens.
58
- *
59
- * COLOUR: the boxed glyph fill reads the primary role, so a re-themed `--primary` re-tints it.
60
- * `mark="godx"` / `tone="success"` instead read the IDENTITY tokens (`--logo-godx-color`,
61
- * `--logo-success-*`, `--logo-wordmark-color`), which never reference `--primary` — the canonical
62
- * brand-green GoDX lockup therefore survives any action-colour re-theme with zero consumer CSS.
63
- *
64
- * A11Y: with a `wordmark`, the mark is decorative and the wordmark text carries the accessible
65
- * name (announced once). Without one, set `label` when the mark stands alone.
42
+ * mark + wordmark LOCKUP. Size, radius, per-tier font-size, the wordmark's
43
+ * face/weight/tracking/colour and the mark↔wordmark gap are all tokens.
66
44
  */
67
45
  export declare const Logo: React.ForwardRefExoticComponent<LogoProps & React.RefAttributes<HTMLSpanElement>>;
@@ -1,14 +1,8 @@
1
1
  import type { RevealProp } from "../../props/components/general.prop.js";
2
2
  export type { RevealProp, RevealProp as RevealProps } from "../../props/components/general.prop.js";
3
3
  /**
4
- * Reveal — the official entrance-motion primitive (staggered fade-up). Content animates in on mount
5
- * reading the DS motion tokens (`--duration-slow`, `--ease-emphasized`, `--reveal-distance`), so a
6
- * consumer never hand-rolls `@keyframes` + `.app-reveal`/`.d1..d6`. `delay` is a stagger ordinal
7
- * (`0..6`) — an index into the `--reveal-stagger-step` ladder, never a raw ms — so a column of rows
8
- * cascades in. Under `prefers-reduced-motion` the animation is dropped entirely: content renders in
9
- * its final position, fully visible, with no layout shift (CSS `@media` guard in motion.css).
10
- *
11
- * Pure/server-safe: no hooks, no effects. Pass `asChild` to merge the reveal onto the single child
12
- * element (no wrapper `<div>`) when an extra box would break a grid/flex layout.
4
+ * Reveal — the official entrance-motion primitive (staggered fade-up). `delay` is a stagger
5
+ * ordinal (`0..6`) an index into the `--reveal-stagger-step` ladder, never a raw ms — so a
6
+ * column of rows cascades in.
13
7
  */
14
8
  export declare function Reveal({ children, delay, asChild, className, ...props }: RevealProp): import("react").JSX.Element;
@@ -2,9 +2,7 @@ import * as React from "react";
2
2
  export type { TextProp, TextProp as TextProps, HeadingProp, HeadingProp as HeadingProps, } from "../../props/components/general.prop.js";
3
3
  /**
4
4
  * Text — the typographic primitive. Use it INSTEAD of a hand-rolled `<span className="text-[13px]
5
- * font-medium text-muted-foreground">`. `size` only accepts steps of the golden-ratio type scale
6
- * (never an arbitrary px), `tone` maps to semantic foreground tokens, `weight` respects the system's
7
- * 2-weight scale. Fully token-driven via `[data-slot="text"]` rules in text-layout.css.
5
+ * font-medium text-muted-foreground">`.
8
6
  */
9
7
  export declare const Text: React.ForwardRefExoticComponent<Omit<React.HTMLAttributes<HTMLElement>, "color"> & {
10
8
  as?: "span" | "p" | "div" | "label" | "strong" | "em" | "small" | "code" | "kbd" | "dt" | "dd" | "caption" | "abbr";
@@ -0,0 +1,8 @@
1
+ import * as React from "react";
2
+ import type { AccountChipProp } from "../../props/components/layout.prop.js";
3
+ export type { AccountChipProp, AccountChipProp as AccountChipProps, } from "../../props/components/layout.prop.js";
4
+ /**
5
+ * Signed-in user for a PageContainer `extra` slot, a Topbar or a footer row: avatar, name and one
6
+ * ghost action, all at the control tier height, so it sits level with the buttons beside it.
7
+ */
8
+ export declare const AccountChip: React.ForwardRefExoticComponent<AccountChipProp & React.RefAttributes<HTMLDivElement>>;
@@ -0,0 +1,45 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { LogOut } from "lucide-react";
5
+ import { cn } from "../../lib/utils.js";
6
+ import { Avatar, AvatarFallback, AvatarImage } from "../data-display/avatar.js";
7
+ import { Button } from "../general/button.js";
8
+ import { Text } from "../general/typography.js";
9
+ import { flexGapClass } from "../../lib/variants.js";
10
+ const AccountChip = React.forwardRef(
11
+ ({ name, email, avatarSrc, avatarFallback, actionLabel, onAction, disabled, className }, ref) => /* @__PURE__ */ jsxs(
12
+ "div",
13
+ {
14
+ ref,
15
+ "data-slot": "account-chip",
16
+ "data-direction": "row",
17
+ "data-align": "center",
18
+ className: cn("ui-flex", flexGapClass.xs, "ui-account-chip", className),
19
+ title: email,
20
+ children: [
21
+ /* @__PURE__ */ jsxs(Avatar, { "aria-hidden": "true", children: [
22
+ avatarSrc ? /* @__PURE__ */ jsx(AvatarImage, { src: avatarSrc, alt: "" }) : null,
23
+ /* @__PURE__ */ jsx(AvatarFallback, { children: avatarFallback ?? name.slice(0, 1) })
24
+ ] }),
25
+ /* @__PURE__ */ jsx(Text, { truncate: true, children: name }),
26
+ onAction ? /* @__PURE__ */ jsx(
27
+ Button,
28
+ {
29
+ variant: "ghost",
30
+ size: "icon",
31
+ disabled,
32
+ onClick: onAction,
33
+ "aria-label": typeof actionLabel === "string" ? actionLabel : void 0,
34
+ title: typeof actionLabel === "string" ? actionLabel : void 0,
35
+ children: /* @__PURE__ */ jsx(LogOut, { "aria-hidden": "true" })
36
+ }
37
+ ) : null
38
+ ]
39
+ }
40
+ )
41
+ );
42
+ AccountChip.displayName = "AccountChip";
43
+ export {
44
+ AccountChip
45
+ };
@@ -1,14 +1,7 @@
1
1
  import type { AuthDividerProp } from "../../props/components/layout.prop.js";
2
2
  export type { AuthDividerProp, AuthDividerProp as AuthDividerProps, } from "../../props/components/layout.prop.js";
3
3
  /**
4
- * AuthDivider — a centred, localized conjunction between two equal separator rules.
5
- *
6
- * Since gh#308 this is a thin PRESET over `Separator label`, not a parallel implementation: the
7
- * grid, the accessible-name contract and the rule geometry all live on the primitive, and
8
- * `.ui-auth-divider` only re-points Separator's `--separator-*` knobs at the `--auth-shell-divider-*`
9
- * layer. That keeps #263's canonical login geometry byte-for-byte identical while breaking the
10
- * coupling the issue reported — a service retuning its login divider no longer retunes every day
11
- * divider in its message streams, and vice versa. New code that wants a labelled rule outside an
12
- * auth form should use `<Separator label>` directly.
4
+ * AuthDivider — a centred, localized conjunction between two equal separator rules. New code that
5
+ * wants a labelled rule outside an auth form should use `<Separator label>` directly.
13
6
  */
14
7
  export declare function AuthDivider({ label, className }: AuthDividerProp): import("react").JSX.Element;
@@ -3,19 +3,6 @@ export type { AuthShellProp, AuthShellProp as AuthShellProps, } from "../../prop
3
3
  /**
4
4
  * AuthShell — centred auth/login page shell (login · mfa · passkey · device · reset). A top brand
5
5
  * bar (banner), a centred `main` that holds the auth `Card`, and an optional footer (contentinfo),
6
- * over a `min-h-dvh` surface. Control density is scoped to the comfortable tier (44px, the WCAG
7
- * touch floor) and the auth heading is bumped up, so forms read at the right size — replacing a
8
- * consumer's `.auth-shell-*` / `.ui-auth-scope` classes. Motion is delegated to `Reveal` (wrap the
9
- * card) so `prefers-reduced-motion` is honoured in one place.
10
- *
11
- * `preset` names the flow MEASURE (card max-width + desktop/mobile page gutters) so a consumer
12
- * never overrides page geometry by hand: `"login"` = SCR-001's stable identity/card/footer anchor
13
- * for standalone and real requester states; `"registration"` = the 360px sign-up measure,
14
- * start-aligned like login (a tall sign-up card must scroll, not clip its own top above the scroll
15
- * origin) and the only one with its own footer clearance; `"device-authorization"` = 380px card
16
- * with a 5px inline gutter at 390px; `"context-selection"` = 25rem card, edge-to-edge on mobile;
17
- * `"account-recovery"` = the 432px SCR-008 panel measure shared by password recovery and the
18
- * sign-in MFA challenge, with a 15px inline gutter at 390px. It is orthogonal to `variant` —
19
- * combine `variant="canonical"` with any preset.
6
+ * over a `min-h-dvh` surface.
20
7
  */
21
8
  export declare function AuthShell({ brand, footer, children, variant, preset, density, className, }: AuthShellProp): import("react").JSX.Element;
@@ -3,11 +3,7 @@ import type { BreadcrumbProp } from "../../props/vocabulary/navigation.prop.js";
3
3
  export type BreadcrumbProps = {
4
4
  items: BreadcrumbProp;
5
5
  linkComponent?: ElementType;
6
- /**
7
- * Override the `<nav>` landmark's accessible name. Defaults to a localized "Breadcrumb".
8
- * Multiple Breadcrumb instances on one page/view need a DISTINCT name each — two `<nav>`
9
- * landmarks sharing one name/role fail axe's `landmark-unique` (WCAG 2.4.1 / 1.3.1).
10
- */
6
+ /** Override the `<nav>` landmark's accessible name. Defaults to a localized "Breadcrumb". */
11
7
  ariaLabel?: string;
12
8
  };
13
9
  export declare function Breadcrumb({ items, linkComponent: LinkComponent, ariaLabel, }: BreadcrumbProps): import("react").JSX.Element;
@@ -3,23 +3,9 @@ export type { CenteredShellProp, CenteredShellProp as CenteredShellProps, } from
3
3
  /**
4
4
  * CenteredShell — authenticated, no-sidebar, centred-column page shell: the hosted-ID "My Page",
5
5
  * account / self-service, and standalone-settings shape. It fills the gap between the two existing
6
- * shells:
7
- *
8
- * - `AppShell` REQUIRES a sidebar its padded topbar chrome (`.app-topbar`) is a grid area beside
9
- * the nav rail, so you cannot get a padded top bar without a rail.
10
- * - `AuthShell` is the UNAUTHENTICATED root (login/mfa/reset); it centres a narrow ~24rem card
11
- * VERTICALLY and has no top-right actions slot.
12
- *
13
- * CenteredShell gives a **padded top bar with real actions** (banner) reusing the SAME chrome as
14
- * `.app-topbar` (padding-inline · border · backdrop) WITHOUT a sidebar, a scrollable `main` whose
15
- * content is a **centred column** of a configurable medium width (`width` = sm|md|lg, all wider than
16
- * the 24rem auth card) **top-aligned** so sections flow and scroll (not vertically centred), and an
17
- * optional footer (contentinfo) — or, with `align="center"`, the column centred in the viewport for
18
- * a SYSTEM-level standalone surface (a 500/503 error page, a maintenance notice), so that full-page
19
- * geometry stays package-owned instead of a consumer re-implementing `min-h-dvh` + flex centring.
20
- * A hosted account page thus needs ZERO custom CSS and never
21
- * hand-rolls a bar (the bare `Topbar` primitive ships no padding — the `.ui-topbar` zero-inset
22
- * footgun). Layout-only: delegate motion to `Reveal` (wrap a section) so `prefers-reduced-motion`
23
- * is honoured in one place.
6
+ * shells: - `AppShell` REQUIRES a sidebar — its padded topbar chrome (`.app-topbar`) is a grid
7
+ * area beside the nav rail, so you cannot get a padded top bar without a rail. - `AuthShell` is
8
+ * the UNAUTHENTICATED root (login/mfa/reset); it centres a narrow ~24rem card VERTICALLY and has
9
+ * no top-right actions slot.
24
10
  */
25
11
  export declare function CenteredShell({ topbar, footer, children, width, align, preset, className, }: CenteredShellProp): import("react").JSX.Element;
@@ -3,33 +3,16 @@ import type { ErrorSurfaceProp } from "../../props/components/layout.prop.js";
3
3
  export type { ErrorSurfaceMaintenanceProp, ErrorSurfaceProp, ErrorSurfaceProp as ErrorSurfaceProps, } from "../../props/components/layout.prop.js";
4
4
  export type { ErrorSurfaceModeProp, ErrorSurfaceStatusProp } from "../../props/vocabulary/index.js";
5
5
  /**
6
- * ErrorSurface the package-owned semantic exception surface for **400 · 403 · 404 · 500 · 503**
7
- * (gh#221, gh#251, gh#301).
8
- *
9
- * It exists because the alternative every app composing `EmptyState` + `Flex` + `Text` inside a
10
- * hand-picked shell is unimportable: a consumer cannot `import` a docs page, so the four
11
- * exception screens drifted per application (a generic `Card` in an `AuthShell`, a local
12
- * `.canonical-auth-card`, a bespoke `min-h-dvh` class). What the surface owns is the CONTRACT the
13
- * composition kept losing:
14
- *
15
- * - **`mode` is the shell contract.** `application` (400/403/404) renders the surface as the BODY you
16
- * place inside the `AppShell` the route already provides, so the sidebar, topbar and breadcrumb
17
- * are PRESERVED — it never reconstructs navigation chrome, because nav data and the user menu are
18
- * consumer-owned and a component cannot manufacture them. `system` (500/503) owns the page and
19
- * renders `CenteredShell align="center"`, so the viewport-centred geometry at 1440 / 1024 / 390
20
- * is package-owned and the consumer writes no `min-h-dvh`, no flex-centring class, no media query.
21
- * - **Exactly one recovery action**, structurally (see `singleAction`).
22
- * - **Semantic metadata slots** instead of free-form paragraphs: `requestId` (mono/tabular so a
23
- * support id is read out accurately), `permission` and `organization` (which of the two a 403 is
24
- * actually about), and `maintenance` (ISO-8601 + IANA formatted through `Intl.DateTimeFormat`,
25
- * with an optional labelled `Progress` meter). Each is a `<dt>`/`<dd>` pair, so the label↔value
26
- * relationship survives for a screen reader instead of being a colon in a sentence.
27
- * - **Valid heading order by default** — `h2` under a `PageContainer` `h1` in `application` mode,
28
- * `h1` on a `system` page — and the status code announced as "HTTP status 403", not "403".
29
- *
30
- * PRODUCT COPY stays consumer-owned: `title` / `description` / `action` come from the app's own
31
- * `t()`. The surface localizes only its OWN metadata labels. It holds no state, runs no effect and
32
- * opens no portal, so it renders fully server-side — an exception page must be readable before
33
- * hydration.
6
+ * What the surface owns is the CONTRACT the composition kept losing: - **`mode` is the shell
7
+ * contract.** `application` (400/403/404) renders the surface as the BODY you place inside the
8
+ * `AppShell` the route already provides, so the sidebar, topbar and breadcrumb are PRESERVED — it
9
+ * never reconstructs navigation chrome, because nav data and the user menu are consumer-owned and
10
+ * a component cannot manufacture them. `system` (500/503) owns the page and renders `CenteredShell
11
+ * align="center"`, so the viewport-centred geometry at 1440 / 1024 / 390 is package-owned and the
12
+ * consumer writes no `min-h-dvh`, no flex-centring class, no media query. - **Exactly one recovery
13
+ * action**, structurally (see `singleAction`). - **Semantic metadata slots** instead of free-form
14
+ * paragraphs: `requestId` (mono/tabular so a support id is read out accurately), `permission` and
15
+ * `organization` (which of the two a 403 is actually about), and `maintenance` (ISO-8601 + IANA
16
+ * formatted through `Intl.DateTimeFormat`, with an optional labelled `Progress` meter).
34
17
  */
35
18
  export declare const ErrorSurface: React.ForwardRefExoticComponent<ErrorSurfaceProp & React.RefAttributes<HTMLDivElement>>;
@@ -15,6 +15,9 @@ const STATUS_META = {
15
15
  500: { icon: ServerCrash, tone: "destructive" },
16
16
  503: { icon: Wrench, tone: "warning" }
17
17
  };
18
+ function statusMeta(status) {
19
+ return STATUS_META[status] ?? (status >= 500 && status < 600 ? { icon: ServerCrash, tone: "destructive" } : { icon: TriangleAlert, tone: "warning" });
20
+ }
18
21
  function singleAction(action) {
19
22
  const flattened = React.Children.toArray(action).flatMap(
20
23
  (child) => React.isValidElement(child) && child.type === React.Fragment ? React.Children.toArray(child.props.children) : [child]
@@ -61,7 +64,7 @@ const ErrorSurface = React.forwardRef(
61
64
  className
62
65
  }, ref) {
63
66
  const { t, locale } = useTranslation();
64
- const meta = STATUS_META[status];
67
+ const meta = statusMeta(status);
65
68
  const resolvedIcon = icon ?? meta.icon;
66
69
  const resolvedTone = tone ?? meta.tone;
67
70
  const resolvedTitleLevel = titleLevel ?? (mode === "system" ? 1 : 2);
@@ -14,6 +14,8 @@ export { AuthDivider } from "./auth-divider.js";
14
14
  export type { AuthDividerProp, AuthDividerProps } from "./auth-divider.js";
15
15
  export { AuthIdentity } from "./auth-identity.js";
16
16
  export type { AuthIdentityProp, AuthIdentityProps } from "./auth-identity.js";
17
+ export { AccountChip } from "./account-chip.js";
18
+ export type { AccountChipProp, AccountChipProps } from "./account-chip.js";
17
19
  export { AuthAccountSummary } from "./auth-account-summary.js";
18
20
  export type { AuthAccountSummaryProp, AuthAccountSummaryProps } from "./auth-account-summary.js";
19
21
  export { AuthFooter } from "./auth-footer.js";
@@ -6,6 +6,7 @@ import { OrgSwitcher } from "./org-switcher.js";
6
6
  import { AuthShell } from "./auth-shell.js";
7
7
  import { AuthDivider } from "./auth-divider.js";
8
8
  import { AuthIdentity } from "./auth-identity.js";
9
+ import { AccountChip } from "./account-chip.js";
9
10
  import { AuthAccountSummary } from "./auth-account-summary.js";
10
11
  import { AuthFooter } from "./auth-footer.js";
11
12
  import { AuthStack } from "./auth-stack.js";
@@ -22,6 +23,7 @@ import { AspectRatio } from "./aspect-ratio.js";
22
23
  import { LegalDocumentShell } from "./legal-document-shell.js";
23
24
  import { ServiceRolePanel } from "./service-role-panel.js";
24
25
  export {
26
+ AccountChip,
25
27
  AppShell,
26
28
  AspectRatio,
27
29
  AuthAccountSummary,
@@ -2,33 +2,10 @@ import * as React from "react";
2
2
  import type { LegalDocumentShellProp } from "../../props/components/layout.prop.js";
3
3
  export type { LegalDocumentSectionProp, LegalDocumentShellProp, LegalDocumentShellProp as LegalDocumentShellProps, } from "../../props/components/layout.prop.js";
4
4
  /**
5
- * LegalDocumentShell — the long-form **legal / policy document** surface: terms of service, privacy
6
- * policy, DPA, cookie policy, SLA, EULA, security policy.
7
- *
8
- * It exists because a legal page is NOT expressible as `CenteredShell` + `SplitPane` + tokens: the
9
- * geometry is the easy half, and the half that keeps getting hand-rolled per app is the behaviour —
10
- *
11
- * - **scroll spy**: an `IntersectionObserver` marks the section at the reading line active, so the
12
- * contents list tracks the reader (`aria-current="location"`, never colour-only);
13
- * - **hash deep links**: `?#section-id` on load selects that section; activating a contents anchor
14
- * rewrites the hash (`history.replaceState`, so the Back button is never hijacked);
15
- * - **scroll offset**: `scroll-margin-block-start` from `--legal-document-scroll-offset`, so a jump
16
- * lands below sticky chrome with no offset arithmetic;
17
- * - **focus handoff**: the target `<section tabIndex={-1}>` takes focus (`preventScroll`), so a
18
- * keyboard/screen-reader user actually arrives IN the section, with a visible ring;
19
- * - **reduced motion**: the smooth scroll degrades to an instant jump under
20
- * `prefers-reduced-motion: reduce`.
21
- *
22
- * Semantics: `<article>` labelled by the `<h1>` · a NAMED `<nav>` for the contents · REAL
23
- * `<a href="#…">` anchors (middle-clickable, deep-linkable, work before JS boots) · one `<section>`
24
- * per entry labelled by its `<h2>`.
25
- *
26
- * Layout: the shell owns its query container, so the one-column ⇄ two-column decision comes from
27
- * its OWN width (the SplitPane precedent, gh#165). At ≥56rem the contents become a sticky rail
28
- * beside a measure-capped column; below that (the 390×844 case) the shell is a single column and
29
- * the contents are a static compact block between the header and the first section — never pinned,
30
- * so a phone loses no vertical space.
31
- *
32
- * ALL legal text stays consumer-owned: the shell only receives `sections` and slots.
5
+ * LegalDocumentShell — the long-form **legal / policy document** surface: terms of service,
6
+ * privacy policy, DPA, cookie policy, SLA, EULA, security policy. Semantics: `<article>` labelled
7
+ * by the `<h1>` · a NAMED `<nav>` for the contents · REAL `<a href="#…">` anchors
8
+ * (middle-clickable, deep-linkable, work before JS boots) · one `<section>` per entry labelled by
9
+ * its `<h2>`.
33
10
  */
34
11
  export declare const LegalDocumentShell: React.ForwardRefExoticComponent<LegalDocumentShellProp & React.RefAttributes<HTMLDivElement>>;