@godxjp/ui 20.0.0 → 20.1.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 (250) hide show
  1. package/README.md +8 -2
  2. package/dist/app/theme-axes.d.ts +2 -0
  3. package/dist/app/theme-axes.js +45 -0
  4. package/dist/components/charts/chart-cartesian.d.ts +2 -1
  5. package/dist/components/charts/chart-cartesian.js +52 -3
  6. package/dist/components/charts/chart-category-axis.d.ts +55 -0
  7. package/dist/components/charts/chart-category-axis.js +93 -0
  8. package/dist/components/charts/chart-frame.d.ts +10 -1
  9. package/dist/components/charts/chart-frame.js +19 -3
  10. package/dist/components/charts/compact-bar-trend.d.ts +1 -1
  11. package/dist/components/charts/compact-bar-trend.js +2 -0
  12. package/dist/components/charts/pie-chart.d.ts +1 -1
  13. package/dist/components/charts/pie-chart.js +12 -1
  14. package/dist/components/charts/recharts-peer.d.ts +49 -0
  15. package/dist/components/charts/recharts-peer.js +45 -0
  16. package/dist/components/data-display/card.d.ts +12 -1
  17. package/dist/components/data-display/card.js +22 -4
  18. package/dist/components/data-display/code-block.js +6 -2
  19. package/dist/components/data-display/data-table.d.ts +39 -4
  20. package/dist/components/data-display/data-table.js +802 -270
  21. package/dist/components/data-display/descriptions.d.ts +27 -6
  22. package/dist/components/data-display/descriptions.js +58 -17
  23. package/dist/components/data-display/index.d.ts +2 -0
  24. package/dist/components/data-display/index.js +2 -0
  25. package/dist/components/data-display/list-row.d.ts +10 -1
  26. package/dist/components/data-display/list-row.js +7 -1
  27. package/dist/components/data-display/popover.d.ts +2 -2
  28. package/dist/components/data-display/popover.js +61 -11
  29. package/dist/components/data-display/range-timeline.d.ts +38 -0
  30. package/dist/components/data-display/range-timeline.js +161 -0
  31. package/dist/components/data-display/scroll-area.js +13 -2
  32. package/dist/components/data-display/service-launcher-card.js +10 -10
  33. package/dist/components/data-display/table.d.ts +11 -3
  34. package/dist/components/data-display/table.js +48 -18
  35. package/dist/components/data-display/tree-list.js +4 -9
  36. package/dist/components/data-entry/calendar.d.ts +2 -2
  37. package/dist/components/data-entry/calendar.js +12 -1
  38. package/dist/components/data-entry/cascader.d.ts +1 -1
  39. package/dist/components/data-entry/cascader.js +188 -24
  40. package/dist/components/data-entry/color-picker.d.ts +1 -1
  41. package/dist/components/data-entry/color-picker.js +17 -5
  42. package/dist/components/data-entry/control-appearance.d.ts +64 -0
  43. package/dist/components/data-entry/control-appearance.js +39 -0
  44. package/dist/components/data-entry/control-surface.d.ts +61 -0
  45. package/dist/components/data-entry/control-surface.js +39 -0
  46. package/dist/components/data-entry/date-picker.d.ts +1 -1
  47. package/dist/components/data-entry/date-picker.js +344 -113
  48. package/dist/components/data-entry/date-range-picker.d.ts +1 -1
  49. package/dist/components/data-entry/date-range-picker.js +278 -140
  50. package/dist/components/data-entry/form-field.d.ts +1 -1
  51. package/dist/components/data-entry/form-field.js +39 -4
  52. package/dist/components/data-entry/form.d.ts +4 -0
  53. package/dist/components/data-entry/form.js +4 -2
  54. package/dist/components/data-entry/index.d.ts +7 -3
  55. package/dist/components/data-entry/index.js +10 -1
  56. package/dist/components/data-entry/input-otp.d.ts +1 -1
  57. package/dist/components/data-entry/input.d.ts +12 -34
  58. package/dist/components/data-entry/input.js +92 -24
  59. package/dist/components/data-entry/month-picker.d.ts +1 -1
  60. package/dist/components/data-entry/month-picker.js +47 -10
  61. package/dist/components/data-entry/month-range-picker.d.ts +1 -1
  62. package/dist/components/data-entry/month-range-picker.js +51 -11
  63. package/dist/components/data-entry/number-input.d.ts +7 -0
  64. package/dist/components/data-entry/number-input.js +147 -98
  65. package/dist/components/data-entry/password-input.d.ts +1 -1
  66. package/dist/components/data-entry/radio.d.ts +1 -1
  67. package/dist/components/data-entry/radio.js +61 -13
  68. package/dist/components/data-entry/search-input.d.ts +1 -1
  69. package/dist/components/data-entry/search-input.js +16 -2
  70. package/dist/components/data-entry/search-select.d.ts +2 -2
  71. package/dist/components/data-entry/search-select.js +209 -78
  72. package/dist/components/data-entry/select.d.ts +22 -4
  73. package/dist/components/data-entry/select.js +215 -163
  74. package/dist/components/data-entry/slider.d.ts +9 -1
  75. package/dist/components/data-entry/slider.js +87 -9
  76. package/dist/components/data-entry/switch.d.ts +3 -0
  77. package/dist/components/data-entry/switch.js +29 -3
  78. package/dist/components/data-entry/textarea.d.ts +14 -56
  79. package/dist/components/data-entry/textarea.js +80 -33
  80. package/dist/components/data-entry/time-picker.d.ts +2 -2
  81. package/dist/components/data-entry/time-picker.js +333 -109
  82. package/dist/components/data-entry/time-range-picker.d.ts +5 -0
  83. package/dist/components/data-entry/time-range-picker.js +89 -0
  84. package/dist/components/data-entry/transfer.d.ts +1 -1
  85. package/dist/components/data-entry/transfer.js +86 -28
  86. package/dist/components/data-entry/tree-select.d.ts +1 -1
  87. package/dist/components/data-entry/tree-select.js +201 -113
  88. package/dist/components/data-entry/tree-utils.js +7 -14
  89. package/dist/components/data-entry/upload-files.d.ts +2 -0
  90. package/dist/components/data-entry/upload-files.js +31 -0
  91. package/dist/components/data-entry/upload-request.d.ts +4 -0
  92. package/dist/components/data-entry/upload-request.js +53 -0
  93. package/dist/components/data-entry/upload-types.d.ts +28 -0
  94. package/dist/components/data-entry/upload-types.js +2 -0
  95. package/dist/components/data-entry/upload.d.ts +2 -2
  96. package/dist/components/data-entry/upload.js +475 -115
  97. package/dist/components/feedback/dialog.js +16 -19
  98. package/dist/components/general/button.d.ts +1 -1
  99. package/dist/components/general/button.js +5 -1
  100. package/dist/components/general/index.d.ts +1 -0
  101. package/dist/components/general/index.js +2 -0
  102. package/dist/components/general/typography.d.ts +3 -0
  103. package/dist/components/general/typography.js +15 -1
  104. package/dist/components/general/visually-hidden.d.ts +3 -0
  105. package/dist/components/general/visually-hidden.js +9 -0
  106. package/dist/components/layout/app-launcher.d.ts +34 -0
  107. package/dist/components/layout/app-launcher.js +228 -0
  108. package/dist/components/layout/app-shell.d.ts +2 -0
  109. package/dist/components/layout/app-shell.js +20 -7
  110. package/dist/components/layout/breadcrumb.d.ts +14 -2
  111. package/dist/components/layout/breadcrumb.js +46 -4
  112. package/dist/components/layout/flex.d.ts +1 -1
  113. package/dist/components/layout/flex.js +23 -2
  114. package/dist/components/layout/index.d.ts +3 -0
  115. package/dist/components/layout/index.js +5 -1
  116. package/dist/components/layout/org-switcher.js +20 -1
  117. package/dist/components/layout/page-container.d.ts +1 -1
  118. package/dist/components/layout/page-container.js +5 -3
  119. package/dist/components/layout/responsive-grid.d.ts +16 -2
  120. package/dist/components/layout/responsive-grid.js +29 -2
  121. package/dist/components/layout/topbar-item.d.ts +3 -0
  122. package/dist/components/layout/topbar-item.js +18 -3
  123. package/dist/components/layout/topbar.d.ts +1 -1
  124. package/dist/components/layout/topbar.js +27 -6
  125. package/dist/components/navigation/dropdown-menu.d.ts +30 -2
  126. package/dist/components/navigation/dropdown-menu.js +68 -11
  127. package/dist/components/navigation/pagination.d.ts +2 -2
  128. package/dist/components/navigation/pagination.js +155 -83
  129. package/dist/components/navigation/steps.d.ts +2 -2
  130. package/dist/components/navigation/steps.js +29 -4
  131. package/dist/components/navigation/tabs.d.ts +5 -33
  132. package/dist/components/navigation/tabs.js +232 -64
  133. package/dist/components/ui/input-otp.d.ts +26 -28
  134. package/dist/components/ui/input-otp.js +50 -7
  135. package/dist/components/ui/password-input.d.ts +36 -2
  136. package/dist/components/ui/password-input.js +27 -7
  137. package/dist/components/ui/rating.d.ts +25 -0
  138. package/dist/components/ui/rating.js +67 -27
  139. package/dist/components/ui/segmented.d.ts +9 -0
  140. package/dist/components/ui/segmented.js +17 -2
  141. package/dist/components/ui/separator.d.ts +4 -0
  142. package/dist/components/ui/separator.js +13 -0
  143. package/dist/components/ui/tag-input.d.ts +45 -0
  144. package/dist/components/ui/tag-input.js +109 -27
  145. package/dist/form/form-context.d.ts +29 -0
  146. package/dist/form/form-context.js +44 -4
  147. package/dist/form/form-field-array.d.ts +22 -0
  148. package/dist/form/form-field-array.js +50 -0
  149. package/dist/form/form-field-control.d.ts +2 -1
  150. package/dist/form/form-field-control.js +116 -40
  151. package/dist/form/form-root.d.ts +2 -1
  152. package/dist/form/form-root.js +142 -23
  153. package/dist/form/index.d.ts +3 -1
  154. package/dist/form/index.js +12 -1
  155. package/dist/i18n/messages/en.json +56 -5
  156. package/dist/i18n/messages/ja.json +56 -5
  157. package/dist/i18n/messages/vi.json +56 -5
  158. package/dist/inertia/index.d.ts +20 -0
  159. package/dist/inertia/index.js +60 -1
  160. package/dist/lib/control-styles.d.ts +25 -3
  161. package/dist/lib/control-styles.js +9 -3
  162. package/dist/lib/datetime/picker-format.d.ts +8 -0
  163. package/dist/lib/datetime/picker-format.js +54 -0
  164. package/dist/props/components/charts.prop.d.ts +21 -0
  165. package/dist/props/components/data-display.prop.d.ts +55 -4
  166. package/dist/props/components/data-entry.prop.d.ts +687 -43
  167. package/dist/props/components/form.prop.d.ts +142 -4
  168. package/dist/props/components/general.prop.d.ts +17 -1
  169. package/dist/props/components/index.d.ts +2 -2
  170. package/dist/props/components/layout.prop.d.ts +163 -6
  171. package/dist/props/components/navigation.prop.d.ts +113 -3
  172. package/dist/props/registry.d.ts +376 -10
  173. package/dist/props/registry.js +493 -9
  174. package/dist/props/vocabulary/data.prop.d.ts +179 -1
  175. package/dist/props/vocabulary/index.d.ts +4 -4
  176. package/dist/props/vocabulary/interaction.prop.d.ts +51 -2
  177. package/dist/props/vocabulary/navigation.prop.d.ts +40 -0
  178. package/dist/props/vocabulary/shared.prop.d.ts +33 -0
  179. package/dist/styles/badge-layout.css +2 -1
  180. package/dist/styles/card-layout.css +26 -4
  181. package/dist/styles/chart-layout.css +15 -0
  182. package/dist/styles/control.css +515 -14
  183. package/dist/styles/data-display-layout.css +241 -6
  184. package/dist/styles/data-entry-layout.css +13 -0
  185. package/dist/styles/layout.css +221 -4
  186. package/dist/styles/navigation-layout.css +227 -0
  187. package/dist/styles/shell-layout.css +229 -5
  188. package/dist/styles/table-layout.css +95 -6
  189. package/dist/styles/text-layout.css +5 -0
  190. package/dist/tokens/base.css +1 -0
  191. package/dist/tokens/components/badge.css +1 -0
  192. package/dist/tokens/components/chart.css +6 -0
  193. package/dist/tokens/components/control.css +79 -2
  194. package/dist/tokens/components/data-display.css +9 -0
  195. package/dist/tokens/components/descriptions.css +11 -0
  196. package/dist/tokens/components/flex.css +8 -0
  197. package/dist/tokens/components/navigation.css +55 -0
  198. package/dist/tokens/components/shell.css +50 -2
  199. package/dist/tokens/components/table.css +14 -0
  200. package/dist/tokens/semantic/layout.css +9 -0
  201. package/docs/CONSUMER-RULES.md +13 -0
  202. package/docs/DESIGN-AUTHORITY.md +43 -6
  203. package/docs/DEVELOPMENT.md +4 -3
  204. package/docs/FORMS.md +151 -6
  205. package/docs/FRAME-COVERAGE-REPORT.md +29 -16
  206. package/docs/README.md +1 -1
  207. package/docs/STANDARDS-vocabulary-tokens.md +1 -1
  208. package/docs/TESTING.md +15 -6
  209. package/docs/charts/cjk-category-axis.tsx +81 -0
  210. package/docs/data-display/card/index.tsx +22 -0
  211. package/docs/data-display/data-table/examples/antd-parity.tsx +257 -0
  212. package/docs/data-display/data-table/index.tsx +23 -0
  213. package/docs/data-display/descriptions.tsx +41 -0
  214. package/docs/data-display/scroll-area.tsx +31 -25
  215. package/docs/data-display/table.tsx +104 -45
  216. package/docs/data-display/timeline.tsx +41 -0
  217. package/docs/data-entry/date-picker.tsx +85 -0
  218. package/docs/data-entry/date-range-picker.tsx +26 -0
  219. package/docs/data-entry/form-dynamic-fields.tsx +199 -0
  220. package/docs/data-entry/form.tsx +74 -4
  221. package/docs/data-entry/input-otp.tsx +24 -0
  222. package/docs/data-entry/input.tsx +46 -1
  223. package/docs/data-entry/month-range-picker.tsx +1 -1
  224. package/docs/data-entry/select.tsx +27 -0
  225. package/docs/data-entry/switch.tsx +41 -0
  226. package/docs/data-entry/textarea.tsx +38 -0
  227. package/docs/data-entry/time-picker.tsx +85 -1
  228. package/docs/data-entry/time-range-picker.tsx +55 -0
  229. package/docs/data-entry/transfer.tsx +17 -0
  230. package/docs/data-entry/upload.tsx +56 -12
  231. package/docs/feedback/tooltip.tsx +1 -1
  232. package/docs/general/activity.tsx +2 -2
  233. package/docs/general/button/index.tsx +14 -1
  234. package/docs/general/typography.tsx +14 -1
  235. package/docs/layout/app-launcher.tsx +151 -0
  236. package/docs/layout/app-shell.tsx +11 -0
  237. package/docs/layout/flex.tsx +50 -0
  238. package/docs/layout/responsive-grid.tsx +21 -1
  239. package/docs/layout/topbar.tsx +5 -9
  240. package/docs/navigation/app-setting-picker.tsx +11 -0
  241. package/docs/navigation/breadcrumb.tsx +48 -0
  242. package/docs/navigation/dropdown-menu.tsx +21 -0
  243. package/docs/navigation/pagination.tsx +52 -0
  244. package/docs/navigation/steps.tsx +37 -0
  245. package/docs/navigation/tabs.tsx +97 -1
  246. package/docs/query/button-refetch.tsx +1 -0
  247. package/package.json +19 -2
  248. package/scripts/_agent-setup.mjs +19 -2
  249. package/scripts/init-guinea-pig.mjs +26 -4
  250. package/scripts/ui-audit.mjs +243 -30
