@godxjp/ui 28.12.0 → 29.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 (178) hide show
  1. package/agent/START-HERE.md +29 -10
  2. package/agent/components/Anchor.json +6 -1
  3. package/agent/components/AppLauncher.json +10 -0
  4. package/agent/components/AppShell.json +1 -1
  5. package/agent/components/AreaChart.json +19 -1
  6. package/agent/components/Attachments.json +26 -1
  7. package/agent/components/BarChart.json +11 -1
  8. package/agent/components/BranchScopePicker.json +10 -0
  9. package/agent/components/Cascader.json +6 -1
  10. package/agent/components/Checkbox.json +6 -0
  11. package/agent/components/CompactBarTrend.json +1 -1
  12. package/agent/components/CredentialReveal.json +21 -0
  13. package/agent/components/DataState.json +1 -1
  14. package/agent/components/DataTable.json +4 -4
  15. package/agent/components/FormField.json +1 -1
  16. package/agent/components/InfiniteQueryState.json +1 -1
  17. package/agent/components/Input.json +1 -1
  18. package/agent/components/InputOTP.json +35 -0
  19. package/agent/components/LineChart.json +20 -2
  20. package/agent/components/ListRow.json +1 -1
  21. package/agent/components/Masonry.json +1 -1
  22. package/agent/components/MasterDetail.json +1 -1
  23. package/agent/components/PasswordStrength.json +1 -1
  24. package/agent/components/PermissionMatrix.json +6 -1
  25. package/agent/components/SearchInput.json +5 -0
  26. package/agent/components/Select.json +1 -0
  27. package/agent/components/ServiceRolePanel.json +5 -0
  28. package/agent/components/Sidebar.json +1 -1
  29. package/agent/components/Switch.json +6 -0
  30. package/agent/components/Table.json +8 -3
  31. package/agent/components/Tabs.json +10 -0
  32. package/agent/components/ThemeScope.json +49 -0
  33. package/agent/components/TimeRangePicker.json +5 -0
  34. package/agent/components/Topbar.json +1 -0
  35. package/agent/components/TopbarItem.json +2 -1
  36. package/agent/components/Transfer.json +6 -1
  37. package/agent/components/TreeSelect.json +1 -1
  38. package/agent/components/Upload.json +5 -0
  39. package/agent/components/UploadCropDialog.json +1 -1
  40. package/agent/components/formatDate.json +1 -1
  41. package/agent/components-index.json +5 -0
  42. package/agent/components.json +297 -31
  43. package/agent/index.json +19 -9
  44. package/agent/llms.txt +10 -10
  45. package/agent/patterns/tenant-brand-color.json +28 -0
  46. package/agent/patterns-index.json +27 -0
  47. package/agent/patterns.json +28 -0
  48. package/agent/rules.json +15 -0
  49. package/agent/tokens.json +4965 -970
  50. package/dist/app/index.d.ts +3 -0
  51. package/dist/app/index.js +3 -0
  52. package/dist/app/tenant-theme.d.ts +80 -0
  53. package/dist/app/tenant-theme.js +154 -0
  54. package/dist/app/theme-axes.d.ts +14 -1
  55. package/dist/app/theme-axes.js +24 -31
  56. package/dist/components/charts/chart-cartesian.d.ts +5 -1
  57. package/dist/components/charts/chart-cartesian.js +15 -8
  58. package/dist/components/data-display/badge.d.ts +1 -1
  59. package/dist/components/data-display/badge.js +20 -2
  60. package/dist/components/data-display/carousel.js +4 -4
  61. package/dist/components/data-display/data-table.js +13 -2
  62. package/dist/components/data-display/permission-matrix.js +1 -1
  63. package/dist/components/data-display/table.d.ts +11 -2
  64. package/dist/components/data-display/table.js +18 -2
  65. package/dist/components/data-entry/control-appearance.d.ts +12 -6
  66. package/dist/components/data-entry/control-appearance.js +1 -1
  67. package/dist/components/data-entry/select.js +4 -3
  68. package/dist/components/feedback/dialog.js +6 -3
  69. package/dist/components/feedback/overlay-header-tone.d.ts +7 -0
  70. package/dist/components/feedback/overlay-header-tone.js +4 -4
  71. package/dist/components/feedback/sheet.d.ts +1 -1
  72. package/dist/components/feedback/sheet.js +6 -9
  73. package/dist/components/feedback/sonner.js +16 -3
  74. package/dist/components/general/button.js +22 -5
  75. package/dist/components/layout/affix.js +15 -1
  76. package/dist/components/layout/sidebar.js +7 -1
  77. package/dist/components/navigation/anchor.d.ts +1 -1
  78. package/dist/components/navigation/anchor.js +5 -4
  79. package/dist/components/navigation/app-setting-picker.js +1 -1
  80. package/dist/components/navigation/pagination.js +1 -1
  81. package/dist/components/navigation/tabs.js +15 -2
  82. package/dist/components/query/infinite-query-state.d.ts +22 -6
  83. package/dist/contracts/measurement.json +1 -1
  84. package/dist/i18n/messages/en.json +0 -697
  85. package/dist/i18n/messages/ja.json +0 -691
  86. package/dist/i18n/messages/vi.json +0 -691
  87. package/dist/lib/control-styles.d.ts +31 -11
  88. package/dist/lib/control-styles.js +6 -6
  89. package/dist/lib/overlay-portal.d.ts +20 -0
  90. package/dist/lib/overlay-portal.js +93 -0
  91. package/dist/props/components/app.prop.d.ts +12 -0
  92. package/dist/props/components/charts.prop.d.ts +30 -0
  93. package/dist/props/components/index.d.ts +1 -1
  94. package/dist/props/components/navigation.prop.d.ts +21 -2
  95. package/dist/props/components/query.prop.d.ts +36 -2
  96. package/dist/props/registry.d.ts +46 -1
  97. package/dist/props/registry.js +38 -3
  98. package/dist/styles/alert-layout.css +34 -14
  99. package/dist/styles/badge-layout.css +10 -6
  100. package/dist/styles/base.css +14 -5
  101. package/dist/styles/card-layout.css +19 -8
  102. package/dist/styles/chart-layout.css +22 -3
  103. package/dist/styles/control.css +165 -59
  104. package/dist/styles/data-display-layout.css +129 -36
  105. package/dist/styles/data-entry-layout.css +23 -87
  106. package/dist/styles/dialog-layout.css +49 -19
  107. package/dist/styles/float-button-layout.css +5 -5
  108. package/dist/styles/focus-ring.css +9 -5
  109. package/dist/styles/layout.css +42 -15
  110. package/dist/styles/logo-layout.css +1 -1
  111. package/dist/styles/motion.css +1 -1
  112. package/dist/styles/navigation-layout.css +90 -29
  113. package/dist/styles/shell-layout.css +63 -40
  114. package/dist/styles/table-layout.css +56 -17
  115. package/dist/styles/text-layout.css +13 -4
  116. package/dist/styles/toggle.css +8 -2
  117. package/dist/tokens/components/actions.css +1 -1
  118. package/dist/tokens/components/attachments.css +4 -4
  119. package/dist/tokens/components/badge.css +4 -4
  120. package/dist/tokens/components/callout.css +1 -1
  121. package/dist/tokens/components/card.css +9 -4
  122. package/dist/tokens/components/chart.css +10 -1
  123. package/dist/tokens/components/chat-bubble.css +1 -1
  124. package/dist/tokens/components/control.css +28 -10
  125. package/dist/tokens/components/conversations.css +2 -1
  126. package/dist/tokens/components/data-display.css +12 -7
  127. package/dist/tokens/components/descriptions.css +1 -1
  128. package/dist/tokens/components/draggable-panel.css +1 -1
  129. package/dist/tokens/components/feedback.css +28 -8
  130. package/dist/tokens/components/float-button.css +1 -1
  131. package/dist/tokens/components/legal-document.css +1 -1
  132. package/dist/tokens/components/logo.css +1 -1
  133. package/dist/tokens/components/mega-menu.css +5 -3
  134. package/dist/tokens/components/navigation.css +21 -7
  135. package/dist/tokens/components/segmented.css +8 -3
  136. package/dist/tokens/components/shell.css +19 -5
  137. package/dist/tokens/components/table.css +9 -1
  138. package/dist/tokens/components/thought-chain.css +1 -1
  139. package/dist/tokens/components/toggle.css +2 -0
  140. package/dist/tokens/components/tree.css +3 -1
  141. package/dist/tokens/components/upload.css +6 -6
  142. package/dist/tokens/components/welcome.css +1 -1
  143. package/dist/tokens/foundation.css +28 -1
  144. package/docs/COMPOSITION-VS-COMPONENT.md +31 -0
  145. package/docs/CUSTOMER-THEMING.md +637 -1
  146. package/docs/DESIGN-AUTHORITY.md +13 -0
  147. package/docs/FRAME-COVERAGE-REPORT.md +3 -2
  148. package/docs/GLASSMORPHISM-STANDARD.md +196 -0
  149. package/docs/THEME-API-COVERAGE.md +538 -0
  150. package/docs/TOKEN-RESOLUTION.md +195 -0
  151. package/docs/TOKENS.md +63 -24
  152. package/docs/asset-modules.d.ts +7 -0
  153. package/docs/data-display/charts.tsx +80 -0
  154. package/docs/data-display/data-table/index.tsx +30 -0
  155. package/docs/data-display/popover.tsx +1 -1
  156. package/docs/data-display/table.tsx +52 -0
  157. package/docs/feedback/sheet.tsx +10 -10
  158. package/docs/foundation/density.tsx +4 -4
  159. package/docs/i18n/messages/en.json +1201 -0
  160. package/docs/i18n/messages/ja.json +1195 -0
  161. package/docs/i18n/messages/vi.json +1195 -0
  162. package/docs/layout/account-chip.tsx +2 -2
  163. package/docs/layout/responsive-grid.tsx +1 -1
  164. package/docs/navigation/toolbar.tsx +20 -12
  165. package/docs/providers/theme-scope.tsx +186 -0
  166. package/docs/showcase/caimono-price-comparison.tsx +911 -0
  167. package/docs/showcase/case4-login.tsx +2 -2
  168. package/docs/showcase/marketing-page.tsx +3 -2
  169. package/docs/showcase/permission-matrix.tsx +13 -5
  170. package/docs/showcase/table-pagination.tsx +2 -1
  171. package/docs/showcase/tenant-brand-color.tsx +338 -0
  172. package/docs/showcase/theme-customization.tsx +2 -1
  173. package/docs/showcase/theme-lab.tsx +2125 -0
  174. package/docs/themes/flat.css +462 -0
  175. package/docs/themes/glassmorphism.css +958 -0
  176. package/docs/themes/index.ts +200 -0
  177. package/package.json +4 -3
  178. package/scripts/explain-token.mjs +382 -0
