@godxjp/ui 19.1.0 → 19.3.1

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 (437) 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 +20 -14
  11. package/dist/components/data-display/badge.js +18 -4
  12. package/dist/components/data-display/card.d.ts +21 -41
  13. package/dist/components/data-display/carousel.d.ts +1 -2
  14. package/dist/components/data-display/code-block.d.ts +4 -0
  15. package/dist/components/data-display/code-block.js +24 -0
  16. package/dist/components/data-display/data-table.d.ts +15 -37
  17. package/dist/components/data-display/data-table.js +1 -3
  18. package/dist/components/data-display/descriptions.d.ts +2 -6
  19. package/dist/components/data-display/descriptions.js +0 -2
  20. package/dist/components/data-display/index.d.ts +4 -0
  21. package/dist/components/data-display/index.js +4 -0
  22. package/dist/components/data-display/list-row.d.ts +3 -22
  23. package/dist/components/data-display/permission-matrix.d.ts +7 -20
  24. package/dist/components/data-display/progress.d.ts +1 -1
  25. package/dist/components/data-display/prose.d.ts +4 -0
  26. package/dist/components/data-display/prose.js +20 -0
  27. package/dist/components/data-display/service-launcher-card.d.ts +3 -10
  28. package/dist/components/data-display/table.d.ts +20 -80
  29. package/dist/components/data-display/table.js +0 -3
  30. package/dist/components/data-display/timeline.d.ts +3 -5
  31. package/dist/components/data-entry/branch-scope-picker.d.ts +2 -19
  32. package/dist/components/data-entry/branch-scope-picker.js +0 -1
  33. package/dist/components/data-entry/calendar.d.ts +3 -2
  34. package/dist/components/data-entry/calendar.js +58 -3
  35. package/dist/components/data-entry/command-palette.d.ts +8 -22
  36. package/dist/components/data-entry/date-picker.d.ts +4 -5
  37. package/dist/components/data-entry/date-picker.js +6 -1
  38. package/dist/components/data-entry/date-range-picker.d.ts +1 -1
  39. package/dist/components/data-entry/date-range-picker.js +8 -3
  40. package/dist/components/data-entry/form-errors.d.ts +7 -18
  41. package/dist/components/data-entry/form-field.js +1 -5
  42. package/dist/components/data-entry/form.d.ts +1 -9
  43. package/dist/components/data-entry/input.d.ts +16 -14
  44. package/dist/components/data-entry/input.js +3 -0
  45. package/dist/components/data-entry/month-picker.js +2 -2
  46. package/dist/components/data-entry/month-range-picker.d.ts +4 -6
  47. package/dist/components/data-entry/month-range-picker.js +2 -2
  48. package/dist/components/data-entry/number-input.d.ts +1 -5
  49. package/dist/components/data-entry/number-input.js +1 -0
  50. package/dist/components/data-entry/radio.js +0 -1
  51. package/dist/components/data-entry/search-select.d.ts +2 -4
  52. package/dist/components/data-entry/select.d.ts +11 -6
  53. package/dist/components/data-entry/select.js +4 -2
  54. package/dist/components/data-entry/switch.js +0 -1
  55. package/dist/components/data-entry/textarea.d.ts +10 -16
  56. package/dist/components/data-entry/time-picker.d.ts +3 -5
  57. package/dist/components/data-entry/upload-types.d.ts +1 -5
  58. package/dist/components/data-entry/use-upload-draft.d.ts +0 -4
  59. package/dist/components/feedback/dialog.d.ts +6 -15
  60. package/dist/components/feedback/overlay-header-tone.d.ts +1 -1
  61. package/dist/components/feedback/sheet.d.ts +3 -10
  62. package/dist/components/feedback/sheet.js +1 -1
  63. package/dist/components/feedback/sonner.js +2 -3
  64. package/dist/components/general/activity.d.ts +4 -30
  65. package/dist/components/general/button.js +1 -10
  66. package/dist/components/general/logo.d.ts +6 -28
  67. package/dist/components/general/reveal.d.ts +3 -9
  68. package/dist/components/general/typography.d.ts +1 -3
  69. package/dist/components/layout/account-chip.d.ts +8 -0
  70. package/dist/components/layout/account-chip.js +45 -0
  71. package/dist/components/layout/auth-divider.d.ts +2 -9
  72. package/dist/components/layout/auth-shell.d.ts +1 -14
  73. package/dist/components/layout/breadcrumb.d.ts +1 -5
  74. package/dist/components/layout/centered-shell.d.ts +4 -18
  75. package/dist/components/layout/error-surface.d.ts +11 -28
  76. package/dist/components/layout/error-surface.js +4 -1
  77. package/dist/components/layout/index.d.ts +2 -0
  78. package/dist/components/layout/index.js +2 -0
  79. package/dist/components/layout/legal-document-shell.d.ts +5 -28
  80. package/dist/components/layout/master-detail.d.ts +2 -18
  81. package/dist/components/layout/page-container.js +0 -1
  82. package/dist/components/layout/responsive-grid.d.ts +6 -1
  83. package/dist/components/layout/responsive-grid.js +9 -2
  84. package/dist/components/layout/service-role-panel.d.ts +7 -19
  85. package/dist/components/layout/sidebar.d.ts +5 -27
  86. package/dist/components/layout/sidebar.js +0 -1
  87. package/dist/components/layout/split-pane.d.ts +0 -7
  88. package/dist/components/layout/topbar.d.ts +1 -14
  89. package/dist/components/navigation/app-setting-picker.js +1 -3
  90. package/dist/components/navigation/filter-bar.d.ts +1 -6
  91. package/dist/components/navigation/pagination-utils.d.ts +2 -12
  92. package/dist/components/navigation/tabs-scroll.d.ts +2 -36
  93. package/dist/components/navigation/tabs.js +4 -8
  94. package/dist/components/query/data-state.d.ts +2 -2
  95. package/dist/components/ui/credential-reveal.d.ts +1 -4
  96. package/dist/components/ui/hover-card.d.ts +1 -2
  97. package/dist/components/ui/separator.d.ts +2 -15
  98. package/dist/components/ui/toggle-group.d.ts +1 -5
  99. package/dist/components/ui/toggle.d.ts +6 -31
  100. package/dist/email/brand-mark.d.ts +6 -34
  101. package/dist/email/color.d.ts +7 -17
  102. package/dist/email/geometry.d.ts +4 -8
  103. package/dist/email/index.d.ts +4 -48
  104. package/dist/email/inline-style.d.ts +3 -9
  105. package/dist/email/urgency.d.ts +2 -7
  106. package/dist/form/form-context.d.ts +2 -5
  107. package/dist/form/form-root.d.ts +1 -2
  108. package/dist/i18n/messages/en.json +4 -0
  109. package/dist/i18n/messages/ja.json +4 -0
  110. package/dist/i18n/messages/vi.json +4 -0
  111. package/dist/inertia/index.d.ts +2 -10
  112. package/dist/lib/control-styles.d.ts +10 -21
  113. package/dist/lib/control-styles.js +4 -6
  114. package/dist/lib/datetime/format-date.d.ts +1 -4
  115. package/dist/lib/field-a11y.d.ts +11 -68
  116. package/dist/lib/field-a11y.js +0 -1
  117. package/dist/lib/format.d.ts +4 -8
  118. package/dist/lib/hooks.d.ts +6 -12
  119. package/dist/lib/permission-grid.d.ts +3 -18
  120. package/dist/lib/query-error.d.ts +3 -3
  121. package/dist/props/components/app.prop.d.ts +15 -38
  122. package/dist/props/components/charts.prop.d.ts +2 -3
  123. package/dist/props/components/data-display.prop.d.ts +55 -72
  124. package/dist/props/components/data-entry.prop.d.ts +35 -40
  125. package/dist/props/components/form.prop.d.ts +2 -6
  126. package/dist/props/components/general.prop.d.ts +11 -27
  127. package/dist/props/components/layout.prop.d.ts +89 -260
  128. package/dist/props/components/navigation.prop.d.ts +27 -42
  129. package/dist/props/registry.d.ts +36 -1
  130. package/dist/props/registry.js +45 -1
  131. package/dist/props/vocabulary/data.prop.d.ts +18 -49
  132. package/dist/props/vocabulary/index.d.ts +1 -1
  133. package/dist/props/vocabulary/interaction.prop.d.ts +10 -12
  134. package/dist/props/vocabulary/layout.prop.d.ts +8 -30
  135. package/dist/props/vocabulary/shared.prop.d.ts +3 -2
  136. package/dist/styles/alert-layout.css +1 -32
  137. package/dist/styles/badge-layout.css +19 -18
  138. package/dist/styles/base.css +14 -113
  139. package/dist/styles/card-layout.css +6 -128
  140. package/dist/styles/chart-layout.css +2 -17
  141. package/dist/styles/control.css +380 -458
  142. package/dist/styles/core.css +21 -0
  143. package/dist/styles/data-display-layout.css +175 -94
  144. package/dist/styles/data-entry-layout.css +0 -45
  145. package/dist/styles/density.css +1 -30
  146. package/dist/styles/dialog-layout.css +5 -69
  147. package/dist/styles/focus-ring.css +13 -87
  148. package/dist/styles/fonts.css +1 -31
  149. package/dist/styles/form-layout.css +7 -91
  150. package/dist/styles/index.css +2 -20
  151. package/dist/styles/layout.css +38 -456
  152. package/dist/styles/logo-layout.css +1 -35
  153. package/dist/styles/motion.css +3 -42
  154. package/dist/styles/navigation-layout.css +3 -50
  155. package/dist/styles/shell-layout.css +37 -403
  156. package/dist/styles/table-layout.css +16 -274
  157. package/dist/styles/text-layout.css +7 -21
  158. package/dist/styles/toggle.css +1 -23
  159. package/dist/theme/dxs.canonical.css +1 -55
  160. package/dist/theme/example.service.css +1 -26
  161. package/dist/theme/famgia.service.css +5 -15
  162. package/dist/tokens/axes.css +3 -40
  163. package/dist/tokens/base.css +1 -4
  164. package/dist/tokens/components/activity.css +6 -42
  165. package/dist/tokens/components/badge.css +12 -13
  166. package/dist/tokens/components/banner.css +4 -9
  167. package/dist/tokens/components/card.css +32 -88
  168. package/dist/tokens/components/chart.css +9 -26
  169. package/dist/tokens/components/control.css +37 -222
  170. package/dist/tokens/components/data-display.css +28 -79
  171. package/dist/tokens/components/data-entry.css +5 -19
  172. package/dist/tokens/components/descriptions.css +7 -27
  173. package/dist/tokens/components/email.css +38 -84
  174. package/dist/tokens/components/error-surface.css +2 -18
  175. package/dist/tokens/components/feedback.css +27 -124
  176. package/dist/tokens/components/form.css +13 -45
  177. package/dist/tokens/components/legal-document.css +16 -41
  178. package/dist/tokens/components/list-row.css +11 -36
  179. package/dist/tokens/components/logo.css +2 -57
  180. package/dist/tokens/components/navigation.css +16 -94
  181. package/dist/tokens/components/scroll-area.css +2 -18
  182. package/dist/tokens/components/separator.css +8 -30
  183. package/dist/tokens/components/sheet.css +3 -14
  184. package/dist/tokens/components/shell.css +53 -307
  185. package/dist/tokens/components/sidebar.css +5 -22
  186. package/dist/tokens/components/table.css +19 -140
  187. package/dist/tokens/components/toggle.css +3 -65
  188. package/dist/tokens/components/upload.css +7 -43
  189. package/dist/tokens/foundation.css +108 -383
  190. package/dist/tokens/semantic/layout.css +33 -207
  191. package/docs/CANONICAL-CONTRACTS.md +206 -0
  192. package/docs/COMPONENTS.md +157 -0
  193. package/docs/COMPOSITION-VS-COMPONENT.md +105 -0
  194. package/docs/CONSUMER-RULES.md +14 -0
  195. package/docs/CUSTOMER-THEMING.md +162 -0
  196. package/docs/DATETIME.md +69 -0
  197. package/docs/DEVELOPMENT.md +173 -0
  198. package/docs/FORMS.md +143 -0
  199. package/docs/FRAME-A11Y-CI.md +267 -0
  200. package/docs/FRAME-COVERAGE-LEDGER.md +123 -0
  201. package/docs/FRAME-COVERAGE-REPORT.md +140 -0
  202. package/docs/FRAME-COVERAGE-STANDARD.md +65 -0
  203. package/docs/FRAME-COVERAGE.md +29 -0
  204. package/docs/PROPS-REGISTRY.md +61 -0
  205. package/docs/PROPS-VOCABULARY.md +100 -0
  206. package/docs/README.md +60 -0
  207. package/docs/REGISTRY.md +70 -0
  208. package/docs/SPACING.md +56 -0
  209. package/docs/STANDARDS-vocabulary-tokens.md +48 -0
  210. package/docs/TESTING.md +98 -0
  211. package/docs/TOKENS.md +347 -0
  212. package/docs/asset-modules.d.ts +46 -0
  213. package/docs/assets/cover-terrain.svg +6 -0
  214. package/docs/assets/portrait-amber.svg +5 -0
  215. package/docs/assets/portrait-clay.svg +5 -0
  216. package/docs/assets/portrait-indigo.svg +5 -0
  217. package/docs/assets/portrait-iris.svg +5 -0
  218. package/docs/assets/portrait-moss.svg +5 -0
  219. package/docs/assets/portrait-plum.svg +5 -0
  220. package/docs/assets/portrait-slate.svg +5 -0
  221. package/docs/charts/compact-bar-trend.tsx +328 -0
  222. package/docs/charts/size-tiers.tsx +192 -0
  223. package/docs/data-display/accordion.tsx +99 -0
  224. package/docs/data-display/avatar.tsx +355 -0
  225. package/docs/data-display/badge.tsx +283 -0
  226. package/docs/data-display/card/examples/detail-panel.tsx +106 -0
  227. package/docs/data-display/card/index.md +3 -0
  228. package/docs/data-display/card/index.tsx +285 -0
  229. package/docs/data-display/carousel.tsx +160 -0
  230. package/docs/data-display/charts.tsx +198 -0
  231. package/docs/data-display/code-block.tsx +90 -0
  232. package/docs/data-display/collapsible.tsx +162 -0
  233. package/docs/data-display/credential-reveal.tsx +145 -0
  234. package/docs/data-display/data-table/examples/approval-queue.tsx +212 -0
  235. package/docs/data-display/data-table/examples/grid-features.tsx +158 -0
  236. package/docs/data-display/data-table/examples/list-page.tsx +175 -0
  237. package/docs/data-display/data-table/index.md +5 -0
  238. package/docs/data-display/data-table/index.tsx +295 -0
  239. package/docs/data-display/descriptions.tsx +143 -0
  240. package/docs/data-display/empty-state.tsx +164 -0
  241. package/docs/data-display/hover-card.tsx +181 -0
  242. package/docs/data-display/list-row.tsx +420 -0
  243. package/docs/data-display/permission-matrix.tsx +188 -0
  244. package/docs/data-display/popover-touch.tsx +27 -0
  245. package/docs/data-display/popover.tsx +246 -0
  246. package/docs/data-display/progress.tsx +84 -0
  247. package/docs/data-display/prose.tsx +105 -0
  248. package/docs/data-display/qr-code.tsx +68 -0
  249. package/docs/data-display/scroll-area.tsx +303 -0
  250. package/docs/data-display/service-launcher-card.tsx +145 -0
  251. package/docs/data-display/stat-card.tsx +99 -0
  252. package/docs/data-display/table.tsx +251 -0
  253. package/docs/data-display/timeline.tsx +112 -0
  254. package/docs/data-display/touch-actions.tsx +36 -0
  255. package/docs/data-display/tree-list.tsx +107 -0
  256. package/docs/data-entry/branch-scope-picker.tsx +123 -0
  257. package/docs/data-entry/calendar.tsx +180 -0
  258. package/docs/data-entry/cascader.tsx +378 -0
  259. package/docs/data-entry/checkbox.tsx +256 -0
  260. package/docs/data-entry/color-picker.tsx +117 -0
  261. package/docs/data-entry/command-palette.tsx +179 -0
  262. package/docs/data-entry/command.tsx +262 -0
  263. package/docs/data-entry/country-picker-recipe.tsx +175 -0
  264. package/docs/data-entry/date-picker.tsx +191 -0
  265. package/docs/data-entry/date-range-picker.tsx +149 -0
  266. package/docs/data-entry/form/examples/employee-settings.tsx +267 -0
  267. package/docs/data-entry/form/examples/invoice-form.tsx +387 -0
  268. package/docs/data-entry/form-field/examples/a11y-contract.tsx +240 -0
  269. package/docs/data-entry/form-field/examples/create-form.tsx +105 -0
  270. package/docs/data-entry/form-field/index.md +8 -0
  271. package/docs/data-entry/form-field/index.tsx +330 -0
  272. package/docs/data-entry/form-inertia.tsx +80 -0
  273. package/docs/data-entry/form-root.tsx +102 -0
  274. package/docs/data-entry/form.tsx +724 -0
  275. package/docs/data-entry/input-otp.tsx +231 -0
  276. package/docs/data-entry/input.tsx +114 -0
  277. package/docs/data-entry/label.tsx +100 -0
  278. package/docs/data-entry/month-picker.tsx +101 -0
  279. package/docs/data-entry/month-range-picker.tsx +115 -0
  280. package/docs/data-entry/number-input.tsx +240 -0
  281. package/docs/data-entry/password-input.tsx +102 -0
  282. package/docs/data-entry/password-strength.tsx +97 -0
  283. package/docs/data-entry/radio-group.tsx +95 -0
  284. package/docs/data-entry/rating.tsx +87 -0
  285. package/docs/data-entry/search-input.tsx +120 -0
  286. package/docs/data-entry/select-async-contracts.tsx +108 -0
  287. package/docs/data-entry/select-matrix.tsx +204 -0
  288. package/docs/data-entry/select.tsx +369 -0
  289. package/docs/data-entry/slider.tsx +130 -0
  290. package/docs/data-entry/switch.tsx +67 -0
  291. package/docs/data-entry/tag-input.tsx +108 -0
  292. package/docs/data-entry/textarea.tsx +209 -0
  293. package/docs/data-entry/time-picker.tsx +99 -0
  294. package/docs/data-entry/toggle-count.tsx +293 -0
  295. package/docs/data-entry/toggle-group.tsx +225 -0
  296. package/docs/data-entry/toggle.tsx +127 -0
  297. package/docs/data-entry/transfer.tsx +97 -0
  298. package/docs/data-entry/tree-select.tsx +204 -0
  299. package/docs/data-entry/upload.tsx +184 -0
  300. package/docs/feedback/alert-dialog.tsx +270 -0
  301. package/docs/feedback/alert.tsx +248 -0
  302. package/docs/feedback/banner.tsx +183 -0
  303. package/docs/feedback/danger-confirm.tsx +88 -0
  304. package/docs/feedback/dialog-touch.tsx +24 -0
  305. package/docs/feedback/dialog.tsx +193 -0
  306. package/docs/feedback/sheet.tsx +420 -0
  307. package/docs/feedback/skeleton.tsx +111 -0
  308. package/docs/feedback/toast.tsx +135 -0
  309. package/docs/feedback/tooltip.tsx +171 -0
  310. package/docs/feedback/two-factor-setup.tsx +68 -0
  311. package/docs/foundation/_email-specimen.ts +274 -0
  312. package/docs/foundation/colors.tsx +204 -0
  313. package/docs/foundation/density.tsx +232 -0
  314. package/docs/foundation/email-tokens.tsx +323 -0
  315. package/docs/foundation/radius-shadow.tsx +154 -0
  316. package/docs/foundation/spacing.tsx +211 -0
  317. package/docs/foundation/typography.tsx +147 -0
  318. package/docs/general/activity.tsx +224 -0
  319. package/docs/general/button/examples/destructive-confirm.tsx +90 -0
  320. package/docs/general/button/examples/form-actions.tsx +85 -0
  321. package/docs/general/button/examples/toolbar.tsx +160 -0
  322. package/docs/general/button/index.md +12 -0
  323. package/docs/general/button/index.tsx +211 -0
  324. package/docs/general/logo.tsx +131 -0
  325. package/docs/general/reveal.tsx +41 -0
  326. package/docs/general/typography.tsx +152 -0
  327. package/docs/layout/account-chip.tsx +72 -0
  328. package/docs/layout/admin-collection.tsx +122 -0
  329. package/docs/layout/app-shell.tsx +374 -0
  330. package/docs/layout/aspect-ratio.tsx +135 -0
  331. package/docs/layout/auth-account-summary.tsx +103 -0
  332. package/docs/layout/auth-divider.tsx +28 -0
  333. package/docs/layout/auth-footer.tsx +37 -0
  334. package/docs/layout/auth-identity.tsx +36 -0
  335. package/docs/layout/auth-recovery/examples/mfa-challenge.md +41 -0
  336. package/docs/layout/auth-recovery/examples/mfa-challenge.tsx +254 -0
  337. package/docs/layout/auth-recovery/examples/mobile-390.md +25 -0
  338. package/docs/layout/auth-recovery/examples/mobile-390.tsx +82 -0
  339. package/docs/layout/auth-recovery/examples/password-recovery.md +24 -0
  340. package/docs/layout/auth-recovery/examples/password-recovery.tsx +197 -0
  341. package/docs/layout/auth-recovery/examples/wrapping-ja-en-vi.md +27 -0
  342. package/docs/layout/auth-recovery/examples/wrapping-ja-en-vi.tsx +156 -0
  343. package/docs/layout/auth-recovery/index.md +140 -0
  344. package/docs/layout/auth-recovery/index.tsx +96 -0
  345. package/docs/layout/auth-shell-context.tsx +103 -0
  346. package/docs/layout/auth-shell-device.tsx +112 -0
  347. package/docs/layout/auth-shell-registration.tsx +335 -0
  348. package/docs/layout/auth-shell-variants.tsx +139 -0
  349. package/docs/layout/auth-shell.tsx +59 -0
  350. package/docs/layout/auth-stack.tsx +40 -0
  351. package/docs/layout/centered-shell.tsx +102 -0
  352. package/docs/layout/error-surface/examples/application-403.tsx +84 -0
  353. package/docs/layout/error-surface/examples/application-404.tsx +77 -0
  354. package/docs/layout/error-surface/examples/system-500.tsx +47 -0
  355. package/docs/layout/error-surface/examples/system-503.tsx +48 -0
  356. package/docs/layout/error-surface/index.md +153 -0
  357. package/docs/layout/error-surface/index.tsx +239 -0
  358. package/docs/layout/flex.tsx +266 -0
  359. package/docs/layout/legal-document-shell/_data.ts +110 -0
  360. package/docs/layout/legal-document-shell/examples/desktop-1440.md +12 -0
  361. package/docs/layout/legal-document-shell/examples/desktop-1440.tsx +83 -0
  362. package/docs/layout/legal-document-shell/examples/mobile-390.md +22 -0
  363. package/docs/layout/legal-document-shell/examples/mobile-390.tsx +70 -0
  364. package/docs/layout/legal-document-shell/examples/tablet-1024.md +3 -0
  365. package/docs/layout/legal-document-shell/examples/tablet-1024.tsx +84 -0
  366. package/docs/layout/legal-document-shell/examples/wrapping-ja-en-vi.md +18 -0
  367. package/docs/layout/legal-document-shell/examples/wrapping-ja-en-vi.tsx +61 -0
  368. package/docs/layout/legal-document-shell/index.md +51 -0
  369. package/docs/layout/legal-document-shell/index.tsx +101 -0
  370. package/docs/layout/master-detail.tsx +387 -0
  371. package/docs/layout/org-switcher.tsx +131 -0
  372. package/docs/layout/page-container.tsx +954 -0
  373. package/docs/layout/resizable-panel.tsx +419 -0
  374. package/docs/layout/responsive-grid.tsx +243 -0
  375. package/docs/layout/separator.tsx +327 -0
  376. package/docs/layout/service-role-panel.tsx +144 -0
  377. package/docs/layout/sidebar.tsx +609 -0
  378. package/docs/layout/split-pane.tsx +468 -0
  379. package/docs/layout/topbar.tsx +349 -0
  380. package/docs/navigation/app-setting-picker.tsx +142 -0
  381. package/docs/navigation/breadcrumb.tsx +135 -0
  382. package/docs/navigation/context-menu.tsx +123 -0
  383. package/docs/navigation/dropdown-menu.tsx +213 -0
  384. package/docs/navigation/filter-bar.tsx +227 -0
  385. package/docs/navigation/menubar.tsx +141 -0
  386. package/docs/navigation/navigation-menu.tsx +158 -0
  387. package/docs/navigation/pagination.tsx +241 -0
  388. package/docs/navigation/steps.tsx +265 -0
  389. package/docs/navigation/tabs-rtl.tsx +28 -0
  390. package/docs/navigation/tabs.tsx +314 -0
  391. package/docs/navigation/toolbar.tsx +339 -0
  392. package/docs/providers/app-provider.tsx +191 -0
  393. package/docs/providers/format-date.tsx +230 -0
  394. package/docs/query/button-refetch.tsx +160 -0
  395. package/docs/query/data-state.tsx +192 -0
  396. package/docs/query/infinite-query-state.tsx +93 -0
  397. package/docs/query/mutation-feedback.tsx +70 -0
  398. package/docs/query/prefetch-link.tsx +262 -0
  399. package/docs/query/touch-actions.tsx +68 -0
  400. package/docs/showcase/acme-portal.tsx +455 -0
  401. package/docs/showcase/acme-website.tsx +461 -0
  402. package/docs/showcase/case1-warehouse-dashboard.tsx +359 -0
  403. package/docs/showcase/case2-employee-me.tsx +444 -0
  404. package/docs/showcase/case3-approval-workflow.tsx +529 -0
  405. package/docs/showcase/case4-login.tsx +313 -0
  406. package/docs/showcase/case5-shift-calendar.tsx +795 -0
  407. package/docs/showcase/case6-agency-handy.tsx +1113 -0
  408. package/docs/showcase/futurelastic-web.tsx +392 -0
  409. package/docs/showcase/org-switcher.tsx +313 -0
  410. package/docs/showcase/permission-matrix.tsx +346 -0
  411. package/docs/showcase/public-landing.tsx +210 -0
  412. package/docs/showcase/settings-account-sections.tsx +559 -0
  413. package/docs/showcase/settings-security-mfa.tsx +145 -0
  414. package/docs/showcase/table-approval-queue.tsx +199 -0
  415. package/docs/showcase/table-bulk-actions.tsx +460 -0
  416. package/docs/showcase/table-compact-kintone.tsx +438 -0
  417. package/docs/showcase/table-conditional-format.tsx +367 -0
  418. package/docs/showcase/table-crud-list.tsx +544 -0
  419. package/docs/showcase/table-density.tsx +347 -0
  420. package/docs/showcase/table-expandable-rows.tsx +480 -0
  421. package/docs/showcase/table-filter-chips.tsx +456 -0
  422. package/docs/showcase/table-footer-totals.tsx +314 -0
  423. package/docs/showcase/table-grouped-subtotals.tsx +391 -0
  424. package/docs/showcase/table-master-detail.tsx +484 -0
  425. package/docs/showcase/table-pagination.tsx +327 -0
  426. package/docs/showcase/table-states.tsx +366 -0
  427. package/docs/showcase/table-sticky-columns.tsx +376 -0
  428. package/docs/showcase/table-tree-rows.tsx +444 -0
  429. package/docs/showcase/table-view-tabs.tsx +488 -0
  430. package/package.json +9 -12
  431. package/scripts/_agent-setup.mjs +16 -2
  432. package/scripts/audit-hook.mjs +3 -13
  433. package/scripts/init-agent-kit.mjs +1 -14
  434. package/scripts/postinstall.mjs +12 -12
  435. package/scripts/ui-audit.mjs +93 -31
  436. package/scripts/visual-audit-rules.mjs +51 -7
  437. package/scripts/visual-audit.mjs +118 -47
