@pattern-stack/frontend-patterns 0.0.1 → 0.0.3
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/README.md +6 -6
- package/package.json +3 -5
- package/src/App.css +0 -42
- package/src/App.tsx +0 -54
- package/src/__tests__/README.md +0 -221
- package/src/__tests__/atoms/hooks/simple-hooks.test.ts +0 -44
- package/src/__tests__/atoms/ui/button.test.tsx +0 -68
- package/src/__tests__/atoms/utils/simple.test.ts +0 -18
- package/src/__tests__/atoms/utils/utils.test.ts +0 -77
- package/src/__tests__/features/auth/simple-auth.test.tsx +0 -40
- package/src/__tests__/molecules/layout/simple-layout.test.tsx +0 -81
- package/src/__tests__/organisms/showcase/simple-showcase.test.tsx +0 -167
- package/src/__tests__/setup.ts +0 -51
- package/src/__tests__/utils.tsx +0 -123
- package/src/atoms/composed/Accordion/Accordion.tsx +0 -271
- package/src/atoms/composed/Accordion/index.ts +0 -1
- package/src/atoms/composed/Alert/Alert.tsx +0 -132
- package/src/atoms/composed/Alert/index.ts +0 -1
- package/src/atoms/composed/Breadcrumb/Breadcrumb.tsx +0 -83
- package/src/atoms/composed/Breadcrumb/index.ts +0 -1
- package/src/atoms/composed/Chart/Chart.tsx +0 -425
- package/src/atoms/composed/Chart/index.ts +0 -2
- package/src/atoms/composed/ColorSwatch/ColorSwatch.tsx +0 -72
- package/src/atoms/composed/ColorSwatch/index.ts +0 -1
- package/src/atoms/composed/DarkModeToggle.tsx +0 -66
- package/src/atoms/composed/DataBadge/DataBadge.tsx +0 -81
- package/src/atoms/composed/DataBadge/index.ts +0 -1
- package/src/atoms/composed/DataTable/DataTable.tsx +0 -394
- package/src/atoms/composed/DataTable/TableCellWithTooltip.tsx +0 -41
- package/src/atoms/composed/DataTable/index.ts +0 -2
- package/src/atoms/composed/DateTimePicker/DateTimePicker.tsx +0 -611
- package/src/atoms/composed/DateTimePicker/index.ts +0 -2
- package/src/atoms/composed/DetailedCard/DetailedCard.tsx +0 -181
- package/src/atoms/composed/DetailedCard/index.ts +0 -2
- package/src/atoms/composed/EmptyState/EmptyState.tsx +0 -90
- package/src/atoms/composed/EmptyState/index.ts +0 -1
- package/src/atoms/composed/FileUpload/FileUpload.tsx +0 -477
- package/src/atoms/composed/FileUpload/index.ts +0 -2
- package/src/atoms/composed/FormField/FormField.tsx +0 -92
- package/src/atoms/composed/FormField/index.ts +0 -1
- package/src/atoms/composed/GlobalSearch/GlobalSearch.tsx +0 -37
- package/src/atoms/composed/GlobalSearch/index.ts +0 -1
- package/src/atoms/composed/IconBadge/IconBadge.tsx +0 -95
- package/src/atoms/composed/IconBadge/index.ts +0 -2
- package/src/atoms/composed/Modal/Modal.tsx +0 -223
- package/src/atoms/composed/Modal/index.ts +0 -2
- package/src/atoms/composed/PaletteSwitcher.tsx +0 -386
- package/src/atoms/composed/ProgressBar/ProgressBar.tsx +0 -116
- package/src/atoms/composed/ProgressBar/index.ts +0 -1
- package/src/atoms/composed/StatCard/StatCard.tsx +0 -219
- package/src/atoms/composed/StatCard/index.ts +0 -1
- package/src/atoms/composed/StyleGuide.tsx +0 -717
- package/src/atoms/composed/Toast/Toast.tsx +0 -219
- package/src/atoms/composed/Toast/index.ts +0 -1
- package/src/atoms/composed/Tooltip/Tooltip.tsx +0 -213
- package/src/atoms/composed/Tooltip/index.ts +0 -1
- package/src/atoms/composed/UserAvatar/UserAvatar.tsx +0 -139
- package/src/atoms/composed/UserAvatar/index.ts +0 -1
- package/src/atoms/composed/UserMenu/UserMenu.tsx +0 -16
- package/src/atoms/composed/UserMenu/index.ts +0 -1
- package/src/atoms/composed/index.ts +0 -29
- package/src/atoms/hooks/useApi.ts +0 -80
- package/src/atoms/hooks/useHealth.ts +0 -17
- package/src/atoms/index.ts +0 -13
- package/src/atoms/services/api/client.ts +0 -134
- package/src/atoms/services/auth-service.ts +0 -248
- package/src/atoms/services/health.ts +0 -15
- package/src/atoms/services/index.ts +0 -3
- package/src/atoms/shared/config/constants.ts +0 -17
- package/src/atoms/shared/config/dashboard-sizes.ts +0 -111
- package/src/atoms/shared/config/environment.ts +0 -10
- package/src/atoms/shared/index.ts +0 -4
- package/src/atoms/shared/styles/color-palettes.css +0 -566
- package/src/atoms/types/auth.ts +0 -62
- package/src/atoms/types/generated.ts +0 -1469
- package/src/atoms/types/index.ts +0 -4
- package/src/atoms/types/loading.ts +0 -28
- package/src/atoms/ui/Badge.tsx +0 -30
- package/src/atoms/ui/ErrorBoundary.tsx +0 -59
- package/src/atoms/ui/Select.tsx +0 -53
- package/src/atoms/ui/Switch.tsx +0 -42
- package/src/atoms/ui/Tabs.tsx +0 -118
- package/src/atoms/ui/avatar.tsx +0 -48
- package/src/atoms/ui/button.tsx +0 -70
- package/src/atoms/ui/card.tsx +0 -76
- package/src/atoms/ui/dropdown-menu.tsx +0 -199
- package/src/atoms/ui/index.ts +0 -39
- package/src/atoms/ui/input.tsx +0 -23
- package/src/atoms/ui/label.tsx +0 -23
- package/src/atoms/ui/skeleton.tsx +0 -13
- package/src/atoms/ui/spinner.tsx +0 -49
- package/src/atoms/ui/table.tsx +0 -116
- package/src/atoms/utils/animations.ts +0 -135
- package/src/atoms/utils/tooltip-helpers.ts +0 -140
- package/src/atoms/utils/utils.ts +0 -9
- package/src/features/auth/components/LoginForm.tsx +0 -168
- package/src/features/auth/components/LogoutButton.tsx +0 -19
- package/src/features/auth/components/ProtectedRoute.tsx +0 -60
- package/src/features/auth/components/index.ts +0 -4
- package/src/features/auth/hooks/index.ts +0 -2
- package/src/features/auth/hooks/useAuth.tsx +0 -205
- package/src/features/auth/hooks/usePermissions.ts +0 -35
- package/src/features/auth/index.ts +0 -2
- package/src/features/index.ts +0 -2
- package/src/index.css +0 -704
- package/src/index.ts +0 -13
- package/src/main.tsx +0 -48
- package/src/molecules/.gitkeep +0 -0
- package/src/molecules/forms/FormGroup.tsx +0 -75
- package/src/molecules/forms/SearchInput.tsx +0 -259
- package/src/molecules/forms/index.ts +0 -4
- package/src/molecules/index.ts +0 -4
- package/src/molecules/layout/AppHeader/AppHeader.tsx +0 -42
- package/src/molecules/layout/AppHeader/index.ts +0 -1
- package/src/molecules/layout/AppLayout.tsx +0 -29
- package/src/molecules/layout/PageTemplate.tsx +0 -87
- package/src/molecules/layout/SectionHeader/SectionHeader.tsx +0 -87
- package/src/molecules/layout/SectionHeader/index.ts +0 -1
- package/src/molecules/layout/ShowcaseSection.tsx +0 -57
- package/src/molecules/layout/Sidebar.tsx +0 -144
- package/src/molecules/layout/SidebarButton/SidebarButton.tsx +0 -99
- package/src/molecules/layout/SidebarButton/index.ts +0 -1
- package/src/molecules/layout/SidebarContext.tsx +0 -31
- package/src/molecules/layout/index.ts +0 -7
- package/src/molecules/navigation/NavMenu.tsx +0 -188
- package/src/molecules/navigation/Pagination.tsx +0 -172
- package/src/molecules/navigation/index.ts +0 -4
- package/src/organisms/index.ts +0 -5
- package/src/organisms/showcase/ComponentShowcasePage.tsx +0 -2496
- package/src/organisms/showcase/index.ts +0 -1
- package/src/pages/AdminShowcase/AdminCRUDShowcase.tsx +0 -242
- package/src/pages/AdminShowcase/AdminDashboardShowcase.tsx +0 -171
- package/src/pages/AdminShowcase/AdminDetailShowcase.tsx +0 -385
- package/src/pages/AdminShowcase/index.tsx +0 -3
- package/src/pages/ComponentShowcase/BadgesShowcase.tsx +0 -188
- package/src/pages/ComponentShowcase/CardsShowcase.tsx +0 -392
- package/src/pages/ComponentShowcase/PalettesShowcase.tsx +0 -207
- package/src/pages/ComponentShowcase/StatesShowcase.tsx +0 -485
- package/src/pages/ComponentShowcase/TablesShowcase.tsx +0 -134
- package/src/pages/ComponentShowcase/TypographyShowcase.tsx +0 -255
- package/src/pages/ComponentShowcase/index.tsx +0 -188
- package/src/pages/index.ts +0 -2
- package/src/templates/AuthTemplate.tsx +0 -216
- package/src/templates/ComponentShowcaseTemplate.tsx +0 -173
- package/src/templates/DashboardTemplate.tsx +0 -232
- package/src/templates/DataTemplate.tsx +0 -319
- package/src/templates/admin/AdminCRUDTemplate.tsx +0 -630
- package/src/templates/admin/AdminDashboardTemplate.tsx +0 -351
- package/src/templates/admin/AdminDetailTemplate.tsx +0 -563
- package/src/templates/admin/index.ts +0 -29
- package/src/templates/factory.tsx +0 -169
- package/src/templates/index.ts +0 -37
- package/src/vite-env.d.ts +0 -1
|
@@ -1,2496 +0,0 @@
|
|
|
1
|
-
import React, { useState } from 'react';
|
|
2
|
-
import { Card } from '../../atoms/ui/card';
|
|
3
|
-
import { Tabs, TabsContent, TabsList, TabsTrigger } from '../../atoms/ui/Tabs';
|
|
4
|
-
import { DataBadge, StatCard, DetailedCard, DataTable, EmptyState, ColorSwatch, IconBadge, Accordion, ToastContainer, FileUpload, DateTimePicker, Chart } from '../../atoms/composed';
|
|
5
|
-
import { Badge } from '../../atoms/ui/Badge';
|
|
6
|
-
import { Switch } from '../../atoms/ui/Switch';
|
|
7
|
-
import { ShowcaseSection } from '../../molecules/layout';
|
|
8
|
-
import { Pagination, NavMenu } from '../../molecules/navigation';
|
|
9
|
-
import { FormGroup, SearchInput } from '../../molecules/forms';
|
|
10
|
-
import { Alert, ProgressBar, FormField, Breadcrumb } from '../../atoms/composed';
|
|
11
|
-
import { Input } from '../../atoms/ui/input';
|
|
12
|
-
import { Label } from '../../atoms/ui/label';
|
|
13
|
-
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '../../atoms/ui/table';
|
|
14
|
-
import { Spinner } from '../../atoms/ui/spinner';
|
|
15
|
-
import { Skeleton } from '../../atoms/ui/skeleton';
|
|
16
|
-
import { Button } from '../../atoms/ui/button';
|
|
17
|
-
import {
|
|
18
|
-
Database,
|
|
19
|
-
TrendingUp,
|
|
20
|
-
Users,
|
|
21
|
-
Activity,
|
|
22
|
-
CheckCircle,
|
|
23
|
-
AlertTriangle,
|
|
24
|
-
XCircle,
|
|
25
|
-
Info,
|
|
26
|
-
Clock,
|
|
27
|
-
Layers,
|
|
28
|
-
Palette,
|
|
29
|
-
Grid3X3,
|
|
30
|
-
Home,
|
|
31
|
-
Settings,
|
|
32
|
-
FileText,
|
|
33
|
-
ChevronRight
|
|
34
|
-
} from 'lucide-react';
|
|
35
|
-
|
|
36
|
-
interface SampleDataItem extends Record<string, unknown> {
|
|
37
|
-
id: number;
|
|
38
|
-
name: string;
|
|
39
|
-
status: 'success' | 'warning' | 'error';
|
|
40
|
-
category: string;
|
|
41
|
-
runs: number;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
export const ComponentShowcasePage: React.FC = () => {
|
|
45
|
-
const [activeSection, setActiveSection] = useState('badges');
|
|
46
|
-
const [showCode, setShowCode] = useState(false);
|
|
47
|
-
const [toasts, setToasts] = useState<Array<{ id: string; status: 'success' | 'warning' | 'error' | 'info'; title: string; message: string }>>([]);
|
|
48
|
-
const [selectedDate, setSelectedDate] = useState<Date | undefined>(undefined);
|
|
49
|
-
const [dateRange, setDateRange] = useState<{ start: Date | undefined; end: Date | undefined }>({ start: undefined, end: undefined });
|
|
50
|
-
|
|
51
|
-
// Sample data for DataTable
|
|
52
|
-
const sampleData: SampleDataItem[] = [
|
|
53
|
-
{ id: 1, name: 'Customer Analysis', status: 'success', category: 'Analytics', runs: 24 },
|
|
54
|
-
{ id: 2, name: 'Revenue Model', status: 'warning', category: 'Finance', runs: 18 },
|
|
55
|
-
{ id: 3, name: 'User Behavior', status: 'error', category: 'Product', runs: 31 },
|
|
56
|
-
{ id: 4, name: 'Sales Forecast', status: 'success', category: 'Sales', runs: 12 }
|
|
57
|
-
];
|
|
58
|
-
|
|
59
|
-
const tableColumns = [
|
|
60
|
-
{ key: 'name', header: 'Model Name' },
|
|
61
|
-
{ key: 'status', header: 'Status', type: 'status' as const },
|
|
62
|
-
{ key: 'category', header: 'Category', type: 'category' as const },
|
|
63
|
-
{ key: 'runs', header: 'Runs' }
|
|
64
|
-
];
|
|
65
|
-
|
|
66
|
-
return (
|
|
67
|
-
<div className="min-h-screen bg-background">
|
|
68
|
-
{/* Hero Section */}
|
|
69
|
-
<div className="bg-gradient-to-br from-category-1/5 via-category-2/5 to-category-3/5 border-b border-border/50">
|
|
70
|
-
<div className="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8 py-12">
|
|
71
|
-
<div className="flex items-center justify-between">
|
|
72
|
-
<div className="flex items-center space-x-4">
|
|
73
|
-
<IconBadge
|
|
74
|
-
variant="category"
|
|
75
|
-
category={1}
|
|
76
|
-
size="lg"
|
|
77
|
-
icon={<Grid3X3 className="w-6 h-6" />}
|
|
78
|
-
/>
|
|
79
|
-
<div>
|
|
80
|
-
<h1 className="text-4xl font-bold text-foreground">Component Showcase</h1>
|
|
81
|
-
<p className="text-lg text-muted-foreground mt-2">
|
|
82
|
-
Explore our comprehensive design system and component library built for data analytics interfaces
|
|
83
|
-
</p>
|
|
84
|
-
</div>
|
|
85
|
-
</div>
|
|
86
|
-
|
|
87
|
-
<div className="flex items-center space-x-3">
|
|
88
|
-
<div className="flex items-center gap-3 bg-card/80 backdrop-blur-sm border border-border/50 rounded px-3 py-2">
|
|
89
|
-
<Layers className="w-4 h-4 text-muted-foreground" />
|
|
90
|
-
<span className="text-sm font-medium text-foreground">Show Code</span>
|
|
91
|
-
<Switch
|
|
92
|
-
checked={showCode}
|
|
93
|
-
onCheckedChange={setShowCode}
|
|
94
|
-
/>
|
|
95
|
-
</div>
|
|
96
|
-
</div>
|
|
97
|
-
</div>
|
|
98
|
-
|
|
99
|
-
{/* Quick Stats */}
|
|
100
|
-
<div className="mt-8 grid grid-cols-1 md:grid-cols-4 gap-4">
|
|
101
|
-
<StatCard
|
|
102
|
-
title="Components"
|
|
103
|
-
value="20+"
|
|
104
|
-
subtitle="Design system components"
|
|
105
|
-
category={1}
|
|
106
|
-
icon={<Database className="w-4 h-4" />}
|
|
107
|
-
/>
|
|
108
|
-
<StatCard
|
|
109
|
-
title="Colors"
|
|
110
|
-
value="20+"
|
|
111
|
-
subtitle="System colors & variants"
|
|
112
|
-
category={2}
|
|
113
|
-
icon={<Palette className="w-4 h-4" />}
|
|
114
|
-
/>
|
|
115
|
-
<StatCard
|
|
116
|
-
title="Variants"
|
|
117
|
-
value="50+"
|
|
118
|
-
subtitle="Component variations"
|
|
119
|
-
category={3}
|
|
120
|
-
icon={<CheckCircle className="w-4 h-4" />}
|
|
121
|
-
/>
|
|
122
|
-
<StatCard
|
|
123
|
-
title="Interactive"
|
|
124
|
-
value="100%"
|
|
125
|
-
subtitle="Fully interactive components"
|
|
126
|
-
category={4}
|
|
127
|
-
icon={<Activity className="w-4 h-4" />}
|
|
128
|
-
/>
|
|
129
|
-
</div>
|
|
130
|
-
</div>
|
|
131
|
-
</div>
|
|
132
|
-
|
|
133
|
-
{/* Main Content */}
|
|
134
|
-
<div className="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8 py-8">
|
|
135
|
-
<div className="space-y-8">
|
|
136
|
-
|
|
137
|
-
{/* Navigation */}
|
|
138
|
-
<Tabs value={activeSection} onValueChange={setActiveSection} className="w-full">
|
|
139
|
-
{
|
|
140
|
-
<TabsList className="grid w-full grid-cols-10 lg:w-fit lg:mx-auto mb-8">
|
|
141
|
-
<TabsTrigger value="badges" category={1}>Badges</TabsTrigger>
|
|
142
|
-
<TabsTrigger value="cards" category={2}>Cards</TabsTrigger>
|
|
143
|
-
<TabsTrigger value="tables" category={3}>Data</TabsTrigger>
|
|
144
|
-
<TabsTrigger value="forms" category={4}>Forms</TabsTrigger>
|
|
145
|
-
<TabsTrigger value="navigation" category={5}>Navigation</TabsTrigger>
|
|
146
|
-
<TabsTrigger value="feedback" category={6}>Feedback</TabsTrigger>
|
|
147
|
-
<TabsTrigger value="states" category={7}>States</TabsTrigger>
|
|
148
|
-
<TabsTrigger value="palettes" category={8}>Palettes</TabsTrigger>
|
|
149
|
-
<TabsTrigger value="typography" category={1}>Typography</TabsTrigger>
|
|
150
|
-
<TabsTrigger value="debug" category={2}>Debug</TabsTrigger>
|
|
151
|
-
</TabsList>
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
{/* Badges Section */}
|
|
155
|
-
<TabsContent value="badges" className="space-y-6">
|
|
156
|
-
<div className="space-y-2 mb-8">
|
|
157
|
-
<h2 className="text-2xl font-bold text-foreground">Badge Components</h2>
|
|
158
|
-
<p className="text-muted-foreground">
|
|
159
|
-
From base UI badges to semantic data badges with design tokens and theming.
|
|
160
|
-
</p>
|
|
161
|
-
</div>
|
|
162
|
-
|
|
163
|
-
<div className="grid gap-6">
|
|
164
|
-
{/* Base Badge Component */}
|
|
165
|
-
<Card className="p-6" category={1}>
|
|
166
|
-
<ShowcaseSection
|
|
167
|
-
title="Base Badge Component"
|
|
168
|
-
description="Foundation UI badge with default variants and sizes"
|
|
169
|
-
badge={{ text: "UI Component", variant: "category", category: 1 }}
|
|
170
|
-
>
|
|
171
|
-
<div className="space-y-4">
|
|
172
|
-
<div>
|
|
173
|
-
<h4 className="text-sm font-medium mb-3">Variants</h4>
|
|
174
|
-
<div className="flex flex-wrap gap-2">
|
|
175
|
-
<Badge variant="default">Default</Badge>
|
|
176
|
-
<Badge variant="secondary">Secondary</Badge>
|
|
177
|
-
<Badge variant="destructive">Destructive</Badge>
|
|
178
|
-
<Badge variant="outline">Outline</Badge>
|
|
179
|
-
</div>
|
|
180
|
-
</div>
|
|
181
|
-
|
|
182
|
-
<div>
|
|
183
|
-
<h4 className="text-sm font-medium mb-3">Sizes</h4>
|
|
184
|
-
<div className="flex flex-wrap items-center gap-2">
|
|
185
|
-
<Badge size="sm">Small</Badge>
|
|
186
|
-
<Badge size="md">Medium</Badge>
|
|
187
|
-
<Badge size="lg">Large</Badge>
|
|
188
|
-
</div>
|
|
189
|
-
</div>
|
|
190
|
-
|
|
191
|
-
{showCode && (
|
|
192
|
-
<div className="mt-3 p-3 bg-muted/50 rounded text-sm font-mono">
|
|
193
|
-
<code>{`<Badge variant="default">Default</Badge>
|
|
194
|
-
<Badge variant="secondary">Secondary</Badge>`}</code>
|
|
195
|
-
</div>
|
|
196
|
-
)}
|
|
197
|
-
</div>
|
|
198
|
-
</ShowcaseSection>
|
|
199
|
-
</Card>
|
|
200
|
-
|
|
201
|
-
{/* DataBadge - Category */}
|
|
202
|
-
<Card className="p-6" category={2}>
|
|
203
|
-
<ShowcaseSection
|
|
204
|
-
title="DataBadge with Category Theming"
|
|
205
|
-
description="Extended badge component using design tokens for data categorization"
|
|
206
|
-
badge={{ text: "Business Component", variant: "category", category: 2 }}
|
|
207
|
-
>
|
|
208
|
-
<div className="space-y-4">
|
|
209
|
-
<div>
|
|
210
|
-
<h4 className="text-sm font-medium mb-3">Category Colors (Design Tokens)</h4>
|
|
211
|
-
<div className="flex flex-wrap gap-2">
|
|
212
|
-
{[1, 2, 3, 4, 5, 6, 7, 8].map(category => (
|
|
213
|
-
<DataBadge key={category} variant="category" category={category as 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8}>
|
|
214
|
-
Category {category}
|
|
215
|
-
</DataBadge>
|
|
216
|
-
))}
|
|
217
|
-
</div>
|
|
218
|
-
</div>
|
|
219
|
-
|
|
220
|
-
<div>
|
|
221
|
-
<h4 className="text-sm font-medium mb-3">Sizes & Interactive States</h4>
|
|
222
|
-
<div className="flex flex-wrap items-center gap-2">
|
|
223
|
-
<DataBadge variant="category" category={1} size="sm">Small</DataBadge>
|
|
224
|
-
<DataBadge variant="category" category={2} size="md">Medium</DataBadge>
|
|
225
|
-
<DataBadge variant="category" category={3} size="lg">Large</DataBadge>
|
|
226
|
-
<DataBadge variant="category" category={4} interactive onClick={() => alert('Interactive badge clicked!')}>
|
|
227
|
-
Interactive (Click me)
|
|
228
|
-
</DataBadge>
|
|
229
|
-
</div>
|
|
230
|
-
</div>
|
|
231
|
-
|
|
232
|
-
{showCode && (
|
|
233
|
-
<div className="mt-3 p-3 bg-muted/50 rounded text-sm font-mono">
|
|
234
|
-
<code>{`<DataBadge variant="category" category={1}>
|
|
235
|
-
Category 1
|
|
236
|
-
</DataBadge>`}</code>
|
|
237
|
-
</div>
|
|
238
|
-
)}
|
|
239
|
-
</div>
|
|
240
|
-
</ShowcaseSection>
|
|
241
|
-
</Card>
|
|
242
|
-
|
|
243
|
-
{/* DataBadge - Status */}
|
|
244
|
-
<Card className="p-6" category={3}>
|
|
245
|
-
<ShowcaseSection
|
|
246
|
-
title="DataBadge with Status Theming"
|
|
247
|
-
description="Semantic status indicators using design system colors"
|
|
248
|
-
badge={{ text: "Business Component", variant: "category", category: 3 }}
|
|
249
|
-
>
|
|
250
|
-
<div className="space-y-4">
|
|
251
|
-
<div>
|
|
252
|
-
<h4 className="text-sm font-medium mb-3">Status Variants (Semantic Colors)</h4>
|
|
253
|
-
<div className="flex flex-wrap gap-2">
|
|
254
|
-
<DataBadge variant="status" status="success">
|
|
255
|
-
<CheckCircle className="w-3 h-3 mr-1" />
|
|
256
|
-
Success
|
|
257
|
-
</DataBadge>
|
|
258
|
-
<DataBadge variant="status" status="warning">
|
|
259
|
-
<AlertTriangle className="w-3 h-3 mr-1" />
|
|
260
|
-
Warning
|
|
261
|
-
</DataBadge>
|
|
262
|
-
<DataBadge variant="status" status="error">
|
|
263
|
-
<XCircle className="w-3 h-3 mr-1" />
|
|
264
|
-
Error
|
|
265
|
-
</DataBadge>
|
|
266
|
-
<DataBadge variant="status" status="info">
|
|
267
|
-
<Info className="w-3 h-3 mr-1" />
|
|
268
|
-
Info
|
|
269
|
-
</DataBadge>
|
|
270
|
-
<DataBadge variant="status" status="neutral">
|
|
271
|
-
<Clock className="w-3 h-3 mr-1" />
|
|
272
|
-
Neutral
|
|
273
|
-
</DataBadge>
|
|
274
|
-
</div>
|
|
275
|
-
</div>
|
|
276
|
-
|
|
277
|
-
{showCode && (
|
|
278
|
-
<div className="mt-4 p-4 bg-muted border border-border rounded-md">
|
|
279
|
-
<pre className="text-sm font-mono text-foreground overflow-x-auto">
|
|
280
|
-
<code>{`<DataBadge variant="status" status="success">Success</DataBadge>
|
|
281
|
-
<DataBadge variant="status" status="warning">Warning</DataBadge>
|
|
282
|
-
<DataBadge variant="status" status="error">Error</DataBadge>
|
|
283
|
-
<DataBadge variant="status" status="info">Info</DataBadge>`}</code>
|
|
284
|
-
</pre>
|
|
285
|
-
</div>
|
|
286
|
-
)}
|
|
287
|
-
</div>
|
|
288
|
-
</ShowcaseSection>
|
|
289
|
-
</Card>
|
|
290
|
-
|
|
291
|
-
{/* Token Usage Example */}
|
|
292
|
-
<Card className="p-6" category={4}>
|
|
293
|
-
<ShowcaseSection
|
|
294
|
-
title="Design Token Usage"
|
|
295
|
-
description="How components leverage design tokens for consistent theming"
|
|
296
|
-
badge={{ text: "Architecture", variant: "category", category: 4 }}
|
|
297
|
-
>
|
|
298
|
-
<div className="space-y-4">
|
|
299
|
-
<div className="grid md:grid-cols-2 gap-4">
|
|
300
|
-
<div>
|
|
301
|
-
<h4 className="text-sm font-medium mb-3">CSS Variables Applied</h4>
|
|
302
|
-
<div className="space-y-2 text-xs font-mono">
|
|
303
|
-
<div className="p-2 bg-category-1/10 text-category-1 rounded border border-category-1/20">
|
|
304
|
-
--category-1: {getComputedStyle(document.documentElement).getPropertyValue('--category-1') || '217 91% 60%'}
|
|
305
|
-
</div>
|
|
306
|
-
<div className="p-2 bg-status-success/10 text-status-success rounded border border-status-success/20">
|
|
307
|
-
--status-success: {getComputedStyle(document.documentElement).getPropertyValue('--status-success') || '142 76% 36%'}
|
|
308
|
-
</div>
|
|
309
|
-
</div>
|
|
310
|
-
</div>
|
|
311
|
-
|
|
312
|
-
<div>
|
|
313
|
-
<h4 className="text-sm font-medium mb-3">Component Classes</h4>
|
|
314
|
-
<div className="space-y-2 text-xs">
|
|
315
|
-
<div className="p-2 bg-muted rounded">
|
|
316
|
-
<code>.badge-category-1</code> uses <code>var(--category-1)</code>
|
|
317
|
-
</div>
|
|
318
|
-
<div className="p-2 bg-muted rounded">
|
|
319
|
-
<code>.status-success</code> uses <code>var(--status-success)</code>
|
|
320
|
-
</div>
|
|
321
|
-
</div>
|
|
322
|
-
</div>
|
|
323
|
-
</div>
|
|
324
|
-
</div>
|
|
325
|
-
</ShowcaseSection>
|
|
326
|
-
</Card>
|
|
327
|
-
</div>
|
|
328
|
-
</TabsContent>
|
|
329
|
-
|
|
330
|
-
{/* Cards Section */}
|
|
331
|
-
<TabsContent value="cards" className="space-y-6">
|
|
332
|
-
<div className="space-y-2 mb-8">
|
|
333
|
-
<h2 className="text-2xl font-bold text-foreground">Card Components</h2>
|
|
334
|
-
<p className="text-muted-foreground">
|
|
335
|
-
From base cards to specialized data visualization cards with metrics and analytics.
|
|
336
|
-
</p>
|
|
337
|
-
</div>
|
|
338
|
-
|
|
339
|
-
<div className="grid gap-6">
|
|
340
|
-
{/* Base Card Component */}
|
|
341
|
-
<Card className="p-6" category={1}>
|
|
342
|
-
<ShowcaseSection
|
|
343
|
-
title="Base Card Component"
|
|
344
|
-
description="Foundation card with optional category theming"
|
|
345
|
-
badge={{ text: "UI Component", variant: "category", category: 1 }}
|
|
346
|
-
>
|
|
347
|
-
<div className="space-y-4">
|
|
348
|
-
<div className="grid md:grid-cols-3 gap-4">
|
|
349
|
-
<Card className="p-4">
|
|
350
|
-
<h4 className="font-medium mb-2">Basic Card</h4>
|
|
351
|
-
<p className="text-sm text-muted-foreground">Standard card with default styling</p>
|
|
352
|
-
</Card>
|
|
353
|
-
|
|
354
|
-
<Card className="p-4" category={2}>
|
|
355
|
-
<h4 className="font-medium mb-2">Category Card</h4>
|
|
356
|
-
<p className="text-sm text-muted-foreground">Card with category color accent</p>
|
|
357
|
-
</Card>
|
|
358
|
-
|
|
359
|
-
<Card className="p-4" category={4}>
|
|
360
|
-
<h4 className="font-medium mb-2">Themed Card</h4>
|
|
361
|
-
<p className="text-sm text-muted-foreground">Using design token theming</p>
|
|
362
|
-
</Card>
|
|
363
|
-
</div>
|
|
364
|
-
|
|
365
|
-
{showCode && (
|
|
366
|
-
<div className="mt-4 p-4 bg-muted border border-border rounded-md">
|
|
367
|
-
<pre className="text-sm font-mono text-foreground overflow-x-auto">
|
|
368
|
-
<code>
|
|
369
|
-
{`<Card category={2}>Card with category theming</Card>`}
|
|
370
|
-
</code>
|
|
371
|
-
</pre>
|
|
372
|
-
</div>
|
|
373
|
-
)}
|
|
374
|
-
</div>
|
|
375
|
-
</ShowcaseSection>
|
|
376
|
-
</Card>
|
|
377
|
-
|
|
378
|
-
{/* StatCard Component */}
|
|
379
|
-
<Card className="p-6" category={2}>
|
|
380
|
-
<ShowcaseSection
|
|
381
|
-
title="StatCard Component"
|
|
382
|
-
description="Specialized card for displaying key metrics with trends"
|
|
383
|
-
badge={{ text: "Business Component", variant: "category", category: 2 }}
|
|
384
|
-
>
|
|
385
|
-
<div className="space-y-4">
|
|
386
|
-
<div className="grid md:grid-cols-2 lg:grid-cols-3 gap-4">
|
|
387
|
-
<StatCard
|
|
388
|
-
title="Total Models"
|
|
389
|
-
value="1,234"
|
|
390
|
-
subtitle="Active dbt models"
|
|
391
|
-
category={1}
|
|
392
|
-
icon={<Database className="w-5 h-5" />}
|
|
393
|
-
trend={{ value: 12.5, label: "vs last month" }}
|
|
394
|
-
/>
|
|
395
|
-
<StatCard
|
|
396
|
-
title="Success Rate"
|
|
397
|
-
value="99.2%"
|
|
398
|
-
subtitle="Test pass rate"
|
|
399
|
-
category={2}
|
|
400
|
-
icon={<CheckCircle className="w-5 h-5" />}
|
|
401
|
-
trend={{ value: 2.1, label: "vs last week" }}
|
|
402
|
-
/>
|
|
403
|
-
<StatCard
|
|
404
|
-
title="Active Users"
|
|
405
|
-
value="567"
|
|
406
|
-
subtitle="Monthly active users"
|
|
407
|
-
category={3}
|
|
408
|
-
icon={<Users className="w-5 h-5" />}
|
|
409
|
-
trend={{ value: -3.2, label: "vs last month" }}
|
|
410
|
-
/>
|
|
411
|
-
</div>
|
|
412
|
-
|
|
413
|
-
{showCode && (
|
|
414
|
-
<div className="mt-4 p-4 bg-muted border border-border rounded-md">
|
|
415
|
-
<pre className="text-sm font-mono text-foreground overflow-x-auto">
|
|
416
|
-
<code>{`<StatCard
|
|
417
|
-
title="Total Models"
|
|
418
|
-
value="1,234"
|
|
419
|
-
subtitle="Active dbt models"
|
|
420
|
-
category={1}
|
|
421
|
-
icon={<Database />}
|
|
422
|
-
trend={{ value: 12.5, label: "vs last month" }}
|
|
423
|
-
/>`}</code>
|
|
424
|
-
</pre>
|
|
425
|
-
</div>
|
|
426
|
-
)}
|
|
427
|
-
</div>
|
|
428
|
-
</ShowcaseSection>
|
|
429
|
-
</Card>
|
|
430
|
-
|
|
431
|
-
{/* DetailedCard Component */}
|
|
432
|
-
<Card className="p-6" category={3}>
|
|
433
|
-
<ShowcaseSection
|
|
434
|
-
title="DetailedCard Component"
|
|
435
|
-
description="Rich information card with multiple metrics and interactive elements"
|
|
436
|
-
badge={{ text: "Business Component", variant: "category", category: 3 }}
|
|
437
|
-
>
|
|
438
|
-
<DetailedCard
|
|
439
|
-
title="Customer Analytics Model"
|
|
440
|
-
subtitle="Production Model"
|
|
441
|
-
description="Advanced analytics model for customer behavior tracking and segmentation."
|
|
442
|
-
category={1}
|
|
443
|
-
icon={<Database className="w-5 h-5" />}
|
|
444
|
-
primaryMetric={{
|
|
445
|
-
label: "Success Rate",
|
|
446
|
-
value: "98.7%",
|
|
447
|
-
trend: { value: 5.2, label: "vs last week" }
|
|
448
|
-
}}
|
|
449
|
-
secondaryMetrics={[
|
|
450
|
-
{ label: "Daily Runs", value: "24", status: "success" },
|
|
451
|
-
{ label: "Avg Runtime", value: "2.4min", status: "info" },
|
|
452
|
-
{ label: "Data Quality", value: "95%", status: "warning" },
|
|
453
|
-
{ label: "Test Coverage", value: "87%", status: "success" }
|
|
454
|
-
]}
|
|
455
|
-
tags={[
|
|
456
|
-
{ label: "Production", status: "success" },
|
|
457
|
-
{ label: "Analytics", category: 1 },
|
|
458
|
-
{ label: "Customer Data", category: 3 }
|
|
459
|
-
]}
|
|
460
|
-
onClick={() => alert('Model details clicked!')}
|
|
461
|
-
/>
|
|
462
|
-
</ShowcaseSection>
|
|
463
|
-
</Card>
|
|
464
|
-
|
|
465
|
-
{/* Card Design Tokens */}
|
|
466
|
-
<Card className="p-6" category={4}>
|
|
467
|
-
<ShowcaseSection
|
|
468
|
-
title="Card Theming & Composition"
|
|
469
|
-
description="How cards leverage design tokens and compose with other components"
|
|
470
|
-
badge={{ text: "Architecture", variant: "category", category: 4 }}
|
|
471
|
-
>
|
|
472
|
-
<div className="space-y-4">
|
|
473
|
-
<div className="grid md:grid-cols-2 gap-4">
|
|
474
|
-
<div>
|
|
475
|
-
<h4 className="text-sm font-medium mb-3">Component Hierarchy</h4>
|
|
476
|
-
<div className="space-y-2 text-xs">
|
|
477
|
-
<div className="p-2 bg-muted rounded flex items-center gap-2">
|
|
478
|
-
<span className="font-mono">Card</span>
|
|
479
|
-
<span className="text-muted-foreground">→ Base container</span>
|
|
480
|
-
</div>
|
|
481
|
-
<div className="p-2 bg-muted rounded flex items-center gap-2 ml-4">
|
|
482
|
-
<span className="font-mono">StatCard</span>
|
|
483
|
-
<span className="text-muted-foreground">→ Metrics display</span>
|
|
484
|
-
</div>
|
|
485
|
-
<div className="p-2 bg-muted rounded flex items-center gap-2 ml-4">
|
|
486
|
-
<span className="font-mono">DetailedCard</span>
|
|
487
|
-
<span className="text-muted-foreground">→ Rich content</span>
|
|
488
|
-
</div>
|
|
489
|
-
</div>
|
|
490
|
-
</div>
|
|
491
|
-
|
|
492
|
-
<div>
|
|
493
|
-
<h4 className="text-sm font-medium mb-3">Composed Elements</h4>
|
|
494
|
-
<div className="space-y-2 text-xs">
|
|
495
|
-
<div className="p-2 bg-muted rounded">
|
|
496
|
-
Uses <code>DataBadge</code> for tags
|
|
497
|
-
</div>
|
|
498
|
-
<div className="p-2 bg-muted rounded">
|
|
499
|
-
Uses <code>IconBadge</code> for icons
|
|
500
|
-
</div>
|
|
501
|
-
<div className="p-2 bg-muted rounded">
|
|
502
|
-
Category theming via CSS variables
|
|
503
|
-
</div>
|
|
504
|
-
</div>
|
|
505
|
-
</div>
|
|
506
|
-
</div>
|
|
507
|
-
</div>
|
|
508
|
-
</ShowcaseSection>
|
|
509
|
-
</Card>
|
|
510
|
-
</div>
|
|
511
|
-
</TabsContent>
|
|
512
|
-
|
|
513
|
-
{/* Tables Section */}
|
|
514
|
-
<TabsContent value="tables" className="space-y-6">
|
|
515
|
-
<div className="space-y-2 mb-8">
|
|
516
|
-
<h2 className="text-2xl font-bold text-foreground">Data Visualization</h2>
|
|
517
|
-
<p className="text-muted-foreground">
|
|
518
|
-
Tables and charts for displaying and visualizing data with sorting, filtering, and interactive features.
|
|
519
|
-
</p>
|
|
520
|
-
</div>
|
|
521
|
-
|
|
522
|
-
<div className="grid gap-6">
|
|
523
|
-
{/* Base Table Component */}
|
|
524
|
-
<Card className="p-6" category={1}>
|
|
525
|
-
<ShowcaseSection
|
|
526
|
-
title="Base Table Component"
|
|
527
|
-
description="Foundation table components with semantic HTML structure"
|
|
528
|
-
badge={{ text: "UI Component", variant: "category", category: 1 }}
|
|
529
|
-
>
|
|
530
|
-
<div className="space-y-4">
|
|
531
|
-
<Table>
|
|
532
|
-
<TableHeader>
|
|
533
|
-
<TableRow>
|
|
534
|
-
<TableHead>Name</TableHead>
|
|
535
|
-
<TableHead>Status</TableHead>
|
|
536
|
-
<TableHead>Category</TableHead>
|
|
537
|
-
<TableHead className="text-right">Value</TableHead>
|
|
538
|
-
</TableRow>
|
|
539
|
-
</TableHeader>
|
|
540
|
-
<TableBody>
|
|
541
|
-
<TableRow>
|
|
542
|
-
<TableCell>Customer Analytics</TableCell>
|
|
543
|
-
<TableCell>Active</TableCell>
|
|
544
|
-
<TableCell>Analytics</TableCell>
|
|
545
|
-
<TableCell className="text-right">1,234</TableCell>
|
|
546
|
-
</TableRow>
|
|
547
|
-
<TableRow>
|
|
548
|
-
<TableCell>Revenue Model</TableCell>
|
|
549
|
-
<TableCell>Pending</TableCell>
|
|
550
|
-
<TableCell>Finance</TableCell>
|
|
551
|
-
<TableCell className="text-right">567</TableCell>
|
|
552
|
-
</TableRow>
|
|
553
|
-
</TableBody>
|
|
554
|
-
</Table>
|
|
555
|
-
|
|
556
|
-
{showCode && (
|
|
557
|
-
<div className="mt-4 p-4 bg-muted border border-border rounded-md">
|
|
558
|
-
<pre className="text-sm font-mono text-foreground overflow-x-auto">
|
|
559
|
-
<code>{`<Table>
|
|
560
|
-
<TableHeader>
|
|
561
|
-
<TableRow>
|
|
562
|
-
<TableHead>Name</TableHead>
|
|
563
|
-
</TableRow>
|
|
564
|
-
</TableHeader>
|
|
565
|
-
<TableBody>
|
|
566
|
-
<TableRow>
|
|
567
|
-
<TableCell>Data</TableCell>
|
|
568
|
-
</TableRow>
|
|
569
|
-
</TableBody>
|
|
570
|
-
</Table>`}</code>
|
|
571
|
-
</pre>
|
|
572
|
-
</div>
|
|
573
|
-
)}
|
|
574
|
-
</div>
|
|
575
|
-
</ShowcaseSection>
|
|
576
|
-
</Card>
|
|
577
|
-
|
|
578
|
-
{/* DataTable Component */}
|
|
579
|
-
<Card className="p-6" category={2}>
|
|
580
|
-
<ShowcaseSection
|
|
581
|
-
title="DataTable Component"
|
|
582
|
-
description="Feature-rich table with search, sorting, hover states, and click handlers"
|
|
583
|
-
badge={{ text: "Business Component", variant: "category", category: 2 }}
|
|
584
|
-
>
|
|
585
|
-
<DataTable
|
|
586
|
-
data={sampleData}
|
|
587
|
-
columns={tableColumns}
|
|
588
|
-
searchPlaceholder="Search models..."
|
|
589
|
-
onRowClick={(item) => alert(`Clicked: ${item.name}`)}
|
|
590
|
-
hover={true}
|
|
591
|
-
/>
|
|
592
|
-
|
|
593
|
-
{showCode && (
|
|
594
|
-
<div className="mt-4 p-4 bg-muted border border-border rounded-md">
|
|
595
|
-
<pre className="text-sm font-mono text-foreground overflow-x-auto">
|
|
596
|
-
<code>{`<DataTable
|
|
597
|
-
data={sampleData}
|
|
598
|
-
columns={[
|
|
599
|
-
{ key: 'name', header: 'Model Name' },
|
|
600
|
-
{ key: 'status', header: 'Status', type: 'status' },
|
|
601
|
-
{ key: 'category', header: 'Category', type: 'category' }
|
|
602
|
-
]}
|
|
603
|
-
searchPlaceholder="Search models..."
|
|
604
|
-
onRowClick={(item) => alert(item.name)}
|
|
605
|
-
hover={true}
|
|
606
|
-
/>`}</code>
|
|
607
|
-
</pre>
|
|
608
|
-
</div>
|
|
609
|
-
)}
|
|
610
|
-
</ShowcaseSection>
|
|
611
|
-
</Card>
|
|
612
|
-
|
|
613
|
-
{/* Table Features */}
|
|
614
|
-
<Card className="p-6" category={3}>
|
|
615
|
-
<ShowcaseSection
|
|
616
|
-
title="Table Features & Composition"
|
|
617
|
-
description="How DataTable composes UI elements and leverages the design system"
|
|
618
|
-
badge={{ text: "Architecture", variant: "category", category: 3 }}
|
|
619
|
-
>
|
|
620
|
-
<div className="space-y-4">
|
|
621
|
-
<div className="grid md:grid-cols-2 gap-4">
|
|
622
|
-
<div>
|
|
623
|
-
<h4 className="text-sm font-medium mb-3">Integrated Components</h4>
|
|
624
|
-
<div className="space-y-2 text-xs">
|
|
625
|
-
<div className="p-2 bg-muted rounded">
|
|
626
|
-
<code>Input</code> for search functionality
|
|
627
|
-
</div>
|
|
628
|
-
<div className="p-2 bg-muted rounded">
|
|
629
|
-
<code>DataBadge</code> for status/category cells
|
|
630
|
-
</div>
|
|
631
|
-
<div className="p-2 bg-muted rounded">
|
|
632
|
-
<code>Button</code> for actions
|
|
633
|
-
</div>
|
|
634
|
-
</div>
|
|
635
|
-
</div>
|
|
636
|
-
|
|
637
|
-
<div>
|
|
638
|
-
<h4 className="text-sm font-medium mb-3">Features</h4>
|
|
639
|
-
<div className="space-y-2 text-xs">
|
|
640
|
-
<div className="p-2 bg-muted rounded">
|
|
641
|
-
✓ Client-side search/filter
|
|
642
|
-
</div>
|
|
643
|
-
<div className="p-2 bg-muted rounded">
|
|
644
|
-
✓ Hover row highlighting
|
|
645
|
-
</div>
|
|
646
|
-
<div className="p-2 bg-muted rounded">
|
|
647
|
-
✓ Click handlers
|
|
648
|
-
</div>
|
|
649
|
-
<div className="p-2 bg-muted rounded">
|
|
650
|
-
✓ Type-aware cell rendering
|
|
651
|
-
</div>
|
|
652
|
-
</div>
|
|
653
|
-
</div>
|
|
654
|
-
</div>
|
|
655
|
-
</div>
|
|
656
|
-
</ShowcaseSection>
|
|
657
|
-
</Card>
|
|
658
|
-
|
|
659
|
-
{/* Chart Component */}
|
|
660
|
-
<Card className="p-6" category={4}>
|
|
661
|
-
<ShowcaseSection
|
|
662
|
-
title="Chart Component"
|
|
663
|
-
description="Data visualization charts with multiple types, interactive features, and accessibility support"
|
|
664
|
-
badge={{ text: "Business Component", variant: "category", category: 4 }}
|
|
665
|
-
>
|
|
666
|
-
<div className="space-y-6">
|
|
667
|
-
<div className="grid md:grid-cols-2 gap-6">
|
|
668
|
-
{/* Bar Chart */}
|
|
669
|
-
<Chart
|
|
670
|
-
title="Monthly Revenue"
|
|
671
|
-
subtitle="Revenue by month"
|
|
672
|
-
type="bar"
|
|
673
|
-
category={1}
|
|
674
|
-
height="medium"
|
|
675
|
-
data={[
|
|
676
|
-
{ label: 'Jan', value: 4200 },
|
|
677
|
-
{ label: 'Feb', value: 5300 },
|
|
678
|
-
{ label: 'Mar', value: 6100 },
|
|
679
|
-
{ label: 'Apr', value: 5900 },
|
|
680
|
-
{ label: 'May', value: 7200 },
|
|
681
|
-
{ label: 'Jun', value: 8100 }
|
|
682
|
-
]}
|
|
683
|
-
showValues
|
|
684
|
-
showTrend
|
|
685
|
-
trend={{ value: 12.5, label: "vs last period" }}
|
|
686
|
-
onClick={() => alert('Chart clicked!')}
|
|
687
|
-
/>
|
|
688
|
-
|
|
689
|
-
{/* Line Chart */}
|
|
690
|
-
<Chart
|
|
691
|
-
title="User Growth"
|
|
692
|
-
subtitle="Active users over time"
|
|
693
|
-
type="line"
|
|
694
|
-
category={2}
|
|
695
|
-
height="medium"
|
|
696
|
-
data={[
|
|
697
|
-
{ label: 'Week 1', value: 120 },
|
|
698
|
-
{ label: 'Week 2', value: 145 },
|
|
699
|
-
{ label: 'Week 3', value: 139 },
|
|
700
|
-
{ label: 'Week 4', value: 167 },
|
|
701
|
-
{ label: 'Week 5', value: 185 },
|
|
702
|
-
{ label: 'Week 6', value: 201 }
|
|
703
|
-
]}
|
|
704
|
-
showTrend
|
|
705
|
-
trend={{ value: 8.3, label: "growth" }}
|
|
706
|
-
/>
|
|
707
|
-
</div>
|
|
708
|
-
|
|
709
|
-
<div className="grid md:grid-cols-2 gap-6">
|
|
710
|
-
{/* Area Chart */}
|
|
711
|
-
<Chart
|
|
712
|
-
title="System Load"
|
|
713
|
-
subtitle="CPU usage over time"
|
|
714
|
-
type="area"
|
|
715
|
-
category={4}
|
|
716
|
-
data={[
|
|
717
|
-
{ label: '00:00', value: 45 },
|
|
718
|
-
{ label: '04:00', value: 32 },
|
|
719
|
-
{ label: '08:00', value: 67 },
|
|
720
|
-
{ label: '12:00', value: 78 },
|
|
721
|
-
{ label: '16:00', value: 82 },
|
|
722
|
-
{ label: '20:00', value: 54 }
|
|
723
|
-
]}
|
|
724
|
-
height="compact"
|
|
725
|
-
/>
|
|
726
|
-
</div>
|
|
727
|
-
|
|
728
|
-
<div>
|
|
729
|
-
<h4 className="text-sm font-medium mb-3">Chart Variants</h4>
|
|
730
|
-
<div className="grid md:grid-cols-3 gap-4">
|
|
731
|
-
<Chart
|
|
732
|
-
title="Minimal Chart"
|
|
733
|
-
type="bar"
|
|
734
|
-
variant="minimal"
|
|
735
|
-
category={5}
|
|
736
|
-
data={[
|
|
737
|
-
{ label: 'A', value: 20 },
|
|
738
|
-
{ label: 'B', value: 35 },
|
|
739
|
-
{ label: 'C', value: 45 },
|
|
740
|
-
{ label: 'D', value: 30 }
|
|
741
|
-
]}
|
|
742
|
-
height="sidebar"
|
|
743
|
-
/>
|
|
744
|
-
|
|
745
|
-
<Chart
|
|
746
|
-
title="Loading State"
|
|
747
|
-
type="line"
|
|
748
|
-
category={6}
|
|
749
|
-
data={[]}
|
|
750
|
-
isLoading
|
|
751
|
-
height="sidebar"
|
|
752
|
-
/>
|
|
753
|
-
|
|
754
|
-
<Chart
|
|
755
|
-
title="Custom Colors"
|
|
756
|
-
type="bar"
|
|
757
|
-
category={7}
|
|
758
|
-
data={[
|
|
759
|
-
{ label: 'Q1', value: 100 },
|
|
760
|
-
{ label: 'Q2', value: 150 },
|
|
761
|
-
{ label: 'Q3', value: 120 },
|
|
762
|
-
{ label: 'Q4', value: 180 }
|
|
763
|
-
]}
|
|
764
|
-
colorOverrides={['#FF6B6B', '#4ECDC4', '#45B7D1', '#96CEB4']}
|
|
765
|
-
height="sidebar"
|
|
766
|
-
/>
|
|
767
|
-
</div>
|
|
768
|
-
</div>
|
|
769
|
-
|
|
770
|
-
{showCode && (
|
|
771
|
-
<div className="mt-4 p-4 bg-muted border border-border rounded-md">
|
|
772
|
-
<pre className="text-sm font-mono text-foreground overflow-x-auto">
|
|
773
|
-
<code>{`<Chart
|
|
774
|
-
title="Monthly Revenue"
|
|
775
|
-
type="bar"
|
|
776
|
-
category={1}
|
|
777
|
-
data={chartData}
|
|
778
|
-
showValues
|
|
779
|
-
showTrend
|
|
780
|
-
trend={{ value: 12.5, label: "vs last period" }}
|
|
781
|
-
onClick={() => handleChartClick()}
|
|
782
|
-
/>`}</code>
|
|
783
|
-
</pre>
|
|
784
|
-
</div>
|
|
785
|
-
)}
|
|
786
|
-
</div>
|
|
787
|
-
</ShowcaseSection>
|
|
788
|
-
</Card>
|
|
789
|
-
|
|
790
|
-
</div>
|
|
791
|
-
</TabsContent>
|
|
792
|
-
|
|
793
|
-
{/* Forms Section */}
|
|
794
|
-
<TabsContent value="forms" className="space-y-6">
|
|
795
|
-
<div className="space-y-2 mb-8">
|
|
796
|
-
<h2 className="text-2xl font-bold text-foreground">Form Components</h2>
|
|
797
|
-
<p className="text-muted-foreground">
|
|
798
|
-
From base form inputs to complete form patterns with validation and organization.
|
|
799
|
-
</p>
|
|
800
|
-
</div>
|
|
801
|
-
|
|
802
|
-
<div className="grid gap-6">
|
|
803
|
-
{/* Base Form Elements */}
|
|
804
|
-
<Card className="p-6" category={1}>
|
|
805
|
-
<ShowcaseSection
|
|
806
|
-
title="Base Form Elements"
|
|
807
|
-
description="Foundation form components with labels and inputs"
|
|
808
|
-
badge={{ text: "UI Components", variant: "category", category: 1 }}
|
|
809
|
-
>
|
|
810
|
-
<div className="space-y-4 max-w-md">
|
|
811
|
-
<div className="space-y-2">
|
|
812
|
-
<Label htmlFor="basic-input">Basic Label</Label>
|
|
813
|
-
<Input id="basic-input" placeholder="Enter text..." />
|
|
814
|
-
</div>
|
|
815
|
-
|
|
816
|
-
<div className="space-y-2">
|
|
817
|
-
<Label htmlFor="email-input">Email Address</Label>
|
|
818
|
-
<Input id="email-input" type="email" placeholder="email@example.com" />
|
|
819
|
-
</div>
|
|
820
|
-
|
|
821
|
-
<div className="space-y-2">
|
|
822
|
-
<Label htmlFor="password-input">Password</Label>
|
|
823
|
-
<Input id="password-input" type="password" placeholder="Enter password" />
|
|
824
|
-
</div>
|
|
825
|
-
|
|
826
|
-
{showCode && (
|
|
827
|
-
<div className="mt-4 p-4 bg-muted border border-border rounded-md">
|
|
828
|
-
<pre className="text-sm font-mono text-foreground overflow-x-auto">
|
|
829
|
-
<code>{`<Label htmlFor="input">Label</Label>
|
|
830
|
-
<Input id="input" placeholder="Enter text..." />`}</code>
|
|
831
|
-
</pre>
|
|
832
|
-
</div>
|
|
833
|
-
)}
|
|
834
|
-
</div>
|
|
835
|
-
</ShowcaseSection>
|
|
836
|
-
</Card>
|
|
837
|
-
|
|
838
|
-
{/* FormField Component */}
|
|
839
|
-
<Card className="p-6" category={2}>
|
|
840
|
-
<ShowcaseSection
|
|
841
|
-
title="FormField Component"
|
|
842
|
-
description="Enhanced form field with label, description, and error states"
|
|
843
|
-
badge={{ text: "Molecule Component", variant: "category", category: 2 }}
|
|
844
|
-
>
|
|
845
|
-
<div className="space-y-6 max-w-md">
|
|
846
|
-
<FormField
|
|
847
|
-
label="Username"
|
|
848
|
-
description="This will be your display name"
|
|
849
|
-
required
|
|
850
|
-
htmlFor="username"
|
|
851
|
-
>
|
|
852
|
-
<Input id="username" placeholder="johndoe" />
|
|
853
|
-
</FormField>
|
|
854
|
-
|
|
855
|
-
<FormField
|
|
856
|
-
label="Email"
|
|
857
|
-
description="We'll never share your email"
|
|
858
|
-
error="Please enter a valid email address"
|
|
859
|
-
required
|
|
860
|
-
htmlFor="email"
|
|
861
|
-
>
|
|
862
|
-
<Input id="email" type="email" placeholder="email@example.com" />
|
|
863
|
-
</FormField>
|
|
864
|
-
|
|
865
|
-
<FormField
|
|
866
|
-
label="Bio"
|
|
867
|
-
layout="horizontal"
|
|
868
|
-
htmlFor="bio"
|
|
869
|
-
>
|
|
870
|
-
<Input id="bio" placeholder="Tell us about yourself" />
|
|
871
|
-
</FormField>
|
|
872
|
-
|
|
873
|
-
{showCode && (
|
|
874
|
-
<div className="mt-4 p-4 bg-muted border border-border rounded-md">
|
|
875
|
-
<pre className="text-sm font-mono text-foreground overflow-x-auto">
|
|
876
|
-
<code>{`<FormField
|
|
877
|
-
label="Email"
|
|
878
|
-
description="We'll never share your email"
|
|
879
|
-
error={errors.email}
|
|
880
|
-
required
|
|
881
|
-
>
|
|
882
|
-
<Input type="email" />
|
|
883
|
-
</FormField>`}</code>
|
|
884
|
-
</pre>
|
|
885
|
-
</div>
|
|
886
|
-
)}
|
|
887
|
-
</div>
|
|
888
|
-
</ShowcaseSection>
|
|
889
|
-
</Card>
|
|
890
|
-
|
|
891
|
-
{/* FormGroup Component */}
|
|
892
|
-
<Card className="p-6" category={3}>
|
|
893
|
-
<ShowcaseSection
|
|
894
|
-
title="FormGroup Component"
|
|
895
|
-
description="Organize related form fields into logical sections"
|
|
896
|
-
badge={{ text: "Molecule Component", variant: "category", category: 3 }}
|
|
897
|
-
>
|
|
898
|
-
<div className="space-y-6">
|
|
899
|
-
<FormGroup
|
|
900
|
-
title="Personal Information"
|
|
901
|
-
description="Basic details about your account"
|
|
902
|
-
variant="card"
|
|
903
|
-
category={6}
|
|
904
|
-
>
|
|
905
|
-
<FormField label="First Name" required htmlFor="firstName">
|
|
906
|
-
<Input id="firstName" placeholder="John" />
|
|
907
|
-
</FormField>
|
|
908
|
-
<FormField label="Last Name" required htmlFor="lastName">
|
|
909
|
-
<Input id="lastName" placeholder="Doe" />
|
|
910
|
-
</FormField>
|
|
911
|
-
<FormField label="Email" required htmlFor="groupEmail">
|
|
912
|
-
<Input id="groupEmail" type="email" placeholder="john@example.com" />
|
|
913
|
-
</FormField>
|
|
914
|
-
</FormGroup>
|
|
915
|
-
|
|
916
|
-
<FormGroup
|
|
917
|
-
title="Preferences"
|
|
918
|
-
description="Customize your experience"
|
|
919
|
-
variant="section"
|
|
920
|
-
>
|
|
921
|
-
<FormField label="Language" htmlFor="language">
|
|
922
|
-
<Input id="language" placeholder="English" />
|
|
923
|
-
</FormField>
|
|
924
|
-
<FormField label="Timezone" htmlFor="timezone">
|
|
925
|
-
<Input id="timezone" placeholder="UTC-5" />
|
|
926
|
-
</FormField>
|
|
927
|
-
</FormGroup>
|
|
928
|
-
</div>
|
|
929
|
-
</ShowcaseSection>
|
|
930
|
-
</Card>
|
|
931
|
-
|
|
932
|
-
{/* SearchInput Component */}
|
|
933
|
-
<Card className="p-6" category={4}>
|
|
934
|
-
<ShowcaseSection
|
|
935
|
-
title="SearchInput Component"
|
|
936
|
-
description="Advanced search with autocomplete and keyboard navigation"
|
|
937
|
-
badge={{ text: "Molecule Component", variant: "category", category: 4 }}
|
|
938
|
-
>
|
|
939
|
-
<div className="space-y-6">
|
|
940
|
-
<div className="max-w-md">
|
|
941
|
-
<h4 className="text-sm font-medium mb-3">With Results</h4>
|
|
942
|
-
<SearchInput
|
|
943
|
-
placeholder="Search users..."
|
|
944
|
-
results={[
|
|
945
|
-
{ id: '1', label: 'John Doe', description: 'john@example.com', category: 'User', icon: <Users className="w-4 h-4" /> },
|
|
946
|
-
{ id: '2', label: 'Jane Smith', description: 'jane@example.com', category: 'Admin', icon: <Users className="w-4 h-4" /> },
|
|
947
|
-
{ id: '3', label: 'Analytics Dashboard', description: 'View analytics', category: 'Page', icon: <Database className="w-4 h-4" /> }
|
|
948
|
-
]}
|
|
949
|
-
category={7}
|
|
950
|
-
onSelect={(result) => alert(`Selected: ${result.label}`)}
|
|
951
|
-
/>
|
|
952
|
-
</div>
|
|
953
|
-
|
|
954
|
-
<div className="max-w-md">
|
|
955
|
-
<h4 className="text-sm font-medium mb-3">Simple Search</h4>
|
|
956
|
-
<SearchInput
|
|
957
|
-
placeholder="Search anything..."
|
|
958
|
-
clearable={false}
|
|
959
|
-
category={2}
|
|
960
|
-
/>
|
|
961
|
-
</div>
|
|
962
|
-
|
|
963
|
-
{showCode && (
|
|
964
|
-
<div className="mt-4 p-4 bg-muted border border-border rounded-md">
|
|
965
|
-
<pre className="text-sm font-mono text-foreground overflow-x-auto">
|
|
966
|
-
<code>{`<SearchInput
|
|
967
|
-
placeholder="Search users..."
|
|
968
|
-
results={searchResults}
|
|
969
|
-
category={7}
|
|
970
|
-
onSelect={(result) => handleSelect(result)}
|
|
971
|
-
/>`}</code>
|
|
972
|
-
</pre>
|
|
973
|
-
</div>
|
|
974
|
-
)}
|
|
975
|
-
</div>
|
|
976
|
-
</ShowcaseSection>
|
|
977
|
-
</Card>
|
|
978
|
-
|
|
979
|
-
{/* FileUpload Component */}
|
|
980
|
-
<Card className="p-6" category={5}>
|
|
981
|
-
<ShowcaseSection
|
|
982
|
-
title="FileUpload Component"
|
|
983
|
-
description="Advanced file upload with drag-and-drop, previews, validation, and progress tracking"
|
|
984
|
-
badge={{ text: "Business Component", variant: "category", category: 5 }}
|
|
985
|
-
>
|
|
986
|
-
<div className="space-y-6">
|
|
987
|
-
<div>
|
|
988
|
-
<h4 className="text-sm font-medium mb-3">Default File Upload</h4>
|
|
989
|
-
<FileUpload
|
|
990
|
-
accept="image/*,.pdf,.doc,.docx"
|
|
991
|
-
multiple
|
|
992
|
-
maxSize={5 * 1024 * 1024}
|
|
993
|
-
maxFiles={5}
|
|
994
|
-
onChange={(files) => console.log('Files:', files)}
|
|
995
|
-
onUpload={async (files) => {
|
|
996
|
-
console.log('Uploading:', files);
|
|
997
|
-
// Simulate upload
|
|
998
|
-
await new Promise(resolve => setTimeout(resolve, 2000));
|
|
999
|
-
}}
|
|
1000
|
-
/>
|
|
1001
|
-
</div>
|
|
1002
|
-
|
|
1003
|
-
<div className="grid md:grid-cols-2 gap-6">
|
|
1004
|
-
<div>
|
|
1005
|
-
<h4 className="text-sm font-medium mb-3">Compact Variant</h4>
|
|
1006
|
-
<FileUpload
|
|
1007
|
-
variant="compact"
|
|
1008
|
-
accept=".csv,.xlsx"
|
|
1009
|
-
maxSize={1 * 1024 * 1024}
|
|
1010
|
-
uploadText="Upload spreadsheet"
|
|
1011
|
-
/>
|
|
1012
|
-
</div>
|
|
1013
|
-
|
|
1014
|
-
<div>
|
|
1015
|
-
<h4 className="text-sm font-medium mb-3">Large Variant</h4>
|
|
1016
|
-
<FileUpload
|
|
1017
|
-
variant="large"
|
|
1018
|
-
accept="image/*"
|
|
1019
|
-
showPreview
|
|
1020
|
-
uploadText="Drop images here"
|
|
1021
|
-
dragText="Release to upload"
|
|
1022
|
-
/>
|
|
1023
|
-
</div>
|
|
1024
|
-
</div>
|
|
1025
|
-
|
|
1026
|
-
{showCode && (
|
|
1027
|
-
<div className="mt-4 p-4 bg-muted border border-border rounded-md">
|
|
1028
|
-
<pre className="text-sm font-mono text-foreground overflow-x-auto">
|
|
1029
|
-
<code>{`<FileUpload
|
|
1030
|
-
accept="image/*,.pdf"
|
|
1031
|
-
multiple
|
|
1032
|
-
maxSize={5 * 1024 * 1024}
|
|
1033
|
-
showPreview
|
|
1034
|
-
onUpload={async (files) => {
|
|
1035
|
-
await uploadFiles(files);
|
|
1036
|
-
}}
|
|
1037
|
-
/>`}</code>
|
|
1038
|
-
</pre>
|
|
1039
|
-
</div>
|
|
1040
|
-
)}
|
|
1041
|
-
</div>
|
|
1042
|
-
</ShowcaseSection>
|
|
1043
|
-
</Card>
|
|
1044
|
-
|
|
1045
|
-
{/* DateTimePicker Component */}
|
|
1046
|
-
<Card className="p-6" category={6}>
|
|
1047
|
-
<ShowcaseSection
|
|
1048
|
-
title="DateTimePicker Component"
|
|
1049
|
-
description="Flexible date and time selection with multiple modes, formats, and range support"
|
|
1050
|
-
badge={{ text: "Business Component", variant: "category", category: 6 }}
|
|
1051
|
-
>
|
|
1052
|
-
<div className="space-y-6">
|
|
1053
|
-
<div className="grid md:grid-cols-2 gap-6">
|
|
1054
|
-
<div>
|
|
1055
|
-
<h4 className="text-sm font-medium mb-3">Date Picker</h4>
|
|
1056
|
-
<DateTimePicker
|
|
1057
|
-
mode="date"
|
|
1058
|
-
value={selectedDate}
|
|
1059
|
-
onChange={(date) => setSelectedDate(date || undefined)}
|
|
1060
|
-
placeholder="Select date"
|
|
1061
|
-
/>
|
|
1062
|
-
</div>
|
|
1063
|
-
|
|
1064
|
-
<div>
|
|
1065
|
-
<h4 className="text-sm font-medium mb-3">Time Picker</h4>
|
|
1066
|
-
<DateTimePicker
|
|
1067
|
-
mode="time"
|
|
1068
|
-
value={selectedDate}
|
|
1069
|
-
onChange={(date) => setSelectedDate(date || undefined)}
|
|
1070
|
-
placeholder="Select time"
|
|
1071
|
-
timeFormat="12h"
|
|
1072
|
-
/>
|
|
1073
|
-
</div>
|
|
1074
|
-
|
|
1075
|
-
<div>
|
|
1076
|
-
<h4 className="text-sm font-medium mb-3">DateTime Picker</h4>
|
|
1077
|
-
<DateTimePicker
|
|
1078
|
-
mode="datetime"
|
|
1079
|
-
value={selectedDate}
|
|
1080
|
-
onChange={(date) => setSelectedDate(date || undefined)}
|
|
1081
|
-
placeholder="Select date and time"
|
|
1082
|
-
/>
|
|
1083
|
-
</div>
|
|
1084
|
-
|
|
1085
|
-
<div>
|
|
1086
|
-
<h4 className="text-sm font-medium mb-3">Date Range</h4>
|
|
1087
|
-
<DateTimePicker
|
|
1088
|
-
mode="date"
|
|
1089
|
-
isRange
|
|
1090
|
-
rangeValue={{ start: dateRange.start || null, end: dateRange.end || null }}
|
|
1091
|
-
onRangeChange={(range) => setDateRange({ start: range.start || undefined, end: range.end || undefined })}
|
|
1092
|
-
placeholder="Select date range"
|
|
1093
|
-
/>
|
|
1094
|
-
</div>
|
|
1095
|
-
</div>
|
|
1096
|
-
|
|
1097
|
-
<div>
|
|
1098
|
-
<h4 className="text-sm font-medium mb-3">Inline Calendar</h4>
|
|
1099
|
-
<div className="flex justify-center">
|
|
1100
|
-
<DateTimePicker
|
|
1101
|
-
mode="date"
|
|
1102
|
-
variant="inline"
|
|
1103
|
-
value={selectedDate}
|
|
1104
|
-
onChange={(date) => setSelectedDate(date || undefined)}
|
|
1105
|
-
/>
|
|
1106
|
-
</div>
|
|
1107
|
-
</div>
|
|
1108
|
-
|
|
1109
|
-
<div className="grid md:grid-cols-3 gap-4">
|
|
1110
|
-
<div>
|
|
1111
|
-
<h4 className="text-sm font-medium mb-3">Compact Variant</h4>
|
|
1112
|
-
<DateTimePicker
|
|
1113
|
-
variant="compact"
|
|
1114
|
-
mode="date"
|
|
1115
|
-
value={selectedDate}
|
|
1116
|
-
onChange={(date) => setSelectedDate(date || undefined)}
|
|
1117
|
-
/>
|
|
1118
|
-
</div>
|
|
1119
|
-
|
|
1120
|
-
<div>
|
|
1121
|
-
<h4 className="text-sm font-medium mb-3">With Min/Max</h4>
|
|
1122
|
-
<DateTimePicker
|
|
1123
|
-
mode="date"
|
|
1124
|
-
minDate={new Date()}
|
|
1125
|
-
maxDate={new Date(Date.now() + 30 * 24 * 60 * 60 * 1000)}
|
|
1126
|
-
placeholder="Next 30 days"
|
|
1127
|
-
/>
|
|
1128
|
-
</div>
|
|
1129
|
-
|
|
1130
|
-
<div>
|
|
1131
|
-
<h4 className="text-sm font-medium mb-3">Error State</h4>
|
|
1132
|
-
<DateTimePicker
|
|
1133
|
-
mode="date"
|
|
1134
|
-
error
|
|
1135
|
-
placeholder="Invalid date"
|
|
1136
|
-
/>
|
|
1137
|
-
</div>
|
|
1138
|
-
</div>
|
|
1139
|
-
|
|
1140
|
-
{showCode && (
|
|
1141
|
-
<div className="mt-4 p-4 bg-muted border border-border rounded-md">
|
|
1142
|
-
<pre className="text-sm font-mono text-foreground overflow-x-auto">
|
|
1143
|
-
<code>{`<DateTimePicker
|
|
1144
|
-
mode="datetime"
|
|
1145
|
-
value={selectedDate}
|
|
1146
|
-
onChange={setSelectedDate}
|
|
1147
|
-
minDate={new Date()}
|
|
1148
|
-
timeFormat="12h"
|
|
1149
|
-
/>`}</code>
|
|
1150
|
-
</pre>
|
|
1151
|
-
</div>
|
|
1152
|
-
)}
|
|
1153
|
-
</div>
|
|
1154
|
-
</ShowcaseSection>
|
|
1155
|
-
</Card>
|
|
1156
|
-
|
|
1157
|
-
{/* Form Architecture */}
|
|
1158
|
-
<Card className="p-6" category={7}>
|
|
1159
|
-
<ShowcaseSection
|
|
1160
|
-
title="Form Composition & Validation"
|
|
1161
|
-
description="How form components compose and integrate"
|
|
1162
|
-
badge={{ text: "Architecture", variant: "category", category: 7 }}
|
|
1163
|
-
>
|
|
1164
|
-
<div className="space-y-4">
|
|
1165
|
-
<div className="grid md:grid-cols-2 gap-4">
|
|
1166
|
-
<div>
|
|
1167
|
-
<h4 className="text-sm font-medium mb-3">Component Layers</h4>
|
|
1168
|
-
<div className="space-y-2 text-xs">
|
|
1169
|
-
<div className="p-2 bg-muted rounded">
|
|
1170
|
-
<code>Input/Label</code> → Base elements
|
|
1171
|
-
</div>
|
|
1172
|
-
<div className="p-2 bg-muted rounded ml-4">
|
|
1173
|
-
<code>FormField</code> → Field wrapper
|
|
1174
|
-
</div>
|
|
1175
|
-
<div className="p-2 bg-muted rounded ml-8">
|
|
1176
|
-
<code>FormGroup</code> → Section organizer
|
|
1177
|
-
</div>
|
|
1178
|
-
</div>
|
|
1179
|
-
</div>
|
|
1180
|
-
|
|
1181
|
-
<div>
|
|
1182
|
-
<h4 className="text-sm font-medium mb-3">Features</h4>
|
|
1183
|
-
<div className="space-y-2 text-xs">
|
|
1184
|
-
<div className="p-2 bg-muted rounded">
|
|
1185
|
-
✓ Built-in validation states
|
|
1186
|
-
</div>
|
|
1187
|
-
<div className="p-2 bg-muted rounded">
|
|
1188
|
-
✓ Required field indicators
|
|
1189
|
-
</div>
|
|
1190
|
-
<div className="p-2 bg-muted rounded">
|
|
1191
|
-
✓ Horizontal/vertical layouts
|
|
1192
|
-
</div>
|
|
1193
|
-
<div className="p-2 bg-muted rounded">
|
|
1194
|
-
✓ Category theming support
|
|
1195
|
-
</div>
|
|
1196
|
-
</div>
|
|
1197
|
-
</div>
|
|
1198
|
-
</div>
|
|
1199
|
-
</div>
|
|
1200
|
-
</ShowcaseSection>
|
|
1201
|
-
</Card>
|
|
1202
|
-
|
|
1203
|
-
</div>
|
|
1204
|
-
</TabsContent>
|
|
1205
|
-
|
|
1206
|
-
{/* Navigation Section */}
|
|
1207
|
-
<TabsContent value="navigation" className="space-y-6">
|
|
1208
|
-
<div className="space-y-2 mb-8">
|
|
1209
|
-
<h2 className="text-2xl font-bold text-foreground">Navigation Components</h2>
|
|
1210
|
-
<p className="text-muted-foreground">
|
|
1211
|
-
Navigation patterns for breadcrumbs, menus, and pagination.
|
|
1212
|
-
</p>
|
|
1213
|
-
</div>
|
|
1214
|
-
|
|
1215
|
-
<div className="grid gap-6">
|
|
1216
|
-
{/* Breadcrumb Component */}
|
|
1217
|
-
<Card className="p-6" category={1}>
|
|
1218
|
-
<ShowcaseSection
|
|
1219
|
-
title="Breadcrumb Component"
|
|
1220
|
-
description="Navigation breadcrumbs with home icon and separators"
|
|
1221
|
-
badge={{ text: "Molecule Component", variant: "category", category: 1 }}
|
|
1222
|
-
>
|
|
1223
|
-
<div className="space-y-4">
|
|
1224
|
-
<Breadcrumb
|
|
1225
|
-
items={[
|
|
1226
|
-
{ label: 'Dashboard', href: '/dashboard' },
|
|
1227
|
-
{ label: 'Projects', href: '/projects' },
|
|
1228
|
-
{ label: 'Analytics', active: true }
|
|
1229
|
-
]}
|
|
1230
|
-
category={2}
|
|
1231
|
-
/>
|
|
1232
|
-
|
|
1233
|
-
<Breadcrumb
|
|
1234
|
-
items={[
|
|
1235
|
-
{ label: 'Settings', href: '/settings' },
|
|
1236
|
-
{ label: 'Users', href: '/users' },
|
|
1237
|
-
{ label: 'Edit Profile', active: true }
|
|
1238
|
-
]}
|
|
1239
|
-
showHome={false}
|
|
1240
|
-
separator={<ChevronRight className="w-3 h-3" />}
|
|
1241
|
-
category={5}
|
|
1242
|
-
/>
|
|
1243
|
-
|
|
1244
|
-
{showCode && (
|
|
1245
|
-
<div className="mt-4 p-4 bg-muted border border-border rounded-md">
|
|
1246
|
-
<pre className="text-sm font-mono text-foreground overflow-x-auto">
|
|
1247
|
-
<code>{`<Breadcrumb
|
|
1248
|
-
items={[
|
|
1249
|
-
{ label: 'Dashboard', href: '/dashboard' },
|
|
1250
|
-
{ label: 'Projects', href: '/projects' },
|
|
1251
|
-
{ label: 'Analytics', active: true }
|
|
1252
|
-
]}
|
|
1253
|
-
category={2}
|
|
1254
|
-
/>`}</code>
|
|
1255
|
-
</pre>
|
|
1256
|
-
</div>
|
|
1257
|
-
)}
|
|
1258
|
-
</div>
|
|
1259
|
-
</ShowcaseSection>
|
|
1260
|
-
</Card>
|
|
1261
|
-
|
|
1262
|
-
{/* Pagination Component */}
|
|
1263
|
-
<Card className="p-6" category={2}>
|
|
1264
|
-
<ShowcaseSection
|
|
1265
|
-
title="Pagination Component"
|
|
1266
|
-
description="Page navigation with first/last controls and ellipsis"
|
|
1267
|
-
badge={{ text: "Molecule Component", variant: "category", category: 2 }}
|
|
1268
|
-
>
|
|
1269
|
-
<div className="space-y-6">
|
|
1270
|
-
<div>
|
|
1271
|
-
<h4 className="text-sm font-medium mb-3">Full Pagination</h4>
|
|
1272
|
-
<Pagination
|
|
1273
|
-
currentPage={5}
|
|
1274
|
-
totalPages={12}
|
|
1275
|
-
onPageChange={(page) => console.log('Page:', page)}
|
|
1276
|
-
category={3}
|
|
1277
|
-
/>
|
|
1278
|
-
</div>
|
|
1279
|
-
|
|
1280
|
-
<div>
|
|
1281
|
-
<h4 className="text-sm font-medium mb-3">Simple Pagination</h4>
|
|
1282
|
-
<Pagination
|
|
1283
|
-
currentPage={1}
|
|
1284
|
-
totalPages={3}
|
|
1285
|
-
onPageChange={(page) => console.log('Page:', page)}
|
|
1286
|
-
showFirstLast={false}
|
|
1287
|
-
category={6}
|
|
1288
|
-
size="sm"
|
|
1289
|
-
/>
|
|
1290
|
-
</div>
|
|
1291
|
-
|
|
1292
|
-
{showCode && (
|
|
1293
|
-
<div className="mt-4 p-4 bg-muted border border-border rounded-md">
|
|
1294
|
-
<pre className="text-sm font-mono text-foreground overflow-x-auto">
|
|
1295
|
-
<code>{`<Pagination
|
|
1296
|
-
currentPage={5}
|
|
1297
|
-
totalPages={12}
|
|
1298
|
-
onPageChange={(page) => setPage(page)}
|
|
1299
|
-
category={3}
|
|
1300
|
-
/>`}</code>
|
|
1301
|
-
</pre>
|
|
1302
|
-
</div>
|
|
1303
|
-
)}
|
|
1304
|
-
</div>
|
|
1305
|
-
</ShowcaseSection>
|
|
1306
|
-
</Card>
|
|
1307
|
-
|
|
1308
|
-
{/* NavMenu Component */}
|
|
1309
|
-
<Card className="p-6" category={3}>
|
|
1310
|
-
<ShowcaseSection
|
|
1311
|
-
title="NavMenu Component"
|
|
1312
|
-
description="Navigation menus with horizontal and vertical orientations"
|
|
1313
|
-
badge={{ text: "Molecule Component", variant: "category", category: 3 }}
|
|
1314
|
-
>
|
|
1315
|
-
<div className="space-y-8">
|
|
1316
|
-
<div>
|
|
1317
|
-
<h4 className="text-sm font-medium mb-4">Horizontal Menu</h4>
|
|
1318
|
-
<NavMenu
|
|
1319
|
-
items={[
|
|
1320
|
-
{ id: 'home', label: 'Home', href: '/home', icon: <Home className="w-4 h-4" />, category: 1 },
|
|
1321
|
-
{ id: 'projects', label: 'Projects', href: '/projects', icon: <FileText className="w-4 h-4" />, category: 2 },
|
|
1322
|
-
{ id: 'settings', label: 'Settings', href: '/settings', icon: <Settings className="w-4 h-4" />, category: 3 }
|
|
1323
|
-
]}
|
|
1324
|
-
orientation="horizontal"
|
|
1325
|
-
defaultCategory={4}
|
|
1326
|
-
/>
|
|
1327
|
-
</div>
|
|
1328
|
-
|
|
1329
|
-
<div>
|
|
1330
|
-
<h4 className="text-sm font-medium mb-4">Vertical Menu</h4>
|
|
1331
|
-
<div className="max-w-64">
|
|
1332
|
-
<NavMenu
|
|
1333
|
-
items={[
|
|
1334
|
-
{ id: 'dashboard', label: 'Dashboard', href: '/dashboard', icon: <Database className="w-4 h-4" />, category: 1 },
|
|
1335
|
-
{ id: 'analytics', label: 'Analytics', href: '/analytics', icon: <TrendingUp className="w-4 h-4" />, category: 2 },
|
|
1336
|
-
{ id: 'users', label: 'Users', href: '/users', icon: <Users className="w-4 h-4" />, category: 3 }
|
|
1337
|
-
]}
|
|
1338
|
-
orientation="vertical"
|
|
1339
|
-
defaultCategory={4}
|
|
1340
|
-
/>
|
|
1341
|
-
</div>
|
|
1342
|
-
</div>
|
|
1343
|
-
</div>
|
|
1344
|
-
</ShowcaseSection>
|
|
1345
|
-
</Card>
|
|
1346
|
-
|
|
1347
|
-
{/* Accordion Component */}
|
|
1348
|
-
<Card className="p-6" category={4}>
|
|
1349
|
-
<ShowcaseSection
|
|
1350
|
-
title="Accordion Component"
|
|
1351
|
-
description="Collapsible content sections with smooth animations and keyboard navigation"
|
|
1352
|
-
badge={{ text: "Business Component", variant: "category", category: 4 }}
|
|
1353
|
-
>
|
|
1354
|
-
<div className="space-y-8">
|
|
1355
|
-
<div>
|
|
1356
|
-
<h4 className="text-sm font-medium mb-4">Default Accordion</h4>
|
|
1357
|
-
<Accordion
|
|
1358
|
-
items={[
|
|
1359
|
-
{
|
|
1360
|
-
id: 'section1',
|
|
1361
|
-
title: 'Getting Started',
|
|
1362
|
-
icon: <Home className="w-4 h-4" />,
|
|
1363
|
-
content: (
|
|
1364
|
-
<div className="space-y-2">
|
|
1365
|
-
<p>Welcome to our platform! This section covers the basics of getting started.</p>
|
|
1366
|
-
<ul className="list-disc list-inside space-y-1 text-sm">
|
|
1367
|
-
<li>Create your account</li>
|
|
1368
|
-
<li>Set up your profile</li>
|
|
1369
|
-
<li>Explore the dashboard</li>
|
|
1370
|
-
</ul>
|
|
1371
|
-
</div>
|
|
1372
|
-
)
|
|
1373
|
-
},
|
|
1374
|
-
{
|
|
1375
|
-
id: 'section2',
|
|
1376
|
-
title: 'API Documentation',
|
|
1377
|
-
icon: <FileText className="w-4 h-4" />,
|
|
1378
|
-
content: (
|
|
1379
|
-
<div className="space-y-2">
|
|
1380
|
-
<p>Complete API reference and integration guides.</p>
|
|
1381
|
-
<div className="grid grid-cols-2 gap-2 text-sm">
|
|
1382
|
-
<div className="p-2 bg-muted/30 rounded">Authentication</div>
|
|
1383
|
-
<div className="p-2 bg-muted/30 rounded">Endpoints</div>
|
|
1384
|
-
<div className="p-2 bg-muted/30 rounded">Examples</div>
|
|
1385
|
-
<div className="p-2 bg-muted/30 rounded">SDKs</div>
|
|
1386
|
-
</div>
|
|
1387
|
-
</div>
|
|
1388
|
-
)
|
|
1389
|
-
},
|
|
1390
|
-
{
|
|
1391
|
-
id: 'section3',
|
|
1392
|
-
title: 'Advanced Features',
|
|
1393
|
-
icon: <Settings className="w-4 h-4" />,
|
|
1394
|
-
content: (
|
|
1395
|
-
<div className="space-y-2">
|
|
1396
|
-
<p>Explore advanced functionality and customization options.</p>
|
|
1397
|
-
<p className="text-sm">Advanced features include custom integrations, webhooks, and enterprise-level analytics.</p>
|
|
1398
|
-
</div>
|
|
1399
|
-
)
|
|
1400
|
-
}
|
|
1401
|
-
]}
|
|
1402
|
-
category={4}
|
|
1403
|
-
defaultOpen="section1"
|
|
1404
|
-
/>
|
|
1405
|
-
</div>
|
|
1406
|
-
|
|
1407
|
-
<div>
|
|
1408
|
-
<h4 className="text-sm font-medium mb-4">Multiple Open (Bordered Variant)</h4>
|
|
1409
|
-
<Accordion
|
|
1410
|
-
items={[
|
|
1411
|
-
{
|
|
1412
|
-
id: 'faq1',
|
|
1413
|
-
title: 'How do I reset my password?',
|
|
1414
|
-
content: 'You can reset your password by clicking the "Forgot Password" link on the login page.'
|
|
1415
|
-
},
|
|
1416
|
-
{
|
|
1417
|
-
id: 'faq2',
|
|
1418
|
-
title: 'What are the subscription plans?',
|
|
1419
|
-
content: (
|
|
1420
|
-
<div className="space-y-2">
|
|
1421
|
-
<p>We offer three subscription tiers:</p>
|
|
1422
|
-
<div className="space-y-1 text-sm">
|
|
1423
|
-
<div>• <strong>Starter</strong>: $9/month - Basic features</div>
|
|
1424
|
-
<div>• <strong>Pro</strong>: $29/month - Advanced features</div>
|
|
1425
|
-
<div>• <strong>Enterprise</strong>: Custom pricing - Full suite</div>
|
|
1426
|
-
</div>
|
|
1427
|
-
</div>
|
|
1428
|
-
)
|
|
1429
|
-
},
|
|
1430
|
-
{
|
|
1431
|
-
id: 'faq3',
|
|
1432
|
-
title: 'How can I contact support?',
|
|
1433
|
-
content: 'You can reach our support team via email at support@example.com or through the in-app chat.'
|
|
1434
|
-
}
|
|
1435
|
-
]}
|
|
1436
|
-
variant="bordered"
|
|
1437
|
-
allowMultiple={true}
|
|
1438
|
-
category={5}
|
|
1439
|
-
defaultOpen={['faq1', 'faq2']}
|
|
1440
|
-
/>
|
|
1441
|
-
</div>
|
|
1442
|
-
|
|
1443
|
-
<div>
|
|
1444
|
-
<h4 className="text-sm font-medium mb-4">Filled Variant with Categories</h4>
|
|
1445
|
-
<Accordion
|
|
1446
|
-
items={[
|
|
1447
|
-
{
|
|
1448
|
-
id: 'analytics',
|
|
1449
|
-
title: 'Analytics & Reporting',
|
|
1450
|
-
icon: <TrendingUp className="w-4 h-4" />,
|
|
1451
|
-
content: 'Comprehensive analytics dashboard with real-time metrics, custom reports, and data export capabilities.'
|
|
1452
|
-
},
|
|
1453
|
-
{
|
|
1454
|
-
id: 'users',
|
|
1455
|
-
title: 'User Management',
|
|
1456
|
-
icon: <Users className="w-4 h-4" />,
|
|
1457
|
-
content: 'Manage user accounts, permissions, roles, and access controls across your organization.'
|
|
1458
|
-
},
|
|
1459
|
-
{
|
|
1460
|
-
id: 'database',
|
|
1461
|
-
title: 'Data Integration',
|
|
1462
|
-
icon: <Database className="w-4 h-4" />,
|
|
1463
|
-
content: 'Connect multiple data sources, set up automated pipelines, and manage data transformations.'
|
|
1464
|
-
}
|
|
1465
|
-
]}
|
|
1466
|
-
variant="filled"
|
|
1467
|
-
category={6}
|
|
1468
|
-
/>
|
|
1469
|
-
</div>
|
|
1470
|
-
|
|
1471
|
-
{showCode && (
|
|
1472
|
-
<div className="mt-4 p-4 bg-muted border border-border rounded-md">
|
|
1473
|
-
<pre className="text-sm font-mono text-foreground overflow-x-auto">
|
|
1474
|
-
<code>{`<Accordion
|
|
1475
|
-
items={[
|
|
1476
|
-
{
|
|
1477
|
-
id: 'section1',
|
|
1478
|
-
title: 'Getting Started',
|
|
1479
|
-
icon: <Home className="w-4 h-4" />,
|
|
1480
|
-
content: 'Welcome to our platform!'
|
|
1481
|
-
},
|
|
1482
|
-
{
|
|
1483
|
-
id: 'section2',
|
|
1484
|
-
title: 'API Documentation',
|
|
1485
|
-
content: 'Complete API reference...'
|
|
1486
|
-
}
|
|
1487
|
-
]}
|
|
1488
|
-
category={4}
|
|
1489
|
-
defaultOpen="section1"
|
|
1490
|
-
/>`}</code>
|
|
1491
|
-
</pre>
|
|
1492
|
-
</div>
|
|
1493
|
-
)}
|
|
1494
|
-
</div>
|
|
1495
|
-
</ShowcaseSection>
|
|
1496
|
-
</Card>
|
|
1497
|
-
</div>
|
|
1498
|
-
</TabsContent>
|
|
1499
|
-
|
|
1500
|
-
{/* Feedback Section */}
|
|
1501
|
-
<TabsContent value="feedback" className="space-y-6">
|
|
1502
|
-
<div className="space-y-2 mb-8">
|
|
1503
|
-
<h2 className="text-2xl font-bold text-foreground">Feedback Components</h2>
|
|
1504
|
-
<p className="text-muted-foreground">
|
|
1505
|
-
User feedback patterns including alerts, progress indicators, and notifications.
|
|
1506
|
-
</p>
|
|
1507
|
-
</div>
|
|
1508
|
-
|
|
1509
|
-
<div className="grid gap-6">
|
|
1510
|
-
{/* Alert Component */}
|
|
1511
|
-
<Card className="p-6" category={1}>
|
|
1512
|
-
<ShowcaseSection
|
|
1513
|
-
title="Alert Component"
|
|
1514
|
-
description="Status-based alerts with dismissible options"
|
|
1515
|
-
badge={{ text: "Molecule Component", variant: "category", category: 1 }}
|
|
1516
|
-
>
|
|
1517
|
-
<div className="space-y-4">
|
|
1518
|
-
<Alert status="success" title="Success!" dismissible>
|
|
1519
|
-
Your changes have been saved successfully.
|
|
1520
|
-
</Alert>
|
|
1521
|
-
|
|
1522
|
-
<Alert status="warning" title="Warning" variant="outlined">
|
|
1523
|
-
Please review your settings before continuing.
|
|
1524
|
-
</Alert>
|
|
1525
|
-
|
|
1526
|
-
<Alert status="error" dismissible>
|
|
1527
|
-
There was an error processing your request. Please try again.
|
|
1528
|
-
</Alert>
|
|
1529
|
-
|
|
1530
|
-
<Alert status="info" variant="filled" hideIcon>
|
|
1531
|
-
This is an informational message with no icon.
|
|
1532
|
-
</Alert>
|
|
1533
|
-
|
|
1534
|
-
{showCode && (
|
|
1535
|
-
<div className="mt-4 p-4 bg-muted border border-border rounded-md">
|
|
1536
|
-
<pre className="text-sm font-mono text-foreground overflow-x-auto">
|
|
1537
|
-
<code>{`<Alert status="success" title="Success!" dismissible>
|
|
1538
|
-
Your changes have been saved successfully.
|
|
1539
|
-
</Alert>`}</code>
|
|
1540
|
-
</pre>
|
|
1541
|
-
</div>
|
|
1542
|
-
)}
|
|
1543
|
-
</div>
|
|
1544
|
-
</ShowcaseSection>
|
|
1545
|
-
</Card>
|
|
1546
|
-
|
|
1547
|
-
{/* ProgressBar Component */}
|
|
1548
|
-
<Card className="p-6" category={2}>
|
|
1549
|
-
<ShowcaseSection
|
|
1550
|
-
title="ProgressBar Component"
|
|
1551
|
-
description="Progress indicators with status colors and animations"
|
|
1552
|
-
badge={{ text: "Molecule Component", variant: "category", category: 2 }}
|
|
1553
|
-
>
|
|
1554
|
-
<div className="space-y-6">
|
|
1555
|
-
<ProgressBar
|
|
1556
|
-
value={75}
|
|
1557
|
-
status="success"
|
|
1558
|
-
showLabel
|
|
1559
|
-
label="Upload Progress"
|
|
1560
|
-
/>
|
|
1561
|
-
|
|
1562
|
-
<ProgressBar
|
|
1563
|
-
value={45}
|
|
1564
|
-
category={3}
|
|
1565
|
-
showLabel
|
|
1566
|
-
size="lg"
|
|
1567
|
-
/>
|
|
1568
|
-
|
|
1569
|
-
<ProgressBar
|
|
1570
|
-
value={90}
|
|
1571
|
-
status="warning"
|
|
1572
|
-
variant="striped"
|
|
1573
|
-
size="sm"
|
|
1574
|
-
/>
|
|
1575
|
-
|
|
1576
|
-
<ProgressBar
|
|
1577
|
-
value={60}
|
|
1578
|
-
category={6}
|
|
1579
|
-
variant="animated"
|
|
1580
|
-
showLabel
|
|
1581
|
-
/>
|
|
1582
|
-
|
|
1583
|
-
{showCode && (
|
|
1584
|
-
<div className="mt-4 p-4 bg-muted border border-border rounded-md">
|
|
1585
|
-
<pre className="text-sm font-mono text-foreground overflow-x-auto">
|
|
1586
|
-
<code>{`<ProgressBar
|
|
1587
|
-
value={75}
|
|
1588
|
-
status="success"
|
|
1589
|
-
showLabel
|
|
1590
|
-
label="Upload Progress"
|
|
1591
|
-
/>`}</code>
|
|
1592
|
-
</pre>
|
|
1593
|
-
</div>
|
|
1594
|
-
)}
|
|
1595
|
-
</div>
|
|
1596
|
-
</ShowcaseSection>
|
|
1597
|
-
</Card>
|
|
1598
|
-
|
|
1599
|
-
{/* Toast Component */}
|
|
1600
|
-
<Card className="p-6" category={3}>
|
|
1601
|
-
<ShowcaseSection
|
|
1602
|
-
title="Toast Component"
|
|
1603
|
-
description="Non-intrusive notifications with auto-dismiss, progress indicators, and multiple positions"
|
|
1604
|
-
badge={{ text: "Molecule Component", variant: "category", category: 3 }}
|
|
1605
|
-
>
|
|
1606
|
-
<div className="space-y-6">
|
|
1607
|
-
<div className="grid md:grid-cols-2 gap-4">
|
|
1608
|
-
<div>
|
|
1609
|
-
<h4 className="text-sm font-medium mb-3">Toast Types</h4>
|
|
1610
|
-
<div className="flex flex-wrap gap-2">
|
|
1611
|
-
<Button
|
|
1612
|
-
variant="outline"
|
|
1613
|
-
size="sm"
|
|
1614
|
-
onClick={() => {
|
|
1615
|
-
const id = Date.now().toString();
|
|
1616
|
-
setToasts([...toasts, { id, status: 'success', title: 'Success!', message: 'Model saved successfully.' }]);
|
|
1617
|
-
setTimeout(() => setToasts(prev => prev.filter(t => t.id !== id)), 5000);
|
|
1618
|
-
}}
|
|
1619
|
-
>
|
|
1620
|
-
Success Toast
|
|
1621
|
-
</Button>
|
|
1622
|
-
<Button
|
|
1623
|
-
variant="outline"
|
|
1624
|
-
size="sm"
|
|
1625
|
-
onClick={() => {
|
|
1626
|
-
const id = Date.now().toString();
|
|
1627
|
-
setToasts([...toasts, { id, status: 'warning', title: 'Warning', message: 'Model runtime exceeded threshold.' }]);
|
|
1628
|
-
setTimeout(() => setToasts(prev => prev.filter(t => t.id !== id)), 5000);
|
|
1629
|
-
}}
|
|
1630
|
-
>
|
|
1631
|
-
Warning Toast
|
|
1632
|
-
</Button>
|
|
1633
|
-
<Button
|
|
1634
|
-
variant="outline"
|
|
1635
|
-
size="sm"
|
|
1636
|
-
onClick={() => {
|
|
1637
|
-
const id = Date.now().toString();
|
|
1638
|
-
setToasts([...toasts, { id, status: 'error', title: 'Error', message: 'Failed to connect to database.' }]);
|
|
1639
|
-
setTimeout(() => setToasts(prev => prev.filter(t => t.id !== id)), 5000);
|
|
1640
|
-
}}
|
|
1641
|
-
>
|
|
1642
|
-
Error Toast
|
|
1643
|
-
</Button>
|
|
1644
|
-
<Button
|
|
1645
|
-
variant="outline"
|
|
1646
|
-
size="sm"
|
|
1647
|
-
onClick={() => {
|
|
1648
|
-
const id = Date.now().toString();
|
|
1649
|
-
setToasts([...toasts, { id, status: 'info', title: 'Info', message: 'New update available.' }]);
|
|
1650
|
-
setTimeout(() => setToasts(prev => prev.filter(t => t.id !== id)), 5000);
|
|
1651
|
-
}}
|
|
1652
|
-
>
|
|
1653
|
-
Info Toast
|
|
1654
|
-
</Button>
|
|
1655
|
-
</div>
|
|
1656
|
-
</div>
|
|
1657
|
-
|
|
1658
|
-
<div>
|
|
1659
|
-
<h4 className="text-sm font-medium mb-3">Features</h4>
|
|
1660
|
-
<ul className="text-sm text-muted-foreground space-y-1">
|
|
1661
|
-
<li>• Auto-dismiss with configurable duration</li>
|
|
1662
|
-
<li>• Progress indicator for timed dismissal</li>
|
|
1663
|
-
<li>• Multiple positioning options</li>
|
|
1664
|
-
<li>• Dismissible with close button</li>
|
|
1665
|
-
<li>• Status-based theming</li>
|
|
1666
|
-
</ul>
|
|
1667
|
-
</div>
|
|
1668
|
-
</div>
|
|
1669
|
-
|
|
1670
|
-
{showCode && (
|
|
1671
|
-
<div className="mt-4 p-4 bg-muted border border-border rounded-md">
|
|
1672
|
-
<pre className="text-sm font-mono text-foreground overflow-x-auto">
|
|
1673
|
-
<code>{`<Toast
|
|
1674
|
-
status="success"
|
|
1675
|
-
title="Success!"
|
|
1676
|
-
duration={5000}
|
|
1677
|
-
showProgress
|
|
1678
|
-
onDismiss={() => handleDismiss()}
|
|
1679
|
-
>
|
|
1680
|
-
Model saved successfully.
|
|
1681
|
-
</Toast>`}</code>
|
|
1682
|
-
</pre>
|
|
1683
|
-
</div>
|
|
1684
|
-
)}
|
|
1685
|
-
</div>
|
|
1686
|
-
</ShowcaseSection>
|
|
1687
|
-
</Card>
|
|
1688
|
-
|
|
1689
|
-
{/* Feedback Composition */}
|
|
1690
|
-
<Card className="p-6" category={3}>
|
|
1691
|
-
<ShowcaseSection
|
|
1692
|
-
title="Feedback System Architecture"
|
|
1693
|
-
description="How feedback components integrate with the design system"
|
|
1694
|
-
badge={{ text: "Architecture", variant: "category", category: 3 }}
|
|
1695
|
-
>
|
|
1696
|
-
<div className="space-y-4">
|
|
1697
|
-
<div className="grid md:grid-cols-2 gap-4">
|
|
1698
|
-
<div>
|
|
1699
|
-
<h4 className="text-sm font-medium mb-3">Status Theming</h4>
|
|
1700
|
-
<div className="space-y-2 text-xs">
|
|
1701
|
-
<div className="p-2 bg-status-success/10 text-status-success rounded">
|
|
1702
|
-
Success states use <code>--status-success</code>
|
|
1703
|
-
</div>
|
|
1704
|
-
<div className="p-2 bg-status-warning/10 text-status-warning rounded">
|
|
1705
|
-
Warning states use <code>--status-warning</code>
|
|
1706
|
-
</div>
|
|
1707
|
-
<div className="p-2 bg-status-error/10 text-status-error rounded">
|
|
1708
|
-
Error states use <code>--status-error</code>
|
|
1709
|
-
</div>
|
|
1710
|
-
</div>
|
|
1711
|
-
</div>
|
|
1712
|
-
|
|
1713
|
-
<div>
|
|
1714
|
-
<h4 className="text-sm font-medium mb-3">Toast Notifications</h4>
|
|
1715
|
-
<div className="space-y-2 text-xs">
|
|
1716
|
-
<div className="p-2 bg-muted rounded">
|
|
1717
|
-
<p className="font-medium mb-1">Toast component features:</p>
|
|
1718
|
-
<ul className="list-disc list-inside space-y-1 text-muted-foreground">
|
|
1719
|
-
<li>Auto-dismiss timer</li>
|
|
1720
|
-
<li>Progress indicator</li>
|
|
1721
|
-
<li>Stacking behavior</li>
|
|
1722
|
-
<li>Status-based styling</li>
|
|
1723
|
-
</ul>
|
|
1724
|
-
</div>
|
|
1725
|
-
</div>
|
|
1726
|
-
</div>
|
|
1727
|
-
</div>
|
|
1728
|
-
</div>
|
|
1729
|
-
</ShowcaseSection>
|
|
1730
|
-
</Card>
|
|
1731
|
-
|
|
1732
|
-
</div>
|
|
1733
|
-
</TabsContent>
|
|
1734
|
-
|
|
1735
|
-
{/* States Section */}
|
|
1736
|
-
<TabsContent value="states" className="space-y-6">
|
|
1737
|
-
<div className="space-y-2 mb-8">
|
|
1738
|
-
<h2 className="text-2xl font-bold text-foreground">State Components</h2>
|
|
1739
|
-
<p className="text-muted-foreground">
|
|
1740
|
-
Loading states, empty states, and error states for better user experience.
|
|
1741
|
-
</p>
|
|
1742
|
-
</div>
|
|
1743
|
-
|
|
1744
|
-
<div className="grid gap-6">
|
|
1745
|
-
{/* Loading States */}
|
|
1746
|
-
<Card className="p-6" category={1}>
|
|
1747
|
-
<ShowcaseSection
|
|
1748
|
-
title="Loading States"
|
|
1749
|
-
description="Base loading indicators and skeleton components"
|
|
1750
|
-
badge={{ text: "UI Components", variant: "category", category: 1 }}
|
|
1751
|
-
>
|
|
1752
|
-
<div className="space-y-4">
|
|
1753
|
-
<div className="flex items-center gap-4">
|
|
1754
|
-
<Spinner size="sm" />
|
|
1755
|
-
<Spinner size="md" />
|
|
1756
|
-
<Spinner size="lg" />
|
|
1757
|
-
<span className="text-sm text-muted-foreground">Spinner component</span>
|
|
1758
|
-
</div>
|
|
1759
|
-
|
|
1760
|
-
<div className="space-y-2">
|
|
1761
|
-
<Skeleton className="h-4 w-full" />
|
|
1762
|
-
<Skeleton className="h-4 w-3/4" />
|
|
1763
|
-
<Skeleton className="h-4 w-1/2" />
|
|
1764
|
-
<span className="text-sm text-muted-foreground">Skeleton loader</span>
|
|
1765
|
-
</div>
|
|
1766
|
-
|
|
1767
|
-
{showCode && (
|
|
1768
|
-
<div className="mt-4 p-4 bg-muted border border-border rounded-md">
|
|
1769
|
-
<pre className="text-sm font-mono text-foreground overflow-x-auto">
|
|
1770
|
-
<code>{`<Spinner size="md" />
|
|
1771
|
-
<Skeleton className="h-4 w-full" />`}</code>
|
|
1772
|
-
</pre>
|
|
1773
|
-
</div>
|
|
1774
|
-
)}
|
|
1775
|
-
</div>
|
|
1776
|
-
</ShowcaseSection>
|
|
1777
|
-
</Card>
|
|
1778
|
-
|
|
1779
|
-
{/* EmptyState Component */}
|
|
1780
|
-
<Card className="p-6" category={2}>
|
|
1781
|
-
<ShowcaseSection
|
|
1782
|
-
title="EmptyState Component"
|
|
1783
|
-
description="Informative empty states with actions for different scenarios"
|
|
1784
|
-
badge={{ text: "Business Component", variant: "category", category: 2 }}
|
|
1785
|
-
>
|
|
1786
|
-
<div className="grid md:grid-cols-2 gap-6">
|
|
1787
|
-
<EmptyState
|
|
1788
|
-
variant="no-data"
|
|
1789
|
-
title="No models found"
|
|
1790
|
-
description="Get started by creating your first dbt model."
|
|
1791
|
-
action={{
|
|
1792
|
-
label: "Create Model",
|
|
1793
|
-
onClick: () => alert('Create model!')
|
|
1794
|
-
}}
|
|
1795
|
-
/>
|
|
1796
|
-
|
|
1797
|
-
<EmptyState
|
|
1798
|
-
variant="no-results"
|
|
1799
|
-
title="No search results"
|
|
1800
|
-
description="Try adjusting your search terms."
|
|
1801
|
-
action={{
|
|
1802
|
-
label: "Clear Filters",
|
|
1803
|
-
onClick: () => alert('Clear filters!')
|
|
1804
|
-
}}
|
|
1805
|
-
secondaryAction={{
|
|
1806
|
-
label: "Browse All",
|
|
1807
|
-
onClick: () => alert('Browse all!')
|
|
1808
|
-
}}
|
|
1809
|
-
/>
|
|
1810
|
-
|
|
1811
|
-
<EmptyState
|
|
1812
|
-
variant="error"
|
|
1813
|
-
title="Connection failed"
|
|
1814
|
-
description="Unable to connect to the database."
|
|
1815
|
-
action={{
|
|
1816
|
-
label: "Retry",
|
|
1817
|
-
onClick: () => alert('Retry!')
|
|
1818
|
-
}}
|
|
1819
|
-
/>
|
|
1820
|
-
|
|
1821
|
-
<EmptyState
|
|
1822
|
-
variant="loading"
|
|
1823
|
-
title="Loading data"
|
|
1824
|
-
description="Please wait while we fetch your data."
|
|
1825
|
-
/>
|
|
1826
|
-
</div>
|
|
1827
|
-
|
|
1828
|
-
{showCode && (
|
|
1829
|
-
<div className="mt-4 p-4 bg-muted border border-border rounded-md">
|
|
1830
|
-
<pre className="text-sm font-mono text-foreground overflow-x-auto">
|
|
1831
|
-
<code>{`<EmptyState
|
|
1832
|
-
variant="no-data"
|
|
1833
|
-
title="No models found"
|
|
1834
|
-
description="Get started by creating your first model."
|
|
1835
|
-
action={{
|
|
1836
|
-
label: "Create Model",
|
|
1837
|
-
onClick: () => createModel()
|
|
1838
|
-
}}
|
|
1839
|
-
/>`}</code>
|
|
1840
|
-
</pre>
|
|
1841
|
-
</div>
|
|
1842
|
-
)}
|
|
1843
|
-
</ShowcaseSection>
|
|
1844
|
-
</Card>
|
|
1845
|
-
|
|
1846
|
-
{/* State Architecture */}
|
|
1847
|
-
<Card className="p-6" category={3}>
|
|
1848
|
-
<ShowcaseSection
|
|
1849
|
-
title="State Management Architecture"
|
|
1850
|
-
description="How state components compose and provide user feedback"
|
|
1851
|
-
badge={{ text: "Architecture", variant: "category", category: 3 }}
|
|
1852
|
-
>
|
|
1853
|
-
<div className="space-y-4">
|
|
1854
|
-
<div className="grid md:grid-cols-2 gap-4">
|
|
1855
|
-
<div>
|
|
1856
|
-
<h4 className="text-sm font-medium mb-3">State Types</h4>
|
|
1857
|
-
<div className="space-y-2 text-xs">
|
|
1858
|
-
<div className="p-2 bg-muted rounded">
|
|
1859
|
-
<code>loading</code> → Data fetching
|
|
1860
|
-
</div>
|
|
1861
|
-
<div className="p-2 bg-muted rounded">
|
|
1862
|
-
<code>no-data</code> → Empty initial state
|
|
1863
|
-
</div>
|
|
1864
|
-
<div className="p-2 bg-muted rounded">
|
|
1865
|
-
<code>no-results</code> → Search/filter empty
|
|
1866
|
-
</div>
|
|
1867
|
-
<div className="p-2 bg-muted rounded">
|
|
1868
|
-
<code>error</code> → Operation failed
|
|
1869
|
-
</div>
|
|
1870
|
-
</div>
|
|
1871
|
-
</div>
|
|
1872
|
-
|
|
1873
|
-
<div>
|
|
1874
|
-
<h4 className="text-sm font-medium mb-3">Components Used</h4>
|
|
1875
|
-
<div className="space-y-2 text-xs">
|
|
1876
|
-
<div className="p-2 bg-muted rounded">
|
|
1877
|
-
Uses <code>Button</code> for actions
|
|
1878
|
-
</div>
|
|
1879
|
-
<div className="p-2 bg-muted rounded">
|
|
1880
|
-
Uses <code>Card</code> for container
|
|
1881
|
-
</div>
|
|
1882
|
-
<div className="p-2 bg-muted rounded">
|
|
1883
|
-
SVG illustrations for visual interest
|
|
1884
|
-
</div>
|
|
1885
|
-
<div className="p-2 bg-muted rounded">
|
|
1886
|
-
Consistent typography hierarchy
|
|
1887
|
-
</div>
|
|
1888
|
-
</div>
|
|
1889
|
-
</div>
|
|
1890
|
-
</div>
|
|
1891
|
-
</div>
|
|
1892
|
-
</ShowcaseSection>
|
|
1893
|
-
</Card>
|
|
1894
|
-
</div>
|
|
1895
|
-
</TabsContent>
|
|
1896
|
-
|
|
1897
|
-
|
|
1898
|
-
{/* Typography Section */}
|
|
1899
|
-
<TabsContent value="typography" className="space-y-6">
|
|
1900
|
-
<div className="space-y-2 mb-8">
|
|
1901
|
-
<h2 className="text-2xl font-bold text-foreground">Typography System</h2>
|
|
1902
|
-
<p className="text-muted-foreground">
|
|
1903
|
-
From base typography to data-focused patterns optimized for analytics interfaces.
|
|
1904
|
-
</p>
|
|
1905
|
-
</div>
|
|
1906
|
-
|
|
1907
|
-
<div className="grid gap-6">
|
|
1908
|
-
{/* Base Typography */}
|
|
1909
|
-
<Card className="p-6" category={1}>
|
|
1910
|
-
<ShowcaseSection
|
|
1911
|
-
title="Base Typography"
|
|
1912
|
-
description="Foundation type scale for headings, body text, and UI elements"
|
|
1913
|
-
badge={{ text: "UI Typography", variant: "category", category: 1 }}
|
|
1914
|
-
>
|
|
1915
|
-
<div className="space-y-6">
|
|
1916
|
-
<div>
|
|
1917
|
-
<h4 className="text-sm font-medium mb-4">Headings</h4>
|
|
1918
|
-
<div className="space-y-3">
|
|
1919
|
-
<h1 className="text-4xl font-bold">Heading 1 - 36px Bold</h1>
|
|
1920
|
-
<h2 className="text-3xl font-semibold">Heading 2 - 30px Semibold</h2>
|
|
1921
|
-
<h3 className="text-2xl font-semibold">Heading 3 - 24px Semibold</h3>
|
|
1922
|
-
<h4 className="text-xl font-medium">Heading 4 - 20px Medium</h4>
|
|
1923
|
-
<h5 className="text-lg font-medium">Heading 5 - 18px Medium</h5>
|
|
1924
|
-
<h6 className="text-base font-medium">Heading 6 - 16px Medium</h6>
|
|
1925
|
-
</div>
|
|
1926
|
-
</div>
|
|
1927
|
-
|
|
1928
|
-
<div>
|
|
1929
|
-
<h4 className="text-sm font-medium mb-4">Body Text</h4>
|
|
1930
|
-
<div className="space-y-3">
|
|
1931
|
-
<p className="text-lg">Large body text for emphasis - 18px regular</p>
|
|
1932
|
-
<p className="text-base">Base body text for content - 16px regular</p>
|
|
1933
|
-
<p className="text-sm">Small body text for secondary content - 14px regular</p>
|
|
1934
|
-
<p className="text-xs">Extra small text for metadata - 12px regular</p>
|
|
1935
|
-
</div>
|
|
1936
|
-
</div>
|
|
1937
|
-
|
|
1938
|
-
{showCode && (
|
|
1939
|
-
<div className="mt-4 p-4 bg-muted border border-border rounded-md">
|
|
1940
|
-
<pre className="text-sm font-mono text-foreground overflow-x-auto">
|
|
1941
|
-
<code>
|
|
1942
|
-
{`<h1 className="text-4xl font-bold">Heading</h1>
|
|
1943
|
-
<p className="text-base">Body text</p>`}
|
|
1944
|
-
</code>
|
|
1945
|
-
</pre>
|
|
1946
|
-
</div>
|
|
1947
|
-
)}
|
|
1948
|
-
</div>
|
|
1949
|
-
</ShowcaseSection>
|
|
1950
|
-
</Card>
|
|
1951
|
-
|
|
1952
|
-
{/* Data Typography */}
|
|
1953
|
-
<Card className="p-6" category={2}>
|
|
1954
|
-
<ShowcaseSection
|
|
1955
|
-
title="Data Typography Patterns"
|
|
1956
|
-
description="Specialized typography for data presentation and analytics"
|
|
1957
|
-
badge={{ text: "Business Patterns", variant: "category", category: 2 }}
|
|
1958
|
-
>
|
|
1959
|
-
<div className="space-y-6">
|
|
1960
|
-
<div className="grid md:grid-cols-2 gap-6">
|
|
1961
|
-
<div>
|
|
1962
|
-
<h4 className="text-sm font-medium mb-4">Data Display</h4>
|
|
1963
|
-
<div className="space-y-4">
|
|
1964
|
-
<Card className="p-4 bg-background">
|
|
1965
|
-
<div className="text-data-label mb-1">METRIC LABEL</div>
|
|
1966
|
-
<div className="text-data-value">1,234.56</div>
|
|
1967
|
-
<div className="text-data-meta">+12.3% from last period</div>
|
|
1968
|
-
</Card>
|
|
1969
|
-
|
|
1970
|
-
<Card className="p-4 bg-background">
|
|
1971
|
-
<div className="text-data-label mb-1">STATUS</div>
|
|
1972
|
-
<div className="text-data-value text-status-success">Healthy</div>
|
|
1973
|
-
<div className="text-data-meta">All systems operational</div>
|
|
1974
|
-
</Card>
|
|
1975
|
-
</div>
|
|
1976
|
-
</div>
|
|
1977
|
-
|
|
1978
|
-
<div>
|
|
1979
|
-
<h4 className="text-sm font-medium mb-4">Table Typography</h4>
|
|
1980
|
-
<Table>
|
|
1981
|
-
<TableHeader>
|
|
1982
|
-
<TableRow>
|
|
1983
|
-
<TableHead className="text-data-label">COLUMN</TableHead>
|
|
1984
|
-
<TableHead className="text-data-label text-right">VALUE</TableHead>
|
|
1985
|
-
</TableRow>
|
|
1986
|
-
</TableHeader>
|
|
1987
|
-
<TableBody>
|
|
1988
|
-
<TableRow>
|
|
1989
|
-
<TableCell className="text-data-value">Row Item</TableCell>
|
|
1990
|
-
<TableCell className="text-data-value text-right">123</TableCell>
|
|
1991
|
-
</TableRow>
|
|
1992
|
-
<TableRow>
|
|
1993
|
-
<TableCell className="text-data-meta">Metadata</TableCell>
|
|
1994
|
-
<TableCell className="text-data-meta text-right">Info</TableCell>
|
|
1995
|
-
</TableRow>
|
|
1996
|
-
</TableBody>
|
|
1997
|
-
</Table>
|
|
1998
|
-
</div>
|
|
1999
|
-
</div>
|
|
2000
|
-
|
|
2001
|
-
{showCode && (
|
|
2002
|
-
<div className="mt-4 p-4 bg-muted border border-border rounded-md">
|
|
2003
|
-
<pre className="text-sm font-mono text-foreground overflow-x-auto">
|
|
2004
|
-
<code>{`<div className="text-data-label">METRIC LABEL</div>
|
|
2005
|
-
<div className="text-data-value">1,234.56</div>
|
|
2006
|
-
<div className="text-data-meta">+12.3% from last period</div>`}</code>
|
|
2007
|
-
</pre>
|
|
2008
|
-
</div>
|
|
2009
|
-
)}
|
|
2010
|
-
</div>
|
|
2011
|
-
</ShowcaseSection>
|
|
2012
|
-
</Card>
|
|
2013
|
-
|
|
2014
|
-
{/* Typography Utilities */}
|
|
2015
|
-
<Card className="p-6" category={3}>
|
|
2016
|
-
<ShowcaseSection
|
|
2017
|
-
title="Typography Utilities"
|
|
2018
|
-
description="Utility classes for text styling and layout"
|
|
2019
|
-
badge={{ text: "Utilities", variant: "category", category: 3 }}
|
|
2020
|
-
>
|
|
2021
|
-
<div className="space-y-6">
|
|
2022
|
-
<div className="grid md:grid-cols-2 gap-6">
|
|
2023
|
-
<div>
|
|
2024
|
-
<h4 className="text-sm font-medium mb-4">Text Colors</h4>
|
|
2025
|
-
<div className="space-y-2">
|
|
2026
|
-
<p className="text-foreground">text-foreground - Primary text</p>
|
|
2027
|
-
<p className="text-muted-foreground">text-muted-foreground - Secondary text</p>
|
|
2028
|
-
<p className="text-primary">text-primary - Brand color</p>
|
|
2029
|
-
<p className="text-status-success">text-status-success - Success state</p>
|
|
2030
|
-
<p className="text-status-error">text-status-error - Error state</p>
|
|
2031
|
-
</div>
|
|
2032
|
-
</div>
|
|
2033
|
-
|
|
2034
|
-
<div>
|
|
2035
|
-
<h4 className="text-sm font-medium mb-4">Font Weights</h4>
|
|
2036
|
-
<div className="space-y-2">
|
|
2037
|
-
<p className="font-thin">font-thin - 100</p>
|
|
2038
|
-
<p className="font-light">font-light - 300</p>
|
|
2039
|
-
<p className="font-normal">font-normal - 400</p>
|
|
2040
|
-
<p className="font-medium">font-medium - 500</p>
|
|
2041
|
-
<p className="font-semibold">font-semibold - 600</p>
|
|
2042
|
-
<p className="font-bold">font-bold - 700</p>
|
|
2043
|
-
</div>
|
|
2044
|
-
</div>
|
|
2045
|
-
</div>
|
|
2046
|
-
|
|
2047
|
-
<div>
|
|
2048
|
-
<h4 className="text-sm font-medium mb-4">Text Alignment & Spacing</h4>
|
|
2049
|
-
<div className="grid md:grid-cols-3 gap-4">
|
|
2050
|
-
<Card className="p-4 text-left" category={1}>
|
|
2051
|
-
<p className="font-medium">Left Aligned</p>
|
|
2052
|
-
<p className="text-sm text-muted-foreground">text-left</p>
|
|
2053
|
-
</Card>
|
|
2054
|
-
<Card className="p-4 text-center" category={2}>
|
|
2055
|
-
<p className="font-medium">Center Aligned</p>
|
|
2056
|
-
<p className="text-sm text-muted-foreground">text-center</p>
|
|
2057
|
-
</Card>
|
|
2058
|
-
<Card className="p-4 text-right" category={3}>
|
|
2059
|
-
<p className="font-medium">Right Aligned</p>
|
|
2060
|
-
<p className="text-sm text-muted-foreground">text-right</p>
|
|
2061
|
-
</Card>
|
|
2062
|
-
</div>
|
|
2063
|
-
</div>
|
|
2064
|
-
</div>
|
|
2065
|
-
</ShowcaseSection>
|
|
2066
|
-
</Card>
|
|
2067
|
-
|
|
2068
|
-
{/* Typography in Components */}
|
|
2069
|
-
<Card className="p-6" category={4}>
|
|
2070
|
-
<ShowcaseSection
|
|
2071
|
-
title="Typography in Context"
|
|
2072
|
-
description="How typography works within component compositions"
|
|
2073
|
-
badge={{ text: "Integration", variant: "category", category: 4 }}
|
|
2074
|
-
>
|
|
2075
|
-
<div className="space-y-6">
|
|
2076
|
-
<div className="grid md:grid-cols-2 gap-6">
|
|
2077
|
-
<StatCard
|
|
2078
|
-
title="Typography in StatCard"
|
|
2079
|
-
value="99.9%"
|
|
2080
|
-
subtitle="Uses data typography patterns"
|
|
2081
|
-
category={1}
|
|
2082
|
-
icon={<Database className="w-5 h-5" />}
|
|
2083
|
-
trend={{ value: 2.3, label: "improvement" }}
|
|
2084
|
-
/>
|
|
2085
|
-
|
|
2086
|
-
<Card className="p-4" category={2}>
|
|
2087
|
-
<div className="flex items-start justify-between mb-2">
|
|
2088
|
-
<h3 className="text-lg font-semibold">Card Title</h3>
|
|
2089
|
-
<DataBadge variant="category" category={2} size="sm">Active</DataBadge>
|
|
2090
|
-
</div>
|
|
2091
|
-
<p className="text-sm text-muted-foreground mb-4">
|
|
2092
|
-
Card description using muted foreground color for secondary text.
|
|
2093
|
-
</p>
|
|
2094
|
-
<div className="flex items-center gap-4">
|
|
2095
|
-
<div>
|
|
2096
|
-
<div className="text-data-label">STATUS</div>
|
|
2097
|
-
<div className="text-data-value">Online</div>
|
|
2098
|
-
</div>
|
|
2099
|
-
<div>
|
|
2100
|
-
<div className="text-data-label">UPTIME</div>
|
|
2101
|
-
<div className="text-data-value">99.9%</div>
|
|
2102
|
-
</div>
|
|
2103
|
-
</div>
|
|
2104
|
-
</Card>
|
|
2105
|
-
</div>
|
|
2106
|
-
|
|
2107
|
-
<Alert status="info" title="Typography Best Practices">
|
|
2108
|
-
<ul className="list-disc list-inside space-y-1 text-sm">
|
|
2109
|
-
<li>Use <code className="text-xs bg-muted px-1 rounded">text-data-label</code> for metric labels</li>
|
|
2110
|
-
<li>Use <code className="text-xs bg-muted px-1 rounded">text-data-value</code> for prominent values</li>
|
|
2111
|
-
<li>Use <code className="text-xs bg-muted px-1 rounded">text-muted-foreground</code> for secondary text</li>
|
|
2112
|
-
<li>Maintain consistent hierarchy with font sizes and weights</li>
|
|
2113
|
-
</ul>
|
|
2114
|
-
</Alert>
|
|
2115
|
-
</div>
|
|
2116
|
-
</ShowcaseSection>
|
|
2117
|
-
</Card>
|
|
2118
|
-
|
|
2119
|
-
{/* Typography Architecture */}
|
|
2120
|
-
<Card className="p-6" category={5}>
|
|
2121
|
-
<ShowcaseSection
|
|
2122
|
-
title="Typography System Architecture"
|
|
2123
|
-
description="Design tokens and CSS variables powering the typography system"
|
|
2124
|
-
badge={{ text: "Architecture", variant: "category", category: 5 }}
|
|
2125
|
-
>
|
|
2126
|
-
<div className="space-y-4">
|
|
2127
|
-
<div className="grid md:grid-cols-2 gap-4">
|
|
2128
|
-
<div>
|
|
2129
|
-
<h4 className="text-sm font-medium mb-3">Type Scale</h4>
|
|
2130
|
-
<div className="space-y-2 text-xs font-mono">
|
|
2131
|
-
<div className="p-2 bg-muted rounded">
|
|
2132
|
-
--font-size-xs: 0.75rem (12px)
|
|
2133
|
-
</div>
|
|
2134
|
-
<div className="p-2 bg-muted rounded">
|
|
2135
|
-
--font-size-sm: 0.875rem (14px)
|
|
2136
|
-
</div>
|
|
2137
|
-
<div className="p-2 bg-muted rounded">
|
|
2138
|
-
--font-size-base: 1rem (16px)
|
|
2139
|
-
</div>
|
|
2140
|
-
<div className="p-2 bg-muted rounded">
|
|
2141
|
-
--font-size-lg: 1.125rem (18px)
|
|
2142
|
-
</div>
|
|
2143
|
-
<div className="p-2 bg-muted rounded">
|
|
2144
|
-
--font-size-xl: 1.25rem (20px)
|
|
2145
|
-
</div>
|
|
2146
|
-
</div>
|
|
2147
|
-
</div>
|
|
2148
|
-
|
|
2149
|
-
<div>
|
|
2150
|
-
<h4 className="text-sm font-medium mb-3">Data Typography Classes</h4>
|
|
2151
|
-
<div className="space-y-2 text-xs">
|
|
2152
|
-
<div className="p-2 bg-muted rounded">
|
|
2153
|
-
<code>.text-data-label</code> → Uppercase, smaller, medium weight
|
|
2154
|
-
</div>
|
|
2155
|
-
<div className="p-2 bg-muted rounded">
|
|
2156
|
-
<code>.text-data-value</code> → Larger, semibold, high contrast
|
|
2157
|
-
</div>
|
|
2158
|
-
<div className="p-2 bg-muted rounded">
|
|
2159
|
-
<code>.text-data-meta</code> → Smaller, muted color
|
|
2160
|
-
</div>
|
|
2161
|
-
<div className="p-2 bg-muted rounded">
|
|
2162
|
-
<code>.text-data-*</code> → Sized variants (xs, sm, base, lg, xl)
|
|
2163
|
-
</div>
|
|
2164
|
-
</div>
|
|
2165
|
-
</div>
|
|
2166
|
-
</div>
|
|
2167
|
-
|
|
2168
|
-
{showCode && (
|
|
2169
|
-
<div className="mt-4 p-4 bg-muted border border-border rounded-md">
|
|
2170
|
-
<h5 className="font-medium mb-2">Usage Guidelines</h5>
|
|
2171
|
-
<ul className="text-sm space-y-1 text-muted-foreground">
|
|
2172
|
-
<li>• Use base typography for general UI text</li>
|
|
2173
|
-
<li>• Use data typography for metrics, values, and data presentation</li>
|
|
2174
|
-
<li>• Maintain consistent hierarchy within components</li>
|
|
2175
|
-
<li>• Leverage color utilities for semantic meaning</li>
|
|
2176
|
-
</ul>
|
|
2177
|
-
</div>
|
|
2178
|
-
)}
|
|
2179
|
-
</div>
|
|
2180
|
-
</ShowcaseSection>
|
|
2181
|
-
</Card>
|
|
2182
|
-
</div>
|
|
2183
|
-
</TabsContent>
|
|
2184
|
-
|
|
2185
|
-
{/* Palettes Section */}
|
|
2186
|
-
<TabsContent value="palettes" className="space-y-6">
|
|
2187
|
-
<div className="space-y-2 mb-8">
|
|
2188
|
-
<h2 className="text-2xl font-bold text-foreground">Color System & Palettes</h2>
|
|
2189
|
-
<p className="text-muted-foreground">
|
|
2190
|
-
Complete color system including individual color swatches and predefined palette combinations for data visualization and interface design.
|
|
2191
|
-
</p>
|
|
2192
|
-
</div>
|
|
2193
|
-
|
|
2194
|
-
<div className="grid gap-6">
|
|
2195
|
-
{/* Category Colors - Individual Swatches */}
|
|
2196
|
-
<Card className="p-6" category={1}>
|
|
2197
|
-
<ShowcaseSection
|
|
2198
|
-
title="Category Colors"
|
|
2199
|
-
description="Primary colors for categorizing different types of data, models, and content sections."
|
|
2200
|
-
badge={{ text: "Data Classification", variant: "category", category: 1 }}
|
|
2201
|
-
>
|
|
2202
|
-
<div className="grid grid-cols-4 md:grid-cols-8 gap-4">
|
|
2203
|
-
{[
|
|
2204
|
-
{ num: 1, name: 'Blue', usage: 'Primary data' },
|
|
2205
|
-
{ num: 2, name: 'Teal', usage: 'Models' },
|
|
2206
|
-
{ num: 3, name: 'Orange', usage: 'Tests' },
|
|
2207
|
-
{ num: 4, name: 'Purple', usage: 'Sources' },
|
|
2208
|
-
{ num: 5, name: 'Pink', usage: 'Analytics' },
|
|
2209
|
-
{ num: 6, name: 'Green', usage: 'Jobs' },
|
|
2210
|
-
{ num: 7, name: 'Yellow', usage: 'Documentation' },
|
|
2211
|
-
{ num: 8, name: 'Red', usage: 'Issues' }
|
|
2212
|
-
].map(category => (
|
|
2213
|
-
<ColorSwatch
|
|
2214
|
-
key={category.num}
|
|
2215
|
-
color={`hsl(var(--category-${category.num}))`}
|
|
2216
|
-
name={category.name}
|
|
2217
|
-
label={category.usage}
|
|
2218
|
-
interactive
|
|
2219
|
-
/>
|
|
2220
|
-
))}
|
|
2221
|
-
</div>
|
|
2222
|
-
</ShowcaseSection>
|
|
2223
|
-
</Card>
|
|
2224
|
-
|
|
2225
|
-
{/* Category Palette - Combined */}
|
|
2226
|
-
<Card className="p-6" category={6}>
|
|
2227
|
-
<ShowcaseSection
|
|
2228
|
-
title="Category Palette"
|
|
2229
|
-
description="Complete 8-color palette for data categorization with excellent contrast and accessibility."
|
|
2230
|
-
badge={{ text: "8 Colors", variant: "category", category: 6 }}
|
|
2231
|
-
>
|
|
2232
|
-
<div className="flex gap-1 rounded overflow-hidden border border-border">
|
|
2233
|
-
{[1, 2, 3, 4, 5, 6, 7, 8].map(num => (
|
|
2234
|
-
<div
|
|
2235
|
-
key={num}
|
|
2236
|
-
className="flex-1 h-24 group relative cursor-pointer"
|
|
2237
|
-
style={{ backgroundColor: `hsl(var(--category-${num}))` }}
|
|
2238
|
-
>
|
|
2239
|
-
<div className="absolute inset-0 bg-black/0 group-hover:bg-black/10 flex items-center justify-center">
|
|
2240
|
-
<span className="text-white font-medium opacity-0 group-hover:opacity-100 transition-opacity">
|
|
2241
|
-
{num}
|
|
2242
|
-
</span>
|
|
2243
|
-
</div>
|
|
2244
|
-
</div>
|
|
2245
|
-
))}
|
|
2246
|
-
</div>
|
|
2247
|
-
</ShowcaseSection>
|
|
2248
|
-
</Card>
|
|
2249
|
-
|
|
2250
|
-
{/* Status Colors - Individual Swatches */}
|
|
2251
|
-
<Card className="p-6" category={2}>
|
|
2252
|
-
<ShowcaseSection
|
|
2253
|
-
title="Status Colors"
|
|
2254
|
-
description="Semantic colors for indicating status, health, and operational states across the system."
|
|
2255
|
-
badge={{ text: "System States", variant: "status", status: "success" }}
|
|
2256
|
-
>
|
|
2257
|
-
<div className="grid grid-cols-5 gap-4">
|
|
2258
|
-
{[
|
|
2259
|
-
{ name: 'Success', usage: 'Completed', cssVar: '--status-success' },
|
|
2260
|
-
{ name: 'Warning', usage: 'Attention', cssVar: '--status-warning' },
|
|
2261
|
-
{ name: 'Error', usage: 'Failed', cssVar: '--status-error' },
|
|
2262
|
-
{ name: 'Info', usage: 'Information', cssVar: '--status-info' },
|
|
2263
|
-
{ name: 'Neutral', usage: 'Pending', cssVar: '--status-neutral' }
|
|
2264
|
-
].map(color => (
|
|
2265
|
-
<ColorSwatch
|
|
2266
|
-
key={color.name}
|
|
2267
|
-
color={`hsl(var(${color.cssVar}))`}
|
|
2268
|
-
name={color.name}
|
|
2269
|
-
label={color.usage}
|
|
2270
|
-
interactive
|
|
2271
|
-
/>
|
|
2272
|
-
))}
|
|
2273
|
-
</div>
|
|
2274
|
-
</ShowcaseSection>
|
|
2275
|
-
</Card>
|
|
2276
|
-
|
|
2277
|
-
{/* Status Palette - Combined */}
|
|
2278
|
-
<Card className="p-6" category={7}>
|
|
2279
|
-
<ShowcaseSection
|
|
2280
|
-
title="Status Palette"
|
|
2281
|
-
description="Semantic color palette for system states and operational indicators."
|
|
2282
|
-
badge={{ text: "5 States", variant: "status", status: "info" }}
|
|
2283
|
-
>
|
|
2284
|
-
<div className="flex gap-1 rounded overflow-hidden border border-border">
|
|
2285
|
-
{[
|
|
2286
|
-
{ name: 'Success', var: '--status-success' },
|
|
2287
|
-
{ name: 'Warning', var: '--status-warning' },
|
|
2288
|
-
{ name: 'Error', var: '--status-error' },
|
|
2289
|
-
{ name: 'Info', var: '--status-info' },
|
|
2290
|
-
{ name: 'Neutral', var: '--status-neutral' }
|
|
2291
|
-
].map(status => (
|
|
2292
|
-
<div
|
|
2293
|
-
key={status.name}
|
|
2294
|
-
className="flex-1 h-24 group relative cursor-pointer"
|
|
2295
|
-
style={{ backgroundColor: `hsl(var(${status.var}))` }}
|
|
2296
|
-
>
|
|
2297
|
-
<div className="absolute inset-0 bg-black/0 group-hover:bg-black/10 flex items-center justify-center">
|
|
2298
|
-
<span className="text-white font-medium text-xs opacity-0 group-hover:opacity-100 transition-opacity">
|
|
2299
|
-
{status.name}
|
|
2300
|
-
</span>
|
|
2301
|
-
</div>
|
|
2302
|
-
</div>
|
|
2303
|
-
))}
|
|
2304
|
-
</div>
|
|
2305
|
-
</ShowcaseSection>
|
|
2306
|
-
</Card>
|
|
2307
|
-
|
|
2308
|
-
{/* Extended Grays - Individual Swatches */}
|
|
2309
|
-
<Card className="p-6" category={3}>
|
|
2310
|
-
<ShowcaseSection
|
|
2311
|
-
title="Extended Grays"
|
|
2312
|
-
description="Comprehensive gray scale for backgrounds, borders, text, and subtle UI elements."
|
|
2313
|
-
badge={{ text: "Neutrals", variant: "status", status: "neutral" }}
|
|
2314
|
-
>
|
|
2315
|
-
<div className="grid grid-cols-6 md:grid-cols-11 gap-2">
|
|
2316
|
-
{[25, 75, 150, 250, 350, 450, 550, 650, 750, 850, 925].map(shade => (
|
|
2317
|
-
<ColorSwatch
|
|
2318
|
-
key={shade}
|
|
2319
|
-
color={`hsl(var(--gray-${shade}))`}
|
|
2320
|
-
name={shade.toString()}
|
|
2321
|
-
size="sm"
|
|
2322
|
-
interactive
|
|
2323
|
-
/>
|
|
2324
|
-
))}
|
|
2325
|
-
</div>
|
|
2326
|
-
</ShowcaseSection>
|
|
2327
|
-
</Card>
|
|
2328
|
-
|
|
2329
|
-
{/* Gray Palette - Combined */}
|
|
2330
|
-
<Card className="p-6" category={8}>
|
|
2331
|
-
<ShowcaseSection
|
|
2332
|
-
title="Extended Gray Palette"
|
|
2333
|
-
description="Comprehensive neutral palette for backgrounds, borders, and subtle interface elements."
|
|
2334
|
-
badge={{ text: "11 Shades", variant: "status", status: "neutral" }}
|
|
2335
|
-
>
|
|
2336
|
-
<div className="flex gap-1 rounded overflow-hidden border border-border">
|
|
2337
|
-
{[25, 75, 150, 250, 350, 450, 550, 650, 750, 850, 925].map(shade => (
|
|
2338
|
-
<div
|
|
2339
|
-
key={shade}
|
|
2340
|
-
className="flex-1 h-24 group relative cursor-pointer"
|
|
2341
|
-
style={{ backgroundColor: `hsl(var(--gray-${shade}))` }}
|
|
2342
|
-
>
|
|
2343
|
-
<div className="absolute inset-0 bg-black/0 group-hover:bg-black/10 flex items-center justify-center">
|
|
2344
|
-
<span className="text-white font-medium text-xs opacity-0 group-hover:opacity-100 transition-opacity">
|
|
2345
|
-
{shade}
|
|
2346
|
-
</span>
|
|
2347
|
-
</div>
|
|
2348
|
-
</div>
|
|
2349
|
-
))}
|
|
2350
|
-
</div>
|
|
2351
|
-
</ShowcaseSection>
|
|
2352
|
-
</Card>
|
|
2353
|
-
|
|
2354
|
-
{/* UI System Colors - Individual Swatches */}
|
|
2355
|
-
<Card className="p-6" category={4}>
|
|
2356
|
-
<ShowcaseSection
|
|
2357
|
-
title="UI System Colors"
|
|
2358
|
-
description="Core UI colors for backgrounds, surfaces, borders, and interactive elements."
|
|
2359
|
-
badge={{ text: "Interface", variant: "category", category: 4 }}
|
|
2360
|
-
>
|
|
2361
|
-
<div className="grid grid-cols-3 md:grid-cols-6 gap-4">
|
|
2362
|
-
{[
|
|
2363
|
-
{ name: 'Background', cssVar: '--background', usage: 'Page background' },
|
|
2364
|
-
{ name: 'Foreground', cssVar: '--foreground', usage: 'Primary text' },
|
|
2365
|
-
{ name: 'Card', cssVar: '--card', usage: 'Card backgrounds' },
|
|
2366
|
-
{ name: 'Border', cssVar: '--border', usage: 'Dividers' },
|
|
2367
|
-
{ name: 'Primary', cssVar: '--primary', usage: 'Brand color' },
|
|
2368
|
-
{ name: 'Secondary', cssVar: '--secondary', usage: 'Secondary actions' }
|
|
2369
|
-
].map(color => (
|
|
2370
|
-
<ColorSwatch
|
|
2371
|
-
key={color.name}
|
|
2372
|
-
color={`hsl(var(${color.cssVar}))`}
|
|
2373
|
-
name={color.name}
|
|
2374
|
-
label={color.usage}
|
|
2375
|
-
size="lg"
|
|
2376
|
-
interactive
|
|
2377
|
-
/>
|
|
2378
|
-
))}
|
|
2379
|
-
</div>
|
|
2380
|
-
</ShowcaseSection>
|
|
2381
|
-
</Card>
|
|
2382
|
-
</div>
|
|
2383
|
-
</TabsContent>
|
|
2384
|
-
|
|
2385
|
-
{/* Debug Section */}
|
|
2386
|
-
<TabsContent value="debug" className="space-y-6">
|
|
2387
|
-
<div className="space-y-2 mb-8">
|
|
2388
|
-
<h2 className="text-2xl font-bold text-foreground">Debug Tools</h2>
|
|
2389
|
-
<p className="text-muted-foreground">
|
|
2390
|
-
Development utilities for testing, debugging, and validating the design system.
|
|
2391
|
-
</p>
|
|
2392
|
-
</div>
|
|
2393
|
-
|
|
2394
|
-
<div className="grid gap-6">
|
|
2395
|
-
{/* Color Variables Debug */}
|
|
2396
|
-
<Card className="p-6" category={8}>
|
|
2397
|
-
<h3 className="text-lg font-medium mb-4 flex items-center gap-2">
|
|
2398
|
-
CSS Variables
|
|
2399
|
-
<DataBadge variant="category" category={8} size="sm">Debug</DataBadge>
|
|
2400
|
-
</h3>
|
|
2401
|
-
<p className="text-sm text-muted-foreground mb-6">
|
|
2402
|
-
Live CSS custom property values currently applied to the system.
|
|
2403
|
-
</p>
|
|
2404
|
-
<div className="grid grid-cols-2 md:grid-cols-4 gap-4 text-sm font-mono">
|
|
2405
|
-
{[
|
|
2406
|
-
'--category-1', '--category-2', '--category-3', '--category-4',
|
|
2407
|
-
'--status-success', '--status-warning', '--status-error', '--status-info',
|
|
2408
|
-
'--background', '--foreground', '--border', '--primary'
|
|
2409
|
-
].map(variable => (
|
|
2410
|
-
<Card key={variable} className="p-3">
|
|
2411
|
-
<div className="text-xs text-muted-foreground mb-1">{variable}</div>
|
|
2412
|
-
<div
|
|
2413
|
-
className="w-full h-8 rounded border border-border"
|
|
2414
|
-
style={{ backgroundColor: `hsl(var(${variable}))` }}
|
|
2415
|
-
/>
|
|
2416
|
-
</Card>
|
|
2417
|
-
))}
|
|
2418
|
-
</div>
|
|
2419
|
-
</Card>
|
|
2420
|
-
|
|
2421
|
-
{/* Component States */}
|
|
2422
|
-
<Card className="p-6" category={5}>
|
|
2423
|
-
<h3 className="text-lg font-medium mb-4 flex items-center gap-2">
|
|
2424
|
-
Component States
|
|
2425
|
-
<DataBadge variant="status" status="info" size="sm">Interactive</DataBadge>
|
|
2426
|
-
</h3>
|
|
2427
|
-
<p className="text-sm text-muted-foreground mb-6">
|
|
2428
|
-
Test different states and interactions of design system components.
|
|
2429
|
-
</p>
|
|
2430
|
-
<div className="grid grid-cols-2 md:grid-cols-4 gap-4">
|
|
2431
|
-
{[1, 2, 3, 4].map(category => (
|
|
2432
|
-
<Card key={category} category={category as 1 | 2 | 3 | 4} className="p-4">
|
|
2433
|
-
<h4 className="font-medium mb-2">Category {category}</h4>
|
|
2434
|
-
<DataBadge variant="category" category={category as 1 | 2 | 3 | 4} size="sm">
|
|
2435
|
-
Test Badge
|
|
2436
|
-
</DataBadge>
|
|
2437
|
-
<div className="mt-3 space-y-2">
|
|
2438
|
-
<div className="text-xs text-muted-foreground">
|
|
2439
|
-
Color: hsl(var(--category-{category}))
|
|
2440
|
-
</div>
|
|
2441
|
-
<div className="text-xs text-muted-foreground">
|
|
2442
|
-
Background: hsl(var(--category-{category}) / 0.02)
|
|
2443
|
-
</div>
|
|
2444
|
-
</div>
|
|
2445
|
-
</Card>
|
|
2446
|
-
))}
|
|
2447
|
-
</div>
|
|
2448
|
-
</Card>
|
|
2449
|
-
</div>
|
|
2450
|
-
</TabsContent>
|
|
2451
|
-
</Tabs>
|
|
2452
|
-
</div>
|
|
2453
|
-
</div>
|
|
2454
|
-
|
|
2455
|
-
{/* Toast Container */}
|
|
2456
|
-
<ToastContainer
|
|
2457
|
-
toasts={toasts.map(t => ({
|
|
2458
|
-
id: t.id,
|
|
2459
|
-
status: t.status,
|
|
2460
|
-
title: t.title,
|
|
2461
|
-
children: t.message,
|
|
2462
|
-
duration: 5000,
|
|
2463
|
-
showProgress: true,
|
|
2464
|
-
onDismiss: () => setToasts(prev => prev.filter(toast => toast.id !== t.id))
|
|
2465
|
-
}))}
|
|
2466
|
-
position="top-right"
|
|
2467
|
-
/>
|
|
2468
|
-
|
|
2469
|
-
{/* Footer */}
|
|
2470
|
-
<footer className="bg-card/30 backdrop-blur-sm border-t border-border/50">
|
|
2471
|
-
<div className="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8 py-8">
|
|
2472
|
-
<div className="flex items-center justify-between">
|
|
2473
|
-
<div className="flex items-center space-x-4">
|
|
2474
|
-
<IconBadge
|
|
2475
|
-
variant="category"
|
|
2476
|
-
category={1}
|
|
2477
|
-
size="sm"
|
|
2478
|
-
>
|
|
2479
|
-
DT
|
|
2480
|
-
</IconBadge>
|
|
2481
|
-
<div>
|
|
2482
|
-
<p className="text-sm font-medium text-foreground">Data Trust Navigator</p>
|
|
2483
|
-
<p className="text-xs text-muted-foreground">Design System Showcase • Built with Atomic Architecture</p>
|
|
2484
|
-
</div>
|
|
2485
|
-
</div>
|
|
2486
|
-
|
|
2487
|
-
<div className="flex items-center space-x-4">
|
|
2488
|
-
<DataBadge variant="category" category={1} size="sm">Design System</DataBadge>
|
|
2489
|
-
<DataBadge variant="status" status="success" size="sm">v1.0</DataBadge>
|
|
2490
|
-
</div>
|
|
2491
|
-
</div>
|
|
2492
|
-
</div>
|
|
2493
|
-
</footer>
|
|
2494
|
-
</div>
|
|
2495
|
-
);
|
|
2496
|
-
};
|