@godxjp/ui 19.1.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 (436) hide show
  1. package/README.md +25 -128
  2. package/dist/app/theme-axes.d.ts +4 -15
  3. package/dist/app/timezones.d.ts +1 -4
  4. package/dist/components/charts/area-chart.d.ts +2 -3
  5. package/dist/components/charts/bar-chart.d.ts +2 -3
  6. package/dist/components/charts/chart-frame.d.ts +7 -16
  7. package/dist/components/charts/chart-summary.d.ts +2 -2
  8. package/dist/components/charts/compact-bar-trend.d.ts +9 -24
  9. package/dist/components/charts/index.d.ts +1 -6
  10. package/dist/components/data-display/badge.d.ts +2 -12
  11. package/dist/components/data-display/card.d.ts +21 -41
  12. package/dist/components/data-display/carousel.d.ts +1 -2
  13. package/dist/components/data-display/code-block.d.ts +4 -0
  14. package/dist/components/data-display/code-block.js +24 -0
  15. package/dist/components/data-display/data-table.d.ts +15 -37
  16. package/dist/components/data-display/data-table.js +1 -3
  17. package/dist/components/data-display/descriptions.d.ts +2 -6
  18. package/dist/components/data-display/descriptions.js +0 -2
  19. package/dist/components/data-display/index.d.ts +4 -0
  20. package/dist/components/data-display/index.js +4 -0
  21. package/dist/components/data-display/list-row.d.ts +3 -22
  22. package/dist/components/data-display/permission-matrix.d.ts +7 -20
  23. package/dist/components/data-display/progress.d.ts +1 -1
  24. package/dist/components/data-display/prose.d.ts +4 -0
  25. package/dist/components/data-display/prose.js +20 -0
  26. package/dist/components/data-display/service-launcher-card.d.ts +3 -10
  27. package/dist/components/data-display/table.d.ts +20 -80
  28. package/dist/components/data-display/table.js +0 -3
  29. package/dist/components/data-display/timeline.d.ts +3 -5
  30. package/dist/components/data-entry/branch-scope-picker.d.ts +2 -19
  31. package/dist/components/data-entry/branch-scope-picker.js +0 -1
  32. package/dist/components/data-entry/calendar.d.ts +3 -2
  33. package/dist/components/data-entry/calendar.js +58 -3
  34. package/dist/components/data-entry/command-palette.d.ts +8 -22
  35. package/dist/components/data-entry/date-picker.d.ts +4 -5
  36. package/dist/components/data-entry/date-picker.js +6 -1
  37. package/dist/components/data-entry/date-range-picker.d.ts +1 -1
  38. package/dist/components/data-entry/date-range-picker.js +8 -3
  39. package/dist/components/data-entry/form-errors.d.ts +7 -18
  40. package/dist/components/data-entry/form-field.js +1 -5
  41. package/dist/components/data-entry/form.d.ts +1 -9
  42. package/dist/components/data-entry/input.d.ts +16 -14
  43. package/dist/components/data-entry/input.js +3 -0
  44. package/dist/components/data-entry/month-picker.js +2 -2
  45. package/dist/components/data-entry/month-range-picker.d.ts +4 -6
  46. package/dist/components/data-entry/month-range-picker.js +2 -2
  47. package/dist/components/data-entry/number-input.d.ts +1 -5
  48. package/dist/components/data-entry/number-input.js +1 -0
  49. package/dist/components/data-entry/radio.js +0 -1
  50. package/dist/components/data-entry/search-select.d.ts +2 -4
  51. package/dist/components/data-entry/select.d.ts +11 -6
  52. package/dist/components/data-entry/select.js +4 -2
  53. package/dist/components/data-entry/switch.js +0 -1
  54. package/dist/components/data-entry/textarea.d.ts +10 -16
  55. package/dist/components/data-entry/time-picker.d.ts +3 -5
  56. package/dist/components/data-entry/upload-types.d.ts +1 -5
  57. package/dist/components/data-entry/use-upload-draft.d.ts +0 -4
  58. package/dist/components/feedback/dialog.d.ts +6 -15
  59. package/dist/components/feedback/overlay-header-tone.d.ts +1 -1
  60. package/dist/components/feedback/sheet.d.ts +3 -10
  61. package/dist/components/feedback/sheet.js +1 -1
  62. package/dist/components/feedback/sonner.js +2 -3
  63. package/dist/components/general/activity.d.ts +4 -30
  64. package/dist/components/general/button.js +1 -10
  65. package/dist/components/general/logo.d.ts +6 -28
  66. package/dist/components/general/reveal.d.ts +3 -9
  67. package/dist/components/general/typography.d.ts +1 -3
  68. package/dist/components/layout/account-chip.d.ts +8 -0
  69. package/dist/components/layout/account-chip.js +45 -0
  70. package/dist/components/layout/auth-divider.d.ts +2 -9
  71. package/dist/components/layout/auth-shell.d.ts +1 -14
  72. package/dist/components/layout/breadcrumb.d.ts +1 -5
  73. package/dist/components/layout/centered-shell.d.ts +4 -18
  74. package/dist/components/layout/error-surface.d.ts +11 -28
  75. package/dist/components/layout/error-surface.js +4 -1
  76. package/dist/components/layout/index.d.ts +2 -0
  77. package/dist/components/layout/index.js +2 -0
  78. package/dist/components/layout/legal-document-shell.d.ts +5 -28
  79. package/dist/components/layout/master-detail.d.ts +2 -18
  80. package/dist/components/layout/page-container.js +0 -1
  81. package/dist/components/layout/responsive-grid.d.ts +6 -1
  82. package/dist/components/layout/responsive-grid.js +9 -2
  83. package/dist/components/layout/service-role-panel.d.ts +7 -19
  84. package/dist/components/layout/sidebar.d.ts +5 -27
  85. package/dist/components/layout/sidebar.js +0 -1
  86. package/dist/components/layout/split-pane.d.ts +0 -7
  87. package/dist/components/layout/topbar.d.ts +1 -14
  88. package/dist/components/navigation/app-setting-picker.js +1 -3
  89. package/dist/components/navigation/filter-bar.d.ts +1 -6
  90. package/dist/components/navigation/pagination-utils.d.ts +2 -12
  91. package/dist/components/navigation/tabs-scroll.d.ts +2 -36
  92. package/dist/components/navigation/tabs.js +4 -8
  93. package/dist/components/query/data-state.d.ts +2 -2
  94. package/dist/components/ui/credential-reveal.d.ts +1 -4
  95. package/dist/components/ui/hover-card.d.ts +1 -2
  96. package/dist/components/ui/separator.d.ts +2 -15
  97. package/dist/components/ui/toggle-group.d.ts +1 -5
  98. package/dist/components/ui/toggle.d.ts +6 -31
  99. package/dist/email/brand-mark.d.ts +6 -34
  100. package/dist/email/color.d.ts +7 -17
  101. package/dist/email/geometry.d.ts +4 -8
  102. package/dist/email/index.d.ts +4 -48
  103. package/dist/email/inline-style.d.ts +3 -9
  104. package/dist/email/urgency.d.ts +2 -7
  105. package/dist/form/form-context.d.ts +2 -5
  106. package/dist/form/form-root.d.ts +1 -2
  107. package/dist/i18n/messages/en.json +4 -0
  108. package/dist/i18n/messages/ja.json +4 -0
  109. package/dist/i18n/messages/vi.json +4 -0
  110. package/dist/inertia/index.d.ts +2 -10
  111. package/dist/lib/control-styles.d.ts +10 -21
  112. package/dist/lib/control-styles.js +4 -6
  113. package/dist/lib/datetime/format-date.d.ts +1 -4
  114. package/dist/lib/field-a11y.d.ts +11 -68
  115. package/dist/lib/field-a11y.js +0 -1
  116. package/dist/lib/format.d.ts +4 -8
  117. package/dist/lib/hooks.d.ts +6 -12
  118. package/dist/lib/permission-grid.d.ts +3 -18
  119. package/dist/lib/query-error.d.ts +3 -3
  120. package/dist/props/components/app.prop.d.ts +15 -38
  121. package/dist/props/components/charts.prop.d.ts +2 -3
  122. package/dist/props/components/data-display.prop.d.ts +48 -72
  123. package/dist/props/components/data-entry.prop.d.ts +35 -40
  124. package/dist/props/components/form.prop.d.ts +2 -6
  125. package/dist/props/components/general.prop.d.ts +11 -27
  126. package/dist/props/components/layout.prop.d.ts +89 -260
  127. package/dist/props/components/navigation.prop.d.ts +27 -42
  128. package/dist/props/registry.d.ts +31 -0
  129. package/dist/props/registry.js +33 -0
  130. package/dist/props/vocabulary/data.prop.d.ts +18 -49
  131. package/dist/props/vocabulary/index.d.ts +1 -1
  132. package/dist/props/vocabulary/interaction.prop.d.ts +10 -12
  133. package/dist/props/vocabulary/layout.prop.d.ts +8 -30
  134. package/dist/props/vocabulary/shared.prop.d.ts +3 -2
  135. package/dist/styles/alert-layout.css +1 -32
  136. package/dist/styles/badge-layout.css +4 -18
  137. package/dist/styles/base.css +14 -113
  138. package/dist/styles/card-layout.css +6 -128
  139. package/dist/styles/chart-layout.css +2 -17
  140. package/dist/styles/control.css +380 -458
  141. package/dist/styles/core.css +21 -0
  142. package/dist/styles/data-display-layout.css +175 -94
  143. package/dist/styles/data-entry-layout.css +0 -45
  144. package/dist/styles/density.css +1 -30
  145. package/dist/styles/dialog-layout.css +5 -69
  146. package/dist/styles/focus-ring.css +13 -87
  147. package/dist/styles/fonts.css +1 -31
  148. package/dist/styles/form-layout.css +7 -91
  149. package/dist/styles/index.css +2 -20
  150. package/dist/styles/layout.css +38 -456
  151. package/dist/styles/logo-layout.css +1 -35
  152. package/dist/styles/motion.css +3 -42
  153. package/dist/styles/navigation-layout.css +3 -50
  154. package/dist/styles/shell-layout.css +37 -403
  155. package/dist/styles/table-layout.css +16 -274
  156. package/dist/styles/text-layout.css +7 -21
  157. package/dist/styles/toggle.css +1 -23
  158. package/dist/theme/dxs.canonical.css +1 -55
  159. package/dist/theme/example.service.css +1 -26
  160. package/dist/theme/famgia.service.css +5 -15
  161. package/dist/tokens/axes.css +3 -40
  162. package/dist/tokens/base.css +1 -4
  163. package/dist/tokens/components/activity.css +6 -42
  164. package/dist/tokens/components/badge.css +4 -13
  165. package/dist/tokens/components/banner.css +4 -9
  166. package/dist/tokens/components/card.css +32 -88
  167. package/dist/tokens/components/chart.css +9 -26
  168. package/dist/tokens/components/control.css +37 -222
  169. package/dist/tokens/components/data-display.css +28 -79
  170. package/dist/tokens/components/data-entry.css +5 -19
  171. package/dist/tokens/components/descriptions.css +7 -27
  172. package/dist/tokens/components/email.css +38 -84
  173. package/dist/tokens/components/error-surface.css +2 -18
  174. package/dist/tokens/components/feedback.css +27 -124
  175. package/dist/tokens/components/form.css +13 -45
  176. package/dist/tokens/components/legal-document.css +16 -41
  177. package/dist/tokens/components/list-row.css +11 -36
  178. package/dist/tokens/components/logo.css +2 -57
  179. package/dist/tokens/components/navigation.css +16 -94
  180. package/dist/tokens/components/scroll-area.css +2 -18
  181. package/dist/tokens/components/separator.css +8 -30
  182. package/dist/tokens/components/sheet.css +3 -14
  183. package/dist/tokens/components/shell.css +53 -307
  184. package/dist/tokens/components/sidebar.css +5 -22
  185. package/dist/tokens/components/table.css +19 -140
  186. package/dist/tokens/components/toggle.css +3 -65
  187. package/dist/tokens/components/upload.css +7 -43
  188. package/dist/tokens/foundation.css +108 -383
  189. package/dist/tokens/semantic/layout.css +33 -207
  190. package/docs/CANONICAL-CONTRACTS.md +206 -0
  191. package/docs/COMPONENTS.md +157 -0
  192. package/docs/COMPOSITION-VS-COMPONENT.md +105 -0
  193. package/docs/CONSUMER-RULES.md +14 -0
  194. package/docs/CUSTOMER-THEMING.md +162 -0
  195. package/docs/DATETIME.md +69 -0
  196. package/docs/DEVELOPMENT.md +173 -0
  197. package/docs/FORMS.md +143 -0
  198. package/docs/FRAME-A11Y-CI.md +267 -0
  199. package/docs/FRAME-COVERAGE-LEDGER.md +123 -0
  200. package/docs/FRAME-COVERAGE-REPORT.md +140 -0
  201. package/docs/FRAME-COVERAGE-STANDARD.md +65 -0
  202. package/docs/FRAME-COVERAGE.md +29 -0
  203. package/docs/PROPS-REGISTRY.md +61 -0
  204. package/docs/PROPS-VOCABULARY.md +100 -0
  205. package/docs/README.md +60 -0
  206. package/docs/REGISTRY.md +70 -0
  207. package/docs/SPACING.md +56 -0
  208. package/docs/STANDARDS-vocabulary-tokens.md +48 -0
  209. package/docs/TESTING.md +98 -0
  210. package/docs/TOKENS.md +347 -0
  211. package/docs/asset-modules.d.ts +46 -0
  212. package/docs/assets/cover-terrain.svg +6 -0
  213. package/docs/assets/portrait-amber.svg +5 -0
  214. package/docs/assets/portrait-clay.svg +5 -0
  215. package/docs/assets/portrait-indigo.svg +5 -0
  216. package/docs/assets/portrait-iris.svg +5 -0
  217. package/docs/assets/portrait-moss.svg +5 -0
  218. package/docs/assets/portrait-plum.svg +5 -0
  219. package/docs/assets/portrait-slate.svg +5 -0
  220. package/docs/charts/compact-bar-trend.tsx +328 -0
  221. package/docs/charts/size-tiers.tsx +192 -0
  222. package/docs/data-display/accordion.tsx +99 -0
  223. package/docs/data-display/avatar.tsx +355 -0
  224. package/docs/data-display/badge.tsx +247 -0
  225. package/docs/data-display/card/examples/detail-panel.tsx +106 -0
  226. package/docs/data-display/card/index.md +3 -0
  227. package/docs/data-display/card/index.tsx +285 -0
  228. package/docs/data-display/carousel.tsx +156 -0
  229. package/docs/data-display/charts.tsx +198 -0
  230. package/docs/data-display/code-block.tsx +90 -0
  231. package/docs/data-display/collapsible.tsx +162 -0
  232. package/docs/data-display/credential-reveal.tsx +145 -0
  233. package/docs/data-display/data-table/examples/approval-queue.tsx +212 -0
  234. package/docs/data-display/data-table/examples/grid-features.tsx +158 -0
  235. package/docs/data-display/data-table/examples/list-page.tsx +175 -0
  236. package/docs/data-display/data-table/index.md +5 -0
  237. package/docs/data-display/data-table/index.tsx +295 -0
  238. package/docs/data-display/descriptions.tsx +143 -0
  239. package/docs/data-display/empty-state.tsx +164 -0
  240. package/docs/data-display/hover-card.tsx +181 -0
  241. package/docs/data-display/list-row.tsx +420 -0
  242. package/docs/data-display/permission-matrix.tsx +184 -0
  243. package/docs/data-display/popover-touch.tsx +27 -0
  244. package/docs/data-display/popover.tsx +245 -0
  245. package/docs/data-display/progress.tsx +84 -0
  246. package/docs/data-display/prose.tsx +105 -0
  247. package/docs/data-display/qr-code.tsx +68 -0
  248. package/docs/data-display/scroll-area.tsx +271 -0
  249. package/docs/data-display/service-launcher-card.tsx +145 -0
  250. package/docs/data-display/stat-card.tsx +99 -0
  251. package/docs/data-display/table.tsx +251 -0
  252. package/docs/data-display/timeline.tsx +112 -0
  253. package/docs/data-display/touch-actions.tsx +36 -0
  254. package/docs/data-display/tree-list.tsx +107 -0
  255. package/docs/data-entry/branch-scope-picker.tsx +123 -0
  256. package/docs/data-entry/calendar.tsx +180 -0
  257. package/docs/data-entry/cascader.tsx +378 -0
  258. package/docs/data-entry/checkbox.tsx +256 -0
  259. package/docs/data-entry/color-picker.tsx +117 -0
  260. package/docs/data-entry/command-palette.tsx +179 -0
  261. package/docs/data-entry/command.tsx +262 -0
  262. package/docs/data-entry/country-picker-recipe.tsx +170 -0
  263. package/docs/data-entry/date-picker.tsx +191 -0
  264. package/docs/data-entry/date-range-picker.tsx +149 -0
  265. package/docs/data-entry/form/examples/employee-settings.tsx +267 -0
  266. package/docs/data-entry/form/examples/invoice-form.tsx +387 -0
  267. package/docs/data-entry/form-field/examples/a11y-contract.tsx +240 -0
  268. package/docs/data-entry/form-field/examples/create-form.tsx +105 -0
  269. package/docs/data-entry/form-field/index.md +8 -0
  270. package/docs/data-entry/form-field/index.tsx +326 -0
  271. package/docs/data-entry/form-inertia.tsx +80 -0
  272. package/docs/data-entry/form-root.tsx +102 -0
  273. package/docs/data-entry/form.tsx +724 -0
  274. package/docs/data-entry/input-otp.tsx +231 -0
  275. package/docs/data-entry/input.tsx +114 -0
  276. package/docs/data-entry/label.tsx +100 -0
  277. package/docs/data-entry/month-picker.tsx +101 -0
  278. package/docs/data-entry/month-range-picker.tsx +115 -0
  279. package/docs/data-entry/number-input.tsx +240 -0
  280. package/docs/data-entry/password-input.tsx +106 -0
  281. package/docs/data-entry/password-strength.tsx +97 -0
  282. package/docs/data-entry/radio-group.tsx +95 -0
  283. package/docs/data-entry/rating.tsx +87 -0
  284. package/docs/data-entry/search-input.tsx +120 -0
  285. package/docs/data-entry/select-async-contracts.tsx +108 -0
  286. package/docs/data-entry/select-matrix.tsx +204 -0
  287. package/docs/data-entry/select.tsx +369 -0
  288. package/docs/data-entry/slider.tsx +130 -0
  289. package/docs/data-entry/switch.tsx +67 -0
  290. package/docs/data-entry/tag-input.tsx +108 -0
  291. package/docs/data-entry/textarea.tsx +209 -0
  292. package/docs/data-entry/time-picker.tsx +99 -0
  293. package/docs/data-entry/toggle-count.tsx +293 -0
  294. package/docs/data-entry/toggle-group.tsx +225 -0
  295. package/docs/data-entry/toggle.tsx +127 -0
  296. package/docs/data-entry/transfer.tsx +97 -0
  297. package/docs/data-entry/tree-select.tsx +204 -0
  298. package/docs/data-entry/upload.tsx +184 -0
  299. package/docs/feedback/alert-dialog.tsx +270 -0
  300. package/docs/feedback/alert.tsx +248 -0
  301. package/docs/feedback/banner.tsx +183 -0
  302. package/docs/feedback/danger-confirm.tsx +88 -0
  303. package/docs/feedback/dialog-touch.tsx +24 -0
  304. package/docs/feedback/dialog.tsx +193 -0
  305. package/docs/feedback/sheet.tsx +410 -0
  306. package/docs/feedback/skeleton.tsx +111 -0
  307. package/docs/feedback/toast.tsx +135 -0
  308. package/docs/feedback/tooltip.tsx +171 -0
  309. package/docs/feedback/two-factor-setup.tsx +68 -0
  310. package/docs/foundation/_email-specimen.ts +274 -0
  311. package/docs/foundation/colors.tsx +202 -0
  312. package/docs/foundation/density.tsx +232 -0
  313. package/docs/foundation/email-tokens.tsx +306 -0
  314. package/docs/foundation/radius-shadow.tsx +152 -0
  315. package/docs/foundation/spacing.tsx +211 -0
  316. package/docs/foundation/typography.tsx +147 -0
  317. package/docs/general/activity.tsx +224 -0
  318. package/docs/general/button/examples/destructive-confirm.tsx +90 -0
  319. package/docs/general/button/examples/form-actions.tsx +85 -0
  320. package/docs/general/button/examples/toolbar.tsx +160 -0
  321. package/docs/general/button/index.md +12 -0
  322. package/docs/general/button/index.tsx +211 -0
  323. package/docs/general/logo.tsx +131 -0
  324. package/docs/general/reveal.tsx +41 -0
  325. package/docs/general/typography.tsx +152 -0
  326. package/docs/layout/account-chip.tsx +72 -0
  327. package/docs/layout/admin-collection.tsx +122 -0
  328. package/docs/layout/app-shell.tsx +374 -0
  329. package/docs/layout/aspect-ratio.tsx +119 -0
  330. package/docs/layout/auth-account-summary.tsx +103 -0
  331. package/docs/layout/auth-divider.tsx +28 -0
  332. package/docs/layout/auth-footer.tsx +37 -0
  333. package/docs/layout/auth-identity.tsx +36 -0
  334. package/docs/layout/auth-recovery/examples/mfa-challenge.md +41 -0
  335. package/docs/layout/auth-recovery/examples/mfa-challenge.tsx +254 -0
  336. package/docs/layout/auth-recovery/examples/mobile-390.md +25 -0
  337. package/docs/layout/auth-recovery/examples/mobile-390.tsx +82 -0
  338. package/docs/layout/auth-recovery/examples/password-recovery.md +24 -0
  339. package/docs/layout/auth-recovery/examples/password-recovery.tsx +197 -0
  340. package/docs/layout/auth-recovery/examples/wrapping-ja-en-vi.md +27 -0
  341. package/docs/layout/auth-recovery/examples/wrapping-ja-en-vi.tsx +156 -0
  342. package/docs/layout/auth-recovery/index.md +140 -0
  343. package/docs/layout/auth-recovery/index.tsx +96 -0
  344. package/docs/layout/auth-shell-context.tsx +103 -0
  345. package/docs/layout/auth-shell-device.tsx +112 -0
  346. package/docs/layout/auth-shell-registration.tsx +335 -0
  347. package/docs/layout/auth-shell-variants.tsx +139 -0
  348. package/docs/layout/auth-shell.tsx +59 -0
  349. package/docs/layout/auth-stack.tsx +40 -0
  350. package/docs/layout/centered-shell.tsx +102 -0
  351. package/docs/layout/error-surface/examples/application-403.tsx +84 -0
  352. package/docs/layout/error-surface/examples/application-404.tsx +77 -0
  353. package/docs/layout/error-surface/examples/system-500.tsx +47 -0
  354. package/docs/layout/error-surface/examples/system-503.tsx +48 -0
  355. package/docs/layout/error-surface/index.md +153 -0
  356. package/docs/layout/error-surface/index.tsx +239 -0
  357. package/docs/layout/flex.tsx +262 -0
  358. package/docs/layout/legal-document-shell/_data.ts +110 -0
  359. package/docs/layout/legal-document-shell/examples/desktop-1440.md +12 -0
  360. package/docs/layout/legal-document-shell/examples/desktop-1440.tsx +83 -0
  361. package/docs/layout/legal-document-shell/examples/mobile-390.md +22 -0
  362. package/docs/layout/legal-document-shell/examples/mobile-390.tsx +70 -0
  363. package/docs/layout/legal-document-shell/examples/tablet-1024.md +3 -0
  364. package/docs/layout/legal-document-shell/examples/tablet-1024.tsx +84 -0
  365. package/docs/layout/legal-document-shell/examples/wrapping-ja-en-vi.md +18 -0
  366. package/docs/layout/legal-document-shell/examples/wrapping-ja-en-vi.tsx +61 -0
  367. package/docs/layout/legal-document-shell/index.md +51 -0
  368. package/docs/layout/legal-document-shell/index.tsx +101 -0
  369. package/docs/layout/master-detail.tsx +387 -0
  370. package/docs/layout/org-switcher.tsx +131 -0
  371. package/docs/layout/page-container.tsx +946 -0
  372. package/docs/layout/resizable-panel.tsx +419 -0
  373. package/docs/layout/responsive-grid.tsx +235 -0
  374. package/docs/layout/separator.tsx +327 -0
  375. package/docs/layout/service-role-panel.tsx +144 -0
  376. package/docs/layout/sidebar.tsx +586 -0
  377. package/docs/layout/split-pane.tsx +451 -0
  378. package/docs/layout/topbar.tsx +347 -0
  379. package/docs/navigation/app-setting-picker.tsx +141 -0
  380. package/docs/navigation/breadcrumb.tsx +128 -0
  381. package/docs/navigation/context-menu.tsx +117 -0
  382. package/docs/navigation/dropdown-menu.tsx +213 -0
  383. package/docs/navigation/filter-bar.tsx +227 -0
  384. package/docs/navigation/menubar.tsx +141 -0
  385. package/docs/navigation/navigation-menu.tsx +165 -0
  386. package/docs/navigation/pagination.tsx +241 -0
  387. package/docs/navigation/steps.tsx +263 -0
  388. package/docs/navigation/tabs-rtl.tsx +28 -0
  389. package/docs/navigation/tabs.tsx +308 -0
  390. package/docs/navigation/toolbar.tsx +339 -0
  391. package/docs/providers/app-provider.tsx +191 -0
  392. package/docs/providers/format-date.tsx +230 -0
  393. package/docs/query/button-refetch.tsx +160 -0
  394. package/docs/query/data-state.tsx +192 -0
  395. package/docs/query/infinite-query-state.tsx +93 -0
  396. package/docs/query/mutation-feedback.tsx +70 -0
  397. package/docs/query/prefetch-link.tsx +262 -0
  398. package/docs/query/touch-actions.tsx +68 -0
  399. package/docs/showcase/acme-portal.tsx +441 -0
  400. package/docs/showcase/acme-website.tsx +455 -0
  401. package/docs/showcase/case1-warehouse-dashboard.tsx +343 -0
  402. package/docs/showcase/case2-employee-me.tsx +441 -0
  403. package/docs/showcase/case3-approval-workflow.tsx +527 -0
  404. package/docs/showcase/case4-login.tsx +307 -0
  405. package/docs/showcase/case5-shift-calendar.tsx +795 -0
  406. package/docs/showcase/case6-agency-handy.tsx +1072 -0
  407. package/docs/showcase/futurelastic-web.tsx +390 -0
  408. package/docs/showcase/org-switcher.tsx +313 -0
  409. package/docs/showcase/permission-matrix.tsx +343 -0
  410. package/docs/showcase/public-landing.tsx +210 -0
  411. package/docs/showcase/settings-account-sections.tsx +559 -0
  412. package/docs/showcase/settings-security-mfa.tsx +145 -0
  413. package/docs/showcase/table-approval-queue.tsx +199 -0
  414. package/docs/showcase/table-bulk-actions.tsx +460 -0
  415. package/docs/showcase/table-compact-kintone.tsx +438 -0
  416. package/docs/showcase/table-conditional-format.tsx +367 -0
  417. package/docs/showcase/table-crud-list.tsx +544 -0
  418. package/docs/showcase/table-density.tsx +340 -0
  419. package/docs/showcase/table-expandable-rows.tsx +471 -0
  420. package/docs/showcase/table-filter-chips.tsx +461 -0
  421. package/docs/showcase/table-footer-totals.tsx +311 -0
  422. package/docs/showcase/table-grouped-subtotals.tsx +388 -0
  423. package/docs/showcase/table-master-detail.tsx +479 -0
  424. package/docs/showcase/table-pagination.tsx +320 -0
  425. package/docs/showcase/table-states.tsx +363 -0
  426. package/docs/showcase/table-sticky-columns.tsx +373 -0
  427. package/docs/showcase/table-tree-rows.tsx +444 -0
  428. package/docs/showcase/table-view-tabs.tsx +488 -0
  429. package/package.json +9 -11
  430. package/scripts/_agent-setup.mjs +16 -2
  431. package/scripts/audit-hook.mjs +3 -13
  432. package/scripts/init-agent-kit.mjs +1 -14
  433. package/scripts/postinstall.mjs +12 -12
  434. package/scripts/ui-audit.mjs +93 -31
  435. package/scripts/visual-audit-rules.mjs +51 -7
  436. package/scripts/visual-audit.mjs +118 -47
