@pattern-stack/frontend-patterns 0.0.3 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (154) hide show
  1. package/dist/index.es.js +1 -1
  2. package/dist/index.js +1 -0
  3. package/package.json +5 -3
  4. package/src/App.css +42 -0
  5. package/src/App.tsx +54 -0
  6. package/src/__tests__/README.md +221 -0
  7. package/src/__tests__/atoms/hooks/simple-hooks.test.ts +44 -0
  8. package/src/__tests__/atoms/ui/button.test.tsx +68 -0
  9. package/src/__tests__/atoms/utils/simple.test.ts +18 -0
  10. package/src/__tests__/atoms/utils/utils.test.ts +77 -0
  11. package/src/__tests__/features/auth/simple-auth.test.tsx +40 -0
  12. package/src/__tests__/molecules/layout/simple-layout.test.tsx +81 -0
  13. package/src/__tests__/organisms/showcase/simple-showcase.test.tsx +167 -0
  14. package/src/__tests__/setup.ts +51 -0
  15. package/src/__tests__/utils.tsx +123 -0
  16. package/src/atoms/composed/Accordion/Accordion.tsx +271 -0
  17. package/src/atoms/composed/Accordion/index.ts +1 -0
  18. package/src/atoms/composed/Alert/Alert.tsx +132 -0
  19. package/src/atoms/composed/Alert/index.ts +1 -0
  20. package/src/atoms/composed/Breadcrumb/Breadcrumb.tsx +83 -0
  21. package/src/atoms/composed/Breadcrumb/index.ts +1 -0
  22. package/src/atoms/composed/Chart/Chart.tsx +425 -0
  23. package/src/atoms/composed/Chart/index.ts +2 -0
  24. package/src/atoms/composed/ColorSwatch/ColorSwatch.tsx +72 -0
  25. package/src/atoms/composed/ColorSwatch/index.ts +1 -0
  26. package/src/atoms/composed/DarkModeToggle.tsx +66 -0
  27. package/src/atoms/composed/DataBadge/DataBadge.tsx +81 -0
  28. package/src/atoms/composed/DataBadge/index.ts +1 -0
  29. package/src/atoms/composed/DataTable/DataTable.tsx +394 -0
  30. package/src/atoms/composed/DataTable/TableCellWithTooltip.tsx +41 -0
  31. package/src/atoms/composed/DataTable/index.ts +2 -0
  32. package/src/atoms/composed/DateTimePicker/DateTimePicker.tsx +611 -0
  33. package/src/atoms/composed/DateTimePicker/index.ts +2 -0
  34. package/src/atoms/composed/DetailedCard/DetailedCard.tsx +181 -0
  35. package/src/atoms/composed/DetailedCard/index.ts +2 -0
  36. package/src/atoms/composed/EmptyState/EmptyState.tsx +90 -0
  37. package/src/atoms/composed/EmptyState/index.ts +1 -0
  38. package/src/atoms/composed/FileUpload/FileUpload.tsx +477 -0
  39. package/src/atoms/composed/FileUpload/index.ts +2 -0
  40. package/src/atoms/composed/FormField/FormField.tsx +92 -0
  41. package/src/atoms/composed/FormField/index.ts +1 -0
  42. package/src/atoms/composed/GlobalSearch/GlobalSearch.tsx +37 -0
  43. package/src/atoms/composed/GlobalSearch/index.ts +1 -0
  44. package/src/atoms/composed/IconBadge/IconBadge.tsx +95 -0
  45. package/src/atoms/composed/IconBadge/index.ts +2 -0
  46. package/src/atoms/composed/Modal/Modal.tsx +223 -0
  47. package/src/atoms/composed/Modal/index.ts +2 -0
  48. package/src/atoms/composed/PaletteSwitcher.tsx +386 -0
  49. package/src/atoms/composed/ProgressBar/ProgressBar.tsx +116 -0
  50. package/src/atoms/composed/ProgressBar/index.ts +1 -0
  51. package/src/atoms/composed/StatCard/StatCard.tsx +219 -0
  52. package/src/atoms/composed/StatCard/index.ts +1 -0
  53. package/src/atoms/composed/StyleGuide.tsx +717 -0
  54. package/src/atoms/composed/Toast/Toast.tsx +219 -0
  55. package/src/atoms/composed/Toast/index.ts +1 -0
  56. package/src/atoms/composed/Tooltip/Tooltip.tsx +213 -0
  57. package/src/atoms/composed/Tooltip/index.ts +1 -0
  58. package/src/atoms/composed/UserAvatar/UserAvatar.tsx +139 -0
  59. package/src/atoms/composed/UserAvatar/index.ts +1 -0
  60. package/src/atoms/composed/UserMenu/UserMenu.tsx +16 -0
  61. package/src/atoms/composed/UserMenu/index.ts +1 -0
  62. package/src/atoms/composed/index.ts +29 -0
  63. package/src/atoms/hooks/useApi.ts +80 -0
  64. package/src/atoms/hooks/useHealth.ts +17 -0
  65. package/src/atoms/index.ts +13 -0
  66. package/src/atoms/services/api/client.ts +134 -0
  67. package/src/atoms/services/auth-service.ts +248 -0
  68. package/src/atoms/services/health.ts +15 -0
  69. package/src/atoms/services/index.ts +3 -0
  70. package/src/atoms/shared/config/constants.ts +17 -0
  71. package/src/atoms/shared/config/dashboard-sizes.ts +111 -0
  72. package/src/atoms/shared/config/environment.ts +10 -0
  73. package/src/atoms/shared/index.ts +4 -0
  74. package/src/atoms/shared/styles/color-palettes.css +566 -0
  75. package/src/atoms/types/auth.ts +62 -0
  76. package/src/atoms/types/generated.ts +1469 -0
  77. package/src/atoms/types/index.ts +4 -0
  78. package/src/atoms/types/loading.ts +28 -0
  79. package/src/atoms/ui/Badge.tsx +30 -0
  80. package/src/atoms/ui/ErrorBoundary.tsx +59 -0
  81. package/src/atoms/ui/Select.tsx +53 -0
  82. package/src/atoms/ui/Switch.tsx +42 -0
  83. package/src/atoms/ui/Tabs.tsx +118 -0
  84. package/src/atoms/ui/avatar.tsx +48 -0
  85. package/src/atoms/ui/button.tsx +70 -0
  86. package/src/atoms/ui/card.tsx +76 -0
  87. package/src/atoms/ui/dropdown-menu.tsx +199 -0
  88. package/src/atoms/ui/index.ts +39 -0
  89. package/src/atoms/ui/input.tsx +23 -0
  90. package/src/atoms/ui/label.tsx +23 -0
  91. package/src/atoms/ui/skeleton.tsx +13 -0
  92. package/src/atoms/ui/spinner.tsx +49 -0
  93. package/src/atoms/ui/table.tsx +116 -0
  94. package/src/atoms/utils/animations.ts +135 -0
  95. package/src/atoms/utils/tooltip-helpers.ts +140 -0
  96. package/src/atoms/utils/utils.ts +9 -0
  97. package/src/features/auth/components/LoginForm.tsx +168 -0
  98. package/src/features/auth/components/LogoutButton.tsx +19 -0
  99. package/src/features/auth/components/ProtectedRoute.tsx +60 -0
  100. package/src/features/auth/components/index.ts +4 -0
  101. package/src/features/auth/hooks/index.ts +2 -0
  102. package/src/features/auth/hooks/useAuth.tsx +205 -0
  103. package/src/features/auth/hooks/usePermissions.ts +35 -0
  104. package/src/features/auth/index.ts +2 -0
  105. package/src/features/index.ts +2 -0
  106. package/src/index.css +704 -0
  107. package/src/index.ts +13 -0
  108. package/src/main.tsx +48 -0
  109. package/src/molecules/.gitkeep +0 -0
  110. package/src/molecules/forms/FormGroup.tsx +75 -0
  111. package/src/molecules/forms/SearchInput.tsx +259 -0
  112. package/src/molecules/forms/index.ts +4 -0
  113. package/src/molecules/index.ts +4 -0
  114. package/src/molecules/layout/AppHeader/AppHeader.tsx +42 -0
  115. package/src/molecules/layout/AppHeader/index.ts +1 -0
  116. package/src/molecules/layout/AppLayout.tsx +29 -0
  117. package/src/molecules/layout/PageTemplate.tsx +87 -0
  118. package/src/molecules/layout/SectionHeader/SectionHeader.tsx +87 -0
  119. package/src/molecules/layout/SectionHeader/index.ts +1 -0
  120. package/src/molecules/layout/ShowcaseSection.tsx +57 -0
  121. package/src/molecules/layout/Sidebar.tsx +144 -0
  122. package/src/molecules/layout/SidebarButton/SidebarButton.tsx +99 -0
  123. package/src/molecules/layout/SidebarButton/index.ts +1 -0
  124. package/src/molecules/layout/SidebarContext.tsx +31 -0
  125. package/src/molecules/layout/index.ts +7 -0
  126. package/src/molecules/navigation/NavMenu.tsx +188 -0
  127. package/src/molecules/navigation/Pagination.tsx +172 -0
  128. package/src/molecules/navigation/index.ts +4 -0
  129. package/src/organisms/index.ts +5 -0
  130. package/src/organisms/showcase/ComponentShowcasePage.tsx +2496 -0
  131. package/src/organisms/showcase/index.ts +1 -0
  132. package/src/pages/AdminShowcase/AdminCRUDShowcase.tsx +242 -0
  133. package/src/pages/AdminShowcase/AdminDashboardShowcase.tsx +171 -0
  134. package/src/pages/AdminShowcase/AdminDetailShowcase.tsx +385 -0
  135. package/src/pages/AdminShowcase/index.tsx +3 -0
  136. package/src/pages/ComponentShowcase/BadgesShowcase.tsx +188 -0
  137. package/src/pages/ComponentShowcase/CardsShowcase.tsx +392 -0
  138. package/src/pages/ComponentShowcase/PalettesShowcase.tsx +207 -0
  139. package/src/pages/ComponentShowcase/StatesShowcase.tsx +485 -0
  140. package/src/pages/ComponentShowcase/TablesShowcase.tsx +134 -0
  141. package/src/pages/ComponentShowcase/TypographyShowcase.tsx +255 -0
  142. package/src/pages/ComponentShowcase/index.tsx +188 -0
  143. package/src/pages/index.ts +2 -0
  144. package/src/templates/AuthTemplate.tsx +216 -0
  145. package/src/templates/ComponentShowcaseTemplate.tsx +173 -0
  146. package/src/templates/DashboardTemplate.tsx +232 -0
  147. package/src/templates/DataTemplate.tsx +319 -0
  148. package/src/templates/admin/AdminCRUDTemplate.tsx +630 -0
  149. package/src/templates/admin/AdminDashboardTemplate.tsx +351 -0
  150. package/src/templates/admin/AdminDetailTemplate.tsx +563 -0
  151. package/src/templates/admin/index.ts +29 -0
  152. package/src/templates/factory.tsx +169 -0
  153. package/src/templates/index.ts +37 -0
  154. package/src/vite-env.d.ts +1 -0
