@godxjp/ui 19.2.0 → 19.4.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 (144) hide show
  1. package/dist/components/data-display/badge.d.ts +26 -2
  2. package/dist/components/data-display/badge.js +20 -5
  3. package/dist/components/data-display/index.d.ts +2 -0
  4. package/dist/components/data-display/index.js +2 -0
  5. package/dist/components/data-display/popover.d.ts +13 -1
  6. package/dist/components/data-display/popover.js +3 -1
  7. package/dist/components/data-display/table.d.ts +19 -2
  8. package/dist/components/data-display/table.js +4 -1
  9. package/dist/components/data-display/timeline-grid.d.ts +18 -0
  10. package/dist/components/data-display/timeline-grid.js +222 -0
  11. package/dist/components/data-entry/cascader.js +4 -6
  12. package/dist/components/data-entry/checkbox.js +1 -1
  13. package/dist/components/data-entry/search-select.js +5 -7
  14. package/dist/components/data-entry/select.js +32 -28
  15. package/dist/components/data-entry/tree-select.js +4 -6
  16. package/dist/components/general/inert-background.d.ts +5 -0
  17. package/dist/components/general/inert-background.js +48 -0
  18. package/dist/components/layout/auth-shell.d.ts +4 -2
  19. package/dist/components/layout/auth-shell.js +7 -1
  20. package/dist/components/layout/centered-shell.d.ts +2 -2
  21. package/dist/components/layout/flex.d.ts +1 -1
  22. package/dist/components/layout/flex.js +2 -1
  23. package/dist/components/layout/index.d.ts +3 -0
  24. package/dist/components/layout/index.js +2 -0
  25. package/dist/components/layout/mobile-shell.d.ts +21 -0
  26. package/dist/components/layout/mobile-shell.js +43 -0
  27. package/dist/components/layout/sidebar-link.d.ts +1 -1
  28. package/dist/components/navigation/context-menu.js +13 -9
  29. package/dist/components/navigation/dropdown-menu.js +17 -13
  30. package/dist/inertia/index.d.ts +1 -1
  31. package/dist/lib/variants.d.ts +3 -3
  32. package/dist/lib/variants.js +1 -0
  33. package/dist/props/components/data-display.prop.d.ts +72 -0
  34. package/dist/props/components/data-entry.prop.d.ts +1 -1
  35. package/dist/props/components/layout.prop.d.ts +93 -6
  36. package/dist/props/registry.d.ts +113 -2
  37. package/dist/props/registry.js +155 -1
  38. package/dist/props/vocabulary/data.prop.d.ts +6 -0
  39. package/dist/props/vocabulary/index.d.ts +3 -3
  40. package/dist/props/vocabulary/layout.prop.d.ts +17 -2
  41. package/dist/props/vocabulary/shared.prop.d.ts +7 -0
  42. package/dist/styles/badge-layout.css +15 -0
  43. package/dist/styles/control.css +18 -1
  44. package/dist/styles/data-display-layout.css +167 -0
  45. package/dist/styles/layout.css +7 -0
  46. package/dist/styles/shell-layout.css +148 -0
  47. package/dist/styles/table-layout.css +23 -4
  48. package/dist/tokens/components/badge.css +8 -0
  49. package/dist/tokens/components/control.css +1 -0
  50. package/dist/tokens/components/data-display.css +20 -0
  51. package/dist/tokens/components/shell.css +22 -0
  52. package/dist/tokens/components/table.css +2 -0
  53. package/docs/SPACING.md +19 -6
  54. package/docs/charts/compact-bar-trend.tsx +5 -6
  55. package/docs/data-display/avatar.tsx +7 -9
  56. package/docs/data-display/badge.tsx +37 -1
  57. package/docs/data-display/card/index.tsx +6 -4
  58. package/docs/data-display/carousel.tsx +8 -4
  59. package/docs/data-display/data-table/examples/approval-queue.tsx +1 -1
  60. package/docs/data-display/data-table/examples/grid-features.tsx +1 -1
  61. package/docs/data-display/data-table/index.tsx +1 -1
  62. package/docs/data-display/permission-matrix.tsx +15 -11
  63. package/docs/data-display/popover.tsx +2 -1
  64. package/docs/data-display/scroll-area.tsx +108 -76
  65. package/docs/data-display/table.tsx +2 -2
  66. package/docs/data-display/timeline-grid.tsx +119 -0
  67. package/docs/data-entry/branch-scope-picker.tsx +1 -1
  68. package/docs/data-entry/calendar.tsx +1 -1
  69. package/docs/data-entry/checkbox.tsx +1 -1
  70. package/docs/data-entry/country-picker-recipe.tsx +11 -6
  71. package/docs/data-entry/form-field/index.tsx +33 -29
  72. package/docs/data-entry/form-root.tsx +1 -1
  73. package/docs/data-entry/input-otp.tsx +1 -1
  74. package/docs/data-entry/password-input.tsx +1 -5
  75. package/docs/data-entry/select.tsx +7 -7
  76. package/docs/data-entry/textarea.tsx +3 -3
  77. package/docs/data-entry/toggle-count.tsx +1 -1
  78. package/docs/feedback/alert.tsx +1 -1
  79. package/docs/feedback/banner.tsx +1 -1
  80. package/docs/feedback/sheet.tsx +112 -102
  81. package/docs/feedback/skeleton.tsx +2 -2
  82. package/docs/foundation/colors.tsx +8 -6
  83. package/docs/foundation/email-tokens.tsx +83 -66
  84. package/docs/foundation/radius-shadow.tsx +13 -11
  85. package/docs/general/activity.tsx +1 -1
  86. package/docs/layout/app-shell.tsx +2 -2
  87. package/docs/layout/aspect-ratio.tsx +30 -14
  88. package/docs/layout/auth-account-summary.tsx +1 -1
  89. package/docs/layout/auth-recovery/examples/mobile-390.tsx +1 -1
  90. package/docs/layout/auth-recovery/examples/password-recovery.tsx +0 -2
  91. package/docs/layout/auth-shell-context.tsx +1 -1
  92. package/docs/layout/auth-shell-device.tsx +2 -2
  93. package/docs/layout/auth-shell-registration.tsx +1 -1
  94. package/docs/layout/auth-shell.tsx +1 -1
  95. package/docs/layout/flex.tsx +6 -2
  96. package/docs/layout/master-detail.tsx +2 -2
  97. package/docs/layout/mobile-shell.tsx +101 -0
  98. package/docs/layout/page-container.tsx +15 -7
  99. package/docs/layout/responsive-grid.tsx +12 -4
  100. package/docs/layout/separator.tsx +2 -2
  101. package/docs/layout/service-role-panel.tsx +1 -1
  102. package/docs/layout/sidebar.tsx +175 -152
  103. package/docs/layout/split-pane.tsx +45 -28
  104. package/docs/layout/topbar.tsx +19 -23
  105. package/docs/navigation/app-setting-picker.tsx +5 -4
  106. package/docs/navigation/breadcrumb.tsx +12 -5
  107. package/docs/navigation/context-menu.tsx +10 -4
  108. package/docs/navigation/filter-bar.tsx +2 -2
  109. package/docs/navigation/navigation-menu.tsx +89 -96
  110. package/docs/navigation/pagination.tsx +2 -2
  111. package/docs/navigation/steps.tsx +13 -11
  112. package/docs/navigation/tabs.tsx +27 -21
  113. package/docs/navigation/toolbar.tsx +15 -15
  114. package/docs/providers/format-date.tsx +2 -2
  115. package/docs/showcase/acme-portal.tsx +41 -28
  116. package/docs/showcase/acme-website.tsx +67 -61
  117. package/docs/showcase/case1-warehouse-dashboard.tsx +46 -31
  118. package/docs/showcase/case2-employee-me.tsx +33 -36
  119. package/docs/showcase/case3-approval-workflow.tsx +34 -32
  120. package/docs/showcase/case4-login.tsx +95 -101
  121. package/docs/showcase/case5-shift-calendar.tsx +182 -281
  122. package/docs/showcase/case6-agency-handy.tsx +514 -470
  123. package/docs/showcase/futurelastic-web.tsx +32 -29
  124. package/docs/showcase/org-switcher.tsx +20 -13
  125. package/docs/showcase/permission-matrix.tsx +20 -17
  126. package/docs/showcase/public-landing.tsx +1 -1
  127. package/docs/showcase/settings-account-sections.tsx +2 -2
  128. package/docs/showcase/settings-security-mfa.tsx +3 -3
  129. package/docs/showcase/table-approval-queue.tsx +1 -1
  130. package/docs/showcase/table-bulk-actions.tsx +49 -52
  131. package/docs/showcase/table-conditional-format.tsx +9 -9
  132. package/docs/showcase/table-crud-list.tsx +4 -4
  133. package/docs/showcase/table-density.tsx +49 -42
  134. package/docs/showcase/table-expandable-rows.tsx +112 -100
  135. package/docs/showcase/table-filter-chips.tsx +78 -71
  136. package/docs/showcase/table-footer-totals.tsx +30 -23
  137. package/docs/showcase/table-grouped-subtotals.tsx +31 -25
  138. package/docs/showcase/table-master-detail.tsx +27 -24
  139. package/docs/showcase/table-pagination.tsx +34 -27
  140. package/docs/showcase/table-states.tsx +42 -34
  141. package/docs/showcase/table-sticky-columns.tsx +11 -7
  142. package/docs/showcase/table-tree-rows.tsx +22 -15
  143. package/docs/showcase/table-view-tabs.tsx +12 -14
  144. package/package.json +7 -7