@@ -0,0 +1,21 @@
1
+
2
+ @import "sonner/dist/styles.css";
3
+ @import "react-day-picker/style.css";
4
+ @import "./base.css";
5
+ @import "./shell-layout.css";
6
+ @import "./motion.css";
7
+ @import "./layout.css";
8
+ @import "./control.css";
9
+ @import "./toggle.css";
10
+ @import "./logo-layout.css";
11
+ @import "./card-layout.css";
12
+ @import "./text-layout.css";
13
+ @import "./table-layout.css";
14
+ @import "./dialog-layout.css";
15
+ @import "./alert-layout.css";
16
+ @import "./badge-layout.css";
17
+ @import "./data-display-layout.css";
18
+ @import "./data-entry-layout.css";
19
+ @import "./form-layout.css";
20
+ @import "./navigation-layout.css";
21
+ @import "./chart-layout.css";
@@ -9,7 +9,6 @@
9
9
  justify-content: center;
10
10
  overflow: hidden;
11
11
  border-radius: var(--radius-pill);
12
- /* Tint washes over the role background (default transparent = no-op, rule #44). */
13
12
  background:
14
13
  linear-gradient(var(--avatar-tint), var(--avatar-tint)),
15
14
  var(--avatar-background, hsl(var(--muted)));