@@ -1,21 +1,12 @@
1
- /*
2
- * TABLE — cell padding + typography owned here (density-aware via --table-cell-* tokens).
3
- */
1
+
4
2
 
5
3
  @layer components {
6
- /* The table's base type. It used to ride on a `text-sm` utility emitted by the component; the
7
- * font-size AND its line-height companion now live here (gh#319 — see
8
- * tokens/components/table.css for why both are required). */
4
+
9
5
  [data-slot="table"] {
10
6
  font-size: var(--table-font-size);
11
7
  line-height: var(--table-line-height);
12
8
  }
13
9
 
14
- /* Horizontal rules between rows, and the "last row draws no rule" idiom. Both must be in the
15
- * SAME layer: while the row's rule was a `border-b` utility, no `components` selector could
16
- * zero it on the last row however specific (the gh#412 layer contract), so the tbody had to
17
- * carry an arbitrary-variant utility of its own. `[data-slot="table-body"] .ui-table-row`
18
- * (0,2,0) beats `.ui-table-row` (0,1,0), so the last-row reset lands cleanly. */
19
10
  .ui-table-row {
20
11
  border-block-end-width: var(--table-row-border-width);
21
12
  }
@@ -40,9 +31,6 @@
40
31
  padding-inline-end: 0;
41
32
  }