@@ -215,34 +215,38 @@ export default function Demo() {
215
215
  </CardDescription>
216
216
  </CardHeader>
217
217
  <CardContent>
218
- <div className="max-w-3xl">
219
- <Form layout="horizontal" labelWidth="12rem" controlWidth="28rem">
220
- <FormField
221
- id="matrix-ja"
222
- label="請求書の送付先メールアドレス"
223
- required
224
- helper="確認メールを送信します"
225
- >
226
- <Input id="matrix-ja" defaultValue="billing@example.jp" />
227
- </FormField>
228
- <FormField
229
- id="matrix-vi"
230
- label="Địa chỉ email nhận hóa đơn và thông báo"
231
- controlWidth="20rem"
232
- >
233
- <Input id="matrix-vi" defaultValue="ketoan@example.vn" />
234
- </FormField>
235
- </Form>
236
- </div>
237
- <div className="mt-6 max-w-80 border p-3" dir="rtl" lang="ar">
238
- <FormField
239
- id="matrix-rtl"
240
- label="البريد الإلكتروني لاستلام الفاتورة"
241
- helper="سيتم إرسال رسالة تأكيد"
242
- >
243
- <Input id="matrix-rtl" type="email" placeholder="name@example.com" />
244
- </FormField>
245
- </div>
218
+ <Flex direction="col" gap="lg">
219
+ <div className="max-w-3xl">
220
+ <Form layout="horizontal" labelWidth="12rem" controlWidth="28rem">
221
+ <FormField
222
+ id="matrix-ja"
223
+ label="請求書の送付先メールアドレス"
224
+ required
225
+ helper="確認メールを送信します"
226
+ >
227
+ <Input id="matrix-ja" defaultValue="billing@example.jp" />
228
+ </FormField>
229
+ <FormField
230
+ id="matrix-vi"
231
+ label="Địa chỉ email nhận hóa đơn và thông báo"
232
+ controlWidth="20rem"
233
+ >
234
+ <Input id="matrix-vi" defaultValue="ketoan@example.vn" />
235
+ </FormField>
236
+ </Form>
237
+ </div>
238
+ <Card className="max-w-80" dir="rtl" lang="ar">
239
+ <CardContent>
240
+ <FormField
241
+ id="matrix-rtl"
242
+ label="البريد الإلكتروني لاستلام الفاتورة"
243
+ helper="سيتم إرسال رسالة تأكيد"
244
+ >
245
+ <Input id="matrix-rtl" type="email" placeholder="name@example.com" />
246
+ </FormField>
247
+ </CardContent>
248
+ </Card>
249
+ </Flex>
246
250
  </CardContent>
247
251
  </Card>
248
252
 
@@ -308,7 +312,7 @@ export default function Demo() {
308
312
  <SheetHeader>
309
313
  <SheetTitle>請求先設定</SheetTitle>
310
314
  </SheetHeader>
311
- <Form className="mt-4">
315
+ <Form>
312
316
  <FormField id="sheet-name" label="宛名" required>
313
317
  <Input id="sheet-name" />
314
318
  </FormField>
@@ -92,7 +92,7 @@ export default function Demo() {
92
92
  </FormRoot>
93
93
  </CardContent>
94
94
  </Card>
95
- <p className="text-muted-foreground mt-4 text-sm">
95
+ <p className="text-muted-foreground text-sm">
96
96
  warning state、form-level error-summary から field への focus link、touched-only timing は
97
97
  public wrapper API では未提供。React Hook Form の設定または consumer composition として
98
98
  UNTESTED。
@@ -140,7 +140,7 @@ export default function Demo() {
140
140
  </CardContent>
141
141
  </Card>
142
142
 
143
- {/* align — the centred challenge, without a consumer wrapper div (gh#12) */}
143
+ {/* Align — the centred challenge, without a consumer wrapper div */}
144
144
  <Card>
145
145
  <CardHeader>
146
146
  <CardTitle level={2}>中央寄せ(align=&quot;center&quot;)</CardTitle>
@@ -95,11 +95,7 @@ export default function Demo() {
95
95
  </FormField>
96
96
  </CardContent>
97
97
  </Card>
98
- <PasswordInput
99
- size="sm"
100
- placeholder="Compact tier (sm)"
101
- aria-label="Password (sm)"
102
- />
98
+ <PasswordInput size="sm" placeholder="Compact tier (sm)" aria-label="Password (sm)" />
103
99
  </Flex>
104
100
  </PageContainer>
105
101
  );
@@ -262,18 +262,18 @@ export default function Demo() {
262
262
  placeholder="担当者を選択"
263
263
  options={people}
264
264
  renderOption={(option) => (
265
- <div className="flex w-full items-center gap-2">
265
+ <Flex align="center" gap="sm" className="w-full">
266
266
  {avatarFor(option.label)}
267
- <div className="flex min-w-0 flex-col">
267
+ <Flex direction="col" gap="xs" className="min-w-0">
268
268
  <span className="truncate text-sm font-medium">{option.label}</span>
269
269
  <span className="text-muted-foreground truncate text-xs">
270
270
  {option.sublabel}
271
271
  </span>
272
- </div>
272
+ </Flex>
273
273
  <Badge tone="success" className="ms-auto">
274
274
  VIP
275
275
  </Badge>
276
- </div>
276
+ </Flex>
277
277
  )}
278
278
  />
279
279
  </FormField>
@@ -300,13 +300,13 @@ export default function Demo() {
300
300
  placeholder="担当者を選択"
301
301
  options={people}
302
302
  labelRender={({ label }) => (
303
- <span className="flex items-center gap-2">
303
+ <Flex align="center" gap="sm">
304
304
  {avatarFor(String(label))}
305
305
  <span className="truncate">{label}</span>
306
- <Badge tone="info" icon={null} className="ms-1">
306
+ <Badge tone="info" icon={null}>
307
307
  担当
308
308
  </Badge>
309
- </span>
309
+ </Flex>
310
310
  )}
311
311
  />
312
312
  </FormField>
@@ -18,7 +18,7 @@ const SEED_MESSAGES: Message[] = [
18
18
  ];
19
19
 
20
20
  /**
21
- * The godx-chatter composer (gh#310). One line at rest, grows line by line, scrolls itself past
21
+ * The godx-chatter composer. One line at rest, grows line by line, scrolls itself past
22
22
  * eight rows, and collapses back to one line the moment the post is sent — the send button just
23
23
  * resets the controlled value, and `autoGrow` follows it without a single line of layout code.
24
24
  */
@@ -58,7 +58,7 @@ function Composer() {
58
58
  value={draft}
59
59
  onChange={(event) => setDraft(event.target.value)}
60
60
  />
61
- <Flex direction="row" justify="end" gap="sm" className="px-2 pb-2">
61
+ <Flex direction="row" justify="end" gap="sm">
62
62
  <Button size="sm" onClick={send}>
63
63
  送信
64
64
  </Button>
@@ -109,7 +109,7 @@ export default function Demo() {
109
109
  aria-label="サーフェス内のテキストエリア"
110
110
  placeholder="メッセージを入力..."
111
111
  />
112
- <Flex direction="row" justify="end" className="px-2 pb-2">
112
+ <Flex direction="row" justify="end">
113
113
  <Button size="sm">送信</Button>
114
114
  </Flex>
115
115
  </CardContent>
@@ -14,7 +14,7 @@ import { Button, Text } from "@godxjp/ui/general";
14
14
  import { Flex, PageContainer } from "@godxjp/ui/layout";
15
15
 
16
16
  /**
17
- * Toggle `count` — the counted, PRESSED chip (gh#312).
17
+ * Toggle `count` — the counted, PRESSED chip.
18
18
  *
19
19
  * `Button` owns the counter-pill vocabulary (`count` / `overflowCount` / `showZero`) and `Toggle`
20
20
  * owns the pressed state, so a faceted filter chip ("未対応 42", selected or not) and a reaction
@@ -139,7 +139,7 @@ export default function Demo() {
139
139
  </CardContent>
140
140
  </Card>
141
141
 
142
- {/* Banner — the SAME component at the page measure (gh#255). variant="banner" swaps only
142
+ {/* Banner — the SAME component at the page measure. variant="banner" swaps only
143
143
  the box: square, edge-to-edge, ruled on the block-end edge, measured by the --banner-*
144
144
  tokens. Every tone, the icon, the actions grid and the dismiss ✕ are inherited from the
145
145
  inline alert above, so there is nothing new to learn and nothing duplicated.
@@ -5,7 +5,7 @@ import { Button } from "@godxjp/ui/general";
5
5
  import { Flex, PageContainer } from "@godxjp/ui/layout";
6
6
 
7
7
  /**
8
- * Banner · full-bleed page/shell attention strip (godxjp-ui#255) — the Alert
8
+ * Banner · full-bleed page/shell attention strip — the Alert
9
9
  * primitive with the structural axis fixed to variant="banner". Persistent,
10
10
  * page/shell-scoped, at most one per surface. tone owns colour + icon +
11
11
  * live-region politeness; onDismiss renders the built-in dismiss (last in focus
@@ -116,68 +116,70 @@ export default function Demo() {
116
116
  subtitle="条件を組み合わせて仕訳を絞り込みます。"
117
117
  extra={<Badge tone="info">3 条件</Badge>}
118
118
  />
119
- <SheetBody className="flex flex-col gap-4">
120
- <FormField id="filter-account" label="勘定科目">
121
- <Select value={account} onValueChange={setAccount}>
122
- <SelectTrigger id="filter-account" aria-label="勘定科目">
123
- <SelectValue placeholder="すべての勘定科目" />
124
- </SelectTrigger>
125
- <SelectContent>
126
- <SelectItem value="all">すべての勘定科目</SelectItem>
127
- <SelectItem value="cash">現金</SelectItem>
128
- <SelectItem value="sales">売上高</SelectItem>
129
- <SelectItem value="expense">旅費交通費</SelectItem>
130
- </SelectContent>
131
- </Select>
132
- </FormField>
133
- <FormField id="filter-status" label="ステータス">
134
- <Select value={status} onValueChange={setStatus}>
135
- <SelectTrigger id="filter-status" aria-label="ステータス">
136
- <SelectValue placeholder="すべてのステータス" />
137
- </SelectTrigger>
138
- <SelectContent>
139
- <SelectItem value="all">すべてのステータス</SelectItem>
140
- <SelectItem value="draft">下書き</SelectItem>
141
- <SelectItem value="approved">承認済み</SelectItem>
142
- </SelectContent>
143
- </Select>
144
- </FormField>
145
- <FormField id="filter-source" label="ソース">
146
- <Select value={source} onValueChange={setSource}>
147
- <SelectTrigger id="filter-source" aria-label="ソース">
148
- <SelectValue placeholder="すべてのソース" />
149
- </SelectTrigger>
150
- <SelectContent>
151
- <SelectItem value="all">すべてのソース</SelectItem>
152
- <SelectItem value="manual">手入力</SelectItem>
153
- <SelectItem value="import">インポート</SelectItem>
154
- </SelectContent>
155
- </Select>
156
- </FormField>
157
- <FormField id="filter-amount-min" label="金額">
158
- <Flex direction="row" gap="sm" align="center">
159
- <Input
160
- id="filter-amount-min"
161
- className="min-w-0 flex-1"
162
- inputMode="numeric"
163
- placeholder="最小"
164
- value={minAmount}
165
- onChange={(e) => setMinAmount(e.target.value)}
166
- />
167
- <Text tone="muted" aria-hidden="true">
168
-
169
- </Text>
170
- <Input
171
- id="filter-amount-max"
172
- aria-label="最大金額"
173
- className="min-w-0 flex-1"
174
- inputMode="numeric"
175
- placeholder="最大"
176
- value={maxAmount}
177
- onChange={(e) => setMaxAmount(e.target.value)}
178
- />
179
- </Flex>
180
- </FormField>
119
+ <SheetBody>
120
+ <Flex direction="col" gap="md">
121
+ <FormField id="filter-account" label="勘定科目">
122
+ <Select value={account} onValueChange={setAccount}>
123
+ <SelectTrigger id="filter-account" aria-label="勘定科目">
124
+ <SelectValue placeholder="すべての勘定科目" />
125
+ </SelectTrigger>
126
+ <SelectContent>
127
+ <SelectItem value="all">すべての勘定科目</SelectItem>
128
+ <SelectItem value="cash">現金</SelectItem>
129
+ <SelectItem value="sales">売上高</SelectItem>
130
+ <SelectItem value="expense">旅費交通費</SelectItem>
131
+ </SelectContent>
132
+ </Select>
133
+ </FormField>
134
+ <FormField id="filter-status" label="ステータス">
135
+ <Select value={status} onValueChange={setStatus}>
136
+ <SelectTrigger id="filter-status" aria-label="ステータス">
137
+ <SelectValue placeholder="すべてのステータス" />
138
+ </SelectTrigger>
139
+ <SelectContent>
140
+ <SelectItem value="all">すべてのステータス</SelectItem>
141
+ <SelectItem value="draft">下書き</SelectItem>
142
+ <SelectItem value="approved">承認済み</SelectItem>
143
+ </SelectContent>
144
+ </Select>
145
+ </FormField>
146
+ <FormField id="filter-source" label="ソース">
147
+ <Select value={source} onValueChange={setSource}>
148
+ <SelectTrigger id="filter-source" aria-label="ソース">
149
+ <SelectValue placeholder="すべてのソース" />
150
+ </SelectTrigger>
151
+ <SelectContent>
152
+ <SelectItem value="all">すべてのソース</SelectItem>
153
+ <SelectItem value="manual">手入力</SelectItem>
154
+ <SelectItem value="import">インポート</SelectItem>
155
+ </SelectContent>
156
+ </Select>
157
+ </FormField>
158
+ <FormField id="filter-amount-min" label="金額">
159
+ <Flex direction="row" gap="sm" align="center">
160
+ <Input
161
+ id="filter-amount-min"
162
+ className="min-w-0 flex-1"
163
+ inputMode="numeric"
164
+ placeholder="最小"
165
+ value={minAmount}
166
+ onChange={(e) => setMinAmount(e.target.value)}
167
+ />
168
+ <Text tone="muted" aria-hidden="true">
169
+
170
+ </Text>
171
+ <Input
172
+ id="filter-amount-max"
173
+ aria-label="最大金額"
174
+ className="min-w-0 flex-1"
175
+ inputMode="numeric"
176
+ placeholder="最大"
177
+ value={maxAmount}
178
+ onChange={(e) => setMaxAmount(e.target.value)}
179
+ />
180
+ </Flex>
181
+ </FormField>
182
+ </Flex>
181
183
  </SheetBody>
182
184
  <SheetFooter>
183
185
  <Button
@@ -220,21 +222,23 @@ export default function Demo() {
220
222
  <SheetTitle>取引先編集 · 株式会社サンプル</SheetTitle>
221
223
  <SheetDescription>取引先の基本情報を編集します。</SheetDescription>
222
224
  </SheetHeader>
223
- <SheetBody className="flex flex-col gap-4">
224
- <FormField id="edit-company" label="会社名" required>
225
- <Input
226
- id="edit-company"
227
- value={companyName}
228
- onChange={(e) => setCompanyName(e.target.value)}
229
- />
230
- </FormField>
231
- <FormField id="edit-registration" label="登録番号" helper="T + 13桁">
232
- <Input
233
- id="edit-registration"
234
- value={registration}
235
- onChange={(e) => setRegistration(e.target.value)}
236
- />
237
- </FormField>
225
+ <SheetBody>
226
+ <Flex direction="col" gap="md">
227
+ <FormField id="edit-company" label="会社名" required>
228
+ <Input
229
+ id="edit-company"
230
+ value={companyName}
231
+ onChange={(e) => setCompanyName(e.target.value)}
232
+ />
233
+ </FormField>
234
+ <FormField id="edit-registration" label="登録番号" helper="T + 13桁">
235
+ <Input
236
+ id="edit-registration"
237
+ value={registration}
238
+ onChange={(e) => setRegistration(e.target.value)}
239
+ />
240
+ </FormField>
241
+ </Flex>
238
242
  </SheetBody>
239
243
  <SheetFooter>
240
244
  <Button variant="outline" onClick={() => setEditOpen(false)}>
@@ -269,14 +273,16 @@ export default function Demo() {
269
273
  <SheetTitle>仕訳編集 · #2024-0412</SheetTitle>
270
274
  <SheetDescription>摘要を編集します。削除は元に戻せません。</SheetDescription>
271
275
  </SheetHeader>
272
- <SheetBody className="flex flex-col gap-4">
273
- <FormField id="record-memo" label="摘要">
274
- <Input
275
- id="record-memo"
276
- value={memo}
277
- onChange={(e) => setMemo(e.target.value)}
278
- />
279
- </FormField>
276
+ <SheetBody>
277
+ <Flex direction="col" gap="md">
278
+ <FormField id="record-memo" label="摘要">
279
+ <Input
280
+ id="record-memo"
281
+ value={memo}
282
+ onChange={(e) => setMemo(e.target.value)}
283
+ />
284
+ </FormField>
285
+ </Flex>
280
286
  </SheetBody>
281
287
  <SheetFooter>
282
288
  <Button
@@ -328,15 +334,17 @@ export default function Demo() {
328
334
  subtitle="2026-07-30 発行 · 株式会社サンプル"
329
335
  extra={<Badge tone="success">支払済み</Badge>}
330
336
  />
331
- <SheetBody className="flex flex-col gap-4">
332
- <Text size="sm">
333
- レコードのdetail surfaceはdesktopでは右side panel、mobileではbottom
334
- sheetとして表示されます。
335
- </Text>
336
- <Text size="sm" tone="muted">
337
- 幅は side panel のときだけ適用され、bottom sheet
338
- では全幅になります(widthはbottomでは無視されます)。
339
- </Text>
337
+ <SheetBody>
338
+ <Flex direction="col" gap="md">
339
+ <Text size="sm">
340
+ レコードのdetail surfaceはdesktopでは右side panel、mobileではbottom
341
+ sheetとして表示されます。
342
+ </Text>
343
+ <Text size="sm" tone="muted">
344
+ 幅は side panel のときだけ適用され、bottom sheet
345
+ では全幅になります(widthはbottomでは無視されます)。
346
+ </Text>
347
+ </Flex>
340
348
  </SheetBody>
341
349
  <SheetFooter>
342
350
  <Button variant="outline" onClick={() => setDetailOpen(false)}>
@@ -385,14 +393,16 @@ export default function Demo() {
385
393
  subtitle={`見出し帯は tone="${headerTone}" で描画しています。`}
386
394
  extra={<Badge tone={headerTone}>{headerTone}</Badge>}
387
395
  />
388
- <SheetBody className="flex flex-col gap-4">
389
- <Text size="sm">
390
- 帯の色だけが tone
391
- に追従し、見出しと本文の文字色は変わりません。帯は本文と同じ左右インセットで全幅に広がります。
392
- </Text>
393
- <Text size="sm" tone="muted">
394
- extra スロットは帯の右端に固定され、閉じるボタンとは重なりません。
395
- </Text>
396
+ <SheetBody>
397
+ <Flex direction="col" gap="md">
398
+ <Text size="sm">
399
+ 帯の色だけが tone
400
+ に追従し、見出しと本文の文字色は変わりません。帯は本文と同じ左右インセットで全幅に広がります。
401
+ </Text>
402
+ <Text size="sm" tone="muted">
403
+ extra スロットは帯の右端に固定され、閉じるボタンとは重なりません。
404
+ </Text>
405
+ </Flex>
396
406
  </SheetBody>
397
407
  <SheetFooter>
398
408
  <Button variant="outline" onClick={() => setToneOpen(false)}>
@@ -37,7 +37,7 @@ export default function Demo() {
37
37
  <Skeleton className="h-5 w-48" />
38
38
  <Skeleton className="h-4 w-72" />
39
39
  <Skeleton className="h-4 w-60" />
40
- <Flex direction="row" gap="sm" align="center" className="mt-2">
40
+ <Flex direction="row" gap="sm" align="center">
41
41
  <Skeleton className="size-10 rounded-full" />
42
42
  <Flex direction="col" gap="xs">
43
43
  <Skeleton className="h-4 w-32" />
@@ -69,7 +69,7 @@ export default function Demo() {
69
69
  its own structure.
70
70
  </CardDescription>
71
71
  </CardHeader>
72
- <CardContent className="p-0">
72
+ <CardContent flush>
73
73
  <SkeletonTable rows={6} columns={6} />
74
74
  </CardContent>
75
75
  </Card>
@@ -66,6 +66,7 @@ type Swatch = { cls: string; token: string; role: string };
66
66
  function SwatchTile({ swatch, text }: { swatch: Swatch; text?: boolean }) {
67
67
  return (
68
68
  <Flex direction="col" gap="xs">
69
+ {/* ui-audit-disable-next-line no-hand-rolled-surface no-utility-layout no-utility-spacing — a swatch showing the token itself; the fill IS the subject */}
69
70
  <div className={`border-border flex h-14 items-end rounded-md border p-2 ${swatch.cls}`}>
70
71
  {text ? (
71
72
  <Text size="xs" mono className="leading-none">
@@ -102,14 +103,15 @@ function SwatchGroup({ items, text, dark }: { items: Swatch[]; text?: boolean; d
102
103
  if (!dark) return grid;
103
104
  return (
104
105
  <Flex direction="col" gap="md">
105
- <div>
106
- <Text as="div" size="xs" tone="muted" weight="medium" className="mb-2">
106
+ <Flex direction="col" gap="sm">
107
+ <Text as="div" size="xs" tone="muted" weight="medium">
107
108
  Light
108
109
  </Text>
109
110
  {grid}
110
- </div>
111
- <div className="bg-background text-foreground dark rounded-md p-3">
112
- <Text as="div" size="xs" tone="muted" weight="medium" className="mb-2">
111
+ </Flex>
112
+ {/* ui-audit-disable-next-line no-utility-spacing a swatch showing the token itself; the fill IS the subject */}
113
+ <Flex direction="col" gap="sm" className="bg-background text-foreground dark rounded-md p-3">
114
+ <Text as="div" size="xs" tone="muted" weight="medium">
113
115
  Dark (.dark)
114
116
  </Text>
115
117
  <ResponsiveGrid columns={{ sm: 2, md: 3, lg: 4 }}>
@@ -117,7 +119,7 @@ function SwatchGroup({ items, text, dark }: { items: Swatch[]; text?: boolean; d
117
119
  <SwatchTile key={s.token} swatch={s} text={text} />
118
120
  ))}
119
121
  </ResponsiveGrid>
120
- </div>
122
+ </Flex>
121
123
  </Flex>
122
124
  );
123
125
  }