@@ -18,10 +17,6 @@
18
17
  font-weight: var(--font-weight-medium);
19
18
  }
20
19
 
21
- /* Entity-header mark — `<Avatar shape="square">` (gh#249). Opt-in ONLY: without the attribute the
22
- * avatar above is untouched. Geometry and colour are token-owned (rule #45); the brand fill is
23
- * handed down through --avatar-background so the fallback slot picks it up with no extra rule,
24
- * and a service that only wants a neutral square overrides --avatar-square-background. */
25
20
  .ui-avatar[data-shape="square"] {
26
21
  inline-size: var(--avatar-square-size);
27
22
  block-size: var(--avatar-square-size);
@@ -30,11 +25,6 @@
30
25
  color: var(--avatar-square-foreground, hsl(var(--primary-foreground)));
31
26
  }
32
27
 
33
- /* CAPABILITY MEDALLION — `<Avatar appearance="tinted">` (gh#12). The tinted companion of the
34
- * solid entity mark: same box, same radius, a soft role wash instead of a solid fill and the
35
- * glyph in the role itself. Declared AFTER the square rule (equal specificity) so it retints
36
- * either shape. The glyph rule is scoped to this appearance ON PURPOSE — a global
37
- * `.ui-avatar svg` would outrank the per-call-site icon classes existing avatars already use. */
38
28
  .ui-avatar[data-appearance="tinted"] {
39
29
  --avatar-background: var(--avatar-tinted-background, hsl(var(--primary) / 0.1));
40
30
  color: var(--avatar-tinted-foreground, hsl(var(--primary)));
@@ -61,14 +51,6 @@
61
51
  background: var(--avatar-background, hsl(var(--muted)));
62
52
  }