@@ -260,6 +260,56 @@ export default function Demo() {
260
260
  </Flex>
261
261
  </CardContent>
262
262
  </Card>
263
+
264
+ <Card>
265
+ <CardHeader>
266
+ <CardTitle level={2}>レスポンシブな操作行</CardTitle>
267
+ </CardHeader>
268
+ <CardContent>
269
+ <Flex
270
+ id="responsive-actions"
271
+ direction={{ base: "col", lg: "row" }}
272
+ gap="md"
273
+ align="start"
274
+ >
275
+ <Flex fill>
276
+ <Text>画面幅に合わせて操作をまとめます。</Text>
277
+ </Flex>
278
+ <Button>保存</Button>
279
+ <Button variant="outline">キャンセル</Button>
280
+ </Flex>
281
+ </CardContent>
282
+ </Card>
283
+ <Card>
284
+ <CardHeader>
285
+ <CardTitle level={2}>軽い強調と行アクション</CardTitle>
286
+ </CardHeader>
287
+ <CardContent>
288
+ <Flex direction="col" gap="md">
289
+ <Flex id="hover-notice" surface="warning" pad={3} tabIndex={0}>
290
+ <Text>締切を確認してください。</Text>
291
+ <Flex reveal="hover" surface="popover" gap="xs" pad={1}>
292
+ <Button variant="ghost" size="sm">
293
+ 編集
294
+ </Button>
295
+ <Button variant="ghost" size="sm">
296
+ 解除
297
+ </Button>
298
+ </Flex>
299
+ </Flex>
300
+ <Flex as="ul" direction="col" gap="xs">
301
+ <li>添付ファイルを確認</li>
302
+ <li>担当者を選択</li>
303
+ </Flex>
304
+ <Flex surface="muted" pad={{ block: 2, inline: 3 }}>
305
+ <Text as="code" chip decoration="line-through">
306
+ old_status
307
+ </Text>
308
+ <Text>更新済み</Text>
309
+ </Flex>
310
+ </Flex>
311
+ </CardContent>
312
+ </Card>
263
313
  </Flex>
264
314
  </PageContainer>
265
315
  );
