@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
@@ -0,0 +1,488 @@
1
+ /**
2
+ * Showcase · table-view-tabs — 保存ビュー (V7)
3
+ *
4
+ * Saved-view ribbon over a 勤怠 (attendance) DataTable. Each saved view is a tab
5
+ * with a colored signal dot + a count pill. Switching the active view swaps
6
+ * the DataTable PRESET: it re-filters the rows AND changes which columns are
7
+ * shown (e.g. the 「要承認」 view surfaces an 申請者/申請時刻 column the default
8
+ * 「全件」 view hides, while 「遅刻・早退」 surfaces a 差異(分) column).
9
+ *
10
+ * Composition map (intent → real @godxjp/ui primitive):
11
+ * page chrome ............ PageContainer (title + subtitle + extra actions)
12
+ * saved-view ribbon ...... Tabs (controlled) + TabsList + TabsTrigger
13
+ * each trigger = colored dot (Badge tone, dot) + label + count pill
14
+ * the grid ............... DataTable (per-view columns + filtered data)
15
+ * status cells ........... Badge tone (fixed signaling) / Badge status
16
+ * bulk + density ......... DataTable.Toolbar / BulkActions / DensityToggle
17
+ * pager .................. DataTable.Pagination
18
+ *
19
+ * DNA: compact density, tabular-nums on time/number columns, fixed color
20
+ * signaling (success 若竹 / warning 山吹 / attention→destructive / info 群青),
21
+ * small headings, quiet JP copy, no emoji.
22
+ */
23
+ import * as React from "react";
24
+ import { Download, RefreshCw, Check, X } from "lucide-react";
25
+
26
+ import { Button, Text } from "@godxjp/ui/general";
27
+ import { Badge, Card, CardContent, DataTable, type ColumnDef } from "@godxjp/ui/data-display";
28
+ import { Tabs, TabsList, TabsTrigger } from "@godxjp/ui/navigation";
29
+ import { Flex, PageContainer } from "@godxjp/ui/layout";
30
+ import type { SortStateProp } from "@godxjp/ui/props";
31
+
32
+ // ── Domain model ──────────────────────────────────────────────────────────────
33
+
34
+ type AttendanceStatus = "approved" | "pending" | "late" | "early" | "absent";
35
+
36
+ type Attendance = {
37
+ id: string;
38
+ date: string; // MM/DD (火)
39
+ employee: string;
40
+ dept: string;
41
+ clockIn: string; // HH:mm or "—"
42
+ clockOut: string; // HH:mm or "—"
43
+ workMin: number; // 実働(分)
44
+ status: AttendanceStatus;
45
+ applicant: string; // 申請者 (承認待ちのみ)
46
+ appliedAt: string; // 申請時刻
47
+ varianceMin: number; // 遅刻/早退の差異(分) — 遅刻=+, 早退=-
48
+ };
49
+
50
+ // 状態 → Badge tone (fixed-mapping, never remap).
51
+ const STATUS_LABEL: Record<AttendanceStatus, string> = {
52
+ approved: "承認済",
53
+ pending: "承認待ち",
54
+ late: "遅刻",
55
+ early: "早退",
56
+ absent: "欠勤",
57
+ };
58
+
59
+ const STATUS_TONE: Record<AttendanceStatus, "success" | "warning" | "destructive" | "info"> = {
60
+ approved: "success", // 若竹
61
+ pending: "warning", // 山吹
62
+ late: "destructive", // 朱(注意) — 非破壊だが要対応
63
+ early: "info", // 群青
64
+ absent: "destructive", // 茜
65
+ };
66
+
67
+ // ── Mock 勤怠 data (Saitama 倉庫部 / 配送部 / 事務部) ─────────────────────────────
68
+
69
+ const RECORDS: Attendance[] = [
70
+ {
71
+ id: "ATT-0512",
72
+ date: "06/03 (火)",
73
+ employee: "佐藤 真琴",
74
+ dept: "倉庫部",
75
+ clockIn: "08:58",
76
+ clockOut: "18:02",
77
+ workMin: 484,
78
+ status: "approved",
79
+ applicant: "—",
80
+ appliedAt: "—",
81
+ varianceMin: 0,
82
+ },
83
+ {
84
+ id: "ATT-0511",
85
+ date: "06/03 (火)",
86
+ employee: "鈴木 大輔",
87
+ dept: "配送部",
88
+ clockIn: "09:14",
89
+ clockOut: "18:05",
90
+ workMin: 471,
91
+ status: "late",
92
+ applicant: "—",
93
+ appliedAt: "—",
94
+ varianceMin: 14,
95
+ },
96
+ {
97
+ id: "ATT-0510",
98
+ date: "06/03 (火)",
99
+ employee: "高橋 恵",
100
+ dept: "事務部",
101
+ clockIn: "09:00",
102
+ clockOut: "16:40",
103
+ workMin: 400,
104
+ status: "early",
105
+ applicant: "—",
106
+ appliedAt: "—",
107
+ varianceMin: -80,
108
+ },
109
+ {
110
+ id: "ATT-0509",
111
+ date: "06/03 (火)",
112
+ employee: "田中 涼介",
113
+ dept: "倉庫部",
114
+ clockIn: "08:55",
115
+ clockOut: "—",
116
+ workMin: 0,
117
+ status: "pending",
118
+ applicant: "田中 涼介",
119
+ appliedAt: "06/03 18:21",
120
+ varianceMin: 0,
121
+ },
122
+ {
123
+ id: "ATT-0508",
124
+ date: "06/03 (火)",
125
+ employee: "伊藤 美咲",
126
+ dept: "配送部",
127
+ clockIn: "—",
128
+ clockOut: "—",
129
+ workMin: 0,
130
+ status: "absent",
131
+ applicant: "—",
132
+ appliedAt: "—",
133
+ varianceMin: 0,
134
+ },
135
+ {
136
+ id: "ATT-0507",
137
+ date: "06/02 (月)",
138
+ employee: "渡辺 健",
139
+ dept: "事務部",
140
+ clockIn: "09:02",
141
+ clockOut: "18:00",
142
+ workMin: 478,
143
+ status: "pending",
144
+ applicant: "渡辺 健",
145
+ appliedAt: "06/02 18:33",
146
+ varianceMin: 0,
147
+ },
148
+ {
149
+ id: "ATT-0506",
150
+ date: "06/02 (月)",
151
+ employee: "山本 千尋",
152
+ dept: "倉庫部",
153
+ clockIn: "09:21",
154
+ clockOut: "18:10",
155
+ workMin: 469,
156
+ status: "late",
157
+ applicant: "—",
158
+ appliedAt: "—",
159
+ varianceMin: 21,
160
+ },
161
+ {
162
+ id: "ATT-0505",
163
+ date: "06/02 (月)",
164
+ employee: "中村 蓮",
165
+ dept: "配送部",
166
+ clockIn: "08:50",
167
+ clockOut: "17:20",
168
+ workMin: 450,
169
+ status: "early",
170
+ applicant: "—",
171
+ appliedAt: "—",
172
+ varianceMin: -40,
173
+ },
174
+ {
175
+ id: "ATT-0504",
176
+ date: "06/02 (月)",
177
+ employee: "小林 葵",
178
+ dept: "事務部",
179
+ clockIn: "08:57",
180
+ clockOut: "18:01",
181
+ workMin: 484,
182
+ status: "approved",
183
+ applicant: "—",
184
+ appliedAt: "—",
185
+ varianceMin: 0,
186
+ },
187
+ {
188
+ id: "ATT-0503",
189
+ date: "06/02 (月)",
190
+ employee: "加藤 直樹",
191
+ dept: "倉庫部",
192
+ clockIn: "09:05",
193
+ clockOut: "—",
194
+ workMin: 0,
195
+ status: "pending",
196
+ applicant: "加藤 直樹",
197
+ appliedAt: "06/02 19:02",
198
+ varianceMin: 0,
199
+ },
200
+ ];
201
+
202
+ // 実働(分) → 8:04 形式
203
+ const hm = (min: number) => {
204
+ if (min <= 0) return "—";
205
+ const h = Math.floor(min / 60);
206
+ const m = min % 60;
207
+ return `${h}:${String(m).padStart(2, "0")}`;
208
+ };
209
+
210
+ // ── Reusable column fragments ───────────────────────────────────────────────────
211
+
212
+ const statusCell: ColumnDef<Attendance> = {
213
+ key: "status",
214
+ header: "状態",
215
+ align: "center",
216
+ render: (row) => (
217
+ <Badge tone={STATUS_TONE[row.status]} variant="outline">
218
+ {STATUS_LABEL[row.status]}
219
+ </Badge>
220
+ ),
221
+ };
222
+
223
+ const employeeCol: ColumnDef<Attendance> = {
224
+ key: "employee",
225
+ header: "従業員",
226
+ sortable: true,
227
+ render: (row) => (
228
+ <Flex direction="col" gap="xs">
229
+ <Text size="sm" weight="medium">
230
+ {row.employee}
231
+ </Text>
232
+ <Text size="2xs" tone="muted">
233
+ {row.dept}
234
+ </Text>
235
+ </Flex>
236
+ ),
237
+ };
238
+
239
+ const dateCol: ColumnDef<Attendance> = {
240
+ key: "date",
241
+ header: "日付",
242
+ width: "w-28",
243
+ sortable: true,
244
+ render: (row) => <Text tabular>{row.date}</Text>,
245
+ };
246
+
247
+ const idCol: ColumnDef<Attendance> = {
248
+ key: "id",
249
+ header: "勤怠ID",
250
+ width: "w-28",
251
+ hiddenOnMobile: true,
252
+ render: (row) => (
253
+ <Text size="xs" mono tabular>
254
+ {row.id}
255
+ </Text>
256
+ ),
257
+ };
258
+
259
+ const clockCols: ColumnDef<Attendance>[] = [
260
+ {
261
+ key: "clockIn",
262
+ header: "出勤",
263
+ align: "right",
264
+ render: (row) => <Text tabular>{row.clockIn}</Text>,
265
+ },
266
+ {
267
+ key: "clockOut",
268
+ header: "退勤",
269
+ align: "right",
270
+ render: (row) => <Text tabular>{row.clockOut}</Text>,
271
+ },
272
+ {
273
+ key: "workMin",
274
+ header: "実働",
275
+ align: "right",
276
+ hiddenOnMobile: true,
277
+ render: (row) => <Text tabular>{hm(row.workMin)}</Text>,
278
+ },
279
+ ];
280
+
281
+ const varianceCol: ColumnDef<Attendance> = {
282
+ key: "varianceMin",
283
+ header: "差異(分)",
284
+ align: "right",
285
+ sortable: true,
286
+ render: (row) => (
287
+ <Text
288
+ tone={row.varianceMin > 0 ? "destructive" : row.varianceMin < 0 ? "info" : "muted"}
289
+ tabular
290
+ >
291
+ {row.varianceMin > 0 ? `+${row.varianceMin}` : row.varianceMin || "—"}
292
+ </Text>
293
+ ),
294
+ };
295
+
296
+ const applicantCols: ColumnDef<Attendance>[] = [
297
+ { key: "applicant", header: "申請者", render: (row) => row.applicant },
298
+ {
299
+ key: "appliedAt",
300
+ header: "申請時刻",
301
+ align: "right",
302
+ hiddenOnMobile: true,
303
+ render: (row) => <Text tabular>{row.appliedAt}</Text>,
304
+ },
305
+ ];
306
+
307
+ // ── Saved-view presets (the core of this showcase) ─────────────────────────────
308
+ // Each view = { filter, columns }. Switching the tab swaps BOTH.
309
+
310
+ type ViewId = "all" | "pending" | "late" | "absent" | "approved";
311
+
312
+ type SavedView = {
313
+ id: ViewId;
314
+ label: string;
315
+ /** signal dot tone — colored Badge dot in the ribbon */
316
+ dot: "success" | "warning" | "destructive" | "info" | "neutral";
317
+ filter: (r: Attendance) => boolean;
318
+ columns: ColumnDef<Attendance>[];
319
+ };
320
+
321
+ const VIEWS: SavedView[] = [
322
+ {
323
+ id: "all",
324
+ label: "全件",
325
+ dot: "neutral",
326
+ filter: () => true,
327
+ columns: [dateCol, employeeCol, ...clockCols, statusCell, idCol],
328
+ },
329
+ {
330
+ id: "pending",
331
+ label: "要承認",
332
+ dot: "warning",
333
+ filter: (r) => r.status === "pending",
334
+ // surfaces 申請者 / 申請時刻 — hides 実働/退勤 noise
335
+ columns: [dateCol, employeeCol, ...applicantCols, statusCell],
336
+ },
337
+ {
338
+ id: "late",
339
+ label: "遅刻・早退",
340
+ dot: "destructive",
341
+ filter: (r) => r.status === "late" || r.status === "early",
342
+ // surfaces 差異(分)
343
+ columns: [dateCol, employeeCol, clockCols[0], clockCols[1], varianceCol, statusCell],
344
+ },
345
+ {
346
+ id: "absent",
347
+ label: "欠勤",
348
+ dot: "info",
349
+ filter: (r) => r.status === "absent",
350
+ columns: [dateCol, employeeCol, statusCell, idCol],
351
+ },
352
+ {
353
+ id: "approved",
354
+ label: "承認済",
355
+ dot: "success",
356
+ filter: (r) => r.status === "approved",
357
+ columns: [dateCol, employeeCol, ...clockCols, statusCell],
358
+ },
359
+ ];
360
+
361
+ // dot tone → token class (fixed signaling; no hex)
362
+ const DOT_CLASS: Record<SavedView["dot"], string> = {
363
+ success: "bg-success",
364
+ warning: "bg-warning",
365
+ destructive: "bg-destructive",
366
+ info: "bg-info",
367
+ neutral: "bg-muted-foreground",
368
+ };
369
+
370
+ function ViewTrigger({ view, count }: { view: SavedView; count: number }) {
371
+ return (
372
+ <span className="flex items-center gap-2">
373
+ <span aria-hidden="true" className={`size-2 rounded-full ${DOT_CLASS[view.dot]}`} />
374
+ <span>{view.label}</span>
375
+ <Text
376
+ as="span"
377
+ size="2xs"
378
+ weight="medium"
379
+ tone="muted"
380
+ tabular
381
+ className="bg-muted inline-flex min-w-5 items-center justify-center rounded-full px-1.5"
382
+ >
383
+ {count}
384
+ </Text>
385
+ </span>
386
+ );
387
+ }
388
+
389
+ export default function Demo() {
390
+ const [view, setView] = React.useState<ViewId>("pending");
391
+ const [selected, setSelected] = React.useState<Set<string>>(new Set(["ATT-0509"]));
392
+ const [sort, setSort] = React.useState<SortStateProp | undefined>({
393
+ key: "date",
394
+ direction: "desc",
395
+ });
396
+
397
+ const active = VIEWS.find((v) => v.id === view) ?? VIEWS[0];
398
+
399
+ // Per-view counts for the ribbon pills.
400
+ const counts = React.useMemo(() => {
401
+ const map = {} as Record<ViewId, number>;
402
+ for (const v of VIEWS) map[v.id] = RECORDS.filter(v.filter).length;
403
+ return map;
404
+ }, []);
405
+
406
+ // Apply the active view's filter, then the (shared) sort.
407
+ const rows = React.useMemo(() => {
408
+ const filtered = RECORDS.filter(active.filter);
409
+ if (!sort) return filtered;
410
+ const dir = sort.direction === "asc" ? 1 : -1;
411
+ return [...filtered].sort((a, b) => {
412
+ const av = a[sort.key as keyof Attendance] as string | number;
413
+ const bv = b[sort.key as keyof Attendance] as string | number;
414
+ return (av < bv ? -1 : av > bv ? 1 : 0) * dir;
415
+ });
416
+ }, [active, sort]);
417
+
418
+ return (
419
+ <PageContainer
420
+ title="勤怠一覧"
421
+ subtitle="埼玉センター · 倉庫部 / 配送部 / 事務部 · 2026年6月"
422
+ density="compact"
423
+ extra={
424
+ <Flex direction="row" gap="sm">
425
+ <Button variant="outline" size="sm">
426
+ <RefreshCw aria-hidden="true" />
427
+ 更新
428
+ </Button>
429
+ <Button variant="outline" size="sm">
430
+ <Download aria-hidden="true" />
431
+ CSV出力
432
+ </Button>
433
+ </Flex>
434
+ }
435
+ >
436
+ <Flex direction="col" gap="md">
437
+ {/* Saved-view ribbon — controlled Tabs; switching swaps the preset below. */}
438
+ <Tabs value={view} onValueChange={(v) => setView(v as ViewId)}>
439
+ <TabsList variant="line" className="h-auto flex-wrap gap-1 border-b">
440
+ {VIEWS.map((v) => (
441
+ <TabsTrigger
442
+ key={v.id}
443
+ value={v.id}
444
+ className="data-[state=active]:border-primary rounded-none border-b-2 border-transparent bg-transparent px-3 py-2 shadow-none data-[state=active]:bg-transparent data-[state=active]:shadow-none"
445
+ >
446
+ <ViewTrigger view={v} count={counts[v.id]} />
447
+ </TabsTrigger>
448
+ ))}
449
+ </TabsList>
450
+ </Tabs>
451
+
452
+ {/* The grid — columns + data both come from the active saved view. */}
453
+ <Card>
454
+ <CardContent flush>
455
+ <DataTable
456
+ data={rows}
457
+ columns={active.columns}
458
+ getRowId={(row) => row.id}
459
+ selectable
460
+ selected={selected}
461
+ onSelectChange={setSelected}
462
+ onRowClick={() => {}}
463
+ sort={sort}
464
+ onSortChange={setSort}
465
+ empty={<Text tone="muted">このビューに該当する勤怠はありません</Text>}
466
+ >
467
+ <DataTable.Toolbar>
468
+ <DataTable.BulkActions>
469
+ <Button size="sm" variant="outline">
470
+ <X aria-hidden="true" />
471
+ 差戻し
472
+ </Button>
473
+ <Button size="sm">
474
+ <Check aria-hidden="true" />
475
+ 一括承認
476
+ </Button>
477
+ </DataTable.BulkActions>
478
+ <DataTable.DensityToggle />
479
+ </DataTable.Toolbar>
480
+ <DataTable.Content />
481
+ <DataTable.Pagination cursor="ATT-0503" hasMore onChange={() => {}} />
482
+ </DataTable>
483
+ </CardContent>
484
+ </Card>
485
+ </Flex>
486
+ </PageContainer>
487
+ );
488
+ }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@godxjp/ui",
3
- "version": "19.1.0",
4
- "godxUiMcp": "19.1.0",
3
+ "version": "19.3.1",
4
+ "godxUiMcp": "19.3.1",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
7
7
  "type": "git",
