@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.
- package/dist/components/data-display/badge.d.ts +26 -2
- package/dist/components/data-display/badge.js +20 -5
- package/dist/components/data-display/index.d.ts +2 -0
- package/dist/components/data-display/index.js +2 -0
- package/dist/components/data-display/popover.d.ts +13 -1
- package/dist/components/data-display/popover.js +3 -1
- package/dist/components/data-display/table.d.ts +19 -2
- package/dist/components/data-display/table.js +4 -1
- package/dist/components/data-display/timeline-grid.d.ts +18 -0
- package/dist/components/data-display/timeline-grid.js +222 -0
- package/dist/components/data-entry/cascader.js +4 -6
- package/dist/components/data-entry/checkbox.js +1 -1
- package/dist/components/data-entry/search-select.js +5 -7
- package/dist/components/data-entry/select.js +32 -28
- package/dist/components/data-entry/tree-select.js +4 -6
- package/dist/components/general/inert-background.d.ts +5 -0
- package/dist/components/general/inert-background.js +48 -0
- package/dist/components/layout/auth-shell.d.ts +4 -2
- package/dist/components/layout/auth-shell.js +7 -1
- package/dist/components/layout/centered-shell.d.ts +2 -2
- package/dist/components/layout/flex.d.ts +1 -1
- package/dist/components/layout/flex.js +2 -1
- package/dist/components/layout/index.d.ts +3 -0
- package/dist/components/layout/index.js +2 -0
- package/dist/components/layout/mobile-shell.d.ts +21 -0
- package/dist/components/layout/mobile-shell.js +43 -0
- package/dist/components/layout/sidebar-link.d.ts +1 -1
- package/dist/components/navigation/context-menu.js +13 -9
- package/dist/components/navigation/dropdown-menu.js +17 -13
- package/dist/inertia/index.d.ts +1 -1
- package/dist/lib/variants.d.ts +3 -3
- package/dist/lib/variants.js +1 -0
- package/dist/props/components/data-display.prop.d.ts +72 -0
- package/dist/props/components/data-entry.prop.d.ts +1 -1
- package/dist/props/components/layout.prop.d.ts +93 -6
- package/dist/props/registry.d.ts +113 -2
- package/dist/props/registry.js +155 -1
- package/dist/props/vocabulary/data.prop.d.ts +6 -0
- package/dist/props/vocabulary/index.d.ts +3 -3
- package/dist/props/vocabulary/layout.prop.d.ts +17 -2
- package/dist/props/vocabulary/shared.prop.d.ts +7 -0
- package/dist/styles/badge-layout.css +15 -0
- package/dist/styles/control.css +18 -1
- package/dist/styles/data-display-layout.css +167 -0
- package/dist/styles/layout.css +7 -0
- package/dist/styles/shell-layout.css +148 -0
- package/dist/styles/table-layout.css +23 -4
- package/dist/tokens/components/badge.css +8 -0
- package/dist/tokens/components/control.css +1 -0
- package/dist/tokens/components/data-display.css +20 -0
- package/dist/tokens/components/shell.css +22 -0
- package/dist/tokens/components/table.css +2 -0
- package/docs/SPACING.md +19 -6
- package/docs/charts/compact-bar-trend.tsx +5 -6
- package/docs/data-display/avatar.tsx +7 -9
- package/docs/data-display/badge.tsx +37 -1
- package/docs/data-display/card/index.tsx +6 -4
- package/docs/data-display/carousel.tsx +8 -4
- package/docs/data-display/data-table/examples/approval-queue.tsx +1 -1
- package/docs/data-display/data-table/examples/grid-features.tsx +1 -1
- package/docs/data-display/data-table/index.tsx +1 -1
- package/docs/data-display/permission-matrix.tsx +15 -11
- package/docs/data-display/popover.tsx +2 -1
- package/docs/data-display/scroll-area.tsx +108 -76
- package/docs/data-display/table.tsx +2 -2
- package/docs/data-display/timeline-grid.tsx +119 -0
- package/docs/data-entry/branch-scope-picker.tsx +1 -1
- package/docs/data-entry/calendar.tsx +1 -1
- package/docs/data-entry/checkbox.tsx +1 -1
- package/docs/data-entry/country-picker-recipe.tsx +11 -6
- package/docs/data-entry/form-field/index.tsx +33 -29
- package/docs/data-entry/form-root.tsx +1 -1
- package/docs/data-entry/input-otp.tsx +1 -1
- package/docs/data-entry/password-input.tsx +1 -5
- package/docs/data-entry/select.tsx +7 -7
- package/docs/data-entry/textarea.tsx +3 -3
- package/docs/data-entry/toggle-count.tsx +1 -1
- package/docs/feedback/alert.tsx +1 -1
- package/docs/feedback/banner.tsx +1 -1
- package/docs/feedback/sheet.tsx +112 -102
- package/docs/feedback/skeleton.tsx +2 -2
- package/docs/foundation/colors.tsx +8 -6
- package/docs/foundation/email-tokens.tsx +83 -66
- package/docs/foundation/radius-shadow.tsx +13 -11
- package/docs/general/activity.tsx +1 -1
- package/docs/layout/app-shell.tsx +2 -2
- package/docs/layout/aspect-ratio.tsx +30 -14
- package/docs/layout/auth-account-summary.tsx +1 -1
- package/docs/layout/auth-recovery/examples/mobile-390.tsx +1 -1
- package/docs/layout/auth-recovery/examples/password-recovery.tsx +0 -2
- package/docs/layout/auth-shell-context.tsx +1 -1
- package/docs/layout/auth-shell-device.tsx +2 -2
- package/docs/layout/auth-shell-registration.tsx +1 -1
- package/docs/layout/auth-shell.tsx +1 -1
- package/docs/layout/flex.tsx +6 -2
- package/docs/layout/master-detail.tsx +2 -2
- package/docs/layout/mobile-shell.tsx +101 -0
- package/docs/layout/page-container.tsx +15 -7
- package/docs/layout/responsive-grid.tsx +12 -4
- package/docs/layout/separator.tsx +2 -2
- package/docs/layout/service-role-panel.tsx +1 -1
- package/docs/layout/sidebar.tsx +175 -152
- package/docs/layout/split-pane.tsx +45 -28
- package/docs/layout/topbar.tsx +19 -23
- package/docs/navigation/app-setting-picker.tsx +5 -4
- package/docs/navigation/breadcrumb.tsx +12 -5
- package/docs/navigation/context-menu.tsx +10 -4
- package/docs/navigation/filter-bar.tsx +2 -2
- package/docs/navigation/navigation-menu.tsx +89 -96
- package/docs/navigation/pagination.tsx +2 -2
- package/docs/navigation/steps.tsx +13 -11
- package/docs/navigation/tabs.tsx +27 -21
- package/docs/navigation/toolbar.tsx +15 -15
- package/docs/providers/format-date.tsx +2 -2
- package/docs/showcase/acme-portal.tsx +41 -28
- package/docs/showcase/acme-website.tsx +67 -61
- package/docs/showcase/case1-warehouse-dashboard.tsx +46 -31
- package/docs/showcase/case2-employee-me.tsx +33 -36
- package/docs/showcase/case3-approval-workflow.tsx +34 -32
- package/docs/showcase/case4-login.tsx +95 -101
- package/docs/showcase/case5-shift-calendar.tsx +182 -281
- package/docs/showcase/case6-agency-handy.tsx +514 -470
- package/docs/showcase/futurelastic-web.tsx +32 -29
- package/docs/showcase/org-switcher.tsx +20 -13
- package/docs/showcase/permission-matrix.tsx +20 -17
- package/docs/showcase/public-landing.tsx +1 -1
- package/docs/showcase/settings-account-sections.tsx +2 -2
- package/docs/showcase/settings-security-mfa.tsx +3 -3
- package/docs/showcase/table-approval-queue.tsx +1 -1
- package/docs/showcase/table-bulk-actions.tsx +49 -52
- package/docs/showcase/table-conditional-format.tsx +9 -9
- package/docs/showcase/table-crud-list.tsx +4 -4
- package/docs/showcase/table-density.tsx +49 -42
- package/docs/showcase/table-expandable-rows.tsx +112 -100
- package/docs/showcase/table-filter-chips.tsx +78 -71
- package/docs/showcase/table-footer-totals.tsx +30 -23
- package/docs/showcase/table-grouped-subtotals.tsx +31 -25
- package/docs/showcase/table-master-detail.tsx +27 -24
- package/docs/showcase/table-pagination.tsx +34 -27
- package/docs/showcase/table-states.tsx +42 -34
- package/docs/showcase/table-sticky-columns.tsx +11 -7
- package/docs/showcase/table-tree-rows.tsx +22 -15
- package/docs/showcase/table-view-tabs.tsx +12 -14
- package/package.json +7 -7
|
@@ -38,11 +38,12 @@ import {
|
|
|
38
38
|
import { Button, Text } from "@godxjp/ui/general";
|
|
39
39
|
import {
|
|
40
40
|
Badge,
|
|
41
|
-
type BadgeProps,
|
|
42
41
|
Card,
|
|
42
|
+
CardAction,
|
|
43
43
|
CardContent,
|
|
44
44
|
CardHeader,
|
|
45
45
|
CardTitle,
|
|
46
|
+
ListRow,
|
|
46
47
|
Progress,
|
|
47
48
|
StatCard,
|
|
48
49
|
Table,
|
|
@@ -52,6 +53,7 @@ import {
|
|
|
52
53
|
TableHeader,
|
|
53
54
|
TableRow,
|
|
54
55
|
Timeline,
|
|
56
|
+
type BadgeProps,
|
|
55
57
|
type TimelineItem,
|
|
56
58
|
} from "@godxjp/ui/data-display";
|
|
57
59
|
|
|
@@ -228,30 +230,37 @@ export default function WarehouseDashboardShowcase() {
|
|
|
228
230
|
{/* Queue + Activity */}
|
|
229
231
|
<ResponsiveGrid columns={{ sm: 1, md: 1, lg: 2 }}>
|
|
230
232
|
<Card className="self-start">
|
|
231
|
-
<CardHeader
|
|
233
|
+
<CardHeader>
|
|
232
234
|
<CardTitle level={2}>Cần xử lý</CardTitle>
|
|
233
|
-
<
|
|
234
|
-
|
|
235
|
-
|
|
235
|
+
<CardAction>
|
|
236
|
+
<Text size="xs" tone="muted">
|
|
237
|
+
{QUEUE.length} hàng đợi
|
|
238
|
+
</Text>
|
|
239
|
+
</CardAction>
|
|
236
240
|
</CardHeader>
|
|
237
241
|
<CardContent flush>
|
|
238
242
|
<ul className="divide-border divide-y">
|
|
239
243
|
{QUEUE.map((q) => {
|
|
240
244
|
return (
|
|
241
|
-
<
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
{q.
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
245
|
+
<ListRow
|
|
246
|
+
as="li"
|
|
247
|
+
key={q.title}
|
|
248
|
+
leading={
|
|
249
|
+
<Badge
|
|
250
|
+
tone={q.tone}
|
|
251
|
+
variant="outline"
|
|
252
|
+
icon={q.icon}
|
|
253
|
+
aria-label={q.title}
|
|
254
|
+
/>
|
|
255
|
+
}
|
|
256
|
+
title={q.title}
|
|
257
|
+
description={q.meta}
|
|
258
|
+
trailing={
|
|
259
|
+
<Button variant="outline" size="sm">
|
|
260
|
+
{q.action}
|
|
261
|
+
</Button>
|
|
262
|
+
}
|
|
263
|
+
/>
|
|
255
264
|
);
|
|
256
265
|
})}
|
|
257
266
|
</ul>
|
|
@@ -259,11 +268,13 @@ export default function WarehouseDashboardShowcase() {
|
|
|
259
268
|
</Card>
|
|
260
269
|
|
|
261
270
|
<Card className="self-start">
|
|
262
|
-
<CardHeader
|
|
271
|
+
<CardHeader>
|
|
263
272
|
<CardTitle level={2}>Hoạt động gần đây</CardTitle>
|
|
264
|
-
<
|
|
265
|
-
|
|
266
|
-
|
|
273
|
+
<CardAction>
|
|
274
|
+
<Text size="xs" tone="muted">
|
|
275
|
+
24h qua
|
|
276
|
+
</Text>
|
|
277
|
+
</CardAction>
|
|
267
278
|
</CardHeader>
|
|
268
279
|
<CardContent>
|
|
269
280
|
<Timeline items={ACTIVITY} />
|
|
@@ -274,11 +285,13 @@ export default function WarehouseDashboardShowcase() {
|
|
|
274
285
|
{/* Capacity + Recent shipments */}
|
|
275
286
|
<ResponsiveGrid columns={{ sm: 1, md: 1, lg: 2 }}>
|
|
276
287
|
<Card className="self-start">
|
|
277
|
-
<CardHeader
|
|
288
|
+
<CardHeader>
|
|
278
289
|
<CardTitle level={2}>Dung lượng giá hàng</CardTitle>
|
|
279
|
-
<
|
|
280
|
-
|
|
281
|
-
|
|
290
|
+
<CardAction>
|
|
291
|
+
<Button variant="ghost" size="sm">
|
|
292
|
+
Xem tất cả
|
|
293
|
+
</Button>
|
|
294
|
+
</CardAction>
|
|
282
295
|
</CardHeader>
|
|
283
296
|
<CardContent>
|
|
284
297
|
<Flex direction="col" gap="md">
|
|
@@ -298,11 +311,13 @@ export default function WarehouseDashboardShowcase() {
|
|
|
298
311
|
</Card>
|
|
299
312
|
|
|
300
313
|
<Card className="self-start">
|
|
301
|
-
<CardHeader
|
|
314
|
+
<CardHeader>
|
|
302
315
|
<CardTitle level={2}>Chuyến gần nhất</CardTitle>
|
|
303
|
-
<
|
|
304
|
-
|
|
305
|
-
|
|
316
|
+
<CardAction>
|
|
317
|
+
<Button variant="ghost" size="sm">
|
|
318
|
+
Tất cả
|
|
319
|
+
</Button>
|
|
320
|
+
</CardAction>
|
|
306
321
|
</CardHeader>
|
|
307
322
|
<CardContent flush>
|
|
308
323
|
<Table>
|
|
@@ -39,11 +39,12 @@ import { Button, Text } from "@godxjp/ui/general";
|
|
|
39
39
|
import { Alert, AlertDescription, AlertTitle } from "@godxjp/ui/feedback";
|
|
40
40
|
import {
|
|
41
41
|
Badge,
|
|
42
|
-
type BadgeProps,
|
|
43
42
|
Card,
|
|
43
|
+
CardAction,
|
|
44
44
|
CardContent,
|
|
45
45
|
CardHeader,
|
|
46
46
|
CardTitle,
|
|
47
|
+
Descriptions,
|
|
47
48
|
StatCard,
|
|
48
49
|
Table,
|
|
49
50
|
TableBody,
|
|
@@ -51,12 +52,14 @@ import {
|
|
|
51
52
|
TableHead,
|
|
52
53
|
TableHeader,
|
|
53
54
|
TableRow,
|
|
55
|
+
type BadgeProps,
|
|
54
56
|
} from "@godxjp/ui/data-display";
|
|
55
57
|
import {
|
|
56
58
|
AppShell,
|
|
57
59
|
Flex,
|
|
58
60
|
PageContainer,
|
|
59
61
|
ResponsiveGrid,
|
|
62
|
+
Separator,
|
|
60
63
|
Sidebar,
|
|
61
64
|
type SidebarSectionProp,
|
|
62
65
|
} from "@godxjp/ui/layout";
|
|
@@ -149,26 +152,28 @@ function PunchCard() {
|
|
|
149
152
|
|
|
150
153
|
return (
|
|
151
154
|
<Card density="cozy" className="self-start" accent={state === "break" ? "warning" : undefined}>
|
|
152
|
-
<CardHeader
|
|
155
|
+
<CardHeader>
|
|
153
156
|
<CardTitle level={2} className="whitespace-nowrap">
|
|
154
157
|
打刻 · Chấm công
|
|
155
158
|
</CardTitle>
|
|
156
|
-
<
|
|
157
|
-
{status.
|
|
158
|
-
|
|
159
|
+
<CardAction>
|
|
160
|
+
<Badge tone={status.tone} variant="outline" className="whitespace-nowrap">
|
|
161
|
+
{status.label}
|
|
162
|
+
</Badge>
|
|
163
|
+
</CardAction>
|
|
159
164
|
</CardHeader>
|
|
160
165
|
<CardContent>
|
|
161
166
|
<Flex direction="col" gap="md">
|
|
162
167
|
{/* Big tabular clock — the signature employee block. */}
|
|
163
|
-
<
|
|
168
|
+
<Flex direction="col" gap="xs">
|
|
164
169
|
{/* Hero numeral at the system's max step (2xl) — the golden scale tops here by design. */}
|
|
165
170
|
<Text as="div" size="2xl" weight="bold" tabular className="leading-none">
|
|
166
171
|
{clock}
|
|
167
172
|
</Text>
|
|
168
|
-
<Text as="div" size="sm" tone="muted"
|
|
173
|
+
<Text as="div" size="sm" tone="muted">
|
|
169
174
|
{status.meta}
|
|
170
175
|
</Text>
|
|
171
|
-
</
|
|
176
|
+
</Flex>
|
|
172
177
|
|
|
173
178
|
{/* Checkout-locked notice (attention, not destructive — it's a fixable hold). */}
|
|
174
179
|
{checkoutLocked ? (
|
|
@@ -225,8 +230,9 @@ function PunchCard() {
|
|
|
225
230
|
</Flex>
|
|
226
231
|
|
|
227
232
|
{/* Demo state stepper — lets a reader walk every FSM state at rest. */}
|
|
228
|
-
<
|
|
229
|
-
|
|
233
|
+
<Separator />
|
|
234
|
+
<Flex direction="row" wrap gap="xs">
|
|
235
|
+
<Text size="2xs" tone="muted" className="self-center">
|
|
230
236
|
状態:
|
|
231
237
|
</Text>
|
|
232
238
|
{(["off", "working", "break", "closed"] as PunchState[]).map((s) => (
|
|
@@ -334,7 +340,7 @@ export default function EmployeeMeShowcase() {
|
|
|
334
340
|
<PageContainer title="ダッシュボード" subtitle="田中 美咲 · 渋谷店 · 5月度" density="default">
|
|
335
341
|
<Flex direction="col" gap="lg">
|
|
336
342
|
{/* Punch (left) + month KPI 2×2 (right) — stack <lg, side-by-side ≥lg */}
|
|
337
|
-
<
|
|
343
|
+
<ResponsiveGrid columns={{ sm: 1, lg: 3 }} gap="md">
|
|
338
344
|
<div className="lg:col-span-1">
|
|
339
345
|
<PunchCard />
|
|
340
346
|
</div>
|
|
@@ -353,18 +359,20 @@ export default function EmployeeMeShowcase() {
|
|
|
353
359
|
))}
|
|
354
360
|
</ResponsiveGrid>
|
|
355
361
|
</div>
|
|
356
|
-
</
|
|
362
|
+
</ResponsiveGrid>
|
|
357
363
|
|
|
358
364
|
{/* 7-day attendance (left, wide) + today summary (right) */}
|
|
359
|
-
<
|
|
365
|
+
<ResponsiveGrid columns={{ sm: 1, lg: 3 }} gap="md">
|
|
360
366
|
<Card className="self-start lg:col-span-2">
|
|
361
|
-
<CardHeader
|
|
367
|
+
<CardHeader>
|
|
362
368
|
<CardTitle level={2} className="whitespace-nowrap">
|
|
363
369
|
最近7日 · 7 ngày gần nhất
|
|
364
370
|
</CardTitle>
|
|
365
|
-
<
|
|
366
|
-
|
|
367
|
-
|
|
371
|
+
<CardAction>
|
|
372
|
+
<Text size="xs" tone="muted" className="whitespace-nowrap">
|
|
373
|
+
勤務 47.4h · 残業 1.5h
|
|
374
|
+
</Text>
|
|
375
|
+
</CardAction>
|
|
368
376
|
</CardHeader>
|
|
369
377
|
<CardContent flush>
|
|
370
378
|
<Table>
|
|
@@ -383,9 +391,7 @@ export default function EmployeeMeShowcase() {
|
|
|
383
391
|
<TableRow key={d.date}>
|
|
384
392
|
<TableCell className="whitespace-nowrap tabular-nums">
|
|
385
393
|
{d.date}
|
|
386
|
-
<Text tone="muted"
|
|
387
|
-
({d.weekday})
|
|
388
|
-
</Text>
|
|
394
|
+
<Text tone="muted">({d.weekday})</Text>
|
|
389
395
|
</TableCell>
|
|
390
396
|
<TableCell className="text-end tabular-nums">{d.work}</TableCell>
|
|
391
397
|
<TableCell className="text-end tabular-nums">{d.ot}</TableCell>
|
|
@@ -412,28 +418,19 @@ export default function EmployeeMeShowcase() {
|
|
|
412
418
|
本日のサマリー · Hôm nay
|
|
413
419
|
</CardTitle>
|
|
414
420
|
</CardHeader>
|
|
415
|
-
<CardContent
|
|
416
|
-
<
|
|
421
|
+
<CardContent>
|
|
422
|
+
<Descriptions columns={1} layout="horizontal" labelAlign="start">
|
|
417
423
|
{SUMMARY.map((s) => (
|
|
418
|
-
<
|
|
419
|
-
|
|
420
|
-
align="center"
|
|
421
|
-
justify="between"
|
|
422
|
-
gap="md"
|
|
423
|
-
className="px-4 py-2.5"
|
|
424
|
-
>
|
|
425
|
-
<Text as="dt" size="sm" tone="muted" className="whitespace-nowrap">
|
|
426
|
-
{s.label}
|
|
427
|
-
</Text>
|
|
428
|
-
<Text as="dd" size="sm" weight="medium" align="end" tabular>
|
|
424
|
+
<Descriptions.Item key={s.label} label={s.label}>
|
|
425
|
+
<Text size="sm" weight="medium" tabular>
|
|
429
426
|
{s.value}
|
|
430
427
|
</Text>
|
|
431
|
-
</
|
|
428
|
+
</Descriptions.Item>
|
|
432
429
|
))}
|
|
433
|
-
</
|
|
430
|
+
</Descriptions>
|
|
434
431
|
</CardContent>
|
|
435
432
|
</Card>
|
|
436
|
-
</
|
|
433
|
+
</ResponsiveGrid>
|
|
437
434
|
</Flex>
|
|
438
435
|
</PageContainer>
|
|
439
436
|
</AppShell>
|
|
@@ -352,38 +352,40 @@ export default function Demo() {
|
|
|
352
352
|
{/* ── 4-column filter bar ───────────────────────────────────────── */}
|
|
353
353
|
<Card className="self-start">
|
|
354
354
|
<CardContent>
|
|
355
|
-
<
|
|
356
|
-
<
|
|
357
|
-
<
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
<
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
<
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
<
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
<
|
|
382
|
-
<
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
355
|
+
<Flex direction="col" gap="md">
|
|
356
|
+
<ResponsiveGrid columns={{ sm: 1, md: 2, lg: 4 }}>
|
|
357
|
+
<FormField id="f-type" label="区分">
|
|
358
|
+
<Select
|
|
359
|
+
options={TYPE_OPTIONS}
|
|
360
|
+
value={type}
|
|
361
|
+
onValueChange={setType}
|
|
362
|
+
placeholder="すべて"
|
|
363
|
+
/>
|
|
364
|
+
</FormField>
|
|
365
|
+
<FormField id="f-status" label="状態">
|
|
366
|
+
<Select
|
|
367
|
+
options={STATUS_OPTIONS}
|
|
368
|
+
value={status}
|
|
369
|
+
onValueChange={setStatus}
|
|
370
|
+
placeholder="すべて"
|
|
371
|
+
/>
|
|
372
|
+
</FormField>
|
|
373
|
+
<FormField id="f-from" label="期間 (開始)">
|
|
374
|
+
<DatePicker value={from} onValueChange={setFrom} placeholder="YYYY-MM-DD" />
|
|
375
|
+
</FormField>
|
|
376
|
+
<FormField id="f-to" label="期間 (終了)">
|
|
377
|
+
<DatePicker value={to} onValueChange={setTo} placeholder="YYYY-MM-DD" />
|
|
378
|
+
</FormField>
|
|
379
|
+
</ResponsiveGrid>
|
|
380
|
+
{hasActiveFilters && (
|
|
381
|
+
<Flex direction="row" justify="end">
|
|
382
|
+
<Button variant="ghost" size="sm" onClick={clearFilters}>
|
|
383
|
+
<X aria-hidden="true" />
|
|
384
|
+
条件をクリア
|
|
385
|
+
</Button>
|
|
386
|
+
</Flex>
|
|
387
|
+
)}
|
|
388
|
+
</Flex>
|
|
387
389
|
</CardContent>
|
|
388
390
|
</Card>
|
|
389
391
|
|
|
@@ -7,9 +7,10 @@
|
|
|
7
7
|
* not a transcription of the prototype DOM.
|
|
8
8
|
*
|
|
9
9
|
* Composition map (prototype block → @godxjp/ui primitive):
|
|
10
|
-
*
|
|
11
|
-
* comfortable density ....
|
|
12
|
-
* locale + theme toggle ..
|
|
10
|
+
* page shell ............. AuthShell (the unauthenticated root shell)
|
|
11
|
+
* comfortable density .... AuthShell's own control tier → 44px touch floor
|
|
12
|
+
* locale + theme toggle .. AuthShell `actions` (banner, inline end)
|
|
13
|
+
* two-column measure ..... AuthShell `measure="wide"` → 64rem content slot
|
|
13
14
|
* split brand panel ...... Card composition, hidden < lg (mobile-first)
|
|
14
15
|
* auth card .............. Card (shadow-lg — the one resting shadow login allows)
|
|
15
16
|
* SSO buttons ............ Button(outline) full-width + brand SVG slot
|
|
@@ -47,8 +48,9 @@ import {
|
|
|
47
48
|
CardHeader,
|
|
48
49
|
CardTitle,
|
|
49
50
|
CardDescription,
|
|
51
|
+
Descriptions,
|
|
50
52
|
} from "@godxjp/ui/data-display";
|
|
51
|
-
import { Flex, ResponsiveGrid, Separator } from "@godxjp/ui/layout";
|
|
53
|
+
import { AuthShell, Flex, ResponsiveGrid, Separator } from "@godxjp/ui/layout";
|
|
52
54
|
|
|
53
55
|
// ── The single allowed multi-color brand mark (Google "G") ─────────────────────
|
|
54
56
|
// Icons normally inherit currentColor; a third-party brand mark is the documented
|
|
@@ -114,13 +116,19 @@ export default function LoginShowcase() {
|
|
|
114
116
|
const [theme, setTheme] = React.useState("light");
|
|
115
117
|
|
|
116
118
|
return (
|
|
117
|
-
<
|
|
118
|
-
|
|
119
|
-
|
|
119
|
+
<AuthShell
|
|
120
|
+
/* The 64rem content slot the split (brand panel + card) login needs. */
|
|
121
|
+
measure="wide"
|
|
122
|
+
className="text-foreground"
|
|
123
|
+
/* Brand mark in the banner below lg; from lg the split panel carries it. */
|
|
124
|
+
brand={
|
|
120
125
|
<div className="lg:hidden">
|
|
121
126
|
<BrandLockup />
|
|
122
127
|
</div>
|
|
123
|
-
|
|
128
|
+
}
|
|
129
|
+
/* Page-level controls, pinned to the banner's inline end. */
|
|
130
|
+
actions={
|
|
131
|
+
<>
|
|
124
132
|
<Select value={locale} onValueChange={setLocale}>
|
|
125
133
|
<SelectTrigger size="sm" className="w-32" aria-label="言語を選択">
|
|
126
134
|
<Languages aria-hidden="true" className="text-muted-foreground" />
|
|
@@ -152,20 +160,16 @@ export default function LoginShowcase() {
|
|
|
152
160
|
<Monitor aria-hidden="true" />
|
|
153
161
|
</ToggleGroupItem>
|
|
154
162
|
</ToggleGroup>
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
163
|
+
</>
|
|
164
|
+
}
|
|
165
|
+
>
|
|
158
166
|
{/* Centered auth area. Split brand panel + card sit side-by-side from lg. */}
|
|
159
|
-
<
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
{/* Split brand panel — hidden on mobile (mobile-first), shown from lg. */}
|
|
166
|
-
<aside className="hidden lg:flex">
|
|
167
|
-
<Card className="bg-primary/5 w-full">
|
|
168
|
-
<CardContent solo className="flex h-full flex-col justify-between gap-8">
|
|
167
|
+
<ResponsiveGrid columns={{ sm: 1, lg: 2, md: 1 }} gap="xl" className="w-full items-stretch">
|
|
168
|
+
{/* Split brand panel — hidden on mobile (mobile-first), shown from lg. */}
|
|
169
|
+
<aside className="hidden lg:block">
|
|
170
|
+
<Card className="bg-primary/5 h-full w-full">
|
|
171
|
+
<CardContent solo className="h-full">
|
|
172
|
+
<Flex direction="col" justify="between" gap="xl">
|
|
169
173
|
<BrandLockup size="lg" />
|
|
170
174
|
<Flex direction="col" gap="md">
|
|
171
175
|
<Heading level={2} className="leading-snug">
|
|
@@ -176,49 +180,43 @@ export default function LoginShowcase() {
|
|
|
176
180
|
多拠点・多テナントに対応し、現場と管理をつなぎます。
|
|
177
181
|
</Text>
|
|
178
182
|
</Flex>
|
|
179
|
-
<
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
</Text>
|
|
184
|
-
<Text as="dd" size="lg" weight="bold" tabular>
|
|
183
|
+
<Separator />
|
|
184
|
+
<Descriptions columns={3}>
|
|
185
|
+
<Descriptions.Item label="導入企業">
|
|
186
|
+
<Text size="lg" weight="bold" tabular>
|
|
185
187
|
1,240
|
|
186
188
|
</Text>
|
|
187
|
-
</
|
|
188
|
-
<
|
|
189
|
-
<Text
|
|
190
|
-
稼働拠点
|
|
191
|
-
</Text>
|
|
192
|
-
<Text as="dd" size="lg" weight="bold" tabular>
|
|
189
|
+
</Descriptions.Item>
|
|
190
|
+
<Descriptions.Item label="稼働拠点">
|
|
191
|
+
<Text size="lg" weight="bold" tabular>
|
|
193
192
|
8,600
|
|
194
193
|
</Text>
|
|
195
|
-
</
|
|
196
|
-
<
|
|
197
|
-
<Text
|
|
198
|
-
月間打刻
|
|
199
|
-
</Text>
|
|
200
|
-
<Text as="dd" size="lg" weight="bold" tabular>
|
|
194
|
+
</Descriptions.Item>
|
|
195
|
+
<Descriptions.Item label="月間打刻">
|
|
196
|
+
<Text size="lg" weight="bold" tabular>
|
|
201
197
|
21M
|
|
202
198
|
</Text>
|
|
203
|
-
</
|
|
204
|
-
</
|
|
205
|
-
</CardContent>
|
|
206
|
-
</Card>
|
|
207
|
-
</aside>
|
|
208
|
-
|
|
209
|
-
{/* Auth card — the one surface allowed a resting shadow (shadow-lg). */}
|
|
210
|
-
<Card className="mx-auto w-full max-w-sm self-center shadow-lg lg:mx-0">
|
|
211
|
-
<CardHeader className="flex flex-col gap-1.5 pb-2 text-center lg:text-start">
|
|
212
|
-
<Flex justify="center" className="lg:hidden">
|
|
213
|
-
<BrandLockup />
|
|
199
|
+
</Descriptions.Item>
|
|
200
|
+
</Descriptions>
|
|
214
201
|
</Flex>
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
</CardDescription>
|
|
219
|
-
</CardHeader>
|
|
202
|
+
</CardContent>
|
|
203
|
+
</Card>
|
|
204
|
+
</aside>
|
|
220
205
|
|
|
221
|
-
|
|
206
|
+
{/* Auth card — the one surface allowed a resting shadow (shadow-lg). */}
|
|
207
|
+
<Card className="mx-auto w-full max-w-sm self-center shadow-lg">
|
|
208
|
+
<CardHeader className="text-center lg:text-start">
|
|
209
|
+
<Flex justify="center" className="lg:hidden">
|
|
210
|
+
<BrandLockup />
|
|
211
|
+
</Flex>
|
|
212
|
+
<CardTitle className="text-lg font-semibold">ログイン</CardTitle>
|
|
213
|
+
<CardDescription className="text-muted-foreground text-xs">
|
|
214
|
+
勤怠管理プラットフォームへようこそ
|
|
215
|
+
</CardDescription>
|
|
216
|
+
</CardHeader>
|
|
217
|
+
|
|
218
|
+
<CardContent solo>
|
|
219
|
+
<Flex direction="col" gap="lg">
|
|
222
220
|
{/* SSO buttons — outline, full-width, 44px (comfortable). */}
|
|
223
221
|
<Flex direction="col" gap="sm">
|
|
224
222
|
<Button variant="outline" className="w-full justify-center">
|
|
@@ -241,67 +239,63 @@ export default function LoginShowcase() {
|
|
|
241
239
|
|
|
242
240
|
{/* Email — uncontrolled, seeded so the filled state shows at rest. */}
|
|
243
241
|
<form
|
|
244
|
-
className="flex flex-col gap-4"
|
|
245
242
|
onSubmit={(e) => {
|
|
246
243
|
e.preventDefault();
|
|
247
244
|
}}
|
|
248
245
|
>
|
|
249
|
-
<
|
|
250
|
-
<
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
246
|
+
<Flex direction="col" gap="md">
|
|
247
|
+
<FormField id="login-email" label="メールアドレス" required>
|
|
248
|
+
<Input
|
|
249
|
+
type="email"
|
|
250
|
+
name="email"
|
|
251
|
+
autoComplete="email"
|
|
252
|
+
inputMode="email"
|
|
253
|
+
placeholder="name@example.com"
|
|
254
|
+
defaultValue="m.tanaka@famgia.com"
|
|
255
|
+
/>
|
|
256
|
+
</FormField>
|
|
259
257
|
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
autoComplete="current-password"
|
|
279
|
-
placeholder="パスワードを入力"
|
|
280
|
-
defaultValue="example-pass"
|
|
281
|
-
/>
|
|
282
|
-
</FormField>
|
|
258
|
+
{/* Password — labelAddon hosts the right-aligned "忘れた場合" link. */}
|
|
259
|
+
<FormField
|
|
260
|
+
id="login-password"
|
|
261
|
+
label="パスワード"
|
|
262
|
+
required
|
|
263
|
+
labelAddon={
|
|
264
|
+
<Button type="button" variant="link" size="sm" className="ms-auto text-xs">
|
|
265
|
+
お忘れの場合
|
|
266
|
+
</Button>
|
|
267
|
+
}
|
|
268
|
+
>
|
|
269
|
+
<PasswordInput
|
|
270
|
+
name="password"
|
|
271
|
+
autoComplete="current-password"
|
|
272
|
+
placeholder="パスワードを入力"
|
|
273
|
+
defaultValue="example-pass"
|
|
274
|
+
/>
|
|
275
|
+
</FormField>
|
|
283
276
|
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
277
|
+
{/* The single --primary action of the view. */}
|
|
278
|
+
<Button type="submit" className="w-full justify-center">
|
|
279
|
+
ログイン
|
|
280
|
+
</Button>
|
|
281
|
+
</Flex>
|
|
288
282
|
</form>
|
|
289
283
|
|
|
290
284
|
<Text as="p" size="2xs" tone="muted" align="center" className="leading-relaxed">
|
|
291
285
|
ログインすると{" "}
|
|
292
|
-
<Button variant="link" size="sm" className="
|
|
286
|
+
<Button variant="link" size="sm" className="text-[var(--font-size-2xs)]">
|
|
293
287
|
利用規約
|
|
294
288
|
</Button>{" "}
|
|
295
289
|
·{" "}
|
|
296
|
-
<Button variant="link" size="sm" className="
|
|
290
|
+
<Button variant="link" size="sm" className="text-[var(--font-size-2xs)]">
|
|
297
291
|
プライバシーポリシー
|
|
298
292
|
</Button>{" "}
|
|
299
293
|
に同意したものとみなされます。
|
|
300
294
|
</Text>
|
|
301
|
-
</
|
|
302
|
-
</
|
|
303
|
-
</
|
|
304
|
-
</
|
|
305
|
-
</
|
|
295
|
+
</Flex>
|
|
296
|
+
</CardContent>
|
|
297
|
+
</Card>
|
|
298
|
+
</ResponsiveGrid>
|
|
299
|
+
</AuthShell>
|
|
306
300
|
);
|
|
307
301
|
}
|