@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
@@ -1,31 +1,17 @@
1
- /* Data-entry component tokens — small-by-design text knobs (rule #45/#46). */
2
1
 
3
- :root {
4
2
 
3
+ :root {
5
4
  --password-strength-score-font-size: var(--font-size-xs);
6
5
  --password-strength-checklist-font-size: var(--font-size-xs);
7
6
 
8
- /* BranchScopePicker (gh#319). `.ui-branch-scope-picker` was a bare hook with no rule anywhere:
9
- * every measure lived as a Tailwind literal on the component, so a service could only retune
10
- * the control by forking it (#45).
11
- *
12
- * All four are FLAT rems, not `--space-*` aliases, on purpose: the literals they replace read
13
- * Tailwind's own `--spacing` grid, which this package never remaps and which does NOT move with
14
- * the density axis. Aliasing them to `--space-3`/`--space-2`/`--space-1` would silently start
15
- * scaling the control inside a `.ui-density-*` subtree — a visual change, not a refactor. */
16
- /* Stack rhythm between the mode radios, the subset box and the error line (was `gap-3`). */
17
7
  --branch-scope-picker-gap: 0.75rem;
18
- /* Read-only summary: the wrapped run of branch Badges (was `gap-1.5`). */
8
+
19
9
  --branch-scope-picker-badges-gap: 0.375rem;
20
- /* The `mode="selected"` subset box — its inner stack rhythm and the inset that clears its
21
- * indent rule (was `gap-2` / `ps-4`). */
10
+
22
11
  --branch-scope-picker-subset-gap: 0.5rem;
23
12
  --branch-scope-picker-subset-padding-inline: 1rem;
24
- /* The indent rule itself is CHROME (#44), so it is a knob: a service that wants the flat
25
- * treatment sets it to 0 rather than forking the component. Default = today's `border-s-2`. */
13
+
26
14
  --branch-scope-picker-subset-border-width: var(--stroke-md);
27
- /* Bounded height of the scrollable branch list (was `max-h-64`). Flat by design: the box is a
28
- * keyboard-reachable scroll region whose job is to cap the control's measure, so it must not
29
- * grow with density and push the surrounding form off a 390px frame. */
15
+
30
16
  --branch-scope-picker-list-max-height: 16rem;
31
17
  }
@@ -1,36 +1,16 @@
1
- /* Descriptions component tokens. */
1
+
2
2
 
3
3
  :root {
4
- /* Width of the label column when <Descriptions layout="horizontal">. Labels align to this
5
- * shared column so the values line up (the horizontal-detail look, mirroring <Form layout>).
6
- * A rem value gives a fixed aligned column; set `max-content` to size each label to its text.
7
- * (rule #44/#45 — a service theme tunes it here instead of forking CSS.) */
4
+
8
5
  --descriptions-label-width: 8rem;
9
- /* Row-to-row gap (gh#294). Default = the historical hardcoded `gap-y-3`, so nothing changes
10
- * visually by default. A consumer composing Descriptions beside a Form/FormField (a read-only
11
- * block above an editable field on the same card) retunes this to `var(--space-4)` to match
12
- * Form's own field-to-field rhythm instead of the two blocks reading as visually unrelated. */
6
+
13
7
  --descriptions-row-gap: var(--space-3);
14
- /* Column-to-column gap of the <dl> grid (#319). Was a hardcoded `gap-x-6`, the one axis of the
15
- * grid rhythm a service could NOT reach while --descriptions-row-gap was already a knob — so a
16
- * 2/3-column detail block could be retuned vertically but never horizontally.
17
- * A RAW rem, deliberately NOT var(--space-6): `gap-x-6` reads Tailwind's own --spacing grid,
18
- * which this repo does NOT density-scale, so a --space-* default would silently rescale the
19
- * column gap under a compact/comfortable density. Point it at var(--space-6) to opt in. */
8
+
20
9
  --descriptions-column-gap: 1.5rem;
21
- /* Label → value gap inside ONE item when layout="horizontal" (was `gap-x-3`). Pairs with
22
- * --descriptions-label-width: a service that narrows the label column usually wants to close
23
- * this gap in the same step. Raw rem for the same --spacing reason as above. */
10
+
24
11
  --descriptions-label-gap: 0.75rem;
25
- /* VALUE TYPOGRAPHY (gh#294 + #319). `FormField staticText` renders its read-only value with the
26
- * SAME typography as a <dd> so a static Form row and a Descriptions value are indistinguishable
27
- * when mixed on one card. That contract used to be two copies of the literal `text-sm` plus a
28
- * comment asking future editors to keep them in sync; both call sites now read these tokens, so
29
- * the mirror is mechanical and a service retunes BOTH from one place. */
12
+
30
13
  --descriptions-value-font-size: var(--font-size-sm);
31
- /* Companion to --descriptions-value-font-size (the gh#260 bug). The `text-sm` utility this
32
- * replaces ALSO set a line-height, via Tailwind's default `--text-sm--line-height`
33
- * (= calc(1.25 / 0.875)); the theme remaps --text-sm but never that companion. Without this the
34
- * value would silently inherit ambient leading instead of its own 20px line box. */
14
+
35
15
  --descriptions-value-line-height: calc(1.25 / 0.875);
36
16
  }
@@ -1,101 +1,55 @@
1
- /* EMAIL component tokens — the geometry/typography half of the transactional-email contract
2
- * (`@godxjp/ui/email`). HTML email cannot read CSS custom properties: Outlook/Gmail strip <style>
3
- * blocks and require LITERAL inline values, so a Blade/Twig/MJML template can never `var()` these.
4
- * They still live in the component tier because this is the ONE source a maintainer edits — the
5
- * `@godxjp/ui/email` export is GENERATED from this file plus the colour roles in foundation.css
6
- * (scripts/gen-email-tokens.mjs), so an email template and a web screen can never drift apart.
7
- *
8
- * Every value is a LITERAL px/number (never rem, never calc, never var): email clients resolve
9
- * neither the cascade nor relative units reliably, and the export must serialise to a plain hex/px
10
- * string. Where a value mirrors a web token the comment names it, so a retune stays traceable.
11
- *
12
- * Colours are deliberately NOT redeclared here — they derive from the semantic roles
13
- * (--card/--background/--foreground/--muted/--border/--primary/--ring/--brand) and are converted
14
- * HSL→hex at module load, so a re-themed role re-tints the email with zero copy-paste.
15
- * The identity mark reads --brand, NOT --success: --success is the wakatake status green, and the
16
- * two are deliberately distinct roles (gh#250).
17
- */
1
+
18
2
  :root {
19
- /* ── Shell — the 480px transactional-email geometry ─────────────────────────────────────── */
20
- --email-shell-width: 480px; /* canonical transactional card width */
21
- --email-shell-padding: 32px; /* card inset — mirrors --space-8 (2rem) */
22
- --email-shell-page-padding: 24px; /* gutter between the client viewport and the card (--space-6) */
23
- --email-shell-border-width: 1px; /* card edge — mirrors the 1px --border hairline */
24
- --email-card-radius: 10px; /* mirrors --card-radius (--radius-xl = 6px × φ ≈ 10px) */
25
- --email-card-reference-height: 407px; /* canonical invitation reference measures 480×407 */
26
- --email-stack-gap: 24px; /* block rhythm — mirrors --space-stack-lg (1.5rem) */
27
- --email-stack-gap-sm: 12px; /* tight rhythm — mirrors --space-3 (0.75rem) */
28
3
 
29
- /* ── Brand-mark lockup — the canonical GoDX capsule + wordmark (see EMAIL_BRAND_MARK) ────── */
30
- /* The mark ARTWORK is the same 32×32 capsule + glyph `<Logo mark="godx" />` paints; only the
31
- * RENDERED BOX differs. The canonical SCR-302 header sets it at 22px next to a 13px/700 "GoDX"
32
- * wordmark, which is smaller than the web --logo-godx-size (2rem) — an email header carries the
33
- * identity, not the navigation, so the lockup sits quieter (gh#250). */
34
- --email-mark-width: 22px; /* canonical SCR-302 header lockup mark box */
4
+ --email-shell-width: 480px;
5
+ --email-shell-padding: 32px;
6
+ --email-shell-page-padding: 24px;
7
+ --email-shell-border-width: 1px;
8
+ --email-card-radius: 10px;
9
+ --email-card-reference-height: 407px;
10
+ --email-stack-gap: 24px;
11
+ --email-stack-gap-sm: 12px;
12
+
13
+ --email-mark-width: 22px;
35
14
  --email-mark-height: 22px;
36
- --email-mark-gap: 8px; /* mark ↔ wordmark — mirrors --logo-wordmark-gap (--space-2) */
37
- --email-wordmark-font-size: 13px; /* canonical wordmark size (≈ --font-size-xs 12.5px) */
38
- --email-wordmark-font-weight: 700; /* mirrors --logo-wordmark-font-weight */
15
+ --email-mark-gap: 8px;
16
+ --email-wordmark-font-size: 13px;
17
+ --email-wordmark-font-weight: 700;
39
18
 
40
- /* ── Typography — literal px so no client has to resolve the rem scale ──────────────────── */
41
- /* The DXS canonical face is Noto Sans JP (see src/styles/fonts.css; product override, direct
42
- * instruction). Email clients honour NO @font-face, so the stack ships the face NAME first and
43
- * degrades through the platform JP faces to a generic — a client with Noto Sans JP installed (or
44
- * a webmail that already loaded it, which is common — it is a widely preinstalled/CDN-cached
45
- * Google face, more likely to actually render than the niche M PLUS 2 ever was) renders the
46
- * canonical face, everything else lands on Hiragino (macOS/iOS) → Yu Gothic (Windows) →
47
- * M PLUS 2 → Meiryo → the system UI face → Arial → sans-serif. Family names are SINGLE-quoted
48
- * on export (the generator normalises) because an inline `style="…"` attribute is double-quoted;
49
- * only ASCII aliases are listed, since a non-ASCII family name does not survive every transfer
50
- * encoding. */
51
19
  --email-font-family-sans:
52
20
  "Noto Sans JP", "Hiragino Sans", "Hiragino Kaku Gothic ProN", "Yu Gothic Medium", YuGothic,
53
21
  "M PLUS 2", Meiryo, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, system-ui, Arial,
54
22
  sans-serif;
55
- /* Tabular/reference strings — invoice ids, masked card numbers, ISO dates, amounts — are set in
56
- * the mono face in the canonical card. Mirrors --font-family-mono. */
23
+
57
24
  --email-font-family-mono: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
58
- --email-body-font-size: 14px; /* mirrors --font-size-base (0.875rem) */
59
- /* 1.9, NOT the web --line-height-body (1.7) — the canonical email card runs its JP body copy
60
- * looser than a screen, because a mail client gives the reader no density control. */
25
+ --email-body-font-size: 14px;
26
+
61
27
  --email-body-line-height: 1.9;
62
- --email-body-font-weight: 400; /* mirrors --font-weight-normal */
63
- --email-heading-font-size: 17px; /* canonical card title (≈ --heading-h2, base × φ^¼² ≈ 17.6px) */
64
- --email-heading-line-height: 1.7; /* the title shares the card's body leading, not a tight ramp */
65
- --email-heading-font-weight: 500; /* mirrors --font-weight-medium — an email title is calm, not bold */
28
+ --email-body-font-weight: 400;
29
+ --email-heading-font-size: 17px;
30
+ --email-heading-line-height: 1.7;
31
+ --email-heading-font-weight: 500;
66
32
 
67
- /* ── Primary CTA — the one action button ────────────────────────────────────────────────── */
68
- /* TOUCH TARGET, deliberately DECOUPLED from --control-height-lg (36px). Do not "restore" the
69
- * mirror: email is a mobile-first, touch-only medium. There is no hover state, no precise
70
- * pointer, and mail clients do not reliably offer zoom or a focus affordance — so the web's AA
71
- * floor (SC 2.5.8, 24x24, which 36px clears) is the wrong bar here. 44px is the AAA target size
72
- * (SC 2.5.5, 44x44) and the Apple HIG 44pt / Material 48dp convention. A service that must keep
73
- * the old box sets --email-cta-height + --email-cta-line-height in its own theme. */
74
33
  --email-cta-height: 44px;
75
- --email-cta-line-height: 44px; /* equal to the height: bulletproof vertical centring in Outlook */
76
- --email-cta-padding-x: 16px; /* mirrors --space-4 */
77
- --email-cta-radius: 6px; /* mirrors the --radius base (0.375rem) */
78
- --email-cta-font-size: 14px; /* mirrors --font-size-base */
79
- --email-cta-font-weight: 500; /* mirrors --font-weight-medium */
34
+ --email-cta-line-height: 44px;
35
+ --email-cta-padding-x: 16px;
36
+ --email-cta-radius: 6px;
37
+ --email-cta-font-size: 14px;
38
+ --email-cta-font-weight: 500;
39
+
40
+ --email-footer-font-size: 11px;
41
+ --email-footer-line-height: 1.8;
42
+ --email-footer-link-gap: 12px;
43
+ --email-footer-padding-top: 20px;
44
+ --email-footer-border-width: 1px;
80
45
 
81
- /* ── Legal footer ───────────────────────────────────────────────────────────────────────── */
82
- --email-footer-font-size: 11px; /* mirrors --font-size-2xs (base ÷ φ^¼² ≈ 11.1px) */
83
- --email-footer-line-height: 1.8; /* the legal band runs looser than the web --line-height-normal */
84
- --email-footer-link-gap: 12px; /* horizontal separation between footer links (--space-3) */
85
- --email-footer-padding-top: 20px; /* space above the legal band */
86
- --email-footer-border-width: 1px; /* the hairline above the legal band */
46
+ --email-focus-border-width: 2px;
87
47
 
88
- /* ── Focus affordance (webmail preview panes that DO honour :focus) ─────────────────────── */
89
- --email-focus-border-width: 2px; /* mirrors --focus-ring-width */
48
+ --email-mobile-max-width: 520px;
49
+ --email-mobile-width: 100%;
50
+ --email-mobile-padding: 20px;
51
+ --email-mobile-page-padding: 12px;
90
52
 
91
- /* ── Mobile reflow — applied under the narrow media query and by inline fallbacks ───────── */
92
- --email-mobile-max-width: 520px; /* the reflow breakpoint (card width + both gutters) */
93
- --email-mobile-width: 100%; /* the card goes fluid below the breakpoint */
94
- --email-mobile-padding: 20px; /* reduced card inset — mirrors --space-5 */
95
- --email-mobile-page-padding: 12px; /* reduced viewport gutter — mirrors --space-3 */
96
- /* One step below the 17px desktop title. The canonical 390px reference raster is unusable (it is
97
- * 435px wide and already clips the card — dxs-platform/platform#496), so this is the library's
98
- * documented contract rather than a measured canonical value. */
99
53
  --email-mobile-heading-font-size: 16px;
100
- --email-mobile-cta-width: 100%; /* the CTA goes full-bleed so the tap target spans the card */
54
+ --email-mobile-cta-width: 100%;
101
55
  }
@@ -1,36 +1,20 @@
1
- /* ErrorSurface — the 403 / 404 / 500 / 503 exception surface (gh#221, gh#251).
2
- *
3
- * Package-owned geometry: a service retunes the surface here (or in its own theme.css) instead of
4
- * forking `.ui-error-surface` or adding a `className` to the component. Chrome defaults are QUIET
5
- * (cardinal rule #44): the metadata block ships with no divider — a service opts IN.
6
- */
1
+
7
2
  :root {
8
- /* Measure of the surface block. Caps the status code + body + metadata column so a long ja/vi
9
- * headline wraps at a readable width in BOTH shells, including the application shell where
10
- * PageContainer is much wider than the copy wants to be. */
3
+
11
4
  --error-surface-max-width: 32rem;
12
5
 
13
- /* Rhythm between the status code, the EmptyState body, the metadata list and the progress meter. */
14
6
  --error-surface-gap: var(--space-3);
15
7
 
16
- /* Block padding of the surface inside the shell it is placed in. Desktop (1440/1024) default; the
17
- * 390 step steps it down so a phone loses no vertical space (see styles/shell-layout.css). */
18
8
  --error-surface-padding-block: var(--space-10);
19
9
  --error-surface-padding-block-compact: var(--space-6);
20
10
 
21
- /* Brand slot (a Logo) above the status code, system mode only. */
22
11
  --error-surface-brand-gap: var(--space-2);
23
12
 
24
- /* Metadata description list: row rhythm and the label↔value gap inside one row. */
25
13
  --error-surface-meta-gap: var(--space-1);
26
14
  --error-surface-meta-row-gap: var(--space-2);
27
15
 
28
- /* Chrome, default quiet (#44). A service opts in with
29
- * `--error-surface-meta-border: 1px solid hsl(var(--border));`. */
30
16
  --error-surface-meta-border: none;
31
17
  --error-surface-meta-padding-block: 0;
32
18
 
33
- /* Width of the maintenance progress meter — narrower than the measure, so it reads as metadata
34
- * rather than as the primary content of the page. */
35
19
  --error-surface-progress-max-width: 18rem;
36
20
  }
@@ -1,18 +1,11 @@
1
- /* Feedback primitive tokens: dialog, alert, empty state. */
1
+
2
2
 
3
3
  :root {
4
4
  --sheet-width-default: 22.5rem;
5
- /* Overlay scrims — `initial` so the shared semantic --overlay-background re-resolves at the CALL
6
- * SITE under a scoped [data-tenant]/.dark theme (a :root binding to it freezes at :root and a
7
- * scoped override never reaches the overlay). Each surface takes a SHARE of that one scrim rather
8
- * than a private literal, so a service retints every backdrop with one --overlay-background while
9
- * the calibrated per-surface depth survives: a slide-in Sheet washes the page more lightly than a
10
- * modal Dialog. Defaults resolve to rgb(0 0 0 / 0.2) (sheet) and rgb(0 0 0 / 0.3) (dialog). */
5
+
11
6
  --sheet-overlay-background: initial;
12
7
  --sheet-overlay-alpha: 40%;
13
- /* Sheet chrome rhythm (#319). --sheet-pad-x/-y already governed the panel inset, but the gaps
14
- * INSIDE the chrome — header stack, title/subtitle pair, the extra-slot row — were literal, so
15
- * a service could retune the sheet's outer padding and still be stuck with the inner rhythm. */
8
+
16
9
  --sheet-shadow: var(--shadow-lg);
17
10
  --sheet-header-space-gap: 0.375rem;
18
11
  --sheet-title-block-space-gap: var(--space-1);
@@ -21,11 +14,9 @@
21
14
  --sheet-footer-space-gap: var(--space-2);
22
15
  --sheet-title-font-size: var(--font-size-lg);
23
16
  --sheet-description-font-size: var(--font-size-sm);
24
- /* The scroll region keeps a sliver of padding so a focused control's ring is never clipped at
25
- * the scroll edges — retune together with --focus-ring-width. */
17
+
26
18
  --sheet-body-space-block: var(--space-1);
27
- /* Close button: offset from the panel corner, and the inline room the header reserves so a
28
- * title never runs under it. */
19
+
29
20
  --sheet-close-offset: var(--space-4);
30
21
  --sheet-close-rest-alpha: 0.7;
31
22
  --sheet-header-close-space-inline-end: var(--space-8);
@@ -33,125 +24,68 @@
33
24
  --dialog-viewport-inset: 1.5rem;
34
25
  --dialog-overlay-background: initial;
35
26
  --dialog-overlay-alpha: 60%;
36
- /* Dialog inset defaults to the shared global chrome tokens (override --space-chrome-* once for the
37
- * whole system, or --dialog-space-x/-y for dialogs only). */
27
+
38
28
  --dialog-space-x: var(--space-chrome-x);
39
29
  --dialog-space-y: var(--space-chrome-y);
40
30
  --dialog-space-inset: var(--dialog-space-y) var(--dialog-space-x);
41
31
  --dialog-space-gap: var(--space-stack-md);
42
32
  --dialog-close-space-offset: var(--space-4);
43
- /* Dialog chrome rhythm (#319) — the exact mirror of the --sheet-* set above, because Dialog's
44
- * header markup is byte-identical to Sheet's. --dialog-space-x/-y already governed the panel
45
- * inset, but every gap INSIDE the chrome (header stack, title/subtitle pair, the extra-slot row)
46
- * was a literal on the component, so a service could retune the outer padding and still be stuck
47
- * with the inner rhythm. Defaults are the values the literals resolved to. */
33
+
48
34
  --dialog-header-space-gap: var(--space-stack-xs);
49
35
  --dialog-title-row-space-gap: var(--space-3);
50
36
  --dialog-title-block-space-gap: var(--space-1);
51
37
  --dialog-extra-space-gap: var(--space-2);
52
- /* Inline room the header reserves so a long title or the extra slot never runs under the
53
- * absolutely-positioned close button; retune together with --dialog-close-space-offset.
54
- * Mirrors --sheet-header-close-space-inline-end. */
38
+
55
39
  --dialog-header-close-space-inline-end: var(--space-8);
56
- /* Close button rest opacity — quiet at rest, full on hover (rule #44). Was a hard 0.7 baked into
57
- * dialog-layout.css with no way for a theme to make the ✕ louder. Mirrors
58
- * --sheet-close-rest-alpha so the two overlay siblings retune together. */
40
+
59
41
  --dialog-close-rest-alpha: 0.7;
60
- /* Type-to-confirm challenge: the step-up failure line under the input. Its size + ink were
61
- * `text-sm text-destructive` on the component, i.e. unreachable from a theme. */
42
+
62
43
  --dialog-step-up-error-font-size: var(--font-size-sm);
63
- /* Alert corner radius (gh#268 — rule #45): a full-width Alert often sits in the
64
- * same page column as a Card — so the DEFAULT IS the Card radius (gh#282); a service re-tunes by
65
- * overriding this once. Default keeps the historical --radius-md. */
44
+
66
45
  --alert-radius: var(--card-radius);
67
46
  --alert-space-inset: var(--space-section-active);
68
47
  --alert-space-gap: var(--space-inline-md);
69
48
  --alert-inner-space-gap: var(--space-stack-sm);
70
49
  --alert-dismiss-space-offset: var(--space-3);
71
- /* Leading tone glyph (the ⚠/✓/ⓘ at the start of the strip). It was a bare `1.25rem` in
72
- * alert-layout.css with no token at all, so the ONLY ways to resize it were `!important` or a
73
- * forked stylesheet — the two things the icon axis's tier 2 exists to abolish (gh#326). Same
74
- * step, so nothing moves; a service now scopes `--alert-icon-size` to one Alert instead.
75
- * Deliberately NOT --scaling-multiplied: the literal it replaces did not track density. */
50
+
76
51
  --alert-icon-size: var(--icon-size-lg);
77
- /* Dismiss ✕ — rest opacity (quiet at rest, full on hover, rule #44) and glyph size. The rest
78
- * alpha was a hard 0.7 in alert-layout.css whose `:hover` companion lived on the COMPONENT as
79
- * `hover:opacity-100`, so the two halves of one affordance sat in two files and neither was
80
- * themeable. Mirrors --sheet-close-rest-alpha. The icon size carries a raw rem, not
81
- * var(--space-N): it replaces a flat Tailwind `size-4` step and must not start tracking the
82
- * density axis. */
52
+
83
53
  --alert-dismiss-rest-alpha: 0.7;
84
54
  --alert-dismiss-icon-size: var(--icon-size-md);
85
- /* Soft (subtle) semantic tint ratios — themeable so a service can hit its exact spec
86
- * (a brand's success-bg/-border are often more present than the faint 5%/30% default). */
55
+
87
56
  --alert-bg-alpha: 0.05;
88
57
  --alert-border-alpha: 0.3;
89
- /* BANNER — the page-level Alert treatment (gh#255). Every constant a service would want to
90
- * match to its page grid is a knob (rule #45).
91
- *
92
- * --banner-radius and --banner-border-width are NOT declared here (gh#327). They used to be,
93
- * and both copies were dead: components/banner.css declares the same two names at the same
94
- * `:root`, base.css imports banner AFTER feedback, so banner won every time. Radius agreed at
95
- * `0`, but border-width did not — this file said `0` and banner.css says `1px`, and `1px` is
96
- * what alert-layout.css actually paints as the strip's block-end hairline. So anyone who read
97
- * THIS file for the default was told the strip has no rule when it has one, and the MCP token
98
- * catalog carried both entries with the two conflicting values. banner.css owns the strip
99
- * geometry; these two live there and only there.
100
- *
101
- * The inline inset tracks the live page gutter, so a banner mounted above a PageContainer lines
102
- * its text up with the page title instead of sitting at a second, unrelated margin. */
58
+
103
59
  --banner-border-block-end-width: 1px;
104
60
  --banner-space-block: var(--space-3);
105
- /* Inline inset tracks the page gutter so a banner's text lines up with the page title.
106
- * `--space-page-active-x` steps down to the compact gutter on `.ui-page-container` only, and
107
- * custom properties inherit — so a banner rendered INSIDE the container picks the compact value
108
- * up for free, while the normal case (a banner mounted ABOVE the container, or in AppShell) would
109
- * keep the desktop gutter and sit 8px out at 390px. The compact step below is what actually keeps
110
- * the two aligned; retune it rather than hard-coding a mobile inset at the call site. */
61
+
111
62
  --banner-space-inline: var(--space-page-active-x);
112
63
  --banner-space-inline-compact: var(--space-page-compact-x);
113
- /* Dismiss offset is measured from the banner's own (shorter) block inset, so the ✕ stays
114
- * optically centred on a one-line strip instead of floating at the inline-alert offset. */
64
+
115
65
  --banner-dismiss-space-offset: var(--space-2);
116
- /* Brand glow layer for the raised dialog/sheet panel — invisible no-op at rest (rule #44).
117
- * Paired AFTER --shadow-lg in the surface box-shadow so a service can wash the overlay with the
118
- * global glow, e.g. --dialog-content-glow: var(--shadow-glow), with no markup change. */
66
+
119
67
  --dialog-content-glow: 0 0 0 0 transparent;
120
68
  --empty-state-space-y: var(--space-10);
121
69
  --empty-state-space-x: var(--space-6);
122
- /* Measure of the description paragraph (rule #45 — a service-tunable constant gets a knob).
123
- * 28rem reads ~65 Latin characters per line; a JA/VI service that needs a shorter or longer
124
- * measure for its own copy retunes this once instead of forking `.ui-empty-state-description`. */
70
+
125
71
  --empty-state-description-max-width: 28rem;
126
72
  --empty-state-section-space-y: var(--space-6);
127
73
  --empty-state-section-space-x: var(--space-4);
128
74
  --empty-state-compact-space-y: var(--space-3);
129
75
  --empty-state-compact-space-x: var(--space-2);
130
- /* EmptyState icon medallion colour — `initial` so the role defaults re-resolve at the call site
131
- * under a scoped theme (rule #44). A service recolours the glyph (--empty-state-icon-foreground)
132
- * or washes the medallion fill (--empty-state-icon-tint) without forking.
133
- * Defaults = hsl(var(--muted-foreground)) glyph · hsl(var(--muted)) fill. */
76
+
134
77
  --empty-state-icon-foreground: initial;
135
78
  --empty-state-icon-tint: initial;
136
- /* Medallion box + the glyph inside it. Both were literal (`width: 3rem` in the stylesheet, a
137
- * `size-6` utility on the icon), so a service could not scale the empty-state mark to its own
138
- * page rhythm — and the two must move TOGETHER or the glyph stops sitting centred in its
139
- * circle, which is exactly the kind of pair rule #45 exists to keep tunable as one. */
79
+
140
80
  --empty-state-icon-size: var(--icon-size-4xl);
141
81
  --empty-state-icon-glyph-size: var(--icon-size-xl);
142
82
  --skeleton-row-gap: var(--space-stack-sm);
143
83
  --skeleton-cell-gap: var(--space-inline-lg);
144
84
  --skeleton-card-inset: var(--space-section-active);
145
85
  --skeleton-radius: var(--radius);
146
- /* Skeleton placeholder fill — `initial` so the --muted default re-resolves at the call site under
147
- * a scoped theme (a :root binding to a role var freezes at :root). A service tints the shimmer to
148
- * its surface (rule #44) without forking the keyframes. Default = hsl(var(--muted)). */
86
+
149
87
  --skeleton-background: initial;
150
- /* Skeleton bar heights + widths (#319). These carry RAW rem, not var(--space-N): the literals
151
- * they replace were plain Tailwind steps, which are not multiplied by --scaling. Routing them
152
- * through the spacing scale would silently make the loading state track the density axis while
153
- * the loaded content it stands in for does not. Names say what each bar STANDS IN FOR, so a
154
- * service retuning its type scale knows which one to move. */
88
+
155
89
  --skeleton-block-height: 1rem;
156
90
  --skeleton-caption-height: 0.75rem;
157
91
  --skeleton-title-height: 1.75rem;
@@ -160,64 +94,33 @@
160
94
  --skeleton-stat-value-width: 8rem;
161
95
  --skeleton-stat-caption-width: 5rem;
162
96
 
163
- /* QUERY LIFECYCLE FOOTERS — the two rows `<InfiniteQueryState>` appends under a paginated feed:
164
- * the "load more" button row and the "loading more…" caption. Both gaps were Tailwind literals
165
- * on the component (`pt-4` / `pt-2`), so a service running a denser (or airier) feed could not
166
- * align them to its own vertical rhythm without forking the component (rule #45). They live in
167
- * the feedback tier because these ARE query feedback surfaces and there is no query stylesheet.
168
- * Defaults = var(--space-stack-md) (16px) and var(--space-stack-sm) (8px) — the exact values the
169
- * Tailwind steps resolved to, so adopting this changes nothing until a theme opts in. */
170
97
  --query-load-more-space-block-start: var(--space-stack-md);
171
98
  --query-loading-more-space-block-start: var(--space-stack-sm);
172
99
 
173
- /* TOOLTIP — the transient label surface. Every constant here was a Tailwind literal baked into
174
- * the component (`max-w-xs px-2 py-1 rounded-md text-xs shadow-md`), so a service could not
175
- * retune tooltip density or measure without forking the component (rule #45). Defaults reproduce
176
- * the previous look exactly, so adopting this changes nothing until a theme opts in. */
177
100
  --tooltip-max-width: 20rem;
178
101
  --tooltip-space-inline: var(--space-2);
179
102
  --tooltip-space-block: var(--space-1);
180
103
  --tooltip-radius: var(--radius);
181
104
  --tooltip-font-size: var(--font-size-xs);
182
- /* Raised-surface depth — role-mirror knob, so a flat service theme sets `none` once. */
105
+
183
106
  --tooltip-shadow: var(--shadow-md);
184
- /* Surface colours — `initial` so the popover roles re-resolve at the CALL SITE under a scoped
185
- * [data-tenant]/.dark theme (docs/TOKENS.md · "Role-mirror knobs MUST be `initial`").
186
- * Defaults = hsl(var(--popover)) fill · hsl(var(--popover-foreground)) text. */
107
+
187
108
  --tooltip-background: initial;
188
109
  --tooltip-foreground: initial;
189
110
  --tooltip-border-color: initial;
190
111
 
191
- /* POPOVER — the interactive overlay panel. Same story as Tooltip: `w-72 rounded-md p-4 shadow-md`
192
- * were literals, so a service could not align the panel to its own grid or width scale. */
193
112
  --popover-width: 18rem;
194
113
  --popover-space-inset: var(--space-4);
195
114
  --popover-radius: var(--radius);
196
115
  --popover-shadow: var(--shadow-md);
197
116
  --popover-header-space-gap: var(--space-1);
198
117
  --popover-header-font-size: var(--font-size-sm);
199
- /* Role-mirror knobs — `initial`, defaults resolve at the call site (see Tooltip above). */
118
+
200
119
  --popover-surface-background: initial;
201
120
  --popover-surface-foreground: initial;
202
121
  --popover-surface-border-color: initial;
203
122
 
204
- /* TOAST (Sonner) — the status glyph in the toast's leading slot.
205
- *
206
- * WHY A KNOB AND NOT A UTILITY: sonner renders the toast body itself and takes the five status
207
- * glyphs through ONE `icons={{ success, info, warning, error, loading }}` config prop. That prop
208
- * is all-or-nothing — a consumer who wants a different glyph size must re-declare all five icons,
209
- * re-importing lucide and re-deriving the aria wiring. Routing the size through a token makes it
210
- * a one-line theme override instead (rule #45).
211
- *
212
- * Raw rem, not var(--space-N): it replaces a flat Tailwind `size-4` step, and the 16px box sonner
213
- * gives `[data-icon]` is itself fixed — scaling the glyph with density alone would overflow it.
214
- *
215
- * NAMESPACE NOTE: sonner publishes its own `--toast-*` custom properties (--toast-icon-margin-*,
216
- * --toast-svg-margin-*, --toast-button-margin-*, --toast-close-button-*). Neither name below
217
- * collides with those; keep it that way when adding to this group. */
218
123
  --toast-icon-size: var(--icon-size-md);
219
- /* Viewport gutter of the mobile toast stack. Sonner passes `mobileOffset` straight into inline
220
- * CSS, so a var() string resolves normally. Flat 16px on purpose: this is a fixed inset from the
221
- * device edge (thumb reach / safe area), not a density-scaled gap inside a surface. */
124
+
222
125
  --toast-mobile-offset: 16px;
223
126
  }
@@ -1,50 +1,18 @@
1
- /* Form layout tokens: horizontal-layout label column geometry. */
1
+
2
2
 
3
3
  :root {
4
- /* Width of the label column in horizontal/inline layout. A service theme sets
5
- * this once (e.g. 110px) to align every form to its design grid; the Form/
6
- * FormField `labelWidth` prop overrides per form/field. */
7
- /* Fixed aligned label column by default (gh#284) — `max-content` sized each field's label
8
- * column to its own label, so horizontal forms (especially columns={2} grids) had controls
9
- * starting at ragged x positions. 8rem mirrors --descriptions-label-width so edit forms and
10
- * show pages share the same optical grid; the Form/FormField `labelWidth` prop overrides. */
4
+
11
5
  --form-label-width: 8rem;
12
6
 
13
- /* Column gap between the label and its control in horizontal/inline layout. */
14
- --form-label-gap: var(--space-4); /* 16px */
15
-
16
- /* Type in the label column. Inherits the body size by default, so nothing moves unless a
17
- * service opts in. It is a knob because the label column already is one: --form-label-width
18
- * lets a service align forms to its grid, and a service whose grid was drawn around a
19
- * smaller label had no way to say so — leaving it to hand-write font-size per label, which
20
- * is exactly what the width token exists to prevent. */
21
- --form-label-font-size: var(--text-sm); /* 14px */
22
-
23
- /* Row rhythm between a Form's own top-level blocks (gh#295) — e.g. the field group's
24
- * CardContent and its CardFooter action row, or two FormFields that happen to be Form's OWN
25
- * direct children (no Card framing). Unchanged from the historical value. */
26
- --form-block-gap: var(--space-4); /* 16px */
27
-
28
- /* Field-to-field row rhythm (gh#295) — mirrors --descriptions-row-gap so a read-only value
29
- * mixed in via `FormField.staticText` (gh#294) and a real Descriptions block share ONE canonical
30
- * rhythm. Applied via margin-based sibling spacing on FormField itself (not Form's flex `gap`,
31
- * which only reaches DIRECT children — dead in the common `Form > CardContent > FormField*`
32
- * composition every real Save-button form needs), so it holds at any DOM depth relative to Form. */
33
- --form-field-row-gap: var(--space-3); /* 12px */
34
-
35
- /* Row rhythm between the ROWS of a `<Form columns={n}>` grid (gh#304). The grid path cannot use
36
- * the margin above — a per-item margin inside a grid double-counts the track gap AND leaves the
37
- * first item of row 1 unshifted while its row-mates drop, so row 1's columns end up misaligned.
38
- * The rhythm therefore rides the grid's own `row-gap`, and it DEFAULTS TO THE SAME
39
- * --form-field-row-gap the stacked path uses so `columns={1}` — and every `columns={n}` form once
40
- * it collapses to one column on a narrow container — is pixel-identical to a Form with no
41
- * `columns` at all. Retune this alone only to give multi-column forms a looser row rhythm than
42
- * stacked ones; retune --form-field-row-gap to move both together. */
43
- --form-grid-row-gap: var(--form-field-row-gap); /* 12px */
44
-
45
- /* Gutter between the COLUMNS of a `<Form columns={n}>` grid (gh#304). Was ResponsiveGrid's
46
- * generic 16px stack gap with no way to say otherwise; it is a form's inter-field gutter and a
47
- * service aligning forms to its design grid needs it as a knob (rule #45). The default keeps the
48
- * historical 16px, so nothing moves unless a theme opts in. */
49
- --form-grid-column-gap: var(--space-4); /* 16px */
7
+ --form-label-gap: var(--space-4);
8
+
9
+ --form-label-font-size: var(--text-sm);
10
+
11
+ --form-block-gap: var(--space-4);
12
+
13
+ --form-field-row-gap: var(--space-3);
14
+
15
+ --form-grid-row-gap: var(--form-field-row-gap);
16
+
17
+ --form-grid-column-gap: var(--space-4);
50
18
  }