@godxjp/ui 28.9.0 → 28.12.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 (244) hide show
  1. package/agent/START-HERE.md +193 -0
  2. package/agent/anti-ai-tells.json +158 -0
  3. package/agent/components/Accordion.json +60 -0
  4. package/agent/components/AccountChip.json +59 -0
  5. package/agent/components/Actions.json +78 -0
  6. package/agent/components/Activity.json +80 -0
  7. package/agent/components/Affix.json +78 -0
  8. package/agent/components/Alert.json +65 -0
  9. package/agent/components/AlertDialog.json +109 -0
  10. package/agent/components/AlertDialogRoot.json +52 -0
  11. package/agent/components/Anchor.json +119 -0
  12. package/agent/components/AppLauncher.json +95 -0
  13. package/agent/components/AppProvider.json +105 -0
  14. package/agent/components/AppSettingPicker.json +88 -0
  15. package/agent/components/AppSettingToggle.json +70 -0
  16. package/agent/components/AppShell.json +159 -0
  17. package/agent/components/AreaChart.json +105 -0
  18. package/agent/components/AspectRatio.json +38 -0
  19. package/agent/components/Attachments.json +77 -0
  20. package/agent/components/AuthAccountSummary.json +64 -0
  21. package/agent/components/AuthDivider.json +35 -0
  22. package/agent/components/AuthFooter.json +48 -0
  23. package/agent/components/AuthIdentity.json +42 -0
  24. package/agent/components/AuthShell.json +108 -0
  25. package/agent/components/AuthStack.json +21 -0
  26. package/agent/components/Avatar.json +89 -0
  27. package/agent/components/Badge.json +96 -0
  28. package/agent/components/Banner.json +48 -0
  29. package/agent/components/BarChart.json +108 -0
  30. package/agent/components/BranchScopePicker.json +89 -0
  31. package/agent/components/Breadcrumb.json +54 -0
  32. package/agent/components/Button.json +133 -0
  33. package/agent/components/Calendar.json +259 -0
  34. package/agent/components/Callout.json +46 -0
  35. package/agent/components/Card.json +112 -0
  36. package/agent/components/CardBar.json +49 -0
  37. package/agent/components/CardContent.json +51 -0
  38. package/agent/components/Carousel.json +50 -0
  39. package/agent/components/Cascader.json +209 -0
  40. package/agent/components/CenteredShell.json +66 -0
  41. package/agent/components/ChatBubble.json +100 -0
  42. package/agent/components/ChatBubbleList.json +64 -0
  43. package/agent/components/ChatComposer.json +160 -0
  44. package/agent/components/ChatSuggestion.json +86 -0
  45. package/agent/components/Checkbox.json +68 -0
  46. package/agent/components/CheckboxGroup.json +96 -0
  47. package/agent/components/CodeBlock.json +64 -0
  48. package/agent/components/Collapsible.json +74 -0
  49. package/agent/components/ColorPicker.json +87 -0
  50. package/agent/components/Command.json +168 -0
  51. package/agent/components/CommandPalette.json +84 -0
  52. package/agent/components/CompactBarTrend.json +101 -0
  53. package/agent/components/Conversations.json +82 -0
  54. package/agent/components/CredentialReveal.json +93 -0
  55. package/agent/components/DataState.json +79 -0
  56. package/agent/components/DataTable.json +268 -0
  57. package/agent/components/DatePicker.json +275 -0
  58. package/agent/components/Descriptions.json +67 -0
  59. package/agent/components/Dialog.json +78 -0
  60. package/agent/components/DraggablePanel.json +106 -0
  61. package/agent/components/DropdownMenu.json +102 -0
  62. package/agent/components/EmptyState.json +83 -0
  63. package/agent/components/ErrorSurface.json +128 -0
  64. package/agent/components/FeatureList.json +43 -0
  65. package/agent/components/Field.json +64 -0
  66. package/agent/components/FilterBar.json +99 -0
  67. package/agent/components/Flex.json +153 -0
  68. package/agent/components/FloatButton.json +91 -0
  69. package/agent/components/Form.json +87 -0
  70. package/agent/components/FormErrors.json +51 -0
  71. package/agent/components/FormField.json +137 -0
  72. package/agent/components/FormFieldArray.json +39 -0
  73. package/agent/components/FormFieldControl.json +129 -0
  74. package/agent/components/FormRoot.json +122 -0
  75. package/agent/components/Heading.json +61 -0
  76. package/agent/components/HoverCard.json +55 -0
  77. package/agent/components/Icon.json +60 -0
  78. package/agent/components/InfiniteQueryState.json +58 -0
  79. package/agent/components/Input.json +122 -0
  80. package/agent/components/InputOTP.json +106 -0
  81. package/agent/components/Label.json +43 -0
  82. package/agent/components/LegalDocumentShell.json +102 -0
  83. package/agent/components/Legend.json +42 -0
  84. package/agent/components/LineChart.json +103 -0
  85. package/agent/components/Link.json +41 -0
  86. package/agent/components/ListRow.json +92 -0
  87. package/agent/components/Logo.json +85 -0
  88. package/agent/components/Marquee.json +91 -0
  89. package/agent/components/Masonry.json +82 -0
  90. package/agent/components/MasterDetail.json +95 -0
  91. package/agent/components/MegaMenu.json +120 -0
  92. package/agent/components/MobileShell.json +73 -0
  93. package/agent/components/NavList.json +63 -0
  94. package/agent/components/NumberInput.json +158 -0
  95. package/agent/components/OrgSwitcher.json +89 -0
  96. package/agent/components/OverlayPortalProvider.json +42 -0
  97. package/agent/components/PageContainer.json +181 -0
  98. package/agent/components/Pagination.json +132 -0
  99. package/agent/components/Paragraph.json +40 -0
  100. package/agent/components/PasswordInput.json +79 -0
  101. package/agent/components/PasswordStrength.json +51 -0
  102. package/agent/components/PermissionMatrix.json +81 -0
  103. package/agent/components/PieChart.json +99 -0
  104. package/agent/components/Popover.json +110 -0
  105. package/agent/components/PrefetchLink.json +65 -0
  106. package/agent/components/Progress.json +79 -0
  107. package/agent/components/Prose.json +57 -0
  108. package/agent/components/QrCode.json +62 -0
  109. package/agent/components/Radio.json +98 -0
  110. package/agent/components/RadioGroup.json +91 -0
  111. package/agent/components/RangeTimeline.json +80 -0
  112. package/agent/components/Rating.json +92 -0
  113. package/agent/components/ResizablePanel.json +69 -0
  114. package/agent/components/ResponsiveGrid.json +77 -0
  115. package/agent/components/Reveal.json +70 -0
  116. package/agent/components/ScrollArea.json +104 -0
  117. package/agent/components/SearchInput.json +98 -0
  118. package/agent/components/Segmented.json +96 -0
  119. package/agent/components/Select.json +397 -0
  120. package/agent/components/Separator.json +86 -0
  121. package/agent/components/ServiceCatalogCta.json +46 -0
  122. package/agent/components/ServiceLauncherCard.json +93 -0
  123. package/agent/components/ServiceRolePanel.json +83 -0
  124. package/agent/components/Sheet.json +85 -0
  125. package/agent/components/Sidebar.json +118 -0
  126. package/agent/components/Skeleton.json +57 -0
  127. package/agent/components/SkeletonArticle.json +71 -0
  128. package/agent/components/SkeletonAvatar.json +50 -0
  129. package/agent/components/SkeletonButton.json +57 -0
  130. package/agent/components/SkeletonForm.json +52 -0
  131. package/agent/components/SkeletonImage.json +37 -0
  132. package/agent/components/SkeletonInput.json +51 -0
  133. package/agent/components/SkeletonNode.json +42 -0
  134. package/agent/components/SkeletonRows.json +49 -0
  135. package/agent/components/SkeletonTable.json +45 -0
  136. package/agent/components/Slider.json +160 -0
  137. package/agent/components/SplitPane.json +66 -0
  138. package/agent/components/StatCard.json +83 -0
  139. package/agent/components/Steps.json +95 -0
  140. package/agent/components/Swatch.json +41 -0
  141. package/agent/components/Switch.json +81 -0
  142. package/agent/components/Table.json +112 -0
  143. package/agent/components/Tabs.json +158 -0
  144. package/agent/components/TagInput.json +105 -0
  145. package/agent/components/Text.json +201 -0
  146. package/agent/components/Textarea.json +126 -0
  147. package/agent/components/ThoughtChain.json +76 -0
  148. package/agent/components/Thumbnail.json +70 -0
  149. package/agent/components/TimePicker.json +200 -0
  150. package/agent/components/TimeRangePicker.json +90 -0
  151. package/agent/components/Timeline.json +47 -0
  152. package/agent/components/TimelineGrid.json +92 -0
  153. package/agent/components/Title.json +67 -0
  154. package/agent/components/Toaster.json +42 -0
  155. package/agent/components/Toggle.json +90 -0
  156. package/agent/components/ToggleGroup.json +102 -0
  157. package/agent/components/Toolbar.json +120 -0
  158. package/agent/components/Tooltip.json +110 -0
  159. package/agent/components/Topbar.json +83 -0
  160. package/agent/components/TopbarItem.json +79 -0
  161. package/agent/components/Transfer.json +141 -0
  162. package/agent/components/Tree.json +185 -0
  163. package/agent/components/TreeSelect.json +232 -0
  164. package/agent/components/TwoFactorSetup.json +79 -0
  165. package/agent/components/Typography.json +42 -0
  166. package/agent/components/Upload.json +221 -0
  167. package/agent/components/UploadCropDialog.json +60 -0
  168. package/agent/components/VisuallyHidden.json +20 -0
  169. package/agent/components/Welcome.json +65 -0
  170. package/agent/components/formatDate.json +46 -0
  171. package/agent/components/inertiaUpload.json +32 -0
  172. package/agent/components/useZodForm.json +39 -0
  173. package/agent/components-index.json +884 -0
  174. package/agent/components.json +15515 -0
  175. package/agent/index.json +56 -0
  176. package/agent/llms.txt +32 -0
  177. package/agent/patterns/account-recovery-settings.json +19 -0
  178. package/agent/patterns/async-data-state.json +20 -0
  179. package/agent/patterns/auth-recovery-panels.json +29 -0
  180. package/agent/patterns/badge-coloring.json +14 -0
  181. package/agent/patterns/common-fixes.json +16 -0
  182. package/agent/patterns/confirm-destructive.json +11 -0
  183. package/agent/patterns/data-table-page.json +18 -0
  184. package/agent/patterns/deferred-loading.json +12 -0
  185. package/agent/patterns/error-pages.json +28 -0
  186. package/agent/patterns/inertia-detail-page.json +13 -0
  187. package/agent/patterns/inertia-list-page.json +15 -0
  188. package/agent/patterns/inertia-persistent-layout.json +14 -0
  189. package/agent/patterns/organization-memberships.json +19 -0
  190. package/agent/patterns/page-sections.json +18 -0
  191. package/agent/patterns/settings-page-responsive.json +18 -0
  192. package/agent/patterns/settings-section-rows.json +23 -0
  193. package/agent/patterns/signup-form.json +13 -0
  194. package/agent/patterns/topbar-account-chip.json +18 -0
  195. package/agent/patterns/transactional-email.json +22 -0
  196. package/agent/patterns-index.json +323 -0
  197. package/agent/patterns.json +342 -0
  198. package/agent/rules.json +237 -0
  199. package/agent/tokens.json +8427 -0
  200. package/agent/vocabulary.json +198 -0
  201. package/dist/components/data-display/service-launcher-card.d.ts +19 -0
  202. package/dist/components/data-display/service-launcher-card.js +14 -1
  203. package/dist/components/data-entry/attachments.js +77 -33
  204. package/dist/components/data-entry/input.js +8 -1
  205. package/dist/components/layout/flex.d.ts +2 -2
  206. package/dist/components/layout/flex.js +2 -0
  207. package/dist/components/ui/avatar.d.ts +1 -18
  208. package/dist/components/ui/avatar.js +1 -36
  209. package/dist/components/ui/tag-input.d.ts +10 -0
  210. package/dist/components/ui/tag-input.js +35 -2
  211. package/dist/contracts/measurement.json +1 -1
  212. package/dist/i18n/messages/en.json +190 -1
  213. package/dist/i18n/messages/ja.json +188 -1
  214. package/dist/i18n/messages/vi.json +188 -1
  215. package/dist/lib/image-loading-status.d.ts +25 -0
  216. package/dist/lib/image-loading-status.js +41 -0
  217. package/dist/props/components/data-entry.prop.d.ts +21 -2
  218. package/dist/props/components/layout.prop.d.ts +42 -0
  219. package/dist/props/registry.d.ts +14 -1
  220. package/dist/props/registry.js +18 -1
  221. package/dist/styles/card-layout.css +10 -4
  222. package/dist/styles/control.css +33 -4
  223. package/dist/styles/data-display-layout.css +1 -1
  224. package/dist/styles/data-entry-layout.css +245 -2
  225. package/dist/styles/layout.css +17 -0
  226. package/dist/styles/navigation-layout.css +3 -1
  227. package/dist/styles/shell-layout.css +2 -0
  228. package/dist/styles/table-layout.css +50 -9
  229. package/dist/tokens/components/attachments.css +18 -9
  230. package/dist/tokens/components/segmented.css +7 -3
  231. package/dist/tokens/components/table.css +2 -1
  232. package/docs/COMPOSITION-VS-COMPONENT.md +41 -0
  233. package/docs/DESIGN-AUTHORITY.md +52 -0
  234. package/docs/DEVELOPMENT.md +81 -6
  235. package/docs/assets/service-mark-rose.svg +6 -0
  236. package/docs/assets/service-mark-teal.svg +5 -0
  237. package/docs/data-display/service-launcher-card.tsx +232 -92
  238. package/docs/data-entry/tag-input.tsx +37 -0
  239. package/docs/layout/flex.tsx +40 -0
  240. package/docs/roadmap/website-components.md +34 -0
  241. package/docs/showcase/marketing-page.tsx +54 -45
  242. package/docs/showcase/table-pagination.tsx +99 -18
  243. package/docs/showcase/theme-customization.tsx +25 -2
  244. package/package.json +8 -5