63
53
 
64
- /* PRESENCE (gh#309) — the realtime reachability dot on the mark itself.
65
- *
66
- * Opt-in ONLY: with no `presence` prop the avatar emits neither the attribute nor the node, so
67
- * every existing call site keeps today's DOM and today's clip. WITH it the ROOT stops clipping —
68
- * the dot straddles the mark's edge, which is exactly why a consumer could never place it from
69
- * outside — and the clip moves down onto the image/fallback, which is where it was doing the real
70
- * work. `border-radius: inherit` keeps that clip correct for both shapes: --radius-pill for a
71
- * person, --avatar-square-radius for an entity mark. */
72
54
  .ui-avatar[data-presence] {
73
55
  overflow: visible;
74
56
  }
@@ -79,16 +61,6 @@
79
61
  border-radius: inherit;
80
62
  }
81
63
 
82
- /* NEVER COLOUR-ALONE (WCAG 1.4.1). Three independent encodings ride together: the localized
83
- * sr-only string inside this span, a semantic ROLE colour, and a SHAPE — filled · half-filled ·
84
- * barred · hollow — so the four states stay apart in greyscale, for a deuteranope, and under
85
- * forced colors. `box-sizing: border-box` makes --avatar-presence-size the OUTER diameter, so the
86
- * state stroke never changes the dot's footprint between states.
87
- *
88
- * The dot is a state, not an event: nothing here animates, so there is nothing for
89
- * prefers-reduced-motion to switch off. Presence is deliberately NOT a live region either — a
90
- * roster of 40 avatars resyncing over a socket would flood a screen reader; announcing a CHANGE is
91
- * the consumer's call, in the consumer's own live region. */
92
64
  [data-slot="avatar-presence"] {
93
65
  position: absolute;
94
66
  inset-block-end: var(--avatar-presence-inset);
@@ -102,20 +74,16 @@
102
74
  border: var(--avatar-presence-stroke-width) solid transparent;
103
75
  border-radius: var(--radius-pill);
104
76
  background-origin: border-box;
105
- /* Separator ring — chrome, therefore a knob (#44). It is what keeps the dot legible over a busy
106
- * photo; a service that puts the avatar on a coloured surface retunes the colour once. */
77
+
107
78
  box-shadow: 0 0 0 var(--avatar-presence-ring-width)
108
79
  hsl(var(--avatar-presence-ring-color, var(--background)));
109
80
  }