42
33
 
43
- /* A column with an empty header (icon / action column) shouldn't paint the
44
- * header band — keep its cell transparent so the empty header visually
45
- * disappears instead of showing a blank grey block. */
46
34
  [data-slot="table-head"][data-empty] {
47
35
  background: transparent;
48
36
  }
@@ -50,10 +38,7 @@
50
38
  [data-slot="table-cell"] {
51
39
  padding: var(--table-cell-padding-y) var(--table-cell-space-x);
52
40
  vertical-align: middle;
53
- /* Don't let a narrow column crush cell text — in CJK this collapses to one
54
- * character per line. Keep each cell on one line; the scroll container
55
- * (.ui-data-table-scroll, overflow-x:auto) scrolls instead. A column that
56
- * genuinely needs wrapping opts in with `whitespace-normal` via col.width. */
41
+
57
42
  white-space: nowrap;
58
43
  }
59
44
 
@@ -69,7 +54,6 @@
69
54
  gap: var(--space-inline-md);
70
55
  }
71
56
 
72
- /* Sortable header label is a real button (keyboard + aria-sort); inherits the cell's type. */
73
57
  .ui-data-table-sort-button {
74
58
  display: inline-flex;
75
59
  align-items: center;
@@ -95,10 +79,6 @@
95
79
  gap: var(--space-inline-sm);
96
80
  }