@@ -217,7 +217,7 @@ export default function Demo() {
217
217
  <CardDescription>
218
218
  名前付きコレクション geometry: コンテナ幅が lg ステップ(64rem)に達するまでは 1
219
219
  列、そこから 3 列に切り替わる。ResponsiveGrid には lg
220
- より上のステップが無いため、1024px 相当でも 1440px 相当でも同じ 3 列になる
220
+ より上のステップが無いため、1024px 相当でも 1440px 相当でも同じ 3 列になる ·
221
221
  課金プランカタログの「3/3/1」契約 (dxs-platform/platform#333)。`columns` の代わりに
222
222
  `preset` を渡すだけで、呼び出し側がブレークポイント値を自作する必要がない。
223
223
  </CardDescription>
@@ -254,6 +254,26 @@ export default function Demo() {
254
254
  </ResponsiveGrid>
255
255
  </CardContent>
256
256
  </Card>
257
+
258
+ <Card>
259
+ <CardHeader>
260
+ <CardTitle level={2}>一覧と補助情報 2:1</CardTitle>
261
+ </CardHeader>
262
+ <CardContent>
263
+ <ResponsiveGrid columns={{ base: 1, lg: 3 }} pad={{ block: 2 }}>
264
+ <ResponsiveGrid.Item span={{ base: 1, lg: 2 }}>
265
+ <Flex id="grid-main" surface="muted" pad={3}>
266
+ <Text>メインの一覧</Text>
267
+ </Flex>
268
+ </ResponsiveGrid.Item>
269
+ <ResponsiveGrid.Item>
270
+ <Flex id="grid-rail" surface="muted" pad={3}>
271
+ <Text>補助情報</Text>
272
+ </Flex>
273
+ </ResponsiveGrid.Item>
274
+ </ResponsiveGrid>
275
+ </CardContent>
276
+ </Card>
257
277
  </Flex>
258
278
  </PageContainer>
259
279
  );
@@ -1,5 +1,5 @@
1
1
  import { useState } from "react";
2
- import { AppShell, Flex, PageContainer, Sidebar, Topbar } from "@godxjp/ui/layout";
2
+ import { AppShell, Flex, PageContainer, Sidebar, Topbar, TopbarItem } from "@godxjp/ui/layout";
3
3
  import type { SidebarSectionProp } from "@godxjp/ui/layout";
4
4
  import {
5
5
  Avatar,
@@ -154,18 +154,14 @@ export default function Demo() {
154
154
  <Badge tone="warning" className="text-xs">
155
155
  ステージング
156
156
  </Badge>
157
- <Button
158
- variant="ghost"
159
- size="icon-sm"
157
+ <TopbarItem
160
158
  aria-label="通知"
161
- className="relative"
159
+ badge={unread ? 12 : undefined}
160
+ badgeTone="destructive"
162
161
  onClick={() => setUnread(false)}
163
162
  >
164
163
  <Bell />
165
- {unread ? (
166
- <span className="bg-destructive absolute end-1.5 top-1.5 size-1.5 rounded-full" />
167
- ) : null}
168
- </Button>
164
+ </TopbarItem>
169
165
  <DropdownMenu>
170
166
  <DropdownMenuTrigger asChild>
171
167
  <Button variant="ghost" size="icon-sm" aria-label="アカウントメニュー">
@@ -33,6 +33,17 @@ export default function Demo() {
33
33
  subtitle="kind で 1 つの AppProvider 設定を読み書きする統合ピッカー"
34
34
  >
35
35
  <Flex direction="col" gap="lg">
36
+ <Card>
37
+ <CardHeader>
38
+ <CardTitle level={2}>インライン表示</CardTitle>
39
+ </CardHeader>
40
+ <CardContent>
41
+ <Flex gap="md" align="center">
42
+ <Text>表示言語</Text>
43
+ <AppSettingPicker kind="locale" appearance="inline" id="setting-inline" />
44
+ </Flex>
45
+ </CardContent>
46
+ </Card>
36
47
  <Card>
37
48
  <CardHeader>
38
49
  <CardTitle level={2}>kind で対象設定を選ぶ</CardTitle>
@@ -129,6 +129,54 @@ export default function Demo() {
129
129
  </Flex>
130
130
  </CardContent>
131
131
  </Card>
132
+
133
+ {/* Ant Design parity surface — separator / itemRender / item menu */}
134
+ <Card>
135
+ <CardHeader>
136
+ <CardTitle level={2}>separator · itemRender · menu (Ant Design パリティ)</CardTitle>
137
+ <CardDescription>
138
+ separator は既定のシェブロンを任意のノードに置き換える(空文字で消える)。常に
139
+ aria-hidden なので、読み上げは ol / li の構造のまま。menu は antd の
140
+ BreadcrumbItemType.menu で、その区切りを兄弟切り替えのメニューボタンにする
141
+ (パス付きエントリは role=&quot;menuitem&quot; を保ったまま本物のアンカーになる)。
142
+ </CardDescription>
143
+ </CardHeader>
144
+ <CardContent>
145
+ <Flex direction="col" gap="sm">
146
+ <div id="antd-breadcrumb-slash">
147
+ <Breadcrumb
148
+ ariaLabel="区切り文字のパンくず"
149
+ separator="/"
150
+ items={[
151
+ { label: "ホーム", to: "/" },
152
+ { label: "会員管理", to: "/members" },
153
+ { label: "田中 太郎" },
154
+ ]}
155
+ />
156
+ </div>
157
+ <div id="antd-breadcrumb-menu">
158
+ <Breadcrumb
159
+ ariaLabel="プロジェクト切替のパンくず"
160
+ items={[
161
+ { label: "ホーム", to: "/" },
162
+ {
163
+ label: "プロジェクト A",
164
+ to: "/p/a",
165
+ menu: {
166
+ items: [
167
+ { value: "b", label: "プロジェクト B", to: "/p/b" },
168
+ { value: "c", label: "プロジェクト C", to: "/p/c" },
169
+ { value: "d", label: "プロジェクト D (準備中)", disabled: true },
170
+ ],
171
+ },
172
+ },
173
+ { label: "設定" },
174
+ ]}
175
+ />
176
+ </div>
177
+ </Flex>
178
+ </CardContent>
179
+ </Card>
132
180
  </Flex>
133
181
  </PageContainer>
134
182
  );
@@ -37,6 +37,27 @@ export default function Demo() {
37
37
  subtitle="Radix dropdown · Trigger asChild + Content + Item/Separator/Sub"
38
38
  >
39
39
  <Flex direction="col" gap="lg">
40
+ <Card>
41
+ <CardHeader>
42
+ <CardTitle level={2}>メニュー幅</CardTitle>
43
+ </CardHeader>
44
+ <CardContent>
45
+ <Flex wrap gap="md">
46
+ {(["auto", "trigger", "sm", "md", "lg"] as const).map((width) => (
47
+ <DropdownMenu key={width}>
48
+ <DropdownMenuTrigger asChild>
49
+ <Button id={`menu-width-${width}`} variant="outline">
50
+ {width}
51
+ </Button>
52
+ </DropdownMenuTrigger>
53
+ <DropdownMenuContent width={width}>
54
+ <DropdownMenuItem>編集</DropdownMenuItem>
55
+ </DropdownMenuContent>
56
+ </DropdownMenu>
57
+ ))}
58
+ </Flex>
59
+ </CardContent>
60
+ </Card>
40
61
  {/* Row action menu — the most common use */}
41
62
  <Card>
42
63
  <CardHeader>
@@ -235,6 +235,58 @@ export default function Demo() {
235
235
  />
236
236
  </CardContent>
237
237
  </Card>
238
+
239
+ {/* Ant Design parity surface — showQuickJumper / size / align / responsive */}
240
+ <Card>
241
+ <CardHeader>
242
+ <CardTitle level={2}>showQuickJumper · size · align (Ant Design パリティ)</CardTitle>
243
+ <CardDescription>
244
+ showQuickJumper はページ番号を直接入力するフィールド(Enter または goButton
245
+ で確定、範囲外はクランプ)。size=&quot;sm&quot; はバーに --control-height
246
+ を一度だけ再束縛するので、ページボタン・サイズ変更・ジャンプ欄が同時に縮む。align
247
+ は論理軸(start / center / end)。responsive は既定で有効で、モバイル幅では simple
248
+ 形態に畳む。
249
+ </CardDescription>
250
+ </CardHeader>
251
+ <CardContent>
252
+ <Flex direction="col" gap="lg">
253
+ <div id="antd-pagination-jumper">
254
+ <Pagination
255
+ ariaLabel="クイックジャンパー付きページネーション"
256
+ value={3}
257
+ total={95}
258
+ pageSize={10}
259
+ showTotal
260
+ showSizeChanger
261
+ showQuickJumper
262
+ onValueChange={() => {}}
263
+ />
264
+ </div>
265
+ <div id="antd-pagination-sm">
266
+ <Pagination
267
+ ariaLabel="小サイズ・中央寄せのページネーション"
268
+ value={3}
269
+ total={95}
270
+ pageSize={10}
271
+ size="sm"
272
+ align="center"
273
+ showQuickJumper={{ goButton: "移動" }}
274
+ onValueChange={() => {}}
275
+ />
276
+ </div>
277
+ <div id="antd-pagination-start">
278
+ <Pagination
279
+ ariaLabel="先頭寄せのページネーション"
280
+ value={3}
281
+ total={95}
282
+ pageSize={10}
283
+ align="start"
284
+ onValueChange={() => {}}
285
+ />
286
+ </div>
287
+ </Flex>
288
+ </CardContent>
289
+ </Card>
238
290
  </Flex>
239
291
  </PageContainer>
240
292
  );
@@ -259,6 +259,43 @@ export default function Demo() {
259
259
  </Flex>
260
260
  </CardContent>
261
261
  </Card>
262
+
263
+ {/* Ant Design parity surface — percent + navigation */}
264
+ <Card>
265
+ <CardHeader>
266
+ <CardTitle level={2}>percent · navigation (Ant Design パリティ)</CardTitle>
267
+ <CardDescription>
268
+ percent は antd と同じく「現在ステップ」の進捗のみ(0–100
269
+ にクランプ)。マーカーの周りに確定アークを描き、role=&quot;progressbar&quot;
270
+ として読み上げられる。type=&quot;navigation&quot; は antd
271
+ のスラブ型ナビゲーションバーで、既定のヘアライン
272
+ コネクタは切られ、代わりにシェブロンで繋がる。
273
+ </CardDescription>
274
+ </CardHeader>
275
+ <CardContent>
276
+ <Flex direction="col" gap="lg">
277
+ <div id="antd-steps-percent">
278
+ <Steps
279
+ value={1}
280
+ percent={40}
281
+ items={[{ title: "申込" }, { title: "審査" }, { title: "完了" }]}
282
+ />
283
+ </div>
284
+ <div id="antd-steps-navigation">
285
+ <Steps
286
+ type="navigation"
287
+ value={1}
288
+ onValueChange={() => {}}
289
+ items={[
290
+ { title: "申込", description: "受付済" },
291
+ { title: "審査", description: "書類確認中" },
292
+ { title: "完了", description: "未着手" },
293
+ ]}
294
+ />
295
+ </div>
296
+ </Flex>
297
+ </CardContent>
298
+ </Card>
262
299
  </Flex>
263
300
  </PageContainer>
264
301
  );
@@ -46,6 +46,17 @@ const journalItems = [
46
46
 
47
47
  export default function Demo() {
48
48
  const [activeTab, setActiveTab] = useState("pending");
49
+ const [editableTabs, setEditableTabs] = useState([
50
+ { value: "je-0042", label: "JE-0042", content: <Text as="p">売上計上 ¥480,000</Text> },
51
+ { value: "je-0043", label: "JE-0043", content: <Text as="p">仕入計上 ¥120,000</Text> },
52
+ {
53
+ value: "je-0040",
54
+ label: "JE-0040 (固定)",
55
+ content: <Text as="p">給与支払 ¥2,800,000</Text>,
56
+ closable: false,
57
+ },
58
+ ]);
59
+ const [editableTab, setEditableTab] = useState("je-0042");
49
60
 
50
61
  return (
51
62
  <PageContainer
@@ -106,7 +117,7 @@ export default function Demo() {
106
117
  <CardTitle level={2}>320px stress · 長いローカライズラベル</CardTitle>
107
118
  <CardDescription>
108
119
  狭いコンテナでも長いラベルはクリップされず、水平タブリストが自身でスクロールする
109
- 。compact navigation への変換は Tabs API に存在しないため擬似実装しない
120
+ 。compact navigation への変換は Tabs API に存在しないため擬似実装しない ·
110
121
  スクロールが意図した縮退動作。
111
122
  </CardDescription>
112
123
  </CardHeader>
@@ -308,6 +319,91 @@ export default function Demo() {
308
319
  </Flex>
309
320
  </CardContent>
310
321
  </Card>
322
+
323
+ {/* Ant Design parity surface — editable-card + extra + centered + placement + size */}
324
+ <Card>
325
+ <CardHeader>
326
+ <CardTitle level={2}>Editable card · onEdit / extra / hideAdd</CardTitle>
327
+ <CardDescription>
328
+ variant=&quot;editable-card&quot; は Ant Design の editable-card。タブ内の ×
329
+ はポインタ用ショートカット(aria-hidden)で、キーボードでは Delete /
330
+ Backspace(aria-keyshortcuts)。追加ボタンは tablist の外にある本物の button。extra は
331
+ antd の tabBarExtraContent を論理軸(start / end)にしたもの。
332
+ </CardDescription>
333
+ </CardHeader>
334
+ <CardContent>
335
+ <Tabs
336
+ id="antd-editable-card"
337
+ variant="editable-card"
338
+ value={editableTab}
339
+ onValueChange={setEditableTab}
340
+ onEdit={(target, action) => {
341
+ if (action === "add") {
342
+ const next = `tab-${editableTabs.length + 1}`;
343
+ setEditableTabs([
344
+ ...editableTabs,
345
+ {
346
+ value: next,
347
+ label: `新規 ${editableTabs.length + 1}`,
348
+ content: <Text as="p">新規タブ {next}</Text>,
349
+ },
350
+ ]);
351
+ setEditableTab(next);
352
+ return;
353
+ }
354
+ const rest = editableTabs.filter((item) => item.value !== target);
355
+ setEditableTabs(rest);
356
+ if (target === editableTab && rest[0]) setEditableTab(rest[0].value);
357
+ }}
358
+ extra={{
359
+ end: (
360
+ <Button size="sm" variant="outline">
361
+ 一括操作
362
+ </Button>
363
+ ),
364
+ }}
365
+ items={editableTabs}
366
+ />
367
+ </CardContent>
368
+ </Card>
369
+
370
+ <Card>
371
+ <CardHeader>
372
+ <CardTitle level={2}>tabPlacement · size · centered</CardTitle>
373
+ <CardDescription>
374
+ tabPlacement は antd 6.6.2 の名前で、値は論理軸(top / bottom / start / end)。start /
375
+ end は tablist を縦方向のロービングフォーカスに切り替える。size はライブラリの control
376
+ band(sm / md / lg)に対応。
377
+ </CardDescription>
378
+ </CardHeader>
379
+ <CardContent>
380
+ <Flex direction="col" gap="lg">
381
+ <Tabs
382
+ id="antd-centered"
383
+ defaultValue="pending"
384
+ variant="line"
385
+ centered
386
+ items={journalItems}
387
+ />
388
+ <Tabs
389
+ id="antd-bottom"
390
+ defaultValue="pending"
391
+ variant="card"
392
+ tabPlacement="bottom"
393
+ size="sm"
394
+ items={journalItems}
395
+ />
396
+ <Tabs
397
+ id="antd-start"
398
+ defaultValue="pending"
399
+ variant="line"
400
+ tabPlacement="start"
401
+ size="lg"
402
+ items={journalItems}
403
+ />
404
+ </Flex>
405
+ </CardContent>
406
+ </Card>
311
407
  </Flex>
312
408
  </PageContainer>
313
409
  );
@@ -81,6 +81,7 @@ function VariantBlock() {
81
81
  <ButtonRefetch query={query} variant="ghost" label="ghost" />
82
82
  <ButtonRefetch query={query} variant="destructive" label="destructive" />
83
83
  <ButtonRefetch query={query} variant="link" label="link" />
84
+ <ButtonRefetch query={query} variant="bare" label="bare" />
84
85
  </Flex>
85
86
  </CardContent>
86
87
  </Card>
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@godxjp/ui",
3
- "version": "20.0.0",
4
- "godxUiMcp": "20.0.0",
3
+ "version": "20.1.0",
4
+ "godxUiMcp": "20.1.0",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
7
7
  "type": "git",
@@ -85,6 +85,22 @@
85
85
  "types": "./dist/components/charts/compact-bar-trend.d.ts",
86
86
  "import": "./dist/components/charts/compact-bar-trend.js"
87
87
  },
88
+ "./charts/line-chart": {
89
+ "types": "./dist/components/charts/line-chart.d.ts",
90
+ "import": "./dist/components/charts/line-chart.js"
91
+ },
92
+ "./charts/bar-chart": {
93
+ "types": "./dist/components/charts/bar-chart.d.ts",
94
+ "import": "./dist/components/charts/bar-chart.js"
95
+ },
96
+ "./charts/area-chart": {
97
+ "types": "./dist/components/charts/area-chart.d.ts",
98
+ "import": "./dist/components/charts/area-chart.js"
99
+ },
100
+ "./charts/pie-chart": {
101
+ "types": "./dist/components/charts/pie-chart.d.ts",
102
+ "import": "./dist/components/charts/pie-chart.js"
103
+ },
88
104
  "./ui": {
89
105
  "types": "./dist/components/ui/index.d.ts",
90
106
  "import": "./dist/components/ui/index.js"
@@ -316,6 +332,7 @@
316
332
  "test:visual:auth-registration": "node scripts/auth-shell-registration-visual.mjs",
317
333
  "test:visual:topbar-collision": "node scripts/topbar-collision-visual.mjs",
318
334
  "test:visual:table-collection-cjk": "node scripts/table-collection-cjk-visual.mjs",
335
+ "test:visual:chart-cjk-axis": "node scripts/chart-cjk-axis-visual.mjs",
319
336
  "test:watch": "vitest",
320
337
  "test:coverage": "vitest run --coverage",
321
338
  "check:example-imports": "node scripts/check-example-imports.mjs",
@@ -255,17 +255,34 @@ export function refreshGuineaPigSkill(root) {
255
255
  const target = join(dir, "SKILL.md");
256
256
  const optin = join(dir, ".guinea-pig-optin");
257
257
  if (!existsSync(optin) || !existsSync(target)) return false;
258
- if (readFileSync(optin, "utf8").trim() === KIT_VERSION) return false;
259
258
 
260
259
  const base = readFileSync(join(SELF_ROOT, "scripts", "guinea-pig-skill.md"), "utf8");
260
+ /*
261
+ * The marker tracks the BASE TEXT, not the release — the same correction the consumer rule file
262
+ * needed, for the same reason. A version marker means editing this skill without cutting a
263
+ * release reaches nobody, and the skill is edited far more often than the version moves. The
264
+ * digest covers only the base: everything from the `# 8.` marker down belongs to the repo and
265
+ * must not make the package's own content look changed.
266
+ *
267
+ * `<version>:<digest>` rather than a bare digest, so the file still says which release wrote it
268
+ * to anyone reading it. Only the digest half is compared.
269
+ */
270
+ const stamp = `${KIT_VERSION}:${digestOf(base)}`;
271
+ if (readFileSync(optin, "utf8").trim().split(":").pop() === digestOf(base)) return false;
272
+
261
273
  const current = readFileSync(target, "utf8");
262
274
  const marker = "\n---\n\n# 8. ";
263
275
  const i = current.indexOf(marker);
264
276
  writeFileSync(target, base.replace(/\s*$/, "") + "\n" + (i < 0 ? "" : current.slice(i)));
265
- writeFileSync(optin, `${KIT_VERSION}\n`);
277
+ writeFileSync(optin, `${stamp}\n`);
266
278
  return true;
267
279
  }
268
280
 
281
+ /** The stamp `init-guinea-pig` writes on a fresh install, so the first refresh is a no-op. */
282
+ export function guineaPigStamp() {
283
+ return `${KIT_VERSION}:${digestOf(readFileSync(join(SELF_ROOT, "scripts", "guinea-pig-skill.md"), "utf8"))}`;
284
+ }
285
+
269
286
  /**
270
287
  * Install the common consumer rules as a PATH-TRIGGERED file, and wire them into `.ai/rules`.
271
288
  *
@@ -11,7 +11,7 @@ import { copyFileSync, existsSync, mkdirSync, writeFileSync } from "node:fs";
11
11
  import { dirname, join } from "node:path";
12
12
  import { fileURLToPath } from "node:url";
13
13
 
14
- import { KIT_VERSION, shouldSkip } from "./_agent-setup.mjs";
14
+ import { KIT_VERSION, guineaPigStamp, shouldSkip } from "./_agent-setup.mjs";
15
15
 
16
16
  const root = process.env.INIT_CWD || process.cwd();
17
17
  const skip = shouldSkip(root);
@@ -28,10 +28,32 @@ if (skip === "no-package") {
28
28
  const source = join(dirname(fileURLToPath(import.meta.url)), "guinea-pig-skill.md");
29
29
  const target = join(root, ".claude", "skills", "godx-ui-guinea-pig", "SKILL.md");
30
30
 
31
+ const optin = join(dirname(target), ".guinea-pig-optin");
32
+
31
33
  if (existsSync(target)) {
32
- console.log(` guinea-pig skill already present:\n ${target}`);
34
+ /*
35
+ * PRESENT IS NOT THE SAME AS OPTED IN, and this used to exit here regardless — printing "its
36
+ * BASE sections now refresh on `npm update`" at a repo where they never would.
37
+ *
38
+ * `refreshGuineaPigSkill` keys entirely off the marker: no marker, no refresh, ever, and no
39
+ * report of it either. Measured across the three guinea pigs: one carried the marker and kept
40
+ * up; two had SKILL.md copied by an older path and had been reading whatever guidance was
41
+ * current the day it landed. Re-running is exactly how someone would try to fix that, so
42
+ * re-running has to actually fix it.
43
+ */
44
+ if (!existsSync(optin)) {
45
+ writeFileSync(optin, `${guineaPigStamp()}\n`);
46
+ console.log(`
47
+ guinea-pig skill was present but NOT opted in — its base sections would never have refreshed.
48
+ Marker written; it now tracks @godxjp/ui@${KIT_VERSION}:
49
+ • ${target}
50
+ `);
51
+ process.exit(0);
52
+ }
53
+
54
+ console.log(` guinea-pig skill already present and opted in:\n ${target}`);
33
55
  console.log(
34
- "\n Its BASE sections now refresh on `npm update @godxjp/ui`; anything you appended below\n" +
56
+ "\n Its BASE sections refresh on `npm update @godxjp/ui`; anything you appended below\n" +
35
57
  " the `# 8.` marker is preserved. Re-running this command changes nothing.\n",
36
58
  );
37
59
  process.exit(0);
@@ -48,7 +70,7 @@ copyFileSync(source, target);
48
70
  * exact staleness this whole change exists to remove. The marker lives next to the skill rather
49
71
  * than in package.json so it travels with the thing it describes.
50
72
  */
51
- writeFileSync(join(dirname(target), ".guinea-pig-optin"), `${KIT_VERSION}\n`);
73
+ writeFileSync(optin, `${guineaPigStamp()}\n`);
52
74
 
53
75
  console.log(`
54
76
  guinea-pig skill installed: