@godxjp/ui 5.0.1 → 6.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (298) hide show
  1. package/README.md +101 -142
  2. package/package.json +124 -128
  3. package/scripts/ui-audit.mjs +179 -0
  4. package/src/app/__tests__/app-provider.test.tsx +232 -0
  5. package/src/app/__tests__/date-format-labels.test.ts +36 -0
  6. package/src/app/__tests__/date-formats.test.ts +44 -0
  7. package/src/app/__tests__/timezones.test.ts +65 -0
  8. package/src/app/app-provider.tsx +227 -0
  9. package/src/app/date-format-labels.ts +21 -0
  10. package/src/app/date-formats.ts +30 -0
  11. package/src/app/index.ts +40 -0
  12. package/src/app/locales.ts +32 -0
  13. package/src/app/request-headers.ts +31 -0
  14. package/src/app/storage.ts +44 -0
  15. package/src/app/time-format-labels.ts +19 -0
  16. package/src/app/time-formats.ts +15 -0
  17. package/src/app/timezones.ts +208 -0
  18. package/src/app/types.ts +39 -0
  19. package/src/app/use-formatting.ts +47 -0
  20. package/src/components/__tests__/accessibility-primitives.test.tsx +65 -0
  21. package/src/components/__tests__/docs-parity.test.ts +41 -0
  22. package/src/components/__tests__/shadcn-release-guardrails.test.ts +71 -0
  23. package/src/components/__tests__/theme-axes-integration.test.tsx +242 -0
  24. package/src/components/admin/index.ts +76 -0
  25. package/src/components/data-display/__tests__/card-table.test.tsx +328 -0
  26. package/src/components/data-display/__tests__/data-display.test.tsx +73 -0
  27. package/src/components/data-display/__tests__/data-table.test.tsx +84 -0
  28. package/src/components/data-display/__tests__/popover.test.tsx +92 -0
  29. package/src/components/data-display/__tests__/scroll-area-collapsible.test.tsx +66 -0
  30. package/src/components/data-display/badge.tsx +27 -0
  31. package/src/components/data-display/card.tsx +194 -0
  32. package/src/components/data-display/code-badge.tsx +28 -0
  33. package/src/components/data-display/collapsible.tsx +5 -0
  34. package/src/components/data-display/data-table.tsx +476 -0
  35. package/src/components/data-display/empty-state.tsx +22 -0
  36. package/src/components/data-display/index.ts +41 -0
  37. package/src/components/data-display/key-value-grid.tsx +46 -0
  38. package/src/components/data-display/popover.tsx +62 -0
  39. package/src/components/data-display/progress-meter.tsx +20 -0
  40. package/src/components/data-display/scan-panel.tsx +16 -0
  41. package/src/components/data-display/scroll-area.tsx +42 -0
  42. package/src/components/data-display/status-badge.tsx +83 -0
  43. package/src/components/data-display/table.tsx +59 -0
  44. package/src/components/data-display/timeline.tsx +42 -0
  45. package/src/components/data-display/tree-list.tsx +42 -0
  46. package/src/components/data-entry/__fixtures__/tree-options.ts +80 -0
  47. package/src/components/data-entry/__tests__/cascader-tree-transfer.test.tsx +417 -0
  48. package/src/components/data-entry/__tests__/checkbox-group.test.tsx +40 -0
  49. package/src/components/data-entry/__tests__/checkbox.test.tsx +20 -0
  50. package/src/components/data-entry/__tests__/date-autocomplete.test.tsx +94 -0
  51. package/src/components/data-entry/__tests__/form-field.test.tsx +49 -0
  52. package/src/components/data-entry/__tests__/input-textarea.test.tsx +38 -0
  53. package/src/components/data-entry/__tests__/label-select.test.tsx +62 -0
  54. package/src/components/data-entry/__tests__/pickers.test.tsx +74 -0
  55. package/src/components/data-entry/__tests__/radio.test.tsx +46 -0
  56. package/src/components/data-entry/__tests__/search-input.test.tsx +32 -0
  57. package/src/components/data-entry/__tests__/switch-field.test.tsx +52 -0
  58. package/src/components/data-entry/__tests__/upload.test.tsx +125 -0
  59. package/src/components/data-entry/autocomplete.tsx +91 -0
  60. package/src/components/data-entry/calendar.tsx +90 -0
  61. package/src/components/data-entry/cascader.tsx +305 -0
  62. package/src/components/data-entry/checkbox-group.tsx +90 -0
  63. package/src/components/data-entry/checkbox.tsx +30 -0
  64. package/src/components/data-entry/choice-field.tsx +27 -0
  65. package/src/components/data-entry/choice-option.ts +20 -0
  66. package/src/components/data-entry/color-picker.tsx +75 -0
  67. package/src/components/data-entry/command.tsx +56 -0
  68. package/src/components/data-entry/country-select.tsx +88 -0
  69. package/src/components/data-entry/date-picker.tsx +69 -0
  70. package/src/components/data-entry/date-range-picker.tsx +75 -0
  71. package/src/components/data-entry/form-field.tsx +59 -0
  72. package/src/components/data-entry/index.ts +62 -0
  73. package/src/components/data-entry/input.tsx +26 -0
  74. package/src/components/data-entry/label.tsx +25 -0
  75. package/src/components/data-entry/radio.tsx +109 -0
  76. package/src/components/data-entry/search-input.tsx +103 -0
  77. package/src/components/data-entry/select.tsx +149 -0
  78. package/src/components/data-entry/slider.tsx +38 -0
  79. package/src/components/data-entry/switch-field.tsx +91 -0
  80. package/src/components/data-entry/switch.tsx +24 -0
  81. package/src/components/data-entry/textarea.tsx +12 -0
  82. package/src/components/data-entry/time-picker.tsx +214 -0
  83. package/src/components/data-entry/transfer.tsx +231 -0
  84. package/src/components/data-entry/tree-select-strategy.ts +6 -0
  85. package/src/components/data-entry/tree-select.tsx +279 -0
  86. package/src/components/data-entry/tree-utils.ts +221 -0
  87. package/src/components/data-entry/upload-crop-dialog.tsx +109 -0
  88. package/src/components/data-entry/upload-types.ts +86 -0
  89. package/src/components/data-entry/upload.tsx +498 -0
  90. package/src/components/data-entry/use-upload-draft.ts +93 -0
  91. package/src/components/feedback/__tests__/alert.test.tsx +127 -0
  92. package/src/components/feedback/__tests__/dialog.test.tsx +290 -0
  93. package/src/components/feedback/__tests__/sheet.test.tsx +94 -0
  94. package/src/components/feedback/__tests__/skeleton.test.tsx +25 -0
  95. package/src/components/feedback/__tests__/toast.test.tsx +52 -0
  96. package/src/components/feedback/alert.tsx +167 -0
  97. package/src/components/feedback/dialog.tsx +325 -0
  98. package/src/components/feedback/index.ts +53 -0
  99. package/src/components/feedback/sheet.tsx +130 -0
  100. package/src/components/feedback/skeleton.tsx +95 -0
  101. package/src/components/feedback/sonner.tsx +54 -0
  102. package/src/components/feedback/toaster.tsx +1 -0
  103. package/src/components/feedback/use-toast.ts +62 -0
  104. package/src/components/general/__tests__/button.test.tsx +71 -0
  105. package/src/components/general/button.tsx +61 -0
  106. package/src/components/general/index.ts +2 -0
  107. package/src/components/layout/__tests__/page-container.test.tsx +69 -0
  108. package/src/components/layout/__tests__/page-inset.test.tsx +14 -0
  109. package/src/components/layout/__tests__/stack-inline.test.tsx +39 -0
  110. package/src/components/layout/app-shell.tsx +42 -0
  111. package/src/components/layout/breadcrumb.tsx +35 -0
  112. package/src/components/layout/index.ts +31 -0
  113. package/src/components/layout/inline.tsx +13 -0
  114. package/src/components/layout/menu.tsx +34 -0
  115. package/src/components/layout/mobile-frame.tsx +57 -0
  116. package/src/components/layout/page-container.tsx +81 -0
  117. package/src/components/layout/page-inset.tsx +16 -0
  118. package/src/components/layout/responsive-grid.tsx +14 -0
  119. package/src/components/layout/shell-app.tsx +30 -0
  120. package/src/components/layout/sidebar.tsx +98 -0
  121. package/src/components/layout/split-pane.tsx +16 -0
  122. package/src/components/layout/stack.tsx +13 -0
  123. package/src/components/layout/topbar.tsx +108 -0
  124. package/src/components/navigation/__tests__/app-pickers.test.tsx +118 -0
  125. package/src/components/navigation/__tests__/dropdown-menu.test.tsx +104 -0
  126. package/src/components/navigation/__tests__/navigation.test.tsx +61 -0
  127. package/src/components/navigation/__tests__/pagination-steps-tabs.test.tsx +76 -0
  128. package/src/components/navigation/date-format-picker.tsx +55 -0
  129. package/src/components/navigation/dropdown-menu.tsx +190 -0
  130. package/src/components/navigation/filter-bar.tsx +38 -0
  131. package/src/components/navigation/index.ts +28 -0
  132. package/src/components/navigation/locale-picker.tsx +49 -0
  133. package/src/components/navigation/page-header.tsx +50 -0
  134. package/src/components/navigation/pagination-utils.ts +35 -0
  135. package/src/components/navigation/pagination.tsx +168 -0
  136. package/src/components/navigation/steps.tsx +163 -0
  137. package/src/components/navigation/tabs-items.tsx +69 -0
  138. package/src/components/navigation/tabs.tsx +67 -0
  139. package/src/components/navigation/time-format-picker.tsx +55 -0
  140. package/src/components/navigation/timezone-picker.tsx +63 -0
  141. package/src/components/query/__tests__/data-state.test.tsx +214 -0
  142. package/src/components/query/__tests__/infinite-prefetch.test.tsx +105 -0
  143. package/src/components/query/__tests__/query-helpers.test.tsx +61 -0
  144. package/src/components/query/data-state.tsx +58 -0
  145. package/src/components/query/index.ts +10 -0
  146. package/src/components/query/infinite-query-state.tsx +99 -0
  147. package/src/components/query/mutation-feedback.tsx +31 -0
  148. package/src/components/query/prefetch-link.tsx +45 -0
  149. package/src/components/query/query-refetch-button.tsx +41 -0
  150. package/src/components/ui/alert-dialog.tsx +1 -0
  151. package/src/components/ui/alert.tsx +1 -0
  152. package/src/components/ui/autocomplete.tsx +1 -0
  153. package/src/components/ui/badge.tsx +1 -0
  154. package/src/components/ui/button.tsx +1 -0
  155. package/src/components/ui/calendar.tsx +1 -0
  156. package/src/components/ui/card.tsx +1 -0
  157. package/src/components/ui/checkbox.tsx +1 -0
  158. package/src/components/ui/color-picker.tsx +1 -0
  159. package/src/components/ui/command.tsx +1 -0
  160. package/src/components/ui/date-picker.tsx +1 -0
  161. package/src/components/ui/date-range-picker.tsx +1 -0
  162. package/src/components/ui/dialog.tsx +1 -0
  163. package/src/components/ui/dropdown-menu.tsx +1 -0
  164. package/src/components/ui/index.tsx +31 -0
  165. package/src/components/ui/input.tsx +1 -0
  166. package/src/components/ui/label.tsx +1 -0
  167. package/src/components/ui/pagination.tsx +1 -0
  168. package/src/components/ui/popover.tsx +1 -0
  169. package/src/components/ui/radio.tsx +1 -0
  170. package/src/components/ui/scroll-area.tsx +1 -0
  171. package/src/components/ui/select.tsx +1 -0
  172. package/src/components/ui/sheet.tsx +1 -0
  173. package/src/components/ui/slider.tsx +1 -0
  174. package/src/components/ui/sonner.tsx +1 -0
  175. package/src/components/ui/switch.tsx +1 -0
  176. package/src/components/ui/table.tsx +1 -0
  177. package/src/components/ui/tabs-items.tsx +1 -0
  178. package/src/components/ui/tabs.tsx +1 -0
  179. package/src/components/ui/textarea.tsx +1 -0
  180. package/src/components/ui/time-picker.tsx +1 -0
  181. package/src/components/ui/upload.tsx +1 -0
  182. package/src/form/__tests__/use-zod-form.test.tsx +97 -0
  183. package/src/form/form-field-control.tsx +44 -0
  184. package/src/form/form-root.tsx +29 -0
  185. package/src/form/index.ts +7 -0
  186. package/src/form/use-zod-form.ts +29 -0
  187. package/src/i18n/__tests__/translate.test.ts +23 -0
  188. package/src/i18n/index.ts +9 -0
  189. package/src/i18n/messages/en.json +171 -0
  190. package/src/i18n/messages/ja.json +171 -0
  191. package/src/i18n/messages/vi.json +171 -0
  192. package/src/i18n/translate.ts +74 -0
  193. package/src/i18n/use-translation.ts +53 -0
  194. package/src/index.ts +3 -0
  195. package/src/lib/__tests__/control-styles.test.ts +78 -0
  196. package/src/lib/__tests__/datetime.test.ts +77 -0
  197. package/src/lib/__tests__/format-date.test.ts +97 -0
  198. package/src/lib/__tests__/format.test.ts +62 -0
  199. package/src/lib/__tests__/theme-tokens-audit.test.ts +176 -0
  200. package/src/lib/__tests__/theme-tokens-css.test.ts +118 -0
  201. package/src/lib/__tests__/token-governance.test.ts +191 -0
  202. package/src/lib/__tests__/variants.test.ts +18 -0
  203. package/src/lib/control-styles.ts +33 -0
  204. package/src/lib/datetime/detect.ts +25 -0
  205. package/src/lib/datetime/format-date.ts +100 -0
  206. package/src/lib/datetime/format.ts +140 -0
  207. package/src/lib/datetime/index.ts +25 -0
  208. package/src/lib/datetime/parse.ts +51 -0
  209. package/src/lib/datetime/sync.ts +48 -0
  210. package/src/lib/format.ts +114 -0
  211. package/src/lib/hooks.ts +54 -0
  212. package/src/lib/utils.ts +6 -0
  213. package/src/lib/variants.ts +40 -0
  214. package/src/props/components/app.prop.ts +99 -0
  215. package/src/props/components/data-display.prop.ts +73 -0
  216. package/src/props/components/data-entry.prop.ts +334 -0
  217. package/src/props/components/feedback.prop.ts +80 -0
  218. package/src/props/components/form.prop.ts +46 -0
  219. package/src/props/components/general.prop.ts +18 -0
  220. package/src/props/components/index.ts +99 -0
  221. package/src/props/components/layout.prop.ts +130 -0
  222. package/src/props/components/navigation.prop.ts +88 -0
  223. package/src/props/components/query.prop.ts +94 -0
  224. package/src/props/index.ts +17 -0
  225. package/src/props/registry.ts +603 -0
  226. package/src/props/vocabulary/content.prop.ts +35 -0
  227. package/src/props/vocabulary/data.prop.ts +46 -0
  228. package/src/props/vocabulary/index.ts +73 -0
  229. package/src/props/vocabulary/interaction.prop.ts +42 -0
  230. package/src/props/vocabulary/layout.prop.ts +25 -0
  231. package/src/props/vocabulary/navigation.prop.ts +19 -0
  232. package/src/props/vocabulary/shared.prop.ts +59 -0
  233. package/src/styles/alert-layout.css +191 -0
  234. package/src/styles/badge-layout.css +22 -0
  235. package/src/styles/card-layout.css +373 -0
  236. package/src/styles/control.css +504 -0
  237. package/src/styles/data-display-layout.css +246 -0
  238. package/src/styles/density.css +43 -0
  239. package/src/styles/dialog-layout.css +84 -0
  240. package/src/styles/index.css +105 -0
  241. package/src/styles/layout.css +479 -0
  242. package/src/styles/shell-layout.css +604 -0
  243. package/src/styles/table-layout.css +109 -0
  244. package/src/test/__tests__/render-loop-guard.test.tsx +38 -0
  245. package/src/test/jest-dom.d.ts +4 -0
  246. package/src/test/render-loop-guard.tsx +50 -0
  247. package/src/test/render.tsx +29 -0
  248. package/src/test/theme-globals.test.ts +77 -0
  249. package/src/test/theme-globals.ts +134 -0
  250. package/src/test/theme-test-utils.tsx +67 -0
  251. package/src/theme/example.service.css +37 -0
  252. package/src/tokens/base.css +13 -0
  253. package/src/tokens/foundation.css +151 -0
  254. package/src/tokens/primitives/badge.css +13 -0
  255. package/src/tokens/primitives/card.css +29 -0
  256. package/src/tokens/primitives/control.css +55 -0
  257. package/src/tokens/primitives/feedback.css +17 -0
  258. package/src/tokens/primitives/layout.css +20 -0
  259. package/src/tokens/primitives/navigation.css +13 -0
  260. package/src/tokens/primitives/table.css +10 -0
  261. package/BRAND.md +0 -296
  262. package/CHANGELOG.md +0 -650
  263. package/config/eslint.js +0 -54
  264. package/config/prettier.cjs +0 -20
  265. package/config/tsconfig.base.json +0 -22
  266. package/config/vitest.base.ts +0 -26
  267. package/dist/MiniMonth-YAmPGEpC.d.ts +0 -143
  268. package/dist/Table.types-BbsxoIYE.d.ts +0 -352
  269. package/dist/color-DO0qqUAb.d.ts +0 -38
  270. package/dist/components/composites.d.ts +0 -963
  271. package/dist/components/composites.js +0 -7340
  272. package/dist/components/composites.js.map +0 -1
  273. package/dist/components/primitives.d.ts +0 -2736
  274. package/dist/components/primitives.js +0 -7353
  275. package/dist/components/primitives.js.map +0 -1
  276. package/dist/components/shell.d.ts +0 -182
  277. package/dist/components/shell.js +0 -774
  278. package/dist/components/shell.js.map +0 -1
  279. package/dist/hooks.d.ts +0 -100
  280. package/dist/hooks.js +0 -558
  281. package/dist/hooks.js.map +0 -1
  282. package/dist/i18n.d.ts +0 -61
  283. package/dist/i18n.js +0 -860
  284. package/dist/i18n.js.map +0 -1
  285. package/dist/index.d.ts +0 -33
  286. package/dist/index.js +0 -13059
  287. package/dist/index.js.map +0 -1
  288. package/dist/padding-DY0JV5Ja.d.ts +0 -16
  289. package/dist/preferences.d.ts +0 -132
  290. package/dist/preferences.js +0 -262
  291. package/dist/preferences.js.map +0 -1
  292. package/dist/props.d.ts +0 -86
  293. package/dist/props.js +0 -16
  294. package/dist/props.js.map +0 -1
  295. package/dist/size-CQwNvOWd.d.ts +0 -19
  296. package/dist/types-LTj-2bl-.d.ts +0 -30
  297. package/dist/useTableViews-D5NIAJ7h.d.ts +0 -154
  298. package/src/tokens/tailwind.css +0 -158