@@ -0,0 +1,385 @@
1
+ import React, { useState } from 'react';
2
+ import { AdminDetailTemplate } from '../../templates/admin';
3
+ import type { FieldSection, ActionConfig, AuditEntry, RelatedData } from '../../templates/admin';
4
+ import { Edit, Trash2, Lock, Mail, Phone, Calendar } from 'lucide-react';
5
+
6
+ // Mock user data
7
+ const mockUserData = {
8
+ id: '1',
9
+ name: 'John Doe',
10
+ email: 'john.doe@example.com',
11
+ phone: '+1 (555) 123-4567',
12
+ role: 'Administrator',
13
+ department: 'Engineering',
14
+ location: 'San Francisco, CA',
15
+ isActive: true,
16
+ lastLogin: '2024-01-15T10:30:00Z',
17
+ createdAt: '2023-06-15T08:00:00Z',
18
+ updatedAt: '2024-01-15T10:30:00Z',
19
+ avatar: 'https://api.dicebear.com/7.x/initials/svg?seed=John Doe',
20
+ bio: 'Senior software engineer with 8 years of experience in full-stack development.',
21
+ permissions: ['read', 'write', 'admin'],
22
+ preferences: {
23
+ theme: 'dark',
24
+ notifications: true,
25
+ language: 'en'
26
+ }
27
+ };
28
+
29
+ const fieldSections: FieldSection[] = [
30
+ {
31
+ title: 'Basic Information',
32
+ description: 'Primary user details and contact information',
33
+ category: 1,
34
+ fields: [
35
+ {
36
+ key: 'name',
37
+ label: 'Full Name',
38
+ type: 'text',
39
+ editable: true,
40
+ copyable: true
41
+ },
42
+ {
43
+ key: 'email',
44
+ label: 'Email Address',
45
+ type: 'email',
46
+ editable: true,
47
+ copyable: true
48
+ },
49
+ {
50
+ key: 'phone',
51
+ label: 'Phone Number',
52
+ type: 'phone',
53
+ editable: true,
54
+ copyable: true
55
+ },
56
+ {
57
+ key: 'location',
58
+ label: 'Location',
59
+ type: 'text',
60
+ editable: true
61
+ }
62
+ ]
63
+ },
64
+ {
65
+ title: 'Role & Permissions',
66
+ description: 'User role and system access permissions',
67
+ category: 2,
68
+ fields: [
69
+ {
70
+ key: 'role',
71
+ label: 'Role',
72
+ type: 'badge',
73
+ editable: true
74
+ },
75
+ {
76
+ key: 'department',
77
+ label: 'Department',
78
+ type: 'text',
79
+ editable: true
80
+ },
81
+ {
82
+ key: 'isActive',
83
+ label: 'Account Status',
84
+ type: 'boolean',
85
+ editable: true
86
+ },
87
+ {
88
+ key: 'permissions',
89
+ label: 'Permissions',
90
+ type: 'custom',
91
+ render: (value) => (
92
+ <div className="flex gap-1 flex-wrap">
93
+ {(value as string[]).map((permission) => (
94
+ <span
95
+ key={permission}
96
+ className="px-2 py-1 text-xs bg-category-2/10 text-category-2 rounded-md"
97
+ >
98
+ {permission}
99
+ </span>
100
+ ))}
101
+ </div>
102
+ )
103
+ }
104
+ ]
105
+ },
106
+ {
107
+ title: 'Activity & Timestamps',
108
+ description: 'Account activity and important dates',
109
+ category: 3,
110
+ fields: [
111
+ {
112
+ key: 'lastLogin',
113
+ label: 'Last Login',
114
+ type: 'datetime'
115
+ },
116
+ {
117
+ key: 'createdAt',
118
+ label: 'Account Created',
119
+ type: 'datetime'
120
+ },
121
+ {
122
+ key: 'updatedAt',
123
+ label: 'Last Updated',
124
+ type: 'datetime'
125
+ }
126
+ ]
127
+ },
128
+ {
129
+ title: 'Preferences',
130
+ description: 'User preferences and settings',
131
+ category: 4,
132
+ fields: [
133
+ {
134
+ key: 'preferences',
135
+ label: 'User Preferences',
136
+ type: 'json'
137
+ },
138
+ {
139
+ key: 'bio',
140
+ label: 'Biography',
141
+ type: 'text',
142
+ editable: true
143
+ }
144
+ ]
145
+ }
146
+ ];
147
+
148
+ const actions: ActionConfig[] = [
149
+ {
150
+ id: 'edit',
151
+ label: 'Edit User',
152
+ icon: <Edit className="w-4 h-4 mr-2" />,
153
+ variant: 'default',
154
+ onClick: () => console.log('Edit user')
155
+ },
156
+ {
157
+ id: 'reset-password',
158
+ label: 'Reset Password',
159
+ icon: <Lock className="w-4 h-4 mr-2" />,
160
+ variant: 'outline',
161
+ onClick: () => console.log('Reset password')
162
+ },
163
+ {
164
+ id: 'send-email',
165
+ label: 'Send Email',
166
+ icon: <Mail className="w-4 h-4 mr-2" />,
167
+ variant: 'outline',
168
+ onClick: () => console.log('Send email')
169
+ },
170
+ {
171
+ id: 'delete',
172
+ label: 'Delete User',
173
+ icon: <Trash2 className="w-4 h-4 mr-2" />,
174
+ variant: 'destructive',
175
+ onClick: () => console.log('Delete user')
176
+ }
177
+ ];
178
+
179
+ const auditTrail: AuditEntry[] = [
180
+ {
181
+ id: '1',
182
+ action: 'User profile updated',
183
+ user: 'admin.user',
184
+ timestamp: new Date(Date.now() - 60 * 60 * 1000),
185
+ changes: [
186
+ { field: 'phone', oldValue: '+1 (555) 123-4566', newValue: '+1 (555) 123-4567' },
187
+ { field: 'location', oldValue: 'New York, NY', newValue: 'San Francisco, CA' }
188
+ ]
189
+ },
190
+ {
191
+ id: '2',
192
+ action: 'Password reset requested',
193
+ user: 'john.doe',
194
+ timestamp: new Date(Date.now() - 2 * 24 * 60 * 60 * 1000)
195
+ },
196
+ {
197
+ id: '3',
198
+ action: 'Role changed from Editor to Administrator',
199
+ user: 'admin.user',
200
+ timestamp: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000),
201
+ changes: [
202
+ { field: 'role', oldValue: 'Editor', newValue: 'Administrator' }
203
+ ]
204
+ },
205
+ {
206
+ id: '4',
207
+ action: 'Account created',
208
+ user: 'system',
209
+ timestamp: new Date('2023-06-15T08:00:00Z')
210
+ }
211
+ ];
212
+
213
+ const relatedData: RelatedData[] = [
214
+ {
215
+ title: 'Recent Projects',
216
+ description: 'Projects the user has been involved with',
217
+ data: [
218
+ {
219
+ id: '1',
220
+ name: 'E-commerce Platform',
221
+ role: 'Lead Developer',
222
+ status: 'Active',
223
+ lastActivity: '2024-01-15'
224
+ },
225
+ {
226
+ id: '2',
227
+ name: 'Mobile App Redesign',
228
+ role: 'Technical Lead',
229
+ status: 'Completed',
230
+ lastActivity: '2024-01-10'
231
+ },
232
+ {
233
+ id: '3',
234
+ name: 'API Migration',
235
+ role: 'Senior Developer',
236
+ status: 'In Progress',
237
+ lastActivity: '2024-01-14'
238
+ }
239
+ ],
240
+ columns: [
241
+ { key: 'name', header: 'Project Name' },
242
+ { key: 'role', header: 'Role' },
243
+ { key: 'status', header: 'Status', cell: (item) => (
244
+ <span className={`px-2 py-1 text-xs rounded-md ${
245
+ item.status === 'Active' ? 'bg-category-2/10 text-category-2' :
246
+ item.status === 'Completed' ? 'bg-category-3/10 text-category-3' :
247
+ 'bg-category-1/10 text-category-1'
248
+ }`}>
249
+ {item.status as string}
250
+ </span>
251
+ )},
252
+ { key: 'lastActivity', header: 'Last Activity', cell: (item) =>
253
+ new Date(item.lastActivity as string).toLocaleDateString()
254
+ }
255
+ ],
256
+ actions: [
257
+ {
258
+ id: 'view-project',
259
+ label: 'View All Projects',
260
+ variant: 'outline',
261
+ onClick: () => console.log('View all projects')
262
+ }
263
+ ],
264
+ category: 1
265
+ },
266
+ {
267
+ title: 'Team Members',
268
+ description: 'Other team members in the same department',
269
+ data: [
270
+ {
271
+ id: '2',
272
+ name: 'Sarah Wilson',
273
+ role: 'Product Manager',
274
+ email: 'sarah.wilson@example.com'
275
+ },
276
+ {
277
+ id: '3',
278
+ name: 'Mike Johnson',
279
+ role: 'Designer',
280
+ email: 'mike.johnson@example.com'
281
+ },
282
+ {
283
+ id: '4',
284
+ name: 'Emily Davis',
285
+ role: 'QA Engineer',
286
+ email: 'emily.davis@example.com'
287
+ }
288
+ ],
289
+ columns: [
290
+ { key: 'name', header: 'Name' },
291
+ { key: 'role', header: 'Role' },
292
+ { key: 'email', header: 'Email', cell: (item) => (
293
+ <a href={`mailto:${item.email}`} className="text-category-1 hover:underline">
294
+ {item.email as string}
295
+ </a>
296
+ )}
297
+ ],
298
+ category: 2
299
+ }
300
+ ];
301
+
302
+ export const AdminDetailShowcase: React.FC = () => {
303
+ const [userData, setUserData] = useState(mockUserData);
304
+
305
+ const handleUpdate = async (field: string, value: unknown) => {
306
+ console.log('Updating field:', field, 'with value:', value);
307
+
308
+ // Simulate API call
309
+ await new Promise(resolve => setTimeout(resolve, 500));
310
+
311
+ setUserData(prev => ({
312
+ ...prev,
313
+ [field]: value,
314
+ updatedAt: new Date().toISOString()
315
+ }));
316
+ };
317
+
318
+ const handleBack = () => {
319
+ console.log('Navigate back to users list');
320
+ };
321
+
322
+ const sidebar = (
323
+ <div className="space-y-6">
324
+ {/* Quick Actions */}
325
+ <div className="bg-muted/30 rounded-lg p-4">
326
+ <h4 className="font-medium text-sm mb-3 text-foreground">Quick Actions</h4>
327
+ <div className="space-y-2">
328
+ <button className="w-full text-left text-sm p-2 rounded-md hover:bg-muted flex items-center">
329
+ <Mail className="w-4 h-4 mr-2" />
330
+ Send Message
331
+ </button>
332
+ <button className="w-full text-left text-sm p-2 rounded-md hover:bg-muted flex items-center">
333
+ <Phone className="w-4 h-4 mr-2" />
334
+ Schedule Call
335
+ </button>
336
+ <button className="w-full text-left text-sm p-2 rounded-md hover:bg-muted flex items-center">
337
+ <Calendar className="w-4 h-4 mr-2" />
338
+ View Calendar
339
+ </button>
340
+ </div>
341
+ </div>
342
+
343
+ {/* User Stats */}
344
+ <div className="bg-muted/30 rounded-lg p-4">
345
+ <h4 className="font-medium text-sm mb-3 text-foreground">Statistics</h4>
346
+ <div className="space-y-3">
347
+ <div className="flex justify-between text-sm">
348
+ <span className="text-muted-foreground">Projects</span>
349
+ <span className="font-medium">12</span>
350
+ </div>
351
+ <div className="flex justify-between text-sm">
352
+ <span className="text-muted-foreground">Tasks Completed</span>
353
+ <span className="font-medium">147</span>
354
+ </div>
355
+ <div className="flex justify-between text-sm">
356
+ <span className="text-muted-foreground">Hours Logged</span>
357
+ <span className="font-medium">1,248</span>
358
+ </div>
359
+ <div className="flex justify-between text-sm">
360
+ <span className="text-muted-foreground">Team Rating</span>
361
+ <span className="font-medium">4.8/5</span>
362
+ </div>
363
+ </div>
364
+ </div>
365
+ </div>
366
+ );
367
+
368
+ return (
369
+ <AdminDetailTemplate
370
+ title={userData.name}
371
+ subtitle={`${userData.role} • ${userData.department}`}
372
+ resourceType="Users"
373
+ data={userData}
374
+ sections={fieldSections}
375
+ actions={actions}
376
+ relatedData={relatedData}
377
+ auditTrail={auditTrail}
378
+ onBack={handleBack}
379
+ onUpdate={handleUpdate}
380
+ category={1}
381
+ sidebar={sidebar}
382
+ showAuditTrail={true}
383
+ />
384
+ );
385
+ };
@@ -0,0 +1,3 @@
1
+ export { AdminDashboardShowcase } from './AdminDashboardShowcase';
2
+ export { AdminCRUDShowcase } from './AdminCRUDShowcase';
3
+ export { AdminDetailShowcase } from './AdminDetailShowcase';
@@ -0,0 +1,188 @@
1
+ import React from 'react';
2
+ import { ComponentShowcaseTemplate } from '../../templates';
3
+ import { DataBadge } from '../../atoms/composed';
4
+ import { Badge } from '../../atoms/ui';
5
+ import { CheckCircle, AlertTriangle, XCircle, Info, Clock } from 'lucide-react';
6
+
7
+ export const BadgesShowcase: React.FC = () => {
8
+ return (
9
+ <ComponentShowcaseTemplate
10
+ category={1}
11
+ title="Badges"
12
+ description="Semantic badges for categorizing and indicating status in data interfaces."
13
+ primaryComponent={{
14
+ title: "Badge Component",
15
+ description: "Foundation badge component with multiple variants, sizes, and states. Base for all badge-based components.",
16
+ badge: {
17
+ text: "UI Foundation",
18
+ variant: "category",
19
+ category: 1
20
+ },
21
+ children: (
22
+ <div className="space-y-6">
23
+ {/* Basic Badge Variants */}
24
+ <div className="space-y-4">
25
+ <h4 className="text-base font-medium">Badge Variants</h4>
26
+ <div className="flex flex-wrap gap-2">
27
+ <Badge variant="default">Default</Badge>
28
+ <Badge variant="secondary">Secondary</Badge>
29
+ <Badge variant="destructive">Destructive</Badge>
30
+ <Badge variant="outline">Outline</Badge>
31
+ </div>
32
+ </div>
33
+
34
+ {/* Badge Sizes */}
35
+ <div className="space-y-4">
36
+ <h4 className="text-base font-medium">Sizes</h4>
37
+ <div className="flex flex-wrap items-center gap-2">
38
+ <Badge variant="default" className="text-xs px-2 py-0.5">Small</Badge>
39
+ <Badge variant="default">Medium</Badge>
40
+ <Badge variant="default" className="text-base px-3 py-1.5">Large</Badge>
41
+ </div>
42
+ </div>
43
+
44
+ {/* Badge with Icons */}
45
+ <div className="space-y-4">
46
+ <h4 className="text-base font-medium">With Icons</h4>
47
+ <div className="flex flex-wrap gap-2">
48
+ <Badge variant="default">
49
+ <CheckCircle className="w-3 h-3 mr-1" />
50
+ Success
51
+ </Badge>
52
+ <Badge variant="destructive">
53
+ <XCircle className="w-3 h-3 mr-1" />
54
+ Error
55
+ </Badge>
56
+ <Badge variant="outline">
57
+ <Info className="w-3 h-3 mr-1" />
58
+ Info
59
+ </Badge>
60
+ </div>
61
+ </div>
62
+ </div>
63
+ )
64
+ }}
65
+ composedExamples={{
66
+ title: "Business Badge Components",
67
+ description: "Specialized badge components built for specific data interface use cases with enhanced functionality.",
68
+ sections: [
69
+ {
70
+ title: "DataBadge Component",
71
+ description: "Enhanced badge component with category theming, status variants, and interactive capabilities for data interfaces.",
72
+ badge: {
73
+ text: "Business Component",
74
+ variant: "category",
75
+ category: 2
76
+ },
77
+ category: 2,
78
+ children: (
79
+ <div className="space-y-6">
80
+ {/* Basic DataBadge Usage */}
81
+ <div className="space-y-4">
82
+ <h4 className="text-base font-medium">Basic Usage</h4>
83
+ <div className="flex flex-wrap gap-2">
84
+ <DataBadge variant="category" category={1}>Category 1</DataBadge>
85
+ <DataBadge variant="status" status="success">Success</DataBadge>
86
+ <DataBadge variant="status" status="neutral">Neutral</DataBadge>
87
+ </div>
88
+ </div>
89
+
90
+ {/* DataBadge Sizes */}
91
+ <div className="space-y-4">
92
+ <h4 className="text-base font-medium">Sizes</h4>
93
+ <div className="flex flex-wrap items-center gap-2">
94
+ <DataBadge variant="category" category={2} size="sm">Small</DataBadge>
95
+ <DataBadge variant="category" category={2} size="md">Medium</DataBadge>
96
+ <DataBadge variant="category" category={2} size="lg">Large</DataBadge>
97
+ </div>
98
+ </div>
99
+
100
+ {/* Interactive DataBadge */}
101
+ <div className="space-y-4">
102
+ <h4 className="text-base font-medium">Interactive</h4>
103
+ <div className="flex flex-wrap gap-2">
104
+ <DataBadge
105
+ variant="category"
106
+ category={3}
107
+ interactive
108
+ onClick={() => alert('Badge clicked!')}
109
+ >
110
+ Clickable Badge
111
+ </DataBadge>
112
+ </div>
113
+ </div>
114
+ </div>
115
+ )
116
+ },
117
+ {
118
+ title: "Category Badges",
119
+ description: "Use category badges to classify and organize different types of content, data, or functionality.",
120
+ badge: {
121
+ text: "8 Categories",
122
+ variant: "category",
123
+ category: 1
124
+ },
125
+ category: 2,
126
+ children: (
127
+ <div className="space-y-4">
128
+ <div className="flex flex-wrap gap-2">
129
+ {[1, 2, 3, 4, 5, 6, 7, 8].map(category => (
130
+ <DataBadge key={category} variant="category" category={category as 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8}>
131
+ Category {category}
132
+ </DataBadge>
133
+ ))}
134
+ </div>
135
+ <div className="flex flex-wrap gap-2">
136
+ <DataBadge variant="category" category={1} size="sm">Small</DataBadge>
137
+ <DataBadge variant="category" category={2} size="md">Medium</DataBadge>
138
+ <DataBadge variant="category" category={3} size="lg">Large</DataBadge>
139
+ </div>
140
+ <div className="flex flex-wrap gap-2">
141
+ <DataBadge variant="category" category={4} interactive onClick={() => alert('Clicked!')}>
142
+ Interactive
143
+ </DataBadge>
144
+ </div>
145
+ </div>
146
+ )
147
+ },
148
+ {
149
+ title: "Status Badges",
150
+ description: "Use status badges to communicate operational states, health indicators, and system feedback.",
151
+ badge: {
152
+ text: "5 States",
153
+ variant: "status",
154
+ status: "success"
155
+ },
156
+ category: 2,
157
+ children: (
158
+ <div className="space-y-4">
159
+ <div className="flex flex-wrap gap-2">
160
+ <DataBadge variant="status" status="success">
161
+ <CheckCircle className="w-3 h-3 mr-1" />
162
+ Success
163
+ </DataBadge>
164
+ <DataBadge variant="status" status="warning">
165
+ <AlertTriangle className="w-3 h-3 mr-1" />
166
+ Warning
167
+ </DataBadge>
168
+ <DataBadge variant="status" status="error">
169
+ <XCircle className="w-3 h-3 mr-1" />
170
+ Error
171
+ </DataBadge>
172
+ <DataBadge variant="status" status="info">
173
+ <Info className="w-3 h-3 mr-1" />
174
+ Info
175
+ </DataBadge>
176
+ <DataBadge variant="status" status="neutral">
177
+ <Clock className="w-3 h-3 mr-1" />
178
+ Neutral
179
+ </DataBadge>
180
+ </div>
181
+ </div>
182
+ )
183
+ }
184
+ ]
185
+ }}
186
+ />
187
+ );
188
+ };