97
81
 
98
- /* The footer owns its own inset on BOTH axes (gh#236) — it is a self-contained slot that is
99
- * usually dropped straight into a flush container, so relying on an ancestor for inline/block-end
100
- * padding left the label and the page-size Select flush against the container edge and its
101
- * closing border. Logical properties only (RTL-safe); both axes are tunable tokens (#45). */
102
82
  .ui-data-table-pagination {
103
83
  display: flex;
104
84
  align-items: center;
@@ -108,8 +88,6 @@
108
88
  padding-inline: var(--table-pagination-padding-x, var(--table-cell-space-x));
109
89
  }
110
90
 
111
- /* Numbered footer may wrap only between its two semantic groups. The supported JA/EN/VI locale
112
- * label and select stay fully visible together (gh#184). */
113
91
  .ui-data-table-pagination--numbered {
114
92
  flex-wrap: wrap;
115
93
  min-width: 0;
@@ -140,37 +118,22 @@
140
118
  }
141
119
 
142
120
  .ui-data-table-surface {
143
- /* `clip`, NOT `hidden` (gh#291 family): both clip the table to the rounded
144
- * border, but `hidden` makes this box a SCROLL CONTAINER, which silently
145
- * captured the sticky context of `stickyHeader` (default true) and of the
146
- * pinned columns — they anchored to a box that never scrolls, so the header
147
- * scrolled away with the body inside `.ui-data-table-scroll`. `clip` is not
148
- * a scroll container, so sticky binds to the real scroll region and works.
149
- * Measured: hidden → thead moved 300px per 300px scrolled; clip → 1px. */
121
+
150
122
  overflow: clip;
151
- /* Narrow-viewport legibility floor — a TOKEN, not the old `min-w-[640px]` literal (gh#253,
152
- * rule #45). Cleared at the `sm` step below, and opted out of entirely by the collection
153
- * preset, which owns its width through the column-priority measures. */
123
+
154
124
  min-inline-size: var(--table-surface-min-inline-size);
155
125
  border: 1px solid hsl(var(--border));
156
126
  border-radius: var(--radius-md);
157
127
  }