110
81
 
111
- /* ONLINE — a SOLID disc. */
112
82
  [data-slot="avatar-presence"][data-presence="online"] {
113
83
  border-color: hsl(var(--avatar-presence-online-color, var(--success)));
114
84
  background-color: hsl(var(--avatar-presence-online-color, var(--success)));
115
85
  }
116
86
 
117
- /* AWAY — a HALF-FILLED disc (block-end half), the one silhouette that survives greyscale next to
118
- * both the solid and the hollow states. */
119
87
  [data-slot="avatar-presence"][data-presence="away"] {
120
88
  border-color: hsl(var(--avatar-presence-away-color, var(--warning)));
121
89
  background-color: hsl(var(--avatar-presence-ring-color, var(--background)));
@@ -126,15 +94,11 @@
126
94
  );
127
95
  }
128
96
 
129
- /* BUSY (do-not-disturb) — a solid disc CUT by a horizontal bar. */
130
97
  [data-slot="avatar-presence"][data-presence="busy"] {
131
98
  border-color: hsl(var(--avatar-presence-busy-color, var(--destructive)));
132
99
  background-color: hsl(var(--avatar-presence-busy-color, var(--destructive)));
133
100
  }
134
101
 
135
- /* `inset: 0; margin: auto` centres the bar in BOTH axes with no translate, so it stays centred
136
- * under dir="rtl" (a start-anchored `translate(-50%)` would slide it off-centre when the inline
137
- * axis flips). */
138
102
  [data-slot="avatar-presence"][data-presence="busy"]::before {
139
103
  content: "";
140
104
  position: absolute;
@@ -146,19 +110,11 @@
146
110
  background: hsl(var(--avatar-presence-ring-color, var(--background)));
147
111
  }
148
112
 
149
- /* OFFLINE — a HOLLOW ring. Distinct from an ABSENT `presence`, which draws nothing at all: absent
150
- * means "this entity has no presence concept" (an organization mark), offline means "known to be
151
- * unreachable" — the same distinction ListRow draws between an omitted and a `false` `unread`. */
152
113
  [data-slot="avatar-presence"][data-presence="offline"] {
153
114
  border-color: hsl(var(--avatar-presence-offline-color, var(--muted-foreground)));
154
115
  background-color: hsl(var(--avatar-presence-ring-color, var(--background)));
155
116
  }
156
117
 