@@ -32,7 +32,8 @@
32
32
  "scripts/init-agent-kit.mjs",
33
33
  "scripts/postinstall.mjs",
34
34
  "scripts/_agent-setup.mjs",
35
- "scripts/cli.mjs"
35
+ "scripts/cli.mjs",
36
+ "docs"
36
37
  ],
37
38
  "main": "./dist/index.js",
38
39
  "types": "./dist/index.d.ts",
@@ -332,15 +333,13 @@
332
333
  "check:frame-contracts": "pnpm check:component-api-manifest && pnpm audit:component-cases && pnpm check:frame-coverage && pnpm check:frame-coverage-ledger && pnpm check:screen-reader-evidence && pnpm check:data-entry-owner-source && pnpm check:display-runtime-evidence",
333
334
  "check:final-touch-rtl": "node scripts/check-final-touch-rtl.mjs",
334
335
  "check:frame-runtime": "pnpm check:data-entry-frame-runtime && pnpm check:data-entry-touch-aria && pnpm check:layout-nav-frames && pnpm check:provider-feedback-query-runtime && pnpm check:layout-nav-closure && pnpm check:final-touch-rtl && pnpm check:data-table-pagination-wrap && pnpm check:button-icon-xs",
335
- "pretest": "pnpm check:frame-coverage",
336
- "verify": "pnpm typecheck && pnpm lint && pnpm format && pnpm build && pnpm preview:build && pnpm check:example-imports && pnpm check:core-isolation && pnpm check:no-consumer-coupling && pnpm check:prop-vocabulary && pnpm check:token-tiers && pnpm check:no-external-assets && pnpm check:token-scale-bypass && pnpm check:dist-tokens-resolve && pnpm check:no-hardcoded-geometry && pnpm check:no-hardcoded-css-values && pnpm check:no-inline-magic-numbers && pnpm check:no-tailwind-class-assertions && pnpm check:control-sizing && pnpm check:rtl && pnpm check:typography && pnpm check:mcp-token-sync && pnpm check:email-token-sync && pnpm check:mcp-lockstep && pnpm check:mcp-sync && pnpm check:doc-prop-existence && pnpm check:mcp-catalog-coverage && pnpm check:mcp-orphans && pnpm check:mcp-pattern-imports && pnpm check:audit-sync && pnpm check:frame-coverage && pnpm test",
337
- "verify:static": "pnpm build && pnpm check:packed-public-contract && pnpm typecheck && pnpm typecheck:docs && pnpm lint && pnpm preview:build && pnpm check:example-imports && pnpm check:core-isolation && pnpm check:no-consumer-coupling && pnpm check:use-client && pnpm check:prop-vocabulary && pnpm check:token-tiers && pnpm check:token-scale-bypass && pnpm check:dist-tokens-resolve && pnpm check:no-hardcoded-geometry && pnpm check:no-hardcoded-css-values && pnpm check:no-inline-magic-numbers && pnpm check:no-tailwind-class-assertions && pnpm check:control-sizing && pnpm check:rtl && pnpm check:typography && pnpm check:mcp-token-sync && pnpm check:email-token-sync && pnpm check:mcp-lockstep && pnpm check:mcp-sync && pnpm check:doc-prop-existence && pnpm check:mcp-catalog-coverage && pnpm check:mcp-orphans && pnpm check:mcp-pattern-imports && pnpm check:audit-sync && pnpm check:mcp-prop-sync && pnpm check:contrast && pnpm check:visual-audit && pnpm test",
338
- "verify:ci": "pnpm build && pnpm check:packed-public-contract && pnpm typecheck && pnpm typecheck:docs && pnpm lint && pnpm preview:build && pnpm check:example-imports && pnpm check:core-isolation && pnpm check:no-consumer-coupling && pnpm check:use-client && pnpm check:prop-vocabulary && pnpm check:token-tiers && pnpm check:token-scale-bypass && pnpm check:dist-tokens-resolve && pnpm check:no-hardcoded-geometry && pnpm check:no-hardcoded-css-values && pnpm check:no-inline-magic-numbers && pnpm check:no-tailwind-class-assertions && pnpm check:control-sizing && pnpm check:rtl && pnpm check:typography && pnpm check:mcp-token-sync && pnpm check:email-token-sync && pnpm check:mcp-lockstep && pnpm check:mcp-sync && pnpm check:doc-prop-existence && pnpm check:mcp-catalog-coverage && pnpm check:mcp-orphans && pnpm check:mcp-pattern-imports && pnpm check:audit-sync && pnpm check:mcp-prop-sync && pnpm test",
339
- "verify:ci:static": "pnpm build && pnpm check:packed-public-contract && pnpm typecheck && pnpm typecheck:docs && pnpm lint && pnpm preview:build && pnpm check:example-imports && pnpm check:core-isolation && pnpm check:no-consumer-coupling && pnpm check:use-client && pnpm check:prop-vocabulary && pnpm check:token-tiers && pnpm check:no-external-assets && pnpm check:token-scale-bypass && pnpm check:dist-tokens-resolve && pnpm check:no-hardcoded-geometry && pnpm check:no-hardcoded-css-values && pnpm check:no-inline-magic-numbers && pnpm check:no-tailwind-class-assertions && pnpm check:control-sizing && pnpm check:rtl && pnpm check:typography && pnpm check:mcp-token-sync && pnpm check:email-token-sync && pnpm check:mcp-lockstep && pnpm check:mcp-sync && pnpm check:doc-prop-existence && pnpm check:mcp-catalog-coverage && pnpm check:mcp-orphans && pnpm check:mcp-pattern-imports && pnpm check:audit-sync && pnpm check:mcp-prop-sync",
336
+ "verify": "pnpm typecheck && pnpm lint && pnpm format && pnpm build && pnpm preview:build && pnpm check:example-imports && pnpm check:core-isolation && pnpm check:no-consumer-coupling && pnpm check:prop-vocabulary && pnpm check:token-tiers && pnpm check:no-external-assets && pnpm check:token-scale-bypass && pnpm check:dist-tokens-resolve && pnpm check:no-hardcoded-geometry && pnpm check:no-hardcoded-css-values && pnpm check:no-inline-magic-numbers && pnpm check:no-tailwind-class-assertions && pnpm check:control-sizing && pnpm check:rtl && pnpm check:typography && pnpm check:mcp-sync && pnpm check:doc-prop-existence && pnpm check:mcp-catalog-coverage && pnpm check:mcp-orphans && pnpm check:mcp-pattern-imports && pnpm check:audit-sync && pnpm check:frame-coverage && pnpm test",
337
+ "verify:static": "pnpm build && pnpm check:packed-public-contract && pnpm typecheck && pnpm typecheck:docs && pnpm lint && pnpm preview:build && pnpm check:example-imports && pnpm check:core-isolation && pnpm check:no-consumer-coupling && pnpm check:use-client && pnpm check:prop-vocabulary && pnpm check:token-tiers && pnpm check:token-scale-bypass && pnpm check:dist-tokens-resolve && pnpm check:no-hardcoded-geometry && pnpm check:no-hardcoded-css-values && pnpm check:no-inline-magic-numbers && pnpm check:no-tailwind-class-assertions && pnpm check:control-sizing && pnpm check:rtl && pnpm check:typography && pnpm check:mcp-sync && pnpm check:doc-prop-existence && pnpm check:mcp-catalog-coverage && pnpm check:mcp-orphans && pnpm check:mcp-pattern-imports && pnpm check:audit-sync && pnpm check:mcp-prop-sync && pnpm check:contrast && pnpm check:visual-audit && pnpm test",
338
+ "verify:ci": "pnpm build && pnpm check:packed-public-contract && pnpm typecheck && pnpm typecheck:docs && pnpm lint && pnpm preview:build && pnpm check:example-imports && pnpm check:core-isolation && pnpm check:no-consumer-coupling && pnpm check:use-client && pnpm check:prop-vocabulary && pnpm check:token-tiers && pnpm check:token-scale-bypass && pnpm check:dist-tokens-resolve && pnpm check:no-hardcoded-geometry && pnpm check:no-hardcoded-css-values && pnpm check:no-inline-magic-numbers && pnpm check:no-tailwind-class-assertions && pnpm check:control-sizing && pnpm check:rtl && pnpm check:typography && pnpm check:mcp-sync && pnpm check:doc-prop-existence && pnpm check:mcp-catalog-coverage && pnpm check:mcp-orphans && pnpm check:mcp-pattern-imports && pnpm check:audit-sync && pnpm check:mcp-prop-sync && pnpm test",
339
+ "verify:ci:static": "pnpm build && pnpm check:packed-public-contract && pnpm typecheck && pnpm typecheck:docs && pnpm lint && pnpm preview:build && pnpm check:example-imports && pnpm check:core-isolation && pnpm check:no-consumer-coupling && pnpm check:use-client && pnpm check:prop-vocabulary && pnpm check:token-tiers && pnpm check:no-external-assets && pnpm check:token-scale-bypass && pnpm check:dist-tokens-resolve && pnpm check:no-hardcoded-geometry && pnpm check:no-hardcoded-css-values && pnpm check:no-inline-magic-numbers && pnpm check:no-tailwind-class-assertions && pnpm check:control-sizing && pnpm check:rtl && pnpm check:typography && pnpm check:mcp-sync && pnpm check:doc-prop-existence && pnpm check:mcp-catalog-coverage && pnpm check:mcp-orphans && pnpm check:mcp-pattern-imports && pnpm check:audit-sync && pnpm check:mcp-prop-sync",
340
340
  "verify:browser": "pnpm check:contrast && pnpm check:visual-audit",