158
128
 
159
- /* `preset="action-collection"` (gh#253) — the priority measures fit the table to its container at
160
- * every width, so the desktop floor would re-introduce exactly the horizontal scroll the preset
161
- * removes. Attribute-scoped: `preset="default"` emits NO attribute, so an untouched DataTable
162
- * never matches this rule (the inert-default contract, gh#231). */
163
129
  .ui-data-table-surface[data-preset="action-collection"] {
164
130
  min-inline-size: 0;
165
131
  }
166
132
 
167
- /* Zebra striping (opt-in via the `striped` prop). Selected rows keep their
168
- * own emphasis, so they are excluded from the stripe. */
169
133
  .ui-data-table-surface[data-striped] tbody tr:nth-child(even):not([data-state="selected"]) {
170
134
  background-color: var(--table-row-striped-background, hsl(var(--muted) / 0.4));
171
135
  }
172
136
 
173
- /* Empty-state cell hosts the built-in EmptyState (which brings its own padding). */
174
137
  .ui-data-table-empty {
175
138
  padding: 0;
176
139
  }
@@ -190,44 +153,12 @@
190
153
  gap: var(--space-inline-xs);
191
154
  }
192
155
 
193
- /* A centred header centres its LABEL, not its button.
194
- *
195
- * The sort chevron lives inside the label, so centring the button alone
196
- * leaves the words half an icon to the left of the column they name —
197
- * measured at 8px on a 12px icon, which is enough to read as a mistake in a
198
- * row of headings.
199
- *
200
- * The fix is symmetry, not a counterweight. Reserving the chevron's width on
201
- * BOTH sides and taking the chevron itself out of flow means the words are
202
- * centred by construction — the label's own box is centred in the cell, and
203
- * nothing inside it can shift them. A counterweight sitting in flow as a
204
- * flex sibling was the first attempt and it holds only while there is room
205
- * to spare: flex items shrink, so on a column narrow enough to squeeze them
206
- * the balance collapses and the label slides back off centre. Measured at
207
- * 8px on a 56px column, 0px on the wide ones — a bug that only appears in
208
- * the narrow case is worse than one that appears everywhere.
209
- *
210
- * Only when the column asked to be centred: a start-aligned header wants the
211
- * icon to follow the text with nothing before it. */
212
156
  :is(th, td).text-center > .ui-data-table-sort-button > .ui-data-table-sort-label {
213
157
  position: relative;
214
- /* The icon's width plus the gap it would have sat behind — the space the
215
- * chevron occupied when it was in flow, now reserved on each side. */
158
+
216
159
  padding-inline: calc(0.75rem + var(--space-inline-xs));
217
160
  }
218
161
 
219
- /* Out of flow, in the inline-end reservation its own padding just made.
220
- * Logical inset, so RTL puts it on the other side with the padding.
221
- *
222
- * `:last-child` and NOT `:not(:first-child)`. A string header renders as a
223
- * text node, and `:first-child` counts only ELEMENTS — so with
224
- * `[text, svg]` the chevron IS the first element child and the negation
225
- * matched nothing at all. The label kept its symmetric padding, which
226
- * centres the BOX, while the words inside it stayed 8px off exactly as
227
- * before. Measured against the built stylesheet, not read: the rule was
228
- * present in the CSS and inert in the DOM, which is why reading it proved
229
- * nothing. `:last-child` holds for both shapes the label takes,
230
- * `[text, svg]` and `[element, svg]`. */
231
162
  :is(th, td).text-center > .ui-data-table-sort-button > .ui-data-table-sort-label > :last-child {
232
163
  position: absolute;
233
164
  inset-inline-end: 0;
@@ -242,11 +173,6 @@
242
173
  padding-inline: var(--space-page-active-x);
243
174
  }
244
175
 
245
- /* Scroll-hint fade — a SCROLL affordance, so it only shows while the region
246
- * actually overflows and is not scrolled to the inline-end. The component
247
- * measures the scroll box and stamps `.ui-data-table-has-overflow-end`
248
- * (gh#267 — the fade used to render unconditionally, washing out the last
249
- * column of tables that never scroll). */
250
176
  .ui-data-table-scroll::after {
251
177
  content: "";
252
178
  position: absolute;
@@ -270,12 +196,6 @@
270
196
  padding-inline: 0;
271
197
  }
272
198
 
273
- /* Same reset, same reason, for a table sitting straight on a FLUSH page. The bleed above exists
274
- * to cancel the page gutter so the scroll region reaches the page edges — but
275
- * `.ui-page-container--flush .ui-page-body` zeroes that gutter, leaving nothing to bleed into.
276
- * The -16px then escapes the page: nothing clips it, so the whole page gained 16px of
277
- * horizontal scroll at 320/375/390 (WCAG 2.2 SC 1.4.10 Reflow). Scoped by child combinator so a
278
- * table inside a Card keeps its own bleed — the card supplies the padding that one compensates. */
279
199
  .ui-page-container--flush > .ui-page-body > .ui-data-table-root > .ui-data-table-scroll {
280
200
  margin-inline: 0;
281
201
  padding-inline: 0;
@@ -289,10 +209,6 @@
289
209
  inset-inline-end: 0;
290
210
  }
291
211
 
292
- /* The flush frame contract lives in ONE place, next to `.ui-table-bordered` below — it has to
293
- * cover BOTH full-bleed surfaces (`.ui-data-table-surface` and `<Table bordered>`) or the fix
294
- * for one silently regresses the other (gh#305 → gh#306). */
295
-
296
212
  @media (min-width: 640px) {
297
213
  .ui-data-table-scroll {
298
214
  margin-inline: 0;
@@ -303,19 +219,11 @@
303
219
  inset-inline-end: 0;
304
220
  }
305
221
 
306
- /* From `sm` up the viewport is already wider than the floor, so it is released and the surface
307
- * simply fills its container (this is the `sm:min-w-0` half of the old utility pair). */
308
222
  .ui-data-table-surface {
309
223
  min-inline-size: 0;
310
224
  }
311
225
  }
312
226
 
313
- /* ── Pinned (sticky) inline-end column ────────────────────────────────
314
- * The standard home for a row-actions column: it stays put while the rest
315
- * of the table scrolls horizontally. The cell carries an opaque, state-aware
316
- * background so scrolling cells don't bleed through, plus a token shadow that
317
- * separates it from the body. When present, the scroll fade is hidden (the
318
- * pin's own shadow is the affordance). RTL-correct via logical properties. */
319
227
  .ui-data-table-has-pin-end::after {
320
228
  display: none;
321
229
  }
@@ -332,14 +240,10 @@
332
240
  background-color: hsl(var(--secondary));
333
241
  }
334
242
 
335
- /* box-shadow has no logical offset — flip its inline direction by hand in RTL,
336
- * where the pinned column sits on the visual left and the shadow points right. */
337
243
  [dir="rtl"] .ui-data-table-pin-end {
338
244
  box-shadow: 6px 0 6px -5px hsl(var(--foreground) / 0.12);
339
245
  }
340
246
 
341
- /* Mirror the row's hover / selected tint — a translucent muted wash layered
342
- * over the opaque base, so the pinned cell matches the rest of its row. */
343
247
  .ui-data-table-surface tbody tr:hover > .ui-data-table-pin-end {
344
248
  background-image: linear-gradient(
345
249
  var(--table-row-hover-background, hsl(var(--muted) / 0.5)),
@@ -354,11 +258,6 @@
354
258
  );
355
259
  }
356
260
 
357
- /* `<Table bordered>` — the full cell grid (gh#274). Horizontal row rules already come from
358
- * TableRow's own border; here we add the outer frame and the vertical rules between columns,
359
- * so rowSpan/colSpan merged cells read as merged (a merged group cell floating in whitespace
360
- * is unreadable). Colour resolves the --table-border-color token at the CALL SITE so a scoped
361
- * theme override of --border reaches it. */
362
261
  .ui-table-bordered {
363
262
  border: 1px solid var(--table-border-color, hsl(var(--border)));
364
263
  }