157
- /* FORCED COLORS — the UA replaces author colours, and box-shadow is dropped outright, so the
158
- * separator ring would vanish into the mark and all four states would collapse to one swatch.
159
- * System-colour keywords ARE honoured inside this block, so re-draw the ring as an outline and
160
- * re-state each silhouette in Canvas / CanvasText: the shape encoding survives, which is the half
161
- * of WCAG 1.4.1 that a colour-only dot loses here first. */
162
118
  @media (forced-colors: active) {
163
119
  [data-slot="avatar-presence"] {
164
120
  border-color: CanvasText;
@@ -207,9 +163,6 @@
207
163
  background: hsl(var(--destructive));
208
164
  }
209
165
 
210
- /* Over-capacity: keep the destructive fill but lay a diagonal hatch over it so an over-limit bar
211
- * (value > 100, width still capped at 100%) is visually distinct from a full one. Placed after the
212
- * tone rules so background-color wins; background-image carries the stripes. */
213
166
  .ui-progress[data-over] .ui-progress-bar {
214
167
  background-color: hsl(var(--destructive));
215
168
  background-image: repeating-linear-gradient(
@@ -296,8 +249,6 @@
296
249
  column-gap: var(--space-stack-md);
297
250
  }
298
251
 
299
- /* Spacing lives INSIDE the item (not a flex gap between items) so the rail line
300
- spans the full item height and the connector stays continuous dot-to-dot. */
301
252
  .ui-timeline-body {
302
253
  padding-bottom: var(--space-stack-md);
303
254
  }
@@ -326,13 +277,11 @@
326
277
  line-height: 1;
327
278
  }
328
279
 
329
- /* done → success fill. */
330
280
  .ui-timeline-dot[data-status="done"] {
331
281
  background: var(--timeline-dot-done-background, hsl(var(--success)));
332
282
  color: hsl(var(--success-foreground));
333
283
  }
334
284
 
335
- /* current → primary fill + ring (also the legacy data-current shorthand). */
336
285
  .ui-timeline-dot[data-status="current"],
337
286
  .ui-timeline-dot[data-current="true"] {
338
287
  background: var(--timeline-dot-current-background, hsl(var(--primary)));
@@ -340,7 +289,6 @@
340
289
  box-shadow: 0 0 0 3px hsl(var(--primary) / 0.18);
341
290
  }
342
291
 
343
- /* pending → muted outline on the surface (no fill). */
344
292
  .ui-timeline-dot[data-status="pending"] {
345
293
  border-color: hsl(var(--border));
346
294
  background: hsl(var(--background));
@@ -352,7 +300,6 @@
352
300
  height: 0.75rem;
353
301
  }
354
302
 
355
- /* current pip glyph for variant="status" (filled inner dot). */
356
303
  .ui-timeline-pip {
357
304
  display: block;
358
305
  width: 0.5rem;
@@ -368,7 +315,6 @@
368
315
  background: hsl(var(--border));
369
316
  }
370
317
 
371
- /* The segment below a done/current step reads as travelled (completed). */
372
318
  .ui-timeline-line[data-completed="true"] {
373
319
  background: var(--timeline-line-completed-background, hsl(var(--primary)));
374
320
  }
@@ -402,7 +348,6 @@
402
348
  }
403
349
  }
404
350
 
405
- /* Accordion */
406
351
  .ui-accordion-item {
407
352
  border-bottom: 1px solid hsl(var(--border));
408
353
  }
@@ -450,7 +395,6 @@
450
395
  padding-bottom: var(--space-4);
451
396
  }
452
397
 
453
- /* HoverCard */
454
398
  .ui-hover-card-content {
455
399
  z-index: 50;
456
400
  width: 16rem;
@@ -518,7 +462,6 @@
518
462
  height: var(--carousel-arrow-icon-size);
519
463
  }
520
464
 
521
- /* Dot indicators — horizontal, centered row of round dots; the active one fills + widens. */
522
465
  .ui-carousel-dots {
523
466
  display: flex;
524
467
  flex-wrap: wrap;
@@ -548,7 +491,6 @@
548
491
  background: hsl(var(--primary));
549
492
  }
550
493
 
551
- /* Vertical orientation — stack the dots into a column beside the track. */
552
494
  .ui-carousel[data-orientation="vertical"] .ui-carousel-dots {
553
495
  flex-direction: column;
554
496
  }
@@ -558,7 +500,6 @@
558
500
  height: var(--space-5);
559
501
  }
560
502
 
561
- /* Vertical orientation (opts.axis === "y") — flips the track and the arrow positions. */
562
503
  .ui-carousel[data-orientation="vertical"] .ui-carousel-content {
563
504
  flex-direction: column;
564
505
  margin-inline: 0;
@@ -589,14 +530,7 @@
589
530
  }
590
531
 
591
532
  @layer components {
592
- /* ListRow — single-line entity row (indicator · leading · title/description · trailing) for
593
- * short lists inside a flush CardContent. Rows separate with a quiet divider; the last row
594
- * leaves the Card border to close the list. Logical properties throughout (RTL-safe).
595
- *
596
- * Overflow contract (#224): the row itself may shrink (min-inline-size: 0) and WRAPS, the
597
- * content column keeps only `min(--list-row-body-min-width, 100%)` — so it can always shrink
598
- * below its intrinsic width and truncate/wrap — and the trailing actions wrap onto their own
599
- * line instead of pushing the row (and the page root) wider than the viewport. */
533
+
600
534
  [data-slot="list-row"] {
601
535
  display: flex;
602
536
  min-inline-size: 0;
@@ -606,8 +540,7 @@
606
540
  padding: var(--list-row-padding-y) var(--list-row-padding-x);
607
541
  background: var(--list-row-read-background, transparent);
608
542
  }
609
- /* Unread emphasis surface — paired with the indicator dot + its sr-only text, never colour
610
- * alone (WCAG 1.4.1). */
543
+
611
544
  [data-slot="list-row"][data-unread] {
612
545
  background: var(--list-row-unread-background, hsl(var(--muted)));
613
546
  }
@@ -624,7 +557,7 @@
624
557
  inline-size: var(--list-row-indicator-size);
625
558
  block-size: var(--list-row-indicator-size);
626
559
  border-radius: var(--radius-pill);
627
- /* Read rows keep the gutter (titles stay on one optical axis) but paint nothing. */
560
+
628
561
  background: transparent;
629
562
  }
630
563
  [data-slot="list-row"][data-unread] [data-slot="list-row-indicator"] {
@@ -643,16 +576,10 @@
643
576
  flex: 1 1 var(--list-row-body-min-width, 12rem);
644
577
  flex-direction: column;
645
578
  }
646
- /* `overflow="wrap"` — the title/description wrap instead of truncating; `anywhere` also lowers
647
- * the min-content width so an unbroken token (URL, long JA/VI compound) can't widen the row. */
579
+
648
580
  [data-slot="list-row"][data-overflow="wrap"] [data-slot="list-row-body"] {
649
581
  overflow-wrap: anywhere;
650
582
  }
651
- /* `density="compact"` (#246) — the compact inline-actions geometry: tighter block padding and
652
- * column gap plus a LOWER body threshold, so a 36px avatar, the title/description and one or two
653
- * small trailing Buttons stay inline inside the canonical 326px content column at 390px. It only
654
- * LOWERS thresholds; the #224 overflow contract above is untouched (the row still wraps, the body
655
- * is still clamped with min(…, 100%)), so a compact row can never widen the page root. */
656
583
  [data-slot="list-row"][data-density="compact"] {
657
584
  gap: var(--list-row-compact-gap, var(--space-2));
658
585
  padding: var(--list-row-compact-padding-y, var(--space-2))
@@ -685,9 +612,6 @@
685
612
  }
686
613
  }
687
614
 
688
- /* CredentialReveal — one-time secret surface: caution banner, masked/revealed value row with
689
- * copy/reveal/download actions, and an optional acknowledge footer. Density-aware via the
690
- * --control-height tier; colours/spacing read semantic role tokens only. */
691
615
  .ui-credential-reveal {
692
616
  display: flex;
693
617
  flex-direction: column;
@@ -735,8 +659,6 @@
735
659
  justify-content: flex-end;
736
660
  }