341
341
  "verify:release": "pnpm verify:static && pnpm check:frame-contracts && pnpm check:frame-coverage && pnpm check:frame-axe",
342
- "verify:publish-tree": "pnpm build && pnpm check:packed-public-contract && pnpm check:use-client && pnpm check:dist-tokens-resolve && pnpm check:mcp-lockstep",
343
- "check:mcp-lockstep": "node scripts/check-release-lockstep.mjs",
342
+ "verify:publish-tree": "pnpm build && pnpm check:packed-public-contract && pnpm check:use-client && pnpm check:dist-tokens-resolve",
344
343
  "check:release-plan": "node scripts/check-release-command-plan.mjs",
345
344
  "check:packed-public-contract": "node scripts/check-packed-public-contract.mjs",
346
345
  "check:mcp-pattern-imports": "node scripts/check-mcp-pattern-imports.mjs",
@@ -365,9 +364,7 @@
365
364
  "check:rtl": "node scripts/check-rtl.mjs",
366
365
  "check:typography": "node scripts/check-typography.mjs",
367
366
  "gen:component-tokens": "node scripts/gen-component-tokens.mjs",
368
- "check:mcp-token-sync": "node scripts/gen-component-tokens.mjs --check",
369
367
  "gen:email-tokens": "node scripts/gen-email-tokens.mjs",