@@ -0,0 +1,71 @@
1
+ {
2
+ "example": "import { SkeletonArticle } from \"@godxjp/ui/feedback\";\n\n<SkeletonArticle avatar active paragraph={{ rows: 3 }} />",
3
+ "group": "feedback",
4
+ "importPath": "@godxjp/ui/feedback",
5
+ "name": "SkeletonArticle",
6
+ "props": [
7
+ {
8
+ "defaultValue": "false",
9
+ "description": "Leading avatar placeholder. `true` takes the antd default matrix: a large circle, or a large SQUARE when there is a title but no paragraph (an entity header rather than a person).",
10
+ "name": "avatar",
11
+ "type": "boolean | { size?: 'xs' | 'sm' | 'md' | 'lg'; shape?: 'circle' | 'square' }"
12
+ },
13
+ {
14
+ "defaultValue": "true",
15
+ "description": "The heading LINE — not a string. `false` drops it; `{ width }` re-measures it. The default measure follows antd: 38% with a paragraph and no avatar, 50% with both, full width otherwise.",
16
+ "name": "title",
17
+ "type": "boolean | { width?: number | string }"
18
+ },
19
+ {
20
+ "defaultValue": "true",
21
+ "description": "The body lines. Default rows follow antd: 3 with a title and no avatar, else 2. A single `width` measures the LAST row; an array measures row by row. A number is read as pixels.",
22
+ "name": "paragraph",
23
+ "type": "boolean | { rows?: number; width?: number | string | (number | string)[] }"
24
+ },
25
+ {
26
+ "defaultValue": "false",
27
+ "description": "Pill corners on every line.",
28
+ "name": "round",
29
+ "type": "boolean"
30
+ },
31
+ {
32
+ "defaultValue": "false",
33
+ "description": "Travelling sheen instead of the resting pulse; descends to every line.",
34
+ "name": "active",
35
+ "type": "boolean"
36
+ },
37
+ {
38
+ "description": "Pass `false` to render `children` in place of the placeholder.",
39
+ "name": "loading",
40
+ "type": "boolean"
41
+ },
42
+ {
43
+ "description": "Extra classes on the article root.",
44
+ "name": "className",
45
+ "type": "string"
46
+ }
47
+ ],
48
+ "related": [
49
+ "SkeletonDetail — the house record-page shape (title + metadata pairs); SkeletonArticle is the avatar + prose shape.",
50
+ "SkeletonRows — repeated flat rows with no avatar or prose rhythm.",
51
+ "Skeleton — the bare block SkeletonArticle is built from."
52
+ ],
53
+ "rules": [
54
+ 3,
55
+ 31
56
+ ],
57
+ "storyPath": "feedback/Skeleton.stories.tsx",
58
+ "tagline": "Avatar + heading line + paragraph placeholder — Ant Design's own <Skeleton> shape, for a comment, a profile block or a feed item.",
59
+ "usage": [
60
+ "DO use SkeletonArticle where the loaded content is 'a person/entity beside a block of prose' — a comment, an activity item, a profile header, a notification row.",
61
+ "DO match `paragraph.rows` to the copy you expect so the layout does not jump on hydration.",
62
+ "DON'T use it for a table (SkeletonTable), a KPI tile (SkeletonStat) or a record page (SkeletonDetail) — those house shapes already match their targets.",
63
+ "DON'T nest it in a Card just to get a border; it draws no surface of its own."
64
+ ],
65
+ "useCases": [
66
+ "Comment thread loading state",
67
+ "Notification / activity feed placeholder",
68
+ "Profile header while the account record resolves",
69
+ "Chat or review list pre-mount placeholder"
70
+ ]
71
+ }
@@ -0,0 +1,50 @@
1
+ {
2
+ "example": "import { SkeletonAvatar } from \"@godxjp/ui/feedback\";\n\n<SkeletonAvatar size=\"lg\" shape=\"square\" />",
3
+ "group": "feedback",
4
+ "importPath": "@godxjp/ui/feedback",
5
+ "name": "SkeletonAvatar",
6
+ "props": [
7
+ {
8
+ "defaultValue": "\"md\"",
9
+ "description": "Box, from the same height tier the real Avatar sizes from.",
10
+ "name": "size",
11
+ "type": "\"xs\" | \"sm\" | \"md\" | \"lg\""
12
+ },
13
+ {
14
+ "defaultValue": "\"circle\"",
15
+ "description": "Circle for a person, square for an entity/service mark — Avatar's vocabulary.",
16
+ "name": "shape",
17
+ "type": "\"circle\" | \"square\""
18
+ },
19
+ {
20
+ "description": "Travelling sheen instead of the pulse.",
21
+ "name": "active",
22
+ "type": "boolean"
23
+ },
24
+ {
25
+ "description": "Extra classes.",
26
+ "name": "className",
27
+ "type": "string"
28
+ }
29
+ ],
30
+ "related": [
31
+ "Avatar",
32
+ "SkeletonArticle",
33
+ "Skeleton"
34
+ ],
35
+ "rules": [
36
+ 3,
37
+ 31
38
+ ],
39
+ "storyPath": "feedback/Skeleton.stories.tsx",
40
+ "tagline": "Avatar-shaped placeholder (also Skeleton.Avatar) sized from the --control-height tier.",
41
+ "usage": [
42
+ "DO pair the `shape` with the Avatar it replaces so the swap does not change the silhouette.",
43
+ "DON'T hand-size a bare Skeleton into a circle — this preset already carries the tier box."
44
+ ],
45
+ "useCases": [
46
+ "Member list loading rows",
47
+ "Comment author placeholder",
48
+ "Org switcher loading"
49
+ ]
50
+ }
@@ -0,0 +1,57 @@
1
+ {
2
+ "example": "import { SkeletonButton } from \"@godxjp/ui/feedback\";\n\n<SkeletonButton size=\"sm\" shape=\"pill\" />",
3
+ "group": "feedback",
4
+ "importPath": "@godxjp/ui/feedback",
5
+ "name": "SkeletonButton",
6
+ "props": [
7
+ {
8
+ "defaultValue": "\"md\"",
9
+ "description": "Height, from the --control-height tier Button sizes from.",
10
+ "name": "size",
11
+ "type": "\"xs\" | \"sm\" | \"md\" | \"lg\""
12
+ },
13
+ {
14
+ "defaultValue": "\"default\"",
15
+ "description": "Corner, in Button's own vocabulary. `pill` is Ant Design's shape=\"round\".",
16
+ "name": "shape",
17
+ "type": "\"default\" | \"pill\" | \"sharp\""
18
+ },
19
+ {
20
+ "defaultValue": "false",
21
+ "description": "Fill the inline axis instead of holding the control's own measure.",
22
+ "name": "block",
23
+ "type": "boolean"
24
+ },
25
+ {
26
+ "description": "Travelling sheen instead of the pulse.",
27
+ "name": "active",
28
+ "type": "boolean"
29
+ },
30
+ {
31
+ "description": "Extra classes.",
32
+ "name": "className",
33
+ "type": "string"
34
+ }
35
+ ],
36
+ "related": [
37
+ "Button",
38
+ "SkeletonInput",
39
+ "Skeleton"
40
+ ],
41
+ "rules": [
42
+ 3,
43
+ 31
44
+ ],
45
+ "storyPath": "feedback/Skeleton.stories.tsx",
46
+ "tagline": "Button-shaped placeholder (also Skeleton.Button) — two control-heights wide.",
47
+ "usage": [
48
+ "DO use it in a toolbar or card footer whose actions depend on data that has not arrived.",
49
+ "DO pass `block` when the real Button spans its column, so the row does not reflow on swap.",
50
+ "DON'T render a disabled Button as a loading state — a disabled control announces a different thing."
51
+ ],
52
+ "useCases": [
53
+ "Toolbar actions pre-mount",
54
+ "Card footer CTA placeholder",
55
+ "Form submit row"
56
+ ]
57
+ }
@@ -0,0 +1,52 @@
1
+ {
2
+ "example": "import { SkeletonForm } from \"@godxjp/ui/feedback\";\n\n{loading ? <SkeletonForm columns={4} fields={8} /> : <Form columns={4}>…</Form>}",
3
+ "group": "feedback",
4
+ "importPath": "@godxjp/ui/feedback",
5
+ "name": "SkeletonForm",
6
+ "props": [
7
+ {
8
+ "defaultValue": "1",
9
+ "description": "Columns of the form this stands in for. Passed straight to ResponsiveGrid, so it is the SAME value and the SAME breakpoint ladder the Form uses — that shared source is the point of the component.",
10
+ "name": "columns",
11
+ "type": "number"
12
+ },
13
+ {
14
+ "defaultValue": "6",
15
+ "description": "How many label+control pairs to draw.",
16
+ "name": "fields",
17
+ "type": "number"
18
+ },
19
+ {
20
+ "description": "Travelling sheen instead of the pulse.",
21
+ "name": "active",
22
+ "type": "boolean"
23
+ },
24
+ {
25
+ "description": "Extra classes.",
26
+ "name": "className",
27
+ "type": "string"
28
+ }
29
+ ],
30
+ "related": [
31
+ "Form — the thing this stands in for; give both the same `columns`.",
32
+ "FormField — the label+control pair each cell here draws.",
33
+ "SkeletonRows — a FLAT list of lines, for a list. Not a form.",
34
+ "SkeletonInput — one field's control on its own, when you are composing something else."
35
+ ],
36
+ "rules": [
37
+ 3,
38
+ 31
39
+ ],
40
+ "storyPath": "feedback/Skeleton.stories.tsx",
41
+ "tagline": "The skeleton of a `Form columns={N}` — label + control PAIRS on the form's own ResponsiveGrid, not the flat line list SkeletonRows draws.",
42
+ "usage": [
43
+ "DO pass the same `columns` the Form takes. Anything else and the layout jumps when the data lands.",
44
+ "DO use it instead of SkeletonRows for a form: a field is a short label stacked on a full-width control, and SkeletonRows has no idea a cell has an inside.",
45
+ "DON'T hand-assemble SkeletonInput inside a ResponsiveGrid to approximate one — that is what this replaces, and 'close enough' drifts the first time someone changes the Form's columns."
46
+ ],
47
+ "useCases": [
48
+ "An edit form before the record resolves",
49
+ "A multi-column settings panel on first paint",
50
+ "A wizard step whose defaults arrive from the server"
51
+ ]
52
+ }
@@ -0,0 +1,37 @@
1
+ {
2
+ "example": "import { SkeletonImage } from \"@godxjp/ui/feedback\";\n\n<SkeletonImage active />",
3
+ "group": "feedback",
4
+ "importPath": "@godxjp/ui/feedback",
5
+ "name": "SkeletonImage",
6
+ "props": [
7
+ {
8
+ "description": "Travelling sheen instead of the pulse.",
9
+ "name": "active",
10
+ "type": "boolean"
11
+ },
12
+ {
13
+ "description": "Extra classes.",
14
+ "name": "className",
15
+ "type": "string"
16
+ }
17
+ ],
18
+ "related": [
19
+ "SkeletonNode",
20
+ "Skeleton"
21
+ ],
22
+ "rules": [
23
+ 3,
24
+ 31
25
+ ],
26
+ "storyPath": "feedback/Skeleton.stories.tsx",
27
+ "tagline": "SkeletonNode carrying the image glyph (also Skeleton.Image).",
28
+ "usage": [
29
+ "DO use it where the loaded content is a picture, so the placeholder says WHICH kind of content is coming.",
30
+ "DON'T use it for a generic square — that is SkeletonNode."
31
+ ],
32
+ "useCases": [
33
+ "Gallery grid loading",
34
+ "Product thumbnail",
35
+ "Attachment preview"
36
+ ]
37
+ }
@@ -0,0 +1,51 @@
1
+ {
2
+ "example": "import { SkeletonInput } from \"@godxjp/ui/feedback\";\n\n<SkeletonInput block />",
3
+ "group": "feedback",
4
+ "importPath": "@godxjp/ui/feedback",
5
+ "name": "SkeletonInput",
6
+ "props": [
7
+ {
8
+ "defaultValue": "\"md\"",
9
+ "description": "Height, from the --control-height tier Input sizes from.",
10
+ "name": "size",
11
+ "type": "\"xs\" | \"sm\" | \"md\" | \"lg\""
12
+ },
13
+ {
14
+ "defaultValue": "false",
15
+ "description": "Fill the inline axis — the usual choice inside a FormField column.",
16
+ "name": "block",
17
+ "type": "boolean"
18
+ },
19
+ {
20
+ "description": "Travelling sheen instead of the pulse.",
21
+ "name": "active",
22
+ "type": "boolean"
23
+ },
24
+ {
25
+ "description": "Extra classes.",
26
+ "name": "className",
27
+ "type": "string"
28
+ }
29
+ ],
30
+ "related": [
31
+ "Input",
32
+ "FormField",
33
+ "SkeletonButton",
34
+ "Skeleton"
35
+ ],
36
+ "rules": [
37
+ 3,
38
+ 31
39
+ ],
40
+ "storyPath": "feedback/Skeleton.stories.tsx",
41
+ "tagline": "Field-shaped placeholder (also Skeleton.Input) — five control-heights wide.",
42
+ "usage": [
43
+ "DO use it for a form whose initial values are still loading, one per field.",
44
+ "DON'T render a real Input with a spinner inside it; an empty field invites typing that will be overwritten."
45
+ ],
46
+ "useCases": [
47
+ "Edit form before the record resolves",
48
+ "Filter bar pre-mount",
49
+ "Settings panel"
50
+ ]
51
+ }
@@ -0,0 +1,42 @@
1
+ {
2
+ "example": "import { SkeletonNode } from \"@godxjp/ui/feedback\";\n\n<SkeletonNode />",
3
+ "group": "feedback",
4
+ "importPath": "@godxjp/ui/feedback",
5
+ "name": "SkeletonNode",
6
+ "props": [
7
+ {
8
+ "description": "Centred content, e.g. a glyph.",
9
+ "name": "children",
10
+ "type": "ReactNode"
11
+ },
12
+ {
13
+ "description": "Travelling sheen instead of the pulse.",
14
+ "name": "active",
15
+ "type": "boolean"
16
+ },
17
+ {
18
+ "description": "Extra classes.",
19
+ "name": "className",
20
+ "type": "string"
21
+ }
22
+ ],
23
+ "related": [
24
+ "SkeletonImage",
25
+ "Skeleton"
26
+ ],
27
+ "rules": [
28
+ 3,
29
+ 31
30
+ ],
31
+ "storyPath": "feedback/Skeleton.stories.tsx",
32
+ "tagline": "Square media/custom placeholder (also Skeleton.Node); children centre inside it.",
33
+ "usage": [
34
+ "DO use it as the generic square when no other preset matches — a chart slot, a map tile, a QR code.",
35
+ "DON'T put text in it; it is a shape, and its container is already aria-busy."
36
+ ],
37
+ "useCases": [
38
+ "Chart panel placeholder",
39
+ "Map / canvas slot",
40
+ "QR or barcode slot"
41
+ ]
42
+ }
@@ -0,0 +1,49 @@
1
+ {
2
+ "example": "import { SkeletonRows } from \"@godxjp/ui/feedback\";\n\n<SkeletonRows rows={6} columns={3} />",
3
+ "group": "feedback",
4
+ "importPath": "@godxjp/ui/feedback",
5
+ "name": "SkeletonRows",
6
+ "props": [
7
+ {
8
+ "defaultValue": "6",
9
+ "description": "How many skeleton lines to draw.",
10
+ "name": "rows",
11
+ "type": "number"
12
+ },
13
+ {
14
+ "defaultValue": "4",
15
+ "description": "Columns per row on the internal ResponsiveGrid — match the loaded list's column count so nothing reflows on hydration.",
16
+ "name": "columns",
17
+ "type": "number"
18
+ },
19
+ {
20
+ "description": "Root class override.",
21
+ "name": "className",
22
+ "type": "string"
23
+ }
24
+ ],
25
+ "related": [
26
+ "SkeletonTable — tabular placeholder with a header band; not a flat line list.",
27
+ "SkeletonForm — label + control pairs on a form grid.",
28
+ "SkeletonArticle — avatar beside prose lines.",
29
+ "Skeleton — the bare block this preset is built from."
30
+ ],
31
+ "rules": [
32
+ 3,
33
+ 31
34
+ ],
35
+ "storyPath": "feedback/Skeleton.stories.tsx",
36
+ "tagline": "Repeated flat loading lines on a responsive grid — the list-shaped placeholder when the final layout is rows of short bars, not a table header, not avatar + prose.",
37
+ "usage": [
38
+ "DO use SkeletonRows for a flat list of short bars — activity feeds without avatars, settings rows, filter result lists.",
39
+ "DO match `rows` and `columns` to the loaded layout so the skeleton does not jump when data arrives.",
40
+ "DON'T use it for tabular data with a header row — SkeletonTable matches DataTable's chrome.",
41
+ "DON'T use it for a form — SkeletonForm draws label + control pairs on the form's column grid.",
42
+ "Import from `@godxjp/ui/feedback` (canonical). `@godxjp/ui/admin` re-exports it for admin pages."
43
+ ],
44
+ "useCases": [
45
+ "Card body while a simple list deferred prop resolves",
46
+ "Stacked settings rows before the record loads",
47
+ "Generic repeated rows when SkeletonArticle's avatar + prose rhythm is wrong"
48
+ ]
49
+ }
@@ -0,0 +1,45 @@
1
+ {
2
+ "example": "import { SkeletonTable } from \"@godxjp/ui/feedback\";\n\n{!coupons ? <SkeletonTable rows={10} columns={6} /> : <DataTable data={coupons} columns={columns} />}",
3
+ "group": "feedback",
4
+ "importPath": "@godxjp/ui/feedback",
5
+ "name": "SkeletonTable",
6
+ "props": [
7
+ {
8
+ "defaultValue": "8",
9
+ "description": "Body skeleton rows.",
10
+ "name": "rows",
11
+ "type": "number"
12
+ },
13
+ {
14
+ "defaultValue": "5",
15
+ "description": "Columns in header + body.",
16
+ "name": "columns",
17
+ "type": "number"
18
+ }
19
+ ],
20
+ "related": [
21
+ "DataTable — sibling component that SkeletonTable precedes. Once DataTable mounts, use its `loading` prop (renders an in-table loading row) for subsequent refetches rather than swapping back to SkeletonTable. Pick SkeletonTable only for the pre-mount gap.",
22
+ "DataState — query lifecycle widget from `@godxjp/ui/query`; accepts SkeletonTable as its `skeleton` prop and handles loading/empty/error transitions automatically. Prefer DataState + SkeletonTable over a hand-rolled ternary when the data comes from a useQuery hook.",
23
+ "SkeletonStat — sibling skeleton shaped like a StatCard tile; use inside a ResponsiveGrid to placeholder KPI dashboard cards, not tabular data.",
24
+ "DataTable — when data is already mounted but re-fetching (e.g. pagination, filter change), set `loading={true}` on DataTable directly instead of unmounting it and swapping in SkeletonTable; avoids layout shift and preserves scroll position."
25
+ ],
26
+ "rules": [],
27
+ "storyPath": "feedback/Skeleton.stories.tsx",
28
+ "tagline": "Loading placeholder matching the DataTable layout (header + N rows). Drop-in while data loads (deferred props).",
29
+ "usage": [
30
+ "DO use SkeletonTable as the pre-mount placeholder — either as a ternary fallback (`{!data ? <SkeletonTable rows={10} columns={6} /> : <DataTable … />}`) for Inertia deferred props, or as the `skeleton` prop of `DataState` (`<DataState query={q} skeleton={<SkeletonTable />} …>`). It is NOT for in-table loading; once DataTable has mounted use its own `loading` prop instead.",
31
+ "DO match rows/columns to the final DataTable layout: pass `rows` equal to your expected page size and `columns` equal to your column count so the skeleton doesn't visually jump on hydration. Defaults are rows=8, columns=5.",
32
+ "DO NOT use SkeletonTable when data is already present but refetching — use `DataTable loading={isFetching}` for in-table refetch states. SkeletonTable is only for the initial pre-mount gap before DataTable is rendered.",
33
+ "DO NOT wrap SkeletonTable in a Card — it renders its own header + body structure matching DataTable's DOM. Placing it inside CardContent adds unwanted padding around the skeleton rail.",
34
+ "The root element carries `aria-busy=\"true\"` automatically — do not add a second aria-busy on a wrapper. Screen readers announce the loading state correctly without extra markup.",
35
+ "Import from `@godxjp/ui/feedback` (not `@godxjp/ui/admin`). Both paths resolve but the canonical export is `feedback`."
36
+ ],
37
+ "useCases": [
38
+ "Inertia deferred props: the server streams the page shell immediately and defers the table data; render SkeletonTable until the prop arrives (`{!invoices ? <SkeletonTable rows={20} columns={7} /> : <DataTable data={invoices} columns={columns} />}`).",
39
+ "TanStack Query initial load via DataState: pass SkeletonTable as the `skeleton` prop so DataState shows the correct table shape during the query's loading state before switching to the populated DataTable.",
40
+ "Filter / search reset that unmounts and remounts DataTable: briefly show SkeletonTable while the new dataset fetches, preventing a flash of the empty state before results arrive.",
41
+ "Admin list pages (invoices, journal entries, partners) where the table has a known column count — tune `columns` to match so column widths feel stable and don't reflow on hydration.",
42
+ "Page-level Suspense boundaries: use SkeletonTable as the `fallback` of a React Suspense wrapping a lazy-loaded data table component.",
43
+ "Route prefetch / navigation transitions: render SkeletonTable in the destination slot while Inertia visits are in-flight, keeping perceived layout stable."
44
+ ]
45
+ }
@@ -0,0 +1,160 @@
1
+ {
2
+ "example": "{`import { FormField, Slider } from \"@godxjp/ui/data-entry\";\nimport { useState } from \"react\";\n\n// Money in a label goes through Intl, never a hand-written symbol: the symbol, the grouping and\n// the number of minor units all change with the locale and the currency.\nconst money = new Intl.NumberFormat(\"ja-JP\", { style: \"currency\", currency: \"JPY\" });\n\n// Single thumb, antd spelling: a plain number in, a plain number out.\nfunction VolumeSlider() {\n const [volume, setVolume] = useState(70);\n return (\n <FormField id=\"volume\" label={`音量: ${volume}%`}>\n <Slider\n id=\"volume\"\n value={volume}\n onChange={setVolume}\n tooltip={{ formatter: (value) => `${value}%` }}\n />\n </FormField>\n );\n}\n\n// Range: onChange carries both thumbs, onChangeComplete fires once on release.\nfunction PriceRangeSlider({ onApply }: { onApply: (range: number[]) => void }) {\n const [price, setPrice] = useState([2000, 8000]);\n return (\n <FormField\n id=\"price-range\"\n label={`価格: ${money.format(price[0])} 〜 ${money.format(price[1])}`}\n >\n <Slider\n id=\"price-range\"\n range\n value={price}\n onChange={setPrice}\n onChangeComplete={onApply}\n min={0}\n max={10000}\n step={500}\n minStepsBetweenThumbs={1}\n />\n </FormField>\n );\n}\n\n// Marks-only: the thumb can rest on a named point and nowhere else.\nfunction PlanSlider() {\n return (\n <FormField id=\"plan\" label=\"料金プラン\">\n <Slider\n id=\"plan\"\n step={null}\n marks={{ 0: \"無料\", 30: \"標準\", 70: \"上位\", 100: \"特別\" }}\n defaultValue={30}\n dots\n />\n </FormField>\n );\n}`}",
3
+ "group": "data-entry",
4
+ "importPath": "@godxjp/ui/data-entry",
5
+ "name": "Slider",
6
+ "props": [
7
+ {
8
+ "description": "A plain number for one thumb (antd), or an array. An array with no `range` still draws a thumb per entry — the Radix-era inference — and with nothing given the slider is ONE thumb at `min`.",
9
+ "name": "value / defaultValue",
10
+ "type": "number | number[]"
11
+ },
12
+ {
13
+ "description": "antd `onChange` — every change. The payload follows `range`: a number without it, an array with it. A `range` held in a boolean variable cannot say which at compile time, so that spelling takes `onValueChange` instead.",
14
+ "name": "onChange",
15
+ "type": "(value: number) => void | (value: number[]) => void"
16
+ },
17
+ {
18
+ "description": "antd `onChangeComplete` — once per finished gesture (pointer release, key press), and only when the value actually changed. Use it for the expensive work: a refetch, a save.",
19
+ "name": "onChangeComplete",
20
+ "type": "(value: number) => void | (value: number[]) => void"
21
+ },
22
+ {
23
+ "description": "The Radix-era callback, valid in every spelling: every change, always as the full array of thumbs.",
24
+ "name": "onValueChange",
25
+ "type": "(value: number[]) => void"
26
+ },
27
+ {
28
+ "description": "`onChangeComplete`'s array form. Fires exactly once per gesture.",
29
+ "name": "onValueCommit",
30
+ "type": "(value: number[]) => void"
31
+ },
32
+ {
33
+ "defaultValue": "false",
34
+ "description": "Two or more thumbs bounding a span. A DECLARATION, not an inference: a range whose value is still loading spans [min, max] instead of rendering as a point. The object form is antd's — `editable` lets a press on the rail ADD a thumb and Delete/Backspace remove one (between `minCount` and `maxCount`), `draggableTrack` drags the painted span and every thumb with it. `editable` wins over `draggableTrack` and switches off while any thumb is disabled, exactly as antd.",
35
+ "name": "range",
36
+ "type": "boolean | { editable?: boolean; minCount?: number; maxCount?: number; draggableTrack?: boolean }"
37
+ },
38
+ {
39
+ "defaultValue": "0",
40
+ "description": "The low end of the scale.",
41
+ "name": "min",
42
+ "type": "number"
43
+ },
44
+ {
45
+ "defaultValue": "100",
46
+ "description": "The high end of the scale.",
47
+ "name": "max",
48
+ "type": "number"
49
+ },
50
+ {
51
+ "defaultValue": "1",
52
+ "description": "Granularity. `null` is antd's marks-only mode: a thumb may then rest only on a mark, on `min` or on `max` — by pointer (nearest) and by arrow key (the next mark along).",
53
+ "name": "step",
54
+ "type": "number | null"
55
+ },
56
+ {
57
+ "defaultValue": "0",
58
+ "description": "The fewest steps two neighbouring thumbs may be apart. The Radix-era prop; it has no antd equivalent.",
59
+ "name": "minStepsBetweenThumbs",
60
+ "type": "number"
61
+ },
62
+ {
63
+ "description": "antd `marks` — labelled ticks along the rail, keyed by the value each sits on. A press on a mark's label moves the thumb to exactly that value. Prefer styling the label node (it is a ReactNode) over the object form's `style`.",
64
+ "name": "marks",
65
+ "type": "Record<number, ReactNode | { label?: ReactNode; style?: CSSProperties }>"
66
+ },
67
+ {
68
+ "defaultValue": "false",
69
+ "description": "antd `dots` — a tick at every `step`, or at every mark when `step={null}`. Ticks inside the painted span read as active.",
70
+ "name": "dots",
71
+ "type": "boolean"
72
+ },
73
+ {
74
+ "defaultValue": "true",
75
+ "description": "antd `included` — whether the painted span runs from the start to the thumb. `false` for a rail that only holds marks, where a filled span would assert a magnitude that is not there.",
76
+ "name": "included",
77
+ "type": "boolean"
78
+ },
79
+ {
80
+ "defaultValue": "false",
81
+ "description": "antd `tooltip` — the value bubble, rendered INSIDE the thumb so it rides every drag with no repositioning code. `open` forces it on or off, `formatter: null` removes it, `autoAdjustOverflow` (default true) flips it to the opposite side when the viewport leaves no room. A string/number `formatter` result is ALSO the thumb's `aria-valuetext`, so a ¥ or % slider is announced the way it is painted. `placement` `left`/`right` are the INLINE sides and mirror under RTL. antd's `getPopupContainer` has no counterpart: nothing is portalled.",
82
+ "name": "tooltip",
83
+ "type": "boolean | { open?: boolean; placement?: 'top' | 'bottom' | 'left' | 'right'; autoAdjustOverflow?: boolean; formatter?: ((value: number) => ReactNode) | null }"
84
+ },
85
+ {
86
+ "defaultValue": "false",
87
+ "description": "The whole slider, or one thumb each (antd's array form): `[true, false]` locks the first thumb of a range. A disabled thumb leaves the tab order and does not submit.",
88
+ "name": "disabled",
89
+ "type": "boolean | boolean[]"
90
+ },
91
+ {
92
+ "defaultValue": "'horizontal'",
93
+ "description": "Layout axis. Wins over `vertical` when both are given, as in antd 6. A vertical slider fills its container's height (and never collapses below --slider-vertical-min-block-size).",
94
+ "name": "orientation",
95
+ "type": "'horizontal' | 'vertical'"
96
+ },
97
+ {
98
+ "defaultValue": "false",
99
+ "description": "antd's boolean spelling of `orientation=\"vertical\"`.",
100
+ "name": "vertical",
101
+ "type": "boolean"
102
+ },
103
+ {
104
+ "defaultValue": "false",
105
+ "description": "antd `reverse` — run the scale the other way: `min` at the inline end of a horizontal rail, at the top of a vertical one. The arrow keys turn over with it.",
106
+ "name": "reverse",
107
+ "type": "boolean"
108
+ },
109
+ {
110
+ "description": "The Radix-era name for `reverse`. When both are given, `inverted` wins.",
111
+ "name": "inverted",
112
+ "type": "boolean"
113
+ },
114
+ {
115
+ "description": "Reading direction of a horizontal slider — which end is `min`, and which arrow increases. Defaults to the locale's direction (the I18nProvider AppProvider sets), so pass it only to pin one slider against its page.",
116
+ "name": "dir",
117
+ "type": "'ltr' | 'rtl'"
118
+ },
119
+ {
120
+ "description": "Native form field name. One thumb submits `name`, several submit `name[]` — one entry per thumb, no extra wiring.",
121
+ "name": "name",
122
+ "type": "string"
123
+ },
124
+ {
125
+ "description": "Associate the thumbs' inputs with a form elsewhere in the document, by id.",
126
+ "name": "form",
127
+ "type": "string"
128
+ }
129
+ ],
130
+ "related": [
131
+ "Progress — use Progress (not a disabled Slider) to show read-only progress; Slider with disabled is semantically a control, not a status indicator.",
132
+ "Input (type number) / NumberInput — free-form numeric entry; Slider is for a bounded range where dragging is the expected gesture.",
133
+ "Switch — for boolean on/off; Slider is for continuous or stepped numeric ranges.",
134
+ "Rating — for a small ordinal scale with symbols (1–5 stars) instead of a rail."
135
+ ],
136
+ "rules": [
137
+ 3,
138
+ 6,
139
+ 31
140
+ ],
141
+ "storyPath": "data-entry/Slider.stories.tsx",
142
+ "tagline": "Numeric slider on react-aria-components with the antd 6 API — one thumb over a point, or `range` for a span. `value` takes a plain number (antd) or a number[] (the Radix-era spelling); both still work.",
143
+ "usage": [
144
+ "DO: Use `onChange` for live UI and `onChangeComplete` for the expensive work — a refetch, a save. Commit fires once per gesture, and only when the value moved.",
145
+ "DO: Declare `range` when you want two thumbs. Leaving it to an array's length makes a range that is still loading render as a single point, and `onChange` then reports a number rather than a pair.",
146
+ "DO: Give `tooltip.formatter` to a slider whose number is not a bare count (¥, %, 件) — it formats the bubble AND becomes the spoken value, so a screen reader stops reading `50000`.",
147
+ "DO: Set `name` inside a native `<form>`; the slider submits without a form library.",
148
+ "DON'T: Reach for `step={null}` without `marks` — it leaves `min` and `max` as the only values a thumb can take.",
149
+ "DON'T: Hand-roll Track/Range/Thumb sub-parts — `<Slider />` is one leaf element and composes them itself.",
150
+ "DO: For a11y supply `aria-label` (or `aria-labelledby`, or a FormField label) — it names every thumb, with an index suffix once there is more than one."
151
+ ],
152
+ "useCases": [
153
+ "Budget / price-range filter: `range` with `onChangeComplete` so the list refetches on release, not on every pixel.",
154
+ "Single numeric setting: volume, zoom, a threshold — `defaultValue={50}` with a live readout beside it.",
155
+ "A scale whose valid points are named rather than regular: `marks` + `step={null}` (料金プラン, 温度帯, 段階評価).",
156
+ "Percentage allocation with `step={5}`, `dots` and `marks` at the decision points.",
157
+ "A tiered picker a user can shape: `range={{ editable: true, minCount: 1, maxCount: 4 }}` for splitting a scale into bands.",
158
+ "Read-only visual indicator — `disabled` with a controlled value; prefer Progress when nothing is ever adjustable."
159
+ ]
160
+ }