737
661
 
738
- /* QrCode — a quiet, scanner-safe SVG surface with an ISO/IEC-style four-module quiet zone
739
- * supplied by the encoder. Sizing is natural rather than stretched across its container. */
740
662
  .ui-qr-code {
741
663
  display: block;
742
664
  inline-size: var(--qr-code-size-md);
@@ -756,20 +678,14 @@
756
678
  }
757
679
 
758
680
  @layer components {
759
- /* PERMISSION MATRIX — `.ui-permission-matrix` was a bare hook with no rule anywhere, so every
760
- * constant sat on the component (#319). */
761
681
  .ui-permission-matrix-table {
762
682
  min-inline-size: var(--permission-matrix-min-width);
763
683
  }
764
684
 
765
- /* Sticky first column: the scrolling grid passes UNDER it, so it needs an opaque ground.
766
- * Scoped through the matrix root because `[data-slot="table-head"]` sets its own background at
767
- * the same specificity — an unscoped rule would win only by import order, which is not a
768
- * property worth depending on. */
769
685
  .ui-permission-matrix .ui-permission-matrix-pin {
770
686
  position: sticky;
771
687
  inset-inline-start: 0;
772
- /* Above the scrolling cells, below any portaled overlay (--overlay-z-index). */
688
+
773
689
  z-index: 20;
774
690
  background-color: inherit;
775
691
  border-inline-end: 1px solid hsl(var(--border));
@@ -796,10 +712,7 @@
796
712
  }
797
713
 
798
714
  @layer components {
799
- /* SCROLL AREA — the custom scrollbar rail (#319). There was no `.ui-scroll*` rule anywhere: the
800
- * rail's whole geometry lived on the component as Tailwind literals, so a service could not
801
- * retune it. Logical sizing (inline-/block-size) keeps the rail correct in RTL and in vertical
802
- * writing modes; the thumb radius is a knob so a sharp-cornered theme squares it once. */
715
+
803
716
  .ui-scroll-area-bar {
804
717
  padding: var(--scroll-area-bar-padding);
805
718
  }
@@ -816,3 +729,171 @@
816
729
  border-radius: var(--scroll-area-thumb-radius);
817
730
  }
818
731
  }
732
+
733
+ @layer components {
734
+
735
+ :is(.ui-code-block, .ui-prose pre) {
736
+ margin: 0;
737
+ overflow: auto;
738
+ border-radius: var(--code-block-radius);
739
+ background: hsl(var(--muted));
740
+ padding: var(--code-block-space-inset);
741
+ color: hsl(var(--foreground));
742
+ font-family: var(--font-mono);
743
+ font-size: var(--code-block-font-size);
744
+ line-height: var(--code-block-line-height);
745
+ white-space: pre-wrap;
746
+ overflow-wrap: anywhere;
747
+ tab-size: 2;
748
+ }
749
+
750
+ :is(.ui-code-block, .ui-prose pre) > code {
751
+ font: inherit;
752
+ background: transparent;
753
+ padding: 0;
754
+ }
755
+
756
+ .ui-code-block[data-wrap="false"] {
757
+ white-space: pre;
758
+ overflow-wrap: normal;
759
+ }
760
+
761
+ .ui-code-block[data-size="xs"] {
762
+ font-size: var(--code-block-font-size-xs);
763
+ }
764
+
765
+ .ui-code-block[data-max-height="sm"] {
766
+ max-block-size: var(--code-block-max-height-sm);
767
+ }
768
+
769
+ .ui-code-block[data-max-height="md"] {
770
+ max-block-size: var(--code-block-max-height-md);
771
+ }
772
+
773
+ .ui-code-block[data-max-height="lg"] {
774
+ max-block-size: var(--code-block-max-height-lg);
775
+ }
776
+
777
+ .ui-prose {
778
+ font-size: var(--prose-font-size);
779
+ line-height: var(--prose-line-height);
780
+ overflow-wrap: anywhere;
781
+ }
782
+
783
+ .ui-prose[data-size="sm"] {
784
+ font-size: var(--prose-font-size-sm);
785
+ }
786
+
787
+ .ui-prose[data-image-size="original"] {
788
+ overflow-x: auto;
789
+ }
790
+
791
+ .ui-prose > * {
792
+ margin-block: 0;
793
+ }
794
+
795
+ .ui-prose > * + * {
796
+ margin-block-start: var(--prose-space-block);
797
+ }
798
+
799
+ .ui-prose :is(h1, h2, h3, h4) {
800
+ font-weight: var(--font-weight-semibold);
801
+ line-height: var(--line-height-tight);
802
+ text-wrap: balance;
803
+ }
804
+
805
+ .ui-prose > :is(h1, h2, h3, h4) + * {
806
+ margin-block-start: var(--prose-space-block);
807
+ }
808
+
809
+ .ui-prose > * + :is(h1, h2, h3, h4) {
810
+ margin-block-start: var(--prose-heading-space-block-start);
811
+ }
812
+
813
+ .ui-prose h1 {
814
+ font-size: var(--heading-h1);
815
+ }
816
+
817
+ .ui-prose h2 {
818
+ font-size: var(--heading-h2);
819
+ }
820
+
821
+ .ui-prose h3 {
822
+ font-size: var(--heading-h3);
823
+ }
824
+
825
+ .ui-prose h4 {
826
+ font-size: var(--heading-h4);
827
+ }
828
+
829
+ .ui-prose :is(ul, ol) {
830
+ padding-inline-start: var(--prose-list-space-inline);
831
+ }
832
+
833
+ .ui-prose ul {
834
+ list-style: disc;
835
+ }
836
+
837
+ .ui-prose ol {
838
+ list-style: decimal;
839
+ }
840
+
841
+ .ui-prose li + li {
842
+ margin-block-start: var(--prose-list-item-space);
843
+ }
844
+
845
+ .ui-prose li > :is(ul, ol) {
846
+ margin-block-start: var(--prose-list-item-space);
847
+ }
848
+
849
+ .ui-prose blockquote {
850
+ border-inline-start: var(--prose-quote-border-width) solid hsl(var(--border));
851
+ padding-inline-start: var(--prose-quote-space-inline);
852
+ color: hsl(var(--muted-foreground));
853
+ }
854
+
855
+ .ui-prose :not(pre) > code {
856
+ font-family: var(--font-mono);
857
+ font-size: var(--prose-code-font-size);
858
+ background: hsl(var(--muted));
859
+ padding-inline: var(--prose-code-space-inline);
860
+ border-radius: var(--prose-code-radius);
861
+ }
862
+
863
+ .ui-prose a {
864
+ color: hsl(var(--primary));
865
+ text-decoration: underline;
866
+ }
867
+
868
+ .ui-prose table {
869
+ inline-size: 100%;
870
+ border-collapse: collapse;
871
+ }
872
+
873
+ .ui-prose :is(th, td) {
874
+ border: var(--stroke-hairline) solid hsl(var(--border));
875
+ padding: var(--table-cell-padding-y) var(--table-cell-space-x);
876
+ text-align: start;
877
+ vertical-align: top;
878
+ }
879
+
880
+ .ui-prose th {
881
+ font-weight: var(--font-weight-medium);
882
+ background: hsl(var(--muted));
883
+ }
884
+
885
+ .ui-prose img {
886
+ max-inline-size: 100%;
887
+ block-size: auto;
888
+ border-radius: var(--prose-image-radius);
889
+ }
890
+
891
+ .ui-prose[data-image-size="original"] img {
892
+ max-inline-size: none;
893
+ }
894
+
895
+ .ui-prose hr {
896
+ border: 0;
897
+ border-block-start: var(--stroke-hairline) solid hsl(var(--border));
898
+ }
899
+ }
@@ -69,27 +69,6 @@
69
69
  opacity: 0.7;