package/README.md CHANGED
@@ -1,181 +1,140 @@
1
1
  # @godxjp/ui
2
2
 
3
- **Version 3.0.0** GoDX professional UI framework
3
+ The shared React UI framework for every godx surface (admin, agency portal,
4
+ handheld). Built on shadcn + Radix UI + Tailwind CSS v4.
4
5
 
5
- [![npm](https://img.shields.io/npm/v/@godxjp/ui)](https://www.npmjs.com/package/@godxjp/ui)
6
- [![License](https://img.shields.io/github/license/godx-jp/godxjp-ui)](LICENSE)
7
- [![Types included](https://img.shields.io/badge/types-included-blue)](src/)
8
-
9
- `@godxjp/ui` is the **single source of visual truth** for the GoDX platform.
10
- Every service frontend (admin-platform, forge-service, console-service, me-service,
11
- chat-service, knowledge-service, …) consumes this package. No service reimplements
12
- a button, dialog, sidebar, or design token.
13
-
14
- The framework enforces three Japanese-enterprise design principles:
15
-
16
- | Principle | Meaning | What it enforces |
17
- |---|---|---|
18
- | **渋み** (shibumi) | Restrained elegance | OKLCH primary chroma ≤ 0.18. No neon. No gradients on functional UI. |
19
- | **間** (ma) | Vertical breathing room | Body `line-height: 1.7`. Generous spacing. Density toggle for dense tables. |
20
- | **簡素** (kanso) | Simplicity | Three font weights: 400 (body), 500 (heading), 700 (emphasis). No 600 in new code. |
6
+ Location: `packages/godx-ui/` (linked into the app as a `file:` dependency at
7
+ `@godxjp/ui`).
21
8
 
22
9
  ---
23
10
 
24
- ## Quick start
11
+ ## Role & boundary — read this first
25
12
 
26
- A new service needs three lines to be fully brand-compliant:
13
+ This package is **the single source of UI truth**. It is shared, versioned
14
+ infrastructure, which means two things are non-negotiable:
27
15
 
28
- ```tsx
29
- // services/<slug>-service/frontend/src/main.tsx
30
- import "@godxjp/ui/tailwind.css" // tokens + Tailwind v4 utilities ONE import
31
- import { initI18n } from "@godxjp/ui/i18n"
32
- import { AppShell, Sidebar, Topbar } from "@godxjp/ui/components/shell"
33
-
34
- initI18n()
35
-
36
- createRoot(document.getElementById("root")!).render(
37
- <BrowserRouter>
38
- <AppShell sidebar={<Sidebar nav={MY_NAV} />} topbar={<Topbar />}>
39
- <Routes>{/* service-specific routes */}</Routes>
40
- </AppShell>
41
- </BrowserRouter>,
42
- )
43
- ```
16
+ - **Editing it requires explicit session permission** (the hard gate — see
17
+ [DEVELOPMENT.md](./docs/DEVELOPMENT.md#0-what-this-package-is--and-the-boundary-it-must-keep)).
18
+ By default the package is off-limits; consumers _compose_ its primitives, they
19
+ don't fork them.
20
+ - **It is generic and presentational only.** No app i18n (`useTranslation`), no
21
+ Inertia (`router`/`<Form>`), no Wayfinder routes, no business entities or domain
22
+ logic, no product copy, no raw colors. Those are **consumer-layer** concerns — they
23
+ must never leak into this package. The framework ships **its own theme**, so a
24
+ consumer imports the styles and needs **zero** extra theme configuration.
44
25
 
45
- That is the entire integration surface. No theming step. No per-service token file.
26
+ > Deciding whether a component belongs here vs. app-level? Use the
27
+ > **`godx-ui-component-placement`** skill.
46
28
 
47
- ---
29
+ Full contributor rules: **[docs/DEVELOPMENT.md](./docs/DEVELOPMENT.md)**.
48
30
 
49
- ## Zero-config toolchain
31
+ ---
50
32
 
51
- Per the umbrella's frontend-architecture spec (zero-config principle), services
52
- inherit the full toolchain from this package:
33
+ ## Architecture (bottom-up)
53
34
 
54
- ```js
55
- // eslint.config.js — one line
56
- export { default } from "@godxjp/ui/eslint-config"
57
35
  ```
58
-
59
- ```json
60
- // package.json
61
- "prettier": "@godxjp/ui/prettier-config"
36
+ src/tokens/ Design tokens — the single source of values
37
+ foundation.css :root + .dark: colors, fonts, type scale, spacing, radius, wa-iro
38
+ primitives/ Per-domain primitive tokens (card, table, control, badge, …)
39
+ src/styles/ CSS that styles components by [data-slot]; density.css = the one density knob
40
+ index.css Entry: fontsource → tailwindcss → @theme (token→utility map) → *-layout.css
41
+ src/components/ React components by group (data-display, data-entry, layout, feedback, …)
42
+ src/props/ Prop type system: vocabulary/ (atomic) + components/ + registry.ts
43
+ src/lib/ cn(), control-styles, variants
44
+ examples/ *.preview.tsx — Storybook-style stories
45
+ docs/primitives/ <component>/index.tsx demo + examples/ + generated .md
46
+ preview/ The preview app (vite, :6008) rendering examples + docs
62
47
  ```
63
48
 
64
- ```json
65
- // tsconfig.json
66
- { "extends": "@godxjp/ui/tsconfig" }
67
- ```
68
-
69
- ```ts
70
- // vitest.config.ts
71
- import base from "@godxjp/ui/vitest-config"
72
- import { mergeConfig } from "vitest/config"
73
- export default mergeConfig(base, { test: {} })
74
- ```
49
+ A value is defined **once** as a CSS var (`--primary`), mapped to a utility in the
50
+ `@theme` block (`--color-primary: hsl(var(--primary))`), and consumed as `bg-primary`.
51
+ Components emit `data-slot` / `data-*`; the look lives in `styles/*-layout.css`. See
52
+ [DEVELOPMENT.md §1](./docs/DEVELOPMENT.md#1-architecture--the-layers-bottom-up).
75
53
 
76
54
  ---
77
55
 
78
- ## Import surface
79
-
80
- | Import | What you get |
81
- |---|---|
82
- | `@godxjp/ui` | All primitives + hooks + i18n helpers (barrel) |
83
- | `@godxjp/ui/tailwind.css` | Tailwind v4 + design tokens + base styles |
84
- | `@godxjp/ui/tokens.css` | Raw CSS custom properties only (no Tailwind) |
85
- | `@godxjp/ui/tokens-ext.css` | Extended tokens (dark mode, tenants, sidebar vars) |
86
- | `@godxjp/ui/sonner.css` | Sonner toast animations (import after tokens) |
87
- | `@godxjp/ui/components/primitives` | All primitives see [`src/components/primitives.ts`](src/components/primitives.ts) (single barrel; 73+ surfaces re-exported from six group folders per cardinal rule 27) |
88
- | `@godxjp/ui/components/shell` | `AppShell`, `Sidebar`, `Topbar`, `TweaksPanel`, `CommandPalette`, `ProductSwitcher`, `ProjectSwitcher`, `PageContent` |
89
- | `@godxjp/ui/components/composites` | Upload family, `MediaUpload`, `AvatarUploader`, `LocaleInput`, calendar app composite |
90
- | `@godxjp/ui/i18n` | `initI18n()`, `SUPPORTED_LOCALES`, `GodxLocale` |
91
- | `@godxjp/ui/hooks` | `useTweaks()`, `Tweaks`, `Density`, `Theme` |
92
- | `@godxjp/ui/preferences` | `PreferencesProvider` locale + timezone React context |
93
- | `@godxjp/ui/eslint-config` | Shared ESLint flat config |
94
- | `@godxjp/ui/prettier-config` | Shared Prettier config |
95
- | `@godxjp/ui/tsconfig` | Strict TypeScript base |
96
- | `@godxjp/ui/vitest-config` | Vitest base with jsdom + coverage thresholds |
56
+ ## Component groups
57
+
58
+ | Group | Import | Examples |
59
+ | ------------------ | ------------------------- | ------------------------------------------------------------------------------- |
60
+ | **Layout** | `@godxjp/ui/layout` | `PageContainer`, `Stack`, `Inline`, `ResponsiveGrid` |
61
+ | **General** | `@godxjp/ui/general` | `Button` |
62
+ | **Data Entry** | `@godxjp/ui/data-entry` | `Input`, `Select`, `FormField`, `DatePicker`, `Switch` |
63
+ | **Data Display** | `@godxjp/ui/data-display` | `Table`, `DataTable`, `Card`, `Badge`, `KeyValueGrid`, `Timeline`, `EmptyState` |
64
+ | **Feedback** | `@godxjp/ui/feedback` | `Dialog`, `Sheet`, `Toast`, `Skeleton`, `Alert` |
65
+ | **Query** | `@godxjp/ui/query` | `DataState`, `InfiniteQueryState`, `PrefetchLink`, `MutationFeedback` |
66
+ | **Navigation** | `@godxjp/ui/navigation` | `Tabs`, `FilterBar`, `DropdownMenu`, `Steps`, `Pagination`, `LocalePicker` |
67
+ | **App** | `@godxjp/ui/app` | `AppProvider`, `useDateTime` |
68
+ | **Datetime** | `@godxjp/ui/datetime` | `formatDate` (mandatory for display) |
69
+ | **shadcn paths** | `@godxjp/ui/ui` | Thin re-exports for shadcn-style imports |
70
+ | **Admin (legacy)** | `@godxjp/ui/admin` | Compound admin exports |
97
71
 
98
72
  ---
99
73
 
100
- ## Primitives (v3)
101
-
102
- | Component | Radix backing | A11y | Status |
103
- |---|---|---|---|
104
- | `Badge` | — | WCAG 2.1 AA | production |
105
- | `Button` | `@radix-ui/react-slot` | focus-visible, keyboard | production |
106
- | `Card` | — | — | production |
107
- | `Input`, `Textarea` | — | aria-invalid, label wire | production |
108
- | `Label` | `@radix-ui/react-label` | for/id | production |
109
- | `Tabs`, `Tabs`, `Tabs`, `Tabs` | `@radix-ui/react-tabs` | roving tabindex | production |
110
- | `Avatar` | — | aria-label | production |
111
- | `Separator` | `@radix-ui/react-separator` | role separator | production |
112
- | `Popover`, `Popover`, `Popover` | `@radix-ui/react-popover` | focus trap | production |
113
- | `DropdownMenu` family | `@radix-ui/react-dropdown-menu` | keyboard nav | production |
114
- | `Calendar` | `react-day-picker` | ARIA grid | production |
115
- | `TimeInput` | — | aria-invalid | production |
116
- | `Dialog` family | `@radix-ui/react-dialog` | focus trap, aria-modal | production |
117
- | `Sheet` family | `@radix-ui/react-dialog` | focus trap, aria-modal | production |
118
- | `AlertDialog` family | `@radix-ui/react-alert-dialog` | focus trap | production |
119
- | `Select` family | `@radix-ui/react-select` | keyboard nav | production |
120
- | `Switch` | `@radix-ui/react-switch` | role switch | production |
121
- | `Checkbox` | `@radix-ui/react-checkbox` | role checkbox | production |
122
- | `Table` family | — | role table | production |
123
- | `Combobox` family | `cmdk` + Popover | keyboard nav | production |
124
- | `Toaster`, `toast` | `sonner` | aria-live | production |
125
- | `Skeleton` | — | aria-hidden | production |
126
- | `Breadcrumb`, `Breadcrumb`, `Breadcrumb` | — | aria-label, aria-current | production |
74
+ ## Consumer setup — theme is self-contained
127
75
 
128
- ---
76
+ The framework ships colors, fonts (M PLUS 2 via `@fontsource`), the type scale, and
77
+ the wa-iro palette. A consumer's entire styling surface is **one import + content
78
+ sources** — no `:root` overrides, no font `<link>`:
129
79
 
130
- ## i18n
80
+ ```css
81
+ /* resources/css/app.css */
82
+ @import "@godxjp/ui/styles";
83
+ @source '../js/**/*.{ts,tsx}';
84
+ @source '../views';
85
+ ```
131
86
 
132
- Mandatory locales per the umbrella frontend-architecture spec §6:
87
+ ```tsx
88
+ import { AppProvider } from "@godxjp/ui/app"; // locale, tz, date/time format
89
+ import { PageContainer } from "@godxjp/ui/layout"; // every page wraps in this
90
+ ```
133
91
 
134
- | Locale | Status |
135
- |---|---|
136
- | `ja` | production (primary) |
137
- | `en` | production |
138
- | `vi` | production |
139
- | `fil` | production (added v3.0.0) |
92
+ ### Mandatory consumer rules
140
93
 
141
- Services add extra namespaces via `i18n.addResourceBundle(locale, "my-ns", {…})`.
94
+ 1. **Every page** uses `<PageContainer title subtitle extra footer>`.
95
+ 2. **Mobile-first** — verify at 320–390px in preview / browser.
96
+ 3. **Spacing via `Stack`/`Inline` `gap` + `ResponsiveGrid`** — no Tailwind `p-*` /
97
+ `gap-*` / `space-x|y-*` for app layout (see `docs/SPACING.md`).
98
+ 4. **Semantic tokens only** — no raw colors / hex / `dark:` overrides.
99
+ 5. **Dates** display via `formatDate` from `@godxjp/ui/datetime`.
100
+ 6. **`AppProvider`** wraps the app for locale / timezone / date-time format.
101
+ 7. **Audit** — `npm run ui:audit` must report 0 errors for touched files.
102
+
103
+ Full app-developer rules: [ui-standardization.md](../../.claude/skills/frontend-design/rules/ui-standardization.md).
142
104
 
143
105
  ---
144
106
 
145
- ## MUST RULES (review-blocking)
107
+ ## Golden ratio (φ ≈ 1.618)
146
108
 
147
- See [`README.md § MUST RULES`](README.md) and [`BRAND.md`](BRAND.md) for the full list.
148
- The short version:
109
+ One token `--phi-unit` drives page/section/card spacing; micro control gaps use the
110
+ 4px grid. Density (`compact` | `default` | `comfortable`) retunes `--phi-unit` with
111
+ control + table heights together.
149
112
 
150
- 1. Import `@godxjp/ui/tailwind.css` (or `/tokens.css`) once at app entry.
151
- 2. Never redefine `--primary`, `--foreground`, `--background`, or any base token in app code.
152
- 3. Per-deployment brand-color overrides live under `[data-accent="<palette>"]` in a service `theme.css` (per cardinal rule 19 — `[data-tenant]` is removed).
153
- 4. No `@mui/material`, `chakra-ui`, `antd`, or any other component library.
154
- 5. All primitive needs → add to `@godxjp/ui` first, then consume.
155
- 6. Shell (AppShell + Sidebar + Topbar) is one component set no hand-rolled grids.
113
+ | App API | φ level |
114
+ | ------------------- | ------------------- |
115
+ | `<Stack gap="md">` | φ⁰ (default) |
116
+ | `<Stack gap="lg">` | φ¹ |
117
+ | `<Stack gap="xl">` | φ² |
118
+ | Card shell / footer | base × φ / base ÷ φ |
156
119
 
157
120
  ---
158
121
 
159
- ## Adoption tracker
160
-
161
- | Service | Status | Notes |
162
- |---|---|---|
163
- | `calendar-service/frontend` | adopted | Greenfield; compliant from first commit. |
164
- | `forge-service/frontend` | adopting (phase 1) | Reference implementation for migration pattern. |
165
- | `admin-platform/frontend` | partial | Omnify tokens overlap ~90%; full migration pending. |
166
- | `me-service/frontend` | adopting | Plan #31 R6 — active migration. |
167
- | `console-service/frontend` | adopting | Epic #1412; AppShell + tokens wired. |
168
- | `agent-service/frontend` | not started | Plan #21 G17. |
169
- | `knowledge-service/frontend` | not started | Plan #18 K-phase. |
170
- | `chat-service/frontend` | adopting | Plan #30 completion phase. |
122
+ ## Working on the framework
171
123
 
172
- ---
124
+ ```bash
125
+ pnpm preview # preview app → http://localhost:6008 (fixed port, kills stale)
126
+ pnpm preview:build # static build — the integration test for examples + docs
127
+ pnpm docs:sync-primitives # regenerate docs/primitives/**/*.md from source
128
+ pnpm typecheck && pnpm audit && pnpm test
129
+ ```
173
130
 
174
- ## Versioning
131
+ **[docs/DEVELOPMENT.md](./docs/DEVELOPMENT.md)** is the contributor guideline (the
132
+ boundary, the layers, how to add/extend a component, verification).
175
133
 
176
- `@godxjp/ui` follows [Semantic Versioning](https://semver.org/).
177
- Breaking changes require a cross-service audit + major bump.
178
- See [`CHANGELOG.md`](CHANGELOG.md) for the full history.
134
+ ## Docs index
179
135
 
180
- Source: `github.com/godx-jp/godxjp-ui` (Apache-2.0).
181
- The umbrella repo (`godx-jp/godx-admin`) pins this as a git submodule at `libs/ts/godxjp-ui/`.
136
+ - [docs/DEVELOPMENT.md](./docs/DEVELOPMENT.md) — contributor guideline (start here to edit the package)
137
+ - [docs/COMPONENTS.md](./docs/COMPONENTS.md) · [docs/TOKENS.md](./docs/TOKENS.md) · [docs/SPACING.md](./docs/SPACING.md)
138
+ - [docs/PROPS-VOCABULARY.md](./docs/PROPS-VOCABULARY.md) · [docs/PROPS-REGISTRY.md](./docs/PROPS-REGISTRY.md)
139
+ - [docs/DATETIME.md](./docs/DATETIME.md) · [docs/FORMS.md](./docs/FORMS.md) · [docs/TESTING.md](./docs/TESTING.md)
140
+ - MCP: **godxjp-ui-mcp** (`.mcp.json`)
package/package.json CHANGED
@@ -1,162 +1,158 @@
1
1
  {
2
2
  "name": "@godxjp/ui",
3
- "version": "5.0.1",
4
- "description": "GoDX professional UI framework — design tokens, primitives, shell, i18n, hooks, and toolchain config shared across every service frontend. Source of truth for the GoDX visual language.",
3
+ "version": "6.0.0",
5
4
  "type": "module",
6
- "main": "./dist/index.js",
7
- "module": "./dist/index.js",
8
- "types": "./dist/index.d.ts",
9
- "sideEffects": [
10
- "**/*.css"
11
- ],
12
- "publishConfig": {
13
- "registry": "https://registry.npmjs.org/",
14
- "access": "public"
15
- },
16
- "repository": {
17
- "type": "git",
18
- "url": "git+https://github.com/godx-jp/godxjp-ui.git"
19
- },
20
- "homepage": "https://github.com/godx-jp/godxjp-ui#readme",
21
- "license": "Apache-2.0",
5
+ "description": "@godxjp/ui — shared React UI framework (shadcn + Radix + Tailwind v4).",
22
6
  "files": [
23
- "dist",
24
- "src/tokens",
25
- "config",
26
- "BRAND.md",
27
- "CHANGELOG.md"
7
+ "src",
8
+ "scripts/ui-audit.mjs",
9
+ "README.md"
28
10
  ],
11
+ "main": "./src/index.ts",
12
+ "types": "./src/index.ts",
13
+ "exports": {
14
+ ".": "./src/index.ts",
15
+ "./styles": "./src/styles/index.css",
16
+ "./tokens": "./src/tokens/base.css",
17
+ "./admin": "./src/components/admin/index.ts",
18
+ "./layout": "./src/components/layout/index.ts",
19
+ "./general": "./src/components/general/index.ts",
20
+ "./data-entry": "./src/components/data-entry/index.ts",
21
+ "./data-display": "./src/components/data-display/index.ts",
22
+ "./feedback": "./src/components/feedback/index.ts",
23
+ "./query": "./src/components/query/index.ts",
24
+ "./ui": "./src/components/ui/index.tsx",
25
+ "./navigation": "./src/components/navigation/index.ts",
26
+ "./props": "./src/props/index.ts",
27
+ "./props/vocabulary": "./src/props/vocabulary/index.ts",
28
+ "./props/components": "./src/props/components/index.ts",
29
+ "./props/registry": "./src/props/registry.ts",
30
+ "./form": "./src/form/index.ts",
31
+ "./app": "./src/app/index.ts",
32
+ "./datetime": "./src/lib/datetime/index.ts",
33
+ "./i18n": "./src/i18n/index.ts",
34
+ "./lib/utils": "./src/lib/utils.ts",
35
+ "./ui/button": "./src/components/general/button.tsx",
36
+ "./ui/badge": "./src/components/data-display/badge.tsx",
37
+ "./ui/card": "./src/components/data-display/card.tsx",
38
+ "./ui/table": "./src/components/data-display/table.tsx",
39
+ "./ui/input": "./src/components/data-entry/input.tsx",
40
+ "./ui/label": "./src/components/data-entry/label.tsx",
41
+ "./ui/select": "./src/components/data-entry/select.tsx",
42
+ "./ui/checkbox": "./src/components/data-entry/checkbox.tsx",
43
+ "./ui/radio": "./src/components/data-entry/radio.tsx",
44
+ "./ui/switch": "./src/components/data-entry/switch.tsx",
45
+ "./ui/slider": "./src/components/data-entry/slider.tsx",
46
+ "./ui/calendar": "./src/components/data-entry/calendar.tsx",
47
+ "./ui/date-picker": "./src/components/data-entry/date-picker.tsx",
48
+ "./ui/date-range-picker": "./src/components/data-entry/date-range-picker.tsx",
49
+ "./ui/time-picker": "./src/components/data-entry/time-picker.tsx",
50
+ "./ui/color-picker": "./src/components/data-entry/color-picker.tsx",
51
+ "./ui/autocomplete": "./src/components/data-entry/autocomplete.tsx",
52
+ "./ui/upload": "./src/components/data-entry/upload.tsx",
53
+ "./ui/cascader": "./src/components/data-entry/cascader.tsx",
54
+ "./ui/tree-select": "./src/components/data-entry/tree-select.tsx",
55
+ "./ui/transfer": "./src/components/data-entry/transfer.tsx",
56
+ "./ui/command": "./src/components/data-entry/command.tsx",
57
+ "./ui/scroll-area": "./src/components/data-display/scroll-area.tsx",
58
+ "./ui/popover": "./src/components/data-display/popover.tsx",
59
+ "./ui/textarea": "./src/components/data-entry/textarea.tsx",
60
+ "./ui/dialog": "./src/components/feedback/dialog.tsx",
61
+ "./ui/alert-dialog": "./src/components/feedback/dialog.tsx",
62
+ "./ui/alert": "./src/components/feedback/alert.tsx",
63
+ "./ui/sonner": "./src/components/feedback/sonner.tsx",
64
+ "./ui/tabs": "./src/components/navigation/tabs.tsx",
65
+ "./ui/tabs-items": "./src/components/navigation/tabs-items.tsx",
66
+ "./ui/pagination": "./src/components/navigation/pagination.tsx",
67
+ "./ui/steps": "./src/components/navigation/steps.tsx",
68
+ "./ui/sheet": "./src/components/feedback/sheet.tsx",
69
+ "./ui/dropdown-menu": "./src/components/navigation/dropdown-menu.tsx"
70
+ },
29
71
  "scripts": {
30
- "build": "tsup",
31
- "dev": "tsup --watch",
32
- "storybook": "storybook dev -p 6006",
33
- "build-storybook": "storybook build -o storybook-static",
34
- "type-check": "tsc --noEmit",
72
+ "typecheck": "tsc --noEmit -p tsconfig.json",
73
+ "lint": "eslint .",
74
+ "lint:fix": "eslint . --fix",
75
+ "format": "prettier --check .",
76
+ "format:fix": "prettier --write .",
35
77
  "test": "vitest run",
36
78
  "test:watch": "vitest",
37
- "test:stories": "vitest run --project storybook",
38
- "test:unit": "vitest run --project unit",
39
- "lint:tokens": "node scripts/lint-tokens.mjs",
40
- "check:stories-parity": "node scripts/check-stories-parity.mjs",
41
- "check:docs-parity": "node scripts/check-docs-parity.mjs",
42
- "sync:skills": "bash scripts/sync-skills.sh",
43
- "sync:skills:apply": "bash scripts/sync-skills.sh --apply",
44
- "prepublishOnly": "npm run build",
45
- "prepare": "husky"
79
+ "test:coverage": "vitest run --coverage",
80
+ "verify": "pnpm typecheck && pnpm lint && pnpm format && pnpm test",
81
+ "verify:release": "pnpm typecheck && pnpm lint && pnpm preview:build && pnpm test",
82
+ "preview": "node preview/scripts/kill-port.mjs && vite --config preview/vite.config.ts --port 6008 --strictPort",
83
+ "preview:build": "vite build --config preview/vite.config.ts",
84
+ "docs:sync-primitives": "node preview/scripts/sync-primitive-docs.mjs && prettier --write \"docs/primitives/**/*.tsx\"",
85
+ "audit": "node scripts/ui-audit.mjs"
46
86
  },
47
- "exports": {
48
- ".": {
49
- "types": "./dist/index.d.ts",
50
- "import": "./dist/index.js"
51
- },
52
- "./tailwind": "./src/tokens/tailwind.css",
53
- "./tailwind.css": "./src/tokens/tailwind.css",
54
- "./styles": "./src/styles/index.css",
55
- "./styles/index.css": "./src/styles/index.css",
56
- "./styles/theme.css": "./src/styles/theme.css",
57
- "./styles/base.css": "./src/styles/base.css",
58
- "./styles/shell.css": "./src/styles/shell.css",
59
- "./styles/sonner.css": "./src/styles/sonner.css",
60
- "./tokens": "./src/styles/theme.css",
61
- "./tokens.css": "./src/styles/theme.css",
62
- "./tokens-ext.css": "./src/styles/shell.css",
63
- "./sonner.css": "./src/styles/sonner.css",
64
- "./i18n": {
65
- "types": "./dist/i18n.d.ts",
66
- "import": "./dist/i18n.js"
67
- },
68
- "./hooks": {
69
- "types": "./dist/hooks.d.ts",
70
- "import": "./dist/hooks.js"
71
- },
72
- "./props": {
73
- "types": "./dist/props.d.ts",
74
- "import": "./dist/props.js"
75
- },
76
- "./primitives": {
77
- "types": "./dist/components/primitives.d.ts",
78
- "import": "./dist/components/primitives.js"
79
- },
80
- "./components/primitives": {
81
- "types": "./dist/components/primitives.d.ts",
82
- "import": "./dist/components/primitives.js"
83
- },
84
- "./components/shell": {
85
- "types": "./dist/components/shell.d.ts",
86
- "import": "./dist/components/shell.js"
87
- },
88
- "./components/composites": {
89
- "types": "./dist/components/composites.d.ts",
90
- "import": "./dist/components/composites.js"
91
- },
92
- "./preferences": {
93
- "types": "./dist/preferences.d.ts",
94
- "import": "./dist/preferences.js"
95
- },
96
- "./eslint-config": "./config/eslint.js",
97
- "./prettier-config": "./config/prettier.cjs",
98
- "./tsconfig": "./config/tsconfig.base.json",
99
- "./vitest-config": "./config/vitest.base.ts"
87
+ "peerDependencies": {
88
+ "@hookform/resolvers": "^5.2.0",
89
+ "@tanstack/react-query": ">=5.0.0",
90
+ "react": ">=19.0.0",
91
+ "react-dom": ">=19.0.0",
92
+ "react-hook-form": "^7.76.0",
93
+ "react-router-dom": ">=7.0.0",
94
+ "tailwindcss": ">=4.0.0",
95
+ "zod": "^4.4.0"
100
96
  },
101
97
  "dependencies": {
102
- "@hookform/resolvers": "^5.2.2",
103
- "@internationalized/date": "^3.10.0",
104
98
  "@radix-ui/react-alert-dialog": "^1.1.15",
105
99
  "@radix-ui/react-checkbox": "^1.3.3",
100
+ "@radix-ui/react-context": "^1.1.2",
106
101
  "@radix-ui/react-dialog": "^1.1.15",
107
102
  "@radix-ui/react-dropdown-menu": "^2.1.16",
108
103
  "@radix-ui/react-label": "^2.1.8",
109
104
  "@radix-ui/react-popover": "^1.1.15",
110
105
  "@radix-ui/react-radio-group": "^1.3.8",
106
+ "@radix-ui/react-scroll-area": "^1.2.10",
107
+ "@radix-ui/react-collapsible": "^1.1.12",
111
108
  "@radix-ui/react-select": "^2.2.6",
112
- "@radix-ui/react-separator": "^1.1.8",
113
109
  "@radix-ui/react-slider": "^1.3.6",
114
110
  "@radix-ui/react-slot": "^1.2.4",
115
111
  "@radix-ui/react-switch": "^1.2.6",
116
112
  "@radix-ui/react-tabs": "^1.1.13",
117
- "@radix-ui/react-tooltip": "^1.2.8",
118
- "@radix-ui/react-visually-hidden": "^1.2.4",
119
- "@tanstack/react-table": "^8.21.3",
120
113
  "class-variance-authority": "^0.7.1",
121
114
  "clsx": "^2.1.1",
122
115
  "cmdk": "^1.1.1",
123
- "i18next": "^26.2.0",
124
- "i18next-browser-languagedetector": "^8.2.1",
125
- "lucide-react": "^1.16.0",
126
- "qrcode": "^1.5.4",
127
- "react-aria-components": "^1.13.0",
128
- "react-easy-crop": "^5.5.7",
129
- "react-hook-form": "^7.76.0",
130
- "react-i18next": "^17.0.8",
116
+ "@date-fns/tz": "^1.5.0",
117
+ "date-fns": "^4.1.0",
118
+ "lucide-react": "^1.14.0",
119
+ "react-day-picker": "^10.0.1",
131
120
  "sonner": "^2.0.7",
132
- "tailwind-merge": "^3.6.0",
133
- "zod": "^4.4.3"
134
- },
135
- "peerDependencies": {
136
- "react": "^18 || ^19",
137
- "react-dom": "^18 || ^19",
138
- "tailwindcss": "^4"
121
+ "tailwind-merge": "^3.5.0",
122
+ "tailwindcss-animate": "^1.0.7",
123
+ "@fontsource/m-plus-2": "^5.2.9"
139
124
  },
140
125
  "devDependencies": {
141
- "@storybook/addon-docs": "^10.4.0",
142
- "@storybook/addon-vitest": "^10.4.0",
143
- "@storybook/react": "^10.4.0",
144
- "@storybook/react-vite": "^10.4.0",
145
- "@tailwindcss/vite": "^4.3.0",
146
- "@types/qrcode": "^1.5.6",
126
+ "@eslint/js": "^9.39.4",
127
+ "@hookform/resolvers": "^5.2.2",
128
+ "@tailwindcss/vite": "^4.2.4",
129
+ "@tanstack/react-query": "^5.100.9",
130
+ "@testing-library/jest-dom": "^6.9.1",
131
+ "@testing-library/react": "^16.3.2",
132
+ "@testing-library/user-event": "^14.6.1",
147
133
  "@types/react": "^19.2.14",
148
134
  "@types/react-dom": "^19.2.3",
149
- "@vitejs/plugin-react": "^6.0.2",
150
- "@vitest/browser": "^4.1.6",
151
- "@vitest/browser-playwright": "^4.1.6",
152
- "axios": "^1.16.1",
153
- "husky": "^9.1.7",
154
- "playwright": "^1.60.0",
155
- "prettier": "^3.8.3",
156
- "storybook": "^10.4.0",
157
- "tsup": "^8.5.1",
135
+ "@vitejs/plugin-react": "^6.0.1",
136
+ "@vitest/coverage-v8": "^4.1.5",
137
+ "eslint": "^9.39.2",
138
+ "eslint-plugin-react": "^7.37.5",
139
+ "eslint-plugin-react-hooks": "^7.1.1",
140
+ "globals": "^15.15.0",
141
+ "jsdom": "^29.1.1",
142
+ "prettier": "^3.6.2",
143
+ "prettier-plugin-tailwindcss": "^0.6.14",
144
+ "react": "^19.2.6",
145
+ "react-dom": "^19.2.6",
146
+ "react-hook-form": "^7.76.0",
147
+ "react-router-dom": "^7.15.0",
148
+ "tailwindcss": "^4.2.4",
158
149
  "typescript": "^6.0.3",
159
- "vite": "^8.0.13",
160
- "vitest": "^4.1.6"
150
+ "typescript-eslint": "^8.60.0",
151
+ "vite": "^8.0.10",
152
+ "vitest": "^4.1.5",
153
+ "zod": "^4.4.3"
154
+ },
155
+ "bin": {
156
+ "godxjp-ui-audit": "scripts/ui-audit.mjs"
161
157
  }
162
158
  }