@@ -367,79 +266,25 @@
367
266
  border-inline-end: 1px solid var(--table-border-color, hsl(var(--border)));
368
267
  }
369
268
 
370
- /* ── The flush full-bleed frame contract (gh#305 · gh#306) ────────────────────────────────
371
- * A full-bleed surface inside `<CardContent flush>` already has the CARD's 1px frame around
372
- * it, so its own outer frame doubles up as two nested rounded borders (measured on
373
- * customer-inquiries detail: TABLE 1px inside the card's 1px, gh#305). Both full-bleed
374
- * surfaces are covered by ONE rule: `.ui-data-table-surface` (the DataTable's own frame) and
375
- * `.ui-table-bordered` (`<Table bordered>`). They used to be two rules a hundred lines apart
376
- * and the gh#306 repair reached only the second — the canonical
377
- * `<Card><CardContent flush><DataTable/></CardContent></Card>` kept a frameless surface, so
378
- * the header still floated with no line under it (measured at HEAD: surface
379
- * border-top-width 0px).
380
- *
381
- * ERASE, never repaint (rule #44). The earlier repair spelled this `border: 0` followed by a
382
- * hard-coded `border-block-start: 1px solid …` — chrome painted unconditionally, which is the
383
- * bug pattern the rule exists to forbid: it re-drew the line even where the card already had
384
- * one (a banded header's own bottom border → a doubled 2px rule) and even where the card frame
385
- * itself sits (a headerless card → a doubled top edge). Here only the WIDTH is zeroed, so the
386
- * style and colour stay whatever the surface's own border declared, and the block-start edge is
387
- * restored only where something actually needs separating.
388
- *
389
- * `.ui-skeleton-table` rides along in BOTH lists on purpose. It is the placeholder the real
390
- * DataTable swaps for, and alert-layout.css says so in as many words ("mirrors
391
- * `.ui-data-table-surface` … so the skeleton placeholder and the real DataTable it swaps for
392
- * sit identically"). Give the surface a divider without giving the skeleton one and that
393
- * promise breaks: a 1px line appears the instant the data lands. (alert-layout.css keeps its
394
- * own copy of the erase half so Skeleton is still framed correctly for a consumer who imports
395
- * it WITHOUT this layer.) */
396
269
  [data-slot="card-content"][data-flush]
397
270
  :is(.ui-data-table-surface, .ui-table-bordered, .ui-skeleton-table) {
398
271
  border-width: 0;
399
272
  border-radius: 0;
400
273
  }
401
274
 
402
- /* …restored ONLY when a plain CardHeader sits DIRECTLY above the flush body. That edge is the
403
- * one place a flush surface's border does NOT coincide with something the card already draws:
404
- * above it is the header's whitespace, not the card frame (gh#306, measured on a rental
405
- * detail's 出荷伝票一覧 section). Adjacent-sibling, not `:has()` on the card, so the three
406
- * counter-cases fall out by construction and need no extra rule: no header above → the card
407
- * frame is the top edge; a BANDED header → its own `border-bottom` is the divider; a CardBar
408
- * above → its own `border-block` is. Width comes from a token (rules #44/#45) whose default is
409
- * the same hairline the surface itself draws, so a service quiets the divider once instead of
410
- * forking this file. */
411
275
  [data-slot="card-header"]:not([data-banded])
412
276
  + [data-slot="card-content"][data-flush]
413
277
  :is(.ui-data-table-surface, .ui-table-bordered, .ui-skeleton-table) {
414
278
  border-block-start-width: var(--table-flush-divider-width);
415
279
  }
416
280
 
417
- /* …and quieted again when a DataTable TOOLBAR sits between the header and the surface: the
418
- * flush toolbar already draws that dividing line (see `.ui-data-table-toolbar` above), so the
419
- * surface below it would stack a second hairline on top of it. Done by setting the token on the
420
- * root rather than by another `border-*` rule, so it INHERITS down to whichever surface ends up
421
- * under the toolbar and cannot get into a specificity race with the restore rule. */
422
281
  [data-slot="card-content"][data-flush] .ui-data-table-root:has(.ui-data-table-toolbar) {
423
282
  --table-flush-divider-width: 0px;
424
283
  }
425
284
  }
426
285
 
427
286
  @layer components {
428
- /* ── Table · `preset="action-collection"` (gh#253) ───────────────────────────────────────────
429
- * The canonical dense approval / action queue: requester · target · reason · requested date ·
430
- * row actions, all five discoverable in the initial 390px frame, WITHOUT a consumer width, a
431
- * hidden column or a page-local breakpoint.
432
- *
433
- * It keeps the REAL table: no `display` change, no role rewriting, no card transformation — so
434
- * `<table>/<thead>/<tr>/<th>/<td>` semantics, header association, `aria-sort` and screen-reader
435
- * table navigation survive exactly as they are at 1440. What the preset replaces is the SIZING
436
- * model: the desktop INTRINSIC column widths (a `white-space: nowrap` reason column is what
437
- * makes a five-column queue 1511px wide and forces the horizontal scroll gh#253 reports) give
438
- * way to `table-layout: fixed` plus token-owned column-PRIORITY measures, and cells wrap.
439
- *
440
- * The collapse step is measured against the TABLE'S OWN container, not the viewport (a table in
441
- * a master rail must collapse before the page does), so it is a container query. Below the step
442
- * only the MEASURES and the type/padding tier change — the structure is identical. */
287
+
443
288
  .ui-table-collection {
444
289
  container: ui-table-collection / inline-size;
445
290
  }
@@ -450,24 +295,12 @@
450
295
  }
451
296
 
452
297
  .ui-table-collection :is([data-slot="table-head"], [data-slot="table-cell"]) {
453
- /* The column measure comes from `priority`; an unmarked column takes what is left (`auto`),
454
- * which is the free-text column — EXCEPT past the seven-column budget below the collapse
455
- * step, where the `:has()` tier re-points the middle fallback at the flex floor (gh#262):
456
- * the fixed algorithm hands an auto column 0px once the marked columns over-constrain the
457
- * table, which is the one-character-per-line shredding this preset must never produce.
458
- * There every column carries a rem floor-measure; once the floors outgrow the container the
459
- * table's used width grows past its specified 100% (CSS 2.1 §17.5.2.1) and the DIRECT
460
- * wrapper's keyboard-reachable overflow-x region scrolls — the SC 1.4.10-permitted
461
- * one-dimensional scroll, instead of unreadable shredding (see tokens/components/table.css). */
298
+
462
299
  inline-size: var(
463
300
  --table-action-collection-column-width,
464
301
  var(--table-action-collection-flex-width, auto)
465
302
  );
466
- /* Wrapping guard, considered for gh#262: this stays `overflow-wrap: anywhere`, NOT
467
- * `word-break: keep-all`. Under `table-layout: fixed` a column cannot grow to fit an
468
- * unbreakable CJK run, so keep-all would overflow/clip a long JA header instead of widening
469
- * its column. With the floors guaranteeing a ~5-glyph measure, a wrapped JA header is two
470
- * readable lines — never a vertical character column — and losing no text beats clipping. */
303
+
471
304
  overflow-wrap: anywhere;
472
305
  white-space: normal;
473
306
  vertical-align: top;
@@ -492,62 +325,22 @@
492
325
  }
493
326
 