70
70
  }
71
71
 
72
- .ui-time-input {
73
- width: 100%;
74
- min-height: var(--control-height);
75
- border-radius: var(--radius-md);
76
- border: 1px solid hsl(var(--input));
77
- background: hsl(var(--background));
78
- padding-inline: var(--space-3);
79
- padding-block: 0;
80
- font-size: var(--font-size-base);
81
- color: hsl(var(--foreground));
82
- outline: none;
83
- }
84
-
85
- .ui-time-input:focus-visible {
86
- border-color: hsl(var(--focus-ring-color, var(--ring)));
87
- }
88
-
89
- .ui-time-input[aria-invalid="true"] {
90
- border-color: hsl(var(--destructive));
91
- }
92
-
93
72
  .ui-password-strength {
94
73
  display: grid;
95
74
  gap: var(--space-1);
@@ -163,12 +142,6 @@
163
142
  }
164
143
 
165
144
  @layer components {
166
- /* UPLOAD — five variants (dropzone · button · picture · picture-card · avatar) that used to
167
- * carry their entire box as Tailwind literals on the component: 66 of them, the worst file in
168
- * the library (#319). A service could not resize the avatar, dial back the dropzone's generous
169
- * inset, or align the file row to its own grid without forking. Every constant is now a knob
170
- * (rule #45); colour scrims are role-mirror knobs resolved at the CALL SITE so a scoped
171
- * [data-tenant]/.dark override reaches them (docs/TOKENS.md). */
172
145
 
173
146
  .ui-upload-dropzone {
174
147
  cursor: pointer;
@@ -253,7 +226,6 @@
253
226
  font-size: var(--upload-tile-label-font-size);
254
227
  }
255
228
 
256
- /* Busy scrim — one share of the surface role, resolved here so a scoped theme reaches it. */
257
229
  .ui-upload-overlay {
258
230
  position: absolute;
259
231
  inset: 0;
@@ -380,8 +352,6 @@
380
352
  color: hsl(var(--muted-foreground));
381
353
  }
382
354
 
383
- /* Sits ON the photo, so the wash is a fixed dark scrim rather than a surface role — it must
384
- * stay legible over an arbitrary user image in either theme. */
385
355
  .ui-upload-avatar-change {
386
356
  position: absolute;
387
357
  inset-inline: 0;
@@ -466,7 +436,6 @@
466
436
  margin-inline-end: var(--space-2);
467
437
  }
468
438
 
469
- /* Disabled affordances share the one system alpha rather than a per-variant literal. */
470
439
  .ui-upload-dropzone[data-disabled],
471
440
  .ui-upload-tile-add[data-disabled],
472
441
  .ui-upload-avatar[data-disabled] {
@@ -474,12 +443,6 @@
474
443
  opacity: var(--disabled-opacity);
475
444
  }
476
445
 
477
- /* ── BranchScopePicker (gh#319) ────────────────────────────────────────────────
478
- * `.ui-branch-scope-picker` shipped as a bare hook: the class existed but no rule did, so all
479
- * of the control's geometry sat on the component as Tailwind literals. It composes RadioGroup +
480
- * CheckboxGroup + SearchInput and has no field box of its own, so none of the control-affix
481
- * machinery applies — these four rules are the whole surface. Every measure is a documented
482
- * token (#45); see tokens/components/data-entry.css for why each default is a flat rem. */
483
446
  .ui-branch-scope-picker {
484
447
  display: flex;
485
448
  flex-direction: column;
@@ -492,11 +455,6 @@
492
455
  gap: var(--branch-scope-picker-badges-gap);
493
456
  }
494
457
 
495
- /* The `mode="selected"` subset, indented under its radio by a rule on the inline-start edge.
496
- * Logical properties throughout, so the indent flips with the writing direction (the utilities
497
- * this replaces, `border-s-2 ps-4`, already did). The colour is left to the global
498
- * `* { border-color: hsl(var(--border)) }` so a scoped [data-tenant]/.dark override of
499
- * `--border` still reaches it. */
500
458
  .ui-branch-scope-picker-subset {
501
459
  display: flex;
502
460
  flex-direction: column;
@@ -505,9 +463,6 @@
505
463
  border-inline-start-width: var(--branch-scope-picker-subset-border-width);
506
464
  }
507
465
 
508
- /* A bounded scroll region — the component gives it `tabIndex={0}` + a group name so it stays
509
- * keyboard-reachable (WCAG 2.1.1 / axe scrollable-region-focusable) even when every checkbox
510
- * in it is disabled. The cap is the token; the overflow is not negotiable. */
511
466
  .ui-branch-scope-picker-list {
512
467
  max-block-size: var(--branch-scope-picker-list-max-height);
513
468
  overflow-y: auto;
@@ -1,19 +1,4 @@
1
- /*
2
- * DENSITY — named presets of the global `--scaling` factor (foundation.css).
3
- * One knob: density sets `--scaling`, and every size token (spacing grid, control
4
- * / table / checkbox / switch heights, radius, and everything derived from them)
5
- * rescales in proportion. Two entry points, same variable:
6
- * • `<PageContainer density>` → `.ui-density-*` class (scoped to a descendant,
7
- * wins for its subtree by proximity).
8
- * • the density AXIS → `:root[data-density="*"]` on <html> (AppProvider density
9
- * prop), so it cascades app-wide incl. portalled overlays. For a value off the
10
- * three presets, set `--scaling` directly (AppProvider `scaling` prop).
11
- *
12
- * INTENTIONALLY UNLAYERED — do NOT wrap in `@layer components`. `--scaling` has an
13
- * unlayered `:root` default (foundation.css); a layered `:root[data-density]` would
14
- * always lose to it regardless of specificity, making the axis a no-op on <html>.
15
- * Unlayered, `:root[data-density="x"]` (0,2,0) beats the `:root` default (0,1,0).
16
- */
1
+
17
2
 
18
3
  .ui-density-compact,
19
4
  :root[data-density="compact"] {
@@ -30,20 +15,6 @@
30
15
  --scaling: 1.08;
31
16
  }
32
17
 
33
- /*
34
- * A DESCENDANT density scope (`.ui-density-*` from `<PageContainer density>`) must
35
- * RE-DERIVE every --scaling-tied token, not just flip --scaling. CSS substitutes
36
- * `var(--scaling)` at the element that DECLARES a token, so the size tokens declared
37
- * at `:root` (foundation/control/table) are baked with the ROOT --scaling and inherit
38
- * as fixed values — a subtree that only sets a new --scaling can't retune them. (Same
39
- * reason `.ui-scale-fixed` re-declares the whole list.) Mirror that list here, scaled
40
- * by the LOCAL --scaling, so controls/spacing in the subtree actually resize. The
41
- * `:root[data-density]` selectors above need ONLY --scaling: they re-declare on the
42
- * same element as the :root token formulas, so those re-resolve there.
43
- *
44
- * density.css is a registered tier-definition file (check-control-sizing), so the
45
- * `calc(var(--control-height) ± …)` tier offsets are permitted here.
46
- */
47
18
  .ui-density-compact,
48
19
  .ui-density-default,
49
20
  .ui-density-comfortable {