370
- "check:email-token-sync": "node scripts/gen-email-tokens.mjs --check",
371
368
  "check:core-isolation": "node scripts/check-core-isolation.mjs",
372
369
  "check:no-consumer-coupling": "node scripts/check-no-consumer-coupling.mjs",
373
370
  "release": "node scripts/release.mjs",
@@ -21,6 +21,13 @@ export const WORKFLOW_MD = `# @godxjp/ui — mandatory workflow (read every sess
21
21
  You are building UI in an app that uses @godxjp/ui. Follow this EVERY time you create
22
22
  or change a component, page, or form — no exceptions.
23
23
 
24
+ ## The rules the audit enforces (docs/CONSUMER-RULES.md in node_modules/@godxjp/ui)
25
+ - Styles: \`@import "@godxjp/ui/styles"\` or \`@godxjp/ui/styles/core\` (no fonts). Never cherry-pick layers.
26
+ - Layout: sections of a page are spaced by \`PageContainer\`; siblings go in \`<Flex direction="col" gap>\` /
27
+ \`<ResponsiveGrid>\`. No \`flex\` / \`grid\` / \`gap-*\` / \`p-*\` / \`m-*\` on your own elements.
28
+ - Surfaces: \`Card\` / \`Badge\` / \`Avatar\` / \`ListRow\` / \`Descriptions\` / \`EmptyState\` — never a
29
+ \`rounded border\` div. Text is \`<Text tone size weight truncate>\`, never utility classes.
30
+
24
31
  ## Before writing UI
25
32
  1. **MCP-first.** Consult the godx-ui MCP: \`get_component <Name>\`, \`search_components\`,
26
33
  \`list_audit_rules\`, \`list_visual_checks\`. Never guess a prop; never hand-roll what a
@@ -47,6 +54,11 @@ export const CLAUDE_MD_BLOCK = `<!-- godxjp-ui:start (managed by @godxjp/ui —
47
54
 
48
55
  This app uses @godxjp/ui. EVERY time you build or change UI:
49
56
 
57
+ 0. **Ten rules** — read \`node_modules/@godxjp/ui/docs/CONSUMER-RULES.md\` once. Styles via
58
+ \`@godxjp/ui/styles\` or \`styles/core\` (never cherry-pick layers). Page sections are spaced by
59
+ \`PageContainer\`; siblings go in \`<Flex direction="col" gap>\` / \`<ResponsiveGrid>\`; no
60
+ \`flex\`/\`grid\`/\`gap-*\`/\`p-*\`/\`m-*\` on your own elements; boxes are \`Card\`/\`Badge\`/
61
+ \`ListRow\`/\`Descriptions\`, never a \`rounded border\` div; text is \`<Text tone size weight>\`.
50
62
  1. **MCP-first.** Consult the \`godx-ui\` MCP — \`get_component\`, \`search_components\`,
51
63
  \`list_audit_rules\`, \`list_visual_checks\`. Never guess a prop; never hand-roll what a
52
64
  primitive already does.
@@ -120,8 +132,10 @@ export function writeWorkflowMd(root) {
120
132
  return true;
121
133
  }
122
134
 
123
- /** Append the godxjp-ui mandate to the consumer's CLAUDE.md (created if absent). Idempotent
124
- * via the markers. Returns 'created' | 'appended' | 'present'. */
135
+ /**
136
+ * Append the godxjp-ui mandate to the consumer's CLAUDE.md (created if absent). Idempotent via the
137
+ * markers.
138
+ */
125
139
  export function ensureClaudeMd(root) {
126
140
  const path = join(root, "CLAUDE.md");
127
141
  const existing = existsSync(path) ? readFileSync(path, "utf8") : null;
@@ -1,18 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
- * Claude Code PostToolUse hook — the FORCING FUNCTION.
4
- *
5
- * Wired by `init-agent-kit.mjs` into a consumer's `.claude/settings.json` so that
6
- * after EVERY Write/Edit/MultiEdit of a .tsx/.ts file, the godxjp-ui static audit
7
- * runs on that file and its findings are fed straight back to the agent. The agent
8
- * cannot skip it — the harness runs the hook, not the agent's goodwill — so a
9
- * hand-rolled <label>+<Input>, a raw <button>, a loud palette colour, or an emoji
10
- * is surfaced the instant it is written, and the agent self-corrects.
11
- *
12
- * Contract: reads the hook JSON on stdin ({ tool_input: { file_path } }). Prints
13
- * findings to stderr and exits 2 when any are found (Claude Code feeds stderr back
14
- * to the model); exits 0 (silent) when the file is clean or irrelevant. Non-fatal —
15
- * it never blocks the edit, it just makes the agent SEE the issue.
3
+ * Claude Code PostToolUse hook — the FORCING FUNCTION. The agent cannot skip it — the harness runs
4
+ * the hook, not the agent's goodwill — so a hand-rolled <label>+<Input>, a raw <button>, a loud
5
+ * palette colour, or an emoji is surfaced the instant it is written, and the agent self-corrects.
16
6
  */
17
7
  import { execFileSync } from "node:child_process";
18
8
  import { readFileSync } from "node:fs";
@@ -1,18 +1,5 @@
1
1
  #!/usr/bin/env node
2
- /**
3
- * init-agent-kit — the FULL forcing-kit. Run once from a consumer app:
4
- * npx @godxjp/ui init-agent
5
- *
6
- * Scaffolds (idempotent, non-destructive) the harness-enforced workflow so an agent
7
- * follows the whole godxjp-ui process every time it touches UI:
8
- * 1. .mcp.json — registers the godx-ui MCP (component + audit guidance)
9
- * 2. .claude/settings.json — PostToolUse hook auto-runs the audit on every .tsx edit
10
- * and feeds findings back; SessionStart injects the mandate
11
- * 3. .claude/godxjp-ui-workflow.md — the per-session mandate the SessionStart hook reads
12
- *
13
- * Existing config is preserved (hooks are appended only if absent). It then prints the
14
- * optional pre-commit / CI snippets.
15
- */
2
+ /** init-agent-kit — the FULL forcing-kit. */
16
3
  import {
17
4
  ensureClaudeHooks,
18
5
  ensureClaudeMd,
@@ -1,15 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
- * postinstall runs when a consumer installs @godxjp/ui. Auto-registers the godx-ui
4
- * MCP server in the consumer's `.mcp.json` so the agent gets live access to the
5
- * component catalog + audit rules WITHOUT any manual step. Non-destructive (only adds
6
- * a missing server entry) and guarded so it never runs in CI or in the library's own repo.
7
- *
8
- * The heavier forcing-kit (the auto-audit PostToolUse hook + the workflow mandate) is
9
- * left to an EXPLICIT `npx @godxjp/ui init-agent`, since hooks change the dev loop and
10
- * should be opted into, not forced on install. Set GODXJP_UI_SKIP_SETUP=1 to disable.
3
+ * Auto-registers the godx-ui MCP server in the consumer's `.mcp.json` so the agent gets live
4
+ * access to the component catalog + audit rules WITHOUT any manual step. Non-destructive (only
5
+ * adds a missing server entry) and guarded so it never runs in CI or in the library's own repo.
11
6
  */
12
- import { ensureMcpJson, shouldSkip } from "./_agent-setup.mjs";
7
+ import { ensureClaudeMd, ensureMcpJson, shouldSkip, writeWorkflowMd } from "./_agent-setup.mjs";
13
8
 
14
9
  const root = process.env.INIT_CWD || process.cwd();
15
10
 
@@ -18,11 +13,16 @@ if (skip) process.exit(0); // silent: CI / opt-out / self-install / no consumer
18
13
 
19
14
  try {
20
15
  const r = ensureMcpJson(root);
21
- if (r === "present") process.exit(0); // already configured stay quiet
16
+ // The mandate is plain text the agent reads every turn (CLAUDE.md block + workflow file). It
17
+ // changes nothing in the dev loop, so it is installed by default: an agent that never saw the
18
+ // but no mandate). Only the hooks — which DO change the loop — stay behind `init-agent`.
19
+ const md = ensureClaudeMd(root);
20
+ const wf = writeWorkflowMd(root);
21
+ if (r === "present" && md === "present" && !wf) process.exit(0); // already configured — stay quiet
22
22
  console.log(
23
- `\n @godxjp/ui → registered the godx-ui MCP in .mcp.json (${r}).\n` +
23
+ `\n @godxjp/ui → MCP in .mcp.json (${r}); workflow mandate in CLAUDE.md (${md}).\n` +
24
24
  " Your agent now has live component + audit guidance. Restart it to pick up the MCP.\n" +
25
- " For the full forcing-kit (auto-audit on every edit + workflow mandate):\n" +
25
+ " For auto-audit on every edit (PostToolUse + SessionStart hooks):\n" +
26
26
  " npx @godxjp/ui init-agent\n",
27
27
  );
28
28
  } catch {