494
327
  @layer components {
495
- /* ── Table · `preset="stacked-record-collection"` (gh#293 restore — SCR-215) ─────────────────
496
- * The canonical WIDE, heterogeneous record collection: a table whose column count/content
497
- * cannot be squeezed into any fixed narrow-frame measure at all — an admin detail row with many
498
- * disparate, free-text fields of unpredictable length, not a dense queue (contrast
499
- * `action-collection` above, which keeps the real table and only re-sizes columns). Below
500
- * `collapseBelow` the `<thead>` hides and every `<tr>` becomes a bordered key-value CARD: each
501
- * `TableCell`'s own `label` (its column header text, carried per-cell since the `<th>`
502
- * association is now hidden) renders inline above the value, taking over the accessible-name
503
- * role. Above the step it is a byte-for-byte ordinary table. Measured against the TABLE'S OWN
504
- * container, not the viewport, same as `action-collection`. */
328
+
505
329
  .ui-table-stacked-collection {
506
330
  container: ui-table-stacked-collection / inline-size;
507
331
  }
508
332
 
509
- /* Rendered into the DOM unconditionally so it exists for the container query below to reveal
510
- * (see TableCell in table.tsx) but hidden above the collapse step, where the real `<th>` already
511
- * carries the label — an ordinary table gains no visible extra markup. */
512
333
  .ui-table-stacked-collection-label {
513
334
  display: none;
514
335
  }
515
336
  }
516
337
 