@@ -20,8 +20,8 @@ export default function Demo() {
20
20
  subtitle="サインイン中のユーザー(アバター・名前・1 アクション)"
21
21
  extra={
22
22
  <>
23
- <Select defaultValue="ja">
24
- <SelectTrigger width="auto" aria-label="言語">
23
+ <Select aria-label="言語" defaultValue="ja">
24
+ <SelectTrigger width="auto">
25
25
  <SelectValue />
26
26
  </SelectTrigger>
27
27
  <SelectContent>
@@ -333,7 +333,7 @@ export default function Demo() {
333
333
  name={`priority-${task.id}`}
334
334
  defaultValue={task.priority}
335
335
  >
336
- <SelectTrigger aria-label={`${task.id} 優先度`} size="sm">
336
+ <SelectTrigger size="sm">
337
337
  <SelectValue />
338
338
  </SelectTrigger>
339
339
  <SelectContent>
@@ -122,8 +122,12 @@ export default function Demo() {
122
122
  className="w-full sm:w-56"
123
123
  />
124
124
  <ToolbarGroup label="ステータス">
125
- <Select value={memberStatus} onValueChange={setMemberStatus}>
126
- <SelectTrigger aria-label="ステータス">
125
+ <Select
126
+ aria-label="ステータス"
127
+ value={memberStatus}
128
+ onValueChange={setMemberStatus}
129
+ >
130
+ <SelectTrigger>
127
131
  <SelectValue />
128
132
  </SelectTrigger>
129
133
  <SelectContent>
@@ -135,8 +139,8 @@ export default function Demo() {
135
139
  </Select>
136
140
  </ToolbarGroup>
137
141
  <ToolbarGroup label="権限">
138
- <Select value={memberRole} onValueChange={setMemberRole}>
139
- <SelectTrigger aria-label="権限">
142
+ <Select aria-label="権限" value={memberRole} onValueChange={setMemberRole}>
143
+ <SelectTrigger>
140
144
  <SelectValue placeholder="すべて" />
141
145
  </SelectTrigger>
142
146
  <SelectContent>
@@ -238,8 +242,8 @@ export default function Demo() {
238
242
  onSearch={setSearch}
239
243
  />
240
244
  <ToolbarGroup label="ステータス">
241
- <Select value={status} onValueChange={setStatus}>
242
- <SelectTrigger aria-label="ステータス">
245
+ <Select aria-label="ステータス" value={status} onValueChange={setStatus}>
246
+ <SelectTrigger>
243
247
  <SelectValue placeholder="すべて" />
244
248
  </SelectTrigger>
245
249
  <SelectContent>
@@ -251,8 +255,12 @@ export default function Demo() {
251
255
  </Select>
252
256
  </ToolbarGroup>
253
257
  <ToolbarGroup label="会計期間">
254
- <Select value={fiscalPeriod} onValueChange={setFiscalPeriod}>
255
- <SelectTrigger aria-label="会計期間">
258
+ <Select
259
+ aria-label="会計期間"
260
+ value={fiscalPeriod}
261
+ onValueChange={setFiscalPeriod}
262
+ >
263
+ <SelectTrigger>
256
264
  <SelectValue placeholder="期間を選択" />
257
265
  </SelectTrigger>
258
266
  <SelectContent>
@@ -303,8 +311,8 @@ export default function Demo() {
303
311
  <CardContent>
304
312
  <Toolbar hasActiveFilters={department !== "all"} onClear={() => setDepartment("all")}>
305
313
  <ToolbarGroup label="部門">
306
- <Select value={department} onValueChange={setDepartment}>
307
- <SelectTrigger aria-label="部門">
314
+ <Select aria-label="部門" value={department} onValueChange={setDepartment}>
315
+ <SelectTrigger>
308
316
  <SelectValue placeholder="部門を選択" />
309
317
  </SelectTrigger>
310
318
  <SelectContent>
@@ -317,8 +325,8 @@ export default function Demo() {
317
325
  </Select>
318
326
  </ToolbarGroup>
319
327
  <ToolbarGroup label="勘定科目">
320
- <Select defaultValue="all">
321
- <SelectTrigger aria-label="勘定科目">
328
+ <Select aria-label="勘定科目" defaultValue="all">
329
+ <SelectTrigger>
322
330
  <SelectValue placeholder="科目を選択" />
323
331
  </SelectTrigger>
324
332
  <SelectContent>
@@ -0,0 +1,186 @@
1
+ import { ThemeScope, tenantTheme } from "@godxjp/ui/app";
2
+ import {
3
+ Badge,
4
+ Card,
5
+ CardContent,
6
+ CardDescription,
7
+ CardHeader,
8
+ CardTitle,
9
+ Popover,
10
+ PopoverContent,
11
+ PopoverTrigger,
12
+ } from "@godxjp/ui/data-display";
13
+ import { Select } from "@godxjp/ui/data-entry";
14
+ import {
15
+ Dialog,
16
+ DialogBody,
17
+ DialogContent,
18
+ DialogDescription,
19
+ DialogFooter,
20
+ DialogHeader,
21
+ DialogTitle,
22
+ DialogTrigger,
23
+ Toaster,
24
+ toast,
25
+ } from "@godxjp/ui/feedback";
26
+ import { Button, Text } from "@godxjp/ui/general";
27
+ import { useTranslation } from "@godxjp/ui/i18n";
28
+ import { Flex, PageContainer } from "@godxjp/ui/layout";
29
+
30
+ /**
31
+ * ThemeScope · the region whose overlays keep the region's tokens (gh#877).
32
+ *
33
+ * The screen is a review queue handled on behalf of two customers at once — the case that makes
34
+ * the defect visible, because both regions are on the page together and every overlay they open
35
+ * used to come back in the package's own violet.
36
+ *
37
+ * Each region is themed a DIFFERENT way on purpose: the first from `tenantTheme(hex).vars`, the
38
+ * second from a `.dark` class. ThemeScope has no theme prop and reads neither — it reads the
39
+ * COMPUTED tokens at its own element, which is why both work and why a `[data-tenant]` rule in a
40
+ * consumer's own stylesheet works too. Open a Dialog, a Select listbox, a Popover or a toast from
41
+ * either region: all of them are painted by that region.
42
+ *
43
+ * Composed only from real @godxjp/ui components.
44
+ */
45
+
46
+ const REVIEWERS = [
47
+ { value: "sato", label: "Sakura Sato" },
48
+ { value: "tran", label: "Trần Minh" },
49
+ { value: "novak", label: "Ana Novák" },
50
+ ];
51
+
52
+ function ReviewRegion({ name }: { name: string }) {
53
+ const { t } = useTranslation();
54
+
55
+ return (
56
+ <Card>
57
+ <CardHeader>
58
+ <CardTitle level={2}>{name}</CardTitle>
59
+ <CardDescription>{t("themeScopeDocs.region.description")}</CardDescription>
60
+ </CardHeader>
61
+ <CardContent>
62
+ <Flex direction="col" gap="md">
63
+ <Flex gap="sm" align="center" wrap>
64
+ <Badge>{t("themeScopeDocs.region.pending")}</Badge>
65
+ <Text tone="muted">{t("themeScopeDocs.region.queue")}</Text>
66
+ </Flex>
67
+
68
+ <Select
69
+ aria-label={t("themeScopeDocs.region.reviewerLabel")}
70
+ placeholder={t("themeScopeDocs.region.reviewerPlaceholder")}
71
+ options={REVIEWERS}
72
+ />
73
+
74
+ <Flex gap="sm" wrap>
75
+ <Dialog>
76
+ <DialogTrigger asChild>
77
+ <Button>{t("themeScopeDocs.region.approve")}</Button>
78
+ </DialogTrigger>
79
+ <DialogContent>
80
+ <DialogHeader>
81
+ <DialogTitle>{t("themeScopeDocs.dialog.title")}</DialogTitle>
82
+ <DialogDescription>{t("themeScopeDocs.dialog.description")}</DialogDescription>
83
+ </DialogHeader>
84
+ <DialogBody>
85
+ <Text>{t("themeScopeDocs.dialog.body")}</Text>
86
+ </DialogBody>
87
+ <DialogFooter>
88
+ <Button onClick={() => toast.success(t("themeScopeDocs.toast.approved"))}>
89
+ {t("themeScopeDocs.dialog.confirm")}
90
+ </Button>
91
+ </DialogFooter>
92
+ </DialogContent>
93
+ </Dialog>
94
+
95
+ <Popover>
96
+ <PopoverTrigger asChild>
97
+ <Button variant="outline">{t("themeScopeDocs.region.history")}</Button>
98
+ </PopoverTrigger>
99
+ <PopoverContent>
100
+ <Text>{t("themeScopeDocs.popover.body")}</Text>
101
+ </PopoverContent>
102
+ </Popover>
103
+
104
+ <Button variant="ghost" onClick={() => toast(t("themeScopeDocs.toast.saved"))}>
105
+ {t("themeScopeDocs.region.notify")}
106
+ </Button>
107
+ </Flex>
108
+ </Flex>
109
+ </CardContent>
110
+ </Card>
111
+ );
112
+ }
113
+
114
+ export default function Demo() {
115
+ const { t } = useTranslation();
116
+ const acme = tenantTheme("#0076bd");
117
+
118
+ return (
119
+ <PageContainer
120
+ title={t("themeScopeDocs.page.title")}
121
+ subtitle={t("themeScopeDocs.page.subtitle")}
122
+ >
123
+ <Flex direction="col" gap="lg">
124
+ <Card>
125
+ <CardHeader>
126
+ <CardTitle level={2}>{t("themeScopeDocs.intro.title")}</CardTitle>
127
+ <CardDescription>{t("themeScopeDocs.intro.description")}</CardDescription>
128
+ </CardHeader>
129
+ <CardContent>
130
+ <Text as="p" tone="muted">
131
+ {t("themeScopeDocs.intro.body")}
132
+ </Text>
133
+ </CardContent>
134
+ </Card>
135
+
136
+ {/* Themed from a customer hex. The Toaster lives inside the region, so its toasts do too. */}
137
+ <ThemeScope style={acme.vars} data-tenant="acme">
138
+ <ReviewRegion name={t("themeScopeDocs.acme.name")} />
139
+ <Toaster />
140
+
141
+ {/*
142
+ NESTED, and themed by a CLASS rather than a style: the night-shift console stays dark
143
+ whatever the page does. The INNER scope wins for its overlays — measured, its Dialog
144
+ reads --card 48 8% 12% (dark) where the outer region reads 60 33% 99%.
145
+
146
+ `acme.vars` is repeated here on purpose, and that is worth knowing: `.dark` RESTATES the
147
+ whole brand ramp, so an inner scope that only adds the class would hand its overlays the
148
+ package's dark violet rather than the customer's blue. Inheritance carries what the
149
+ inner scope does not redeclare; `.dark` redeclares this.
150
+ */}
151
+ <ThemeScope className="dark" style={acme.vars}>
152
+ <ReviewRegion name={t("themeScopeDocs.night.name")} />
153
+ </ThemeScope>
154
+ </ThemeScope>
155
+
156
+ <Card>
157
+ <CardHeader>
158
+ <CardTitle level={2}>{t("themeScopeDocs.without.title")}</CardTitle>
159
+ <CardDescription>{t("themeScopeDocs.without.description")}</CardDescription>
160
+ </CardHeader>
161
+ <CardContent>
162
+ {/* No ThemeScope: the region is themed, its overlays are not. This is the defect. */}
163
+ <div style={acme.vars} data-tenant="acme-unscoped">
164
+ <Dialog>
165
+ <DialogTrigger asChild>
166
+ <Button>{t("themeScopeDocs.without.open")}</Button>
167
+ </DialogTrigger>
168
+ <DialogContent>
169
+ <DialogHeader>
170
+ <DialogTitle>{t("themeScopeDocs.without.dialogTitle")}</DialogTitle>
171
+ <DialogDescription>
172
+ {t("themeScopeDocs.without.dialogDescription")}
173
+ </DialogDescription>
174
+ </DialogHeader>
175
+ <DialogBody>
176
+ <Text>{t("themeScopeDocs.without.dialogBody")}</Text>
177
+ </DialogBody>
178
+ </DialogContent>
179
+ </Dialog>
180
+ </div>
181
+ </CardContent>
182
+ </Card>
183
+ </Flex>
184
+ </PageContainer>
185
+ );
186
+ }