517
- /* The compact tier lives in `godxjp-ui-responsive` — the LAST layer, declared after Tailwind in
518
- * styles/base.css — not in `@layer components`. The <table> USED to carry `text-sm`, a Tailwind
519
- * utility, and `utilities` outranks `components` by LAYER ORDER, so a `font-size:` re-point
520
- * written as a component rule could never apply however specific it was: that is exactly why
521
- * `--table-action-collection-font-size-compact` was dead at every width (gh#412), leaving the
522
- * narrow frame at 14px where a 5–6 character Japanese label overflows its column measure.
523
- * gh#319 moved the base type off that utility and onto `[data-slot="table"]` above, but the
524
- * compact tier STAYS here: a CONSUMER's own `text-*` utility on the table would otherwise
525
- * half-collapse it, and this keeps the whole tier — type AND column measures — decided in ONE
526
- * place. See styles/base.css · THE LAYER CONTRACT. */
527
338
  @layer components {
528
- /* DATA TABLE — the pieces around the already-tokenized cell rhythm (#319).
529
- *
530
- * These belong in `components`, not in the responsive layer above: an append placed them there
531
- * by mistake (it targeted the file's last `}`, which closes the layer, not the layer's own end)
532
- * and `table-action-collection.test.tsx` catches exactly that — the responsive layer is
533
- * reserved for media-queried rules.
534
- *
535
- * Four of them are scoped through `.ui-data-table-root` rather than left bare, because the last
536
- * layer was doing work for them: the icon rules sit on svgs inside real <Button>s where
537
- * `.ui-button svg` (0,1,1) outranks a bare class, and the skeleton chip's radius competes with
538
- * `.ui-skeleton-block` from the later-imported alert-layout.css. Demoting them without raising
539
- * specificity would have shrunk the toolbar/pagination glyphs and re-rounded the chips. */
540
-
541
- /* DATA TABLE — the pieces around the already-tokenized cell rhythm (#319). */
542
-
543
- /* The select column holds only a checkbox, so it takes a fixed narrow width rather than a
544
- * share of the flexible content columns. */
339
+
545
340
  .ui-data-table-select-column {
546
341
  inline-size: var(--table-select-column-width);
547
342
  }
548
343
 
549
- /* A sticky header floats over the scrolled rows, so it joins the one system overlay layer
550
- * rather than carrying a private z-index that a portaled surface could out-rank. */
551
344
  .ui-data-table-sticky-header {
552
345
  position: sticky;
553
346
  inset-block-start: 0;
@@ -575,7 +368,6 @@
575
368
  color: hsl(var(--muted-foreground));
576
369
  }
577
370
 
578
- /* Skeletons mimic the real content: a checkbox square and a text line at cap height. */
579
371
  .ui-data-table-root .ui-data-table-skeleton-check {
580
372
  inline-size: var(--table-skeleton-check-size);
581
373
  block-size: var(--table-skeleton-check-size);
@@ -592,10 +384,7 @@
592
384
  }
593
385
 
594
386
  @layer godxjp-ui-responsive {
595
- /* Below the step the SOURCE measures are re-pointed to their compact tier (and the type / row
596
- * density with them); nothing else moves. One block per canonical step — a media/container
597
- * query cannot read a `var()`, so the tokenized scale is written out (sm 40rem · md 48rem ·
598
- * lg 64rem · xl 80rem, the same steps as `--master-detail-collapse-below`). */
387
+
599
388
  @container ui-table-collection (width < 40rem) {
600
389
  [data-collapse-below="sm"] [data-slot="table"] {
601
390
  --table-action-collection-primary-width: var(--table-action-collection-primary-width-compact);
@@ -608,24 +397,14 @@
608
397
  --table-cell-space-x: var(--table-action-collection-cell-space-x-compact);
609
398
  --table-cell-padding-y: var(--table-action-collection-cell-padding-y-compact);
610
399
  font-size: var(--table-action-collection-font-size-compact);
611
- /* The legibility floor. Default `0` keeps the table fitted to its container exactly as
612
- * before; a consumer whose column count exceeds the priority budget raises it and the
613
- * surrounding scroll region takes the overflow instead of the cells. */
400
+
614
401
  min-inline-size: var(--table-action-collection-min-inline-size-compact);
615
402
  }
616
403
 
617
- /* A nowrap child (a Badge pill, a chip) would otherwise bleed into the next column at the
618
- * compact measure — inside a collapsed action cell everything wraps. */
619
404
  [data-collapse-below="sm"] [data-slot="table-cell"] * {
620
405
  white-space: normal;
621
406
  }
622
407
 
623
- /* SEVEN columns and up — the wide-collection floor tier (gh#262). Percent shares are
624
- * guaranteed to sum past 100% here and fixed layout would normalize them into sub-glyph
625
- * columns, so every column (the unmarked free-text one included) takes its rem floor
626
- * instead; the over-constrained table grows past 100% and its wrapper scrolls. Up to six
627
- * columns this rule never matches and the percent tier above keeps the canonical queues
628
- * scroll-free — the preset's documented column-count ceiling. */
629
408
  [data-collapse-below="sm"] [data-slot="table"]:has([data-slot="table-head"]:nth-child(7)) {
630
409
  --table-action-collection-primary-width: var(--table-action-collection-primary-width-floor);
631
410
  --table-action-collection-secondary-width: var(
@@ -648,24 +427,14 @@
648
427
  --table-cell-space-x: var(--table-action-collection-cell-space-x-compact);
649
428
  --table-cell-padding-y: var(--table-action-collection-cell-padding-y-compact);
650
429
  font-size: var(--table-action-collection-font-size-compact);
651
- /* The legibility floor. Default `0` keeps the table fitted to its container exactly as
652
- * before; a consumer whose column count exceeds the priority budget raises it and the
653
- * surrounding scroll region takes the overflow instead of the cells. */
430
+
654
431
  min-inline-size: var(--table-action-collection-min-inline-size-compact);
655
432
  }
656
433
 
657
- /* A nowrap child (a Badge pill, a chip) would otherwise bleed into the next column at the
658
- * compact measure — inside a collapsed action cell everything wraps. */
659
434
  [data-collapse-below="md"] [data-slot="table-cell"] * {
660
435
  white-space: normal;
661
436
  }
662
437
 
663
- /* SEVEN columns and up — the wide-collection floor tier (gh#262). Percent shares are
664
- * guaranteed to sum past 100% here and fixed layout would normalize them into sub-glyph
665
- * columns, so every column (the unmarked free-text one included) takes its rem floor
666
- * instead; the over-constrained table grows past 100% and its wrapper scrolls. Up to six
667
- * columns this rule never matches and the percent tier above keeps the canonical queues
668
- * scroll-free — the preset's documented column-count ceiling. */
669
438
  [data-collapse-below="md"] [data-slot="table"]:has([data-slot="table-head"]:nth-child(7)) {
670
439
  --table-action-collection-primary-width: var(--table-action-collection-primary-width-floor);
671
440
  --table-action-collection-secondary-width: var(
@@ -688,24 +457,14 @@
688
457
  --table-cell-space-x: var(--table-action-collection-cell-space-x-compact);
689
458
  --table-cell-padding-y: var(--table-action-collection-cell-padding-y-compact);
690
459
  font-size: var(--table-action-collection-font-size-compact);
691
- /* The legibility floor. Default `0` keeps the table fitted to its container exactly as
692
- * before; a consumer whose column count exceeds the priority budget raises it and the
693
- * surrounding scroll region takes the overflow instead of the cells. */
460
+
694
461
  min-inline-size: var(--table-action-collection-min-inline-size-compact);
695
462
  }
696
463
 
697
- /* A nowrap child (a Badge pill, a chip) would otherwise bleed into the next column at the
698
- * compact measure — inside a collapsed action cell everything wraps. */
699
464
  [data-collapse-below="lg"] [data-slot="table-cell"] * {
700
465
  white-space: normal;
701
466
  }
702
467
 
703
- /* SEVEN columns and up — the wide-collection floor tier (gh#262). Percent shares are
704
- * guaranteed to sum past 100% here and fixed layout would normalize them into sub-glyph
705
- * columns, so every column (the unmarked free-text one included) takes its rem floor
706
- * instead; the over-constrained table grows past 100% and its wrapper scrolls. Up to six
707
- * columns this rule never matches and the percent tier above keeps the canonical queues
708
- * scroll-free — the preset's documented column-count ceiling. */
709
468
  [data-collapse-below="lg"] [data-slot="table"]:has([data-slot="table-head"]:nth-child(7)) {
710
469
  --table-action-collection-primary-width: var(--table-action-collection-primary-width-floor);
711
470
  --table-action-collection-secondary-width: var(
@@ -728,24 +487,14 @@
728
487
  --table-cell-space-x: var(--table-action-collection-cell-space-x-compact);
729
488
  --table-cell-padding-y: var(--table-action-collection-cell-padding-y-compact);
730
489
  font-size: var(--table-action-collection-font-size-compact);
731
- /* The legibility floor. Default `0` keeps the table fitted to its container exactly as
732
- * before; a consumer whose column count exceeds the priority budget raises it and the
733
- * surrounding scroll region takes the overflow instead of the cells. */
490
+
734
491
  min-inline-size: var(--table-action-collection-min-inline-size-compact);
735
492
  }
736
493
 
737
- /* A nowrap child (a Badge pill, a chip) would otherwise bleed into the next column at the
738
- * compact measure — inside a collapsed action cell everything wraps. */
739
494
  [data-collapse-below="xl"] [data-slot="table-cell"] * {
740
495
  white-space: normal;
741
496
  }
742
497
 
743
- /* SEVEN columns and up — the wide-collection floor tier (gh#262). Percent shares are
744
- * guaranteed to sum past 100% here and fixed layout would normalize them into sub-glyph
745
- * columns, so every column (the unmarked free-text one included) takes its rem floor
746
- * instead; the over-constrained table grows past 100% and its wrapper scrolls. Up to six
747
- * columns this rule never matches and the percent tier above keeps the canonical queues
748
- * scroll-free — the preset's documented column-count ceiling. */
749
498
  [data-collapse-below="xl"] [data-slot="table"]:has([data-slot="table-head"]:nth-child(7)) {
750
499
  --table-action-collection-primary-width: var(--table-action-collection-primary-width-floor);
751
500
  --table-action-collection-secondary-width: var(
@@ -756,13 +505,6 @@
756
505
  }
757
506
  }
758
507
 
759
- /* ── `preset="stacked-record-collection"` (gh#293 restore — SCR-215) ────────────────────────
760
- * Below the step the `<thead>` hides and each `<tr>` becomes a bordered key-value card. This is
761
- * a genuine layout-mode swap (`display: block`) rather than a measure re-point, because the
762
- * whole point of this preset is fields too heterogeneous for ANY fixed column measure to hold —
763
- * unlike `action-collection`'s fixed-layout column budget above. Above the step, none of this
764
- * matches and the table renders exactly as an ordinary `<table>`. One block per canonical step,
765
- * same sm/md/lg/xl scale as `action-collection`. */
766
508
  @container ui-table-stacked-collection (width < 40rem) {
767
509
  [data-collapse-below="sm"] [data-slot="table"] {
768
510
  display: block;
@@ -1,16 +1,10 @@
1
- /*
2
- * TEXT / HEADING — typographic primitives (@godxjp/ui).
3
- * Token-driven ONLY: size = golden-ratio type scale, weight = the 2-weight system (400/500),
4
- * tone = semantic foreground tokens. No arbitrary px, no font-semibold=600. Components emit
5
- * data-slot + data-* flags; all styling lives here.
6
- */
1
+
7
2
 
8
3
  @layer components {
9
4
  .ui-text {
10
5
  margin: 0;
11
6
  }
12
7
 
13
- /* Size — steps of the golden-ratio scale (sm = base). */
14
8
  [data-slot="text"][data-size="2xs"] {
15
9
  font-size: var(--font-size-2xs);
16
10
  }
@@ -33,9 +27,6 @@
33
27
  font-size: var(--font-size-2xl);
34
28
  }
35
29
 
36
- /* Weight — the reference-design canon (400 body · 500 heading/label · 700 emphasis). No 600.
37
- * Shared by text + heading; the two-attribute heading selectors outrank the base heading
38
- * rule below, so `<Heading weight="bold">` renders a semantic, emphasised title. */
39
30
  [data-slot="text"][data-weight="regular"],
40
31
  [data-slot="heading"][data-weight="regular"] {
41
32
  font-weight: var(--font-weight-normal);
@@ -44,18 +35,21 @@
44
35
  [data-slot="heading"][data-weight="medium"] {
45
36
  font-weight: var(--font-weight-medium);
46
37
  }
38
+ [data-slot="text"][data-weight="semibold"],
39
+ [data-slot="heading"][data-weight="semibold"] {
40
+ font-weight: var(--font-weight-semibold);
41
+ }
42
+
47
43
  [data-slot="text"][data-weight="bold"],
48
44
  [data-slot="heading"][data-weight="bold"] {
49
45
  font-weight: var(--font-weight-bold);
50
46
  }
51
47
 
52
- /* code / kbd render monospace by default (the natural expectation for `as="code"`). */
53
48
  code[data-slot="text"],
54
49
  kbd[data-slot="text"] {
55
50
  font-family: var(--font-family-mono, ui-monospace, "SFMono-Regular", monospace);
56
51
  }
57
52
 
58
- /* Tone + Heading tone — semantic foreground tokens. */
59
53
  [data-slot="text"][data-tone="default"],
60
54
  [data-slot="heading"][data-tone="default"] {
61
55
  color: hsl(var(--foreground));
@@ -85,7 +79,6 @@
85
79
  color: hsl(var(--info));
86
80
  }
87
81
 
88
- /* Alignment (logical), truncate, tabular, mono — shared by text + heading. */
89
82
  [data-slot="text"][data-align="start"],
90
83
  [data-slot="heading"][data-align="start"] {
91
84
  text-align: start;
@@ -103,21 +96,15 @@
103
96
  overflow: hidden;
104
97
  text-overflow: ellipsis;
105
98
  white-space: nowrap;
106
- /* min-width:0 lets a truncating Text shrink inside a flex row WITHOUT the consumer
107
- * having to add `min-w-0` — the documented flex-truncate idiom (issue #114). */
108
99
  min-width: 0;
109
100
  }
110
- /* Multi-line clamp (`clamp` prop, issue #261) — the token-owned line-clamp so consumers never
111
- * write a page-local `line-clamp-N` utility. Visual-only: the full text stays in the DOM and
112
- * the accessible name. `--text-clamp` is set inline by the component from the prop value. */
101
+
113
102
  [data-slot="text"][data-clamp] {
114
103
  display: -webkit-box;
115
104
  -webkit-box-orient: vertical;
116
105
  -webkit-line-clamp: var(--text-clamp, 2);
117
106
  line-clamp: var(--text-clamp, 2);
118
107
  overflow: hidden;
119
- /* Same flex-shrink contract as truncate (issue #114): clamps inside a flex row without
120
- * the consumer adding `min-w-0`. */
121
108
  min-width: 0;
122
109
  }
123
110
  [data-slot="text"][data-tabular] {
@@ -127,7 +114,6 @@
127
114
  font-family: var(--font-family-mono, ui-monospace, "SFMono-Regular", monospace);
128
115
  }
129
116
 
130
- /* Heading — sized from the --heading-h* tokens, medium weight, tight rhythm. */
131
117
  [data-slot="heading"] {
132
118
  margin: 0;
133
119
  font-weight: var(--font-weight-medium);